From d345d18f83b53dadecb2d391123b5dd74a4b864a Mon Sep 17 00:00:00 2001 From: Packit Date: Sep 25 2020 17:45:20 +0000 Subject: gnome-shell-3.32.2 base --- diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..bbb8e68 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/HACKING.md b/HACKING.md new file mode 100644 index 0000000..a9a92ea --- /dev/null +++ b/HACKING.md @@ -0,0 +1,310 @@ +# Coding guide + +Our goal is to have all JavaScript code in GNOME follow a consistent style. In +a dynamic language like JavaScript, it is essential to be rigorous about style +(and unit tests), or you rapidly end up with a spaghetti-code mess. + +## A quick note + +Life isn't fun if you can't break the rules. If a rule seems unnecessarily +restrictive while you're coding, ignore it, and let the patch reviewer decide +what to do. + +## Indentation, braces and whitespace + +* Use four-space indents. +* Braces are on the same line as their associated statements. +* You should only omit braces if *both* sides of the statement are on one line. +* One space after the `function` keyword. +* No space between the function name in a declaration or a call. +* One space before the parens in the `if` statements, or `while`, or `for` loops. + +```javascript + function foo(a, b) { + let bar; + + if (a > b) + bar = do_thing(a); + else + bar = do_thing(b); + + if (var == 5) { + for (let i = 0; i < 10; i++) { + print(i); + } + } else { + print(20); + } + } +``` + +## Semicolons + +JavaScript allows omitting semicolons at the end of lines, but don't. Always +end statements with a semicolon. + +## js2-mode + +If using Emacs, do not use js2-mode. It is outdated and hasn't worked for a +while. emacs now has a built-in JavaScript mode, js-mode, based on +espresso-mode. It is the de facto emacs mode for JavaScript. + +## File naming and creation + +For JavaScript files, use lowerCamelCase-style names, with a `.js` extension. + +We only use C where gjs/gobject-introspection is not available for the task, or +where C would be cleaner. To work around limitations in +gjs/gobject-introspection itself, add a new method in `shell-util.[ch]`. + +Like many other GNOME projects, we prefix our C source filenames with the +library name followed by a dash, e.g. `shell-app-system.c`. Create a +`-private.h` header when you want to share code internally in the +library. These headers are not installed, distributed or introspected. + +## Imports + +Use UpperCamelCase when importing modules to distinguish them from ordinary +variables, e.g. +```javascript + const GLib = imports.gi.GLib; +``` +Imports should be categorized into one of two places. The top-most import block +should contain only "environment imports". These are either modules from +gobject-introspection or modules added by gjs itself. + +The second block of imports should contain only "application imports". These +are the JS code that is in the gnome-shell codebase, +e.g. `imports.ui.popupMenu`. + +Each import block should be sorted alphabetically. Don't import modules you +don't use. +```javascript + const { GLib, Gio, St } = imports.gi; + + const Main = imports.ui.main; + const Params = imports.misc.params; + const Tweener = imports.ui.tweener; + const Util = imports.misc.util; +``` +The alphabetical ordering should be done independently of the location of the +location. Never reference `imports` in actual code. + +## Constants + +We use CONSTANTS_CASE to define constants. All constants should be directly +under the imports: +```javascript + const MY_DBUS_INTERFACE = 'org.my.Interface'; +``` + +## Variable declaration + +Always use either `const` or `let` when defining a variable. +```javascript + // Iterating over an array + for (let i = 0; i < arr.length; ++i) { + let item = arr[i]; + } + + // Iterating over an object's properties + for (let prop in someobj) { + ... + } +``` + +If you use "var" then the variable is added to function scope, not block scope. +See [What's new in JavaScript 1.7](https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7#Block_scope_with_let_%28Merge_into_let_Statement%29) + +## Classes + +There are many approaches to classes in JavaScript. We use standard ES6 classes +whenever possible, that is when not inheriting from GObjects. +```javascript + var IconLabelMenuItem = class extends PopupMenu.PopupMenuBaseItem { + constructor(icon, label) { + super({ reactive: false }); + this.actor.add_child(icon); + this.actor.add_child(label); + } + + open() { + log("menu opened!"); + } + }; +``` + +For GObject inheritence, we use the GObject.registerClass() function provided +by gjs. +```javascript + var MyActor = GObject.registerClass( + class MyActor extends Clutter.Actor { + _init(params) { + super._init(params); + + this.name = 'MyCustomActor'; + } + }); +``` + +## GObject Introspection + +GObject Introspection is a powerful feature that allows us to have native +bindings for almost any library built around GObject. If a library requires +you to inherit from a type to use it, you can do so: +```javascript + var MyClutterActor = GObject.registerClass( + class MyClutterActor extends Clutter.Actor { + + vfunc_get_preferred_width(forHeight) { + return [100, 100]; + } + + vfunc_get_preferred_height(forWidth) { + return [100, 100]; + } + + vfunc_paint() { + let alloc = this.get_allocation_box(); + Cogl.set_source_color4ub(255, 0, 0, 255); + Cogl.rectangle(alloc.x1, alloc.y1, + alloc.x2, alloc.y2); + } + }); +``` + +## Translatable strings, `environment.js` + +We use gettext to translate the GNOME Shell into all the languages that GNOME +supports. The `gettext` function is aliased globally as `_`, you do not need to +explicitly import it. This is done through some magic in the +[environment.js](http://git.gnome.org/browse/gnome-shell/tree/js/ui/environment.js) +file. If you can't find a method that's used, it's probably either in gjs itself +or installed on the global object from the Environment. + +Use 'single quotes' for programming strings that should not be translated +and "double quotes" for strings that the user may see. This allows us to +quickly find untranslated or mistranslated strings by grepping through the +sources for double quotes without a gettext call around them. + +## `actor` and `_delegate` + +gjs allows us to set so-called "expando properties" on introspected objects, +allowing us to treat them like any other. Because the Shell was built before +you could inherit from GTypes natively in JS, we usually have a wrapper class +that has a property called `actor`. We call this wrapper class the "delegate". + +We sometimes use expando properties to set a property called `_delegate` on +the actor itself: +```javascript + var MyClass = class { + constructor() { + this.actor = new St.Button({ text: "This is a button" }); + this.actor._delegate = this; + + this.actor.connect('clicked', this._onClicked.bind(this)); + } + + _onClicked(actor) { + actor.set_label("You clicked the button!"); + } + }; +``` + +The 'delegate' property is important for anything which trying to get the +delegate object from an associated actor. For instance, the drag and drop +system calls the `handleDragOver` function on the delegate of a "drop target" +when the user drags an item over it. If you do not set the `_delegate` +property, your actor will not be able to be dropped onto. + +## Functional style + +JavaScript Array objects offer a lot of common functional programming +capabilities such as forEach, map, filter and so on. You can use these when +they make sense, but please don't have a spaghetti mess of function programming +messed in a procedural style. Use your best judgment. + +## Closures + +`this` will not be captured in a closure, it is relative to how the closure is +invoked, not to the value of this where the closure is created, because "this" +is a keyword with a value passed in at function invocation time, it is not a +variable that can be captured in closures. + +All closures should be wrapped with Function.prototype.bind or use arrow +notation. +```javascript + let closure1 = () => { this._fnorbate(); }; + let closure2 = this._fnorbate.bind(this); +``` + +A more realistic example would be connecting to a signal on a method of a +prototype: +```javascript + const FnorbLib = imports.fborbLib; + + var MyClass = class { + _init() { + let fnorb = new FnorbLib.Fnorb(); + fnorb.connect('frobate', this._onFnorbFrobate.bind(this)); + } + + _onFnorbFrobate(fnorb) { + this._updateFnorb(); + } + }; +``` + +## Object literal syntax + +In JavaScript, these are equivalent: +```javascript + foo = { 'bar': 42 }; + foo = { bar: 42 }; +``` + +and so are these: +```javascript + var b = foo['bar']; + var b = foo.bar; +``` + +If your usage of an object is like an object, then you're defining "member +variables." For member variables, use the no-quotes no-brackets syntax: `{ bar: +42 }` `foo.bar`. + +If your usage of an object is like a hash table (and thus conceptually the keys +can have special chars in them), don't use quotes, but use brackets: `{ bar: 42 +}`, `foo['bar']`. + +## Getters, setters, and Tweener + +Getters and setters should be used when you are dealing with an API that is +designed around setting properties, like Tweener. If you want to animate an +arbitrary property, create a getter and setter, and use Tweener to animate the +property. +```javascript + var ANIMATION_TIME = 2000; + + var MyClass = class { + constructor() { + this.actor = new St.BoxLayout(); + this._position = 0; + } + + get position() { + return this._position; + } + + set position(value) { + this._position = value; + this.actor.set_position(value, value); + } + }; + + let myThing = new MyClass(); + Tweener.addTween(myThing, + { position: 100, + time: ANIMATION_TIME, + transition: 'easeOutQuad' }); +``` diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..4085155 --- /dev/null +++ b/NEWS @@ -0,0 +1,4157 @@ +3.32.2 +====== +* Fix tablet button mapping overlay [Carlos; #1220] +* Fix ellipsization in dialog subtitles/bodies [Marco; !531] +* Don't crash for world clock locations with no timezone [Florian; #1062] +* Handle network interface name changes [Fabrice; !534] +* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556] +* Avoid unnecessary style changes when computing :first/:last-child + [Florian; !529] +* Misc. bug fixes [Simon, Carlos, Florian; #822, !551, !509, + !511, #1054, !506, #1065] + +Contributors: + Fabrice Bellet, Carlos Garnacho, Simon McVittie, Florian Müllner, + Marco Trevisan (Treviño) + +Translators: + Dingzhong Chen [zh_CN], Tim Sabsch [de] + +3.32.1 +====== +* Fix avatar scaling on login screen [Florian; #1024] +* Fix distortion of desktop zoom [Florian; #646] +* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020] +* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900] +* Fix Alt+Esc switcher [Florian; #1064] +* Respect struts for popover placement [Andrea; #1102] +* Fix app icons updates after theme changes [Florian; #1117] +* Fix desktop zoom after resolution changes [Marco; #1120] +* Implement stick-to-finger workspace switch overview gestures [Florian; #516] +* Make World Clocks offsets relative to local time [Florian; #1157] +* Fix top app icon disappearing from dash [Florian; #1053] +* Update switch style to match new Adwaita [Jakub; !496] +* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91] +* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil, + Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036, + !455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481, + !490, !489, #1151, !435, #1160, !482, #1150, #1166, !384] + +Contributors: + AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov, + Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode, + Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett + +Translators: + Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg], + Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr], + Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es], + Dušan Kazik [sk] + +3.32.0 +====== +* Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439] +* Fix test linker failure on Debian/Ubuntu [Iain; !442] +* Avoid assertion when sizing fallback app icons from CSS [Florian; #1027] +* Fix mis-sized menu arrows after texture cache changes [Florian; !452] + +Contributors: + Carlos Garnacho, Iain Lane, Florian Müllner + +Translators: + Gábor Kelemen [hu], Victor Ibragimov [tg], Ryuta Fujii [ja], Piotr Drąg [af, + tg], Mart Raudsepp [et] + +3.31.92 +======= +* Fix visual glitch in submenus [Alex; #987] +* Support fractional scaling [Jonas, Marco; #765011, !5] +* Only consider visible children for :first-child/:last-child [Florian; !312] +* Hide trailing separator in search results [verdre; !311] +* Remember choice in inhibit-shortcuts dialogue [Olivier; !382] +* Don't toggle on-screen keyboard on every focus change [Carlos; !397] +* Fix legacy tray icons not responding to events on wayland [Florian; #191] +* Fix generating French OSK layout [Florian; #997] +* Use borderless round user images [Florian; #811] +* Misc. bug fixes and cleanups [Andrea, Robert, Florian, Marco, Niels, + Benjamin; !414, !417, !420, #996, !408, !422, !425, #1006, !427, !315, + #989, !430, !431, !432, #1015, !429, !423, !419, !434] + +Contributors: + Jonas Ådahl, Alan, Andrea Azzarone, Benjamin Berg, Olivier Fourdan, + Carlos Garnacho, Niels De Graef, Robert Mader, Alex Monday, Florian Müllner, + Marco Trevisan (Treviño), verdre + +Translators: + Carmen Bianca BAKKER [eo], Asier Sarasua Garmendia [eu], Stas Solovey [ru], + Changwoo Ryu [ko], Julien Humbert [fr], Milo Casagrande [it], + Марко Костић [sr], Ask Hjorth Larsen [da], Kukuh Syafaat [id], + Daniel Șerbănescu [ro], Bernd Homuth [de], Trần Ngọc Quân [vi], + Nathan Follens [nl], Rūdolfs Mazurs [lv], Aurimas Černius [lt] + +3.31.91 +======= +* Don't close on-screen-keyboard's language menu on hover [Florian; #171] +* Don't let unfullscreen gesture interfere with top bar taps [Jonas D.; #552] +* Always use symbolic user icon in system menu [Florian; #957] +* Add flags parameter in GrabAccelerators API [Andrea; #68] +* Misc. bug fixes and cleanups [Florian, Jonas A.; !399, !398, !400, !402, + !407, !410, !411] + +Contributors: + Jonas Ådahl, Andrea Azzarone, Arnaud Bonatti, Jonas Dreßler, Florian Müllner + +Translators: + Jordi Mas [ca], Ryuta Fujii [ja], Marek Cernocky [cs], Fran Dieguez [gl], + Jiri Grönroos [fi], Serdar Sağlam [tr], Anders Jonsson [sv], + Matej Urbančič [sl], Gun Chleoc [gd], Kukuh Syafaat [id], + Baurzhan Muftakhidinov [kk], Alan Mortensen [da], Rafael Fontenelle [pt_BR], + Sveinn í Felli [is] + +3.31.90 +======= +* Fix input methods after ibus restarts [Takao; #295] +* Refresh world clocks and weather sections [Florian; #262] +* Port to ES6 classes (update your extensions!) [Florian; !361] +* networkAgent: Advise users when WPS support is available [Lubomir; !329] +* Performance improvements [Carlos; #832, #815] +* Fix drag-and-drop with wacom pens [Carlos; #540] +* Fix CAPS LOCK indication on wayland [Carlos; #762881] +* Show details of non-sensitive notifications on lock screen [Philip; #726] +* Refine extension-prefs' error UI [Florian; !193] +* Add switch-to-application-n keybindings [Florian; #648000] +* Remove top bar translucency [Florian; #408] +* Support emojis and keypads in on-screen keyboard [Carlos; #675] +* Don't allow popups to re-enable keyboard shortcuts on lock screen + (CVE-2019-3820) [Florian, Ray; #851] +* Replace app menu [Florian; #624] +* Include commonly copied+pasted extension helpers [Florian; !150] +* Misc. bug fixes and cleanups [Florian, Daniel, Philip, Sergio, Pascal, + Georges, verdre, Carlos, Christopher; #780, #909, !316, !308, !309, #915, + !350, !362, !357, !365, !366, !283, !367, #942, !371, !373, !374, !343, + !375, !292, !317, !377, !379, !346, !383, #953, !388] + +Contributors: + Sergio Costas, Christopher Davis, Bilal Elmoussaoui, Takao Fujiwara, + Carlos Garnacho, Niels De Graef, Christian Kellner, Ignat Loskutov, + Florian Müllner, Georges Basile Stavracas Neto, Pascal Nowack, Lubomir Rintel, + Jakub Steiner, Ray Strode, verdre, Daniel van Vugt, Philip Withnall + +Translators: + Daniel Mustieles [es], Carmen Bianca BAKKER [eo], Charles Monzat [fr], + Pieter Schalk Schoeman [af], Jordi Mas [ca], Matej Urbančič [sl], + Fran Dieguez [gl], Balázs Úr [hu], A S Alam [pa], Fabio Tomat [fur], + Aurimas Černius [lt], Piotr Drąg [pl], Marek Cernocky [cs], Ryuta Fujii [ja] + +3.31.4 +====== +* Improve icon grid performance [Daniel; #174] +* Remove browser plugin [Michael; #766776] +* Add DBus API for introspecting the application state [Jonas, Olivier; !326] +* Always allow leaving the overview via the hot-corner [Pascal; #429] +* Misc. bug fixes [Florian, Jasper, Andrea, Sam, Dani, Cosimo, Jonas, Carlos; + #643595, #673767, !293, #783, #781, !298, !297, #782, !301, !314, !305, #799, + #632, !327] + +Contributors: + Jonas Ådahl, Andrea Azzarone, Michael Catanzaro, Cosimo Cecchi, daniruiz, + Olivier Fourdan, Carlos Garnacho, Sam Hewitt, Andre Klapper, Florian Müllner, + Pascal Nowack, Jasper St. Pierre, RyuzakiKK, Marco Trevisan (Treviño), + João Paulo Rechi Vita, Daniel van Vugt + +Translators: + Kristjan SCHMIDT [eo], Matej Urbančič [sl], Daniel Mustieles [es], + Fabio Tomat [fur], Emin Tufan Çetin [tr], Anders Jonsson [sv], + Ryuta Fujii [ja] + +3.31.2 +====== +* Port away from and remove ShellGenericContainer [Georges; !153] +* popupMenu: Fix keyboard activation when numlock is active [Andrea; #550] +* Do not block all shortcuts while app folders are expanded [Florian; #648] +* Fix regression in handling new input sources [Carlos; #691] +* Reask password after udisk errors for no/wrong passwords [Sebastian; #640] +* Improve performance of app icon animations [Daniel; !253, !261] +* Avoid focus changes when updating keyboard options [Takao; #391] +* notifications: Support icon theme names in 'image-path' hint [Marco; !285] +* Respect natural-scroll setting for workspace swipe gesture [Erik; #516] +* Confine window preview titles to workspace area [Florian; !214] +* Misc. bug fixes [Florian, Carmen, Georges, Cosimo, Carlos; #602, #693, + #666, #647, !66, #768, #430, !286, !258, !287, gtk#1447] + +Contributors: + Andrea Azzarone, Carmen Bianca Bakker, Cosimo Cecchi, Sergio Costas, + Erik Duxstad, Takao Fujiwara, Carlos Garnacho, Florian Müllner, + Georges Basile Stavracas Neto, Sebastian Pinnau, Didier Roche, Jakub Steiner, + Marco Trevisan (Treviño), verdre, Daniel van Vugt + +Translators: + Kristjan SCHMIDT [eo], Dušan Kazik [sk], Matej Urbančič [sl], + Anish Sheela [ml], Rafael Fontenelle [pt_BR], Daniel Mustieles [es] + +3.30.1 +====== +* Cancel search on overview hiding [Marco; !205] +* Fix disappearing network icon [Iain; #140] +* Improve switch-monitor shortcut handling [Daniel; !208] +* Fix missing key information in keyring dialog [Florian; #574] +* De-duplicate all entries in run command history [Pascal; #524] +* Fix frozen disk unlock dialogs [Florian; #565] +* Fix unresponsive-app dialog blocking input in other windows [Florian; #273] +* Fix handling of forward-key-event input method signal [Carlos; #531] +* Misc. bug fixes [Florian, Marco, Carlos, Pascal, Andrea; #520, #791233, + !188, #539, !217, #536, #537, #578, !236, #579, !228, #618, #471, !255] + +Contributors: + Andrea Azzarone, Jürg Billeter, Daniel Drake, Carlos Garnacho, Andre Klapper, + Iain Lane, Florian Müllner, Bastien Nocera, Pascal Nowack, Jakub Steiner, + Ray Strode, Will Thompson, Marco Trevisan (Treviño), Adam Williamson, + Andrew Zaborowski + +Translators: + Yuras Shumovich [be], Stas Solovey [ru], Justin van Steijn [nl], + Dušan Kazik [sk], Khaled Hosny [ar], Madis O [et], Mart Raudsepp [et], + Марко Костић [sr], Piotr Drąg [pl], Marek Černocký [cs], Fran Dieguez [gl], + Ask Hjorth Larsen [da], Balázs Meskó [hu], Jiri Grönroos [fi], + Cheng-Chia Tseng [zh_TW] + +3.30.0 +====== + +Contributors: + Harry Mallon, Marco Trevisan (Treviño) + +Translators: + Fran Dieguez [gl], Trần Ngọc Quân [vi], Balázs Meskó [hu], + Rūdolfs Mazurs [lv], Jiri Grönroos [fi], Anders Jonsson [sv], gogo [hr], + Ask Hjorth Larsen [da] + +3.29.92 +======= +* Choose some actors to cache on the GPU [Daniel; #792633] +* inputMethod: Hide preedit text if requested [Takao; #431] +* Fix forced fallback app-menus on wayland [Jonas; #276] + +Contributors: + Jonas Ådahl, Takao Fujiwara, Mohammed Sadiq, Marco Trevisan (Treviño), + Daniel van Vugt + +Translators: + Baurzhan Muftakhidinov [kk], Kukuh Syafaat [id], Milo Casagrande [it], + Changwoo Ryu [ko], Marek Cernocky [cs] + +3.29.91 +======= +* Fix handling of 0/false options in ShowOSD D-Bus API [Florian; #791669] +* overview: Fix handling of confirmation dialogs on wayland [verdre; !180] +* Avoid some full relayout/redraws [Carlos; !197] +* Keep workspace switcher slid out when workspaces are in use [Florian; !161] +* Ignore auto-repeat for some keybindings [Andrea; #373] +* Misc. bug fixes [Carlos, Florian, Pascal; #464, !189, !191, !192, !162] + +Contributors: + Andrea Azzarone, Olivier Blin, Carlos Garnacho, Florian Müllner, + Pascal Nowack, verdre + +Translators: + Bruno Lopes da Silva [pt_BR], Matej Urbančič [sl], Piotr Drąg [pl], + Aurimas Černius [lt], Emin Tufan Çetin [tr], Fabio Tomat [fur], + Alexandre Franke [fr], Yi-Jyun Pan [zh_TW], Bernd Homuth [de], + Andre Klapper [cs], Jordi Mas [ca], Daniel Șerbănescu [ro], + Bruce Cowan [en_GB] + +3.29.90 +======= +* Add remote access indication on wayland [Jonas; !160] +* Fix wrong window positions in overview on wayland [Marco; #776588] +* Add gesture to unfullscreen a window [Jan-Michael; !123] +* Add PickColor method to screenshot D-Bus interface [Florian; #286] +* Consider "new-window" action when opening new windows [Florian; #756844] +* Make workspace switching gestures follow motion [Carlos; #788994] +* Support audio volumes above 100% [Didier; #790280] +* Misc. bug fixes [Florian, Daniel; #424, !132, !182, #433, !179, #786496] + +Contributors: + Jonas Ådahl, Jan-Michael Brummer, Piotr Drąg, Daniel Drake, Carlos Garnacho, + Florian Müllner, Georges Basile Stavracas Neto, Didier Roche, Jakub Steiner, + Marco Trevisan (Treviño) + +Translators: + Charles Monzat [fr], Daniel Mustieles [es] + +3.29.4 +====== +* Fix "Clear All" for calendar events [Florian; #325] +* Allow cancelling direct switch operations [Xavier; #315] +* Support being started by systemd --user [Iain; !137, !138] +* Support key event forwarding required by some input methods [Carlos; #275] +* Misc. bug fixes and cleanups [Jasper, Andrea, Florian; #663461, #372, !112, + #414, !151] + +Contributors: + Andrea Azzarone, Carlos Garnacho, Xavier Johnson, Iain Lane, Florian Müllner, + Jasper St. Pierre + +Translators: + Stas Solovey [ru] + +3.29.3 +====== +* Save creation time in screenshot metadata [Florian; #790481] +* Improve consistency between ctrl- and middle-click on app icons [Xavier; #316] +* Add support for font-feature-settings CSS property [Ryan; #34] +* Adjust to MetaScreen removal [Jonas; #759538] +* Misc. bug fixes [Florian, Marco, Sam; #298, #788931, #26, #76, !54, #788882, + #791233] + +Contributors: + Jonas Ådahl, Ryan Hendrickson, Xavier Johnson, Florian Müllner, Joe Rabinoff, + Sam Spilsbury, Marco Trevisan (Treviño) + +Translators: + Gun Chleoc [gd], Yi-Jyun Pan [zh_TW], Cédric Valmary [oc], Jordi Mas [ca] + +3.29.2 +====== +* Guard against untimely keyboard map changes [Carlos; #240] +* Fix icons in search provider results [Florian; #249] +* Fix blurriness of OSD under some resolutions [Silvère; #782011] +* Fix lagging pointer when zoomed [Daniel; #682013] +* Misc. bug fixes [Milan, Xiaoguang, Florian, Mario, Ole; #244, #787871, + #781471, #136, #214, #294] + +Contributors: + Ole Jørgen Brønner, Milan Crha, Carlos Garnacho, Yussuf Khalil, + Silvère Latchurié, Florian Müllner, Mario Sanchez Prada, Ray Strode, + Daniel van Vugt, Xiaoguang Wang + +Translators: + Rafael Fontenelle [pt_BR], Kukuh Syafaat [id], Marcos Lans [gl], + Anders Jonsson [sv], Mingcong Bai [zh_CN] + +3.29.1 +====== +* Support icons in app-menu [Florian; #760985] +* Misc. bug fixes [Marco, Florian, Lubomir; #792687, #221, !63] + +Contributors: + Piotr Drąg, Takao Fujiwara, Christian Kellner, Florian Müllner, + Mario Sanchez Prada, Lubomir Rintel, Didier Roche, Marco Trevisan (Treviño), + verdre + +Translators: + gogo [hr], Stas Solovey [ru], Matej Urbančič [sl], Daniel Șerbănescu [ro], + Fabio Tomat [fur], Marek Cernocky [cs], Daniel Mustieles [es] + +3.28.1 +====== +* Fix compose characters in shell entries [Carlos; #115] +* Don't show authentication dialogs on lock screen [Florian; #179, #166] +* Fix handling of UTC timezone in world clock [Florian; #150] +* Fix keyboard navigation in overview when hovering windows [Florian; #50] +* Misc. bug fixes [Florian; #127, #788908, #763886, !39] + +Contributors: + Jeremy Bicha, Carlos Garnacho, Andy Holmes, Florian Müllner, Bastien Nocera + +Translators: + Stas Solovey [ru], Daniel Șerbănescu [ro], Dušan Kazik [sk], + Rafael Fontenelle [pt_BR], Nathan Follens [nl], Dz Chen [zh_CN], + Matej Urbančič [sl], Hannie Dumoleyn [nl], Khaled Hosny [ar], + Guillaume Bernard [fr] + +3.28.0 +====== + +Translators: + A S Alam [pa], gogo [hr], Chao-Hsiung Liao [zh_TW], Jordi Mas [ca], + Anders Jonsson [sv], Balázs Úr [hu] + +3.27.92 +======= +* Misc. bug fixes [Florian; #64, #66, #72] + +Contributors: + Jonas Ådahl, Christian Kellner, Florian Müllner + +Translators: + Daniel Mustieles [es], Wolfgang Stöggl [de], Cheng-Chia Tseng [zh_TW], + Dušan Kazik [sk], Changwoo Ryu [ko], Furkan Ahmet Kara [tr], Balázs Úr [hu], + Trần Ngọc Quân [vi], Milo Casagrande [it], GNOME Translation Robot [gd, nl], + Marek Cernocky [cs], Aurimas Černius [lt], Alain Lojewski [fr], + Rūdolfs Mazurs [lv], Stas Solovey [ru], Alan Mortensen [da] + +3.27.91 +======= +* Fix wrong bluetooth state when disabled by HW airplane mode [Mario; #789110] +* Dump javascript stack on aborts, traps and segfaults [Marco; #789237] +* Allow Escape to "cancel" top bar focus [Stefano; #671121] +* Fix leaving the overview erroneously on window hover [Carlos; #784545] +* Add keyboard accessibility dialog [Olivier; #788564] +* Port to libnm [Lubomir, Florian; #789811] +* Don't pop up on-screen-keyboard on touch events [Florian, Carlos; #788188] +* Improve the on-screen-keyboard [Carlos; !9, #46] +* Add Thunderbolt support [Christian; !14] +* Don't lock immediately on login after a wayland session crash [Florian; !17] +* Respect cursor's hot x/y coordinates when recording [Florian Z.; #792860] +* Allow closing windows and apps during Tab [Florian, Mario; #620106] +* Fix small app folder icons when using HiDPI [Nikita; #792259] +* Make sassc a mandatory build dependency [Mario; #792822] +* Misc. bug fixes [Florian, Marco, Alessandro, Gautier, Jeremy, Bastien, Ray, + Carlos, Didier, Exalm, Rafal; #789231, #789277, #788542, #789103, #779974, + #788931, #776940, #786987, #791007, #791233, #791148, #706191, #791655, + #791487, #779413, #787845, #10, #788627, #792354, #792616, #781329, #780957, + #33, #740142, !38, !23] + +Contributors: + Jeremy Bicha, Alessandro Bono, Nikita Churaev, Piotr Drąg, Exalm, + Stefano Facchini, Olivier Fourdan, Carlos Garnacho, Christian Kellner, + Rafal Luzynski, Iñigo Martínez, Florian Müllner, Bastien Nocera, + Gautier Pelloux-Prayer, Mario Sanchez Prada, Lubomir Rintel, Didier Roche, + Jakub Steiner, Ray Strode, Marco Trevisan (Treviño), Florian Zwoch + +Translators: + Mingcong Bai [zh_CN], Hannie Dumoleyn [nl], Khaled Hosny [ar], + Kjartan Maraas [nb], Petr Kovar [cs], Marek Cernocky [cs], + Aurimas Černius [lt], Yosef Or Boczko [he], Kukuh Syafaat [id], + Sveinn í Felli [is], Jordi Mas [ca], Daniel Mustieles [es], Fabio Tomat [fur], + Rūdolfs Mazurs [lv], Emin Tufan Çetin [tr], Anders Jonsson [sv], + Matej Urbančič [sl], Jiri Grönroos [fi], Tim Sabsch [de], Gil Forcada [ca], + Dušan Kazik [sk], Balázs Meskó [hu], Piotr Drąg [pl], Tong Hui [zh_CN], + Fran Dieguez [gl], Enrico Nicoletto [pt_BR], gogo [hr], + Baurzhan Muftakhidinov [kk], Robert Antoni Buj Gelonch [ca], + Bruce Cowan [en_GB], Борисав Живановић [sr], Милош Поповић [sr@latin], + Марко Костић [sr] + +3.27.1 +====== +* Fix using icon-name strings with PopupImageMenuItems [Florian; #789018] +* Misc. bug fixes [Jonas, Florian; #788607, #788943] + +Contributors: + Jonas Ådahl, Florian Müllner + +Translations: + Xavi Ivars [ca@valencia], Matej Urbančič [sl], Fabio Tomat [fur] + +3.26.1 +====== +* Don't detach launched apps to not break pkexec and friends [Florian; #763531] +* Allow search providers to not autostart [Bastien, Florian; #785380, #787986] +* Fix crash when tray icons are hidden/shown in quick succession [Ray; #787361] +* Make window group switcher more consistent [Didier; #786009] +* Improve legibility of the top bar when translucent [Jakub; #787940] +* Don't crash when running outside a logind session [Florian; #788046] +* Allow to run headless [Mario, Jonas; #730551] +* Update calendar on timezone changes [Martin; #678507] +* Improve keyboard navigation of window previews [Florian; #786546] +* Run unit tests on `meson test` [Florian; #786497] +* Misc. bug fixes [Florian, Marc-Antoine, Mario, Jakub, Krzesimir; #787423, + #766368, #787580, #787907, #787901, #788039, #788003, #786343, #787902, + #788265, #788339, #787905, #788282, #787676] + +Contributors: + Martin Andersson, Florian Müllner, Bastien Nocera, Krzesimir Nowak, + Marc-Antoine Perennou, Didier Roche, Mario Sanchez Prada, Jakub Steiner, + Ray Strode + +Translations: + Efstathios Iosifidis [el], Khaled Hosny [ar], Stas Solovey [ru], + Arash Mousavi [fa], Sveinn í Felli [is], Athul R T [ml], + Cheng-Chia Tseng [zh_TW], Anders Jonsson [sv] + +3.26.0 +====== +* Misc. bug fixes [Ray, Michael, Jonas; #786332] #786783, #786886, #786868] + +Contributors: + Jonas Ådahl, Michael Catanzaro, Sebastian Keller, Ray Strode + +Translations: + Daniel Mustieles [es], Fran Dieguez [gl], Baurzhan Muftakhidinov [kk], + Marek Cernocky [cs], Andika Triwidada [id], Aurimas Černius [lt], + Piotr Drąg [pl], Trần Ngọc Quân [vi], Jordi Mas [ca], Fabio Tomat [fur], + gogo [hr], Dušan Kazik [sk], Piotr Drąg [ne], Emin Tufan Çetin [tr], + Ask Hjorth Larsen [da], Cheng-Chia Tseng [zh_TW], Rūdolfs Mazurs [lv], + Balázs Meskó [hu], Matej Urbančič [sl], Jiri Grönroos [fi], + Милош Поповић [sr], Милош Поповић [sr@latin], Rafael Fontenelle [pt_BR], + Wolfgang Stöggl [de], Milo Casagrande [it], hanniedu [nl], + Yuras Shumovich [be], Changwoo Ryu [ko], Alain Lojewski [fr], + Alexander Shopov [bg], Daniel Korostil [uk], Kris Thomsen [da], + A S Alam [pa], Sebastian Rasmussen [sv], Inaki Larranaga Murgoitio [eu], + Jiro Matsuzawa [ja] + +3.25.91 +======= +* Open context menu of highlighted search result on Shift+F10 [Florian; #675315] +* Fix mid-sentence capitalization in weather forecasts [Florian; #779873] +* Add switcher popup to cycle through monitor configurations [Rui; #783550] +* Offer system actions in search [Rares; #691900] +* Misc. bug fixes [Mario, Florian, Rui; #777519, #786120, #786145, #786419, + #786526, #786520, #786520, #786146] + +Contributors: + Emmanuele Bassi, Marek Cernocky, Piotr Drąg, Carlos Garnacho, Rui Matos, + Florian Müllner, Mario Sanchez Prada, Rares Visalom + +Translations: + Marek Cernocky [cs], Piotr Drąg [pl], Muhammet Kara [tr], + Мирослав Николић [sr, sr@latin], Kukuh Syafaat [id], + Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], Fran Dieguez [gl], + gogo [hr], Jordi Mas [ca] + +3.25.90 +======= +* Add permission dialog for inhibiting shortucts [Florian; #783342] +* Improve window picker layout [Florian, Jakub; #783953] +* Remove legacy status icon tray [Florian; #785956] +* Drop autotools support [Florian; #785153] +* Misc. bug fixes [Florian, Carlos, Cosimo; #785090, #785309, #767805, + #747794, #785358, #785556] + +Contributors: + Emmanuele Bassi, Cosimo Cecchi, Carlos Garnacho, Florian Müllner, + Jakub Steiner + +Translations: + Fabio Tomat [fur], Pawan Chitrakar [ne], Aurimas Černius [lt], gogo [hr], + Daniel Mustieles [es], Baurzhan Muftakhidinov [kk], Matej Urbančič [sl], + Marek Cernocky [cs], Dušan Kazik [sk], Jordi Mas [ca], Fran Dieguez [gl], + Andika Triwidada [id], Anders Jonsson [sv], Balázs Meskó [hu] + +3.25.4 +====== +* gdm: Fix "Not listed" focus indication [Florian; #784040] +* Fix missing icons in freedesktop notifications [Florian; #784245] +* gdm: Disable user list when empty [Xiaoguang; #731320] +* gdm: Allow empty reponse to PAM messages [Ray; #784360] +* Fix blocked clicks in shutdown dialog [Florian; #781738] +* Show OSD popup when changing volume via scroll wheel [Florian; #781028] +* Refine list search results [Rares; #749957] +* Replace mutter's unresponsive app dialog [Carlos; #762083] +* Improve handling of extension errors [Florian; #781728] +* Implement tablet rings/strips configuration [Carlos; #782033] +* Adjust to mozjs52 update in gjs [Florian; #785084, #785090] +* Support the meson build system [Florian; #783229] +* Misc. bug fixes [Ray, Florian, Jonas, Marco, Shih-Yuan, Joaquim, Carlos S.; + #780403, #772589, #784130, #783975, #784353, #784361, #772284, #765011, + #765011, #765011, #784985, #781471, #785047, #736148, #736148] + +Contributors: + Jonas Ådahl, Alessandro Bono, Michael Catanzaro, Carlos Garnacho, + Shih-Yuan Lee (FourDollars), Florian Müllner, Joaquim Rocha, + Mario Sanchez Prada, Carlos Soriano, Ray Strode, Marco Trevisan (Treviño), + Rares Visalom, Xiaoguang Wang + +Translations: + Jeremy Bicha po/es, he.po, Kukuh Syafaat [id], Fabio Tomat [fur] + +3.25.3 +====== +* Bypass proxies for captive portal [Bastien; #769692] +* Correctly handle "text-shadow: none;" [Matt; #783485] +* Add StEntry:hint-actor property [Mario; #783484] +* Support text-shadow CSS property in StEntry [Mario; #783484] +* Misc. bug fixes [Jonas, Florian, Bastien, Ting-Wei, Cosimo, Mario, Sebastian; + #777732, #783202, #783210, #783206, #783286, #783439, #783483, #783823, + #781950] + +Contributors: + Jonas Ådahl, Cosimo Cecchi, Sebastian Keller, Ting-Wei Lan, Florian Müllner, + Bastien Nocera, Mario Sanchez Prada, Matt Watson + +3.25.2 +====== +* Fix StEntry::primary-icon-clicked emission [Florian; #782190] +* Add an optional icon parameter to PopupMenu.addAction() [Mario; #782166] +* Allow search providers to include clipboard text with results [Daiki; #775099] +* Reduce dependency on Caribou [Carlos; #777342] +* Add transparency to top bar when free floating [Alessandro; #747163] +* Animate maximize/unmaximize operations [Alessandro; #766685] +* Misc. bug fixes [Florian, Matthias, Jeremy, Michael, Carlos, Lan; #782000, + #780215, #782802, #782637, #782930, #755164, #780215, #782982] + +Contributors: + Jeremy Bicha, Michael Biebl, Alessandro Bono, Carlos Garnacho, Ting-Wei Lan, + Matthias Liertzer, Florian Müllner, Mario Sanchez Prada, Daiki Ueno + +Translations: + Jordi Mas [ca], Christian Stadelmann [de], Милош Поповић [sr], + Милош Поповић [sr@latin], Furkan Ahmet Kara [tr] + +3.25.1 +====== +* Close Wifi selection dialog on lock [Florian; #780054] +* Fix DND over window previews in overview [Florian; #737166] +* Do not lock the screen when disabled by lockdown settings [Florian; #780212] +* Follow GNOME Weather's location permissions [Florian; #780252] +* Fix portals that require a new window to be loaded [Catalin; #759044] +* Fix restricting menus to screen height on HiDPI displays [Cosimo; #753305] +* Misc. bug fixes and cleanups [Florian, Cosimo, Bastien, Catalin, Carlos G., + Jonas, Carlos S., Xiaoguang, Rares, Emilio; #780063, #780321, #780381, + #780453, #758873, #780606, #642652, #777732, #780157, #781482, #780404, + #781545, #781728] + +Contributors: + Jonas Ådahl, Cosimo Cecchi, Philip Chimento, Carlos Garnacho, Catalin Iacob, + Florian Müllner, Bastien Nocera, Emilio Pozuelo Monfort, Carlos Soriano, + Rares Visalom, Xiaoguang Wang + +Translations: + Marek Cernocky [cs], Piotr Drąg [pl], Anders Jonsson [sv], Stas Solovey [ru], + Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Daniel Korostil [uk], + Kukuh Syafaat [id], Milo Casagrande [it], Jiri Grönroos [fi], + Daniel Mustieles [es], Balázs Úr [hu], Guillaume Bernard [fr], + Changwoo Ryu [ko], Mario Blättermann [de], Fran Dieguez [gl], + Dušan Kazik [sk], Yuras Shumovich [be], Fabio Tomat [fur], + Kjartan Maraas [nb], Aurimas Černius [lt], Trần Ngọc Quân [vi], + Rūdolfs Mazurs [lv], Γιάννης Κουτσούκος [el], gogo [hr], Марко Костић [sr], + Jordi Mas [ca], Khaled Hosny [ar] + +3.24.0 +====== + +Translations: + GNOME Translation Robot [tg], Мирослав Николић [sr, sr@latin], + Guillaume Bernard [fr], Rūdolfs Mazurs [lv], Emin Tufan Çetin [tr], + sujiniku [ja], Daniel Korostil [uk] + +3.23.92 +======= +* Implement DND to overview on wayland [Hyungwon; #765003] +* Make telepathy optional at runtime [Florian; #771721, #779878] +* Don't show forecasts for NYC when geoclue gets stuck [Sebastian; #779898] +* Add bottom edge drag gesture to bring up the OSK [Jan-Michael; #757712] +* Allow switching between pads in the same group [Carlos; #779986] +* Ignore showBanners policy for critical notifications [Florian; #779974] +* Misc. bug fixes [Florian; #779435, #779819, #779820] + +Contributors: + Jan-Michael Brummer, Allan Day, Carlos Garnacho, Hyungwon Hwang, + Sebastian Keller, Florian Müllner + +Translations: + Enrico Nicoletto [pt_BR], Jiri Grönroos [fi], Chao-Hsiung Liao [zh_TW], + Piotr Drąg [pl], Piotr Drąg [he], Balázs Meskó [hu], Kris Thomsen [da], + Yuras Shumovich [be], Sveinn í Felli [is], Inaki Larranaga Murgoitio [eu], + Changwoo Ryu [ko], Jordi Mas [ca], Aurimas Černius [lt], + Мирослав Николић [sr, sr@latin], Christian Kirbach [de], Anders Jonsson [sv], + Fabio Tomat [fur], GNOME Translation Robot [gd], Dušan Kazik [sk], + Kukuh Syafaat [id], Marek Černocký [cs], Stas Solovey [ru], + Milo Casagrande [it], Fran Dieguez [gl], Daniel Boles [gl], A S Alam [pa], + Daniel Mustieles [es] + +3.23.91 +======= +* Use the original timestamps for restored notifications [Florian; #766410] +* Add weather information to date+time drop-down [Florian; #754031] +* Refine message list layout in date+time drop-down [Florian; #775763] +* Make next/prev media controls insensitive when unavailable [Florian; #773884] +* Misc. bug fixes [Piotr, Bastien, Florian; #772210, #769546, #775799] + +Contributors: + Piotr Drąg, Carlos Garnacho, Florian Müllner, Bastien Nocera + +Translations: + Baurzhan Muftakhidinov [kk], Jordi Mas [ca], Ask Hjorth Larsen [da], + Inaki Larranaga Murgoitio [eu], Daniel Mustieles [es], Dušan Kazik [sk], + Aurimas Černius [lt], Jiri Grönroos [fi], Kjartan Maraas [nb], + Piotr Drąg [pl], Daniel Korostil [uk], Kukuh Syafaat [id], + Milo Casagrande [it], Fabio Tomat [fur], Rafael Fontenelle [pt_BR], + Fran Dieguez [gl], Мирослав Николић [sr, sr@latin], Balázs Meskó [hu], + Chao-Hsiung Liao [zh_TW] + +3.23.90 +======= +* Handle Ctrl+Q and Ctrl+W in portal window [Bastien; #764133] +* Allow to scroll through ibus candidates with mouse [Peng; #776032] +* Reload apps on .desktop file content changes [Adrian; #773636] +* Use private data/cache directories in portal helper [Bastien; #775639] +* Fix subsurfaces not showing up in previews [Rui; #756715] +* Fix theme node transitions [Florian; #778145] +* Update pad (o)leds on mode switches [Carlos; #776543] +* Add security indicators to defend against malicious portals [Bastien; #749197] +* Don't allow type ahead at the login screen [Ray; #766139] +* Don't fail to load because of TLS errors [Bastien; #778253] +* Ensure the network lists remains sorted on rename [Benjamin; #778686] +* Toggle power-off/suspend button on long-press [Florian; #721173] +* Add "kill-switch" for user extensions [Florian; #778664] +* Add night light indicator to status area [Florian; #741224] +* Misc. bug fixes [Michael, Bastien, Carlos, Rui, Florian, Alan, Philip, Jonas; + #759793, #735233, #762444, #777784, #777934, #778158, #776199, #778425, + #771098, #778552, #777317, #778660, #778661, #745626, #778672] + +Contributors: + Jonas Ådahl, Benjamin Berg, Michael Catanzaro, Philip Chimento, + Alan Coopersmith, Piotr Drąg, Carlos Garnacho, Yuri Konotopov, + Lionel Landwerlin, Rui Matos, Florian Müllner, Bastien Nocera, + Adrian Perez de Castro, Robert Roth, Ray Strode, Peng Wu + +Translations: + Jiri Grönroos [fi], Balázs Meskó [hu], Gábor Kelemen [hu], + Daniel Mustieles [es], Dušan Kazik [sk], + Piotr Drąg [ar, eu, fa, hr, pa, pt, sr, sr@latin], Rafael Fontenelle [pt_BR], + Jordi Mas [ca], Piotr Drąg [pl], Alexandre Franke [fr], + Baurzhan Muftakhidinov [kk], Yuras Shumovich [be], Mandy Wang [zh_CN], + Marek Černocký [cs], Kukuh Syafaat [id], Kjartan Maraas [nb], + Daniel Korostil [uk] + +3.23.3 +====== +* Fix replacing of GNotifications [Florian; #775149] +* Prepare for mozjs31 GJS [Philip; #775374] +* Misc. bug fixes [Niels, Jonas; #775507, #776130] + +Contributors: + Jonas Ådahl, Michael Catanzaro, Philip Chimento, Niels De Graef, + Carlos Garnacho, Florian Müllner + +Translations: + Muhammet Kara [tr], Christian Kirbach [de], Baurzhan Muftakhidinov [kk], + Cheng-Chia Tseng [zh_TW], A S Alam [pa], Gianvito Cavasoli [it] + +3.23.2 +====== +* Implement Pad configuration OSD [Carlos; #771067] +* Show overview on three-finger touchpad pinch [Carlos; #765937] +* Summarize network sections with too many devices [Florian; #773892] +* Always show primary network icon when connected [Florian; #773890] +* Fix fullscreen transitions on wayland [Rui; #770345] +* Work around portal failures by using a URL without HTPPS redirect [Debarshi; #769940] +* Fix app view hiding when no usage data is available [Florian, Xiaoguang; #774381] +* Misc. bug fixes [Florian, Ray; #773875, #740043, #773893, #774643, #774805] + +Contributors: + Carlos Garnacho, Rui Matos, Florian Müllner, Debarshi Ray, Ray Strode, + Xiaoguang Wang + +Translations: + Balázs Meskó [hu], Fabio Tomat [fur], Marek Cernocky [cs], Stas Solovey [ru], + Daniel Mustieles [es], Marek Černocký [cs], Piotr Drąg [pl], + Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Jiri Grönroos [fi], + Kjartan Maraas [nb] + +3.23.1 +====== +* Request periodic scans while WiFi list is open [Dan; #767918] +* Include extension UUID in structured log metadata [Jonh; #770717] +* Line-wrap PAM messages on login screen [Tao; #764445] +* Add a way to launch an app on the discrete GPU [Bastien; #773117] +* Only allow graphs to lift screen shield when locked [Florian; #773328] +* Add reload option to gnome-shell-extension-tool [Jonh; #772593] +* Update background animations when resuming from suspend [Florian; #773265] +* Misc. bug fixes [Cosimo, Bastien, Florian, Philip, Carlos; #772723, #772287, + #756432, #772386, #772386, #773085, #773634] + +Contributors: + Cosimo Cecchi, Philip Chimento, Carlos Garcia Campos, Florian Müllner, + Bastien Nocera, Jonh Wendell, Dan Williams, Tao Yang + +Translations: + Fabio Tomat [fur], Philip Chimento [zh_CN], YunQiang Su [zh_CN], + Jordi Mas [ca], Piotr Drąg [pl], Muhammet Kara [tr], Marek Černocký [cs], + Daniel Korostil [uk], Dušan Kazik [sk] + +3.22.1 +====== +* Fix hidden network indicator on startup [Florian; #772249] +* Fix order of windows with modal dialogs in window switcher [Florian; #747153] +* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745] +* Reliably match windows from Flatpak apps [Florian; #772615] +* Misc. bug fixes [Philip; #742249] + +Contributors: + Philip Chimento, Carlos Garnacho, Florian Müllner + +Translations: + Inaki Larranaga Murgoitio [eu], Khaled Hosny [ar], BM [uz@cyrillic], + Milo Casagrande [it], Cheng-Chia Tseng [zh_TW], gogo [hr] + +3.22.0 +====== +* Misc. bug fixes [Florian, Rui; #771391, #771536] #771656] + +Contributors: + Rui Matos, Florian Müllner + +Translations: + Ask Hjorth Larsen [da], GNOME Translation Robot [gd], Alexandre Franke [fr], + Daniel Korostil [uk], Jordi Mas [ca], Khaled Hosny [ar], David King [en_GB] + +3.21.92 +======= +* Adjust screen capture to work with multiple stage views [Jonas; #770128] +* Improve handling of cycle shortcuts [Florian; #771063] +* Fix windows not getting undimmed in some cases [Rui; #770163, #752524] +* Disable extension version check by default [Florian; #770887] +* Misc. bug fixes [Rui, Florian, Michael; #770382, #770888, #770328] + +Contributors: + Jonas Ådahl, Michael Catanzaro, Fran Dieguez, Olivier Fourdan, Rui Matos, + Florian Müllner + +Translations: + Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], + Muhammet Kara [tr], Trần Ngọc Quân [vi], A S Alam [pa], Yosef Or Boczko [he], + Anders Jonsson [sv], Tiago Santos [pt], Hannie Dumoleyn [nl], + Rūdolfs Mazurs [lv], Claude Paroz [fr], Arash Mousavi [fa], + Fran Dieguez [gl], Stas Solovey [ru], Tom Tryfonidis [el] + +3.21.91 +======= +Translations: + Mario Blättermann [de], Jiri Grönroos [fi], Dušan Kazik [sk], + Andika Triwidada [id], Daniel Mustieles [es], Fabio Tomat [fur], + Enrico Nicoletto [pt_BR], Matej Urbančič [sl], Мирослав Николић [sr, sr@latin] + +3.21.90.1 +========= +Contributors: + Piotr Drąg + +Translations: + Marek Černocký [cs], Balázs Úr [hu] + +3.21.90 +======= +* Improve on-screen keyboard on wayland [Carlos; #765009] +* Misc. bug fixes [Florian; #769156, #769216, #769074] + +Contributors: + Carlos Garnacho, Florian Müllner + +Translations: + Fabio Tomat [fur], Tiago Santos [pt], Daniel Mustieles [es], + Bernd Homuth [de], Aurimas Černius [lt], Balázs Úr [hu], + Yosef Or Boczko [he], Jiri Grönroos [fi], Marek Cernocky [cs], + Muhammet Kara [tr], Enrico Nicoletto [pt_BR], Andika Triwidada [id] + +3.21.4 +====== +* overview: Fix switching workspaces when scrolling on non-primary monitors + [Florian; #766883, #768316] +* Fix crash when using screen recorder under wayland [Rui; #767001] +* Update theme on video memory purge errors [Rui; #739178] +* Free old backgrounds immediately [Hyungwon; #766353] +* Add support for system upgrades to end session dialog [Kalev; #763611] +* Fix maximized windows flickering to the wrong size on restart [Owen; #761566] +* Hide ignored events in calendar as well [Florian; #768538] +* calendar: Only hide dismissed occurrence of recurring event [Florian; #748226] +* Provide org.freedesktop.impl.portal.access implementation [Florian; #768669] +* Misc. bug fixes and cleanups [Rui, Florian, Marinus, Jonas; #767954, #768317, + #746867, #762206, #768956, #768979] + +Contributors: + Jonas Ådahl, Piotr Drąg, Hyungwon Hwang, Kalev Lember, Rui Matos, + Florian Müllner, Marinus Schraal, Owen W. Taylor + +Translations: + Andika Triwidada [id], Daniel Mustieles [es], Bruce Cowan [en_GB], + Dušan Kazik [sk], Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK] + +3.21.3 +====== + * Do not disable suspend action when locked [Florian; #725960] + * Remember input sources MRU list [Cosimo; #766826] + * networkAgent: Handle VPN service aliases [David; #658484] + * Plug a memory leak [Hans; #710230] + +Contributors: + Cosimo Cecchi, Florian Müllner, Hans Petter Jansson, David Woodhouse + +Translations: + Tiago Santos [pt], Cédric Valmary [oc], Muhammet Kara [tr], + Daniel Mustieles [es], Rafael Fontenelle [pt_BR] + +3.21.2 +====== +* Fix sorting of hidden apps in app switcher [Florian; #766238] +* Set logind's LockedHint property when locked [Victor; #764773] +* Allocate framebuffers early to fix a crash on NVIDIA [Martin; #764898] +* Fix cycle-windows/cycle-group keybindings [Florian; #730739] +* Switch to shared desktop schema for calendar settings [Iain; #766318] +* Misc. bug fixes [Florian, Cosimo, Michele; #766325, #758471, #757556, + #757019, #766598] + +Contributors: + Cosimo Cecchi, Michele Gaio, Iain Lane, Florian Müllner, Martin Szulecki, + Victor Toso + +Translations: + Tiago Santos [pt], Kjartan Maraas [nb], Jiro Matsuzawa [ja], + Cédric Valmary [oc], Sveinn í Felli [is] + +3.21.1 +====== +* Save screencasts in HOME if XDG_VIDEO_DIR doesn't exist [Florian; #765015] +* Don't show orientation lock when g-s-d won't rotate [Florian; #765267] +* Misc. bug fixes [Heiher, Florian, Marek, Rui; #722752, #765061, #763068, + #765607, #757676, #760439] + +Contributors: + Heiher, Marek Chalupa, Rui Matos, Florian Müllner + +Translations: + Arash Mousavi [fa], Kristjan SCHMIDT [eo], GNOME Translation Robot [gd] + +3.20.1 +====== +* Plug a memory leak [Aaron; #735705] + +Contributors: + Aaron Plattner + +Translations: + Daniel Korostil [uk], Matej Urbančič [sl], Inaki Larranaga Murgoitio [eu], + Cheng-Chia Tseng [zh_TW], Fabio Tomat [fur], Trần Ngọc Quân [vi], + YunQiang Su [zh_CN], Marek Černocký [cs], Arash Mousavi [fa], + Alexander Shopov [bg], Khaled Hosny [ar] + +3.20.0 +====== + +Translations: + Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Milo Casagrande [it], + Anders Jonsson [sv], Muhammet Kara [tr], Alexandre Franke [fr], + Rūdolfs Mazurs [lv], Ask Hjorth Larsen [da], Jiro Matsuzawa [ja] + +3.19.92 +======= +* Update location dialog according to latest mockups [Zeeshan; #762480] +* Fix deleting chat notifications in calendar [Florian; #747991] + +Contributors: + Zeeshan Ali (Khattak), Florian Müllner + +Translations: + Rūdolfs Mazurs [lv], Changwoo Ryu [ko], Matej Urbančič [sl], + Justin van Steijn [nl], Fabio Tomat [fur], Kris Thomsen [da], + Marek Černocký [cs], Piotr Drąg [pl], Dušan Kazik [sk], + Мирослав Николић [sr, sr@latin], Balázs Úr [hu], Yosef Or Boczko [he], + Daniel Mustieles [es], Fran Dieguez [gl], Bernd Homuth [de], + Tom Tryfonidis [el], Jiri Grönroos [fi], Gil Forcada [ca], + Artur Morais [pt_BR], Aurimas Černius [lt], Stas Solovey [ru] + +3.19.91 +======= +* location: Ask user only once [Zeeshan; #762559] +* Fix jiggling when auto-hiding legacy tray [Florian; #747957] +* Misc. bug fixes [Florian, Michael, Ting-Wei; #762475, #762507, #755659] + +Contributors: + Zeeshan Ali (Khattak), Michael Catanzaro, Ting-Wei Lan, Florian Müllner + +Translations: + Мирослав Николић [sr, sr@latin], Piotr Drąg [pl], A S Alam [pa], + Artur de Aquino Morais [pt_BR], Daniel Mustieles [es], + Chao-Hsiung Liao [zh_TW], Daniel Korostil [uk], Fran Dieguez [gl], + Tom Tryfonidis [el], Bernd Homuth [de], Sebastian Rasmussen [sv], + Jordi Mas [ca], Piotr Drąg [ga], Cédric Valmary [oc], Gábor Kelemen [hu], + Baurzhan Muftakhidinov [kk], Friedel Wolff [af], Marek Černocký [cs], + Mingye Wang (Arthur2e5) [zh_CN], Aron Xu [zh_CN], Khaled Hosny [ar], + Aurimas Černius [lt], Stas Solovey [ru], Yosef Or Boczko [he] + +3.19.90 +======= +* Correctly identify VPN secret requests [Lubomir; #760999] +* Improve week number presentation [Jakub; #683245] +* Add audio device selection dialog [Florian; #760284] +* Add media controls to the time and date drop down [Florian; #756491] +* Fix IBus candidate popup position under wayland [Rui; #753476] +* Ask user to grant applications access to location [Zeeshan; #762119] +* Misc. bug fixes [Mario, Jakub, Florian; #761208, #761772, #762270] + +Contributors: + Zeeshan Ali (Khattak), Michael Catanzaro, Rui Matos, Florian Müllner, + Lubomir Rintel, Mario Sanchez Prada, Jakub Steiner + +Translations: + Alexander Shopov [bg], Balázs Meskó [hu], Fabio Tomat [fur], + Dušan Kazik [sk], Piotr Drąg [pl], Alexandre Franke [fr], + Mario Blättermann [de], Milo Casagrande [it], Jordi Mas [ca] + +3.19.4 +====== +* gdm: Do not allow bypassing disabled Sign In button [Michael; #746180] +* Style week numbers in calendar [Jakub; #683245] +* Misc. bug fixes [Christophe, Jakub, Rui; #759708, #760577, #760945] + +Contributors: + Michael Catanzaro, Marek Černocký, Christophe Fergeau, Rui Matos, + Jakub Steiner + +Translations: + Aurimas Černius [lt], Enrico Nicoletto [pt_BR], Andika Triwidada [id], + Mario Blättermann [de], Marek Černocký [cs], Kjartan Maraas [nb], + Muhammet Kara [tr], Stas Solovey [ru] + +3.19.3 +====== +* Fix thumbnail scaling in window switcher on HiDPI [Florian; #758676] +* Update animated backgrounds on timezone changes [Florian; #758939] +* loginDialog: Update user list on user changes [Michael; #758568] +* Fix touch interaction on wayland [Carlos; #756748] + +Contributors: + Michael Catanzaro, Carlos Garnacho, Kalev Lember, Florian Müllner + +Translations: + Daniel Korostil [uk], Muhammet Kara [tr], Dušan Kazik [sk], + Baurzhan Muftakhidinov [kk], Marek Černocký [cs] + +3.19.2 +====== +* Make gnome-shell DBus activatable [Ray; #741666] +* Fix browser plugin crash in Firefox [Carlos; #737932, #757940] +* Optionally show battery percentage in system status area [Bastien; #735771] +* Misc. bug fixes [Kalev, Florian, Bastien; #757418, #757668, #757779, #757816, + #745626, #758220] + +Contributors: + Michael Biebl, Michael Catanzaro, Piotr Drąg, Carlos Garcia Campos, + Kalev Lember, Florian Müllner, Bastien Nocera, Ray Strode + +Translations: + Pedro Albuquerque [pt], liushuyu [zh_CN], Yosef Or Boczko [he], + Jiri Grönroos [fi], Kjartan Maraas [nb], GNOME Translation Robot [gd], + Daniel Mustieles [es], Marek Černocký [cs], Kristjan SCHMIDT [eo], + Stas Solovey [ru] + +3.19.1 +====== +* Respect text-scaling factor under wayland [Owen; #756447] +* Show the Bluetooth submenu when there were setup devices [Bastien; #723848] +* Misc. bug fixes [Florian, Cosimo, Rui, Ray, Owen, Jakub, Bastien; + #756697, #756714, #756605, #754814, #738942, #756983, #756925, + #757011, #673235, #757150] + +Contributors: + Cosimo Cecchi, Rui Matos, Florian Müllner, Bastien Nocera, Jakub Steiner, + Ray Strode, Owen W. Taylor + +Translations: + Kjartan Maraas [nb], Khaled Hosny [ar], Balázs Meskó [hu], + Daniel Șerbănescu [ro], Marek Černocký [cs] + +3.18.1 +====== +* Fix screen freezes when a notification is pushed [Carlos; #755425] +* Fix overzealous ellipsization in system status menu [Adel, Florian; #708472] +* Hide app menu when disabled by setting [Florian; #745919] +* Fix lightbox effect when animations are disabled [Rui; #755827] +* Do not mark hotplug notifications as critical [Florian; #657923] +* Fix icons getting cut off in dash [Florian; #745649] +* Animate fullscreen/unfullscreen operations [Cosimo; #707248] +* Misc. bug fixes [Florian, Owen; #748919, #674799, #754581] + +Contributors: + Emmanuele Bassi, Michael Catanzaro, Cosimo Cecchi, Matthias Clasen, + Adel Gadllah, Carlos Garnacho, Ekaterina Gerasimova, Rui Matos, + Florian Müllner, Owen W. Taylor + +Translations: + Марко Костић [sr], Милош Поповић [sr@latin], Khaled Hosny [ar], + Trần Ngọc Quân [vi], Petr Kovar [cs], Alexandre Franke [fr], + Fran Dieguez [gl], Anders Jonsson [sv], Piotr Drąg [pl], Dušan Kazik [sk], + Milo Casagrande [it], Changwoo Ryu [ko], Stas Solovey [ru], + Rafael Fontenelle [pt_BR], Tom Tryfonidis [el], Aurimas Černius [lt], + Seán de Búrca [ga], Christian Kirbach [de], Jiri Grönroos [fi], + Pedro Albuquerque [pt], Baurzhan Muftakhidinov [kk], Daniel Mustieles [es], + Marek Černocký [cs], Ask Hjorth Larsen [da], Inaki Larranaga Murgoitio [eu] + +3.18.0 +====== + +Translations: + Sendy Aditya Suryana [id], Kris Thomsen [da], Seán de Búrca [ga], + Andika Triwidada [id], Enrico Nicoletto [pt_BR], Anders Jonsson [sv], + Rūdolfs Mazurs [lv] + +3.17.92 +======= +* Fix race when loading multiple background animations [Josselin; #741453] + +Contributors: + Michael Biebl, Josselin Mouette, Florian Müllner + +Translations: + Baurzhan Muftakhidinov [kk], Changwoo Ryu [ko], Christian Kirbach [de], + Kjartan Maraas [nb], Jiri Grönroos [fi], Arash Mousavi [fa], + Jiro Matsuzawa [ja], Marek Černocký [cs], Milo Casagrande [it] + +3.17.91 +======= +* Fix login screen spinner causing wakeups while VT-switched away + [Ray, Rui; #753891] +* Fix scrolling of user list on login screen [Florian; #754525] + +Contributors: + Piotr Drąg, Rui Matos, Florian Müllner, Ray Strode + +Translations: + Dušan Kazik [sk], Jordi Mas [ca], Aurimas Černius [lt], Stas Solovey [ru], + Piotr Drąg [pl], Pedro Albuquerque [pt], Daniel Mustieles [es], + Chao-Hsiung Liao [zh_TW], Muhammet Kara [tr], Fran Dieguez [gl], + Hannie Dumoleyn [nl], Yosef Or Boczko [he], Tom Tryfonidis [el], + A S Alam [pa], Balázs Úr [hu], Alexandre Franke [fr], Frédéric Péters [fr] + +3.17.90 +======= +* Avoid caret/focus viewport changes during pointer movement [Rui; #752138] +* Match GTK+'s modal dialogs for system modal dialogs [Carlos; #746108] +* Refine message list style [Florian; #749958] +* Fix type-ahead behavior for backspace and compose key [Rui; #753319, #753320] +* Refine the system status menu [Florian; #751377] +* Misc. bug fixes and cleanups [Bastien, Ray, Florian, Jakub; #752779, #752739, + #741366, #651503, #753064, #753181, #752881] + +Contributors: + Rui Matos, Florian Müllner, Bastien Nocera, Carlos Soriano, Jakub Steiner, + Ray Strode, Rico Tzschichholz + +Translations: + Marek Černocký [cs], Kjartan Maraas [nb], Jordi Mas [ca], Muhammet Kara [tr], + Enrico Nicoletto [pt_BR] + +3.17.4 +====== +* Fix fuzziness of app menu icon [Jakub; #747932] +* Implement 4 finger swipe gesture for touchpads [Carlos; #752250] +* Misc. bug fixes [Florian, Alexandre, Piotr, Ray, Mario; #751921, #659969, + #752438, #752675] + +Contributors: + Piotr Drąg, Alexandre Franke, Carlos Garnacho, Florian Müllner, + Mario Sanchez Prada, Jakub Steiner, Jasper St. Pierre, Ray Strode + +Translations: + Benjamin Steinwender [de], Pedro Albuquerque [pt], Fabio Tomat [fur], + Matej Urbančič [sl], Daniel Mustieles [es], Yosef Or Boczko [he], + Daniel Martinez [an] + +3.17.3 +====== +* Handle touch events in OSK on wayland [Rui; #750287] +* Reinstate left/right movement to window menu [Ron; #751344] +* Allow extensions to disable "Window is ready" notification [Adel; #748846] +* Misc. bug fixes [Watson, Michael, Ray, Rui, Florian, Cosimo; #750465, + #751016, #751517, #750714, #751541, #751599] + +Contributors: + Michael Biebl, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner, + Ray Strode, Wim Taymans, Ron Yorston, Watson Yuuma Sato + +Translations: + Sebastian Rasmussen [sv], Dimitris Spingos [el], Muhammet Kara [tr], + Stas Solovey [ru], Benjamin Steinwender [de], Balázs Úr [hu], + Victor Ibragimov [tg], Dušan Kazik [sk], Pedro Albuquerque [pt] + +3.17.2 +====== +* Remove StTable widget [Florian; #703833] +* Increase visibility of expanders in alt-tab popup [Jakub; #745058] +* Ensure suspend inhibitors are released when VT switched away [Rui; #749228] +* Use iio-sensor-proxy directly for orientation lock [Bastien; #749671] +* Misc. bug fixes [Florian, Lan, Carlos; #749279, #749383, #749529, #749490, + #749742] + +Contributors: + Carlos Garnacho, Ting-Wei Lan, Rui Matos, Florian Müllner, Bastien Nocera, + Jakub Steiner + +Translations: + Yosef Or Boczko [he], sun [zh_CN], Felipe Braga [pt_BR], + Victor Ibragimov [tg], Gábor Kelemen [hu], Cédric Valmary [oc], + Dušan Kazik [sk], Kjartan Maraas [nb], Bruno Ramalhete [pt], + Matej Urbančič [sl], Daniel Mustieles [es] + +3.17.1 +====== +* Add Display Settings entry to background menu [Meet; #697346] +* Add window menu option to move to different monitor [Isaac; #633994] +* Improve switch style in default/highContrast themes [Jakub; #746294, #747912] +* Make event highlight in calendar more prominent [Jakub; #747715] +* Fix keyboard focus when focusing a notification banner [Florian; #747205] +* Move notification banners below the dateMenu [Meet, Florian; #745910] +* Misc. bug fixes [Mario, Rui; #748338, #748541] + +Contributors: + Isaac Ge, Rui Matos, Florian Müllner, Meet Parikh, Mario Sanchez Prada, + Jakub Steiner, Jasper St. Pierre + +Translations: + Sveinn í Felli [is], Marek Černocký [cs], laurent Soleil [oc] + +3.16.1 +====== +* gdm: Move long session chooser menus to the side [Florian; #734352] +* Work around background corruption with NVIDIA driver [Rui; #739178] +* Don't allow move-to-workspace for always-sticky windows [Florian; #746782] +* Allow switching workspaces with PgUp/PgDown in overview [Devyani; #742581] +* Bump time PAM messages are displayed [Sarvjeet; #720885] +* Fix "stutter" when moving window past the last workspace [Shivam; #712778] +* Fix blurred text on login screen [Clément; #746912] +* keyboard: Restore whole MRU list after password mode [Rui; #746605] +* Pass event timestamps when activating remote actions [Owen; #747323] +* Fix hung login screen when password is typed too quickly [Shivam; #737586] +* Make on-screen keyboard work for shell chrome on wayland [Rui; #747274] +* Implement reexec_self() for FreeBSD [Ting-Wei; #747788] +* Allow to dismiss resident notifications [Florian; #746860] +* Temporarily reveal legacy tray when icons are added [Florian; #746025] +* Make concealed tray smaller to minimize overlap with apps [Florian; #746787] +* Misc. bug fixes [Florian, Rui, Giovanni; #746323, #746579, #746902, #746364, + #746509, #747636] + +Contributors: + Sarvjeet, Giovanni Campagna, Adel Gadllah, Clément Guérin, Devyani Kota, + Ting-Wei Lan, Rui Matos, Shivam Mishra, Florian Müllner, Owen W. Taylor + +Translations: + Khaled Hosny [ar], Dušan Kazik [sk], Yuri Myasoedov [ru], Stas Solovey [ru], + Hannie Dumoleyn [nl], Rūdolfs Mazurs [lv] + +3.16.0 +====== +* Revert erroneous login dialog changes [Ray; #740142] +* Improve accessibility of legacy tray [Florian; #746487] +* Fix legacy status icons leaking into other monitors [Florian; #745824] + +Contributors: + Florian Müllner, Ray Strode + +Translations: + Daniel Martinez [an], Sebastian Rasmussen [sv], Fran Dieguez [gl], + Andika Triwidada [id], Jordi Mas [ca], Kjartan Maraas [nb], + Inaki Larranaga Murgoitio [eu], Muhammet Kara [tr], Khaled Hosny [ar], + Bernd Homuth [de], Jiro Matsuzawa [ja] + +3.15.92 +======= +* gdm: Fix user list accessibility [Florian; #729603] +* Handle multiline questions in mount operations [Ross; #745713] +* Improve classic theme [Jakub; #745686, #745687] +* Fix ordering of calendar events [Florian; #745988] +* Pick first input source for new windows when per-window [Rui; #746037] +* networkAgent: Show a notification for non-user-initiated password requests + [Giovanni; #660293] +* Fix dismissing calendar events [Florian; #744927] +* Add legacy tray to ctrl-alt-tab popup [Florian; #746022] +* Manage on-screen-keyboard visibility in gnome-shell [Carlos; #745977] +* Add pointer barriers to legacy tray [Cosimo; #746026] +* Use fallback when app icon cannot be resolved [Cosimo; #746219] +* Fix handling of removed smartcard at startup [Ray; #740143] +* gdm: Don't pick a random session for the user [Jasper; #740142] +* Make menu selection behavior consistent with GTK [Florian; #745246] +* gdm: Fix empty user list on user switching [Ray; #719418] +* Misc bug fixes [Florian, Giovanni, Clément, Rui; #745666, #746019, #745861, + #746027, #746223, #737502, #746343, #746288] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Piotr Drąg, Adel Gadllah, Carlos Garnacho, + Clément Guérin, Ross Lagerwall, Rui Matos, Florian Müllner, Jakub Steiner, + Jasper St. Pierre, Ray Strode + +Translations: + Piotr Drąg [pl], Changwoo Ryu [ko], Milo Casagrande [it], + Baurzhan Muftakhidinov [kk], Мирослав Николић [sr, sr@latin], Balázs Úr [hu], + IWAI, Masaharu [ja], Daniel Korostil [uk], Aurimas Černius [lt], + Matej Urbančič [sl], Daniel Mustieles [es], Kjartan Maraas [nb], + Victor Ibragimov [tg], Claude Paroz [fr], Jordi Mas [ca], Bernd Homuth [de], + Muhammet Kara [tr], Frédéric Péters [fr], Jiri Grönroos [fi], + Alexander Shopov [bg], Stas Solovey [ru], Trần Ngọc Quân [vi], + Samir Ribic [bs], Dušan Kazik [sk], Enrico Nicoletto [pt_BR], + Marek Černocký [cs], A S Alam [pa], Ask Hjorth Larsen [da], + Tom Tryfonidis [el], Alexandre Franke [fr], Yosef Or Boczko [he], + Chao-Hsiung Liao [zh_TW] + +3.15.91 +======= +* Don't disable all shortcuts while non-panel menus are open [Florian; #745039] +* Do not wake up the screen for disabled notifications [Florian; #744114] +* Add unminimize animation [Florian; #702662] +* Change default shortcut for viewing notifications [Florian; #687986] +* Add shortcut to dismiss notifications from list [Florian; #745279] +* Use Polari instead of Empathy for IRC conversations [Giovanni; #745431] +* Add a hideable bottom tray for legacy status icons [Florian; #745162] +* Improve accessibility of calendar/message list [Florian; #706903, #745393] +* Fix window thumbnail scaling in overview [Sebastian; #744883] +* Stop handling non-chat notifications for Empathy [Giovanni; #745503] +* Fix mouse interaction with ibus candidate window [Rui; #745167, #745245] +* Misc bug fixes and cleanups [Giovanni, Florian, Miguel, Cosimo, Jakub, + Michele, Raul, Matthias, Rui; #677412, #744880, #744900, #744894, #744907, + #745061, #741111, #744912, #745175, #745246, #744959, #744575, #745570, + #652742, #659187, #745412, #745521, #745521, #741665, #745574, #745627, + #745494, #745111, #745132, #745110] + +Contributors: + Michele, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, + Raul Gutierrez Segales, Sebastian Keller, David Liang, Rui Matos, + Florian Müllner, Yosef Or Boczko, Jakub Steiner, Jasper St. Pierre, + Rico Tzschichholz, Miguel Vaello Martínez + +Translations: + Dušan Kazik [sk], Chao-Hsiung Liao [zh_TW], Muhammet Kara [tr], + Balázs Úr [hu], Daniel Mustieles [es], Frédéric Péters [fr], + Rafael Ferreira [pt_BR], Aurimas Černius [lt], Milo Casagrande [it], + Yosef Or Boczko [he], Stas Solovey [ru], Baurzhan Muftakhidinov [kk], + Daniel Korostil [uk], Fran Dieguez [gl], Kjartan Maraas [nb], + Tom Tryfonidis [el], Cheng-Chia Tseng [zh_TW], Friedel Wolff [af], + Alexandre Franke [fr], Efstathios Iosifidis [el], Aron Xu [zh_CN], + Marek Černocký [cs], Enrico Nicoletto [pt_BR] + +3.15.90 +======= +* gdm: Fix reactivity of first user in user list [Ray; #743370] +* Prevent DND to dash when favorites are locked down [David; #741325] +* Prevent DND in app picker when favorites are locked down [Murray; #741325] +* Implement Display panel's OSD monitor labels in the shell [Rui; #743744] +* Remove GSystem dependency [Colin; #744457] +* Do not duplicate "New Window" action in dash [Florian; #744446] +* Fix 'draw-cursor' option of screen recorder [Alexander; #744599] +* Fix screencast timestamps [Sebastian; #744642] +* Allow keybindings for switching to VT8-VT12 [Ray; #744800] +* Implement notification redesign [Florian; #744498, #744815, #744817, #744850] +* Fix struts computation of chrome on non-primary monitors [Sylvain; #744183] +* Visual refresh based on GTK+ theme redesign [Jakub, Carlos; #737785, #744680] +* Misc. bug fixes and cleanups [Ray, Bastien, Cosimo, Rui, Florian; #743371, + #736182, #744013, #743993, #744665] + +Contributors: + Cosimo Cecchi, Murray Cumming, Sebastian Dröge, David King, + Alexander Larsson, Rui Matos, Florian Müllner, Bastien Nocera, + Sylvain Pasche, Carlos Soriano, Jakub Steiner, Jasper St. Pierre, Ray Strode, + Colin Walters + +Translations: + Daniel Martinez [an], Sveinn í Felli [is], GNOME Translation Robot [de], + Yosef Or Boczko [he], Kristjan SCHMIDT [eo], Dušan Kazik [sk], + Andika Triwidada [id], Marek Černocký [cs], Muhammet Kara [tr], + Matej Urbančič [sl], Milo Casagrande [it], Anders Jonsson [sv] + +3.15.4 +====== +* Add mode parameter to AcceleratorActivated signal [Florian; #711682] +* Fix PID based window/app association [Sebastian; #736527] +* Fix current day highlight on day change [Sebastian; #742492] +* Switch to vp9 for screencast recordings [Adel; #742744] +* Disable IBus input sources on password entries [Takao; #730628] +* Make slider scrolling smoother [Adel; #742648] +* Allow move-up shortcut to move window above top workspace [Florian; #665764] +* Misc. bug fixes [Adel, Rui; #742748, #742824, #741114] + +Contributors: + Cosimo Cecchi, Takao Fujiwara, Adel Gadllah, Sebastian Keller, Rui Matos, + Florian Müllner, Jasper St. Pierre + +Translations: + Andika Triwidada [id], Matej Urbančič [sl], Saibal Ray [bn_IN], + Inaki Larranaga Murgoitio [eu], Stas Solovey [ru], Kjartan Maraas [nb], + Balázs Úr [hu], Marek Černocký [cs], Rafael Ferreira [pt_BR], + Bernd Homuth [de], Daniel Mustieles [es], Fabio Tomat [fur] + +3.15.3 +====== +* Add support for high-contrast themes [Florian; #740447] +* Fix banner message on login screen without user list [Ray; #703972] +* Fix flicker when activating windows on another workspace [Florian; #741680] +* Misc. bug fixes [Giovanni, Florian; #735308, #740237] + +Contributors: + Giovanni Campagna, Florian Müllner, Jasper St. Pierre, Ray Strode + +Translations: + Balázs Úr [hu], Josef Andersson [sv], Muhammet Kara [tr], + Baurzhan Muftakhidinov [kk], Inaki Larranaga Murgoitio [eu] + +3.15.2 +====== +* Fix visual glitch of window preview outline in overview [Chris; #699044] +* Change user facing name of "Captive Portal" to "Network Login" [Elad; #737198] +* Port to Python 3 [Slavek; #732478] +* Hide Airplane mode indicator when g-s-d says so [Cosimo; #736292] +* Allow translators to change non-work days [Lavi; #664645] +* Delay invocation of caribou daemon until really needed [Daiki; #739712] +* Don't lock screen after crash if locking is disabled [Adel; #704884] +* Improve layout of extension installation dialog [William; #739888] +* Fix workspace changes from app picker [Yuki; #737534] +* Preload all ibus input sources in user configuration [Takao; #695428] +* Properly remove network connections from list [Ryan; #740227] +* Support CSS margin property [Carlos; #728437] +* Improve handling of BUSY application state [Phillip; #736492] +* Fix erroneous week numbers in calendar [Florian; #736722] +* Misc. bugfixes and cleanups [Darcy, Yuki, Alexander, Eskild, Bastien, Cosimo, Colin, + Ray; #738725, #739497, #739241, #672500, #739822, #740074, #704163, #740141] + +Contributors: + Yuki, Lavi .A, Elad Alfassa, Cosimo Cecchi, Takao Fujiwara, Adel Gadllah, + Eskild Hustvedt, Chris Johns, William Jon McCann, Slavek Kabrda, Ryan Lortie, + Florian Müllner, Bastien Nocera, Christian Persch, Carlos Soriano, + Jasper St. Pierre, Ray Strode, Alexander Tsoy, Daiki Ueno, Colin Walters, + Phillip Wood + +Translations: + Jorge Perez Perez [an], Daniel Martinez [an], Daniel Mustieles [es], + Trần Ngọc Quân [vi], Changwoo Ryu [ko], Kjartan Maraas [nb], + Yosef Or Boczko [he], Marek Černocký [cs] + +3.15.1 +====== +* Use GResources for theme loading [Cosimo; #736936] +* Reset the OSK to primary on monitor changes [Rui; #738536] +* Use LC_TIME locale for format string translations [Florian; #738640] +* Summarize queued up notifications [Devyani; #702460] +* Improve handling of multi-day events [Andreas; #727302] +* Support EXTERNAL scroll policy type [Florian; #739379] +* Misc. bugfixes [Owen, Rui; #738652, #739252] + +Contributors: + Andreas Brauchli, Cosimo Cecchi, Devyani Kota, Rui Matos, Florian Müllner, + Jasper St. Pierre, Owen W. Taylor + +Translations: + Bahodir Mansurov [uz@cyrillic] + +3.14.1 +====== +* Fix pulse animation for scrolled app folders [Florian; #736885] +* Fix updating background on file changes [Owen; #710756] +* Obtain keyboard variant from IBus [Jinkyu; #735066] +* Implement Ctrl-u / Ctrl-k keybindings in entries [Florian; #737346] +* Pass VPN hints to auth dialog [Dan; #737592] +* Only allow one screenshot request at a time [Adel; #737456] +* Respect disable-save-to-disc lockdown setting [Florian; #737846] +* Respect scaling-factor for profile pictures [Darcy; #735419] +* Focus login screen after lifting the lock screen shield [Ray; #708105] +* Speed up pulse animation for few items [Carlos S.; #737017] +* Fix gap between workspace switcher and screen edge [Florian; #728899] +* Disable unredirection during recordings [Adel; #738226] +* Ensure there's always at least one input source [Rui; #738303] +* Restrict width of dash icons' context menus [Adel; #738054] +* Misc. bug fixes [Jasper, Florian, Carlos G., Owen; #736999, #737382, #737001, + #738314, #738256, #738147] + +Contributors: + Darcy Beurle, Cosimo Cecchi, Adel Gadllah, Carlos Garnacho, Rui Matos, + Florian Müllner, Carlos Soriano, Jasper St. Pierre, Ray Strode, Patrick Ward, + Dan Williams, Owen W. Taylor, Jinkyu Yi + +Translations: + Мирослав Николић po/sr, sr@latin.po, Fran Diéguez [gl], Marek Černocký [cs], + Saibal Ray [bn_IN], Rajesh Ranjan [hi], Friedel Wolff [af], + Zhou Fang [zh_CN], Krishnababu Krothapalli [te], Kjartan Maraas [nb], + Rūdolfs Mazurs [lv], Sweta Kothari [gu], Christian Kirbach [de], + Cheng-Chia Tseng [zh_TW], Pedro Albuquerque [pt], Daniel Mustieles [es], + Luca Ferretti [it], Baurzhan Muftakhidinov [kk], Arash Mousavi [fa], + Milo Casagrande [it] + +3.14.0 +====== +* Fix exposure of the accessible tree [Alejandro; #736821] +* Hide empty app folders in app picker [Florian; #736910] + +Contributors: + Florian Müllner, Alejandro Piñeiro + +Translations: + Yuri Myasoedov [ru], Pawan Chitrakar [ne], Manoj Kumar Giri [or], + Daniel Mustieles [es], GNOME Translation Robot [de], Rajesh Ranjan [hi], + Shankar Prasad [kn], Kenneth Nielsen [da], Daniel Korostil [uk], + Changwoo Ryu [ko], A S Alam [pa], Tom Tryfonidis [el], Petr Kovar [cs] + +3.13.92 +======= +* Fix submenu arrow animations [Hashem; #728927] +* Always initialize clutter accessibility [Alejandro; #735908] +* Adapt to mutter background changes [Owen; #735638] +* Improve handling of outOfDate extensions in prefs [Florian; #736185] +* Port offline updates to PackageKit's DBus interface [Kalev; #736337] +* location: Translate accuracy levels for geoclue [Zeeshan; #736479] +* Implement input source switching [Rui; #736435] +* Fix crash when dragging window from workspace switcher [Carlos G.; #735972] +* Clean out list of default favorites [Elad; #735682] +* Add settings link to location submenu [Florian; #736542] +* Fix keynav of message tray menu button [Florian; #707799] +* Misc. bug fixes [Carlos G., Florian, Rui; #736110, #736329, #736343, + #735927, #735976] + +Contributors: + Elad Alfassa, Zeeshan Ali (Khattak), Michael Catanzaro, Adel Gadllah, + Carlos Garnacho, Kalev Lember, Rui Matos, Florian Müllner, Hashem Nasarat, + Alejandro Piñeiro, Carlos Soriano, Jasper St. Pierre, Owen W. Taylor + +Translations: + Piotr Drąg [pl], Changwoo Ryu [ko], Yuri Myasoedov [ru], Zhou Fang [ja], + Peter Mráz [sk], Ville-Pekka Vainio [fi], Sweta Kothari [gu], + Marek Černocký [cs], A S Alam [pa], Christian Kirbach [de], + Alexandre Franke [fr], Aurimas Černius [lt], Khaled Hosny [ar], + Enrico Nicoletto [pt_BR], Andika Triwidada [id], Shantha kumar [ta], + Matej Urbančič [sl], Pawan Chitrakar [ne], Yosef Or Boczko [he], + Balázs Úr [hu], Dušan Kazik [sk], Gil Forcada [ca], + Carles Ferrando [ca@valencia], Nilamdyuti Goswami [as], Ivaylo Valkov [bg], + Sandeep Sheshrao Shedmake [mr], Umarzuki Bin Mochlis Moktar [ms], + Muhammet Kara [tr], Jiro Matsuzawa [ja], Kris Thomsen [da], + Mattias Eriksson [sv] + +3.13.91 +======= +* Fix keynav into session menu on login screen [Florian; #735614] +* Add gesture to summon message tray [Carlos G.; #735625] +* Accept scrolls/swipes either way on the screen shield [Jasper; #734874] +* Animate opening the app picker and improve app folder animations + [Carlos S.; #734726] +* Animate app icons on launching a new window [Carlos S., Florian; #734726] +* Show the on-screen keyboard when touch input is being used [David; #702015] +* Misc. bug fixes [Bastien, Owen, Florian, Carlos G.; #735190, #735385, + #735608, #735681] + +Contributors: + Carlos Garnacho, David King, Kalev Lember, Florian Müllner, Bastien Nocera, + Carlos Soriano, Jasper St. Pierre, Owen W. Taylor + +Translations: + Fran Diéguez [gl], Sweta Kothari [gu], Manoj Kumar Giri [or], + Alain Lojewski [fr], Praveen Illa [te], Arash Mousavi [fa], + Andika Triwidada [id] + +3.13.90 +======= +* Make use of GLSL optional [Adel; #733623] +* Update on-screen-keyboard position on monitor changes [Cosimo; #733790] +* Improve window manager animations [Giovanni; #732857] +* Handle touch events [Carlos G.; #733633] +* Try to not show "New Window" action for single-window apps + [Giovanni; #722554] +* Fix overview exceeding screen size with many apps installed + [Carlos S.; #723496] +* Add Software to default favorites [Mathieu; #734406] +* Improve app picker <-> desktop transition [Carlos S.; #732901] +* Remove -magic for switcher popups [Christophe; #732296] +* Add a special background to use for performance testing [Owen; #734610] +* Add support for default disabled search providers [Giovanni; #734110] +* Fix portals that don't redirect properly [Giovanni; #733848] +* Fix history trimming in chat notifications [Giovanni; #733899] +* Try to use default calendar application [Florian; #722333] +* Only show location menu when geolocation is in use [Zeeshan; #731122] +* Misc. bug fixes and cleanups [Giovanni, Carlos G., Zeeshan, Carlos S., + Cosimo; #711682, #733840, #734483, #734680, #733813, #735062] + +Contributors: + Zeeshan Ali (Khattak), Mathieu Bridon, Giovanni Campagna, Cosimo Cecchi, + Piotr Drąg, Christophe Fergeau, Adel Gadllah, Carlos Garnacho, + Florian Müllner, Carlos Soriano, Jasper St. Pierre, Olav Vitters, + Owen W. Taylor + +Translations: + Aurimas Černius [lt], MarMav [el], Inaki Larranaga Murgoitio [eu], + Reinout van Schouwen [nl], ngoswami [as], Fabio Tomat [fur], + Chao-Hsiung Liao [zh_HK, zh_TW] + +3.13.4 +====== +* Handle portal login requests [Giovanni; #704416] +* Scale fonts on wayland on hiDPI devices [Adel; #732537] +* Fix default ibus candidate index labels [Rui; #702944] +* Add gestures for various system actions [Carlos G.] +* Add performance test script for the perf.gnome.org [Owen; #732350] +* Use new restart framework to improve restart visuals [Owen; #733026] +* Improve keynav in app folder popups [Carlos S.; #731477] +* Fix truncation of app search results [Carlos S.; #732416] +* Automatically update renamed desktop files in favorites [Kalev; #729429] +* Misc. bug fixes and cleanups [Giovanni, Yosef, Owen, Bastien, Javier; + #729823, #726401, #732301, #732348, #732349, #733498, #733540] + +Contributors: + Giovanni Campagna, Adel Gadllah, Carlos Garnacho, Javier Hernández, + Kalev Lember, Rui Matos, Florian Müllner, Bastien Nocera, Yosef Or Boczko, + Carlos Soriano, Jasper St. Pierre, Owen W. Taylor + +Translations: + Yuri Myasoedov [ru], Daniel Mustieles [es], Fran Diéguez [gl], + Cheng-Chia Tseng [zh_TW], A S Alam [pa], Benjamin Steinwender [de], + Enrico Nicoletto [pt_BR], MarMav [el], Yosef Or Boczko [he], + Kjartan Maraas [nb] + +3.13.3 +====== +* Don't allow closing windows with attached modals [Florian; #729886] +* Fix self-restarting on OpenBSD [Antoine; #727763] +* Improve behavior of window buttons with compositor menus [Florian; #731058] +* Work around atspi-related performance regression [Alejandro; #730118] +* Misc bug fixes and cleanups [Florian, Lan, Jasper, Christophe, Debarshi, + Zeeshan; #728271, #726460, #703833, #731118, #731220, #695487, #730527, + #728170, #731619, #731738, #731882, #731923] + +Contributors: + Zeeshan Ali (Khattak), Christophe Fergeau, Adel Gadllah, Antoine Jacoutot, + Ting-Wei Lan, Florian Müllner, Alejandro Piñeiro, Debarshi Ray, + Carlos Soriano, Jasper St. Pierre, Wim Taymans, Rico Tzschichholz + +Translations: + Philip Withnall [en_GB], Milo Casagrande [it], Aurimas Černius [lt], + Enrico Nicoletto [pt_BR], Kjartan Maraas [nb], Balázs Meskó [hu], + Muhammet Kara [tr], Daniel Mustieles [es], Yosef Or Boczko [he], + Matej Urbančič [sl], Mattias Eriksson [sv] + +3.13.2 +====== +* Make airplane mode menu insensitive in lock screen [Giovanni; #729224] +* Don't always extend struts to the screen edge [Florian; #683819] +* Fix keynav for alternatives in AltSwitcher [Florian; #727259] +* Implement window menus in the shell [Jasper; #726352] +* Support resource:/// URLs in GNOME_SHELL_JS envvar [Owen; #730409] +* Fix switcher popups with keybindings containing Escape [Rui; #730739] +* Update extension-prefs UI to follow GNOME 3 patterns [Florian; #730829] +* Add support for fallback app menu in window decorations [Florian; #730752] +* Fix keynav escaping open app folders [Florian; #726760] +* Misc. bug fixes [Kalev, Florian, Owen; #729429, #728449, #730408, #730753, + #730653] + +Contributors: + Giovanni Campagna, Piotr Drąg, Kalev Lember, Rui Matos, Florian Müllner, + Vadim Rutkovsky, Carlos Soriano, Jasper St. Pierre, Owen W. Taylor + +Translations: + Ihar Hrachyshka [be], Giovanni Campagna [it], Carles Ferrando [ca@valencia], + Daniel Mustieles [es], Aurimas Černius [lt], Enrico Nicoletto [pt_BR], + Yosef Or Boczko [he], Marek Černocký [cs], Muhammet Kara [tr], + Georges Neto [pt_BR], Andika Triwidada [id] + +3.13.1 +====== +* Ensure the currently focused app icon is viewable [Rui; #726759] +* Improve language in location menu [Zeeshan; #726498] +* Improve HiDpi support [Cosimo; #726907] +* Set accessible role for window previews [Alejandro; #726670] +* Fix bad antialiasing on panel menu buttons [Carlos; #727336] +* Don't hide location menu [Zeeshan; #727398] +* Fix IM candidate window obscuring current text [Rui; #727579] +* Don't always extend struts to the screen edge [Florian; #663690] +* Add shortcuts for switching to the last workspace [Elad; #659288] +* Show OSD window on all monitors [Adel; #722684] +* Improve consistency of labels in network menu [Paul; #727163] +* Fix zombie search providers showing up [Jasper; #728597] +* Remove ConsoleKit support [Florian; #686626] +* Fix region screenshots with open shell menus [Florian; #709126] +* Support insert in text entries [Florian; #648318] +* Improve app picker scrolling on touch [Jasper; #729064] +* Don't make date button clickable when on current date [Carlos; #726724] +* Tweak heuristic for hiding workspace switcher [Florian; #662457] +* Add option to show in Software to app context menu [Matthias; #643043] +* Misc. bug fixes and cleanups [Bastien, Florian, Giovanni, Adel, Vadim, + Carlos; #727983, #727948, #728512, #728681, #728897, #727384, #728820, + #715042, #728449, #728343] + +Contributors: + Elad Alfassa, Zeeshan Ali (Khattak), Giovanni Campagna, Cosimo Cecchi, + Matthias Clasen, Piotr Drąg, Adel Gadllah, Paul Lange, Rui Matos, + Simon McVittie, Florian Müllner, Bastien Nocera, Alejandro Piñeiro, + Vadim Rutkovsky, Carlos Soriano, Jasper St. Pierre + +Translations: + Khaled Hosny [ar], Piotr Drąg [pl], Yosef Or Boczko [he], + Antonio Fernandes C. Neto [pt_BR], Marek Černocký [cs], maria thukididu [el], + Andika Triwidada [id], Daniel Mustieles [es], Changwoo Ryu [ko], + Benjamin Steinwender [de], Sphinx Jiang [zh_CN], + Inaki Larranaga Murgoitio [eu], Marcus Lundblad [sv], Aurimas Černius [lt], + Stas Solovey [ru], Alexandre Franke [fr], Matej Urbančič [sl], + Fran Diéguez [gl], Pau Iranzo [ca], Luca Ferretti [it], Milo Casagrande [it], + Tiago S [pt], Victor Ibragimov [tg], Dirgita [id], Khoem Sokhem [km], + Rūdolfs Mazurs [lv], Balázs Úr [hu], Ask H. Larsen [da], Ikuya Awashiro [ja], + Wouter Bolsterlee [nl], Daniel Korostil [uk], Daniel Șerbănescu [ro], + Enrico Nicoletto [pt_BR] + +3.12.0 +====== +* gdm: Reset greeter when coming back to login screen [Jasper; #726989] + +Contributors: + Jasper St. Pierre + +Translations: + Daniel Martinez [an], Yuri Myasoedov [ru], Inaki Larranaga Murgoitio [eu], + Abderrahim Kitouni [ar], Praveen Illa [te], Matej Urbančič [sl], + Chao-Hsiung Liao [zh_HK, zh_TW], Frédéric Péters [fr], + Мирослав Николић [sr, sr@latin], Ask H. Larsen [da], Kenneth Nielsen [da], + Jiro Matsuzawa [ja], Dušan Kazik [sk] + +3.11.92 +======= +* calendar: Grab key focus after changing day [Volker; #725606] +* gdm: Don't load user list if disabled [Florian; #725905] +* Don't show network-offline in the top bar [Jasper; #725340] +* Improve radial shade effect of modal dialogs [Giovanni; #725830] +* Fix broken suspend-on-idle functionality [Giovanni; #712706] +* Close wifi selection dialog when device disappears [Giovanni; #723935] +* Don't close chats when pressing Escape [Giovanni; #724178] +* Improve smartcard support in login/lock screen [Ray; #726262, #726263] +* Wake up screen when resuming from suspend [Giovanni; #726378] +* Make bluetooth and location items insensitive when locked [Florian; #726319] +* Don't show bluetooth icon when there is no adapter [Giovanni; #725057] +* Make sure to keep the OSK on top of modal dialogs [Rui; #719451] +* Misc. bug fixes and cleanups [Giovanni, Ray, Adel, Daniel, Jasper, Florian; + #725832, #725958, #722149, #724977, #724798, #725020, #723976, #726119, + #726238, #585500, #704844, #726323, #726322, #726120, #726414] + +Contributors: + Giovanni Campagna, Daniel Drake, Adel Gadllah, Rui Matos, Florian Müllner, + Volker Sobek, Jasper St. Pierre, Ray Strode + +Translations: + Fabio Tomat [fur], Rafael Ferreira [pt_BR], Fran Diéguez [gl], + Marek Černocký [cs], Baurzhan Muftakhidinov [kk], Andika Triwidada [id], + A S Alam [pa], Rūdolfs Mazurs [lv], Wylmer Wang [zh_CN], + Aurimas Černius [lt], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru], + Tiagosdot [pt], Benjamin Steinwender [de], Frédéric Peters [fr], + Daniel Korostil [uk], Yaron Shahrabani [he], Ville-Pekka Vainio [fi], + maria thukididu [el], Victor Ibragimov [tg], Kjartan Maraas [nb], + Gábor Kelemen [hu], Ask H. Larsen [da] + +3.11.91 +======= +* Don't use network profile name in menu [Giovanni; #725586] +* calendar: Make date label clickable to return to current date [Vit; #641366] +* Misc. bug fixes [Florian, Zeeshan, Adel, Jasper, Dan, Volker; #724813, + #724686, #725082, #724870, #724779, #725533] + +Contributors: + Zeeshan Ali (Khattak), Giovanni Campagna, Piotr Drąg, Adel Gadllah, + Florian Müllner, Volker Sobek, Vit Stanislav, Jasper St. Pierre, Dan Williams + +Translations: + Victor Ibragimov [tg], Aurimas Černius [lt], Dimitris Spingos [el], + Andika Triwidada [id], Rafael Ferreira [pt_BR], Daniel Mustieles [es], + Baurzhan Muftakhidinov [kk], Marek Černocký [cs], Ihar Hrachyshka [be], + eternalhui [zh_CN], Yosef Or Boczko [he], Fran Diéguez [gl], + Khaled Hosny [ar], Ville-Pekka Vainio [fi], Piotr Drąg [pl], + Kjartan Maraas [nb], Changwoo Ryu [ko] + +3.11.90 +======= +* Stop showing two bluetooth entries [Giovanni; #709353] +* Improve styling of login/lock screen [Reda; #723833] +* Fix magnifier crosshairs [Magdalen; #723709] +* Make NetworkManager support optional [Michael; #669495] +* Make middle-click open a new instance [Florian; #695010] +* Scale the UI on high resolution displays [Cosimo, Adel; #705410, #724607] +* Remove notification counter on screen shield [Carlos; #709275] +* Improve app picker transition [Carlos; #722331] +* Add geolocation indicator to status menu [Zeeshan; #723684] +* Improve timestamps in chat notifications [Carlos; #708031, #715158] +* Improve network menus [Giovanni; #723570] +* Add "VPN Setting" item to VPN submenu [Giovanni; #709167] +* Improve appearance of disclosure arrows [Carlos; #720206] +* Add GSetting key to disable version validation of extensions [Adel; #724683] +* Delay auto-removing empty workspaces [Florian; #709064] +* Offer offline updates in the shutdown dialog [Kalev; #722898] +* Animate tile previews [Florian; #665758] +* Misc. bug fixes and cleanups [Giovanni, Ryan, Debarshi, Florian; #709128, + #722342, #723661, #724184, #724256, #724293, #724305, #722554, #724282, + #724690, #722928] + +Contributors: + Zeeshan Ali (Khattak), Magdalen Berns, Michael Biebl, Giovanni Campagna, + Cosimo Cecchi, Adel Gadllah, Reda Lazri, Kalev Lember, Ryan Lortie, + Florian Müllner, Debarshi Ray, Carlos Soriano, Jasper St. Pierre, + Colin Walters + +Translations: + Victor Ibragimov [tg], Daniel Mustieles [es], Khaled Hosny [ar], + Enrico Nicoletto [pt_BR], Yosef Or Boczko [he], Fran Diéguez [gl], + Marek Černocký [cs], Baurzhan Muftakhidinov [kk], Jorge Pérez Pérez [an], + Kjartan Maraas [nb], David Lüder [de], Daniel Korostil [uk], ngoswami [as], + Rafael Ferreira [pt_BR] + +3.11.5 +====== +* Fix extension preference tool [Florian; #722334] +* Fix keyboard activation of legacy tray icons [Giovanni; #721267] +* Add radial background shade for modal dialogs [Giovanni; #669798] +* Show attached modal windows in the overview [Giovanni; #650843] +* Add support for desktop actions [Giovanni; #669603] +* Indicate in system status when location service is used [Zeeshan; #709372] +* Add support for extended app folder schema [Jasper; #723179] +* Show status icon for wired network connections [Jasper; #708966] +* Indicate airplane mode in network selection dialog [Giovanni; #709128] +* Misc bug fixes and cleanups [Florian, Sebastian, Giovanni, Tim, Matt, Jasper; + #722417, #722494, #722547, #722593, #722434, #722787, #722690, #722840, + #722660, #722812, #723197, #722927, #723306, #723308, #723523, #709685, + #723570] + +Contributors: + Zeeshan Ali (Khattak), Magdalen Berns, Giovanni Campagna, William Jon McCann, + Sebastian Keller, Tim Lunn, Florian Müllner, Carlos Soriano, + Jasper St. Pierre, Rico Tzschichholz, Matt Watson + +Translations: + Marek Černocký [cs], Mattias Põldaru [et], Tong Hui [zh_CN], + Victor Ibragimov [tg], Enrico Nicoletto [pt_BR], Daniel Mustieles [es], + Fran Diéguez [gl], Kjartan Maraas [nb], Nilamdyuti Goswami [as], + Aurimas Černius [lt], Stas Solovey [ru], Yosef Or Boczko [he], + Jorge Pérez Pérez [an], Dimitris Spingos [el], Baurzhan Muftakhidinov [kk], + Chao-Hsiung Liao [zh_HK, zh_TW], Shankar Prasad [kn], Yaron Shahrabani [he], + Andika Triwidada [id] + +3.11.4 +====== +* Fix removal of workspacaes that are not at the end [Giovanni; #721417] +* Allow session mode to be specified in the environment [Ray; #720894] +* Special-case launching of terminals [Debarshi; #695010] +* Always show arrow if app switcher is scrollable [Jonh; #711467] +* Implement new app folders system [Jasper; #722117] +* Remove arrow from background menu [Tarun; #699608] +* Misc bug fixes and cleanups [Giovanni, Andika, Florian, Ray; #721039, + #721439, #721507, #721629, #721868, #722210] + +Contributors: + Giovanni Campagna, Piotr Drąg, Tarun Kumar Joshi, Florian Müllner, + Debarshi Ray, Jasper St. Pierre, Ray Strode, Andika Triwidada, Jonh Wendell + +Translations: + Dušan Kazik [sk], Tong Hui [zh_CN], Benjamin Steinwender [de], + Matej Urbančič [sl], Jorge Pérez Pérez [an], Kjartan Maraas [nb], + Milo Casagrande [it], Rafael Ferreira [pt_BR], Marek Černocký [cs], + Daniel Mustieles [es], Adorilson Bezerra [pt_BR], Christian Kirbach [de], + Aurimas Černius [lt], Andika Triwidada [id], Baurzhan Muftakhidinov [kk], + Victor Ibragimov [tg], Yosef Or Boczko [he], Dimitris Spingos [el], + Fran Diéguez [gl] + +3.11.3 +====== +* Fix fade effect of desktop icons [Florian; #707671] +* Fix issues with background management code [Jasper; #709313] +* Use new Glib facilities for application search [Jasper; #711631] +* Add focus indication to session menu button [Sebastien; #710539] +* Fix hover tracking for StEntries [Jasper; #706749] +* Fix reentrancy issue in message tray [Jasper; #711694] +* Tone down zoom animation on login/unlock [Jasper; #712362] +* Allow specifying monitor for OSD [Carlos; #712664] +* Fix resetting prompt on user switch [Ray; #710456] +* Stop using gnome-bluetooth-applet [Bastien; #719341] +* Add support for EAP-FAST password requests [Dan; #719813] +* Fix entry focus of chat notifications [Jasper; #709853] +* Make window previews keyboard navigatable [Jasper; #644306] +* Fix app switcher order with dialog windows [Florian; #719824] +* Allow remote search providers without icons [Debarshi; #719965] +* Fix various alignment issues in RTL locales [Yosef; #712638, #712596, + #712594, #712600, #712579] +* Misc. bug fixes and cleanups [Jasper, Florian, Giovanni, Dan; #712727, + #712753, #719378, #719730, #719803, #710115, #720017, #719815, #719567, + #720298] + +Contributors: + Giovanni Campagna, Carlos Garnacho, Sebastien Lafargue, Tim Lunn, + Florian Müllner, Bastien Nocera, Yosef Or Boczko, Debarshi Ray, + Jasper St. Pierre, Ray Strode, Dan Williams + +Translations: + Kjartan Maraas [nb], Reinout van Schouwen [nl], Rafael Ferreira [pt_BR], + Mattias Põldaru [et], Emin Tufan Çetin [tr], Jiri Grönroos [fi], + Khaled Hosny [ar], Fran Diéguez [gl], Victor Ibragimov [tg], + Daniel Mustieles [es] + +3.11.2 +====== +* Cache search result display actors [Jasper; #704912] +* Use username in userWidget if real name doesn't fit [Jasper; #706851] +* Support shell_global_reexec_self() on OpenBSD [Antoine; #709571] +* Support disabling browser plugin [Colin; #711218] +* Restore support for 'disable-restart-buttons' [Florian; #711244] +* Validate parameters of exposed DBus methods [Florian; #699752] +* Connect applications to systemd journal if available [Colin; #711626] +* Misc bug fixes and cleanups [Florian, Jasper; #711205, #698486, #711416, + #644306, #711555, #709806, #711631, #711732] + +Contributors: + Cosimo Cecchi, Antoine Jacoutot, Florian Müllner, Jasper St. Pierre, + Rico Tzschichholz, Colin Walters + +Translations: + Yuri Myasoedov [ru], Kjartan Maraas [nb], Efstathios Iosifidis [el], + Benjamin Steinwender [de], eternalhui [zh_CN], Shantha kumar [ta] + +3.11.1 +====== +* power: Use UPower directly instead of gnome-settings-daemon [Bastien; #710273] +* Implement support for new GTK+ notification API [Jasper, Giovanni, Florian; + #710137, #710596] +* gdm: Don't allow user-list to fill up the entire screen [Florian; #710555] +* Don't autostart remote search providers at login [Giovanni; #708830] +* Fix spacing in end-session dialog [Sebastien; #710543] +* Prepare for js24 [Tim; #711052] +* Misc bug fixes and cleanups [Jasper, Florian, Adel, Tim, Sebastien; #710347, + #710144, #710541, #691409, #710745, #688331, #704912] + +Contributors: + Giovanni Campagna, Adel Gadllah, Sebastien Lafargue, Tim Lunn, + Florian Müllner, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz + +Translations: + Stas Solovey [ru], Yosef Or Boczko [he], Rafael Ferreira [pt_BR] + +3.10.1 +====== +* Make sure lock screen is drawn once before switching user [Giovanni; #708051] +* Fix signal strength indicators in network selector [Jasper; #708442] +* Scroll search results when focusing provider icons [Jasper; #708868] +* Add separate hover/active states to page indicators [Carlos; #708852] +* Tweak appearance of user name and avatar [Yash; #702309] +* Hide "Turn On" in network menu when disabled by hardware [Giovanni; #709635] +* Cancel open keyring prompts when the screen is locked [Florian; #708910] +* Differentiate "Not Connected" and "Off" in network menu [Giovanni; #709043] +* Make network settings items point to the right device [Giovanni; #709246] +* Remove animation of window preview titles [Sebastien; #709392] +* Add 'Notifications' switch to tray menu [Florian; #707073] +* Make dropdown arrows consistent [Carlos; #709564] +* power: Use icon from primary device for status [Jasper; #709925] +* Fix XDND drags to overview [Adel; #708887] +* Fix workspace switcher disappearing with too many workspaces [Jasper; #694881] +* Handle search results with 'special:' prefix specially [Giovanni; #707055] +* gdm: Support pre-authenticated logins from oVirt [Vinzenz; #702162] +* Use ARROW role for labels representing arrows [Alejandro; #710120] +* Make selected view in app picker persistent [Florian; #710042] +* Make network selector navigable by keyboard [Alejandro; #710144] +* Misc bug fixes [Florian, Adel, Jasper, Aleksander, Giovanni, Dan, Michael, + Tim; #709034, #709263, #698486, #709286, #709248, #709543, #696564, #703265, + #709638, #709866, #709998, #710019, #710104, #710115] + +Contributors: + Giovanni Campagna, Michael Catanzaro, Vinzenz Feenstra, Adel Gadllah, + Yash Girdhar, Sebastien Lafargue, Tim Lunn, Aleksander Morgado, + Florian Müllner, Alejandro Piñeiro, Carlos Soriano, Jasper St. Pierre, + Dieter Verfaillie, Dan Winship + +Translations: + Inaki Larranaga Murgoitio [eu], Christian Kirbach [de], Muhammet Kara [tr], + Aurimas Černius [lt], Ryan Lortie [eo], Rūdolfs Mazurs [lv], + Dušan Kazik [sk], Fran Diéguez [gl], Enrico Nicoletto [pt_BR], + Kjartan Maraas [nb], Victor Ibragimov [tg], Matej Urbančič [sl], + A S Alam [pa], Nilamdyuti Goswami [as], Daniel Mustieles [es], + Cheng-Chia Tseng [zh_HK, zh_TW], Mattias Põldaru [et], Kenneth Nielsen [da], + Milo Casagrande [it], Marek Černocký [cs], Ihar Hrachyshka [be], + Мирослав Николић [sr, sr@latin], Arash Mousavi [fa], Yuri Myasoedov [ru], + Gil Forcada [ca], Carles Ferrando [ca@valencia], Andika Triwidada [id], + Timo Jyrinki [fi], Piotr Drąg [pl], Rafael Ferreira [pt_BR], + Gabor Kelemen [hu], Yosef Or Boczko [he], Daniel Korostil [uk], + Wouter Bolsterlee [nl], António Lima [pt] + +3.10.0.1 +========= +* Fix login screen [Ray; #708691] + +Contributors: + Ray Strode, Giovanni Campagna, Jasper St. Pierree + +Translations: + Kjartan Maraas [nb], Marek Černocký [cs], A S Alam [pa], Daniel Mustieles [es], + Ihar Hrachyshka [be], Chao-Hsiung Liao [zh_HK], Nilamdyuti Goswami [as], + Yuri Myasoedov [ru], Baurzhan Muftakhidinov [kk] + +3.10.0 +====== +* Fix fade effect in ScrollViews [Carlos; #708256] +* network: Resync when activating connection changes [Jasper; #708322] +* Close run dialog when the screen locks [Florian; #708218] +* Fix entry growing out of password dialogs [Florian; #708324, #703833] +* Vertically center labels in submenu items [Jasper; #708330] +* https://bugzilla.gnome.org/show_bug.cgi?id=708387 [Mike; #708387] +* Fix bluetooth icon not being added to status menu [Jasper; #708541] +* Fix GNOME 2 keyring dialogs appearing on lock screen [Florian; #708187] +* Fix passwords being cleared twice when authentication fails [Florian; #708186] +* Fix message tray appearing in a11y popup on login screen [Florian; #708380] +* Increase width of aggregate menu popup [Adel; #708472] + +Contributors: + Adel Gadllah, Mike Gorse, Ryan Lortie, Florian Müllner, Frédéric Péters, + Carlos Soriano, Jasper St. Pierre, Rico Tzschichholz + +Translations: + Daniel Șerbănescu [ro], Ryan Lortie [eo], Ihar Hrachyshka [be], + A S Alam [pa], Jiro Matsuzawa [ja], Chao-Hsiung Liao [zh_HK, zh_TW], + Piotr Drąg [pl], Kristjan SCHMIDT [eo], Daniel Korostil [uk], + Rūdolfs Mazurs [lv], Reinout van Schouwen [nl], Yosef Or Boczko [he], + Fran Diéguez [gl], António Lima [pt], Andika Triwidada [id], + Alexandre Franke [fr], Rafael Ferreira [pt_BR], Milo Casagrande [it], + Kenneth Nielsen [da], Matej Urbančič [sl] + +3.9.92 +====== +* Don't show page indicators if there's only one page [Florian; #707363] +* Make :active style of app and non-app results consistent [Jakub; #704714] +* Fade app pages when scrolled [Florian; #707409] +* Don't block scrolling on page indicators [Carlos; #707609] +* Tweak visual appearance of folder views [Florian; #707662] +* Don't put minimized apps at the end of the app switcher [Florian; #707663] +* Merge the wayland branch [Giovanni, Neil; #707467] +* Make search entry behave better in RTL locales [Matthias, Florian; #705779] +* Allow to change app pages with pageUp/pageDown keys [Carlos; #707979] +* Set approriate a11y states on expandable menu items [Alejandro; #708038] +* Improve page indicator animation [Carlos; #707565] +* Misc bug fixes and cleanups [Florian, Olivier, Jasper, Giovanni, Magdalen, + Adel, Carlos, Rico, Joanmarie; #707308, #707430, #707508, #707557, #707600, + #707614, #707666, #707814, #707806, #707801, #707889, #707892, #707935, + #707842, #707940, #707996, #708007, #708009, #708020, #707580, #708080] + +Contributors: + Magdalen Berns, Olivier Blin, Giovanni Campagna, Matthias Clasen, + Joanmarie Diggs, Adel Gadllah, Florian Müllner, Alejandro Piñeiro, + Neil Roberts, Carlos Soriano, Jasper St. Pierre, Jakub Steiner, + Rico Tzschichholz + +Translations: + Rafael Ferreira [pt_BR], Fran Diéguez [gl], Daniel Mustieles [es], + Aurimas Černius [lt], Luca Ferretti [it], Piotr Drąg [pl], + Chao-Hsiung Liao [zh_HK, zh_TW], Timo Jyrinki [fi], Daniel Korostil [uk], + Dušan Kazik [sk], Adam Matoušek [cs], Marek Černocký [cs], + Jiro Matsuzawa [ja], Yuri Myasoedov [ru], Tobias Endrigkeit [de], + Kjartan Maraas [nb], Victor Ibragimov [tg], Мирослав Николић [sr, sr@latin], + A S Alam [pa], Khaled Hosny [ar], Andika Triwidada [id], + Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Rūdolfs Mazurs [lv], + Mattias Põldaru [et], Gabor Kelemen [hu], Bruce Cowan [en_GB], + Matej Urbančič [sl], Enrico Nicoletto [pt_BR], Benjamin Steinwender [de], + Changwoo Ryu [ko], Kris Thomsen [da], Alexandre Franke [fr], + Evgeny Bobkin [ru], Baurzhan Muftakhidinov [kk], Peter Mráz [sk], + Inaki Larranaga Murgoitio [eu], Yosef Or Boczko [he] + +3.9.91 +====== +* Improve submenu styling [Jakub; #706037] +* Fix changing slider values via keyboard [Alejandro; #706386] +* Fix accessibility of sliders [Alejandro; #706391] +* Tweak system actions style [Jakub; #706638] +* Add support for auth without username / fix Not Listed? [Ray; #706607] +* Dash: Don't show tooltips for apps with open popups [Giovanni; #705611] +* Implement new end-session/power-off dialog design [Jasper, Matthias; #706612] +* Implement building separate binaries for x11 and wayland [Giovanni; #705497] +* authPrompt: Fix controls moving when showing messages [Ray; #706670] +* Tweak padding between system status icons [Allan; #706796] +* Add a generic accessible usable by JS code [Alejandro; #648623] +* Improve keynav and accessibility of the calendar [Alejandro; #706903] +* Update to new NetworkManager APIs [Jasper; #706098] +* Hide system actions section in the lock screen [Jasper; #706852] +* Don't show other logged in users at log out [Giovanni; #707124] +* Remove "Session" subtitle heading in login dialog [Jasper; #707072] +* dash: Reload favorites when installed apps change [Giovanni; #706878] +* Don't open overview after closing last window on workspace [Florian; #662581] +* Add FocusApp DBus method [Giovanni; #654086] +* Add ShowApplications DBus method [Giovanni; #698743] +* Implement new app picker design [Carlos, Florian; #706081] +* Improve frequent apps being empty by default [Carlos, Florian; #694710] +* Extend clickable area of page indicators [Giovanni; #707314] + +* Misc bug fixes [Ray, Giovanni, Jasper, Emmanuele; #706542, #706654, #706005, + #706681, #706841, #706843, #707064, #706262, #707197, #707269] + +Contributors: + Emmanuele Bassi, Giovanni Campagna, Matthias Clasen, Allan Day, Adel Gadllah, + Florian Müllner, Alejandro Piñeiro, Carlos Soriano, Jasper St. Pierre, + Jakub Steiner, Ray Strode, Seán de Búrca + +Translations: + Piotr Drąg [pl], Kjartan Maraas [nb], Victor Ibragimov [tg], + Enrico Nicoletto [pt_BR], Benjamin Steinwender [de], + Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], Seán de Búrca [ga], + Fran Diéguez [gl], Daniel Mustieles [es], Dušan Kazik [sk], + Matej Urbančič [sl], Andika Triwidada [id], Jordi Mas [ca], + Ihar Hrachyshka [be] + +3.9.90 +====== +* workspaceThumbnails: Exclude transient windows when shifting workspaces + [Bradley; #705174] +* Never show a horizontal scrollbar on lock screen [Jasper; #704327] +* authPrompt: Fix disable-user-list / Not Listed? [Ray; #705370] +* Animate the lock screen notification transitions [Giovanni; #687660] +* Wake up the screen when new notifications appear [Giovanni; #703084] +* Use StartupWMClass for application matching [Giovanni; #673657, #705801] +* dateMenu: Add style class for the clock label [Jonh; #705634] +* keyboard: Translate IBus IME name if possible [Daiki; #695673] +* power: Display single digit minutes correctly [Sebastian; #705803] +* Implement new aggregate status menu [Jasper; #705845] +* Improve triangle animation when expanding sub-menus [Tarun; #703109] +* Fix alignment of search provider icons [Tarun; #695760] +* Slide dash and workspace switcher on overview transitions [Tarun; #694262] +* Respect always-show-universal-access-status setting [Tanner; #705733] +* Handle .desktop files with capital letters [Giovanni; #706252] +* authPrompt: Add smartcard support [Ray; #683437] +* Fix call notifications in busy mode [Emilio; #666221] +* Improve triangle animation when expanding sub-menus [Tarun; #703109] +* Move message tray menu to a tray button [Jasper; #699272] +* Wi-fi dialog improvements [Jasper, Allan; #705916, #706136] +* Work towards running as wayland compositor [Giovanni] + - Switch to Mutter abstraction layer for cursor tracking [#705911] + - Add confirmation dialog for display changes [#706208] +* Use a different background in screen shield [Giovanni; #688210] +* Add fade animation before blanking the screen [Giovanni; #699112] +* Misc. bugfixes and cleanups [Jasper, Giovanni, Adel, Colin, Ray, Florian, + Magdalen; #704448, #702536, #686855, #695581, #700901, #701761, #701495, + #701848, #697833, #701731, #705664, #705840, #705898, #706089, #706153, + #704646, #706262, #706324, #703810, #703811, #704015, #706232, #705917, + #706536] + +Contributors: + Magdalen Berns, Giovanni Campagna, Allan Day, Tanner Doshier, Adel Gadllah, + Sebastian Keller, Tarun Kumar Joshi, Florian Müllner, Bradley Pankow, + Emilio Pozuelo Monfort, Jasper St. Pierre, Ray Strode, Rico Tzschichholz, + Daiki Ueno, Colin Walters, Jonh Wendell + +Translations: + Kjartan Maraas [nb], Aurimas Černius [lt], Yaron Shahrabani [he], + Fran Diéguez [gl], Gabor Kelemen [hu], + Juan Diego Martins da Costa Cruz [pt_BR], Inaki Larranaga Murgoitio [eu], + Yuri Myasoedov [ru], Daniel Mustieles [es], Seán de Búrca [ga], + Khaled Hosny [ar], Victor Ibragimov [tg], Friedel Wolff [af], + Marek Černocký [cs], Matej Urbančič [sl], A S Alam [pa], + Rafael Ferreira [pt_BR], Andika Triwidada [id], Dušan Kazik [sk] + +3.9.5 +===== +* Fix width changes of the calendar popup [Florian; #704200] +* Work towards aggregate status menu [Jasper; #702539, #704336, #704368, + #704670] +* Update design of lock screen notifications [Allan; #702305] +* Don't show empty backgroundMenu [Michael; #703868] +* Add option to limit app switcher to current workspace [Adel; #703538] +* Consolidate design of login screen and unlock dialog [Ray; #702308, #704795] +* Respect hasWorkspace property of session mode [Jasper; #698593] +* Fix fade of app menu icon in RTL locales [Jasper; #704583] +* Destroy notifications when the close button is clicked [Adel; #687016] +* Fix clicks on legacy tray icons in the message tray [Florian; #704095] +* authPrompt: Fade out message if users start to type [Ray; #704817] +* Export timestamps of global shortcuts on DBus [Bastien; #704859] +* Fix duplicate search provider results [Jasper; #700283] +* Misc bug fixes and cleanups [Lionel, Florian, Emilio, Ray, Jasper; #703859, + #703540, #704077, #703997, #704318, #704347, #704265, #704411, #704430, + #704347, #704453, #704471, #704542, #704707, #703905, #705037] + +Contributors: + Allan Day, Adel Gadllah, Lionel Landwerlin, Florian Müllner, Bastien Nocera, + Emilio Pozuelo Monfort, Jasper St. Pierre, Ray Strode, Colin Walters, + Michael Wood + +Translations: + eternalhui [zh_CN], Victor Ibragimov [tg], Dušan Kazik [sk], + Jiro Matsuzawa [ja], Kjartan Maraas [nb], Milo Casagrande [it], + Marek Černocký [cs], Daniel Mustieles [es], Benjamin Steinwender [de] + +3.9.4 +===== +* Fix chat entries not being focused when expanded [Jasper; #698778] +* Fix alignment of "Not Listed?" label [Mathieu; #702307] +* Fix alignment of time stamps in chat notifications [Carlos; #687809] +* Round the ends of slider trough [Jasper; #702825] +* Add support for "box-shadow: none" [Cosimo; #702782] +* Keep chrome below popup windows [Florian; #702338] +* Move the session list to a popup menu [Ray; #702818] +* Fix autorun notifications for "non-native" volumes [Matthias; #703418] +* dnd: Speed up by not picking on each motion event [Jasper; #703443] +* Fix management of asynchronous background loading [Lionel; #703001] +* Rework focus handling [Jasper; #700735] +* Optimize box-shadow rendering [Lionel; #689858] +* Remove support for fixed positioning in BoxLayouts [Florian; #703808] +* Misc bug fixes and cleanups [Adel, Jasper, Florian, Ray, Lionel, Emilio; + #702849, #610279, #703132, #703105, #703160, #703126, #703304, #703403, + #698593, #703442, #703565, #700901, #703874, #703807, #703893, #703909] + +Contributors: + Mathieu Bridon, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, + Fran Diéguez, Adel Gadllah, Lionel Landwerlin, Florian Müllner, + Emilio Pozuelo Monfort, Carlos Soriano, Jasper St. Pierre, Ray Strode + +Translations: + Baurzhan Muftakhidinov [kk], Marek Černocký [cs], Daniel Mustieles [es], + Fran Diéguez [gl], Kjartan Maraas [nb], Andika Triwidada [id], + Benjamin Steinwender [de], Nguyễn Thái Ngọc Duy [vi], Trần Ngọc Quân [vi] + +3.9.3 +===== +* Don't push window thumbs when workspace switcher is hidden [Jasper; #701167] +* Tweak timeout for activating windows during XDND [Adel; #700150] +* Fix ellipsization in control buttons in app picker [Carlos; #696307] +* Fix DND to empty dash [Florian; #684618] +* Fix OSD window appearing below system modal dialogs [Rui; #701269] +* Clear clipboard on screen lock to prevent information leak [Florian; #698922] +* Allow session mode specific overrides schema [Florian; #701717] +* window-switcher: Only show windows from current workspace by default + [Florian; #701214] +* logout dialog: Show the correct text right away [Matthias; #702056] +* bluetooth: Port to bluez 5 [Emilio; #700891] +* dateMenu: Allow events to span multiple lines [Giovanni; #701231] +* gdm: Clear message queue when no more messages are pending [Jonh; #702458] +* Misc bug fixes and cleanups [Jasper, Florian, Adel, Giovanni; #693836, + #700972, #701386, #700877, #701755, #698918, #701224, #702125, #701954, + #701849, #702121] + +Contributors: + Giovanni Campagna, Matthias Clasen, Fran Diéguez, Adel Gadllah, Rui Matos, + Florian Müllner, Emilio Pozuelo Monfort, Carlos Soriano, Jasper St. Pierre, + Jonh Wendell + +Translations: + Marek Černocký [cs], Victor Ibragimov [tg], Fran Diéguez [gl], + Benjamin Steinwender [de], Cheng-Chia Tseng [zh_HK, zh_TW], + eternalhui [zh_CN], Ivaylo Valkov [bg], Kjartan Maraas [nb], + Daniel Mustieles [es] + +3.9.2 +===== +* Use a symbolic icon for DESKTOP windows [Matthias; #697914] +* Move paint state cache into StWidget [Jasper; #697274] +* gdm: Fix regression where domain login hint not shown [Stef; #698200] +* Make calendar keyboard navigable [Tanner; #667434] +* Hide "Open Calendar" item when no calendar app is installed [Lionel; #697725] +* Update how branding appears on login screen [Florian; #694912, #699877] +* Allow OSD popups to grow if necessary [Marta; #696523] +* Fix offset of shadow offscreen rendering [Lionel; #698301] +* Fix insensitive button preventing empty keyring password [Stef; #696304] +* Allow cancelling keyring dialog between prompts [Stef; #682830] +* modalDialog: Show spinner while working [Stef; #684438] +* overview: Only show close buttons for windows that may close [Jasper; #699269] +* Add input purpose and hints to StEntry and StIMText [Daiki; #691392] +* Set input-purpose property for password entries [Rui; #700043] +* Provide a DBus API for screencasting [Florian; #696247] +* overview: Disable hotcorner during DND [Jasper; #698484] +* polkitAgent: Allow retrying after mistyped passwords [Stef; #684431] +* Add a way to get backtraces from criticals and warnings [Giovanni; #700262] +* Allow switch-to-workspace-n keybindings in overview [Florian; #649977] +* Update man page [Matthias; #700339] +* Add FocusSearch DBus method [Florian; #700536] +* Hide frequent view when app monitoring is disabled [Florian; #699714] +* Show switcher popup for switch-to-workspace-n keybindings [Elad; #659288] +* gdm: Update the session chooser style [Allan; #695742] +* Fix some app folders getting truncated at the top [Florian; #694371] +* Don't block the message tray while a notification is showing [Jasper; #700639] +* popupMenu: Allow for an optional border for slider handle [Florian; #697917] +* Re-lock screen when restarted after a crash [Colin; #691987] +* Synchronize input source switching with key events [Rui; #697007] +* Switch input source on modifiers-only accelerator [Rui; #697008] +* Allow input source switching in message tray [Rui; #697009] +* Misc bug fixes and cleanups [Alban, Jasper, Giovanni, Florian, Rui, Tomeu, + Stef, Gustavo; #698863, #699799, #699800, #676285, #699975, #700097, #698812, + #698486, #700194, #695314, #700257, #699678, #700356, #700322, #700394, + #700409, #700595, #700625, #691746, #700620, #700807, #659288, #700784, + #700842, #700847, #700488, #700735, #696159, #700900, #700853, #700923, + #700944, #697661, #700854, #700190, #699189, #701097] + +Contributors: + Elad Alfassa, Alban Browaeys, Giovanni Campagna, Matthias Clasen, Allan Day, + Tanner Doshier, Lionel Landwerlin, Rui Matos, Simon McVittie, + Marta Milakovic, Florian Müllner, Gustavo Padovan, Jasper St. Pierre, + Daiki Ueno, Tomeu Vizoso, Stef Walter, Colin Walters + +Translations: + Matej Urbančič [sl], Kjartan Maraas [nb], Victor Ibragimov [tg], + Dušan Kazik [sk], Gil Forcada [ca], Daniel Mustieles [es] + +3.9.1 +===== +* Add additional toggle-overview keybinding [Matthias; #698251] +* Disable shortcut when sticky keys are enabled [Matthias; #685974] +* Disable tray context menu while a notification displays [Jasper; #695800] +* Watch GApplication busy state [Cosimo; #697207] +* Disable style transitions if animations are disabled [Jasper; #698391] +* Filter out hidden applications from "Frequent" view [Giovanni; #696949] +* Fix window previews swapping place randomly [Jasper; #694469, #698776] +* Add support for serialized GIcons in remote search providers [Cosimo; #698761] +* Fix hotcorner regression in RTL locales [Jasper; #698884] +* Allow some keybindings to work while a top bar menu is open [Florian; #698938] +* Make open-app-menu keybinding a toggle action [Florian; #686756] +* Only recognize common URL schemes in notification messages [Monica; #661225] +* Misc fixes and cleanups [Tim, Jasper, Florian, Giovanni, Owen; #698531, + #698622, #698427, #698483, #698513, #697203, #698959, #698918, #699029, + #699075, #696720, #649748] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Monica Chelliah, Matthias Clasen, Tim Lunn, + Florian Müllner, Jasper St. Pierre, Michael Wood, Owen W. Taylor + +Translations: + Fran Diéguez [gl], Muhammet Kara [tr], Daniel Mustieles [es], + Gil Forcada [ia], Anish A [ml], Dimitris Spingos [el], Marek Černocký [cs], + Žygimantas Beručka [lt] + +3.8.1 +===== +* Clip window group during startup animation [Jasper; #696323] +* Check for logind rather than systemd [Martin; #696252] +* Don't special-case last remote search provider position [Giovanni; #694974] +* Fix memory leaks [Ray, Jasper; ##697119, #697295, #697300, #697395] +* AppSwitcherPopup: Activate only the selected window if any [Rui; #697480] +* Enable screen recorder keybinding in all modes [Florian; #696200] +* Remove box-shadow from screen shield for performance reasons [Adel; #697274] +* Add support for -st-natural-width/height CSS properties [Giovanni; #664411] +* Remove excessive padding from notification buttons [Allan; #664411] +* Fix thumbnail dragging in overview [Jasper; #697504] +* theme-node: Add get_url()/lookup_url() methods [Florian; #693688] +* Misc bug fixes and cleanups [Jasper, Rui, Colin, David, Ray, Matthias: + #695859, #696259, #696585, #696436, #697432, #697435, #697560, #697722, + #697709] + +Contributors: + Giovanni Campagna, Matthias Clasen, Allan Day, Adel Gadllah, David Gumberg, + Rui Matos, Florian Müllner, Martin Pitt, Jasper St. Pierre, Ray Strode, + Colin Walters + +Translations: + Daniel Martinez [an], Bruce Cowan [en_GB], Khaled Hosny [ar], + Ihar Hrachyshka [be], Aron Xu [zh_CN], Wojciech Szczęsny [pl], + Inaki Larranaga Murgoitio [eu], Kjartan Maraas [nb], + Милош Поповић [sr, sr@latin], Trần Ngọc Quân [vi] + +3.8.0.1 +======= +* Background bug fixes [Ray; #696712] + +3.8.0 +===== +* Remove blur and desaturation from lock screen [Jasper; #696322] +* Remove scroll view fade near edges [Adel; #696404] +* dateMenu: Open calendar component when using Evolution [Florian; #696432] +* Fix unlocking on fast user switch [Cosimo; #696287] +* Tweak screen shield animation [Rui; #696380] +* Fix major memory leak when changing backgrounds [Ray; #696157] +* Miscellaneous bug fixes [Jasper, Adel, Florian; #696199, #696212, #696422, + #696447, #696235] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner, + Jasper St. Pierre, Ray Strode + +Translations: + Alexandre Franke [fr], Victor Ibragimov [tg], Arash Mousavi [fa], + Gabor Kelemen [hu], Sandeep Sheshrao Shedmake [mr], ManojKumar Giri [or], + Shantha kumar [ta], Rajesh Ranjan [hi], Stas Solovey [ru], + Shankar Prasad [kn], Dušan Kazik [sk], Ihar Hrachyshka [be], + Wouter Bolsterlee [nl], Kris Thomsen [da], Jiro Matsuzawa [ja], + Daniel Korostil [uk], Ani Peter [ml], Krishnababu Krothapalli [te], + Mantas Kriaučiūnas [lt], Praveen Illa [te] + +3.7.92 +====== +* Drop fallback lock implementation [Florian; #693403] +* Don't let the user trigger message-tray when in fullscreen [Jasper; #694997] +* Scroll search results when using keynav [Jasper; #689681] +* Allow raising the shield by starting to type the password [Jasper; #686740] +* Improve tracking of fullscreen windows [Owen; #649748] +* Improve animation of new windows in overview [Giovanni; #695582] +* workspace switcher: Animate new workspaces created by DND [Giovanni; #685285] +* Give user time to read messages on login screen [Ray; #694688] +* Misc bug fixes and cleanups [Jasper, Ray, Florian, Cosimo, Giovanni, Adel, + Stef, Takao, Rui, Neil; #695154, #694993, #695272, #691578, #694321, #695338, + #695409, #695458, #695526, #695601, #695471, #695324, #695650, #695656, + #695659, #695485, #695395, #694951, #695824, #695841, #695801, #694321, + #693708, #695800, #695607, #695882, #691578, #685851, #694371, #690857, + #694092, #695747, #696007, #693438, #696064, #696102 + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Allan Day, Takao Fujiwara, Adel Gadllah, + Tim Lunn, Rui Matos, Florian Müllner, Neil Roberts, Jasper St. Pierre, + Ray Strode, Stef Walter, Colin Walters, Owen W. Taylor + +Translations: + Nilamdyuti Goswami [as], Chao-Hsiung Liao [zh_HK, zh_TW], + Yuri Myasoedov [ru], Gheyret Kenji [ug], Baurzhan Muftakhidinov [kk], + Ville-Pekka Vainio [fi], Matej Urbančič [sl], + Мирослав Николић [sr, sr@latin], Rūdolfs Mazurs [lv], Christian Kirbach [de], + Andika Triwidada [id], Gil Forcada [ca], Mattias Põldaru [et], + Duarte Loreto [pt], Adam Matoušek [cs], Changwoo Ryu [ko], + Ihar Hrachyshka [be], Carles Ferrando [ca@valencia], Sweta Kothari [gu] + +3.7.91 +====== +* overview: Fade out controls during DND that are not targets [Cosimo; #686984] +* overview: Keep open when a Control key is held [Florian; #686984] +* Improve login screen => session transition [Ray; #694321] +* Center application grid horizontally [Florian; #694261] +* Fix hiding panel when fullscreen windows span multiple monitors [Adel; 646861] +* Tweak thresholds of pressure barrier [Jasper; #694467] +* Tweak window picker layout [Jasper; #694902] +* Expose key grab DBus API to gnome-settings-daemon [Florian; #643111] +* Don't always show message tray in overview, add message indicator + [Cosimo; #687787] +* Tweak startup animation [Ray; #694326] +* Add OSD popups and expose them to gnome-settings-daemon [Florian; #613543] +* Move loupe icon to the start of the search entry [Jasper; #695069] +* Don't show the input switcher with less than 2 items [Rui; 695000] +* Fix auto-completion of system modals immediately upon display [Stef; #692937] +* Ignore workspaces in alt-tab [Florian; #661156] +* Disable copying text from password entries [Florian; #695104] +* Use standard styling for ibus candidate popups [Allan; #694796] +* Fix calendar changing height on month changes [Giovanni; #641383] +* Port the hot corner to use pressure barriers [Jasper; #663661] +* Misc bug fixes and cleanups: [Hashem, Giovanni, Alban, Jasper, Cosimo, + Florian, Adel, Daniel, Matthias, Ray, Rui, Guillaume, Stef; #685849, #690643, + #694292, #693814, #694234, #694365, #694287, #694336, #694256, #694261, + #663601, #694441, #694284, #694463, #694475, #687248, #694394, #694320, + #694701, #694784, #694858, #694906, #694327, #694876, #694905, #694969, + #694970, #694988, #695006, #695001, #694998, #695023, #695002, #695073, + #695126, #687748, #694837, #693907, #679851, #694988] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Alban Crequy, Allan Day, + Guillaume Desmottes, Adel Gadllah, Rui Matos, Daniel Mustieles, + Hashem Nasarat, Jasper St. Pierre, Ray Strode, Stef Walter + +Translations: + Yuri Myasoedov [ru], Adam Matoušek [cs], Piotr Drąg [pl], Matej Urbančič [sl], + Sweta Kothari [gu], Kjartan Maraas [nb], Nguyễn Thái Ngọc Duy [vi], + Chao-Hsiung Liao [zh_HK, zh_TW], Dimitris Spingos [el], + Inaki Larranaga Murgoitio [eu], Luca Ferretti [it], A S Alam [pa], + Gheyret Kenji [ug], Stas Solovey [ru], Enrico Nicoletto [pt_BR], + Fran Diéguez [gl], Daniel Mustieles [es], Aurimas Černius [lt] + +3.7.90 +====== +* Let GNOME Shell work on EGL and GLES2 [Neil; #693225, #693438, #693339] +* Implement middle-click paste [Jasper; #645019] +* Fix top bar transition between session modes [Rui; #692966] +* Trigger the message tray with downward pressure [Jasper; #677215] +* Don't ask for a password on shutdown [Adel; #693385] +* Add a context menu to the message tray [Adel; #691035, #693887] +* Use unicode formatting in the date menu [Matthias; #689251] +* Use proper ellipsis instead of three dots [Jeremy; #689542] +* Tweak screen shield animation [Giovanni; #691964] +* Always hide the OSK when showing the message tray [Florian; #662687] +* Support sound in notifications [Giovanni; #642831] +* Place application popup menus above chrome [Jasper; #633620] +* Hide overview elements while searching [Cosimo; #682050] +* Implement updated IBus candidate popup designs [Rui; #691902] +* Add support for enable-animations preference [Cosimo; #655746] +* Don't always show the message tray in the overview [Cosimo; #693987] +* Improve arrangement of window previews [Adel; #690313] +* Remove builtin settings provider [Giovanni; #690824] +* Minimize fullscreen windows when they end up in the background [Adel; #693991] +* Add context menu to the background actor [Jasper; #681540] +* Handle backgrounds in the shell, improve startup animation [Ray; #682429] +* Hide universal access menu when not needed [Giovanni; #681528] +* Implement updated app picker designs [Florian; #694192] +* Improve login manager -> session transition [Ray; #694062] +* Don't use a grid layout in window picker [Adel; #694210] +* Use scroll wheel for workspace switching rather than zoom [Florian; #686639] +* Misc bug fixes and cleanups: [Jasper, Florian, Debarshi, Adel, Matthias, + Giovanni, Daiki, Rico, Bastien, Cosimo, Ray, Allan, Antonio; #693284, + #692680, #691746, #693303, #693162, #693161, #693522, #693385, #691715, + #688915, #689106, #682429, #693570, #693737, #693458, #692845, 693836, + #681540, #679925, #688227, #692773, #693909, #683288, #693854, #693746, + #693931, #693924, #693940, #693970, #693935, #693937, #693974, #693936, + #693975, #693822, #694030, #685849, #694052, #694035, #694038, #694079, + #694064, #681735, #694100, #694057, #694070, #693572, #693896, #686984, + #694123, #694125, #693756, #693757, #687556, #694215, 694062, #694227, + #694240, #694234, #694264, 694276, 694282, #694241, #689394, #694202, + #694265, #694289, #691806, #694290, #694296] + +Contributors: + Jeremy Bicha, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Allan Day, + António Fernandes, Adel Gadllah, Rui Matos, Florian Müllner, Bastien Nocera, + Debarshi Ray, Neil Roberts, Jasper St. Pierre, Ray Strode, Rico Tzschichholz, + Daiki Ueno + +Translations: + Yasumichi Akahoshi [ja], Yoji TOYODA [ja], Dušan Kazik [sk], + Wouter Bolsterlee [nl], Matej Urbančič [sl], Gheyret Kenji [ug], + Ivaylo Valkov [bg], Daniel Korostil [uk], Gheyret Kenji [ug], + Daniel Mustieles [es], Anish A [ml], Gil Forcada [ca], + Carles Ferrando [ca@valencia], Мирослав Николић [sr, sr@latin], + Aurimas Černius [lt], Rafael Ferreira [pt_BR], Fran Diéguez [gl], + Piotr Drąg [pl], Luca Ferretti [it], A S Alam [pa] + +3.7.5 +===== +* MessageTray: pass keyboard events to tray icons [Giovanni; #687425] +* network: add support for virtual devices (vlan, bond, bridge) [Dan; #677144] +* gdm: Allow right-clicking buttons for left-handed users [Jasper; #688748] +* Make list search results span all available horizontal space [Tanner; #691967] +* Make Show-Applications button depress when held down [Hashem; #692319] +* Set a max width on search results [Cosimo; #692453] +* Reserve scrollbar allocation for automatic policy [Cosimo; #686881] +* Improve scaling algorithm for window thumbnails [Jasper; #686944] +* Fix launching settings panels after g-c-c changes [Jasper; #692483] +* Stop launching applications from empty searches [Hashem; #692391] +* Implement per-source notification filtering [Giovanni; #685926] +* ScreenShield: Omit ActiveChanged() signal at end of fade [Giovanni; #691964] +* ScreenShield: Lower the shield on idle before locking [Giovanni; #692560] +* Make previews of minimized windows translucent in overview [Florian; #692999] +* windowManager: Respect icon geometry when minimizing [Florian; #692997] +* ScreenShield: Only show lock icon when actually locked [Giovanni; #693007] +* general: Use & instead of 'and' for Settings panels [Jeremy; #689590] +* network: Add support for new ModemManager1 interface [Aleksander; #687359] +* network: Handle LTE-only modems as GSM ones [Aleksander; #688144] +* mobile-providers: Port to libnm-gtk [Aleksander; #688943] +* general: Consistently use Title Case in top bar [Jeremy; #689589] +* panel: Add :overview pseudo class while in overview [Florian; #693218] +* sessionMode: Add support for mode-specific styling [Florian; #693219] +* loginManager: Make suspend a NOP in the ConsoleKit patch [Florian; #693162] +* screenShield: Inhibit suspend until the screen is locked [Florian; #686482] +* Misc bug fixes and cleanups [Jasper, Giovanni, Rui, Cosimo, Florian, Stefano, + Adel, Yanko; #691745, #691731, #690171, #689091, #691976, #691963, #684279, + #692052, #692091, #642831, #692454, #692715, #692678, #692723, #692677, + #683986, #692693, #692749, #692948, #692995, #692996, #692994, #677215, + #692586, #693067, #693031, #693049, #643111, #693161, #693220] + +Contributors: + Jeremy Bicha, Giovanni Campagna, Cosimo Cecchi, Tanner Doshier, + Stefano Facchini, Adel Gadllah, Yanko Kaneti, Rui Matos, Aleksander Morgado, + Florian Müllner, Hashem Nasarat, Jasper St. Pierre, Dan Winship + +Translations: + Duarte Loreto [pt], Daniel Mustieles [es], Kjartan Maraas [nb], + Nilamdyuti Goswami [as], Мирослав Николић [sr,sr@latin], + Tobias Endrigkeit [de], Fabio Tomat [fur], Matej Urbančič [sl], A S Alam [pa], + Inaki Larranaga Murgoitio [eu], Piotr Drąg [pl], Wouter Bolsterlee [nl], + Gheyret Kenji [ug], Yaron Shahrabani [he], Chao-Hsiung Liao [zh_HK,zh_TW], + Milo Casagrande [it], Benjamin Steinwender [de] + +3.7.4.1 +======= +* userMenu: Use show-full-name-in-top-bar setting [Bastien; #689561] +* dateMenu: Add "Open Clocks" entry [Mathieu; #644390] +* screenshot: Immediately show the flash spot [Jasper; #691875] +* Misc. bug fixes [Rico, Jeremy] + +Contributors: + Jeremy Bicha, Mathieu Bridon, Bastien Nocera, Jasper St. Pierre, + Rico Tzschichholz + +Translations: + Ihar Hrachyshka [be] + +3.7.4 +===== +* Make menu separators crisp [Giovanni, Allan; #641745] +* power: Update for new D-Bus name [Bastien; #690506] +* Add smooth scrolling support [Jasper; #687573] +* Tweak notification layout [Allan; #688506] +* Ping the active window when using the app menu [Giovanni; #684340] +* Make password entries insensitive after submission [Jasper; #690594, #690895] +* Honor lock-delay GSettings key [Giovanni, Matthias; #690766, #691170] +* Use text/calendar preferred app as the calendar app [Giovanni; #690767] +* lookingGlass: Move to an inspect() function [Jasper; #690726] +* Make OSK animation quicker, snappier [Rui; #688642] +* Allow to close chat notifications with Escape [Jasper; #690897] +* Honor org.gnome.desktop.screensaver.user-switch-enabled [Giovanni; #691042] +* Add a SelectArea() DBus method [Cosimo; #687954] +* Support non-absolute paths when saving screenshots [Cosimo; #688004] +* OSK: Fix extended keys popups [Rui; #674955] +* Don't hide or show the keyboard immediately [Rui; #688646] +* Improve padding in power menu [Giovanni; #689297] +* Add per-window input source switching [Rui; #691414] +* Misc bug fixes and cleanups [Rico, Jasper, Giovanni, Rui, Florian, Dan; + #690608, #690589, #690539, #687081, #690667, #690665, #690666, #685856, + #690858, #690895, #680414, #690965, #691019, #690590, #681376, #690180, + #685513, #689263, #691553, #691720, #691743, #691750] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Allan Day, Rui Matos, + Florian Müllner, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz, + Dan Winship + +Translations: + Matej Urbančič [sl], Kjartan Maraas [nb], Mattias Põldaru [et], + Yaron Shahrabani [he], Aurimas Černius [lt], Khaled Hosny [ar], + Fran Diéguez [gl], Daniel Mustieles [es], Piotr Drąg [pl], Balázs Úr [hu], + Baurzhan Muftakhidinov [kk], Tobias Endrigkeit [de], Dušan Kazik [sk], + Aron Xu [zh_CN], Gheyret Kenji [ug] + +3.7.3 +===== +* Add 'No Messages' label when message tray is empty [Victoria; #686738] +* Use better icons in Ctrl-Alt-Tab popup [Stéphane; #641303] +* Show the OSK on the monitor where the focused window lives [Giovanni; #685856] +* Highlight window clone and caption when hovered [Giovanni, Marc; #665310] +* Improve login process indication [Stéphane; #687113] +* Omit empty categories in apps view [Stéphane; #687970] +* Style panel differently according to mode [Florian; #684573] +* Make it possible to hide the user name [Matthias; #688577] +* Consolidate and improve chat connection notifications [Giovanni; #687213] +* Improve notification scrollbar appearance [Carlos; #688393] +* Fade scroll view fade near scrolling edges [Jasper; #689249] +* Add a read-only org.gnome.Shell.Mode property [Debarshi; #689300] +* Don't close message tray after using context menus [Giovanni; #689296] +* Port swipe-scrolling to ClutterPanAction [Jasper, Florian; #689062, #689552] +* Remember state of 'Remember Password' checkbox [Ron; #688039] +* Improve timestamp format in chat notifications [Carlos; #680989] +* Improve style of missed-messages counter [Carlos; #686472] +* Omit connection failure notifications if cancelled by user [Giovanni; #684823] +* Add window-based Alt-Tab popup [Florian; #688913] +* Support external session mode definitions [Florian; #689304] +* Support session-mode-specific extensions [Florian; #689305] +* Support 'parentMode' property in session modes [Florian; #689308] +* Support a new org.gnome.ShellSearchProvider2 DBus interface + [Cosimo; #689735, #690009] +* Add "windows" to Ctrl-Alt-Tab popup [Jasper; #689653] +* Port PopupMenu to GrabHelper [Jasper; #689109, #689954] +* Show headphone icon when headphones are plugged in [Giovanni; #675902] +* Display (non-app) search results as list [Tanner, Cosimo; #681797] +* Skip diacritical marks in search terms [Aleksander; #648587] +* Expose all engine options in input sources [Giovanni, Rui; #682318] +* Add input source switcher popup [Rui; #682315] +* Add minimal support for InfiniBand in network menu [Dan; #677150] +* Misc bug fixes and cleanups [Sebastian, Aleksander, Giovanni, Tim, Cosimo, + Florian, Matthias, Rui, Lionel, Colin, Piotr, Guillaume, Bastien, Tanner, + Carlos, Stéphane, Jakub; #688422, #688379, #688750, #688771, #686800, + #688133, #688895, #688966, #683986, #688004, #689108, #689029, #683449, + #688196, #689304, #689243, #689295, #689325, #689400, #679168, #689568, + #689537, #689528, #689749, #689789, #689353, #689820, #689868, #689778, + #689959, #688589, #688589, #689955, #687250, #689965, #690046, #690049, + #689884, #682286, #690173, #690174, #672941, #689876, #687881, #690171, + #690241, #690312, #690175, #687955, #650843, #688234, #690427 + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Stéphane Démurget, + Guillaume Desmottes, Tanner Doshier, Piotr Drąg, Sebastian Keller, + Lionel Landwerlin, Tim Lunn, Victoria Martínez de la Cruz, Aleksander Morgado, + Florian Müllner, Bastien Nocera, Marc Plano-Lesay, Carlos Soriano Sánchez, + Jakub Steiner, Jasper St. Pierre, Colin Walters, Dan Winship, Ron Yorston + +Translations: + Yuri Myasoedov [ru], Wouter Bolsterlee [nl], Yaron Shahrabani [he], + Nilamdyuti Goswami [as], Ani Peter [ml], Kjartan Maraas [nb], + Dr.T.Vasudevan [ta], A S Alam [pa], Shankar Prasad [kn], Khaled Hosny [ar], + Daniel Mustieles [es], Dušan Kazik [sk] + +3.7.2 +===== +* Enforce RTL in he for messages that might end up as LTR [Florian; #686630] +* gdm: Move logo into the panel [Florian; #685852] +* Hide notifications when closed button is clicked [Jasper, Florian; #682237] +* Tweak screenShield animations [Rui; #686745] +* Restore Fittsability of summary items in message tray [Florian; #686474] +* Save screencasts as recent item [Ray; #680647] +* overview: Resize window captions on content change [Giovanni, Alex; #620874] +* App search: Match GenericName too [Matthias; #687121] +* runDialog: Better match style of other modal dialogs [Florian, Allan; #687127] +* Improve the button insensitive style [Stéphane; #687110] +* network: Don't use a global switch for all VPN connections [Giovanni; #682929] +* appMenu: Update on icon theme changes [Florian; #687224] +* Show 'Log out' in more situations [Matthias; #686736] +* Add a setting to force the 'Log out' menuitem [Matthias; #686057] +* overview: Improve styling of search box [Stéphane; #686479] +* Implement 'disable-user-list' in login screen [Ray; #660660] +* Fix auto-scroll to bottom in chat notifications [Sjoerd; #686571] +* Show feedback notifications when user is busy [Stéphane; #662900] +* Disable login button when there is no input [Stéphane; #687112] +* Use non-linear overview shade for background [Giovanni, Pierre-Eric; #669798] +* Reduce blocking in compositor thread [Simon, Jasper; #687465] +* network: new country-specific type to gather providers [Aleksander; #687356] +* Update man page [Matthias; #680601] +* st-entry: Change the pointer cursor on enter/leave events [Thomas; #687130] +* screenShield: Blur and desaturate the background [Giovanni, Cosimo; #682536] +* Change height of chat notifications to have more context [Carlos; #665255] +* screenShield: Account for motion velocity when hiding [Giovanni; #682537] +* screenShield: hide the cursor while the lock screen is on [Giovanni; #682535] +* Support remote search provider settings [Cosimo; #687491] +* unlockDialog: Improve label of confirmation button [Stéphane; #687656] +* userMenu: Rename "System Settings" item to "Settings" [Elad; #687738] +* messageTray: Add keybinding to focus current notification [Stéphane; #652082] +* Remove shell-screen-grabber [Neil; #685915] +* main: Stop using Metacity's keybinding files [Florian; #687672] +* Bluetooth: Remove ObexFTP functionality [Bastien; #688160] +* a11y: Also set WM theme when HighContrast is switched on [Cosimo; #688256] +* network: Rework multiple NIC support [Giovanni; #677142] +* Rework keybindings to allow selective blocking/processing [Florian; #688202] +* recorder: Show indicator on primary monitor [Adel; #688470] +* recorder: Set frame duration to fix broken video headers [Adel; #688487] +* Misc. bugfixes and cleanups [Florian, Jasper, Giovanni, Matthew, Stéphane, + Allan, Daiki, Owen, Alejandro, Jean-François, Cosimo, Sebastian, Adel, Alban; + #686484, #686728, #686805, #686574, #686763, #682428, #687132, #685239, + #687189, #687226, #658091, #670687, #687457, #687242, #687287, #687020, + #686583, #661194, #687491, #657315, #687958, #683986, #688089, #687708, + #686530, #684810, #688181, #688475, #688557, #688507, #638351] + +Contributors: + Elad Alfassa, Matthew Barnes, Alban Browaeys, Giovanni Campagna, + Cosimo Cecchi, Matthias Clasen, Allan Day, Stéphane Démurget, + Jean-François Fortin Tam, Adel Gadllah, Alex Hultman, Sebastian Keller, + Rui Matos, Simon McVittie, Aleksander Morgado, Florian Müllner, + Bastien Nocera, Pierre-Eric Pelloux-Prayer, Alejandro Piñeiro, Neil Roberts, + Sjoerd Simons, Carlos Soriano Sánchez, Jasper St. Pierre, Ray Strode, + Owen Taylor, Daiki Ueno, Thomas Wood + +Translations: + Dušan Kazik [sk], Pavol Klačanský [sk], Piotr Drąg [pl], Yuri Myasoedov [ru], + Marek Černocký [cs], Kjartan Maraas [nb], Wolfgang Stöggl [de], + Yaron Shahrabani [he], Fran Diéguez [gl], Mattias Põldaru [et] + +3.7.1 +===== +* Add shortcut to open application view directly [Jeremy; #685738] +* Expose 'F10' shortcut in System Settings [Florian; #672909] +* Clean up timestamp format in chat notifications [Carlos; #680989] +* loginScreen: Add support for 'disable-restart-buttons' [Florian; #686247] +* Update textures automatically on file changes [Florian; #679268] +* Implement org.gnome.ScreenSaver.GetActiveTime [Giovanni; #686064] +* Add missing translations for GSetting schema [Giovanni; #686413] +* Hide workspace switcher completely when it's not necessary [Seif; #686483] +* Explicitly load gnome-screensaver when not running GDM [Tim; #683060] +* Port to GnomeIdleMonitor [Jasper; #682224] +* Set Empathy as preferred handler when delegating channels [Xavier; #686296] +* Allow testing GDM login dialog from the session [Giovanni; #683725] +* Use all available space for windows in window picker [Jasper, Pierre-Eric; + #582650] +* Use logind for suspend if available [Florian; #686482] +* Misc. fixes and cleanups [Jasper, Florian, Adel, Rui; #677426, #680426, + #686233, #686241, #686318, #686240, #686484, #686002, #684650, #686487] + +Contributors: + Jeremy Bicha, Giovanni Campagna, Xavier Claessens, Adel Gadllah, Seif Lotfy, + Tim Lunn, Rui Matos, Florian Müllner, Pierre-Eric Pelloux-Prayer, + Carlos Soriano, Jasper St. Pierre + +Translations: + Andika Triwidada [id], Matej Urbančič [sl], Ihar Hrachyshka [be], + Daniel Mustieles [es], Fran Diéguez [gl], Takayuki KUSANO [ja], + Мирослав Николић [sr, sr@latin], Dušan Kazik [sk], Tom Tryfonidis [el] + +3.6.1 +===== +* dash: Make padding even on the top/bottom of the dash [Jasper; #684619] +* Fix a crash when dragging search results [Jasper; #684888] +* workspaceThumbnail: Fix dragging with static workspaces [Jasper; #684641] +* Really hide 'Show Keyboard Layout' on the lock screen [Matthias] +* Misc. improvements to jhbuild setup [Owen; #685352, #685353, #685354, #685355] +* Show message tray in Ctrl+Alt+Tab outside of the overview [Jasper, Florian; + #684633, #685914] +* Disable hotplug sniffer on remote filesystems [Jasper; #684093] +* userMenu: Remove 'Switch Session' item [Florian; #685062] +* unlockDialog: Make prompt entry insensitive while logging in [Jasper; #685444] +* messageTray: Don't animate desktop clone for failed grabs [Jasper; #685342] +* Fix crash on dragging windows between workspaces [Ryan; #681399] +* userMenu: Ignore 'lock-enabled' setting for user switching [Florian; #685536] +* gdm: Fix key-focus on first user [Adel; #684650] +* Make grid button insensitive when dragging non-favorites [Jasper; #685313] +* Calendar: hide all actions when on the login screen [Matthias; #685142] +* Adapt unlock dialog layout for the login screen [Florian; #685201] +* Make focus-follows-mouse work better with Shell UI [Florian; #678169] +* Improve look of screen shield [Jasper; #685919] +* Fix keynav in the login screen [Florian; #684730] +* dateMenu: Hide "Open Calendar" item if calendar unavailable [Florian; #686050] +* unlockDialog: Reset UI on verification failure [Giovanni; #685441] +* Show unlock dialog on primary monitor when using keynav [Giovanni; #685855] +* Fix height changes of entries when entering text [Florian; #685534] +* Fix show-apps label after successful drags [Florian; #684627] +* Misc. bugfixes and cleanups [Jasper, Olivier, Florian, Owen, Adel, Tanner, Tim, Matthias; #685434, #685511, #685466, #685341, #685156, #681159, #673189, #686016, 684869, #686079, #686063 + +Contributors: +Jasper St. Pierre +Matthias Clasen +Owen Taylor +Olivier Blin +Florian Müllner +Ryan Lortie +Adel Gadllah +Tanner Doshier +Tim Lunn +Giovanni Campagna + +Translations: + Tobias Endrigkeit [de], Rudolfs Mazurs [lv], Ask H. Larsen [da], + Shankar Prasad [kn], Changwoo Ryu [ko], Chris Leonard [en_GB], + Arash Mousavi [fa], Theppitak Karoonboonyanan [th], Seán de Búrca [ga], + Yaron Shahrabani [he], Alexander Shopov [bg], Žygimantas Beručka [lt], + Milo Casagrande [it], Kjartan Maraas [nb], Kris Thomsen [da], + Aurimas Černius [lt], Yuri Myasoedov [ru], Мирослав Николић [sr], + Marek Černocký [cs], Gabor Kelemen [hu], Ihar Hrachyshka [be], + Chao-Hsiung Liao [zh_HK, zh_TW], Eleanor Chen [zh_CN], + Carles Ferrando [ca@valencia], Vicent Cubells [ca], Daniel Korostil [uk], + Alexandre Franke [fr], Piotr Drąg [pl] + +3.6.0 +===== +* keyboard: Make input source items accessible [Florian; #684462] +* Don't show network dialogs in the lock screen [Giovanni; #684384] +* popupMenu: Fix initial visibility of settings items [Florian; #684473] +* userMenu: Close menu immediately on user/session switch [Florian; #684459] +* Fix alignment of search section headers in RTL locales [Florian; #684379] +* screenShield: Fix unlock animation [Florian; #684591] +* Don't open the tray from a dwell while in a modal grab [Jasper; #684458] +* userMenu: Fix texture updates on icon changes [Florian; #679268] +* Fix a11y support in the login screen [Florian, Ray; #684727, #684728, #684748] +* Make On-Screen-Keyboard usable with new message tray [Giovanni, Florian; + #683546] +* Fix initial visibility of input volume in lock-screen [Florian; #684611] + +Contributors: + Giovanni Campagna, Florian Müllner, Jasper St. Pierre, Ray Strode + +Translations: + Matej Urbančič [sl], Dr.T.Vasudevan [ta], Piotr Drąg [pl], A S Alam [pa], + Alexander Shopov [bg], Nilamdyuti Goswami [as], Chandan Kumar [hi], + Khaled Hosny [ar], Ibrahim Saed [ar], Sandeep Sheshrao Shedmake [mr], + Tom Tryfonidis [el], Theppitak Karoonboonyanan [th], Alexandre Franke [fr], + Fran Diéguez [gl], Gabor Kelemen [hu], Ani Peter [ml], Daniel Mustieles [es], + Мирослав Николић [sr, sr@latin], Duarte Loreto [pt], ManojKumar Giri [or], + Ihar Hrachyshka [be], Aurimas Černius [lt], Djavan Fagundes [pt_BR], + Changwoo Ryu [ko], Bruce Cowan [en_GB], Kris Thomsen [da], Gil Forcada [ca], + Yaron Shahrabani [he], Milo Casagrande [it], Ville-Pekka Vainio [fi], + YunQiang Su [zh_CN], Carles Ferrando [ca@valencia], Mario Blättermann [de], + Rajesh Ranjan [hi], Yuri Myasoedov [ru], Rūdolfs Mazurs [lv], + Jiro Matsuzawa [ja], Mattias Põldaru [et], Timur Zhamakeev [ky], + Petr Kovar [cs], Chao-Hsiung Liao [zh_HK,zh_TW], Andika Triwidada [id] + +3.5.92 +====== +* Login/UnlockDialog: Don't reset immediately if auth fails [Giovanni; #682544] +* Allow changing session mode at runtime [Jasper, Giovanni; #683156] +* Add zoom out animation on login [Jasper; #683170] +* Bluetooth: don't restrict the length of non numeric PINs [Giovanni; #683356] +* Force chat notification to stay open when focusing entry [Debarshi; #682236] +* Make sure the screen is fully locked before suspending [Giovanni; #683448] +* st-texture-cache: Fix a case of distorted textures [Florian; #683483] +* popupSubMenu: Fix padding for non-scrolled submenus [Florian; #683009] +* popupMenu: Fix width changes on submenu open/close [Florian; #683485] +* boxpointer: Avoid malformed boxpointer arrow [Debarshi; #680077] +* Change stage background color to grey [Adel; #683514] +* messageTray: Update style of summary counters [Debarshi; #682891] +* Don't fail if a legacy tray icon has no WM_CLASS [Giovanni; #683724] +* PolkitAgent: Fix a crash if there is no avatar [Giovanni; #683707] +* Hide the a11y menu in the lock screen, but show it in the login screen + [Giovanni; #682542] +* Fix show-apps button dropping off the dash [Florian; #683340] +* Fix committing strings to shell entries from input method [Florian; #658325] +* Make IBus display strings consistent with control-center [Rui; #683124] +* Fix missing short codes for some input sources [Rui; #683613] +* Remove support for long-press from entry context menus [Jasper; #683509] +* screenShield: Add box-shadow to the shield [Florian] +* Don't show a right-click menu for the hotplug source [Jasper; #683438] +* Fix extension styling [Giovanni; #682128] +* Fix on-screen keyboard not working with system-modal dialogs + [Giovanni; #664309] +* Fix insensitive styling for popup menu items [Giovanni; #683988] +* Disable the message tray dwell when the user is interacting [Owen; #683811] +* Animate going from the unlock dialog to the lock screen [Giovanni; #681143] +* Autostart fprintd when necessary [Ray; #683131] +* UnlockDialog: Allow typing before the first PAM question [Giovanni; #681576] +* Make Return key dismiss screenshield [Ray; #683889] +* Fix keyboard navigation in the message tray [Florian; #682243] +* Remove the places & devices search provider [Giovanni; #683506] +* Enable hot corner while the message tray is up [Florian; #682255] +* Port screen recorder to new GStreamer vp8enc API [Adel; #684206] +* Fix fish flickering [Giovanni; #684154] +* Fix extension ordering with !important [Jasper; #684163] +* Allow the shell to run without the screenshield [Giovanni; #683060] +* Add menu items for IBus Anthy's InputMode, TypingMode [Rui; #682314] +* Improve transition to the login dialog [Jasper; #682428] +* Keep unlock dialog around until shield animation ends [Florian; #684342] +* Expose shell keybindings in System Settings [Florian; #671010] +* Misc. bugfixes and cleanups [Debarshi, Florian, Giovanni, Jasper, Rico, Rui; + #672790, #677434, #683305, #683357, #683369, #683377, #683378, #683400, + #683449, #683472, #683482, #683487, #683488, #683526, #683529, #683546, + #683583, #683628, #683705, #683982, #683989, #684035, #684036, #684040, + #684162, #684214, #684343] + +Contributors: + Giovanni Campagna, Adel Gadllah, Rui Matos, Florian Müllner, Debarshi Ray, + Jasper St. Pierre, Ray Strode, Owen Taylor, Rico Tzschichholz + +Translations: + Gabor Kelemen [hu], Piotr Drąg [pl], Khaled Hosny [ar], + Мирослав Николић [sr, sr@latin], Chao-Hsiung Liao [zh_HK, zh_TW], + Bruce Cowan [en_GB], Dirgita [id], Tom Tryfonidis [el], Timo Jyrinki [fi], + Adorilson Bezerra [pt_BR], Arash Mousavi [fa], Matej Urbančič [sl], + Christian Kirbach [de], Yaron Shahrabani [he], Ihar Hrachyshka [be], + Changwoo Ryu [ko], Duarte Loreto [pt], Theppitak Karoonboonyanan [th], + Nilamdyuti Goswami [as], Sandeep Sheshrao Shedmake [mr], + Alexandre Franke [fr], Ivaylo Valkov [bg], tuhaihe [zh_CN], + Yuri Myasoedov [ru], Aurimas Černius [lt], Andika Triwidada [id], + Rajesh Ranjan [hi], Sweta Kothari [gu], Daniel Mustieles [es], + Fran Diéguez [gl], Praveen Illa [te] + +3.5.91 +====== +* Improve modal dialog styling of network secret prompts [Jasper; #682412] +* Fix visibility of non-active workspaces during overview transition + [Florian; #682002] +* Improve scrollbar theming [Cosimo; #682476] +* Make sure the app menu remains hidden in locked state [Florian; #682475] +* Add tooltip to show-applications icon [Jasper; #682445] +* Do not add duplicate remote search providers [Florian; #682470] +* Handle 'popup-menu' signal on summary items [Florian; #682486] +* Fix dwelling during mouse-down [Owen; #682385] +* Set label actor for endSessionDialog.ListItem [Alejandro; #677503] +* Don't match on comments when searching applications [Florian; #682529] +* Make workspace selector more similar to the mockup [Stefano; #662087] +* Fix extension installation and reloading [Jasper; #682578] +* Hide removable devices in the lock screen [Giovanni; #681143] +* Reset cancellable after hitting Escape on login screen [Alban; #681537] +* Fix suspend from the user menu [Giovanni; #682746] +* Set label actor for summary items in message tray [Alejandro; #677229] +* Set label for the "Show applications" dash button [Alejandro; #682366] +* Load extensions as late as possible [Jasper; #682822] +* Improve mount operation dialogs [Jon; #682645] +* Remove "Connect to ..." item from places search [Florian; #682817] +* Don't auto-expand notifications with actions [Giovanni; #682738] +* Add a new lock screen menu to combine volume network and power + [Giovanni; #682540] +* Add support for pre-edit to StIMText [Daiki; #664041] +* Remove StIconType [Jasper, Florian, Rui, Giovanni, Debarshi; #682540] +* Use monitor geometry for dwelling [Florian; #683044] +* Add support for surrounding-text to StIMText [Daiki; #683015] +* Improve the placement and style of the "No results" text [Jasper; #683135] +* Remove broken network device activation policy [Giovanni; #683136] +* Hide power status icon when no battery is present [Tim; #683080] +* Ensure summary items are square and have spacing [Debarshi; #682248] +* Fix close buttons overlapping screen edge [Debarshi; #682343] +* Escape the tray when a legacy icon is clicked [Giovanni; #682244] +* Update arrow in the screen shield to match latest mockups [Giovanni; #682285] +* Allow lifting the screen shield with the mouse wheel [Giovanni; #683164] +* Make sure to show the app menu after unlocking the screen [Jasper; #683154] +* Misc bug fixes and cleanups [Debarshi, Florian, Giovanni, Jasper, Rui; + #582650, #667439, #682238, #682268, #682429, #682455, #682544, #682546, + #682683, #682710, #682998, #683073, #683137, #683156] + +Contributors: + Alban Browaeys, Giovanni Campagna, Cosimo Cecchi, Stefano Facchini, + Adel Gadllah, Tim Lunn, Rui Matos, William Jon McCann, Florian Müllner, + Alejandro Piñeiro, Debarshi Ray, Jasper St. Pierre, Owen Taylor, Daiki Ueno + +Translations: + Piotr Drąg [pl], Takayuki KUSANO [ja], Kjartan Maraas [nb], + Aurimas Černius [lt], Daniel Mustieles [es], Yuri Myasoedov [ru], + Khaled Hosny [ar], Yaron Shahrabani [he], Tom Tryfonidis [el], + Nilamdyuti Goswami [as], Fran Diéguez [gl], Nguyễn Thái Ngọc Duy [vi], + A S Alam [pa], Dr.T.Vasudevan [ta], Luca Ferretti [it] + +3.5.90 +====== +* Use symbolic icons for workspace switch OSD [Jon; #680738] +* Lock screen improvements: + - Hide user menu and a11y menu in the screen lock [Giovanni; #681143] + - Bump the lock screen slightly when pressing a key [Giovanni; #681143] + - Constrain vertical movement of the screen shield [Giovanni; #681143] + - Return to lock screen on idle [Giovanni; #682041] + - Unlock screen automatically after fast-user switching [Giovanni; #682096] + - Fix "other user" label [Ray; #681750] +* Constrain content of system modals to primary monitor [#681743] +* Respect automatic lock setting on suspend/user-switch [Giovanni; #680231] +* Improve styling of keyring prompt [Jasper; #681821] +* Do not hard-code as overlay-key [Florian; #665547] +* Update style of attached modal dialogs [Florian; #681601] +* a11y: allow navigation on non reactive items [Alejandro; #667439, #667439] +* Implement mode-less overview design [Joost, Florian; #682109] +* Implement message-tray redesign: + - Restyle the message tray [Ana, Allan, Florian; #677213, #682342] + - Move the desktop upwards when showing the tray [Debarshi; #681392] + - Add a close button to notifications [Ana, Jasper; #682253] + - Add a keybinding to toggle the tray [Debarshi; #681392] + - Make the tray keyboard navigable [Debarshi; #681519] + - Add dwelling at the bottom of the screen to open the tray [Owen; #682310] + - Don't time out banners when the user is inactive [Marina, Jasper] + - Misc fixes and cleanups [Jasper, Marina] +* Fix showing "Next Week" on Sundays [Sebastian; #682198] +* Delay restoring IM presence until the network comes up [Florian; #677982] +* Display enterprise login hint [Ray; #681975] +* Ignore unrecognized/irrelevant network devices/connections [Dan; #682364] +* Misc bug fixes and cleanups: [Dan, Florian, Jasper, Jiro, Piotr, Rico; + #643687, #682045, #682189] + +Contributors: + Giovanni Campagna, Allan Day, Piotr Drąg, William Jon McCann, + Sebastian Keller, Jiro Matsuzawa, Florian Müllner, Alejandro Piñeiro, + Debarshi Ray, Ana Risteska, Jasper St. Pierre, Ray Strode, Owen Taylor, + Rico Tzschichholz, Joost Verdoorn, Dan Winship, Marina Zhurakhinskaya + +Translations: + Nilamdyuti Goswami [as], Daniel Mustieles [es], Yaron Shahrabani [he], + Chao-Hsiung Liao [zh_HK, zh_TW], Tobias Endrigkeit [de], A S Alam [pa], + Sandeep Sheshrao Shedmake [mr], Fran Diéguez [gl], + Мирослав Николић [sr, sr@latin] + +3.5.5 +===== +* Update style to match mockups [Allan] + - improve calendar layout and legibility + - update notifications and menus + - use a common style for entries + - update scrollbars to match GTK+ + - improve clock/unlock button in lock screen + - update polkit dialogs [Jasper] +* Fix login dialog growing when selecting different users [Florian; #675076] +* Implement screen lock in the shell [Giovanni] + - restructure login code to be shared with session unlock [#619955] + - add initial screen shield / unlock dialog implementation [#619955] + - implement (optional) notification list on lock shield [#619955] + - update login dialog style to match lock screen [#619955] + - filter notifications to only show new ones on the screen lock [#681143] + - make notifications scrollable if necessary [#681143] + - use correct application names in notifications [#681143] + - allow to return to the shield by pressing Escape [#681143] +* Minor login dialog improvements [Florian] + - update style to match the overall visuals [#660913] + - indicate whether users are logged in [#658185] +* Add support for background-repeat CSS property [Jasper; #680801] +* Add :active pseudo class on scroll handles [Florian] +* Remove markup from translated strings [Matthias; #681270] +* Misc bug fixes and cleanups: [Alban, Florian, Giovanni, Jasper, Jeremy, + Matthias, Piotr; #677893, #679944, #680064, #680170, #680216, #680426, + #681101, #681382] + +Contributors: + Jeremy Bicha, Alban Browaeys, Giovanni Campagna, Matthias Clasen, Allan Day, + Piotr Drąg , Florian Müllner, Jasper St. Pierre + +Translations: + Matej Urbančič [sl], Tom Tryfonidis [el], Yaron Shahrabani [he], + Kjartan Maraas [nb], Baurzhan Muftakhidinov [kk], Praveen Illa [te], + Khaled Hosny [ar], Daniel Mustieles [es], Gabor Kelemen [hu], + Fran Diéguez [gl], Sweta Kothari [gu], Aleksej Kabanov [ru], + Nilamdyuti Goswami [as], Arash Mousavi [fa], Мирослав Николић [sr, sr@latin] + +3.5.4 +===== +* Fix wrong result handling of remote calls [Florian; #678852] +* dateMenu: Fix regression that caused no date to be displayed [Colin] +* WindowTracker: Fix refcounting bug in get_app_for_window() [Giovanni; #678992] +* Show the workspace switcher for move-to-workspace keybinding + [Giovanni, Jasper; #674104, #660839, #679005] +* userMenu: Move "Power off" item to the bottom [Florian; #678887] +* Remove contacts search provider [Florian, Rui; #677442] +* network: don't ask for always-ask secrets when interaction isn't allowed + [Dan; #679091] +* PolkitAgent: Look for the right password prompt [Matthias; #675300] +* Implement extension updates [Jasper; #679099] +* userMenu: Don't disconnect account signals when disabled [Guillaume; #669112] +* Fix startup notification when opening calendar [Florian; #677907] +* networkAgent: use absolute path if configured [Clemens; #679212] +* recorder: Port to GStreamer-1.0 API [Florian; #679445] +* telepathyClient: don't add log messages on presence changes [Ana; #669508] +* lookingGlass: Don't use a signal callback on 'paint' to draw the border + [Jasper; #679464] +* Add support for inhibiting automount [Hans; #678597] +* Implemented banner support for the login screen [Matthias, Marius; #665346] +* boxpointer: Flip side if we would end outside the monitor [Rui; #678164] +* boxpointer: Change 'animate' parameter on show/hide to a bitmask + [Rui; #678337] +* Add a grayscale effect [Matthias, Jasper, Florian: #676782, #674499] +* UserMenu: show "Install Updates & Restart" when appropriate + [Giovanni; #677394, #680080] +* messageTray: don't show the message tray when a new notification is shown + [Ana; #677210] +* panel: don't break when indicator has no menu [Jean-Philippe; #678694] +* appMenu: Disable app menu during startup animations [Florian; #672322] +* autorun: Add a notification when unmounting drives [Cosimo; #676125] +* st-icon: Fix potential crash involving shadows [Jasper; #679776] +* Remove manual garbage collection on tweeners end [Cosimo; #679832] +* dash: hide tooltips when overview begins hiding [Stefano; #674241] +* Update modal dialog animation for new centered position [Florian; #674499] +* calendar: Fix grid lines in RTL locales [Florian; #679879] +* Integrate IBus with keyboard indicator [Rui; #641531] +* Move ibus status icon under keyboard [Matthias] +* gdm: port from libgdmgreeter to libgdm [Ray; #676401] +* Misc bug fixes and cleanups [Antoine, Cosimo, Giovanni, Jasper, Rico; + #678978, #672790, #679847, #679944] + +Contributors: + Jean-Philippe Braun, Clemens Buchacher, Giovanni Campagna, Cosimo Cecchi, + Matthias Clasen, Hans de Goede, Guillaume Desmottes, Stefano Facchini, + Antoine Jacoutot, Rui Matos, Florian Müllner, Marius Rieder, Ana Risteska, + Jasper St. Pierre, Rico Tzschichholz, Colin Walters, Dan Williams + +Translations: + Matej Urbančič [sl], Khaled Hosny [ar], Nguyễn Thái Ngọc Duy [vi], + Nilamdyuti Goswami [as], Alexander Shopov [bg], Ivaylo Valkov [bg], + Daniel Mustieles [es], Kjartan Maraas [nb,nn], Yaron Shahrabani [he], + Nilamdyuti Goswami [as], Chao-Hsiung Liao [zh_HK, zh_TW], Ihar Hrachyshka [be], + Praveen Illa [te] + +3.5.3 +===== +* calendar: Adapt to Evolution-Data-Server API changes [Matthew; #677402] +* messageTray: Don't show non urgent notifications while in fullscreen + [Adel; #677590] +* modalDialog: show dialogs on monitor with the mouse pointer [Tim; #642591] +* extensionSystem: Prepare for extension updating system [Jasper; #677586] +* appDisplay: Don't show apps in NoDisplay categories in the All view + [Jasper; #658176] +* st: Trigger theme updates on resolution changes [Florian; #677975] +* Always enable a11y [Bastien; #678095] +* telepathyClient: ignore invalidated channels [Guillaume; #677457] +* shell-app: Update app menu if necessary [Florian; #676238] +* Enable the Screen Reader menu item [Matthias; #663256] +* Disable unredirection when a modal operation is active [Giovanni] +* Make folks optional [Colin] +* Improve mount-operation support [Cosimo] + - Fix exception when showing password entry [#678428] + - Close the password entry on operation abort [#673787] + - autorun: Don't allow autorun for things we mount on startup [#660595] + - Turn passphrase prompt into a dialog [#674962] + - Implement org.Gtk.MountOperationHandler [#678516] +* Network menu improvements + - Sort Wifi networks by strength [Giovanni; #658946] + - Prefer wifi/3g over VPN in the panel [Cosimo; #672591] +* clock: Switch to using GnomeWallClock [Colin; #657074] +* remoteSearch: Allow to reference .desktop file for Title/Icon + [Florian; #678816] +* Fix memory leaks [Jasper, Pavel; #678079, #678406, #678737] +* Misc fixes [Florian, Giovanni, Guillaume, Jasper, Kjartan, Piotr, Rui; + #658955, #677497, #678396, #678502] +* Misc cleanups [Bastien, Florian, Jasper; #677426, #677515, #678096, #678416] + +Contributors: + Matthew Barnes, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, + Guillaume Desmottes, Piotr Drąg, Adel Gadllah, Tim L, Kjartan Maraas, + Rui Matos, Florian Müllner, Bastien Nocera, Jasper St. Pierre, Colin Walters + +Translations: + Matej Urbančič [sl], Yuri Kozlov [ru], Tom Tryfonidis [el], + Kjartan Maraas [nb], Žygimantas Beručka [lt], Luca Ferretti [it], + Khaled Hosny [ar], Daniel Mustieles [es], Fran Diéguez [gl], A S Alam [pa] + +3.5.2 +===== +* main: Move 'toggle-recording' binding into the shell [Florian; #674377] +* popupMenu: make sure to break the grab when the slider is not visible + [Stefano; #672713] +* st-theme-node-drawing: Don't use GL types [Neil; #672711] +* Mirror Evolution calendar settings into our own schema [Owen; #674424] +* shell-network-agent: don't crash if a request isn't found [Dan; #674961] +* notificationDaemon: Match app based on WM_CLASS [Jasper; #673761] +* NetworkMenu: use network-offline while loading [Giovanni; #674426] +* lookingGlass: Remove the Errors tab [Jasper; #675104] +* searchDisplay: Reset keyboard focus after displaying async results + [Rui; #675078] +* gdm: don't fail if fprintd is unavailable [Ray; #675006] +* messageTray: Fix scrolling up [Jasper; #661615] +* main: Close the recorder instead of pausing it [Rui; #675128] +* Accessibility [Alejandro] + - Use the proper label_actor for date menu on top panel [#675307] + - Set the proper role/label_actor for SearchResult.content [#672242] + - do not expose a label text if 'hidden' style class is used [#675341] +* Magnifier: Add brightness and contrast functionality [Joseph; #639851] +* theme: use a smaller border-radius for top bar [Jakub; #672430] +* placeDisplay: use new bookmark file location [Matthias; #675443] +* port all synchronous search providers to the async API [Jasper, Rui; #675328] +* NetworkAgent: disallow multiple requests for the same connection/setting + [Giovanni; #674961] +* userMenu: Update to latest mockups [Florian; #675802] +* util: Don't double-fork when spawning from Alt-F2 [Colin; #675789] +* messageTray: Make Source usable without subclassing [Jasper; #661236] +* panel: Check for appMenu button's reactivity before opening [Florian; #676316] +* Fix formatting of bluetooth passkey [Florian; #651251] +* notificationDaemon: Filter out file-transfer notifications [Jasper; #676175] +* Don't use global.log() [Jasper; #675790] +* Fix broken extension loading in some distributions [Owen, Alexandre; #670477] +* shell-app: Raise windows in reverse order to preserve the stacking + [Rui; #676371] +* Generalize gdm-mode [Florian; #676156] +* Switch string formatting to the one inside gjs [Jasper; #675479] +* extensionUtils: Support subdirectories in getCurrentExtension + [Jasper; #677001] +* panel: Refuse to add (legacy) status icons not part of the session mode + [Florian; #677058] +* Add an initial-setup mode [Matthias; #676697] +* status/keyboard: Port to the new input sources settings [Rui; #641531] +* NetworkMenu: show notifications for failed VPN connections [Giovanni; #676330] +* userMenu: Indicate progress on status changes [Florian; #659067] +* recorder: Honor "disable-save-to-disk" lockdown key [Rūdolfs; #673630] +* searchDisplay: Use the rowLimit we pass to the IconGrid [Christian; #675527] +* endSessionDialog: Factor out _updateDescription from _updateContent + [Alejandro; #674210] +* Fix empathy's appMenu freezing the shell [Alban; #676447] +* Code cleanups [Florian, Giovanni, Jasper; #672807, #672413, #676837, #676850, + #672272] +* Misc bug fixes [Alban, Florian, Giovanni, Guillaume, Jasper, Piotr, Rico, + Ron, Rui, Stefano; #659968, #672192, #673177, #673198, #674323, #675301, + #675370, #676347, #676806, #677097] + +Contributors: + Alban Browaeys, Giovanni Campagna, Matthias Clasen, Guillaume Desmottes, + Piotr Drąg, Stefano Facchini, Rui Matos, Rūdolfs Mazurs, Florian Müllner, + Alejandro Piñeiro, Neil Roberts, Alexandre Rostovtsev, Joseph Scheuhammer, + Jakub Steiner, Jasper St. Pierre, Ray Strode, Owen Taylor, Rico Tzschichholz, + Colin Walters, Dan Winship, Ron Yorston + +Translations: + OKANO Takayoshi [ja], Daniel Mustieles [es], Changwoo Ryu [ko], + Yaron Shahrabani [he], Fran Diéguez [gl], Jonh Wendell [pt_BR], + Kjartan Maraas [nb], Luca Ferretti [it], Tom Tryfonidis [el], + Sandeep Sheshrao Shedmake [mr], Takanori MATSUURA [ja], Dirgita [id], + Mantas Kriaučiūnas [lt], Matej Urbančič [sl], Jiro Matsuzawa [ja] + +3.4.1 +===== +* Fix crash that occurred when an icon theme change caused unexpected + reentrancy in the icon loading code [Jasper; #673512] +* Don't show system and other disabled users in the GDM user list + [Adel; #673784] +* Make gnome-shell-calendar-server initialize GTK+ so it can display + password prompts if needed [#673608; Owen, Rico] +* Adapt to Mutter API change for keybinding addition [Florian; #673014] +* Fix crash when an extension was installed as both a user extension + and a system extension [#673613; Jasper] +* Fix bug where chat entry could end up partially offscreen [Joost, 661944] +* Fix problem where icons weren't updating when theme was changed + [#672941; Florian] +* Look for Evolution calendar settings in GSettings, not GConf [#673610; Owen] +* Add F10 for the application menu [#672909; Florian] +* Fix %Id format characters to work in translations [#673106; Cosimo] + (were already used in fa translation) +* Fix error when NetworkManager restarts [#673043; Giovanni] +* Improve efficiency of overview redraws by working around Clutter issue + [Stefano; #670636] +* Misc bug fixes [Florian, Giovanni, Jasper, Rui, Stefano; + #672592, #672641, #672719, #673187, #673233, #673656] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Stefano Facchini, Adel Gadllah, Rui Matos, + Florian Müllner, Jasper St. Pierre, Owen Taylor, Rico Tzschichholz, + Joost Verdoorn + +Translations: + Khaled Hosny [ar], Ihar Hrachyshka [be], Alexander Shopov [bg], Gil Forcada, + Jordi Serratosa [ca], Petr Kovar [cs], Bruce Cowan [en_GB], + Carles Ferrando [ca@valencia], Wolfgang Stöggl [de], Daniel Mustieles [es], + Arash Mousavi [fa], Bruno Brouard [fr], Fran Diéguez [gl], + Sweta Kothari [gu], Yaron Shahrabani [he], Gabor Kelemen [hu], + Shankar Prasad [kn], Žygimantas Beručka [lt], Rudolfs Mazurs [lv], + Sandeep Sheshrao Shedmake [mr], Kjartan Maraas [nb], Piotr Drąg [pl], + Yuri Myasoedov [ru], Daniel Nylander [se], Matej Urbančič [sl], + Miroslav Nikolić [sr], Sasi Bhushan, Praveen Illa [te], Yinghua Wang [zh_CN] + +3.4.0 +===== +* Don't crash when taking screenshots [Jasper; #672775] +* Fix dialog-resizing problem [Florian; #672543] + +Contributors: + Florian Müllner, Jasper St. Pierre + +Translations: + Khaled Hosny, Abderrahim Kitouni [ar], Ihar Hrachyshka [be], + Alexander Shopov [bg], Marek Černocký [cs], Jiri Grönroos, Timo Jyrinki [fi], + Bruno Brouard [fr], Fran Diéguez [gl], Yaron Shahrabani [he], + Gabor Kelemen [hu], Jiro Matsuzawa [ja], Kenneth Nielsen [dk], + Mattias Põldaru [et], Changwoo Ryu [ko], Rudolfs Mazurs [lv], + Jonh Wendell [pt_BR], Yuri Myasoedov[ru], Daniel Korostil [uk], + Nguyễn Thái Ngọc Duy [vi], Chao-Hsiung Liao [zh_HK, zh_TW] + +3.3.92 +====== +* Add shell-dialogs for GNOME Keyring prompts [Stef; #652459, #652460, #671034] +* When the user returns from idle, bring up the message tray if there were + messages while they were away [Marina; #643014] +* https://live.gnome.org/EveryDetailMatters + - Make the workspace thumbnails clickable all the way to the edge of the + screen [Stefano; #643319] + - Don't slide out the workspace thumbnails if the mouse is over them when + entering the overview [Joost, #651092] + - Fix placeholder jumps while dragging a dash item [Joost; #651842] + - Don't favorite apps if they are dropped back at the same position + [Jean-Philippe; #656333] + - To avoid confusion, don't allow removing running apps from favorites + [Florian; #644853] + - Fix creation of new workspaces by dragging application launchers + [Stefano; #664202] + - Make it easier to drag dash items without triggering the menu + [Florian; #637103] +* Accessibility [Alejandro] + - Add StWidget API for easily adding accessible states and setting roles, + names [#668366, #667432, #671378] + - Set accessibility information on UI elements + [#644255, #667432, #668361, #672047, #670308, #670312, #670719, #671404] +* Improve key-navigation in the overview [Rui, Florian; #663901] +* Key navigation bug fixes [Rui, Florian; #662493, #663437, #665215, #671998] +* Honor a 'org.gnome.shell.overrides.dynamic-workspaces' setting that + determines whether the workspace count is dynamic and unsaved in GSettings + or static and saved. [Florian; #671568] +* Avoid saving user presence to GSettings when not necessary + [Florian; #665701, #668214] +* Save screencasts in the users Videos/ directory [Adel; #670749] + Use a "human readable" filename [Florian, Adel, Ray; #670753] +* Allow dragging from the empty part of the top panel to unmaximize a window + [Florian; #666359] +* Fix hangs that could occur when switching away to a VT [Ray; #653833] +* Fix problems with installing from extensions.gnome.org [Giovanni; #671134] +* Fix locking the screen when suspending via menu [David, Gert; #670820] +* Fix browser plugin with Konqueror and Opera [Jasper] +* Fix shell restart not to bring up failure screen [Giovanni; #648384] +* Reorganize and clean up CSS theming [Allan; #668209] +* Improve appearance of modal dialogs [Allan, Florian; #670227, #668209] +* Update the calendar code to use ECalClient [Giovanni; #671177] +* Update jhbuild script to use the main moduleset [Owen, Will; #668440] +* StTextureCache: code cleanup, evict unused icons, merge together + simulataneous requests for the same icon [Jasper; #670771, #671656, #672273] +* Clean up St for recent Clutter changes and fix bugs. StContainer and + StGroup are removed [Jasper, Florian; #670034, #670640, #670904] +* Code cleanup [Adel, Jasper, Rui; #613194, #671086, #671103] +* Misc bug fixes + [Adel, Colin G, Cosimo, Florian, Giovanni, Jasper, Marius, Rui, Stefano; + #651130, #658946, #667552, #670076, #671001, #670979, #671410, #671411, + #671556, #671656, #671657, #672011, #672024, #672240, #672265, #672270, + #672321, #672326, #672413, #672471] + +Contributors: + Jean-Philippe Braun, Giovanni Campagna, Cosimo Cecchi, Allan Day, + Stefano Facchini, David Foerster, Adel Gadllah, Marius Gedminas, + Colin Guthrie, Gert Michael Kulyk, William Lachance, Rui Matos, + Florian Müllner, Alejandro Piñeiro, Jan Alexander Steffens, + Jasper St. Pierre, Ray Strode, Owen Taylor, Joost Verdoorn, Stef Walter, + Marina Zhurakhinskaya + +Translations: + Nilamdyuti Goswami [as], Ihar Hrachyshka, Kasia Bondarava [be], + Alexander Shopov, Ivaylo Valkov [bg], Gil Forcada [ca], Marek Černocký [cs], + Mario Blättermann [de], Kris Thomsen [dk], Bruce Cowan [en_GB], + Kristjan Schmidt [eo], Daniel Mustieles [es], Mattias Põldaru [et], + Inaki Larranaga Murgoitio [eu], Arash Mousavi [fa], Timo Jyrinki [fi], + Bruno Brouard [fr], Fran Diéguez [gl], Sweta Kothari [gu], + Yaron Shahrabani [he], Gabor Kelemen [hu], Jiro Matsuzawa [ja], + Baurzhan Muftakhidinov [kk], Seong-ho Cho [ko], Žygimantas Beručka [lt], + Anita Reitere [lv], Anish A, Praveen Arimbrathodiyil, Mohammed Sadiq [ml], + fKjartan Maraas [nb], Wouter Bolsterlee [nl], A S Alam [pa], Piotr Drąg [pl], + Duarte Loreto [pt], Jonh Wendell [pt_BR], Yuri Myasoedov [ru], + Matej Urbančič [sl], Miroslav Nikolić [sr], Tirumurti Vasudevan [ta], + Sasi Bhushan, Krishnababu Krothapalli [te], Daniel Korostil [uk], + Nguyễn Thái Ngọc Duy [vi], YunQiang Su, Yinghua Wang [zh_CN], + Chao-Hsiung Liao [zh_HK, zh_TW] + +3.3.90 +====== + +* Allow other applications to implement search providers via D-Bus + [Florian; #663125, #670148] +* Remove "Recent Items" search, as replaced by Documents search + [Florian; #663125] +* Allow NetworkManager VPN plugins to use a shell-themed dialog + [Giovanni; #658484] +* Port away from deprecated Clutter API [Jasper, Florian, Adel; #670034] + - StTooltip is removed + - StWidget is now a concrete class and can be instantiated + - st_container_destroy_children(), st_box_layout_insert_actor(), + and other functions removed in favor of new replacements in Clutter. +* Use systemd for console/session handling when available [Lennart] +* Visual improvements to contact search, padding, top panel, checkboxes + [Allan, Florian, Jakub; #669489, #669811, #669993] +* Add a include_cursor parameter to Screenshot and ScreenshotWindow + D-Bus methods [Adel; #670086] +* Add a "FlashArea" D-Bus method to do the screenshot flash without a + screenshot [Adel; #669660] +* Build fixes [Adel, Giovanni, Jasper; #658484, #669637] +* Misc bug fixes [Adel, Florian, Giovanni, Guillaume, Jasper, Jeff, + Marc-Antoine, Stef, Stefano, Will; #642135, #658484, #658908, #667694, + #669098, #669921, #669662, #669694, #669776, #669887, #669921, #670005, + #670006, #670319, #670418, #670489] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Allan Day, Guillaume Desmottes, Jeff Epler, + Stefano Facchini, Adel Gadllah, Florian Müllner, Marc-Antoine Perennou, + Jasper St. Pierre, Lennart Poettering, Jakub Steiner, Jasper St. Pierre, + Will Thompson, Stef Walter + +Translations: + Ihar Hrachyshka [be], Marek Černocký, Adam Matoušek [cs], + Kenneth Nielsen [dk], Daniel Mustieles [es], Mattias Põldaru [et], + Fran Diéguez [gl], Yaron Shahrabani [he], Luca Ferretti [it], + Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], Kjartan Maraas [nb], + A S Alam [pa], Matej Urbančič [sl], Miroslav Nikolić [sr], + Praveen Illa [te], Chao-Hsiung Liao [zh_HK, zh_TW] + +3.3.5 +===== + +* Extension system: [Jasper; #668429] + http://blog.mecheye.net/2012/02/more-extension-api-breaks/ + - Add a 'gnome-shell-extension-prefs' application for displaying extension + preferences as provided by the extension in a prefs.js file. + - Allow launching gnome-shell-extension-prefs from extensions.gnome.org + throuhg the browser plugin. + - Add ExtensionUtils.getCurrentExtension() for an extension to get a + handle to an extension object, to get local imports or paths. + - Add an onshellrestart callback to the browser plugin [Jasper; #668517] +* Screenshots: + - Move the screenshot "flash" to the shell [Cosimo; #668618] + - Move saving screenshots to a thread [Adel; #652952] + - Correctly screenshot rounded decorations [Jasper; #662486] +* Screen recorder: + - Change the default pipeline to favor speed over quality [Owen; #669066] + - Drop frames to keep from running the user out of memory [Owen; #669066] +* Work around a slow implementation of glReadPixels() in the Intel drivers, + improving performance for screenshots and the screen recorder. + [Owen; #669065] +* Use Keywords: field in desktop files when search for applications + [Florian; #609702] +* Strip debian- when matching desktop file names [Jasper; #665647] +* Fix up various problems from CSS background size-addition + [Florian, Jasper; #668430, #633462] +* UI tweaks and behavior fixes + [Florian, Giovanni, Stefano; #643867, #666197, #664622] +* Some improvements to exported accessibility information [Alejando; #667376] +* Don't show contacts without IM information as offline [Florian; #662685] +* Don't change status from hidden to extended_away when going idle + [Florian; #642408] +* Cleanups [Emmanuele, Jasper; #662152, #669239] +* Misc bug fixes [Cosimo, Dan, Florian, Jasper, Rui, Stefano; + #633462, #643867, #662213, #662386, #662747, #665000, #665017, #665322, + #667371, #667860, #668020, #668517, #668541, #669236] + +Contributors: + Emmanuele Bassi, Giovanni Campagna, Cosimo Cecchi, Stefano Facchini, + Adel Gadllah, Rui Matos, Florian Müllner, Alejandro Piñeiro, + Jasper St. Pierre, Owen Taylor, Dan Winship + +Translations: + Daniel Mustieles [es], Timo Jyrinki [fi], Seán de Búrca [ga], + Fran Diéguez [gl], Kjartan Maraas [nb], Wouter Bolsterlee [nl], + Danishka Navin [si], Yaron Shahrabani [he], Matej Urbančič [sl], + Chao-Hsiung Liao [zh_HK, zh_TW] + +3.3.4 +===== +* https://live.gnome.org/EveryDetailMatters + - Add "browse" for labels for dash items - once a tooltip is + showing, switch to other items without a delay [Seif; #666170] + - Always scale down windows in the overview at least to 70% [Vit; #646704] + - Fix the new-workspace drop indicator sometimes getting stuck + [Stefano; #664201] + - Delay rearranging windows in the overview as long as the pointer + is over a window [Vit; #645325] +* Add a GConf => DConf migration file for overriden Mutter settings + [Florian; #667636] +* When a VPN connection is active, show that as the network icon + [Giovanni; #665115] +* Handle the "ExtendedAway" IM status as away, not offline [Guillaume; #667813] +* Improve the appearance of the labels in "Applications" [Alex; #642392] +* Adjust for GTK+ and Mutter API changes for application menu [Ryan; #668118] +* Add section label support to the application menu [Giovanni; #666681] +* Fix screenshot methods to work again [Cosimo; #667662] +* Fix several crashers related to updating workspace thumbnails [Owen; #667652] +* Fix memory management error causing gnome-shell-hotplug-sniffer to crash + [Owen; #667378] +* Build fixes [Emmanuele, Rico; #667864] +* Code cleanups [Adel; #668087] +* Misc bug fixes [Colin, Florian, Giovanni, Owen, Xavier; #633028, #658817, + #664138, #667881, #668048, #668050] + +Contributors: + Emmanuele Bassi, Giovanni Campagna, Cosimo Cecchi, Xavier Claessens, + Guillaume Desmottes, Stefano Facchini, Adel Gadllah, Alex Hultman, + Ryan Lortie, Seif Lotfy, Florian Müllner, Vit Stanislav, Owen Taylor, + Rico Tzschichholz, Colin Walters + +Translations: + Ihar Hrachyshka [be], Alexander Shopov [bg], Arash Mousavi [fa], + Jiri Grönroos, Timo Jyrinki [fi], Fran Diéguez [gl], Kjartan Maraas [nb], + Yuri Myasoedov [ru], Matej Urbančič [sl], Nguyễn Thái Ngọc Duy [vi] + +3.3.3 +===== +* https://live.gnome.org/EveryDetailMatters + - Stop flashing the window labels on actions in overview [Zan; #644861] + - Improve the look of window captions in the overview [Marc; #664487] + - Move dash tooltips beside the icon [Seif, Stefano; #666166] +* Support application menus exported from applications via new GLib API + and D-Bus protocol. [Giovanni, Colin, Matthias, Cosimo] +* For removable device prompts, show "Open with Rhythmbox], rather + than "Open with Rhythmbox Music Player' [Florian; #664561] +* Switch to activating the message tray only with a hot corner rather + than a full row of pixels, allowing mouse events to apps [Rui; #663366] +* Fully handle the case where the workspaces-only-on-primary + GSetting is set to false [Florian; #652580] +* Add support for background-size CSS property to St [Quentin; #633462] +* Port to new GJS Lang.Class framework [Giovanni; #664436] +* Finish port to GDBus [Giovanni; #664436] +* Stop using the deprecated Clutter default stage [Florian, Jasper; #664052] +* Fix bugs that kept browser plugin from working in WebKit-based browser + [Jasper; #666444] +* Fix typo that made uninstalling extensions not work [Jasper] +* Fix crash in browser plugin if shell is not run [Jürg] +* Reintroduce piscine paschal ovum [Giovanni; #666606] +* Network menu bug fixes + Giovanni; #664124, #665194, #665680, #666429, #666614] +* Misc bug fixes [Florian, Jasper, Jonny, Marina, Ron; #647587, #659272, + #664138, #665261, #666020, #666243] +* Build fixes [Owen] + +Contributors: + Jürg Billeter, Giovanni Campagna, Stefano Candori, Cosimo Cecchi, + Matthias Clasen, Zan Dobersek, Quentin Glidic, Jonny Lamb, Ryan Lortie, + Seif Lotfy, Rui Matos, Florian Müllner, Bastien Nocera, Jasper St. Pierre, + Marc Plano-Lesay, Owen Taylor, Colin Walters, Ron Yorsten, + Marina Zhurakhinskaya + +Translations: + Petr Kovar [cs], Kris Thomsen [dk], Daniel Mustieles [es], + Ville-Pekka Vainio [fi], Yaron Shahrabani [he], Luca Ferretti [it], + Hideki Yamane [ja], Žygimantas Beručka [lt], Jovan Naumovski [mk], + Kjartan Maraas [nb], "Andreas N" [nn], Lucian Adrian Grijincu [ro], + Matej Urbančič [sl], Praveen Illa [te], Muhammet Kara [tr], + Daniel Korostil [uk], Aron Xu [zh_CN] + +3.3.2 +===== +* Port D-Bus usage in the shell to GDBus [Giovanni, Marc-Antoine, Florian, + Jasper, Matthias; #648651, #658078, #663902, #663941] +* Message tray + - Add right-click option to chats to mute the conversation [Ana; #659962] + - Don't steal the focus when popping up under the pointer [Rui; #661358] +* Looking Glass + - Add alt-Tab completion [Jason; #661054] + - Show errors from extensions in the extensions tab [Jasper; #660546] + - Allow switching tabs with PageUp/PageDown + - Theme consistently with the rest of the shell [Jason; 650900] +* Extension system + - Don't try to load disabled extensions at all [Jasper; #661815, #662704] + - Enable and disable plugins in a consistent order [Jasper; #661815, #662704] + - Add options to enable/disable extensions to gnome-shell-extension-tool + [Jasper; #661815] +* Adapt to Mutter change to GSettings [Florian, Matthias; #663429] +* Allow creating a new workspace by dragging a window or launcher in the + middle of two existing ones [Jasper; #646409] +* Allow using Alt-Tab while during drag-and-drop and other operations + that grab the pointer [Adel; #660457] +* Do a better job of finding the right user to authenticate + as when showing a PolKit dialog [Matthias; #651547] +* Control the D-Bus Eval() method by the developer-tools GSetting which + is used for looking glass and screen recorder. [Jasper; #662891] +* Fix browser plugin to work under WebKit-based browser [Jasper; #663823] +* Fix certain stacking issues with alt-Tab [Jasper; #660650] +* Fixes for GLib deprecations [Jasper; #662011]p +* Fixes for GTK+ deprecations [Florian, Rico; #662245]p +* Fixes for Clutter deprecations [Jasper; #662627] +* Visual improvements and UI tweaks [Florian, Jakub, Jasper; + #662800, #658096, #662226] +* Hard-code "Home" as the name for the home dir, rather than looking + it up via GSettings; avoids schema dependency [Cosimo; #559895] +* Don't show "Switch User" on single user machines [Florian; #657011] +* Generate documentation for St toolkit [Florian] +* Improve marking of strings for translation [Matthias, Piotr; #658664] +* Networking menu bug fixes [Giovanni; #650007, #651378, #659277, #663278] +* Code cleanups and leak fixes to StTextureCache + [Jasper, Florian; #660968, #662998] +* Code cleanups [Adel, Florian, Jasper; #662238, #663584] +* Build fixes [Adel, Colin, Florian, Ming Han] +* Misc bug fixes [Adel, Florian, "Fry", Jasper, Giovanni, Ray, Rui, Stefan; + #660520, #661029, #661231, #661623, #661921, #662235, #662236, #662502, + #662394, #662799, #662969, #663175, #663277, #663815, #663891, #662967] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Piotr Drąg, Adel Gadllah, + Rui Matos, Florian Müllner, Marc-Antoine Perennou, Ana Risteska, + Jason Siefken, Jakub Steiner, Ray Strode, Jasper St. Pierre, Ming Han Teh, + Rico Tzschichholz, Colin Walters, Stefan Zwanenburg + +Translation: + Alexander Shopov [bg], Marek Černocký [cs], Mario Blättermann [de], + Kostas Papadimas [el], Bruce Cowan [en_GB], Kristjan Schmidt [eo], + Jorge González, Daniel Mustieles, Benjamín Valero Espinosa [es], + Mattias Põldaru [et], Arash Mousavi [fa], Ville-Pekka Vainio [fi], + Fran Diéguez [gl], Yaron Shahrabani [he], Hideki Yamane [ja], + Algimantas Margevičius [lt], Kjartan Maraas [nb], Daniel Nylander [se], + Matej Urbančič [sl], Praveen Illa [te], Muhammet Kara [tr], + Nguyễn Thái Ngọc Duy [vi], Cheng-Chia Tseng [zh_HK, zh_TW] + +3.2.1 +===== +* Restore the IM state on startup - if you were available in when you logged + out, then you'll be set available again when you log in. + [Florian; #65902, #661485] +* Improve searching for contacts in the overview: search more fields, + show a more meaningful name, require that all search terms match. + [Florian, Matthias; #660580] +* Improve search for applications in the overview: take frequency into + account and tweak match algorithm [Florian; #623372] +* Remove the "Show Password" switch from network password prompts, and + move the functionality to a right-click menu [Florian; #658948] +* Add context menus with Cut/Paste options to most entries [Florian; #659275] +* On screen keyboard: + - Show the keyboard immediately when it's turned enabled [Dan; #659743] + - Fix problem where keyboard would hide when starting to type + in the search entry [Nohemi; #661340] + - Fix problem with keyboard hiding when selected accented characters + [Nohemi; 661707] +* Login mode: + - Allow hitting Enter to select the first user [Ray; #657996] + - Fix flicker of a fingerprint prompt that could show up [Ray; #660492] + - Fix password bullets vanishing during login [Ray; #657894] + - Misc bug fixes and visual tweaks [Ray; #659763, #660919, #661479] +* Display a caps-lock warning in password entries [Florian; #660806] +* Show the state of installed extensions in Looking Glass [Jasper; #660494] +* Load user extensions after system ones [Jasper; #661815] +* Fix problem with many applications showing extra-large icons in + notifications [Marina; #659158] +* Fix a problem where alt-Tab had trouble tracking the current + application with certain applications such as Emacs. [Dan; #645026] +* Fix confusion between different users avatar images [Florian; #660585] +* Remove behavior where you could switch workspaces by bumping + a dragged window in the overview against a screen edge; it was + leftover and just confusing. [Florian; #660838] +* Fix long-standing bug where the Dash in the overview could end up mis-sized + and run off the screen [Florian; #649248] +* Fix automatic launching of applications when media is inserted + [Cosimo; #660821] +* Fix handling of vertically stacked monitors with NVIDIA drivers + [Florian; #661387] +* Translation marking fixes [Jasper, Wouter; #660600] +* Code cleanups and warning fixes [Adel, Dan, Florian, Jasper; + #659822, #659940, #660122, #660358, #660968, #661231] +* Small memory leak fixes [Florian, Jasper; #661231] +* Misc bug fixes [Adel, Florian, Jasper; #659274, #659861, #660166, #660310, + #660397, #660608, #660606, #660674, #660774. #660848, #661151, #661617] + +Contributors: + Wouter Bolsterlee, Cosimo Cecchi, Matthias Clasen, Nohemi Fernandez, + Adel Gadllah, Florian Müllner, Jasper St. Pierre, Ray Strode, Dan Winship, + Marina Zhurakhinskaya + +Translations: + Tiffany Antopolski [eo], Xandru Armesto [ast], Alexander Shopov, + Ivaylo Valkov [bg], Gil Forcada [ca], Carles Ferrando [ca@valencia], + Mario Blättermann, Paul Seyfert [de], Bruce Cowan [en_GB], + Jorge González, Daniel Mustieles [es], Arash Mousavi [fa], Bruno Brouard [fr], + Seán de Búrca [ga], Fran Diéguez [gl], Gabor Kelemen [hu], Luca Ferretti [it], + Takayuki Kusano [ja], Changwoo Ryu [ko], Erdal Ronahi [ku], + Algimantas Margevičius [lt], Rudolfs Mazurs [lv], Wouter Bolsterlee [nl], + Piotr Drąg [pl], Adorilson Bezerra [pt_BR], Yuri Myasoedov [ru], + Matej Urbančič [sl], Daniel Nylander [sv], Miroslav Nikolić [sr, sr@latin], + Tirumurti Vasudevan [ta], Krishnababu Krothapalli [te], Daniel Korostil [uk], + Nguyễn Thái Ngọc Duy [vi], YunQiang Su [zh_CN] + +3.2.0 +===== +* Prevent the fallback on-screen keyboard from showing up while + GNOME Shell is running [Dan, #659865] +* Disable code to reposition windows around the on-screen keyboard; + it wasn't finished or working properly. [Dan; #659643] +* Fix interaction between on-screen keyboard and notifications + [Dan; #658603] +* Fix menu-sizing problems in right-to-left locales. [Florian; #659827] +* Update chat icons in the message tray when an avatar image changes + [Marina; #659768] +* Fix problem with empty notification bubbles being left [Marina; #659862] +* Fix problem with chat notifications bouncing when new messages come in. + [Marina; #659768] +* Fix bug that was causing SIP calls to automatically be accepted in some + circumstances [Guillaume; #660084] +* Fix string that should have been marked translatable [Frédéric] +* Fix a crash that could happen during CSS transitions [Florian; #659676] +* Build fixes [Colin, Florian] + +Contributors: + Guillaume Desmottes, Florian Müllner, Frédéric Péters, Colin Walters, + Dan Winship, Marina Zhurakhinskaya + +Translations: + Friedel Wolff [af], Nilamdyuti Goswami [as], Ihar Hrachyshka [be], + Ivaylo Valkov [bg], Gil Forcada [ca], Carles Ferrando [ca@valencia], + Petr Kovar [cs], Mario Blättermann [de], Kris Thomsen [dk], + Tiffany Antopolski, Kristjan Schmidt [eo], Daniel Mustieles [es], + Inaki Larranaga Murgoitio [eu], Tommi Vainikainen [fi], Bruno Brouard [fr], + Fran Dieguez [gl], Yaron Shahrabani [he], Gabor Kelemen [hu], + Andika Triwidada [id], Jiro Matsuzawa [ja], Changwoo Ryu [ko], + Rudolfs Mazurs [lv], Aurimas Černius [lt], Kjartan Maraas [nb], + A S Alam [pa], Piotr Drąg [pl], Duarte Loreto [pt], Djavan Fagundes, + Rodolfo Ribeiro Gomes, Gabriel F. Vilar [pt_BR], Yuri Myasoedov [ru], + Daniel Nylander [se], Martin Srebotnjak [sl], Michal Štrba [sv], + Krishnababu Krothapalli, Praveen Illa [te], Cheng-Chia Tseng [zh_KH, zh_TW] + +3.1.92 +====== + +* Login screen + - Add the ability to set a logo at the top of the user list [Ray; #658062] + - Add fingerprint reader support [Ray; #657823] + - Add a power button offering the choice of Suspend/Restart/Power off + [Ray; #657822] + - Remove the option to view the current keyboad layout [Matthias; #659164] + - Make Control-Alt-Tab work for full keyboard access [Ray; #659177] +* Frequently initiate a full garbage collection; Spidermonkey isn't very good + at tracking the amount of resources we have allocated so this hopefully will + improve memory usage without affecting performance too much [Colin; #659254] +* Stop adding a notification when the network connection is lost + [Colin; #658954] +* When disabling notifications; display a notification + "Your chat status will be set to busy" [Florian; #652718] +* Fix keynav in network dialogs [Florian; #659133] +* Improve calendar styling [Sean; #641135, #651299] +* Shrink padding around panel buttons for narrow screens [Dan; #651299] +* Allow enabling the onscreen keyboard through the accessibility menu + [Dan; #612662] +* Fix problem that was causing VPN secret dialogs to be delayed before showing + [Florian; #658484] +* Make custom-keybindings for the window switcher that don't use alt + work correctly [Florian; #645200] +* Fix duplicate application icons in the Activities Overview [Colin; #659351] +* Bug fixes for dimming windows with attached modal dialogs + [Jasper, Owen; #659302, 659634] +* Add build-time support for BROWSER_PLUGIN_DIR environment variable + [Vincent; #659123] +* Build fixes [Vincent; #659194] +* Code cleanups and test cases + [Adel, Dan, Florian, Jasper; #651299, #658092, #658939] +* Misc bug fixes + [Adel, Colin, Cosimo, Dan, Florian, Giovanni, Jasper, Ray, Xavier; + #651299, #652837, #657249, #658004, #658150, #658239, #658469, #658598, + #658605, #659050, #659159, #659210, #659270, #659370, #659633] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Xavier Claessens, Matthias Clasen, + Rui Matos, Florian Müllner, Jasper St. Pierre, Owen Taylor, + Vincent Untz, Colin Walters, Sean Wilson, Dan Winship + +Translations: + Ihar Hrachyshka [be], Alexander Shopov, Ivaylo Valkov [bg], + Mario Blättermann [de], Jorge González, Daniel Mustieles [es], + Arash Mousavi [fa], Ville-Pekka Vainio [fi], Fran Dieguez [gl], + Sweta Kothari [gu], Gabor Kelemen [hu], Jiro Matsuzawa [ja], + Luca Ferretti [it], Rudolfs Mazurs [lv], Kjartan Maraas [nb], A S Alam [pa], + Piotr Drąg [pl], Duarte Loreto [pt], Yuri Myasoedov [ru], + Daniel Nylander [se], Matej Urbančič [sl], Miroslav Nikolić [sr, sr@latin], + Michal Štrba [sv], Tirumurti Vasudevan [ta], Phương Lê Hoàng [vi], + Aron Xu [zh_CN], Chao-Hsiung Liao [zh_HK, zh_TW] + +3.1.91.1 +======== + +* Add a browser plugin - this plugin, tied to extensions.gnome.org, + allows users to download and install shell extensions, and enable, + disable, and uninstall extensions they already have installed. + [Jasper; #658070, #658612] +* Improve adding links to URLs in notifications [Dan; #636252] +* Remove "connection lost" notifications after reconnecting [Giovanni; #658049] +* Hide the onscreen keyboard when leaving a text entry [Dan; #658591] +* Fixes for translated strings [Florian; #639987, #644097, #645037] +* Bug fixes for network menu [Florian; #658492] +* Code cleanup [Dan; #646934] +* Build fixes [Javier, Rico] +* Misc bug fixes [Emmanuele, Florian, Jasper, Marina, Matthias, Ray; + #652837, #658423, #658503, #658525, #658562, #658624, #658640, #658983] + +Conributors: + Emmanuele Bassi, Giovanni Campagna, Matthias Clasen, Javier Jardón, + Florian Muellner, Jasper St. Pierre, Ray Strode, Rico Tzschichholz, + Dan Winship, Marina Zhurakhinskaya + +Translations: + Ihar Hrachyshka [be], Bruce Cowan [en_GB], Jorge González, + Daniel Mustieles [es], Timo Jyrinki [fi], Bruno Brouard, Luc Guillemin, + Claude Paroz, Luc Pionchon [fr], Fran Dieguez [gl], Rajesh Ranjan [hi], + Andika Triwidada [id], Luca Ferretti [it], Changwoo Ryu [ko], + Rudolfs Mazurs [lt], Kjartan Maraas [nb], Manoj Kumar Giri [or], + A S Alam [pa], Piotr Drąg [pl], Duarte Loreto [pt], Henrique P. Machado, + Gabriel F. Vilar [pt_BR], Daniel Nylander [se], Matej Urbančič [sl], + Tirumurti Vasudevan [ta], Yinghua Wang [zh_CN], + Chao-Hsiung Liao [zh_HK, zh_TW] + +3.1.91 +====== + +* Fix problem with applications vanishing from alt-Tab when + desktop files change. [Colin; #657990] +* Fix interaction of on-screen keyboard with run-dialog and + Looking Glass console [Dan; #657986] +* Add public API for adding and removing search providers + [Philippe; #657548, #658113] +* Allow changing IM status with scroll wheel [Florian; #657973] +* Limit volume slider to 100% [Bastien; #657607] +* Change "Do Not Disturb" to "Notifications" in user menu [Florian; #652718] +* Switch browser in default favorites to Epiphany [Colin; #650616] +* Misc bug fixes [Dan, Florian, Jasper, Marc-Antoine, Rui; + #649631, #655069, #656142, #657703, #657759, #658007, #658065, #658176] + +Contributors: + Rui Matos, Florian Müllner, Philippe Normand, Marc-Antoine Perennou, + Jasper St. Pierre, Colin Walters, Dan Winship + +Translations: + Ihar Hrachyshka [be], Mario Blättermann [de], Kris Thomsen [da], + Jorge González [es], Arash Mousavi [fa], Fran Dieguez [gl], + Takayuki Kusano [ja],Aurimas Černius [lt], Kjartan Maraas [nb], A S Alam [pa], + Stas Solovey [ru], Daniel Nylander [se], Tirumurti Vasudevan [ta], + Chao-Hsiung Liao [zh_HK, zh_TW] + +3.1.90.1 +======== + +* Fix typo that was breaking the "Login Screen" mode [Marc-Antoine] +* Fix build with new gobject-introspection [Dan] +* Use a better icon for removable devices [Cosimo; #657757] +* Add support for asynchronous search provides [Philippe, Jasper, Seif; #655220] +* Misc bug fixes [Alex, Guillaume, Jasper; #657657, #657696] +* Misc build fixes [Adel; #657697] + +Contributors: + Cosimo Cecchi, Guillaume Desmottes, Adel Gadllah, Alexander Larsson, Seif Lotfy, + Philippe Normand, Marc-Antoine Perennou, Jasper St. Pierre, Dan Winship + +Translations: + Jorge González, Daniel Mustieles [es], Stas Solovey [ru] + +3.1.90 +====== +* Add an on-screen keyboard that uses Caribou as a backend + [Nohemi, Dan; #612662] +* Allow searching for people in the overview using libfolks + as the backend [Morten; #643018] +* Add a "Login Screen" mode to be used when GDM is running; this + mode has a stripped down user interface, and also contains the + code to display the user list and authentication. [Ray; #657082] +* Rework user menu to separate out "Do Not Disturb" from the IM + status and to visually match GNOME Contacts. [Florian; #652837] +* Implement displaying images such as cover-art in notifications + [Neha, Marina; #621009] +* Support default actions for notifications [Florian; #655818] +* Networking + - Stop using nm-applet for dialogs; do them as proper system modal + dialogs in the shell code. [Giovanni; #650244] + - Fix handling of hidden access points [Giovanni; #646454] +* Telepathy integration + - Support subscription requests [Guillaume, Xavier; #653941] + - Notify on account connection errors [Alban, Jasper, Xavier; #654159] + - Allow approving file transfers [Guillaume; #653940] + - Improve styling of messages [Jasper; #640271] +* Extension system [Jasper; #654770] + - Support live enabling and disabling of extensions + - Add the ability to install extensions from HTTP + - Enhance D-Bus interface for controlling extensions + - Collect errors separately for each extension +* Add Main.panel.addToStatusArea for extension convenience + [Giovanni, Jasper, Marc-Antoine; #653205] +* Port to the new gnome-menus API. Clean up and speed up + application information loading [Colin; #648149, #656546] +* Use the accountsservice library rather than cut-and-pasted GDM code + [Florian; #650893] +* Add a D-Bus interface to take a screenshot; this will avoid various race + conditions with the current gnome-screenshot approach [Adel; #652952] +* Show numeric indicators to distinguish duplicate keyboard names + [Giovanni; #650128] +* Add GNOME Documents to the favorites list [Adel; #657520] +* Update the clock immediately on resume from suspend [Colin; #656403] +* Remove animation support from StAdjustment [Ray; #657082] +* Support configuration of calendar applications via gsettings + [Tassilo; #651190] +* Don't fade in alt-Tab - wait a bit and show it instantly [Rui; #652346] +* Darken workspace background on all workspaces [Rui; #656433] +* Improve detection of the starting day of the week [Florian; #649078] +* Add StButtonAccessible [Alejandro] +* Visual tweaks to match mockups + [Allan, Dan, Jasper, Marina; #640271, #655627, #655428, #656732] +* Misc bug fixes [Dan, Florian, Giovanni, Guillaume, Jasper, Jeremy, Rui; + #645708, #646761, #653119, #654398, #656125, #654707, #654898, #654638, + #656335, #657111] +* Code cleanups [Colin, Dan, Guillaume, Ray; + #652718, #654639, #648651, #655813, #657082] +* String tweaks [Jasper, Jeremy; #652984, #640271] +* Build fixes [Jasper, Nohemi; #644275, #655812] + +Contributors: + Jeremy Bicha, Giovanni Campagna, Xavier Claessens, Alban Crequy, + Guillaume Desmottes, Allan Day, Neha Doijode, Nohemi Fernandez, + Tassilo Horn, Rui Matos, Morten Mjelva, Florian Müllner, Alejandro Piñeiro, + Jasper St. Pierre, Ray Strode, Colin Walters, Dan Winship, + Marina Zhurakhinskaya + +Translations: + Ivaylo Valkov [bg], Mario Blättermann [de], Diego Escalante Urrelo, + Jorge González, Daniel Mustieles [es], Arash Mousavi [fa], Fran Dieguez [gl], + Yaron Shahrabani [he], Andika Triwidada, Wibiharto [id], + Aurimas Černius [lt], Umarzuki Bin Mochlis Moktar [ml], Kjartan Maraas [nb], + A S Alam [pa], Daniel Nylander [se], Ngô Chin, Nguyễn Thái Ngọc Duy [vi], + Aron Xu [zh_CN], Chao-Hsiung Liao [zh_HK, zh_TW] + +3.1.4 +===== +* Take over inserted media handling and autorun from gnome-session [Cosimo] +* Message Tray + - Display a count of unread notifications on icons + [Jasper, Guillaume; #649356, #654139] + - Only remove icons when the sender quits from D-Bus, not when it + closes its last window [Neha, Marina; #645764] + - Solve problems switching chats between shell and Empathy + [Guillaume; #654237] + - Fix handling of bad GMarkup in messages [Dan; #650298] + - Never show notifications when the screensaver is active [Dan; #654550] +* Telepathy integrationpp + - Implement Telepathy Debug interface to enable empathy-debugger + [Guillaume; #652816] + - Allow approving room invitations, and audio/video calls + [Guillaume; #653740 #653939] + - Send typing notifications [Jonny; #650196] +* Fix selection highlighting for light-on-dark entries [Jasper; #643768] +* Make control-Return in the overview open a new window [Maxim] +* Delay showing the alt-Tab switcher to reduce visual noise when + flipping betweeen windows [Dan; #652346] +* When we have vertically stacked monitors, put the message tray + on the bottom one [Dan; #636963] +* Fix various problems with keynav and the Activities button + [Dan; #641253 #645759] +* Ensure screensaver is locked when switching users [Colin; #654565] +* Improve extension creation tool [Jasper; #653206] +* Fix compatibility with latest GJS [Giovanni; #654349] +* Code cleanups [Adel, Dan, Jasper; #645759 #654577 #654791 #654987] +* Misc bug fixes [Richard, Dan, Florian, Giovanni, Jasper, Marc-Antoine, Rui; + #647175 #649513 #650452 #651082 #653700 #653989 #654105 #654791 #654267 + #654269 #654527 #655446] +* Build fixes [Florian, Siegfried; #654300] + +Contributors: + Giovanni Campagna, Cosimo Cecchi, Guillaume Desmottes, Neha Doijode, + Maxim Ermilov, Adel Gadllah, Siegfried-Angel Gevatter Pujals, Richard Hughes, + Jonny Lamb, Rui Matos, Florian Müllner, Marc-Antoine Perennou, Colin Walters, + Dan Winship, Marina Zhurakhinskaya + +Translations: + Mario Blättermann, Paul Seyfert [de], Jorge González, Daniel Mustieles [es], + Fran Dieguez [gl], Yaron Shahrabani [he], Luca Ferretti [it], + Rudolfs Mazurs [lv], Kjartan Maraas [nb], A S Alam [pa], Yuri Kozlov [ru], + Michal Štrba, Matej Urbančič [sl] + +3.1.3 +===== +* Fix problem with "user theme extension" breaking the CSS for other + extensions [Giovanni; #650971] +* Telepathy IM framework integration + - Switch to using telepathy-glib rather than talking to + Telepathy via D-Bus [Guillaume, Jasper; #645585, #649633, #651138, #651227] + - Acknowledge messages when the user clicks on them [Guillaume, #647893] + - Fix problem with telepathy icon blinking for incoming messages + even though the user has been notified of them [Guillaume; #643594] +* Networking + - keep wirelesss networks in predictable order [Giovanni; #646580, #652313] + - Show unmanaged devices in the menu [Giovanni; #646946] + - Fix overflow when too many VPN connections [Giovanni; #651602] +* Bluetooth + - Show "hardware disabled" when disabled by rfkill [Giovanni; #648048] + - Fix bug updating status of devices [Giovanni; #647565] +* LookingGlass console: + - Add a "Memory" tab [Colin; #650692] + - Make escape work from any page [Dan Winship; #647303] + - Provide a way to refer to panel items as, e.g., + Main.panel._activities [Dan Winship; #646915] +* User menu + - Fix problem with suspend menu option locking the screen even when the user + disabled that. [Florian; #652327] + - Hide "power off..." option if shutdown is disabled via PolicyKit + [Florian; #652038] +* Track changes to WM_CLASS (fixes problems with LibreOffice tracking) + [Colin; #649315] +* Remove app tracking workarounds for Firefox and LibreOffice [Colin; #651015] +* Use upstream gettext autoconfigury rather than glib version [Javier; #631576] +* Show messages in the message tray when an application is fullscreen + [Dan Winship; #608667] +* Don't autohide the workspace pager if there is more than one workspace + [Florian; #652714, #653078, #653142] +* Don't always slide out the workspace pager at drag begin [Florian; #652730] +* Only offer to remove a favorite app when dragging it's icon [Owen; #642895] +* Allow dropping an icon anywhere on a workspace [Adel; #652079] +* st-scroll-view: Make the fade effect and offset themable [Jasper; #651813] +* Obey the user's preference when running an application in a terminal + from the run dialog [Florian; #648422] +* Consistently exit overview when launching external applications + [Colin; #653095] +* Adapt to changes in GJS for how GObject APIs are bound + [Alex, Colin, Florian, Jasper, Marc-Antoine; #649981, #652597] +* Fix problems with scrolling in overflow for alt-Tab switcher + [Dan Winship, Adel; #647807] +* Mark relationships between labels and actors for accessibility [Alejandro] +* Add org.gnome.shell.enabled-extensions complementing disabled-extensions + GSetting [Tassilo; #651088] +* Visual tweaks [Jakub, Jasper; #646261, #652715] +* Switch to building against clutter-1.7 with independent Cogl [Adel; #653397] +* Code cleanups [Colin, Dan Winship, Florian; #633620, #645031, #648755, #648758, + #648760, #649203, #649517, #650317, #652730] +* Memory leak fixes [Colin, Maxim; #649508, #650934] +* Build Fixes [Colin, Dan Winship, Florian, Ionut, Morten, Owen, Sean; #647395, + #648006, #650869, #653199, #653275 +* Miscellaneous bug fixes [Adam, Adel, Dan Williams, Dan Winship, Florian, + Ionut, Jasper, Maxim, Ray; #620105, #639459, #641570, #642793, #643513, + #645848, #646919, #647186, #648305, #648410, #648562, #648894, #649001, + #645990, #647893, #647907, #651012, #651086, #651606, #651569, #651866, + #652388, #653511] + +Contributors: + Ionut Biru, Giovanni Campagna, Guillaume Desmottes, Adam Dingle, + Maxim Ermilov, Adel Gadllah, Tassilo Horn, Javier Jardón, Jonny Lamb, + Alexander Larsson, Rui Matos, Morten Mjelva, Florian Müllner, + Marc-Antoine Perennou, Alejandro Piñeiro, Jasper St. Pierre, Jakub Steiner, + Ray Strode, Owen Taylor, Colin Walters, Dan Williams, Sean Wilson, Dan Winship + +Translations: + Daniel Martinez Cucalon [ar], Ihar Hrachyshka [be], Carles Ferrando, + Gil Forcada, Sílvia Miranda [ca], Kristjan Schmidt [eo], Jorge González, + Daniel Mustieles [es], Seán de Búrca [ga], Fran Diéguez [gl], + Yaron Shahrabani [he], Kjartan Maraas [nb], Misha Shnurapet, + Yuri Myasoedov [ru], Daniel Nylander [se], Peter Mráz [sk], + Matej Urbančič [sl], Krishnababu Krothapalli [te], Daniel Korostil [uk], + Aron Xu [zh_CN] + +3.0.2 +===== +* Network Menu [Dan Williams] + - Fix connecting to WPA2 Enterprise access points + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=648171 + - Show the mobile broadband wizard when selecting 3G network + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=649318 + - Miscellaneous bug fixes + 648648, 650124 +* Fix duplicate icons in the application browser [Owen] + https://bugzilla.gnome.org/show_bug.cgi?id=648739 +* Make clicking anywhere on the volume icon slider work [Giovanni] + https://bugzilla.gnome.org/show_bug.cgi?id=646660 +* Fix a case where activating and clicking the hot corner + at the same time could result in immediately leaving the + overview [Rui] + https://bugzilla.gnome.org/show_bug.cgi?id=649427 +* Fix a case where applications became misordered in Alt-Tab [Jasper] + https://bugzilla.gnome.org/show_bug.cgi?id=643302 +* Fix a bug where messages you send could show up in + notifications as if someone else sent them [Jonny] + https://bugzilla.gnome.org/show_bug.cgi?id=650219 +* Memory leak fixes [Colin, Maxim] + 642652, 649508, 649497 +* Miscellaneous minor bug fixes [Adel, Christopher, Jasper] + 649596, 648765, 648983, 649632 + +Contributors: + Christopher Aillon, Giovanni Campagna, Maxim Ermilov, + Adel Gadllah, Jonny Lamb, Rui Matos, Jasper St. Pierre, + Owen Taylor, Colin Walters, Dan Williams + +Translations: + Arash Mousavi [fa], Seán de Búrca [ga], Timo Jyrinki [fi], + Sigurd Gartmann [nb], Daniel Nylander [se], Peter Mráz [sl], + Abduxukur Abdurixit [ug], Nguyễn Thái Ngọc Duy [vi] + +3.0.1 +===== + +* Network menu + - Fix problems updating the menu for mobile broadband devices [Giovanni] + https://bugzilla.gnome.org/show_bug.cgi?id=646395 + - Fix missing device descriptions with multiple devices of the + same type [Giovanni] + https://bugzilla.gnome.org/show_bug.cgi?id=646074 + - Label ad-hoc neworks with an appropriate icon [Dan] + https://bugzilla.gnome.org/show_bug.cgi?id=646141 + - Fix displaying some devices states as "invalid" [Dan] + https://bugzilla.gnome.org/show_bug.cgi?id=646946 + - Fix problems with access points that don't report a SSID [Giovanni] + https://bugzilla.gnome.org/show_bug.cgi?id=647040 + - Miscellaneous minor bug fixes [Dan, Giovanni, Owen] + 645981, 646558, 646443, 646708, 646968 +* Application menu and icon + - Fix bug where application menu icon was missing at GNOME Shell + startup. [Florian] + https://bugzilla.gnome.org/show_bug.cgi?id=644122 + - Fix missing application menu for dialog windows [Colin] + https://bugzilla.gnome.org/show_bug.cgi?id=647082 + - When launching an application through an alternate launcher + (like for a System Settings pane), association the windows with + the application, not the launcher. [Colin] + https://bugzilla.gnome.org/show_bug.cgi?id=646689 +* Activities overview + - Load the applications view incrementally to avoid potentially freezing + for multiple seconds [Colin] + https://bugzilla.gnome.org/show_bug.cgi?id=647778 + - Fix bug where package installation while the overview + was up could result in a corrupted application display. [Giovanni] + https://bugzilla.gnome.org/show_bug.cgi?id=645801 + - Fix dragging from the search results to launch apps and docs [Florian] + https://bugzilla.gnome.org/show_bug.cgi?id=645990 + - Fix flickering of selection when searching in the overview [Florian] + https://bugzilla.gnome.org/show_bug.cgi?id=646019 + - Fix bug when typing into the search box when text was already + selected [Nohemi] + https://bugzilla.gnome.org/show_bug.cgi?id=636341 +* Fix layout of notifications for right-to-left languages [Florian] + https://bugzilla.gnome.org/show_bug.cgi?id=646921 +* Remove a confusing special case where Alt-Tab sometimes switched + to a different window of the same application rather than to + a different application. [Rui] + https://bugzilla.gnome.org/show_bug.cgi?id=648132 +* Fix a crash that could happen when a window was opened on a + workspace that was immediately removed [Dan] + https://bugzilla.gnome.org/show_bug.cgi?id=648132 +* Fix keyboard navigation in logout/reboot dialogs [Dan] + https://bugzilla.gnome.org/show_bug.cgi?id=646740 +* Fix missing inspector icon in Looking Glass console [Dan] +* Miscellaneous minor bug fixes [Adel, Colin, Dan, Florian, Nohemi] + 645648, 646205, 646257, 646855, 647098, 646730 + +Contributors: + Giovanni Campagna, Nohemi Fernandez, Adel Gadllah, Rui Matos, Florian Müllner, + Owen Taylor, Colin Walters, Dan Winship + +Translations: + Hendrik Richter [de], Jorge González [es], Arash Mousavi [fa], + Fran Diéguez [gl], Jiro Matsuzawa [ja], Piotr Drąg [pl], Daniel Nylander [sv], + Sira Nokyoongtong [th], Muhammet Kara [tr], Nguyễn Thái Ngọc Duy [vi], + Aron Xu [zh_CN], Chao-Hsiung Liao [zh_HK, zh_TW] + +3.0.0.2 +======= + +* Fix missing import that was preventing extensions from loading. + [Maxim Ermilov] + https://bugzilla.gnome.org/show_bug.cgi?id=646333 + +Translations: + Timo Jyrinki [fi] + +3.0.0.1 +======= + +* Fix problem with stuck event handling if network menu pops down while + user is using the scrollbar. [Owen Taylor] + https://bugzilla.gnome.org/show_bug.cgi?id=646825 + +Contributors to GNOME Shell 3.0 +=============================== + +Code: + + Josh Adams, Kiyoshi Aman, Nuno Araujo, Emmanuele Bassi, Dirk-Jan C. Binnema, + Wouter Bolsterlee, Raphael Bosshard, Milan Bouchet-Valat, Christina Boumpouka, + Mathieu Bridon, Alban Browaeys, Phil Bull, Micro Cai, Giovanni Campagna, + Cosimo Cecchi, Tor-björn Claesson, Matthias Clasen, Jason D. Clinton, + Frederic Crozat, Guillaume Desmottes, Sander Dijkhuis, Neha Doijode, + Maxim Ermilov, Diego Escalante Urrelo, Luca Ferretti, Steve Frécinaux, + Takao Fujiwara, Adel Gadllah, Vadim Girlin, Nick Glynn, Guido Günther, + Leon Handreke, Lex Hider, Richard Hughes, Javier Jardón, Abderrahim Kitouni, + Andre Klapper, Alexander Larsson, Nickolas Lloyd, Ryan Lortie, Kjartan Maraas, + Koop Mast, Rui Matos, Jonathan Matthew, William Jon McCann, Morten Mjelva, + Federico Mena Quintero, Florian Müllner, Jon Nettleton, Hellyna Ng, + Discardi Nicola, Carlos Martín Nieto, Bastien Nocera, Bill Nottingham, + Matt Novenstern, Marc-Antoine Perennou, Neil Perry, Frédéric Péters, + Alejandro Piñeiro, Siegfried-Angel Gevatter Pujals, "res", Neil Roberts, + "Sardem FF7", Florian Scandella, Joseph Scheuhammer, Christian Schramm, + Gustavo Noronha Silva, Jasper St. Pierre, Eric Springer, Jakub Steiner, + Jonathan Strander, Ray Strode, Owen Taylor, Rico Tzschichholz, + Sergey V. Udaltsov, Daiki Ueno, Vincent Untz, Marcelo Jorge Vieira, + Mads Villadsen, Colin Walters, Dan Winship, William Wolf, Thomas Wood, + Pierre Yager, David Zeuthen, Marina Zhurakhinskaya + +Design: + + Allan Day, William Jon McCann, Jeremy Perry, Jakub Steiner + 2008 Boston GNOME design hackfest participants (especially Neil J. Patel + for turning the resulting sketches into our first mockups.) + Everybody on irc.gnome.org:#gnome-design + +Translations: + + Friedel Wolff (af), Khaled Hosny (ar), Ivaylo Valkov (bg), Jamil Ahmed (bn) + Runa Bhattacharjee (bn_IN), Gil Forcada, Siegfried-Angel Gevatter Pujals, + Jordi Serratosa (ca), Andre Klapper, Petr Kovar (cs), Kenneth Nielsen, + Kris Thomsen (da), Mario Blättermann, Hendrik Brandt, Christian Kirbach, + Hendrik Richter, Wolfgang Stöggl (de), Michael Kotsarinis, Kostas Papadimas, + Jennie Petoumenou, Sterios Prosiniklis, Fotis Tsamis, Simos Xenitellis (el), + Bruce Cowan, Philip Withnall (en_GB), Jorge Gonzalez, Daniel Mustieles (es), + Mattias Põldaru, Ivar Smolin (et), Inaki Larranaga Murgoitio (eu), + Mahyar Moghimi (fa), Timo Jyrinki (fi), Cyril Arnaud, Bruno Brouard, + Pablo Martin-Gomez, Claude Paroz, Frédéric Peters (fr), Seán de Búrca (ga) + Francisco Diéguez, Antón Méixome (gl), Sweta Kothari (gu), Liel Fridman, + Yaron Shahrabani (he), Rajesh Ranjan (hi), Gabor Kelemen (hu), Milo Casagrande, + Luca Ferretti (it), Dirgita, Andika Triwidada (id), Takayuki KUSANO, + Takayoshi OKANO, Kiyotaka NISHIBORI, Futoshi NISHIO (ja), Shankar Prasad (kn), + Young-Ho Cha, Changwoo Ryu (ko), Žygimantas Beručka, Gintautas Miliauskas (lt), + Rudolfs Mazurs (lv), Sandeep Shedmake (mr), Kjartan Maraas (nb), + Wouter Bolsterlee, Sander Dijkhuis, Reinout van Schouwen (nl), + Torstein Winterseth (nn), A S Alam (pa), Tomasz Dominikowski, Piotr Drąg (pl), + Duarte Loreto (pt), Felipe Borges, Rodrigo Padula de Oliveira, + Rodrigo L. M. Flores, Amanda Magalhães, Og B. Maciel, Gabriel F. Vilar, + Jonh Wendell (pt_BR), Lucian Adrian Grijincu, Daniel Șerbănescu (ro), + Sergey V. Kovylov, Andrey Korzinev, Yuri Myasoedov, Marina Zhurakhinskaya (ru), + Daniel Nylander (se), Matej Urbančič, Andrej Žnidaršič (sl), + Miloš Popović (sr, sr@latin), Miroslav Nikolić (sr), Tirumurti Vasudevan (ta), + Sira Nokyoongtong (th), Baris Cicek (tr), Abduxukur Abdurixit, + Gheyret T. Kenji (ug), Maxim V. Dziumanenko, Daniel Korostil (uk), + Nguyễn Thái Ngọc Duy (vi), Jessica Ban, 'jiero', Wei Li, YunQiang Su, Ray Wang, + Aron Xu (zh_CN), Chao-Hsiung Liao (zh_HK, zh_TW) diff --git a/README.md b/README.md new file mode 100644 index 0000000..a6bbb0a --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# GNOME Shell +GNOME Shell provides core user interface functions for the GNOME 3 desktop, +like switching to windows and launching applications. GNOME Shell takes +advantage of the capabilities of modern graphics hardware and introduces +innovative user interface concepts to provide a visually attractive and +easy to use experience. + +For more information about GNOME Shell, including instructions on how +to build GNOME Shell from source and how to get involved with the project, +see the [project wiki][project-wiki]. + +Bugs should be reported to the GNOME [bug tracking system][bug-tracker]. + +## Contributing + +To contribute, open merge requests at https://gitlab.gnome.org/GNOME/gnome-shell. + +Commit messages should follow the [GNOME commit message +guidelines](https://wiki.gnome.org/Git/CommitMessages). We require an URL +to either an issue or a merge request in each commit. + +## License +GNOME Shell is distributed under the terms of the GNU General Public License, +version 2 or later. See the [COPYING][license] file for details. + +[project-wiki]: https://wiki.gnome.org/Projects/GnomeShell +[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues +[license]: COPYING diff --git a/README.mdwn b/README.mdwn new file mode 100644 index 0000000..0eb54bc --- /dev/null +++ b/README.mdwn @@ -0,0 +1,40 @@ +cldr2json +========= + +This script converts Unicode CLDR android keyboard layouts to JSON usable by +GNOME Shell. + +CLDR keyboard layouts can be found at + + + +Usage +===== + + ./cldr2json + +example: + + ./cldr2json cldr/keyboards/android/ json_layouts/ + + +Keyboard layout mapping +======================= + +Unicode CLDR layout identifiers are language codes, while XKB layout +identifiers are... something else. The mapping between the two currently uses +heuristic based on the layout descriptions, in this order: + +- if the CLDR layout description matches an XKB layout description, chose its + XKB identifier +- if one word of the CLDR layout description matches an XKB layout + description, chose its XKB identifier +- if the CLDR layout description matches one word of an XKB layout description, + chose its XKB identifier + +That doesn't always work. For instance it fails for "en" language, that should +match "us" XKB identifier. For such cases, there is a mapping in +LOCALE_TO_XKB_OVERRIDES at the top of the script. If you discover a weird +mapping of if you get a "failed to find XKB mapping for " warning then +please consider adding an override there. + diff --git a/cldr2json.py b/cldr2json.py new file mode 100755 index 0000000..360030b --- /dev/null +++ b/cldr2json.py @@ -0,0 +1,208 @@ +#!/usr/bin/python3 +# +# Copyright 2015 Daiki Ueno +# 2016 Parag Nemade +# 2017 Alan +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, see +# . + +import glob +import json +import locale +import logging +import os +import re +import sys +import xml.etree.ElementTree + +import gi +gi.require_version('GnomeDesktop', '3.0') # NOQA: E402 +from gi.repository import GnomeDesktop + +ESCAPE_PATTERN = re.compile(r'\\u\{([0-9A-Fa-f]+?)\}') +ISO_PATTERN = re.compile(r'[A-E]([0-9]+)') + +LOCALE_TO_XKB_OVERRIDES = { + 'af': 'za', + 'en': 'us', + 'en-GB': 'uk', + 'es-US': 'latam', + 'fr-CA': 'ca', + 'hi': 'in+bolnagri', + 'ky': 'kg', + 'nl-BE': 'be', + 'zu': None +} + + +def parse_single_key(value): + def unescape(m): + return chr(int(m.group(1), 16)) + value = ESCAPE_PATTERN.sub(unescape, value) + return value + + +def parse_rows(keymap): + unsorted_rows = {} + for _map in keymap.iter('map'): + value = _map.get('to') + key = [parse_single_key(value)] + iso = _map.get('iso') + if not ISO_PATTERN.match(iso): + sys.stderr.write('invalid ISO key name: %s\n' % iso) + continue + if not iso[0] in unsorted_rows: + unsorted_rows[iso[0]] = [] + unsorted_rows[iso[0]].append((int(iso[1:]), key)) + # add subkeys + longPress = _map.get('longPress') + if longPress: + for value in longPress.split(' '): + subkey = parse_single_key(value) + key.append(subkey) + + rows = [] + for k, v in sorted(list(unsorted_rows.items()), + key=lambda x: x[0], + reverse=True): + row = [] + for key in sorted(v, key=lambda x: x): + row.append(key[1]) + rows.append(row) + + return rows + + +def convert_xml(tree): + root = {} + for xml_keyboard in tree.iter("keyboard"): + locale_full = xml_keyboard.get("locale") + locale, sep, end = locale_full.partition("-t-") + root["locale"] = locale + for xml_name in tree.iter("name"): + name = xml_name.get("value") + root["name"] = name + root["levels"] = [] + # parse levels + for index, keymap in enumerate(tree.iter('keyMap')): + # FIXME: heuristics here + modifiers = keymap.get('modifiers') + if not modifiers: + mode = 'default' + modifiers = '' + elif 'shift' in modifiers.split(' '): + mode = 'latched' + modifiers = 'shift' + else: + mode = 'locked' + level = {} + level["level"] = modifiers + level["mode"] = mode + level["rows"] = parse_rows(keymap) + root["levels"].append(level) + return root + + +def locale_to_xkb(locale, name): + if locale in sorted(LOCALE_TO_XKB_OVERRIDES.keys()): + xkb = LOCALE_TO_XKB_OVERRIDES[locale] + logging.debug("override for %s → %s", + locale, xkb) + if xkb: + return xkb + else: + raise KeyError("layout %s explicitely disabled in overrides" + % locale) + xkb_names = sorted(name_to_xkb.keys()) + if name in xkb_names: + return name_to_xkb[name] + else: + logging.debug("name %s failed" % name) + for sub_name in name.split(' '): + if sub_name in xkb_names: + xkb = name_to_xkb[sub_name] + logging.debug("dumb mapping failed but match with locale word: " + "%s (%s) → %s (%s)", + locale, name, xkb, sub_name) + return xkb + else: + logging.debug("sub_name failed") + for xkb_name in xkb_names: + for xkb_sub_name in xkb_name.split(' '): + if xkb_sub_name.strip('()') == name: + xkb = name_to_xkb[xkb_name] + logging.debug("dumb mapping failed but match with xkb word: " + "%s (%s) → %s (%s)", + locale, name, xkb, xkb_name) + return xkb + raise KeyError("failed to find XKB mapping for %s" % locale) + + +def convert_file(source_file, destination_path): + logging.info("Parsing %s", source_file) + + itree = xml.etree.ElementTree.ElementTree() + itree.parse(source_file) + + root = convert_xml(itree) + + try: + xkb_name = locale_to_xkb(root["locale"], root["name"]) + except KeyError as e: + logging.warn(e) + return False + destination_file = os.path.join(destination_path, xkb_name + ".json") + + with open(destination_file, 'w', encoding="utf-8") as dest_fd: + json.dump(root, dest_fd, ensure_ascii=False, indent=2, sort_keys=True) + + logging.debug("written %s", destination_file) + + +def load_xkb_mappings(): + xkb = GnomeDesktop.XkbInfo() + layouts = xkb.get_all_layouts() + name_to_xkb = {} + + for layout in layouts: + name = xkb.get_layout_info(layout).display_name + name_to_xkb[name] = layout + + return name_to_xkb + + +locale.setlocale(locale.LC_ALL, "C") +name_to_xkb = load_xkb_mappings() + + +if __name__ == "__main__": + if "DEBUG" in os.environ: + logging.basicConfig(level=logging.DEBUG) + + if len(sys.argv) < 2: + print("supply a CLDR keyboard file") + sys.exit(1) + + if len(sys.argv) < 3: + print("supply an output directory") + sys.exit(1) + + source = sys.argv[1] + destination = sys.argv[2] + if os.path.isfile(source): + convert_file(source, destination) + elif os.path.isdir(source): + for path in glob.glob(source + "/*-t-k0-android.xml"): + convert_file(path, destination) diff --git a/config.h.meson b/config.h.meson new file mode 100644 index 0000000..141b224 --- /dev/null +++ b/config.h.meson @@ -0,0 +1,32 @@ +/* The prefix for our gettext translation domains. */ +#mesondefine GETTEXT_PACKAGE + +/* Version number of package */ +#mesondefine VERSION + +/* Version number of package */ +#mesondefine PACKAGE_VERSION + +/* Define to 1 if you have the `fdwalk' function. */ +#mesondefine HAVE_FDWALK + +/* Define to 1 if you have the `mallinfo' function. */ +#mesondefine HAVE_MALLINFO + +/* Define to 1 fi you have the header file. */ +#mesondefine HAVE_SYS_RESOURCE_H + +/* Define if we have NetworkManager */ +#mesondefine HAVE_NETWORKMANAGER + +/* Define if we have systemd */ +#mesondefine HAVE_SYSTEMD + +/* Define if _NL_TIME_FIRST_WEEKDATE is available */ +#mesondefine HAVE__NL_TIME_FIRST_WEEKDAY + +/* Define if you have the `g_desktop_app_info_launch_uris_as_manager_with_fds` function */ +#mesondefine HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS + +/* Define if fdwalk is available in libc */ +#mesondefine HAVE_FDWALK diff --git a/data/00_org.gnome.shell.gschema.override b/data/00_org.gnome.shell.gschema.override new file mode 100644 index 0000000..ac732e6 --- /dev/null +++ b/data/00_org.gnome.shell.gschema.override @@ -0,0 +1,6 @@ +[org.gnome.mutter:GNOME] +attach-modal-dialogs=true +edge-tiling=true +dynamic-workspaces=true +workspaces-only-on-primary=true +focus-change-on-pointer-rest=true diff --git a/data/50-gnome-shell-system.xml b/data/50-gnome-shell-system.xml new file mode 100644 index 0000000..33e5ba5 --- /dev/null +++ b/data/50-gnome-shell-system.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/data/README.osk-layouts b/data/README.osk-layouts new file mode 100644 index 0000000..e9e668f --- /dev/null +++ b/data/README.osk-layouts @@ -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 + + 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 diff --git a/data/dbus-interfaces/meson.build b/data/dbus-interfaces/meson.build new file mode 100644 index 0000000..c96bbbb --- /dev/null +++ b/data/dbus-interfaces/meson.build @@ -0,0 +1,10 @@ +dbus_interfaces = [ + 'org.gnome.Shell.Extensions.xml', + 'org.gnome.Shell.Introspect.xml', + 'org.gnome.Shell.PadOsd.xml', + 'org.gnome.Shell.Screencast.xml', + 'org.gnome.Shell.Screenshot.xml', + 'org.gnome.ShellSearchProvider.xml', + 'org.gnome.ShellSearchProvider2.xml' +] +install_data(dbus_interfaces, install_dir: ifacedir) diff --git a/data/dbus-interfaces/net.hadess.SensorProxy.xml b/data/dbus-interfaces/net.hadess.SensorProxy.xml new file mode 100644 index 0000000..2bf8ffa --- /dev/null +++ b/data/dbus-interfaces/net.hadess.SensorProxy.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/data/dbus-interfaces/net.hadess.SwitcherooControl.xml b/data/dbus-interfaces/net.hadess.SwitcherooControl.xml new file mode 100644 index 0000000..792af08 --- /dev/null +++ b/data/dbus-interfaces/net.hadess.SwitcherooControl.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/data/dbus-interfaces/org.Gtk.MountOperationHandler.xml b/data/dbus-interfaces/org.Gtk.MountOperationHandler.xml new file mode 100644 index 0000000..8b03a2e --- /dev/null +++ b/data/dbus-interfaces/org.Gtk.MountOperationHandler.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.Application.xml b/data/dbus-interfaces/org.freedesktop.Application.xml new file mode 100644 index 0000000..55be7d7 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.Application.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.DBus.xml b/data/dbus-interfaces/org.freedesktop.DBus.xml new file mode 100644 index 0000000..18ff2aa --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.DBus.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.GeoClue2.Agent.xml b/data/dbus-interfaces/org.freedesktop.GeoClue2.Agent.xml new file mode 100644 index 0000000..2773601 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.GeoClue2.Agent.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.GeoClue2.Manager.xml b/data/dbus-interfaces/org.freedesktop.GeoClue2.Manager.xml new file mode 100644 index 0000000..28db3c6 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.GeoClue2.Manager.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Cdma.xml b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Cdma.xml new file mode 100644 index 0000000..12a85e0 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Cdma.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Gsm.Network.xml b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Gsm.Network.xml new file mode 100644 index 0000000..7d8c25a --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.ModemManager.Modem.Gsm.Network.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml new file mode 100644 index 0000000..41e6601 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.ModemCdma.xml b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.ModemCdma.xml new file mode 100644 index 0000000..d029252 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.ModemCdma.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.xml b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.xml new file mode 100644 index 0000000..204426b --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.ModemManager1.Modem.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.Notifications.xml b/data/dbus-interfaces/org.freedesktop.Notifications.xml new file mode 100644 index 0000000..0ed8657 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.Notifications.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.PackageKit.Offline.xml b/data/dbus-interfaces/org.freedesktop.PackageKit.Offline.xml new file mode 100644 index 0000000..ff61166 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.PackageKit.Offline.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.UPower.Device.xml b/data/dbus-interfaces/org.freedesktop.UPower.Device.xml new file mode 100644 index 0000000..4882285 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.UPower.Device.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.UPower.xml b/data/dbus-interfaces/org.freedesktop.UPower.xml new file mode 100644 index 0000000..a0fba20 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.UPower.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.bolt1.Device.xml b/data/dbus-interfaces/org.freedesktop.bolt1.Device.xml new file mode 100644 index 0000000..44b40dc --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.bolt1.Device.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.bolt1.Manager.xml b/data/dbus-interfaces/org.freedesktop.bolt1.Manager.xml new file mode 100644 index 0000000..c98a94f --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.bolt1.Manager.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.Access.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.Access.xml new file mode 100644 index 0000000..802a2c1 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.impl.portal.Access.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml new file mode 100644 index 0000000..75fbc46 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.Request.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.Request.xml new file mode 100644 index 0000000..a9d03eb --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.impl.portal.Request.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.login1.Manager.xml b/data/dbus-interfaces/org.freedesktop.login1.Manager.xml new file mode 100644 index 0000000..647afc6 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.login1.Manager.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.login1.Session.xml b/data/dbus-interfaces/org.freedesktop.login1.Session.xml new file mode 100644 index 0000000..6fab817 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.login1.Session.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.login1.User.xml b/data/dbus-interfaces/org.freedesktop.login1.User.xml new file mode 100644 index 0000000..d6f10b0 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.login1.User.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.realmd.Provider.xml b/data/dbus-interfaces/org.freedesktop.realmd.Provider.xml new file mode 100644 index 0000000..2fdb045 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.realmd.Provider.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.realmd.Realm.xml b/data/dbus-interfaces/org.freedesktop.realmd.Realm.xml new file mode 100644 index 0000000..351066d --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.realmd.Realm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.freedesktop.realmd.Service.xml b/data/dbus-interfaces/org.freedesktop.realmd.Service.xml new file mode 100644 index 0000000..4ffb7e7 --- /dev/null +++ b/data/dbus-interfaces/org.freedesktop.realmd.Service.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml b/data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml new file mode 100644 index 0000000..5db2734 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Magnifier.xml b/data/dbus-interfaces/org.gnome.Magnifier.xml new file mode 100644 index 0000000..2ade4dd --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Magnifier.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.ScreenSaver.xml b/data/dbus-interfaces/org.gnome.ScreenSaver.xml new file mode 100644 index 0000000..5a2ca98 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.ScreenSaver.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.SessionManager.EndSessionDialog.xml b/data/dbus-interfaces/org.gnome.SessionManager.EndSessionDialog.xml new file mode 100644 index 0000000..3a57aa4 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SessionManager.EndSessionDialog.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.SessionManager.Inhibitor.xml b/data/dbus-interfaces/org.gnome.SessionManager.Inhibitor.xml new file mode 100644 index 0000000..c745f81 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SessionManager.Inhibitor.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.SessionManager.Presence.xml b/data/dbus-interfaces/org.gnome.SessionManager.Presence.xml new file mode 100644 index 0000000..78bc604 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SessionManager.Presence.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.SessionManager.xml b/data/dbus-interfaces/org.gnome.SessionManager.xml new file mode 100644 index 0000000..c81c90f --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SessionManager.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Color.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Color.xml new file mode 100644 index 0000000..1528f90 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Color.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml new file mode 100644 index 0000000..05e4b8d --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Rfkill.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Rfkill.xml new file mode 100644 index 0000000..628b17f --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Rfkill.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Wacom.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Wacom.xml new file mode 100644 index 0000000..1370214 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.SettingsDaemon.Wacom.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.AudioDeviceSelection.xml b/data/dbus-interfaces/org.gnome.Shell.AudioDeviceSelection.xml new file mode 100644 index 0000000..28cc6da --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.AudioDeviceSelection.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml b/data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml new file mode 100644 index 0000000..c198830 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml new file mode 100644 index 0000000..34a65af --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.HotplugSniffer.xml b/data/dbus-interfaces/org.gnome.Shell.HotplugSniffer.xml new file mode 100644 index 0000000..b4373cc --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.HotplugSniffer.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.Introspect.xml b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml new file mode 100644 index 0000000..9508681 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.PadOsd.xml b/data/dbus-interfaces/org.gnome.Shell.PadOsd.xml new file mode 100644 index 0000000..765973c --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.PadOsd.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.PerfHelper.xml b/data/dbus-interfaces/org.gnome.Shell.PerfHelper.xml new file mode 100644 index 0000000..98fea27 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.PerfHelper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.PortalHelper.xml b/data/dbus-interfaces/org.gnome.Shell.PortalHelper.xml new file mode 100644 index 0000000..8c6a13e --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.PortalHelper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.Screencast.xml b/data/dbus-interfaces/org.gnome.Shell.Screencast.xml new file mode 100644 index 0000000..f188cf7 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.Screencast.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.Screenshot.xml b/data/dbus-interfaces/org.gnome.Shell.Screenshot.xml new file mode 100644 index 0000000..528b01e --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.Screenshot.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.Wacom.PadOsd.xml b/data/dbus-interfaces/org.gnome.Shell.Wacom.PadOsd.xml new file mode 100644 index 0000000..5e046c7 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.Wacom.PadOsd.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.Shell.xml b/data/dbus-interfaces/org.gnome.Shell.xml new file mode 100644 index 0000000..094c294 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Shell.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml b/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml new file mode 100644 index 0000000..78ad305 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml b/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml new file mode 100644 index 0000000..9502340 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.gtk.Notifications.xml b/data/dbus-interfaces/org.gtk.Notifications.xml new file mode 100644 index 0000000..e2461ff --- /dev/null +++ b/data/dbus-interfaces/org.gtk.Notifications.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.mpris.MediaPlayer2.Player.xml b/data/dbus-interfaces/org.mpris.MediaPlayer2.Player.xml new file mode 100644 index 0000000..550cb4c --- /dev/null +++ b/data/dbus-interfaces/org.mpris.MediaPlayer2.Player.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/dbus-interfaces/org.mpris.MediaPlayer2.xml b/data/dbus-interfaces/org.mpris.MediaPlayer2.xml new file mode 100644 index 0000000..5febaf9 --- /dev/null +++ b/data/dbus-interfaces/org.mpris.MediaPlayer2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/data/emoji.json b/data/emoji.json new file mode 100644 index 0000000..72144df --- /dev/null +++ b/data/emoji.json @@ -0,0 +1,15740 @@ +[ + { + "no": 1, + "code": "1F600", + "char": "😀", + "name": "grinning face" + }, + { + "no": 2, + "code": "1F601", + "char": "😁", + "name": "beaming face with smiling eyes" + }, + { + "no": 3, + "code": "1F602", + "char": "😂", + "name": "face with tears of joy" + }, + { + "no": 4, + "code": "1F923", + "char": "🤣", + "name": "rolling on the floor laughing" + }, + { + "no": 5, + "code": "1F603", + "char": "😃", + "name": "grinning face with big eyes" + }, + { + "no": 6, + "code": "1F604", + "char": "😄", + "name": "grinning face with smiling eyes" + }, + { + "no": 7, + "code": "1F605", + "char": "😅", + "name": "grinning face with sweat" + }, + { + "no": 8, + "code": "1F606", + "char": "😆", + "name": "grinning squinting face" + }, + { + "no": 9, + "code": "1F609", + "char": "😉", + "name": "winking face" + }, + { + "no": 10, + "code": "1F60A", + "char": "😊", + "name": "smiling face with smiling eyes" + }, + { + "no": 11, + "code": "1F60B", + "char": "😋", + "name": "face savoring food" + }, + { + "no": 12, + "code": "1F60E", + "char": "😎", + "name": "smiling face with sunglasses" + }, + { + "no": 13, + "code": "1F60D", + "char": "😍", + "name": "smiling face with heart-eyes" + }, + { + "no": 14, + "code": "1F618", + "char": "😘", + "name": "face blowing a kiss" + }, + { + "no": 15, + "code": "1F617", + "char": "😗", + "name": "kissing face" + }, + { + "no": 16, + "code": "1F619", + "char": "😙", + "name": "kissing face with smiling eyes" + }, + { + "no": 17, + "code": "1F61A", + "char": "😚", + "name": "kissing face with closed eyes" + }, + { + "no": 18, + "code": "263A", + "char": "☺", + "name": "smiling face" + }, + { + "no": 19, + "code": "1F642", + "char": "🙂", + "name": "slightly smiling face" + }, + { + "no": 20, + "code": "1F917", + "char": "🤗", + "name": "hugging face" + }, + { + "no": 21, + "code": "1F929", + "char": "🤩", + "name": "⊛ star-struck" + }, + { + "no": 22, + "code": "1F914", + "char": "🤔", + "name": "thinking face" + }, + { + "no": 23, + "code": "1F928", + "char": "🤨", + "name": "⊛ face with raised eyebrow" + }, + { + "no": 24, + "code": "1F610", + "char": "😐", + "name": "neutral face" + }, + { + "no": 25, + "code": "1F611", + "char": "😑", + "name": "expressionless face" + }, + { + "no": 26, + "code": "1F636", + "char": "😶", + "name": "face without mouth" + }, + { + "no": 27, + "code": "1F644", + "char": "🙄", + "name": "face with rolling eyes" + }, + { + "no": 28, + "code": "1F60F", + "char": "😏", + "name": "smirking face" + }, + { + "no": 29, + "code": "1F623", + "char": "😣", + "name": "persevering face" + }, + { + "no": 30, + "code": "1F625", + "char": "😥", + "name": "sad but relieved face" + }, + { + "no": 31, + "code": "1F62E", + "char": "😮", + "name": "face with open mouth" + }, + { + "no": 32, + "code": "1F910", + "char": "🤐", + "name": "zipper-mouth face" + }, + { + "no": 33, + "code": "1F62F", + "char": "😯", + "name": "hushed face" + }, + { + "no": 34, + "code": "1F62A", + "char": "😪", + "name": "sleepy face" + }, + { + "no": 35, + "code": "1F62B", + "char": "😫", + "name": "tired face" + }, + { + "no": 36, + "code": "1F634", + "char": "😴", + "name": "sleeping face" + }, + { + "no": 37, + "code": "1F60C", + "char": "😌", + "name": "relieved face" + }, + { + "no": 38, + "code": "1F61B", + "char": "😛", + "name": "face with tongue" + }, + { + "no": 39, + "code": "1F61C", + "char": "😜", + "name": "winking face with tongue" + }, + { + "no": 40, + "code": "1F61D", + "char": "😝", + "name": "squinting face with tongue" + }, + { + "no": 41, + "code": "1F924", + "char": "🤤", + "name": "drooling face" + }, + { + "no": 42, + "code": "1F612", + "char": "😒", + "name": "unamused face" + }, + { + "no": 43, + "code": "1F613", + "char": "😓", + "name": "downcast face with sweat" + }, + { + "no": 44, + "code": "1F614", + "char": "😔", + "name": "pensive face" + }, + { + "no": 45, + "code": "1F615", + "char": "😕", + "name": "confused face" + }, + { + "no": 46, + "code": "1F643", + "char": "🙃", + "name": "upside-down face" + }, + { + "no": 47, + "code": "1F911", + "char": "🤑", + "name": "money-mouth face" + }, + { + "no": 48, + "code": "1F632", + "char": "😲", + "name": "astonished face" + }, + { + "no": 49, + "code": "2639", + "char": "☹", + "name": "frowning face" + }, + { + "no": 50, + "code": "1F641", + "char": "🙁", + "name": "slightly frowning face" + }, + { + "no": 51, + "code": "1F616", + "char": "😖", + "name": "confounded face" + }, + { + "no": 52, + "code": "1F61E", + "char": "😞", + "name": "disappointed face" + }, + { + "no": 53, + "code": "1F61F", + "char": "😟", + "name": "worried face" + }, + { + "no": 54, + "code": "1F624", + "char": "😤", + "name": "face with steam from nose" + }, + { + "no": 55, + "code": "1F622", + "char": "😢", + "name": "crying face" + }, + { + "no": 56, + "code": "1F62D", + "char": "😭", + "name": "loudly crying face" + }, + { + "no": 57, + "code": "1F626", + "char": "😦", + "name": "frowning face with open mouth" + }, + { + "no": 58, + "code": "1F627", + "char": "😧", + "name": "anguished face" + }, + { + "no": 59, + "code": "1F628", + "char": "😨", + "name": "fearful face" + }, + { + "no": 60, + "code": "1F629", + "char": "😩", + "name": "weary face" + }, + { + "no": 61, + "code": "1F92F", + "char": "🤯", + "name": "⊛ exploding head" + }, + { + "no": 62, + "code": "1F62C", + "char": "😬", + "name": "grimacing face" + }, + { + "no": 63, + "code": "1F630", + "char": "😰", + "name": "anxious face with sweat" + }, + { + "no": 64, + "code": "1F631", + "char": "😱", + "name": "face screaming in fear" + }, + { + "no": 65, + "code": "1F633", + "char": "😳", + "name": "flushed face" + }, + { + "no": 66, + "code": "1F92A", + "char": "🤪", + "name": "⊛ crazy face" + }, + { + "no": 67, + "code": "1F635", + "char": "😵", + "name": "dizzy face" + }, + { + "no": 68, + "code": "1F621", + "char": "😡", + "name": "pouting face" + }, + { + "no": 69, + "code": "1F620", + "char": "😠", + "name": "angry face" + }, + { + "no": 70, + "code": "1F92C", + "char": "🤬", + "name": "⊛ face with symbols on mouth" + }, + { + "no": 71, + "code": "1F637", + "char": "😷", + "name": "face with medical mask" + }, + { + "no": 72, + "code": "1F912", + "char": "🤒", + "name": "face with thermometer" + }, + { + "no": 73, + "code": "1F915", + "char": "🤕", + "name": "face with head-bandage" + }, + { + "no": 74, + "code": "1F922", + "char": "🤢", + "name": "nauseated face" + }, + { + "no": 75, + "code": "1F92E", + "char": "🤮", + "name": "⊛ face vomiting" + }, + { + "no": 76, + "code": "1F927", + "char": "🤧", + "name": "sneezing face" + }, + { + "no": 77, + "code": "1F607", + "char": "😇", + "name": "smiling face with halo" + }, + { + "no": 78, + "code": "1F920", + "char": "🤠", + "name": "cowboy hat face" + }, + { + "no": 79, + "code": "1F921", + "char": "🤡", + "name": "clown face" + }, + { + "no": 80, + "code": "1F925", + "char": "🤥", + "name": "lying face" + }, + { + "no": 81, + "code": "1F92B", + "char": "🤫", + "name": "⊛ shushing face" + }, + { + "no": 82, + "code": "1F92D", + "char": "🤭", + "name": "⊛ face with hand over mouth" + }, + { + "no": 83, + "code": "1F9D0", + "char": "🧐", + "name": "⊛ face with monocle" + }, + { + "no": 84, + "code": "1F913", + "char": "🤓", + "name": "nerd face" + }, + { + "no": 85, + "code": "1F608", + "char": "😈", + "name": "smiling face with horns" + }, + { + "no": 86, + "code": "1F47F", + "char": "👿", + "name": "angry face with horns" + }, + { + "no": 87, + "code": "1F479", + "char": "👹", + "name": "ogre" + }, + { + "no": 88, + "code": "1F47A", + "char": "👺", + "name": "goblin" + }, + { + "no": 89, + "code": "1F480", + "char": "💀", + "name": "skull" + }, + { + "no": 90, + "code": "2620", + "char": "☠", + "name": "skull and crossbones" + }, + { + "no": 91, + "code": "1F47B", + "char": "👻", + "name": "ghost" + }, + { + "no": 92, + "code": "1F47D", + "char": "👽", + "name": "alien" + }, + { + "no": 93, + "code": "1F47E", + "char": "👾", + "name": "alien monster" + }, + { + "no": 94, + "code": "1F916", + "char": "🤖", + "name": "robot face" + }, + { + "no": 95, + "code": "1F4A9", + "char": "💩", + "name": "pile of poo" + }, + { + "no": 96, + "code": "1F63A", + "char": "😺", + "name": "grinning cat face" + }, + { + "no": 97, + "code": "1F638", + "char": "😸", + "name": "grinning cat face with smiling eyes" + }, + { + "no": 98, + "code": "1F639", + "char": "😹", + "name": "cat face with tears of joy" + }, + { + "no": 99, + "code": "1F63B", + "char": "😻", + "name": "smiling cat face with heart-eyes" + }, + { + "no": 100, + "code": "1F63C", + "char": "😼", + "name": "cat face with wry smile" + }, + { + "no": 101, + "code": "1F63D", + "char": "😽", + "name": "kissing cat face" + }, + { + "no": 102, + "code": "1F640", + "char": "🙀", + "name": "weary cat face" + }, + { + "no": 103, + "code": "1F63F", + "char": "😿", + "name": "crying cat face" + }, + { + "no": 104, + "code": "1F63E", + "char": "😾", + "name": "pouting cat face" + }, + { + "no": 105, + "code": "1F648", + "char": "🙈", + "name": "see-no-evil monkey" + }, + { + "no": 106, + "code": "1F649", + "char": "🙉", + "name": "hear-no-evil monkey" + }, + { + "no": 107, + "code": "1F64A", + "char": "🙊", + "name": "speak-no-evil monkey" + }, + { + "no": 108, + "code": "1F476", + "char": "👶", + "name": "baby" + }, + { + "no": 109, + "code": "1F476 1F3FB", + "char": "👶🏻", + "name": "baby: light skin tone" + }, + { + "no": 110, + "code": "1F476 1F3FC", + "char": "👶🏼", + "name": "baby: medium-light skin tone" + }, + { + "no": 111, + "code": "1F476 1F3FD", + "char": "👶🏽", + "name": "baby: medium skin tone" + }, + { + "no": 112, + "code": "1F476 1F3FE", + "char": "👶🏾", + "name": "baby: medium-dark skin tone" + }, + { + "no": 113, + "code": "1F476 1F3FF", + "char": "👶🏿", + "name": "baby: dark skin tone" + }, + { + "no": 114, + "code": "1F9D2", + "char": "🧒", + "name": "⊛ child" + }, + { + "no": 115, + "code": "1F9D2 1F3FB", + "char": "🧒🏻", + "name": "⊛ child: light skin tone" + }, + { + "no": 116, + "code": "1F9D2 1F3FC", + "char": "🧒🏼", + "name": "⊛ child: medium-light skin tone" + }, + { + "no": 117, + "code": "1F9D2 1F3FD", + "char": "🧒🏽", + "name": "⊛ child: medium skin tone" + }, + { + "no": 118, + "code": "1F9D2 1F3FE", + "char": "🧒🏾", + "name": "⊛ child: medium-dark skin tone" + }, + { + "no": 119, + "code": "1F9D2 1F3FF", + "char": "🧒🏿", + "name": "⊛ child: dark skin tone" + }, + { + "no": 120, + "code": "1F466", + "char": "👦", + "name": "boy" + }, + { + "no": 121, + "code": "1F466 1F3FB", + "char": "👦🏻", + "name": "boy: light skin tone" + }, + { + "no": 122, + "code": "1F466 1F3FC", + "char": "👦🏼", + "name": "boy: medium-light skin tone" + }, + { + "no": 123, + "code": "1F466 1F3FD", + "char": "👦🏽", + "name": "boy: medium skin tone" + }, + { + "no": 124, + "code": "1F466 1F3FE", + "char": "👦🏾", + "name": "boy: medium-dark skin tone" + }, + { + "no": 125, + "code": "1F466 1F3FF", + "char": "👦🏿", + "name": "boy: dark skin tone" + }, + { + "no": 126, + "code": "1F467", + "char": "👧", + "name": "girl" + }, + { + "no": 127, + "code": "1F467 1F3FB", + "char": "👧🏻", + "name": "girl: light skin tone" + }, + { + "no": 128, + "code": "1F467 1F3FC", + "char": "👧🏼", + "name": "girl: medium-light skin tone" + }, + { + "no": 129, + "code": "1F467 1F3FD", + "char": "👧🏽", + "name": "girl: medium skin tone" + }, + { + "no": 130, + "code": "1F467 1F3FE", + "char": "👧🏾", + "name": "girl: medium-dark skin tone" + }, + { + "no": 131, + "code": "1F467 1F3FF", + "char": "👧🏿", + "name": "girl: dark skin tone" + }, + { + "no": 132, + "code": "1F9D1", + "char": "🧑", + "name": "⊛ adult" + }, + { + "no": 133, + "code": "1F9D1 1F3FB", + "char": "🧑🏻", + "name": "⊛ adult: light skin tone" + }, + { + "no": 134, + "code": "1F9D1 1F3FC", + "char": "🧑🏼", + "name": "⊛ adult: medium-light skin tone" + }, + { + "no": 135, + "code": "1F9D1 1F3FD", + "char": "🧑🏽", + "name": "⊛ adult: medium skin tone" + }, + { + "no": 136, + "code": "1F9D1 1F3FE", + "char": "🧑🏾", + "name": "⊛ adult: medium-dark skin tone" + }, + { + "no": 137, + "code": "1F9D1 1F3FF", + "char": "🧑🏿", + "name": "⊛ adult: dark skin tone" + }, + { + "no": 138, + "code": "1F468", + "char": "👨", + "name": "man" + }, + { + "no": 139, + "code": "1F468 1F3FB", + "char": "👨🏻", + "name": "man: light skin tone" + }, + { + "no": 140, + "code": "1F468 1F3FC", + "char": "👨🏼", + "name": "man: medium-light skin tone" + }, + { + "no": 141, + "code": "1F468 1F3FD", + "char": "👨🏽", + "name": "man: medium skin tone" + }, + { + "no": 142, + "code": "1F468 1F3FE", + "char": "👨🏾", + "name": "man: medium-dark skin tone" + }, + { + "no": 143, + "code": "1F468 1F3FF", + "char": "👨🏿", + "name": "man: dark skin tone" + }, + { + "no": 144, + "code": "1F469", + "char": "👩", + "name": "woman" + }, + { + "no": 145, + "code": "1F469 1F3FB", + "char": "👩🏻", + "name": "woman: light skin tone" + }, + { + "no": 146, + "code": "1F469 1F3FC", + "char": "👩🏼", + "name": "woman: medium-light skin tone" + }, + { + "no": 147, + "code": "1F469 1F3FD", + "char": "👩🏽", + "name": "woman: medium skin tone" + }, + { + "no": 148, + "code": "1F469 1F3FE", + "char": "👩🏾", + "name": "woman: medium-dark skin tone" + }, + { + "no": 149, + "code": "1F469 1F3FF", + "char": "👩🏿", + "name": "woman: dark skin tone" + }, + { + "no": 150, + "code": "1F9D3", + "char": "🧓", + "name": "⊛ older adult" + }, + { + "no": 151, + "code": "1F9D3 1F3FB", + "char": "🧓🏻", + "name": "⊛ older adult: light skin tone" + }, + { + "no": 152, + "code": "1F9D3 1F3FC", + "char": "🧓🏼", + "name": "⊛ older adult: medium-light skin tone" + }, + { + "no": 153, + "code": "1F9D3 1F3FD", + "char": "🧓🏽", + "name": "⊛ older adult: medium skin tone" + }, + { + "no": 154, + "code": "1F9D3 1F3FE", + "char": "🧓🏾", + "name": "⊛ older adult: medium-dark skin tone" + }, + { + "no": 155, + "code": "1F9D3 1F3FF", + "char": "🧓🏿", + "name": "⊛ older adult: dark skin tone" + }, + { + "no": 156, + "code": "1F474", + "char": "👴", + "name": "old man" + }, + { + "no": 157, + "code": "1F474 1F3FB", + "char": "👴🏻", + "name": "old man: light skin tone" + }, + { + "no": 158, + "code": "1F474 1F3FC", + "char": "👴🏼", + "name": "old man: medium-light skin tone" + }, + { + "no": 159, + "code": "1F474 1F3FD", + "char": "👴🏽", + "name": "old man: medium skin tone" + }, + { + "no": 160, + "code": "1F474 1F3FE", + "char": "👴🏾", + "name": "old man: medium-dark skin tone" + }, + { + "no": 161, + "code": "1F474 1F3FF", + "char": "👴🏿", + "name": "old man: dark skin tone" + }, + { + "no": 162, + "code": "1F475", + "char": "👵", + "name": "old woman" + }, + { + "no": 163, + "code": "1F475 1F3FB", + "char": "👵🏻", + "name": "old woman: light skin tone" + }, + { + "no": 164, + "code": "1F475 1F3FC", + "char": "👵🏼", + "name": "old woman: medium-light skin tone" + }, + { + "no": 165, + "code": "1F475 1F3FD", + "char": "👵🏽", + "name": "old woman: medium skin tone" + }, + { + "no": 166, + "code": "1F475 1F3FE", + "char": "👵🏾", + "name": "old woman: medium-dark skin tone" + }, + { + "no": 167, + "code": "1F475 1F3FF", + "char": "👵🏿", + "name": "old woman: dark skin tone" + }, + { + "no": 168, + "code": "1F468 200D 2695 FE0F", + "char": "👨‍⚕️", + "name": "man health worker" + }, + { + "no": 169, + "code": "1F468 1F3FB 200D 2695 FE0F", + "char": "👨🏻‍⚕️", + "name": "man health worker: light skin tone" + }, + { + "no": 170, + "code": "1F468 1F3FC 200D 2695 FE0F", + "char": "👨🏼‍⚕️", + "name": "man health worker: medium-light skin tone" + }, + { + "no": 171, + "code": "1F468 1F3FD 200D 2695 FE0F", + "char": "👨🏽‍⚕️", + "name": "man health worker: medium skin tone" + }, + { + "no": 172, + "code": "1F468 1F3FE 200D 2695 FE0F", + "char": "👨🏾‍⚕️", + "name": "man health worker: medium-dark skin tone" + }, + { + "no": 173, + "code": "1F468 1F3FF 200D 2695 FE0F", + "char": "👨🏿‍⚕️", + "name": "man health worker: dark skin tone" + }, + { + "no": 174, + "code": "1F469 200D 2695 FE0F", + "char": "👩‍⚕️", + "name": "woman health worker" + }, + { + "no": 175, + "code": "1F469 1F3FB 200D 2695 FE0F", + "char": "👩🏻‍⚕️", + "name": "woman health worker: light skin tone" + }, + { + "no": 176, + "code": "1F469 1F3FC 200D 2695 FE0F", + "char": "👩🏼‍⚕️", + "name": "woman health worker: medium-light skin tone" + }, + { + "no": 177, + "code": "1F469 1F3FD 200D 2695 FE0F", + "char": "👩🏽‍⚕️", + "name": "woman health worker: medium skin tone" + }, + { + "no": 178, + "code": "1F469 1F3FE 200D 2695 FE0F", + "char": "👩🏾‍⚕️", + "name": "woman health worker: medium-dark skin tone" + }, + { + "no": 179, + "code": "1F469 1F3FF 200D 2695 FE0F", + "char": "👩🏿‍⚕️", + "name": "woman health worker: dark skin tone" + }, + { + "no": 180, + "code": "1F468 200D 1F393", + "char": "👨‍🎓", + "name": "man student" + }, + { + "no": 181, + "code": "1F468 1F3FB 200D 1F393", + "char": "👨🏻‍🎓", + "name": "man student: light skin tone" + }, + { + "no": 182, + "code": "1F468 1F3FC 200D 1F393", + "char": "👨🏼‍🎓", + "name": "man student: medium-light skin tone" + }, + { + "no": 183, + "code": "1F468 1F3FD 200D 1F393", + "char": "👨🏽‍🎓", + "name": "man student: medium skin tone" + }, + { + "no": 184, + "code": "1F468 1F3FE 200D 1F393", + "char": "👨🏾‍🎓", + "name": "man student: medium-dark skin tone" + }, + { + "no": 185, + "code": "1F468 1F3FF 200D 1F393", + "char": "👨🏿‍🎓", + "name": "man student: dark skin tone" + }, + { + "no": 186, + "code": "1F469 200D 1F393", + "char": "👩‍🎓", + "name": "woman student" + }, + { + "no": 187, + "code": "1F469 1F3FB 200D 1F393", + "char": "👩🏻‍🎓", + "name": "woman student: light skin tone" + }, + { + "no": 188, + "code": "1F469 1F3FC 200D 1F393", + "char": "👩🏼‍🎓", + "name": "woman student: medium-light skin tone" + }, + { + "no": 189, + "code": "1F469 1F3FD 200D 1F393", + "char": "👩🏽‍🎓", + "name": "woman student: medium skin tone" + }, + { + "no": 190, + "code": "1F469 1F3FE 200D 1F393", + "char": "👩🏾‍🎓", + "name": "woman student: medium-dark skin tone" + }, + { + "no": 191, + "code": "1F469 1F3FF 200D 1F393", + "char": "👩🏿‍🎓", + "name": "woman student: dark skin tone" + }, + { + "no": 192, + "code": "1F468 200D 1F3EB", + "char": "👨‍🏫", + "name": "man teacher" + }, + { + "no": 193, + "code": "1F468 1F3FB 200D 1F3EB", + "char": "👨🏻‍🏫", + "name": "man teacher: light skin tone" + }, + { + "no": 194, + "code": "1F468 1F3FC 200D 1F3EB", + "char": "👨🏼‍🏫", + "name": "man teacher: medium-light skin tone" + }, + { + "no": 195, + "code": "1F468 1F3FD 200D 1F3EB", + "char": "👨🏽‍🏫", + "name": "man teacher: medium skin tone" + }, + { + "no": 196, + "code": "1F468 1F3FE 200D 1F3EB", + "char": "👨🏾‍🏫", + "name": "man teacher: medium-dark skin tone" + }, + { + "no": 197, + "code": "1F468 1F3FF 200D 1F3EB", + "char": "👨🏿‍🏫", + "name": "man teacher: dark skin tone" + }, + { + "no": 198, + "code": "1F469 200D 1F3EB", + "char": "👩‍🏫", + "name": "woman teacher" + }, + { + "no": 199, + "code": "1F469 1F3FB 200D 1F3EB", + "char": "👩🏻‍🏫", + "name": "woman teacher: light skin tone" + }, + { + "no": 200, + "code": "1F469 1F3FC 200D 1F3EB", + "char": "👩🏼‍🏫", + "name": "woman teacher: medium-light skin tone" + }, + { + "no": 201, + "code": "1F469 1F3FD 200D 1F3EB", + "char": "👩🏽‍🏫", + "name": "woman teacher: medium skin tone" + }, + { + "no": 202, + "code": "1F469 1F3FE 200D 1F3EB", + "char": "👩🏾‍🏫", + "name": "woman teacher: medium-dark skin tone" + }, + { + "no": 203, + "code": "1F469 1F3FF 200D 1F3EB", + "char": "👩🏿‍🏫", + "name": "woman teacher: dark skin tone" + }, + { + "no": 204, + "code": "1F468 200D 2696 FE0F", + "char": "👨‍⚖️", + "name": "man judge" + }, + { + "no": 205, + "code": "1F468 1F3FB 200D 2696 FE0F", + "char": "👨🏻‍⚖️", + "name": "man judge: light skin tone" + }, + { + "no": 206, + "code": "1F468 1F3FC 200D 2696 FE0F", + "char": "👨🏼‍⚖️", + "name": "man judge: medium-light skin tone" + }, + { + "no": 207, + "code": "1F468 1F3FD 200D 2696 FE0F", + "char": "👨🏽‍⚖️", + "name": "man judge: medium skin tone" + }, + { + "no": 208, + "code": "1F468 1F3FE 200D 2696 FE0F", + "char": "👨🏾‍⚖️", + "name": "man judge: medium-dark skin tone" + }, + { + "no": 209, + "code": "1F468 1F3FF 200D 2696 FE0F", + "char": "👨🏿‍⚖️", + "name": "man judge: dark skin tone" + }, + { + "no": 210, + "code": "1F469 200D 2696 FE0F", + "char": "👩‍⚖️", + "name": "woman judge" + }, + { + "no": 211, + "code": "1F469 1F3FB 200D 2696 FE0F", + "char": "👩🏻‍⚖️", + "name": "woman judge: light skin tone" + }, + { + "no": 212, + "code": "1F469 1F3FC 200D 2696 FE0F", + "char": "👩🏼‍⚖️", + "name": "woman judge: medium-light skin tone" + }, + { + "no": 213, + "code": "1F469 1F3FD 200D 2696 FE0F", + "char": "👩🏽‍⚖️", + "name": "woman judge: medium skin tone" + }, + { + "no": 214, + "code": "1F469 1F3FE 200D 2696 FE0F", + "char": "👩🏾‍⚖️", + "name": "woman judge: medium-dark skin tone" + }, + { + "no": 215, + "code": "1F469 1F3FF 200D 2696 FE0F", + "char": "👩🏿‍⚖️", + "name": "woman judge: dark skin tone" + }, + { + "no": 216, + "code": "1F468 200D 1F33E", + "char": "👨‍🌾", + "name": "man farmer" + }, + { + "no": 217, + "code": "1F468 1F3FB 200D 1F33E", + "char": "👨🏻‍🌾", + "name": "man farmer: light skin tone" + }, + { + "no": 218, + "code": "1F468 1F3FC 200D 1F33E", + "char": "👨🏼‍🌾", + "name": "man farmer: medium-light skin tone" + }, + { + "no": 219, + "code": "1F468 1F3FD 200D 1F33E", + "char": "👨🏽‍🌾", + "name": "man farmer: medium skin tone" + }, + { + "no": 220, + "code": "1F468 1F3FE 200D 1F33E", + "char": "👨🏾‍🌾", + "name": "man farmer: medium-dark skin tone" + }, + { + "no": 221, + "code": "1F468 1F3FF 200D 1F33E", + "char": "👨🏿‍🌾", + "name": "man farmer: dark skin tone" + }, + { + "no": 222, + "code": "1F469 200D 1F33E", + "char": "👩‍🌾", + "name": "woman farmer" + }, + { + "no": 223, + "code": "1F469 1F3FB 200D 1F33E", + "char": "👩🏻‍🌾", + "name": "woman farmer: light skin tone" + }, + { + "no": 224, + "code": "1F469 1F3FC 200D 1F33E", + "char": "👩🏼‍🌾", + "name": "woman farmer: medium-light skin tone" + }, + { + "no": 225, + "code": "1F469 1F3FD 200D 1F33E", + "char": "👩🏽‍🌾", + "name": "woman farmer: medium skin tone" + }, + { + "no": 226, + "code": "1F469 1F3FE 200D 1F33E", + "char": "👩🏾‍🌾", + "name": "woman farmer: medium-dark skin tone" + }, + { + "no": 227, + "code": "1F469 1F3FF 200D 1F33E", + "char": "👩🏿‍🌾", + "name": "woman farmer: dark skin tone" + }, + { + "no": 228, + "code": "1F468 200D 1F373", + "char": "👨‍🍳", + "name": "man cook" + }, + { + "no": 229, + "code": "1F468 1F3FB 200D 1F373", + "char": "👨🏻‍🍳", + "name": "man cook: light skin tone" + }, + { + "no": 230, + "code": "1F468 1F3FC 200D 1F373", + "char": "👨🏼‍🍳", + "name": "man cook: medium-light skin tone" + }, + { + "no": 231, + "code": "1F468 1F3FD 200D 1F373", + "char": "👨🏽‍🍳", + "name": "man cook: medium skin tone" + }, + { + "no": 232, + "code": "1F468 1F3FE 200D 1F373", + "char": "👨🏾‍🍳", + "name": "man cook: medium-dark skin tone" + }, + { + "no": 233, + "code": "1F468 1F3FF 200D 1F373", + "char": "👨🏿‍🍳", + "name": "man cook: dark skin tone" + }, + { + "no": 234, + "code": "1F469 200D 1F373", + "char": "👩‍🍳", + "name": "woman cook" + }, + { + "no": 235, + "code": "1F469 1F3FB 200D 1F373", + "char": "👩🏻‍🍳", + "name": "woman cook: light skin tone" + }, + { + "no": 236, + "code": "1F469 1F3FC 200D 1F373", + "char": "👩🏼‍🍳", + "name": "woman cook: medium-light skin tone" + }, + { + "no": 237, + "code": "1F469 1F3FD 200D 1F373", + "char": "👩🏽‍🍳", + "name": "woman cook: medium skin tone" + }, + { + "no": 238, + "code": "1F469 1F3FE 200D 1F373", + "char": "👩🏾‍🍳", + "name": "woman cook: medium-dark skin tone" + }, + { + "no": 239, + "code": "1F469 1F3FF 200D 1F373", + "char": "👩🏿‍🍳", + "name": "woman cook: dark skin tone" + }, + { + "no": 240, + "code": "1F468 200D 1F527", + "char": "👨‍🔧", + "name": "man mechanic" + }, + { + "no": 241, + "code": "1F468 1F3FB 200D 1F527", + "char": "👨🏻‍🔧", + "name": "man mechanic: light skin tone" + }, + { + "no": 242, + "code": "1F468 1F3FC 200D 1F527", + "char": "👨🏼‍🔧", + "name": "man mechanic: medium-light skin tone" + }, + { + "no": 243, + "code": "1F468 1F3FD 200D 1F527", + "char": "👨🏽‍🔧", + "name": "man mechanic: medium skin tone" + }, + { + "no": 244, + "code": "1F468 1F3FE 200D 1F527", + "char": "👨🏾‍🔧", + "name": "man mechanic: medium-dark skin tone" + }, + { + "no": 245, + "code": "1F468 1F3FF 200D 1F527", + "char": "👨🏿‍🔧", + "name": "man mechanic: dark skin tone" + }, + { + "no": 246, + "code": "1F469 200D 1F527", + "char": "👩‍🔧", + "name": "woman mechanic" + }, + { + "no": 247, + "code": "1F469 1F3FB 200D 1F527", + "char": "👩🏻‍🔧", + "name": "woman mechanic: light skin tone" + }, + { + "no": 248, + "code": "1F469 1F3FC 200D 1F527", + "char": "👩🏼‍🔧", + "name": "woman mechanic: medium-light skin tone" + }, + { + "no": 249, + "code": "1F469 1F3FD 200D 1F527", + "char": "👩🏽‍🔧", + "name": "woman mechanic: medium skin tone" + }, + { + "no": 250, + "code": "1F469 1F3FE 200D 1F527", + "char": "👩🏾‍🔧", + "name": "woman mechanic: medium-dark skin tone" + }, + { + "no": 251, + "code": "1F469 1F3FF 200D 1F527", + "char": "👩🏿‍🔧", + "name": "woman mechanic: dark skin tone" + }, + { + "no": 252, + "code": "1F468 200D 1F3ED", + "char": "👨‍🏭", + "name": "man factory worker" + }, + { + "no": 253, + "code": "1F468 1F3FB 200D 1F3ED", + "char": "👨🏻‍🏭", + "name": "man factory worker: light skin tone" + }, + { + "no": 254, + "code": "1F468 1F3FC 200D 1F3ED", + "char": "👨🏼‍🏭", + "name": "man factory worker: medium-light skin tone" + }, + { + "no": 255, + "code": "1F468 1F3FD 200D 1F3ED", + "char": "👨🏽‍🏭", + "name": "man factory worker: medium skin tone" + }, + { + "no": 256, + "code": "1F468 1F3FE 200D 1F3ED", + "char": "👨🏾‍🏭", + "name": "man factory worker: medium-dark skin tone" + }, + { + "no": 257, + "code": "1F468 1F3FF 200D 1F3ED", + "char": "👨🏿‍🏭", + "name": "man factory worker: dark skin tone" + }, + { + "no": 258, + "code": "1F469 200D 1F3ED", + "char": "👩‍🏭", + "name": "woman factory worker" + }, + { + "no": 259, + "code": "1F469 1F3FB 200D 1F3ED", + "char": "👩🏻‍🏭", + "name": "woman factory worker: light skin tone" + }, + { + "no": 260, + "code": "1F469 1F3FC 200D 1F3ED", + "char": "👩🏼‍🏭", + "name": "woman factory worker: medium-light skin tone" + }, + { + "no": 261, + "code": "1F469 1F3FD 200D 1F3ED", + "char": "👩🏽‍🏭", + "name": "woman factory worker: medium skin tone" + }, + { + "no": 262, + "code": "1F469 1F3FE 200D 1F3ED", + "char": "👩🏾‍🏭", + "name": "woman factory worker: medium-dark skin tone" + }, + { + "no": 263, + "code": "1F469 1F3FF 200D 1F3ED", + "char": "👩🏿‍🏭", + "name": "woman factory worker: dark skin tone" + }, + { + "no": 264, + "code": "1F468 200D 1F4BC", + "char": "👨‍💼", + "name": "man office worker" + }, + { + "no": 265, + "code": "1F468 1F3FB 200D 1F4BC", + "char": "👨🏻‍💼", + "name": "man office worker: light skin tone" + }, + { + "no": 266, + "code": "1F468 1F3FC 200D 1F4BC", + "char": "👨🏼‍💼", + "name": "man office worker: medium-light skin tone" + }, + { + "no": 267, + "code": "1F468 1F3FD 200D 1F4BC", + "char": "👨🏽‍💼", + "name": "man office worker: medium skin tone" + }, + { + "no": 268, + "code": "1F468 1F3FE 200D 1F4BC", + "char": "👨🏾‍💼", + "name": "man office worker: medium-dark skin tone" + }, + { + "no": 269, + "code": "1F468 1F3FF 200D 1F4BC", + "char": "👨🏿‍💼", + "name": "man office worker: dark skin tone" + }, + { + "no": 270, + "code": "1F469 200D 1F4BC", + "char": "👩‍💼", + "name": "woman office worker" + }, + { + "no": 271, + "code": "1F469 1F3FB 200D 1F4BC", + "char": "👩🏻‍💼", + "name": "woman office worker: light skin tone" + }, + { + "no": 272, + "code": "1F469 1F3FC 200D 1F4BC", + "char": "👩🏼‍💼", + "name": "woman office worker: medium-light skin tone" + }, + { + "no": 273, + "code": "1F469 1F3FD 200D 1F4BC", + "char": "👩🏽‍💼", + "name": "woman office worker: medium skin tone" + }, + { + "no": 274, + "code": "1F469 1F3FE 200D 1F4BC", + "char": "👩🏾‍💼", + "name": "woman office worker: medium-dark skin tone" + }, + { + "no": 275, + "code": "1F469 1F3FF 200D 1F4BC", + "char": "👩🏿‍💼", + "name": "woman office worker: dark skin tone" + }, + { + "no": 276, + "code": "1F468 200D 1F52C", + "char": "👨‍🔬", + "name": "man scientist" + }, + { + "no": 277, + "code": "1F468 1F3FB 200D 1F52C", + "char": "👨🏻‍🔬", + "name": "man scientist: light skin tone" + }, + { + "no": 278, + "code": "1F468 1F3FC 200D 1F52C", + "char": "👨🏼‍🔬", + "name": "man scientist: medium-light skin tone" + }, + { + "no": 279, + "code": "1F468 1F3FD 200D 1F52C", + "char": "👨🏽‍🔬", + "name": "man scientist: medium skin tone" + }, + { + "no": 280, + "code": "1F468 1F3FE 200D 1F52C", + "char": "👨🏾‍🔬", + "name": "man scientist: medium-dark skin tone" + }, + { + "no": 281, + "code": "1F468 1F3FF 200D 1F52C", + "char": "👨🏿‍🔬", + "name": "man scientist: dark skin tone" + }, + { + "no": 282, + "code": "1F469 200D 1F52C", + "char": "👩‍🔬", + "name": "woman scientist" + }, + { + "no": 283, + "code": "1F469 1F3FB 200D 1F52C", + "char": "👩🏻‍🔬", + "name": "woman scientist: light skin tone" + }, + { + "no": 284, + "code": "1F469 1F3FC 200D 1F52C", + "char": "👩🏼‍🔬", + "name": "woman scientist: medium-light skin tone" + }, + { + "no": 285, + "code": "1F469 1F3FD 200D 1F52C", + "char": "👩🏽‍🔬", + "name": "woman scientist: medium skin tone" + }, + { + "no": 286, + "code": "1F469 1F3FE 200D 1F52C", + "char": "👩🏾‍🔬", + "name": "woman scientist: medium-dark skin tone" + }, + { + "no": 287, + "code": "1F469 1F3FF 200D 1F52C", + "char": "👩🏿‍🔬", + "name": "woman scientist: dark skin tone" + }, + { + "no": 288, + "code": "1F468 200D 1F4BB", + "char": "👨‍💻", + "name": "man technologist" + }, + { + "no": 289, + "code": "1F468 1F3FB 200D 1F4BB", + "char": "👨🏻‍💻", + "name": "man technologist: light skin tone" + }, + { + "no": 290, + "code": "1F468 1F3FC 200D 1F4BB", + "char": "👨🏼‍💻", + "name": "man technologist: medium-light skin tone" + }, + { + "no": 291, + "code": "1F468 1F3FD 200D 1F4BB", + "char": "👨🏽‍💻", + "name": "man technologist: medium skin tone" + }, + { + "no": 292, + "code": "1F468 1F3FE 200D 1F4BB", + "char": "👨🏾‍💻", + "name": "man technologist: medium-dark skin tone" + }, + { + "no": 293, + "code": "1F468 1F3FF 200D 1F4BB", + "char": "👨🏿‍💻", + "name": "man technologist: dark skin tone" + }, + { + "no": 294, + "code": "1F469 200D 1F4BB", + "char": "👩‍💻", + "name": "woman technologist" + }, + { + "no": 295, + "code": "1F469 1F3FB 200D 1F4BB", + "char": "👩🏻‍💻", + "name": "woman technologist: light skin tone" + }, + { + "no": 296, + "code": "1F469 1F3FC 200D 1F4BB", + "char": "👩🏼‍💻", + "name": "woman technologist: medium-light skin tone" + }, + { + "no": 297, + "code": "1F469 1F3FD 200D 1F4BB", + "char": "👩🏽‍💻", + "name": "woman technologist: medium skin tone" + }, + { + "no": 298, + "code": "1F469 1F3FE 200D 1F4BB", + "char": "👩🏾‍💻", + "name": "woman technologist: medium-dark skin tone" + }, + { + "no": 299, + "code": "1F469 1F3FF 200D 1F4BB", + "char": "👩🏿‍💻", + "name": "woman technologist: dark skin tone" + }, + { + "no": 300, + "code": "1F468 200D 1F3A4", + "char": "👨‍🎤", + "name": "man singer" + }, + { + "no": 301, + "code": "1F468 1F3FB 200D 1F3A4", + "char": "👨🏻‍🎤", + "name": "man singer: light skin tone" + }, + { + "no": 302, + "code": "1F468 1F3FC 200D 1F3A4", + "char": "👨🏼‍🎤", + "name": "man singer: medium-light skin tone" + }, + { + "no": 303, + "code": "1F468 1F3FD 200D 1F3A4", + "char": "👨🏽‍🎤", + "name": "man singer: medium skin tone" + }, + { + "no": 304, + "code": "1F468 1F3FE 200D 1F3A4", + "char": "👨🏾‍🎤", + "name": "man singer: medium-dark skin tone" + }, + { + "no": 305, + "code": "1F468 1F3FF 200D 1F3A4", + "char": "👨🏿‍🎤", + "name": "man singer: dark skin tone" + }, + { + "no": 306, + "code": "1F469 200D 1F3A4", + "char": "👩‍🎤", + "name": "woman singer" + }, + { + "no": 307, + "code": "1F469 1F3FB 200D 1F3A4", + "char": "👩🏻‍🎤", + "name": "woman singer: light skin tone" + }, + { + "no": 308, + "code": "1F469 1F3FC 200D 1F3A4", + "char": "👩🏼‍🎤", + "name": "woman singer: medium-light skin tone" + }, + { + "no": 309, + "code": "1F469 1F3FD 200D 1F3A4", + "char": "👩🏽‍🎤", + "name": "woman singer: medium skin tone" + }, + { + "no": 310, + "code": "1F469 1F3FE 200D 1F3A4", + "char": "👩🏾‍🎤", + "name": "woman singer: medium-dark skin tone" + }, + { + "no": 311, + "code": "1F469 1F3FF 200D 1F3A4", + "char": "👩🏿‍🎤", + "name": "woman singer: dark skin tone" + }, + { + "no": 312, + "code": "1F468 200D 1F3A8", + "char": "👨‍🎨", + "name": "man artist" + }, + { + "no": 313, + "code": "1F468 1F3FB 200D 1F3A8", + "char": "👨🏻‍🎨", + "name": "man artist: light skin tone" + }, + { + "no": 314, + "code": "1F468 1F3FC 200D 1F3A8", + "char": "👨🏼‍🎨", + "name": "man artist: medium-light skin tone" + }, + { + "no": 315, + "code": "1F468 1F3FD 200D 1F3A8", + "char": "👨🏽‍🎨", + "name": "man artist: medium skin tone" + }, + { + "no": 316, + "code": "1F468 1F3FE 200D 1F3A8", + "char": "👨🏾‍🎨", + "name": "man artist: medium-dark skin tone" + }, + { + "no": 317, + "code": "1F468 1F3FF 200D 1F3A8", + "char": "👨🏿‍🎨", + "name": "man artist: dark skin tone" + }, + { + "no": 318, + "code": "1F469 200D 1F3A8", + "char": "👩‍🎨", + "name": "woman artist" + }, + { + "no": 319, + "code": "1F469 1F3FB 200D 1F3A8", + "char": "👩🏻‍🎨", + "name": "woman artist: light skin tone" + }, + { + "no": 320, + "code": "1F469 1F3FC 200D 1F3A8", + "char": "👩🏼‍🎨", + "name": "woman artist: medium-light skin tone" + }, + { + "no": 321, + "code": "1F469 1F3FD 200D 1F3A8", + "char": "👩🏽‍🎨", + "name": "woman artist: medium skin tone" + }, + { + "no": 322, + "code": "1F469 1F3FE 200D 1F3A8", + "char": "👩🏾‍🎨", + "name": "woman artist: medium-dark skin tone" + }, + { + "no": 323, + "code": "1F469 1F3FF 200D 1F3A8", + "char": "👩🏿‍🎨", + "name": "woman artist: dark skin tone" + }, + { + "no": 324, + "code": "1F468 200D 2708 FE0F", + "char": "👨‍✈️", + "name": "man pilot" + }, + { + "no": 325, + "code": "1F468 1F3FB 200D 2708 FE0F", + "char": "👨🏻‍✈️", + "name": "man pilot: light skin tone" + }, + { + "no": 326, + "code": "1F468 1F3FC 200D 2708 FE0F", + "char": "👨🏼‍✈️", + "name": "man pilot: medium-light skin tone" + }, + { + "no": 327, + "code": "1F468 1F3FD 200D 2708 FE0F", + "char": "👨🏽‍✈️", + "name": "man pilot: medium skin tone" + }, + { + "no": 328, + "code": "1F468 1F3FE 200D 2708 FE0F", + "char": "👨🏾‍✈️", + "name": "man pilot: medium-dark skin tone" + }, + { + "no": 329, + "code": "1F468 1F3FF 200D 2708 FE0F", + "char": "👨🏿‍✈️", + "name": "man pilot: dark skin tone" + }, + { + "no": 330, + "code": "1F469 200D 2708 FE0F", + "char": "👩‍✈️", + "name": "woman pilot" + }, + { + "no": 331, + "code": "1F469 1F3FB 200D 2708 FE0F", + "char": "👩🏻‍✈️", + "name": "woman pilot: light skin tone" + }, + { + "no": 332, + "code": "1F469 1F3FC 200D 2708 FE0F", + "char": "👩🏼‍✈️", + "name": "woman pilot: medium-light skin tone" + }, + { + "no": 333, + "code": "1F469 1F3FD 200D 2708 FE0F", + "char": "👩🏽‍✈️", + "name": "woman pilot: medium skin tone" + }, + { + "no": 334, + "code": "1F469 1F3FE 200D 2708 FE0F", + "char": "👩🏾‍✈️", + "name": "woman pilot: medium-dark skin tone" + }, + { + "no": 335, + "code": "1F469 1F3FF 200D 2708 FE0F", + "char": "👩🏿‍✈️", + "name": "woman pilot: dark skin tone" + }, + { + "no": 336, + "code": "1F468 200D 1F680", + "char": "👨‍🚀", + "name": "man astronaut" + }, + { + "no": 337, + "code": "1F468 1F3FB 200D 1F680", + "char": "👨🏻‍🚀", + "name": "man astronaut: light skin tone" + }, + { + "no": 338, + "code": "1F468 1F3FC 200D 1F680", + "char": "👨🏼‍🚀", + "name": "man astronaut: medium-light skin tone" + }, + { + "no": 339, + "code": "1F468 1F3FD 200D 1F680", + "char": "👨🏽‍🚀", + "name": "man astronaut: medium skin tone" + }, + { + "no": 340, + "code": "1F468 1F3FE 200D 1F680", + "char": "👨🏾‍🚀", + "name": "man astronaut: medium-dark skin tone" + }, + { + "no": 341, + "code": "1F468 1F3FF 200D 1F680", + "char": "👨🏿‍🚀", + "name": "man astronaut: dark skin tone" + }, + { + "no": 342, + "code": "1F469 200D 1F680", + "char": "👩‍🚀", + "name": "woman astronaut" + }, + { + "no": 343, + "code": "1F469 1F3FB 200D 1F680", + "char": "👩🏻‍🚀", + "name": "woman astronaut: light skin tone" + }, + { + "no": 344, + "code": "1F469 1F3FC 200D 1F680", + "char": "👩🏼‍🚀", + "name": "woman astronaut: medium-light skin tone" + }, + { + "no": 345, + "code": "1F469 1F3FD 200D 1F680", + "char": "👩🏽‍🚀", + "name": "woman astronaut: medium skin tone" + }, + { + "no": 346, + "code": "1F469 1F3FE 200D 1F680", + "char": "👩🏾‍🚀", + "name": "woman astronaut: medium-dark skin tone" + }, + { + "no": 347, + "code": "1F469 1F3FF 200D 1F680", + "char": "👩🏿‍🚀", + "name": "woman astronaut: dark skin tone" + }, + { + "no": 348, + "code": "1F468 200D 1F692", + "char": "👨‍🚒", + "name": "man firefighter" + }, + { + "no": 349, + "code": "1F468 1F3FB 200D 1F692", + "char": "👨🏻‍🚒", + "name": "man firefighter: light skin tone" + }, + { + "no": 350, + "code": "1F468 1F3FC 200D 1F692", + "char": "👨🏼‍🚒", + "name": "man firefighter: medium-light skin tone" + }, + { + "no": 351, + "code": "1F468 1F3FD 200D 1F692", + "char": "👨🏽‍🚒", + "name": "man firefighter: medium skin tone" + }, + { + "no": 352, + "code": "1F468 1F3FE 200D 1F692", + "char": "👨🏾‍🚒", + "name": "man firefighter: medium-dark skin tone" + }, + { + "no": 353, + "code": "1F468 1F3FF 200D 1F692", + "char": "👨🏿‍🚒", + "name": "man firefighter: dark skin tone" + }, + { + "no": 354, + "code": "1F469 200D 1F692", + "char": "👩‍🚒", + "name": "woman firefighter" + }, + { + "no": 355, + "code": "1F469 1F3FB 200D 1F692", + "char": "👩🏻‍🚒", + "name": "woman firefighter: light skin tone" + }, + { + "no": 356, + "code": "1F469 1F3FC 200D 1F692", + "char": "👩🏼‍🚒", + "name": "woman firefighter: medium-light skin tone" + }, + { + "no": 357, + "code": "1F469 1F3FD 200D 1F692", + "char": "👩🏽‍🚒", + "name": "woman firefighter: medium skin tone" + }, + { + "no": 358, + "code": "1F469 1F3FE 200D 1F692", + "char": "👩🏾‍🚒", + "name": "woman firefighter: medium-dark skin tone" + }, + { + "no": 359, + "code": "1F469 1F3FF 200D 1F692", + "char": "👩🏿‍🚒", + "name": "woman firefighter: dark skin tone" + }, + { + "no": 360, + "code": "1F46E", + "char": "👮", + "name": "police officer" + }, + { + "no": 361, + "code": "1F46E 1F3FB", + "char": "👮🏻", + "name": "police officer: light skin tone" + }, + { + "no": 362, + "code": "1F46E 1F3FC", + "char": "👮🏼", + "name": "police officer: medium-light skin tone" + }, + { + "no": 363, + "code": "1F46E 1F3FD", + "char": "👮🏽", + "name": "police officer: medium skin tone" + }, + { + "no": 364, + "code": "1F46E 1F3FE", + "char": "👮🏾", + "name": "police officer: medium-dark skin tone" + }, + { + "no": 365, + "code": "1F46E 1F3FF", + "char": "👮🏿", + "name": "police officer: dark skin tone" + }, + { + "no": 366, + "code": "1F46E 200D 2642 FE0F", + "char": "👮‍♂️", + "name": "man police officer" + }, + { + "no": 367, + "code": "1F46E 1F3FB 200D 2642 FE0F", + "char": "👮🏻‍♂️", + "name": "man police officer: light skin tone" + }, + { + "no": 368, + "code": "1F46E 1F3FC 200D 2642 FE0F", + "char": "👮🏼‍♂️", + "name": "man police officer: medium-light skin tone" + }, + { + "no": 369, + "code": "1F46E 1F3FD 200D 2642 FE0F", + "char": "👮🏽‍♂️", + "name": "man police officer: medium skin tone" + }, + { + "no": 370, + "code": "1F46E 1F3FE 200D 2642 FE0F", + "char": "👮🏾‍♂️", + "name": "man police officer: medium-dark skin tone" + }, + { + "no": 371, + "code": "1F46E 1F3FF 200D 2642 FE0F", + "char": "👮🏿‍♂️", + "name": "man police officer: dark skin tone" + }, + { + "no": 372, + "code": "1F46E 200D 2640 FE0F", + "char": "👮‍♀️", + "name": "woman police officer" + }, + { + "no": 373, + "code": "1F46E 1F3FB 200D 2640 FE0F", + "char": "👮🏻‍♀️", + "name": "woman police officer: light skin tone" + }, + { + "no": 374, + "code": "1F46E 1F3FC 200D 2640 FE0F", + "char": "👮🏼‍♀️", + "name": "woman police officer: medium-light skin tone" + }, + { + "no": 375, + "code": "1F46E 1F3FD 200D 2640 FE0F", + "char": "👮🏽‍♀️", + "name": "woman police officer: medium skin tone" + }, + { + "no": 376, + "code": "1F46E 1F3FE 200D 2640 FE0F", + "char": "👮🏾‍♀️", + "name": "woman police officer: medium-dark skin tone" + }, + { + "no": 377, + "code": "1F46E 1F3FF 200D 2640 FE0F", + "char": "👮🏿‍♀️", + "name": "woman police officer: dark skin tone" + }, + { + "no": 378, + "code": "1F575", + "char": "🕵", + "name": "detective" + }, + { + "no": 379, + "code": "1F575 1F3FB", + "char": "🕵🏻", + "name": "detective: light skin tone" + }, + { + "no": 380, + "code": "1F575 1F3FC", + "char": "🕵🏼", + "name": "detective: medium-light skin tone" + }, + { + "no": 381, + "code": "1F575 1F3FD", + "char": "🕵🏽", + "name": "detective: medium skin tone" + }, + { + "no": 382, + "code": "1F575 1F3FE", + "char": "🕵🏾", + "name": "detective: medium-dark skin tone" + }, + { + "no": 383, + "code": "1F575 1F3FF", + "char": "🕵🏿", + "name": "detective: dark skin tone" + }, + { + "no": 384, + "code": "1F575 FE0F 200D 2642 FE0F", + "char": "🕵️‍♂️", + "name": "man detective" + }, + { + "no": 385, + "code": "1F575 1F3FB 200D 2642 FE0F", + "char": "🕵🏻‍♂️", + "name": "man detective: light skin tone" + }, + { + "no": 386, + "code": "1F575 1F3FC 200D 2642 FE0F", + "char": "🕵🏼‍♂️", + "name": "man detective: medium-light skin tone" + }, + { + "no": 387, + "code": "1F575 1F3FD 200D 2642 FE0F", + "char": "🕵🏽‍♂️", + "name": "man detective: medium skin tone" + }, + { + "no": 388, + "code": "1F575 1F3FE 200D 2642 FE0F", + "char": "🕵🏾‍♂️", + "name": "man detective: medium-dark skin tone" + }, + { + "no": 389, + "code": "1F575 1F3FF 200D 2642 FE0F", + "char": "🕵🏿‍♂️", + "name": "man detective: dark skin tone" + }, + { + "no": 390, + "code": "1F575 FE0F 200D 2640 FE0F", + "char": "🕵️‍♀️", + "name": "woman detective" + }, + { + "no": 391, + "code": "1F575 1F3FB 200D 2640 FE0F", + "char": "🕵🏻‍♀️", + "name": "woman detective: light skin tone" + }, + { + "no": 392, + "code": "1F575 1F3FC 200D 2640 FE0F", + "char": "🕵🏼‍♀️", + "name": "woman detective: medium-light skin tone" + }, + { + "no": 393, + "code": "1F575 1F3FD 200D 2640 FE0F", + "char": "🕵🏽‍♀️", + "name": "woman detective: medium skin tone" + }, + { + "no": 394, + "code": "1F575 1F3FE 200D 2640 FE0F", + "char": "🕵🏾‍♀️", + "name": "woman detective: medium-dark skin tone" + }, + { + "no": 395, + "code": "1F575 1F3FF 200D 2640 FE0F", + "char": "🕵🏿‍♀️", + "name": "woman detective: dark skin tone" + }, + { + "no": 396, + "code": "1F482", + "char": "💂", + "name": "guard" + }, + { + "no": 397, + "code": "1F482 1F3FB", + "char": "💂🏻", + "name": "guard: light skin tone" + }, + { + "no": 398, + "code": "1F482 1F3FC", + "char": "💂🏼", + "name": "guard: medium-light skin tone" + }, + { + "no": 399, + "code": "1F482 1F3FD", + "char": "💂🏽", + "name": "guard: medium skin tone" + }, + { + "no": 400, + "code": "1F482 1F3FE", + "char": "💂🏾", + "name": "guard: medium-dark skin tone" + }, + { + "no": 401, + "code": "1F482 1F3FF", + "char": "💂🏿", + "name": "guard: dark skin tone" + }, + { + "no": 402, + "code": "1F482 200D 2642 FE0F", + "char": "💂‍♂️", + "name": "man guard" + }, + { + "no": 403, + "code": "1F482 1F3FB 200D 2642 FE0F", + "char": "💂🏻‍♂️", + "name": "man guard: light skin tone" + }, + { + "no": 404, + "code": "1F482 1F3FC 200D 2642 FE0F", + "char": "💂🏼‍♂️", + "name": "man guard: medium-light skin tone" + }, + { + "no": 405, + "code": "1F482 1F3FD 200D 2642 FE0F", + "char": "💂🏽‍♂️", + "name": "man guard: medium skin tone" + }, + { + "no": 406, + "code": "1F482 1F3FE 200D 2642 FE0F", + "char": "💂🏾‍♂️", + "name": "man guard: medium-dark skin tone" + }, + { + "no": 407, + "code": "1F482 1F3FF 200D 2642 FE0F", + "char": "💂🏿‍♂️", + "name": "man guard: dark skin tone" + }, + { + "no": 408, + "code": "1F482 200D 2640 FE0F", + "char": "💂‍♀️", + "name": "woman guard" + }, + { + "no": 409, + "code": "1F482 1F3FB 200D 2640 FE0F", + "char": "💂🏻‍♀️", + "name": "woman guard: light skin tone" + }, + { + "no": 410, + "code": "1F482 1F3FC 200D 2640 FE0F", + "char": "💂🏼‍♀️", + "name": "woman guard: medium-light skin tone" + }, + { + "no": 411, + "code": "1F482 1F3FD 200D 2640 FE0F", + "char": "💂🏽‍♀️", + "name": "woman guard: medium skin tone" + }, + { + "no": 412, + "code": "1F482 1F3FE 200D 2640 FE0F", + "char": "💂🏾‍♀️", + "name": "woman guard: medium-dark skin tone" + }, + { + "no": 413, + "code": "1F482 1F3FF 200D 2640 FE0F", + "char": "💂🏿‍♀️", + "name": "woman guard: dark skin tone" + }, + { + "no": 414, + "code": "1F477", + "char": "👷", + "name": "construction worker" + }, + { + "no": 415, + "code": "1F477 1F3FB", + "char": "👷🏻", + "name": "construction worker: light skin tone" + }, + { + "no": 416, + "code": "1F477 1F3FC", + "char": "👷🏼", + "name": "construction worker: medium-light skin tone" + }, + { + "no": 417, + "code": "1F477 1F3FD", + "char": "👷🏽", + "name": "construction worker: medium skin tone" + }, + { + "no": 418, + "code": "1F477 1F3FE", + "char": "👷🏾", + "name": "construction worker: medium-dark skin tone" + }, + { + "no": 419, + "code": "1F477 1F3FF", + "char": "👷🏿", + "name": "construction worker: dark skin tone" + }, + { + "no": 420, + "code": "1F477 200D 2642 FE0F", + "char": "👷‍♂️", + "name": "man construction worker" + }, + { + "no": 421, + "code": "1F477 1F3FB 200D 2642 FE0F", + "char": "👷🏻‍♂️", + "name": "man construction worker: light skin tone" + }, + { + "no": 422, + "code": "1F477 1F3FC 200D 2642 FE0F", + "char": "👷🏼‍♂️", + "name": "man construction worker: medium-light skin tone" + }, + { + "no": 423, + "code": "1F477 1F3FD 200D 2642 FE0F", + "char": "👷🏽‍♂️", + "name": "man construction worker: medium skin tone" + }, + { + "no": 424, + "code": "1F477 1F3FE 200D 2642 FE0F", + "char": "👷🏾‍♂️", + "name": "man construction worker: medium-dark skin tone" + }, + { + "no": 425, + "code": "1F477 1F3FF 200D 2642 FE0F", + "char": "👷🏿‍♂️", + "name": "man construction worker: dark skin tone" + }, + { + "no": 426, + "code": "1F477 200D 2640 FE0F", + "char": "👷‍♀️", + "name": "woman construction worker" + }, + { + "no": 427, + "code": "1F477 1F3FB 200D 2640 FE0F", + "char": "👷🏻‍♀️", + "name": "woman construction worker: light skin tone" + }, + { + "no": 428, + "code": "1F477 1F3FC 200D 2640 FE0F", + "char": "👷🏼‍♀️", + "name": "woman construction worker: medium-light skin tone" + }, + { + "no": 429, + "code": "1F477 1F3FD 200D 2640 FE0F", + "char": "👷🏽‍♀️", + "name": "woman construction worker: medium skin tone" + }, + { + "no": 430, + "code": "1F477 1F3FE 200D 2640 FE0F", + "char": "👷🏾‍♀️", + "name": "woman construction worker: medium-dark skin tone" + }, + { + "no": 431, + "code": "1F477 1F3FF 200D 2640 FE0F", + "char": "👷🏿‍♀️", + "name": "woman construction worker: dark skin tone" + }, + { + "no": 432, + "code": "1F934", + "char": "🤴", + "name": "prince" + }, + { + "no": 433, + "code": "1F934 1F3FB", + "char": "🤴🏻", + "name": "prince: light skin tone" + }, + { + "no": 434, + "code": "1F934 1F3FC", + "char": "🤴🏼", + "name": "prince: medium-light skin tone" + }, + { + "no": 435, + "code": "1F934 1F3FD", + "char": "🤴🏽", + "name": "prince: medium skin tone" + }, + { + "no": 436, + "code": "1F934 1F3FE", + "char": "🤴🏾", + "name": "prince: medium-dark skin tone" + }, + { + "no": 437, + "code": "1F934 1F3FF", + "char": "🤴🏿", + "name": "prince: dark skin tone" + }, + { + "no": 438, + "code": "1F478", + "char": "👸", + "name": "princess" + }, + { + "no": 439, + "code": "1F478 1F3FB", + "char": "👸🏻", + "name": "princess: light skin tone" + }, + { + "no": 440, + "code": "1F478 1F3FC", + "char": "👸🏼", + "name": "princess: medium-light skin tone" + }, + { + "no": 441, + "code": "1F478 1F3FD", + "char": "👸🏽", + "name": "princess: medium skin tone" + }, + { + "no": 442, + "code": "1F478 1F3FE", + "char": "👸🏾", + "name": "princess: medium-dark skin tone" + }, + { + "no": 443, + "code": "1F478 1F3FF", + "char": "👸🏿", + "name": "princess: dark skin tone" + }, + { + "no": 444, + "code": "1F473", + "char": "👳", + "name": "person wearing turban" + }, + { + "no": 445, + "code": "1F473 1F3FB", + "char": "👳🏻", + "name": "person wearing turban: light skin tone" + }, + { + "no": 446, + "code": "1F473 1F3FC", + "char": "👳🏼", + "name": "person wearing turban: medium-light skin tone" + }, + { + "no": 447, + "code": "1F473 1F3FD", + "char": "👳🏽", + "name": "person wearing turban: medium skin tone" + }, + { + "no": 448, + "code": "1F473 1F3FE", + "char": "👳🏾", + "name": "person wearing turban: medium-dark skin tone" + }, + { + "no": 449, + "code": "1F473 1F3FF", + "char": "👳🏿", + "name": "person wearing turban: dark skin tone" + }, + { + "no": 450, + "code": "1F473 200D 2642 FE0F", + "char": "👳‍♂️", + "name": "man wearing turban" + }, + { + "no": 451, + "code": "1F473 1F3FB 200D 2642 FE0F", + "char": "👳🏻‍♂️", + "name": "man wearing turban: light skin tone" + }, + { + "no": 452, + "code": "1F473 1F3FC 200D 2642 FE0F", + "char": "👳🏼‍♂️", + "name": "man wearing turban: medium-light skin tone" + }, + { + "no": 453, + "code": "1F473 1F3FD 200D 2642 FE0F", + "char": "👳🏽‍♂️", + "name": "man wearing turban: medium skin tone" + }, + { + "no": 454, + "code": "1F473 1F3FE 200D 2642 FE0F", + "char": "👳🏾‍♂️", + "name": "man wearing turban: medium-dark skin tone" + }, + { + "no": 455, + "code": "1F473 1F3FF 200D 2642 FE0F", + "char": "👳🏿‍♂️", + "name": "man wearing turban: dark skin tone" + }, + { + "no": 456, + "code": "1F473 200D 2640 FE0F", + "char": "👳‍♀️", + "name": "woman wearing turban" + }, + { + "no": 457, + "code": "1F473 1F3FB 200D 2640 FE0F", + "char": "👳🏻‍♀️", + "name": "woman wearing turban: light skin tone" + }, + { + "no": 458, + "code": "1F473 1F3FC 200D 2640 FE0F", + "char": "👳🏼‍♀️", + "name": "woman wearing turban: medium-light skin tone" + }, + { + "no": 459, + "code": "1F473 1F3FD 200D 2640 FE0F", + "char": "👳🏽‍♀️", + "name": "woman wearing turban: medium skin tone" + }, + { + "no": 460, + "code": "1F473 1F3FE 200D 2640 FE0F", + "char": "👳🏾‍♀️", + "name": "woman wearing turban: medium-dark skin tone" + }, + { + "no": 461, + "code": "1F473 1F3FF 200D 2640 FE0F", + "char": "👳🏿‍♀️", + "name": "woman wearing turban: dark skin tone" + }, + { + "no": 462, + "code": "1F472", + "char": "👲", + "name": "man with Chinese cap" + }, + { + "no": 463, + "code": "1F472 1F3FB", + "char": "👲🏻", + "name": "man with Chinese cap: light skin tone" + }, + { + "no": 464, + "code": "1F472 1F3FC", + "char": "👲🏼", + "name": "man with Chinese cap: medium-light skin tone" + }, + { + "no": 465, + "code": "1F472 1F3FD", + "char": "👲🏽", + "name": "man with Chinese cap: medium skin tone" + }, + { + "no": 466, + "code": "1F472 1F3FE", + "char": "👲🏾", + "name": "man with Chinese cap: medium-dark skin tone" + }, + { + "no": 467, + "code": "1F472 1F3FF", + "char": "👲🏿", + "name": "man with Chinese cap: dark skin tone" + }, + { + "no": 468, + "code": "1F9D5", + "char": "🧕", + "name": "⊛ woman with headscarf" + }, + { + "no": 469, + "code": "1F9D5 1F3FB", + "char": "🧕🏻", + "name": "⊛ woman with headscarf: light skin tone" + }, + { + "no": 470, + "code": "1F9D5 1F3FC", + "char": "🧕🏼", + "name": "⊛ woman with headscarf: medium-light skin tone" + }, + { + "no": 471, + "code": "1F9D5 1F3FD", + "char": "🧕🏽", + "name": "⊛ woman with headscarf: medium skin tone" + }, + { + "no": 472, + "code": "1F9D5 1F3FE", + "char": "🧕🏾", + "name": "⊛ woman with headscarf: medium-dark skin tone" + }, + { + "no": 473, + "code": "1F9D5 1F3FF", + "char": "🧕🏿", + "name": "⊛ woman with headscarf: dark skin tone" + }, + { + "no": 474, + "code": "1F9D4", + "char": "🧔", + "name": "⊛ bearded person" + }, + { + "no": 475, + "code": "1F9D4 1F3FB", + "char": "🧔🏻", + "name": "⊛ bearded person: light skin tone" + }, + { + "no": 476, + "code": "1F9D4 1F3FC", + "char": "🧔🏼", + "name": "⊛ bearded person: medium-light skin tone" + }, + { + "no": 477, + "code": "1F9D4 1F3FD", + "char": "🧔🏽", + "name": "⊛ bearded person: medium skin tone" + }, + { + "no": 478, + "code": "1F9D4 1F3FE", + "char": "🧔🏾", + "name": "⊛ bearded person: medium-dark skin tone" + }, + { + "no": 479, + "code": "1F9D4 1F3FF", + "char": "🧔🏿", + "name": "⊛ bearded person: dark skin tone" + }, + { + "no": 480, + "code": "1F471", + "char": "👱", + "name": "blond-haired person" + }, + { + "no": 481, + "code": "1F471 1F3FB", + "char": "👱🏻", + "name": "blond-haired person: light skin tone" + }, + { + "no": 482, + "code": "1F471 1F3FC", + "char": "👱🏼", + "name": "blond-haired person: medium-light skin tone" + }, + { + "no": 483, + "code": "1F471 1F3FD", + "char": "👱🏽", + "name": "blond-haired person: medium skin tone" + }, + { + "no": 484, + "code": "1F471 1F3FE", + "char": "👱🏾", + "name": "blond-haired person: medium-dark skin tone" + }, + { + "no": 485, + "code": "1F471 1F3FF", + "char": "👱🏿", + "name": "blond-haired person: dark skin tone" + }, + { + "no": 486, + "code": "1F471 200D 2642 FE0F", + "char": "👱‍♂️", + "name": "blond-haired man" + }, + { + "no": 487, + "code": "1F471 1F3FB 200D 2642 FE0F", + "char": "👱🏻‍♂️", + "name": "blond-haired man: light skin tone" + }, + { + "no": 488, + "code": "1F471 1F3FC 200D 2642 FE0F", + "char": "👱🏼‍♂️", + "name": "blond-haired man: medium-light skin tone" + }, + { + "no": 489, + "code": "1F471 1F3FD 200D 2642 FE0F", + "char": "👱🏽‍♂️", + "name": "blond-haired man: medium skin tone" + }, + { + "no": 490, + "code": "1F471 1F3FE 200D 2642 FE0F", + "char": "👱🏾‍♂️", + "name": "blond-haired man: medium-dark skin tone" + }, + { + "no": 491, + "code": "1F471 1F3FF 200D 2642 FE0F", + "char": "👱🏿‍♂️", + "name": "blond-haired man: dark skin tone" + }, + { + "no": 492, + "code": "1F471 200D 2640 FE0F", + "char": "👱‍♀️", + "name": "blond-haired woman" + }, + { + "no": 493, + "code": "1F471 1F3FB 200D 2640 FE0F", + "char": "👱🏻‍♀️", + "name": "blond-haired woman: light skin tone" + }, + { + "no": 494, + "code": "1F471 1F3FC 200D 2640 FE0F", + "char": "👱🏼‍♀️", + "name": "blond-haired woman: medium-light skin tone" + }, + { + "no": 495, + "code": "1F471 1F3FD 200D 2640 FE0F", + "char": "👱🏽‍♀️", + "name": "blond-haired woman: medium skin tone" + }, + { + "no": 496, + "code": "1F471 1F3FE 200D 2640 FE0F", + "char": "👱🏾‍♀️", + "name": "blond-haired woman: medium-dark skin tone" + }, + { + "no": 497, + "code": "1F471 1F3FF 200D 2640 FE0F", + "char": "👱🏿‍♀️", + "name": "blond-haired woman: dark skin tone" + }, + { + "no": 498, + "code": "1F935", + "char": "🤵", + "name": "man in tuxedo" + }, + { + "no": 499, + "code": "1F935 1F3FB", + "char": "🤵🏻", + "name": "man in tuxedo: light skin tone" + }, + { + "no": 500, + "code": "1F935 1F3FC", + "char": "🤵🏼", + "name": "man in tuxedo: medium-light skin tone" + }, + { + "no": 501, + "code": "1F935 1F3FD", + "char": "🤵🏽", + "name": "man in tuxedo: medium skin tone" + }, + { + "no": 502, + "code": "1F935 1F3FE", + "char": "🤵🏾", + "name": "man in tuxedo: medium-dark skin tone" + }, + { + "no": 503, + "code": "1F935 1F3FF", + "char": "🤵🏿", + "name": "man in tuxedo: dark skin tone" + }, + { + "no": 504, + "code": "1F470", + "char": "👰", + "name": "bride with veil" + }, + { + "no": 505, + "code": "1F470 1F3FB", + "char": "👰🏻", + "name": "bride with veil: light skin tone" + }, + { + "no": 506, + "code": "1F470 1F3FC", + "char": "👰🏼", + "name": "bride with veil: medium-light skin tone" + }, + { + "no": 507, + "code": "1F470 1F3FD", + "char": "👰🏽", + "name": "bride with veil: medium skin tone" + }, + { + "no": 508, + "code": "1F470 1F3FE", + "char": "👰🏾", + "name": "bride with veil: medium-dark skin tone" + }, + { + "no": 509, + "code": "1F470 1F3FF", + "char": "👰🏿", + "name": "bride with veil: dark skin tone" + }, + { + "no": 510, + "code": "1F930", + "char": "🤰", + "name": "pregnant woman" + }, + { + "no": 511, + "code": "1F930 1F3FB", + "char": "🤰🏻", + "name": "pregnant woman: light skin tone" + }, + { + "no": 512, + "code": "1F930 1F3FC", + "char": "🤰🏼", + "name": "pregnant woman: medium-light skin tone" + }, + { + "no": 513, + "code": "1F930 1F3FD", + "char": "🤰🏽", + "name": "pregnant woman: medium skin tone" + }, + { + "no": 514, + "code": "1F930 1F3FE", + "char": "🤰🏾", + "name": "pregnant woman: medium-dark skin tone" + }, + { + "no": 515, + "code": "1F930 1F3FF", + "char": "🤰🏿", + "name": "pregnant woman: dark skin tone" + }, + { + "no": 516, + "code": "1F931", + "char": "🤱", + "name": "⊛ breast-feeding" + }, + { + "no": 517, + "code": "1F931 1F3FB", + "char": "🤱🏻", + "name": "⊛ breast-feeding: light skin tone" + }, + { + "no": 518, + "code": "1F931 1F3FC", + "char": "🤱🏼", + "name": "⊛ breast-feeding: medium-light skin tone" + }, + { + "no": 519, + "code": "1F931 1F3FD", + "char": "🤱🏽", + "name": "⊛ breast-feeding: medium skin tone" + }, + { + "no": 520, + "code": "1F931 1F3FE", + "char": "🤱🏾", + "name": "⊛ breast-feeding: medium-dark skin tone" + }, + { + "no": 521, + "code": "1F931 1F3FF", + "char": "🤱🏿", + "name": "⊛ breast-feeding: dark skin tone" + }, + { + "no": 522, + "code": "1F47C", + "char": "👼", + "name": "baby angel" + }, + { + "no": 523, + "code": "1F47C 1F3FB", + "char": "👼🏻", + "name": "baby angel: light skin tone" + }, + { + "no": 524, + "code": "1F47C 1F3FC", + "char": "👼🏼", + "name": "baby angel: medium-light skin tone" + }, + { + "no": 525, + "code": "1F47C 1F3FD", + "char": "👼🏽", + "name": "baby angel: medium skin tone" + }, + { + "no": 526, + "code": "1F47C 1F3FE", + "char": "👼🏾", + "name": "baby angel: medium-dark skin tone" + }, + { + "no": 527, + "code": "1F47C 1F3FF", + "char": "👼🏿", + "name": "baby angel: dark skin tone" + }, + { + "no": 528, + "code": "1F385", + "char": "🎅", + "name": "Santa Claus" + }, + { + "no": 529, + "code": "1F385 1F3FB", + "char": "🎅🏻", + "name": "Santa Claus: light skin tone" + }, + { + "no": 530, + "code": "1F385 1F3FC", + "char": "🎅🏼", + "name": "Santa Claus: medium-light skin tone" + }, + { + "no": 531, + "code": "1F385 1F3FD", + "char": "🎅🏽", + "name": "Santa Claus: medium skin tone" + }, + { + "no": 532, + "code": "1F385 1F3FE", + "char": "🎅🏾", + "name": "Santa Claus: medium-dark skin tone" + }, + { + "no": 533, + "code": "1F385 1F3FF", + "char": "🎅🏿", + "name": "Santa Claus: dark skin tone" + }, + { + "no": 534, + "code": "1F936", + "char": "🤶", + "name": "Mrs. Claus" + }, + { + "no": 535, + "code": "1F936 1F3FB", + "char": "🤶🏻", + "name": "Mrs. Claus: light skin tone" + }, + { + "no": 536, + "code": "1F936 1F3FC", + "char": "🤶🏼", + "name": "Mrs. Claus: medium-light skin tone" + }, + { + "no": 537, + "code": "1F936 1F3FD", + "char": "🤶🏽", + "name": "Mrs. Claus: medium skin tone" + }, + { + "no": 538, + "code": "1F936 1F3FE", + "char": "🤶🏾", + "name": "Mrs. Claus: medium-dark skin tone" + }, + { + "no": 539, + "code": "1F936 1F3FF", + "char": "🤶🏿", + "name": "Mrs. Claus: dark skin tone" + }, + { + "no": 540, + "code": "1F9D9", + "char": "🧙", + "name": "⊛ mage" + }, + { + "no": 541, + "code": "1F9D9 1F3FB", + "char": "🧙🏻", + "name": "⊛ mage: light skin tone" + }, + { + "no": 542, + "code": "1F9D9 1F3FC", + "char": "🧙🏼", + "name": "⊛ mage: medium-light skin tone" + }, + { + "no": 543, + "code": "1F9D9 1F3FD", + "char": "🧙🏽", + "name": "⊛ mage: medium skin tone" + }, + { + "no": 544, + "code": "1F9D9 1F3FE", + "char": "🧙🏾", + "name": "⊛ mage: medium-dark skin tone" + }, + { + "no": 545, + "code": "1F9D9 1F3FF", + "char": "🧙🏿", + "name": "⊛ mage: dark skin tone" + }, + { + "no": 546, + "code": "1F9D9 200D 2640 FE0F", + "char": "🧙‍♀️", + "name": "⊛ woman mage" + }, + { + "no": 547, + "code": "1F9D9 1F3FB 200D 2640 FE0F", + "char": "🧙🏻‍♀️", + "name": "⊛ woman mage: light skin tone" + }, + { + "no": 548, + "code": "1F9D9 1F3FC 200D 2640 FE0F", + "char": "🧙🏼‍♀️", + "name": "⊛ woman mage: medium-light skin tone" + }, + { + "no": 549, + "code": "1F9D9 1F3FD 200D 2640 FE0F", + "char": "🧙🏽‍♀️", + "name": "⊛ woman mage: medium skin tone" + }, + { + "no": 550, + "code": "1F9D9 1F3FE 200D 2640 FE0F", + "char": "🧙🏾‍♀️", + "name": "⊛ woman mage: medium-dark skin tone" + }, + { + "no": 551, + "code": "1F9D9 1F3FF 200D 2640 FE0F", + "char": "🧙🏿‍♀️", + "name": "⊛ woman mage: dark skin tone" + }, + { + "no": 552, + "code": "1F9D9 200D 2642 FE0F", + "char": "🧙‍♂️", + "name": "⊛ man mage" + }, + { + "no": 553, + "code": "1F9D9 1F3FB 200D 2642 FE0F", + "char": "🧙🏻‍♂️", + "name": "⊛ man mage: light skin tone" + }, + { + "no": 554, + "code": "1F9D9 1F3FC 200D 2642 FE0F", + "char": "🧙🏼‍♂️", + "name": "⊛ man mage: medium-light skin tone" + }, + { + "no": 555, + "code": "1F9D9 1F3FD 200D 2642 FE0F", + "char": "🧙🏽‍♂️", + "name": "⊛ man mage: medium skin tone" + }, + { + "no": 556, + "code": "1F9D9 1F3FE 200D 2642 FE0F", + "char": "🧙🏾‍♂️", + "name": "⊛ man mage: medium-dark skin tone" + }, + { + "no": 557, + "code": "1F9D9 1F3FF 200D 2642 FE0F", + "char": "🧙🏿‍♂️", + "name": "⊛ man mage: dark skin tone" + }, + { + "no": 558, + "code": "1F9DA", + "char": "🧚", + "name": "⊛ fairy" + }, + { + "no": 559, + "code": "1F9DA 1F3FB", + "char": "🧚🏻", + "name": "⊛ fairy: light skin tone" + }, + { + "no": 560, + "code": "1F9DA 1F3FC", + "char": "🧚🏼", + "name": "⊛ fairy: medium-light skin tone" + }, + { + "no": 561, + "code": "1F9DA 1F3FD", + "char": "🧚🏽", + "name": "⊛ fairy: medium skin tone" + }, + { + "no": 562, + "code": "1F9DA 1F3FE", + "char": "🧚🏾", + "name": "⊛ fairy: medium-dark skin tone" + }, + { + "no": 563, + "code": "1F9DA 1F3FF", + "char": "🧚🏿", + "name": "⊛ fairy: dark skin tone" + }, + { + "no": 564, + "code": "1F9DA 200D 2640 FE0F", + "char": "🧚‍♀️", + "name": "⊛ woman fairy" + }, + { + "no": 565, + "code": "1F9DA 1F3FB 200D 2640 FE0F", + "char": "🧚🏻‍♀️", + "name": "⊛ woman fairy: light skin tone" + }, + { + "no": 566, + "code": "1F9DA 1F3FC 200D 2640 FE0F", + "char": "🧚🏼‍♀️", + "name": "⊛ woman fairy: medium-light skin tone" + }, + { + "no": 567, + "code": "1F9DA 1F3FD 200D 2640 FE0F", + "char": "🧚🏽‍♀️", + "name": "⊛ woman fairy: medium skin tone" + }, + { + "no": 568, + "code": "1F9DA 1F3FE 200D 2640 FE0F", + "char": "🧚🏾‍♀️", + "name": "⊛ woman fairy: medium-dark skin tone" + }, + { + "no": 569, + "code": "1F9DA 1F3FF 200D 2640 FE0F", + "char": "🧚🏿‍♀️", + "name": "⊛ woman fairy: dark skin tone" + }, + { + "no": 570, + "code": "1F9DA 200D 2642 FE0F", + "char": "🧚‍♂️", + "name": "⊛ man fairy" + }, + { + "no": 571, + "code": "1F9DA 1F3FB 200D 2642 FE0F", + "char": "🧚🏻‍♂️", + "name": "⊛ man fairy: light skin tone" + }, + { + "no": 572, + "code": "1F9DA 1F3FC 200D 2642 FE0F", + "char": "🧚🏼‍♂️", + "name": "⊛ man fairy: medium-light skin tone" + }, + { + "no": 573, + "code": "1F9DA 1F3FD 200D 2642 FE0F", + "char": "🧚🏽‍♂️", + "name": "⊛ man fairy: medium skin tone" + }, + { + "no": 574, + "code": "1F9DA 1F3FE 200D 2642 FE0F", + "char": "🧚🏾‍♂️", + "name": "⊛ man fairy: medium-dark skin tone" + }, + { + "no": 575, + "code": "1F9DA 1F3FF 200D 2642 FE0F", + "char": "🧚🏿‍♂️", + "name": "⊛ man fairy: dark skin tone" + }, + { + "no": 576, + "code": "1F9DB", + "char": "🧛", + "name": "⊛ vampire" + }, + { + "no": 577, + "code": "1F9DB 1F3FB", + "char": "🧛🏻", + "name": "⊛ vampire: light skin tone" + }, + { + "no": 578, + "code": "1F9DB 1F3FC", + "char": "🧛🏼", + "name": "⊛ vampire: medium-light skin tone" + }, + { + "no": 579, + "code": "1F9DB 1F3FD", + "char": "🧛🏽", + "name": "⊛ vampire: medium skin tone" + }, + { + "no": 580, + "code": "1F9DB 1F3FE", + "char": "🧛🏾", + "name": "⊛ vampire: medium-dark skin tone" + }, + { + "no": 581, + "code": "1F9DB 1F3FF", + "char": "🧛🏿", + "name": "⊛ vampire: dark skin tone" + }, + { + "no": 582, + "code": "1F9DB 200D 2640 FE0F", + "char": "🧛‍♀️", + "name": "⊛ woman vampire" + }, + { + "no": 583, + "code": "1F9DB 1F3FB 200D 2640 FE0F", + "char": "🧛🏻‍♀️", + "name": "⊛ woman vampire: light skin tone" + }, + { + "no": 584, + "code": "1F9DB 1F3FC 200D 2640 FE0F", + "char": "🧛🏼‍♀️", + "name": "⊛ woman vampire: medium-light skin tone" + }, + { + "no": 585, + "code": "1F9DB 1F3FD 200D 2640 FE0F", + "char": "🧛🏽‍♀️", + "name": "⊛ woman vampire: medium skin tone" + }, + { + "no": 586, + "code": "1F9DB 1F3FE 200D 2640 FE0F", + "char": "🧛🏾‍♀️", + "name": "⊛ woman vampire: medium-dark skin tone" + }, + { + "no": 587, + "code": "1F9DB 1F3FF 200D 2640 FE0F", + "char": "🧛🏿‍♀️", + "name": "⊛ woman vampire: dark skin tone" + }, + { + "no": 588, + "code": "1F9DB 200D 2642 FE0F", + "char": "🧛‍♂️", + "name": "⊛ man vampire" + }, + { + "no": 589, + "code": "1F9DB 1F3FB 200D 2642 FE0F", + "char": "🧛🏻‍♂️", + "name": "⊛ man vampire: light skin tone" + }, + { + "no": 590, + "code": "1F9DB 1F3FC 200D 2642 FE0F", + "char": "🧛🏼‍♂️", + "name": "⊛ man vampire: medium-light skin tone" + }, + { + "no": 591, + "code": "1F9DB 1F3FD 200D 2642 FE0F", + "char": "🧛🏽‍♂️", + "name": "⊛ man vampire: medium skin tone" + }, + { + "no": 592, + "code": "1F9DB 1F3FE 200D 2642 FE0F", + "char": "🧛🏾‍♂️", + "name": "⊛ man vampire: medium-dark skin tone" + }, + { + "no": 593, + "code": "1F9DB 1F3FF 200D 2642 FE0F", + "char": "🧛🏿‍♂️", + "name": "⊛ man vampire: dark skin tone" + }, + { + "no": 594, + "code": "1F9DC", + "char": "🧜", + "name": "⊛ merperson" + }, + { + "no": 595, + "code": "1F9DC 1F3FB", + "char": "🧜🏻", + "name": "⊛ merperson: light skin tone" + }, + { + "no": 596, + "code": "1F9DC 1F3FC", + "char": "🧜🏼", + "name": "⊛ merperson: medium-light skin tone" + }, + { + "no": 597, + "code": "1F9DC 1F3FD", + "char": "🧜🏽", + "name": "⊛ merperson: medium skin tone" + }, + { + "no": 598, + "code": "1F9DC 1F3FE", + "char": "🧜🏾", + "name": "⊛ merperson: medium-dark skin tone" + }, + { + "no": 599, + "code": "1F9DC 1F3FF", + "char": "🧜🏿", + "name": "⊛ merperson: dark skin tone" + }, + { + "no": 600, + "code": "1F9DC 200D 2640 FE0F", + "char": "🧜‍♀️", + "name": "⊛ mermaid" + }, + { + "no": 601, + "code": "1F9DC 1F3FB 200D 2640 FE0F", + "char": "🧜🏻‍♀️", + "name": "⊛ mermaid: light skin tone" + }, + { + "no": 602, + "code": "1F9DC 1F3FC 200D 2640 FE0F", + "char": "🧜🏼‍♀️", + "name": "⊛ mermaid: medium-light skin tone" + }, + { + "no": 603, + "code": "1F9DC 1F3FD 200D 2640 FE0F", + "char": "🧜🏽‍♀️", + "name": "⊛ mermaid: medium skin tone" + }, + { + "no": 604, + "code": "1F9DC 1F3FE 200D 2640 FE0F", + "char": "🧜🏾‍♀️", + "name": "⊛ mermaid: medium-dark skin tone" + }, + { + "no": 605, + "code": "1F9DC 1F3FF 200D 2640 FE0F", + "char": "🧜🏿‍♀️", + "name": "⊛ mermaid: dark skin tone" + }, + { + "no": 606, + "code": "1F9DC 200D 2642 FE0F", + "char": "🧜‍♂️", + "name": "⊛ merman" + }, + { + "no": 607, + "code": "1F9DC 1F3FB 200D 2642 FE0F", + "char": "🧜🏻‍♂️", + "name": "⊛ merman: light skin tone" + }, + { + "no": 608, + "code": "1F9DC 1F3FC 200D 2642 FE0F", + "char": "🧜🏼‍♂️", + "name": "⊛ merman: medium-light skin tone" + }, + { + "no": 609, + "code": "1F9DC 1F3FD 200D 2642 FE0F", + "char": "🧜🏽‍♂️", + "name": "⊛ merman: medium skin tone" + }, + { + "no": 610, + "code": "1F9DC 1F3FE 200D 2642 FE0F", + "char": "🧜🏾‍♂️", + "name": "⊛ merman: medium-dark skin tone" + }, + { + "no": 611, + "code": "1F9DC 1F3FF 200D 2642 FE0F", + "char": "🧜🏿‍♂️", + "name": "⊛ merman: dark skin tone" + }, + { + "no": 612, + "code": "1F9DD", + "char": "🧝", + "name": "⊛ elf" + }, + { + "no": 613, + "code": "1F9DD 1F3FB", + "char": "🧝🏻", + "name": "⊛ elf: light skin tone" + }, + { + "no": 614, + "code": "1F9DD 1F3FC", + "char": "🧝🏼", + "name": "⊛ elf: medium-light skin tone" + }, + { + "no": 615, + "code": "1F9DD 1F3FD", + "char": "🧝🏽", + "name": "⊛ elf: medium skin tone" + }, + { + "no": 616, + "code": "1F9DD 1F3FE", + "char": "🧝🏾", + "name": "⊛ elf: medium-dark skin tone" + }, + { + "no": 617, + "code": "1F9DD 1F3FF", + "char": "🧝🏿", + "name": "⊛ elf: dark skin tone" + }, + { + "no": 618, + "code": "1F9DD 200D 2640 FE0F", + "char": "🧝‍♀️", + "name": "⊛ woman elf" + }, + { + "no": 619, + "code": "1F9DD 1F3FB 200D 2640 FE0F", + "char": "🧝🏻‍♀️", + "name": "⊛ woman elf: light skin tone" + }, + { + "no": 620, + "code": "1F9DD 1F3FC 200D 2640 FE0F", + "char": "🧝🏼‍♀️", + "name": "⊛ woman elf: medium-light skin tone" + }, + { + "no": 621, + "code": "1F9DD 1F3FD 200D 2640 FE0F", + "char": "🧝🏽‍♀️", + "name": "⊛ woman elf: medium skin tone" + }, + { + "no": 622, + "code": "1F9DD 1F3FE 200D 2640 FE0F", + "char": "🧝🏾‍♀️", + "name": "⊛ woman elf: medium-dark skin tone" + }, + { + "no": 623, + "code": "1F9DD 1F3FF 200D 2640 FE0F", + "char": "🧝🏿‍♀️", + "name": "⊛ woman elf: dark skin tone" + }, + { + "no": 624, + "code": "1F9DD 200D 2642 FE0F", + "char": "🧝‍♂️", + "name": "⊛ man elf" + }, + { + "no": 625, + "code": "1F9DD 1F3FB 200D 2642 FE0F", + "char": "🧝🏻‍♂️", + "name": "⊛ man elf: light skin tone" + }, + { + "no": 626, + "code": "1F9DD 1F3FC 200D 2642 FE0F", + "char": "🧝🏼‍♂️", + "name": "⊛ man elf: medium-light skin tone" + }, + { + "no": 627, + "code": "1F9DD 1F3FD 200D 2642 FE0F", + "char": "🧝🏽‍♂️", + "name": "⊛ man elf: medium skin tone" + }, + { + "no": 628, + "code": "1F9DD 1F3FE 200D 2642 FE0F", + "char": "🧝🏾‍♂️", + "name": "⊛ man elf: medium-dark skin tone" + }, + { + "no": 629, + "code": "1F9DD 1F3FF 200D 2642 FE0F", + "char": "🧝🏿‍♂️", + "name": "⊛ man elf: dark skin tone" + }, + { + "no": 630, + "code": "1F9DE", + "char": "🧞", + "name": "⊛ genie" + }, + { + "no": 631, + "code": "1F9DE 200D 2640 FE0F", + "char": "🧞‍♀️", + "name": "⊛ woman genie" + }, + { + "no": 632, + "code": "1F9DE 200D 2642 FE0F", + "char": "🧞‍♂️", + "name": "⊛ man genie" + }, + { + "no": 633, + "code": "1F9DF", + "char": "🧟", + "name": "⊛ zombie" + }, + { + "no": 634, + "code": "1F9DF 200D 2640 FE0F", + "char": "🧟‍♀️", + "name": "⊛ woman zombie" + }, + { + "no": 635, + "code": "1F9DF 200D 2642 FE0F", + "char": "🧟‍♂️", + "name": "⊛ man zombie" + }, + { + "no": 636, + "code": "1F64D", + "char": "🙍", + "name": "person frowning" + }, + { + "no": 637, + "code": "1F64D 1F3FB", + "char": "🙍🏻", + "name": "person frowning: light skin tone" + }, + { + "no": 638, + "code": "1F64D 1F3FC", + "char": "🙍🏼", + "name": "person frowning: medium-light skin tone" + }, + { + "no": 639, + "code": "1F64D 1F3FD", + "char": "🙍🏽", + "name": "person frowning: medium skin tone" + }, + { + "no": 640, + "code": "1F64D 1F3FE", + "char": "🙍🏾", + "name": "person frowning: medium-dark skin tone" + }, + { + "no": 641, + "code": "1F64D 1F3FF", + "char": "🙍🏿", + "name": "person frowning: dark skin tone" + }, + { + "no": 642, + "code": "1F64D 200D 2642 FE0F", + "char": "🙍‍♂️", + "name": "man frowning" + }, + { + "no": 643, + "code": "1F64D 1F3FB 200D 2642 FE0F", + "char": "🙍🏻‍♂️", + "name": "man frowning: light skin tone" + }, + { + "no": 644, + "code": "1F64D 1F3FC 200D 2642 FE0F", + "char": "🙍🏼‍♂️", + "name": "man frowning: medium-light skin tone" + }, + { + "no": 645, + "code": "1F64D 1F3FD 200D 2642 FE0F", + "char": "🙍🏽‍♂️", + "name": "man frowning: medium skin tone" + }, + { + "no": 646, + "code": "1F64D 1F3FE 200D 2642 FE0F", + "char": "🙍🏾‍♂️", + "name": "man frowning: medium-dark skin tone" + }, + { + "no": 647, + "code": "1F64D 1F3FF 200D 2642 FE0F", + "char": "🙍🏿‍♂️", + "name": "man frowning: dark skin tone" + }, + { + "no": 648, + "code": "1F64D 200D 2640 FE0F", + "char": "🙍‍♀️", + "name": "woman frowning" + }, + { + "no": 649, + "code": "1F64D 1F3FB 200D 2640 FE0F", + "char": "🙍🏻‍♀️", + "name": "woman frowning: light skin tone" + }, + { + "no": 650, + "code": "1F64D 1F3FC 200D 2640 FE0F", + "char": "🙍🏼‍♀️", + "name": "woman frowning: medium-light skin tone" + }, + { + "no": 651, + "code": "1F64D 1F3FD 200D 2640 FE0F", + "char": "🙍🏽‍♀️", + "name": "woman frowning: medium skin tone" + }, + { + "no": 652, + "code": "1F64D 1F3FE 200D 2640 FE0F", + "char": "🙍🏾‍♀️", + "name": "woman frowning: medium-dark skin tone" + }, + { + "no": 653, + "code": "1F64D 1F3FF 200D 2640 FE0F", + "char": "🙍🏿‍♀️", + "name": "woman frowning: dark skin tone" + }, + { + "no": 654, + "code": "1F64E", + "char": "🙎", + "name": "person pouting" + }, + { + "no": 655, + "code": "1F64E 1F3FB", + "char": "🙎🏻", + "name": "person pouting: light skin tone" + }, + { + "no": 656, + "code": "1F64E 1F3FC", + "char": "🙎🏼", + "name": "person pouting: medium-light skin tone" + }, + { + "no": 657, + "code": "1F64E 1F3FD", + "char": "🙎🏽", + "name": "person pouting: medium skin tone" + }, + { + "no": 658, + "code": "1F64E 1F3FE", + "char": "🙎🏾", + "name": "person pouting: medium-dark skin tone" + }, + { + "no": 659, + "code": "1F64E 1F3FF", + "char": "🙎🏿", + "name": "person pouting: dark skin tone" + }, + { + "no": 660, + "code": "1F64E 200D 2642 FE0F", + "char": "🙎‍♂️", + "name": "man pouting" + }, + { + "no": 661, + "code": "1F64E 1F3FB 200D 2642 FE0F", + "char": "🙎🏻‍♂️", + "name": "man pouting: light skin tone" + }, + { + "no": 662, + "code": "1F64E 1F3FC 200D 2642 FE0F", + "char": "🙎🏼‍♂️", + "name": "man pouting: medium-light skin tone" + }, + { + "no": 663, + "code": "1F64E 1F3FD 200D 2642 FE0F", + "char": "🙎🏽‍♂️", + "name": "man pouting: medium skin tone" + }, + { + "no": 664, + "code": "1F64E 1F3FE 200D 2642 FE0F", + "char": "🙎🏾‍♂️", + "name": "man pouting: medium-dark skin tone" + }, + { + "no": 665, + "code": "1F64E 1F3FF 200D 2642 FE0F", + "char": "🙎🏿‍♂️", + "name": "man pouting: dark skin tone" + }, + { + "no": 666, + "code": "1F64E 200D 2640 FE0F", + "char": "🙎‍♀️", + "name": "woman pouting" + }, + { + "no": 667, + "code": "1F64E 1F3FB 200D 2640 FE0F", + "char": "🙎🏻‍♀️", + "name": "woman pouting: light skin tone" + }, + { + "no": 668, + "code": "1F64E 1F3FC 200D 2640 FE0F", + "char": "🙎🏼‍♀️", + "name": "woman pouting: medium-light skin tone" + }, + { + "no": 669, + "code": "1F64E 1F3FD 200D 2640 FE0F", + "char": "🙎🏽‍♀️", + "name": "woman pouting: medium skin tone" + }, + { + "no": 670, + "code": "1F64E 1F3FE 200D 2640 FE0F", + "char": "🙎🏾‍♀️", + "name": "woman pouting: medium-dark skin tone" + }, + { + "no": 671, + "code": "1F64E 1F3FF 200D 2640 FE0F", + "char": "🙎🏿‍♀️", + "name": "woman pouting: dark skin tone" + }, + { + "no": 672, + "code": "1F645", + "char": "🙅", + "name": "person gesturing NO" + }, + { + "no": 673, + "code": "1F645 1F3FB", + "char": "🙅🏻", + "name": "person gesturing NO: light skin tone" + }, + { + "no": 674, + "code": "1F645 1F3FC", + "char": "🙅🏼", + "name": "person gesturing NO: medium-light skin tone" + }, + { + "no": 675, + "code": "1F645 1F3FD", + "char": "🙅🏽", + "name": "person gesturing NO: medium skin tone" + }, + { + "no": 676, + "code": "1F645 1F3FE", + "char": "🙅🏾", + "name": "person gesturing NO: medium-dark skin tone" + }, + { + "no": 677, + "code": "1F645 1F3FF", + "char": "🙅🏿", + "name": "person gesturing NO: dark skin tone" + }, + { + "no": 678, + "code": "1F645 200D 2642 FE0F", + "char": "🙅‍♂️", + "name": "man gesturing NO" + }, + { + "no": 679, + "code": "1F645 1F3FB 200D 2642 FE0F", + "char": "🙅🏻‍♂️", + "name": "man gesturing NO: light skin tone" + }, + { + "no": 680, + "code": "1F645 1F3FC 200D 2642 FE0F", + "char": "🙅🏼‍♂️", + "name": "man gesturing NO: medium-light skin tone" + }, + { + "no": 681, + "code": "1F645 1F3FD 200D 2642 FE0F", + "char": "🙅🏽‍♂️", + "name": "man gesturing NO: medium skin tone" + }, + { + "no": 682, + "code": "1F645 1F3FE 200D 2642 FE0F", + "char": "🙅🏾‍♂️", + "name": "man gesturing NO: medium-dark skin tone" + }, + { + "no": 683, + "code": "1F645 1F3FF 200D 2642 FE0F", + "char": "🙅🏿‍♂️", + "name": "man gesturing NO: dark skin tone" + }, + { + "no": 684, + "code": "1F645 200D 2640 FE0F", + "char": "🙅‍♀️", + "name": "woman gesturing NO" + }, + { + "no": 685, + "code": "1F645 1F3FB 200D 2640 FE0F", + "char": "🙅🏻‍♀️", + "name": "woman gesturing NO: light skin tone" + }, + { + "no": 686, + "code": "1F645 1F3FC 200D 2640 FE0F", + "char": "🙅🏼‍♀️", + "name": "woman gesturing NO: medium-light skin tone" + }, + { + "no": 687, + "code": "1F645 1F3FD 200D 2640 FE0F", + "char": "🙅🏽‍♀️", + "name": "woman gesturing NO: medium skin tone" + }, + { + "no": 688, + "code": "1F645 1F3FE 200D 2640 FE0F", + "char": "🙅🏾‍♀️", + "name": "woman gesturing NO: medium-dark skin tone" + }, + { + "no": 689, + "code": "1F645 1F3FF 200D 2640 FE0F", + "char": "🙅🏿‍♀️", + "name": "woman gesturing NO: dark skin tone" + }, + { + "no": 690, + "code": "1F646", + "char": "🙆", + "name": "person gesturing OK" + }, + { + "no": 691, + "code": "1F646 1F3FB", + "char": "🙆🏻", + "name": "person gesturing OK: light skin tone" + }, + { + "no": 692, + "code": "1F646 1F3FC", + "char": "🙆🏼", + "name": "person gesturing OK: medium-light skin tone" + }, + { + "no": 693, + "code": "1F646 1F3FD", + "char": "🙆🏽", + "name": "person gesturing OK: medium skin tone" + }, + { + "no": 694, + "code": "1F646 1F3FE", + "char": "🙆🏾", + "name": "person gesturing OK: medium-dark skin tone" + }, + { + "no": 695, + "code": "1F646 1F3FF", + "char": "🙆🏿", + "name": "person gesturing OK: dark skin tone" + }, + { + "no": 696, + "code": "1F646 200D 2642 FE0F", + "char": "🙆‍♂️", + "name": "man gesturing OK" + }, + { + "no": 697, + "code": "1F646 1F3FB 200D 2642 FE0F", + "char": "🙆🏻‍♂️", + "name": "man gesturing OK: light skin tone" + }, + { + "no": 698, + "code": "1F646 1F3FC 200D 2642 FE0F", + "char": "🙆🏼‍♂️", + "name": "man gesturing OK: medium-light skin tone" + }, + { + "no": 699, + "code": "1F646 1F3FD 200D 2642 FE0F", + "char": "🙆🏽‍♂️", + "name": "man gesturing OK: medium skin tone" + }, + { + "no": 700, + "code": "1F646 1F3FE 200D 2642 FE0F", + "char": "🙆🏾‍♂️", + "name": "man gesturing OK: medium-dark skin tone" + }, + { + "no": 701, + "code": "1F646 1F3FF 200D 2642 FE0F", + "char": "🙆🏿‍♂️", + "name": "man gesturing OK: dark skin tone" + }, + { + "no": 702, + "code": "1F646 200D 2640 FE0F", + "char": "🙆‍♀️", + "name": "woman gesturing OK" + }, + { + "no": 703, + "code": "1F646 1F3FB 200D 2640 FE0F", + "char": "🙆🏻‍♀️", + "name": "woman gesturing OK: light skin tone" + }, + { + "no": 704, + "code": "1F646 1F3FC 200D 2640 FE0F", + "char": "🙆🏼‍♀️", + "name": "woman gesturing OK: medium-light skin tone" + }, + { + "no": 705, + "code": "1F646 1F3FD 200D 2640 FE0F", + "char": "🙆🏽‍♀️", + "name": "woman gesturing OK: medium skin tone" + }, + { + "no": 706, + "code": "1F646 1F3FE 200D 2640 FE0F", + "char": "🙆🏾‍♀️", + "name": "woman gesturing OK: medium-dark skin tone" + }, + { + "no": 707, + "code": "1F646 1F3FF 200D 2640 FE0F", + "char": "🙆🏿‍♀️", + "name": "woman gesturing OK: dark skin tone" + }, + { + "no": 708, + "code": "1F481", + "char": "💁", + "name": "person tipping hand" + }, + { + "no": 709, + "code": "1F481 1F3FB", + "char": "💁🏻", + "name": "person tipping hand: light skin tone" + }, + { + "no": 710, + "code": "1F481 1F3FC", + "char": "💁🏼", + "name": "person tipping hand: medium-light skin tone" + }, + { + "no": 711, + "code": "1F481 1F3FD", + "char": "💁🏽", + "name": "person tipping hand: medium skin tone" + }, + { + "no": 712, + "code": "1F481 1F3FE", + "char": "💁🏾", + "name": "person tipping hand: medium-dark skin tone" + }, + { + "no": 713, + "code": "1F481 1F3FF", + "char": "💁🏿", + "name": "person tipping hand: dark skin tone" + }, + { + "no": 714, + "code": "1F481 200D 2642 FE0F", + "char": "💁‍♂️", + "name": "man tipping hand" + }, + { + "no": 715, + "code": "1F481 1F3FB 200D 2642 FE0F", + "char": "💁🏻‍♂️", + "name": "man tipping hand: light skin tone" + }, + { + "no": 716, + "code": "1F481 1F3FC 200D 2642 FE0F", + "char": "💁🏼‍♂️", + "name": "man tipping hand: medium-light skin tone" + }, + { + "no": 717, + "code": "1F481 1F3FD 200D 2642 FE0F", + "char": "💁🏽‍♂️", + "name": "man tipping hand: medium skin tone" + }, + { + "no": 718, + "code": "1F481 1F3FE 200D 2642 FE0F", + "char": "💁🏾‍♂️", + "name": "man tipping hand: medium-dark skin tone" + }, + { + "no": 719, + "code": "1F481 1F3FF 200D 2642 FE0F", + "char": "💁🏿‍♂️", + "name": "man tipping hand: dark skin tone" + }, + { + "no": 720, + "code": "1F481 200D 2640 FE0F", + "char": "💁‍♀️", + "name": "woman tipping hand" + }, + { + "no": 721, + "code": "1F481 1F3FB 200D 2640 FE0F", + "char": "💁🏻‍♀️", + "name": "woman tipping hand: light skin tone" + }, + { + "no": 722, + "code": "1F481 1F3FC 200D 2640 FE0F", + "char": "💁🏼‍♀️", + "name": "woman tipping hand: medium-light skin tone" + }, + { + "no": 723, + "code": "1F481 1F3FD 200D 2640 FE0F", + "char": "💁🏽‍♀️", + "name": "woman tipping hand: medium skin tone" + }, + { + "no": 724, + "code": "1F481 1F3FE 200D 2640 FE0F", + "char": "💁🏾‍♀️", + "name": "woman tipping hand: medium-dark skin tone" + }, + { + "no": 725, + "code": "1F481 1F3FF 200D 2640 FE0F", + "char": "💁🏿‍♀️", + "name": "woman tipping hand: dark skin tone" + }, + { + "no": 726, + "code": "1F64B", + "char": "🙋", + "name": "person raising hand" + }, + { + "no": 727, + "code": "1F64B 1F3FB", + "char": "🙋🏻", + "name": "person raising hand: light skin tone" + }, + { + "no": 728, + "code": "1F64B 1F3FC", + "char": "🙋🏼", + "name": "person raising hand: medium-light skin tone" + }, + { + "no": 729, + "code": "1F64B 1F3FD", + "char": "🙋🏽", + "name": "person raising hand: medium skin tone" + }, + { + "no": 730, + "code": "1F64B 1F3FE", + "char": "🙋🏾", + "name": "person raising hand: medium-dark skin tone" + }, + { + "no": 731, + "code": "1F64B 1F3FF", + "char": "🙋🏿", + "name": "person raising hand: dark skin tone" + }, + { + "no": 732, + "code": "1F64B 200D 2642 FE0F", + "char": "🙋‍♂️", + "name": "man raising hand" + }, + { + "no": 733, + "code": "1F64B 1F3FB 200D 2642 FE0F", + "char": "🙋🏻‍♂️", + "name": "man raising hand: light skin tone" + }, + { + "no": 734, + "code": "1F64B 1F3FC 200D 2642 FE0F", + "char": "🙋🏼‍♂️", + "name": "man raising hand: medium-light skin tone" + }, + { + "no": 735, + "code": "1F64B 1F3FD 200D 2642 FE0F", + "char": "🙋🏽‍♂️", + "name": "man raising hand: medium skin tone" + }, + { + "no": 736, + "code": "1F64B 1F3FE 200D 2642 FE0F", + "char": "🙋🏾‍♂️", + "name": "man raising hand: medium-dark skin tone" + }, + { + "no": 737, + "code": "1F64B 1F3FF 200D 2642 FE0F", + "char": "🙋🏿‍♂️", + "name": "man raising hand: dark skin tone" + }, + { + "no": 738, + "code": "1F64B 200D 2640 FE0F", + "char": "🙋‍♀️", + "name": "woman raising hand" + }, + { + "no": 739, + "code": "1F64B 1F3FB 200D 2640 FE0F", + "char": "🙋🏻‍♀️", + "name": "woman raising hand: light skin tone" + }, + { + "no": 740, + "code": "1F64B 1F3FC 200D 2640 FE0F", + "char": "🙋🏼‍♀️", + "name": "woman raising hand: medium-light skin tone" + }, + { + "no": 741, + "code": "1F64B 1F3FD 200D 2640 FE0F", + "char": "🙋🏽‍♀️", + "name": "woman raising hand: medium skin tone" + }, + { + "no": 742, + "code": "1F64B 1F3FE 200D 2640 FE0F", + "char": "🙋🏾‍♀️", + "name": "woman raising hand: medium-dark skin tone" + }, + { + "no": 743, + "code": "1F64B 1F3FF 200D 2640 FE0F", + "char": "🙋🏿‍♀️", + "name": "woman raising hand: dark skin tone" + }, + { + "no": 744, + "code": "1F647", + "char": "🙇", + "name": "person bowing" + }, + { + "no": 745, + "code": "1F647 1F3FB", + "char": "🙇🏻", + "name": "person bowing: light skin tone" + }, + { + "no": 746, + "code": "1F647 1F3FC", + "char": "🙇🏼", + "name": "person bowing: medium-light skin tone" + }, + { + "no": 747, + "code": "1F647 1F3FD", + "char": "🙇🏽", + "name": "person bowing: medium skin tone" + }, + { + "no": 748, + "code": "1F647 1F3FE", + "char": "🙇🏾", + "name": "person bowing: medium-dark skin tone" + }, + { + "no": 749, + "code": "1F647 1F3FF", + "char": "🙇🏿", + "name": "person bowing: dark skin tone" + }, + { + "no": 750, + "code": "1F647 200D 2642 FE0F", + "char": "🙇‍♂️", + "name": "man bowing" + }, + { + "no": 751, + "code": "1F647 1F3FB 200D 2642 FE0F", + "char": "🙇🏻‍♂️", + "name": "man bowing: light skin tone" + }, + { + "no": 752, + "code": "1F647 1F3FC 200D 2642 FE0F", + "char": "🙇🏼‍♂️", + "name": "man bowing: medium-light skin tone" + }, + { + "no": 753, + "code": "1F647 1F3FD 200D 2642 FE0F", + "char": "🙇🏽‍♂️", + "name": "man bowing: medium skin tone" + }, + { + "no": 754, + "code": "1F647 1F3FE 200D 2642 FE0F", + "char": "🙇🏾‍♂️", + "name": "man bowing: medium-dark skin tone" + }, + { + "no": 755, + "code": "1F647 1F3FF 200D 2642 FE0F", + "char": "🙇🏿‍♂️", + "name": "man bowing: dark skin tone" + }, + { + "no": 756, + "code": "1F647 200D 2640 FE0F", + "char": "🙇‍♀️", + "name": "woman bowing" + }, + { + "no": 757, + "code": "1F647 1F3FB 200D 2640 FE0F", + "char": "🙇🏻‍♀️", + "name": "woman bowing: light skin tone" + }, + { + "no": 758, + "code": "1F647 1F3FC 200D 2640 FE0F", + "char": "🙇🏼‍♀️", + "name": "woman bowing: medium-light skin tone" + }, + { + "no": 759, + "code": "1F647 1F3FD 200D 2640 FE0F", + "char": "🙇🏽‍♀️", + "name": "woman bowing: medium skin tone" + }, + { + "no": 760, + "code": "1F647 1F3FE 200D 2640 FE0F", + "char": "🙇🏾‍♀️", + "name": "woman bowing: medium-dark skin tone" + }, + { + "no": 761, + "code": "1F647 1F3FF 200D 2640 FE0F", + "char": "🙇🏿‍♀️", + "name": "woman bowing: dark skin tone" + }, + { + "no": 762, + "code": "1F926", + "char": "🤦", + "name": "person facepalming" + }, + { + "no": 763, + "code": "1F926 1F3FB", + "char": "🤦🏻", + "name": "person facepalming: light skin tone" + }, + { + "no": 764, + "code": "1F926 1F3FC", + "char": "🤦🏼", + "name": "person facepalming: medium-light skin tone" + }, + { + "no": 765, + "code": "1F926 1F3FD", + "char": "🤦🏽", + "name": "person facepalming: medium skin tone" + }, + { + "no": 766, + "code": "1F926 1F3FE", + "char": "🤦🏾", + "name": "person facepalming: medium-dark skin tone" + }, + { + "no": 767, + "code": "1F926 1F3FF", + "char": "🤦🏿", + "name": "person facepalming: dark skin tone" + }, + { + "no": 768, + "code": "1F926 200D 2642 FE0F", + "char": "🤦‍♂️", + "name": "man facepalming" + }, + { + "no": 769, + "code": "1F926 1F3FB 200D 2642 FE0F", + "char": "🤦🏻‍♂️", + "name": "man facepalming: light skin tone" + }, + { + "no": 770, + "code": "1F926 1F3FC 200D 2642 FE0F", + "char": "🤦🏼‍♂️", + "name": "man facepalming: medium-light skin tone" + }, + { + "no": 771, + "code": "1F926 1F3FD 200D 2642 FE0F", + "char": "🤦🏽‍♂️", + "name": "man facepalming: medium skin tone" + }, + { + "no": 772, + "code": "1F926 1F3FE 200D 2642 FE0F", + "char": "🤦🏾‍♂️", + "name": "man facepalming: medium-dark skin tone" + }, + { + "no": 773, + "code": "1F926 1F3FF 200D 2642 FE0F", + "char": "🤦🏿‍♂️", + "name": "man facepalming: dark skin tone" + }, + { + "no": 774, + "code": "1F926 200D 2640 FE0F", + "char": "🤦‍♀️", + "name": "woman facepalming" + }, + { + "no": 775, + "code": "1F926 1F3FB 200D 2640 FE0F", + "char": "🤦🏻‍♀️", + "name": "woman facepalming: light skin tone" + }, + { + "no": 776, + "code": "1F926 1F3FC 200D 2640 FE0F", + "char": "🤦🏼‍♀️", + "name": "woman facepalming: medium-light skin tone" + }, + { + "no": 777, + "code": "1F926 1F3FD 200D 2640 FE0F", + "char": "🤦🏽‍♀️", + "name": "woman facepalming: medium skin tone" + }, + { + "no": 778, + "code": "1F926 1F3FE 200D 2640 FE0F", + "char": "🤦🏾‍♀️", + "name": "woman facepalming: medium-dark skin tone" + }, + { + "no": 779, + "code": "1F926 1F3FF 200D 2640 FE0F", + "char": "🤦🏿‍♀️", + "name": "woman facepalming: dark skin tone" + }, + { + "no": 780, + "code": "1F937", + "char": "🤷", + "name": "person shrugging" + }, + { + "no": 781, + "code": "1F937 1F3FB", + "char": "🤷🏻", + "name": "person shrugging: light skin tone" + }, + { + "no": 782, + "code": "1F937 1F3FC", + "char": "🤷🏼", + "name": "person shrugging: medium-light skin tone" + }, + { + "no": 783, + "code": "1F937 1F3FD", + "char": "🤷🏽", + "name": "person shrugging: medium skin tone" + }, + { + "no": 784, + "code": "1F937 1F3FE", + "char": "🤷🏾", + "name": "person shrugging: medium-dark skin tone" + }, + { + "no": 785, + "code": "1F937 1F3FF", + "char": "🤷🏿", + "name": "person shrugging: dark skin tone" + }, + { + "no": 786, + "code": "1F937 200D 2642 FE0F", + "char": "🤷‍♂️", + "name": "man shrugging" + }, + { + "no": 787, + "code": "1F937 1F3FB 200D 2642 FE0F", + "char": "🤷🏻‍♂️", + "name": "man shrugging: light skin tone" + }, + { + "no": 788, + "code": "1F937 1F3FC 200D 2642 FE0F", + "char": "🤷🏼‍♂️", + "name": "man shrugging: medium-light skin tone" + }, + { + "no": 789, + "code": "1F937 1F3FD 200D 2642 FE0F", + "char": "🤷🏽‍♂️", + "name": "man shrugging: medium skin tone" + }, + { + "no": 790, + "code": "1F937 1F3FE 200D 2642 FE0F", + "char": "🤷🏾‍♂️", + "name": "man shrugging: medium-dark skin tone" + }, + { + "no": 791, + "code": "1F937 1F3FF 200D 2642 FE0F", + "char": "🤷🏿‍♂️", + "name": "man shrugging: dark skin tone" + }, + { + "no": 792, + "code": "1F937 200D 2640 FE0F", + "char": "🤷‍♀️", + "name": "woman shrugging" + }, + { + "no": 793, + "code": "1F937 1F3FB 200D 2640 FE0F", + "char": "🤷🏻‍♀️", + "name": "woman shrugging: light skin tone" + }, + { + "no": 794, + "code": "1F937 1F3FC 200D 2640 FE0F", + "char": "🤷🏼‍♀️", + "name": "woman shrugging: medium-light skin tone" + }, + { + "no": 795, + "code": "1F937 1F3FD 200D 2640 FE0F", + "char": "🤷🏽‍♀️", + "name": "woman shrugging: medium skin tone" + }, + { + "no": 796, + "code": "1F937 1F3FE 200D 2640 FE0F", + "char": "🤷🏾‍♀️", + "name": "woman shrugging: medium-dark skin tone" + }, + { + "no": 797, + "code": "1F937 1F3FF 200D 2640 FE0F", + "char": "🤷🏿‍♀️", + "name": "woman shrugging: dark skin tone" + }, + { + "no": 798, + "code": "1F486", + "char": "💆", + "name": "person getting massage" + }, + { + "no": 799, + "code": "1F486 1F3FB", + "char": "💆🏻", + "name": "person getting massage: light skin tone" + }, + { + "no": 800, + "code": "1F486 1F3FC", + "char": "💆🏼", + "name": "person getting massage: medium-light skin tone" + }, + { + "no": 801, + "code": "1F486 1F3FD", + "char": "💆🏽", + "name": "person getting massage: medium skin tone" + }, + { + "no": 802, + "code": "1F486 1F3FE", + "char": "💆🏾", + "name": "person getting massage: medium-dark skin tone" + }, + { + "no": 803, + "code": "1F486 1F3FF", + "char": "💆🏿", + "name": "person getting massage: dark skin tone" + }, + { + "no": 804, + "code": "1F486 200D 2642 FE0F", + "char": "💆‍♂️", + "name": "man getting massage" + }, + { + "no": 805, + "code": "1F486 1F3FB 200D 2642 FE0F", + "char": "💆🏻‍♂️", + "name": "man getting massage: light skin tone" + }, + { + "no": 806, + "code": "1F486 1F3FC 200D 2642 FE0F", + "char": "💆🏼‍♂️", + "name": "man getting massage: medium-light skin tone" + }, + { + "no": 807, + "code": "1F486 1F3FD 200D 2642 FE0F", + "char": "💆🏽‍♂️", + "name": "man getting massage: medium skin tone" + }, + { + "no": 808, + "code": "1F486 1F3FE 200D 2642 FE0F", + "char": "💆🏾‍♂️", + "name": "man getting massage: medium-dark skin tone" + }, + { + "no": 809, + "code": "1F486 1F3FF 200D 2642 FE0F", + "char": "💆🏿‍♂️", + "name": "man getting massage: dark skin tone" + }, + { + "no": 810, + "code": "1F486 200D 2640 FE0F", + "char": "💆‍♀️", + "name": "woman getting massage" + }, + { + "no": 811, + "code": "1F486 1F3FB 200D 2640 FE0F", + "char": "💆🏻‍♀️", + "name": "woman getting massage: light skin tone" + }, + { + "no": 812, + "code": "1F486 1F3FC 200D 2640 FE0F", + "char": "💆🏼‍♀️", + "name": "woman getting massage: medium-light skin tone" + }, + { + "no": 813, + "code": "1F486 1F3FD 200D 2640 FE0F", + "char": "💆🏽‍♀️", + "name": "woman getting massage: medium skin tone" + }, + { + "no": 814, + "code": "1F486 1F3FE 200D 2640 FE0F", + "char": "💆🏾‍♀️", + "name": "woman getting massage: medium-dark skin tone" + }, + { + "no": 815, + "code": "1F486 1F3FF 200D 2640 FE0F", + "char": "💆🏿‍♀️", + "name": "woman getting massage: dark skin tone" + }, + { + "no": 816, + "code": "1F487", + "char": "💇", + "name": "person getting haircut" + }, + { + "no": 817, + "code": "1F487 1F3FB", + "char": "💇🏻", + "name": "person getting haircut: light skin tone" + }, + { + "no": 818, + "code": "1F487 1F3FC", + "char": "💇🏼", + "name": "person getting haircut: medium-light skin tone" + }, + { + "no": 819, + "code": "1F487 1F3FD", + "char": "💇🏽", + "name": "person getting haircut: medium skin tone" + }, + { + "no": 820, + "code": "1F487 1F3FE", + "char": "💇🏾", + "name": "person getting haircut: medium-dark skin tone" + }, + { + "no": 821, + "code": "1F487 1F3FF", + "char": "💇🏿", + "name": "person getting haircut: dark skin tone" + }, + { + "no": 822, + "code": "1F487 200D 2642 FE0F", + "char": "💇‍♂️", + "name": "man getting haircut" + }, + { + "no": 823, + "code": "1F487 1F3FB 200D 2642 FE0F", + "char": "💇🏻‍♂️", + "name": "man getting haircut: light skin tone" + }, + { + "no": 824, + "code": "1F487 1F3FC 200D 2642 FE0F", + "char": "💇🏼‍♂️", + "name": "man getting haircut: medium-light skin tone" + }, + { + "no": 825, + "code": "1F487 1F3FD 200D 2642 FE0F", + "char": "💇🏽‍♂️", + "name": "man getting haircut: medium skin tone" + }, + { + "no": 826, + "code": "1F487 1F3FE 200D 2642 FE0F", + "char": "💇🏾‍♂️", + "name": "man getting haircut: medium-dark skin tone" + }, + { + "no": 827, + "code": "1F487 1F3FF 200D 2642 FE0F", + "char": "💇🏿‍♂️", + "name": "man getting haircut: dark skin tone" + }, + { + "no": 828, + "code": "1F487 200D 2640 FE0F", + "char": "💇‍♀️", + "name": "woman getting haircut" + }, + { + "no": 829, + "code": "1F487 1F3FB 200D 2640 FE0F", + "char": "💇🏻‍♀️", + "name": "woman getting haircut: light skin tone" + }, + { + "no": 830, + "code": "1F487 1F3FC 200D 2640 FE0F", + "char": "💇🏼‍♀️", + "name": "woman getting haircut: medium-light skin tone" + }, + { + "no": 831, + "code": "1F487 1F3FD 200D 2640 FE0F", + "char": "💇🏽‍♀️", + "name": "woman getting haircut: medium skin tone" + }, + { + "no": 832, + "code": "1F487 1F3FE 200D 2640 FE0F", + "char": "💇🏾‍♀️", + "name": "woman getting haircut: medium-dark skin tone" + }, + { + "no": 833, + "code": "1F487 1F3FF 200D 2640 FE0F", + "char": "💇🏿‍♀️", + "name": "woman getting haircut: dark skin tone" + }, + { + "no": 834, + "code": "1F6B6", + "char": "🚶", + "name": "person walking" + }, + { + "no": 835, + "code": "1F6B6 1F3FB", + "char": "🚶🏻", + "name": "person walking: light skin tone" + }, + { + "no": 836, + "code": "1F6B6 1F3FC", + "char": "🚶🏼", + "name": "person walking: medium-light skin tone" + }, + { + "no": 837, + "code": "1F6B6 1F3FD", + "char": "🚶🏽", + "name": "person walking: medium skin tone" + }, + { + "no": 838, + "code": "1F6B6 1F3FE", + "char": "🚶🏾", + "name": "person walking: medium-dark skin tone" + }, + { + "no": 839, + "code": "1F6B6 1F3FF", + "char": "🚶🏿", + "name": "person walking: dark skin tone" + }, + { + "no": 840, + "code": "1F6B6 200D 2642 FE0F", + "char": "🚶‍♂️", + "name": "man walking" + }, + { + "no": 841, + "code": "1F6B6 1F3FB 200D 2642 FE0F", + "char": "🚶🏻‍♂️", + "name": "man walking: light skin tone" + }, + { + "no": 842, + "code": "1F6B6 1F3FC 200D 2642 FE0F", + "char": "🚶🏼‍♂️", + "name": "man walking: medium-light skin tone" + }, + { + "no": 843, + "code": "1F6B6 1F3FD 200D 2642 FE0F", + "char": "🚶🏽‍♂️", + "name": "man walking: medium skin tone" + }, + { + "no": 844, + "code": "1F6B6 1F3FE 200D 2642 FE0F", + "char": "🚶🏾‍♂️", + "name": "man walking: medium-dark skin tone" + }, + { + "no": 845, + "code": "1F6B6 1F3FF 200D 2642 FE0F", + "char": "🚶🏿‍♂️", + "name": "man walking: dark skin tone" + }, + { + "no": 846, + "code": "1F6B6 200D 2640 FE0F", + "char": "🚶‍♀️", + "name": "woman walking" + }, + { + "no": 847, + "code": "1F6B6 1F3FB 200D 2640 FE0F", + "char": "🚶🏻‍♀️", + "name": "woman walking: light skin tone" + }, + { + "no": 848, + "code": "1F6B6 1F3FC 200D 2640 FE0F", + "char": "🚶🏼‍♀️", + "name": "woman walking: medium-light skin tone" + }, + { + "no": 849, + "code": "1F6B6 1F3FD 200D 2640 FE0F", + "char": "🚶🏽‍♀️", + "name": "woman walking: medium skin tone" + }, + { + "no": 850, + "code": "1F6B6 1F3FE 200D 2640 FE0F", + "char": "🚶🏾‍♀️", + "name": "woman walking: medium-dark skin tone" + }, + { + "no": 851, + "code": "1F6B6 1F3FF 200D 2640 FE0F", + "char": "🚶🏿‍♀️", + "name": "woman walking: dark skin tone" + }, + { + "no": 852, + "code": "1F3C3", + "char": "🏃", + "name": "person running" + }, + { + "no": 853, + "code": "1F3C3 1F3FB", + "char": "🏃🏻", + "name": "person running: light skin tone" + }, + { + "no": 854, + "code": "1F3C3 1F3FC", + "char": "🏃🏼", + "name": "person running: medium-light skin tone" + }, + { + "no": 855, + "code": "1F3C3 1F3FD", + "char": "🏃🏽", + "name": "person running: medium skin tone" + }, + { + "no": 856, + "code": "1F3C3 1F3FE", + "char": "🏃🏾", + "name": "person running: medium-dark skin tone" + }, + { + "no": 857, + "code": "1F3C3 1F3FF", + "char": "🏃🏿", + "name": "person running: dark skin tone" + }, + { + "no": 858, + "code": "1F3C3 200D 2642 FE0F", + "char": "🏃‍♂️", + "name": "man running" + }, + { + "no": 859, + "code": "1F3C3 1F3FB 200D 2642 FE0F", + "char": "🏃🏻‍♂️", + "name": "man running: light skin tone" + }, + { + "no": 860, + "code": "1F3C3 1F3FC 200D 2642 FE0F", + "char": "🏃🏼‍♂️", + "name": "man running: medium-light skin tone" + }, + { + "no": 861, + "code": "1F3C3 1F3FD 200D 2642 FE0F", + "char": "🏃🏽‍♂️", + "name": "man running: medium skin tone" + }, + { + "no": 862, + "code": "1F3C3 1F3FE 200D 2642 FE0F", + "char": "🏃🏾‍♂️", + "name": "man running: medium-dark skin tone" + }, + { + "no": 863, + "code": "1F3C3 1F3FF 200D 2642 FE0F", + "char": "🏃🏿‍♂️", + "name": "man running: dark skin tone" + }, + { + "no": 864, + "code": "1F3C3 200D 2640 FE0F", + "char": "🏃‍♀️", + "name": "woman running" + }, + { + "no": 865, + "code": "1F3C3 1F3FB 200D 2640 FE0F", + "char": "🏃🏻‍♀️", + "name": "woman running: light skin tone" + }, + { + "no": 866, + "code": "1F3C3 1F3FC 200D 2640 FE0F", + "char": "🏃🏼‍♀️", + "name": "woman running: medium-light skin tone" + }, + { + "no": 867, + "code": "1F3C3 1F3FD 200D 2640 FE0F", + "char": "🏃🏽‍♀️", + "name": "woman running: medium skin tone" + }, + { + "no": 868, + "code": "1F3C3 1F3FE 200D 2640 FE0F", + "char": "🏃🏾‍♀️", + "name": "woman running: medium-dark skin tone" + }, + { + "no": 869, + "code": "1F3C3 1F3FF 200D 2640 FE0F", + "char": "🏃🏿‍♀️", + "name": "woman running: dark skin tone" + }, + { + "no": 870, + "code": "1F483", + "char": "💃", + "name": "woman dancing" + }, + { + "no": 871, + "code": "1F483 1F3FB", + "char": "💃🏻", + "name": "woman dancing: light skin tone" + }, + { + "no": 872, + "code": "1F483 1F3FC", + "char": "💃🏼", + "name": "woman dancing: medium-light skin tone" + }, + { + "no": 873, + "code": "1F483 1F3FD", + "char": "💃🏽", + "name": "woman dancing: medium skin tone" + }, + { + "no": 874, + "code": "1F483 1F3FE", + "char": "💃🏾", + "name": "woman dancing: medium-dark skin tone" + }, + { + "no": 875, + "code": "1F483 1F3FF", + "char": "💃🏿", + "name": "woman dancing: dark skin tone" + }, + { + "no": 876, + "code": "1F57A", + "char": "🕺", + "name": "man dancing" + }, + { + "no": 877, + "code": "1F57A 1F3FB", + "char": "🕺🏻", + "name": "man dancing: light skin tone" + }, + { + "no": 878, + "code": "1F57A 1F3FC", + "char": "🕺🏼", + "name": "man dancing: medium-light skin tone" + }, + { + "no": 879, + "code": "1F57A 1F3FD", + "char": "🕺🏽", + "name": "man dancing: medium skin tone" + }, + { + "no": 880, + "code": "1F57A 1F3FE", + "char": "🕺🏾", + "name": "man dancing: medium-dark skin tone" + }, + { + "no": 881, + "code": "1F57A 1F3FF", + "char": "🕺🏿", + "name": "man dancing: dark skin tone" + }, + { + "no": 882, + "code": "1F46F", + "char": "👯", + "name": "people with bunny ears" + }, + { + "no": 883, + "code": "1F46F 200D 2642 FE0F", + "char": "👯‍♂️", + "name": "men with bunny ears" + }, + { + "no": 884, + "code": "1F46F 200D 2640 FE0F", + "char": "👯‍♀️", + "name": "women with bunny ears" + }, + { + "no": 885, + "code": "1F9D6", + "char": "🧖", + "name": "⊛ person in steamy room" + }, + { + "no": 886, + "code": "1F9D6 1F3FB", + "char": "🧖🏻", + "name": "⊛ person in steamy room: light skin tone" + }, + { + "no": 887, + "code": "1F9D6 1F3FC", + "char": "🧖🏼", + "name": "⊛ person in steamy room: medium-light skin tone" + }, + { + "no": 888, + "code": "1F9D6 1F3FD", + "char": "🧖🏽", + "name": "⊛ person in steamy room: medium skin tone" + }, + { + "no": 889, + "code": "1F9D6 1F3FE", + "char": "🧖🏾", + "name": "⊛ person in steamy room: medium-dark skin tone" + }, + { + "no": 890, + "code": "1F9D6 1F3FF", + "char": "🧖🏿", + "name": "⊛ person in steamy room: dark skin tone" + }, + { + "no": 891, + "code": "1F9D6 200D 2640 FE0F", + "char": "🧖‍♀️", + "name": "⊛ woman in steamy room" + }, + { + "no": 892, + "code": "1F9D6 1F3FB 200D 2640 FE0F", + "char": "🧖🏻‍♀️", + "name": "⊛ woman in steamy room: light skin tone" + }, + { + "no": 893, + "code": "1F9D6 1F3FC 200D 2640 FE0F", + "char": "🧖🏼‍♀️", + "name": "⊛ woman in steamy room: medium-light skin tone" + }, + { + "no": 894, + "code": "1F9D6 1F3FD 200D 2640 FE0F", + "char": "🧖🏽‍♀️", + "name": "⊛ woman in steamy room: medium skin tone" + }, + { + "no": 895, + "code": "1F9D6 1F3FE 200D 2640 FE0F", + "char": "🧖🏾‍♀️", + "name": "⊛ woman in steamy room: medium-dark skin tone" + }, + { + "no": 896, + "code": "1F9D6 1F3FF 200D 2640 FE0F", + "char": "🧖🏿‍♀️", + "name": "⊛ woman in steamy room: dark skin tone" + }, + { + "no": 897, + "code": "1F9D6 200D 2642 FE0F", + "char": "🧖‍♂️", + "name": "⊛ man in steamy room" + }, + { + "no": 898, + "code": "1F9D6 1F3FB 200D 2642 FE0F", + "char": "🧖🏻‍♂️", + "name": "⊛ man in steamy room: light skin tone" + }, + { + "no": 899, + "code": "1F9D6 1F3FC 200D 2642 FE0F", + "char": "🧖🏼‍♂️", + "name": "⊛ man in steamy room: medium-light skin tone" + }, + { + "no": 900, + "code": "1F9D6 1F3FD 200D 2642 FE0F", + "char": "🧖🏽‍♂️", + "name": "⊛ man in steamy room: medium skin tone" + }, + { + "no": 901, + "code": "1F9D6 1F3FE 200D 2642 FE0F", + "char": "🧖🏾‍♂️", + "name": "⊛ man in steamy room: medium-dark skin tone" + }, + { + "no": 902, + "code": "1F9D6 1F3FF 200D 2642 FE0F", + "char": "🧖🏿‍♂️", + "name": "⊛ man in steamy room: dark skin tone" + }, + { + "no": 903, + "code": "1F9D7", + "char": "🧗", + "name": "⊛ person climbing" + }, + { + "no": 904, + "code": "1F9D7 1F3FB", + "char": "🧗🏻", + "name": "⊛ person climbing: light skin tone" + }, + { + "no": 905, + "code": "1F9D7 1F3FC", + "char": "🧗🏼", + "name": "⊛ person climbing: medium-light skin tone" + }, + { + "no": 906, + "code": "1F9D7 1F3FD", + "char": "🧗🏽", + "name": "⊛ person climbing: medium skin tone" + }, + { + "no": 907, + "code": "1F9D7 1F3FE", + "char": "🧗🏾", + "name": "⊛ person climbing: medium-dark skin tone" + }, + { + "no": 908, + "code": "1F9D7 1F3FF", + "char": "🧗🏿", + "name": "⊛ person climbing: dark skin tone" + }, + { + "no": 909, + "code": "1F9D7 200D 2640 FE0F", + "char": "🧗‍♀️", + "name": "⊛ woman climbing" + }, + { + "no": 910, + "code": "1F9D7 1F3FB 200D 2640 FE0F", + "char": "🧗🏻‍♀️", + "name": "⊛ woman climbing: light skin tone" + }, + { + "no": 911, + "code": "1F9D7 1F3FC 200D 2640 FE0F", + "char": "🧗🏼‍♀️", + "name": "⊛ woman climbing: medium-light skin tone" + }, + { + "no": 912, + "code": "1F9D7 1F3FD 200D 2640 FE0F", + "char": "🧗🏽‍♀️", + "name": "⊛ woman climbing: medium skin tone" + }, + { + "no": 913, + "code": "1F9D7 1F3FE 200D 2640 FE0F", + "char": "🧗🏾‍♀️", + "name": "⊛ woman climbing: medium-dark skin tone" + }, + { + "no": 914, + "code": "1F9D7 1F3FF 200D 2640 FE0F", + "char": "🧗🏿‍♀️", + "name": "⊛ woman climbing: dark skin tone" + }, + { + "no": 915, + "code": "1F9D7 200D 2642 FE0F", + "char": "🧗‍♂️", + "name": "⊛ man climbing" + }, + { + "no": 916, + "code": "1F9D7 1F3FB 200D 2642 FE0F", + "char": "🧗🏻‍♂️", + "name": "⊛ man climbing: light skin tone" + }, + { + "no": 917, + "code": "1F9D7 1F3FC 200D 2642 FE0F", + "char": "🧗🏼‍♂️", + "name": "⊛ man climbing: medium-light skin tone" + }, + { + "no": 918, + "code": "1F9D7 1F3FD 200D 2642 FE0F", + "char": "🧗🏽‍♂️", + "name": "⊛ man climbing: medium skin tone" + }, + { + "no": 919, + "code": "1F9D7 1F3FE 200D 2642 FE0F", + "char": "🧗🏾‍♂️", + "name": "⊛ man climbing: medium-dark skin tone" + }, + { + "no": 920, + "code": "1F9D7 1F3FF 200D 2642 FE0F", + "char": "🧗🏿‍♂️", + "name": "⊛ man climbing: dark skin tone" + }, + { + "no": 921, + "code": "1F9D8", + "char": "🧘", + "name": "⊛ person in lotus position" + }, + { + "no": 922, + "code": "1F9D8 1F3FB", + "char": "🧘🏻", + "name": "⊛ person in lotus position: light skin tone" + }, + { + "no": 923, + "code": "1F9D8 1F3FC", + "char": "🧘🏼", + "name": "⊛ person in lotus position: medium-light skin tone" + }, + { + "no": 924, + "code": "1F9D8 1F3FD", + "char": "🧘🏽", + "name": "⊛ person in lotus position: medium skin tone" + }, + { + "no": 925, + "code": "1F9D8 1F3FE", + "char": "🧘🏾", + "name": "⊛ person in lotus position: medium-dark skin tone" + }, + { + "no": 926, + "code": "1F9D8 1F3FF", + "char": "🧘🏿", + "name": "⊛ person in lotus position: dark skin tone" + }, + { + "no": 927, + "code": "1F9D8 200D 2640 FE0F", + "char": "🧘‍♀️", + "name": "⊛ woman in lotus position" + }, + { + "no": 928, + "code": "1F9D8 1F3FB 200D 2640 FE0F", + "char": "🧘🏻‍♀️", + "name": "⊛ woman in lotus position: light skin tone" + }, + { + "no": 929, + "code": "1F9D8 1F3FC 200D 2640 FE0F", + "char": "🧘🏼‍♀️", + "name": "⊛ woman in lotus position: medium-light skin tone" + }, + { + "no": 930, + "code": "1F9D8 1F3FD 200D 2640 FE0F", + "char": "🧘🏽‍♀️", + "name": "⊛ woman in lotus position: medium skin tone" + }, + { + "no": 931, + "code": "1F9D8 1F3FE 200D 2640 FE0F", + "char": "🧘🏾‍♀️", + "name": "⊛ woman in lotus position: medium-dark skin tone" + }, + { + "no": 932, + "code": "1F9D8 1F3FF 200D 2640 FE0F", + "char": "🧘🏿‍♀️", + "name": "⊛ woman in lotus position: dark skin tone" + }, + { + "no": 933, + "code": "1F9D8 200D 2642 FE0F", + "char": "🧘‍♂️", + "name": "⊛ man in lotus position" + }, + { + "no": 934, + "code": "1F9D8 1F3FB 200D 2642 FE0F", + "char": "🧘🏻‍♂️", + "name": "⊛ man in lotus position: light skin tone" + }, + { + "no": 935, + "code": "1F9D8 1F3FC 200D 2642 FE0F", + "char": "🧘🏼‍♂️", + "name": "⊛ man in lotus position: medium-light skin tone" + }, + { + "no": 936, + "code": "1F9D8 1F3FD 200D 2642 FE0F", + "char": "🧘🏽‍♂️", + "name": "⊛ man in lotus position: medium skin tone" + }, + { + "no": 937, + "code": "1F9D8 1F3FE 200D 2642 FE0F", + "char": "🧘🏾‍♂️", + "name": "⊛ man in lotus position: medium-dark skin tone" + }, + { + "no": 938, + "code": "1F9D8 1F3FF 200D 2642 FE0F", + "char": "🧘🏿‍♂️", + "name": "⊛ man in lotus position: dark skin tone" + }, + { + "no": 939, + "code": "1F6C0", + "char": "🛀", + "name": "person taking bath" + }, + { + "no": 940, + "code": "1F6C0 1F3FB", + "char": "🛀🏻", + "name": "person taking bath: light skin tone" + }, + { + "no": 941, + "code": "1F6C0 1F3FC", + "char": "🛀🏼", + "name": "person taking bath: medium-light skin tone" + }, + { + "no": 942, + "code": "1F6C0 1F3FD", + "char": "🛀🏽", + "name": "person taking bath: medium skin tone" + }, + { + "no": 943, + "code": "1F6C0 1F3FE", + "char": "🛀🏾", + "name": "person taking bath: medium-dark skin tone" + }, + { + "no": 944, + "code": "1F6C0 1F3FF", + "char": "🛀🏿", + "name": "person taking bath: dark skin tone" + }, + { + "no": 945, + "code": "1F6CC", + "char": "🛌", + "name": "person in bed" + }, + { + "no": 946, + "code": "1F6CC 1F3FB", + "char": "🛌🏻", + "name": "person in bed: light skin tone" + }, + { + "no": 947, + "code": "1F6CC 1F3FC", + "char": "🛌🏼", + "name": "person in bed: medium-light skin tone" + }, + { + "no": 948, + "code": "1F6CC 1F3FD", + "char": "🛌🏽", + "name": "person in bed: medium skin tone" + }, + { + "no": 949, + "code": "1F6CC 1F3FE", + "char": "🛌🏾", + "name": "person in bed: medium-dark skin tone" + }, + { + "no": 950, + "code": "1F6CC 1F3FF", + "char": "🛌🏿", + "name": "person in bed: dark skin tone" + }, + { + "no": 951, + "code": "1F574", + "char": "🕴", + "name": "man in suit levitating" + }, + { + "no": 952, + "code": "1F574 1F3FB", + "char": "🕴🏻", + "name": "man in suit levitating: light skin tone" + }, + { + "no": 953, + "code": "1F574 1F3FC", + "char": "🕴🏼", + "name": "man in suit levitating: medium-light skin tone" + }, + { + "no": 954, + "code": "1F574 1F3FD", + "char": "🕴🏽", + "name": "man in suit levitating: medium skin tone" + }, + { + "no": 955, + "code": "1F574 1F3FE", + "char": "🕴🏾", + "name": "man in suit levitating: medium-dark skin tone" + }, + { + "no": 956, + "code": "1F574 1F3FF", + "char": "🕴🏿", + "name": "man in suit levitating: dark skin tone" + }, + { + "no": 957, + "code": "1F5E3", + "char": "🗣", + "name": "speaking head" + }, + { + "no": 958, + "code": "1F464", + "char": "👤", + "name": "bust in silhouette" + }, + { + "no": 959, + "code": "1F465", + "char": "👥", + "name": "busts in silhouette" + }, + { + "no": 960, + "code": "1F93A", + "char": "🤺", + "name": "person fencing" + }, + { + "no": 961, + "code": "1F3C7", + "char": "🏇", + "name": "horse racing" + }, + { + "no": 962, + "code": "1F3C7 1F3FB", + "char": "🏇🏻", + "name": "horse racing: light skin tone" + }, + { + "no": 963, + "code": "1F3C7 1F3FC", + "char": "🏇🏼", + "name": "horse racing: medium-light skin tone" + }, + { + "no": 964, + "code": "1F3C7 1F3FD", + "char": "🏇🏽", + "name": "horse racing: medium skin tone" + }, + { + "no": 965, + "code": "1F3C7 1F3FE", + "char": "🏇🏾", + "name": "horse racing: medium-dark skin tone" + }, + { + "no": 966, + "code": "1F3C7 1F3FF", + "char": "🏇🏿", + "name": "horse racing: dark skin tone" + }, + { + "no": 967, + "code": "26F7", + "char": "⛷", + "name": "skier" + }, + { + "no": 968, + "code": "1F3C2", + "char": "🏂", + "name": "snowboarder" + }, + { + "no": 969, + "code": "1F3C2 1F3FB", + "char": "🏂🏻", + "name": "snowboarder: light skin tone" + }, + { + "no": 970, + "code": "1F3C2 1F3FC", + "char": "🏂🏼", + "name": "snowboarder: medium-light skin tone" + }, + { + "no": 971, + "code": "1F3C2 1F3FD", + "char": "🏂🏽", + "name": "snowboarder: medium skin tone" + }, + { + "no": 972, + "code": "1F3C2 1F3FE", + "char": "🏂🏾", + "name": "snowboarder: medium-dark skin tone" + }, + { + "no": 973, + "code": "1F3C2 1F3FF", + "char": "🏂🏿", + "name": "snowboarder: dark skin tone" + }, + { + "no": 974, + "code": "1F3CC", + "char": "🏌", + "name": "person golfing" + }, + { + "no": 975, + "code": "1F3CC 1F3FB", + "char": "🏌🏻", + "name": "person golfing: light skin tone" + }, + { + "no": 976, + "code": "1F3CC 1F3FC", + "char": "🏌🏼", + "name": "person golfing: medium-light skin tone" + }, + { + "no": 977, + "code": "1F3CC 1F3FD", + "char": "🏌🏽", + "name": "person golfing: medium skin tone" + }, + { + "no": 978, + "code": "1F3CC 1F3FE", + "char": "🏌🏾", + "name": "person golfing: medium-dark skin tone" + }, + { + "no": 979, + "code": "1F3CC 1F3FF", + "char": "🏌🏿", + "name": "person golfing: dark skin tone" + }, + { + "no": 980, + "code": "1F3CC FE0F 200D 2642 FE0F", + "char": "🏌️‍♂️", + "name": "man golfing" + }, + { + "no": 981, + "code": "1F3CC 1F3FB 200D 2642 FE0F", + "char": "🏌🏻‍♂️", + "name": "man golfing: light skin tone" + }, + { + "no": 982, + "code": "1F3CC 1F3FC 200D 2642 FE0F", + "char": "🏌🏼‍♂️", + "name": "man golfing: medium-light skin tone" + }, + { + "no": 983, + "code": "1F3CC 1F3FD 200D 2642 FE0F", + "char": "🏌🏽‍♂️", + "name": "man golfing: medium skin tone" + }, + { + "no": 984, + "code": "1F3CC 1F3FE 200D 2642 FE0F", + "char": "🏌🏾‍♂️", + "name": "man golfing: medium-dark skin tone" + }, + { + "no": 985, + "code": "1F3CC 1F3FF 200D 2642 FE0F", + "char": "🏌🏿‍♂️", + "name": "man golfing: dark skin tone" + }, + { + "no": 986, + "code": "1F3CC FE0F 200D 2640 FE0F", + "char": "🏌️‍♀️", + "name": "woman golfing" + }, + { + "no": 987, + "code": "1F3CC 1F3FB 200D 2640 FE0F", + "char": "🏌🏻‍♀️", + "name": "woman golfing: light skin tone" + }, + { + "no": 988, + "code": "1F3CC 1F3FC 200D 2640 FE0F", + "char": "🏌🏼‍♀️", + "name": "woman golfing: medium-light skin tone" + }, + { + "no": 989, + "code": "1F3CC 1F3FD 200D 2640 FE0F", + "char": "🏌🏽‍♀️", + "name": "woman golfing: medium skin tone" + }, + { + "no": 990, + "code": "1F3CC 1F3FE 200D 2640 FE0F", + "char": "🏌🏾‍♀️", + "name": "woman golfing: medium-dark skin tone" + }, + { + "no": 991, + "code": "1F3CC 1F3FF 200D 2640 FE0F", + "char": "🏌🏿‍♀️", + "name": "woman golfing: dark skin tone" + }, + { + "no": 992, + "code": "1F3C4", + "char": "🏄", + "name": "person surfing" + }, + { + "no": 993, + "code": "1F3C4 1F3FB", + "char": "🏄🏻", + "name": "person surfing: light skin tone" + }, + { + "no": 994, + "code": "1F3C4 1F3FC", + "char": "🏄🏼", + "name": "person surfing: medium-light skin tone" + }, + { + "no": 995, + "code": "1F3C4 1F3FD", + "char": "🏄🏽", + "name": "person surfing: medium skin tone" + }, + { + "no": 996, + "code": "1F3C4 1F3FE", + "char": "🏄🏾", + "name": "person surfing: medium-dark skin tone" + }, + { + "no": 997, + "code": "1F3C4 1F3FF", + "char": "🏄🏿", + "name": "person surfing: dark skin tone" + }, + { + "no": 998, + "code": "1F3C4 200D 2642 FE0F", + "char": "🏄‍♂️", + "name": "man surfing" + }, + { + "no": 999, + "code": "1F3C4 1F3FB 200D 2642 FE0F", + "char": "🏄🏻‍♂️", + "name": "man surfing: light skin tone" + }, + { + "no": 1000, + "code": "1F3C4 1F3FC 200D 2642 FE0F", + "char": "🏄🏼‍♂️", + "name": "man surfing: medium-light skin tone" + }, + { + "no": 1001, + "code": "1F3C4 1F3FD 200D 2642 FE0F", + "char": "🏄🏽‍♂️", + "name": "man surfing: medium skin tone" + }, + { + "no": 1002, + "code": "1F3C4 1F3FE 200D 2642 FE0F", + "char": "🏄🏾‍♂️", + "name": "man surfing: medium-dark skin tone" + }, + { + "no": 1003, + "code": "1F3C4 1F3FF 200D 2642 FE0F", + "char": "🏄🏿‍♂️", + "name": "man surfing: dark skin tone" + }, + { + "no": 1004, + "code": "1F3C4 200D 2640 FE0F", + "char": "🏄‍♀️", + "name": "woman surfing" + }, + { + "no": 1005, + "code": "1F3C4 1F3FB 200D 2640 FE0F", + "char": "🏄🏻‍♀️", + "name": "woman surfing: light skin tone" + }, + { + "no": 1006, + "code": "1F3C4 1F3FC 200D 2640 FE0F", + "char": "🏄🏼‍♀️", + "name": "woman surfing: medium-light skin tone" + }, + { + "no": 1007, + "code": "1F3C4 1F3FD 200D 2640 FE0F", + "char": "🏄🏽‍♀️", + "name": "woman surfing: medium skin tone" + }, + { + "no": 1008, + "code": "1F3C4 1F3FE 200D 2640 FE0F", + "char": "🏄🏾‍♀️", + "name": "woman surfing: medium-dark skin tone" + }, + { + "no": 1009, + "code": "1F3C4 1F3FF 200D 2640 FE0F", + "char": "🏄🏿‍♀️", + "name": "woman surfing: dark skin tone" + }, + { + "no": 1010, + "code": "1F6A3", + "char": "🚣", + "name": "person rowing boat" + }, + { + "no": 1011, + "code": "1F6A3 1F3FB", + "char": "🚣🏻", + "name": "person rowing boat: light skin tone" + }, + { + "no": 1012, + "code": "1F6A3 1F3FC", + "char": "🚣🏼", + "name": "person rowing boat: medium-light skin tone" + }, + { + "no": 1013, + "code": "1F6A3 1F3FD", + "char": "🚣🏽", + "name": "person rowing boat: medium skin tone" + }, + { + "no": 1014, + "code": "1F6A3 1F3FE", + "char": "🚣🏾", + "name": "person rowing boat: medium-dark skin tone" + }, + { + "no": 1015, + "code": "1F6A3 1F3FF", + "char": "🚣🏿", + "name": "person rowing boat: dark skin tone" + }, + { + "no": 1016, + "code": "1F6A3 200D 2642 FE0F", + "char": "🚣‍♂️", + "name": "man rowing boat" + }, + { + "no": 1017, + "code": "1F6A3 1F3FB 200D 2642 FE0F", + "char": "🚣🏻‍♂️", + "name": "man rowing boat: light skin tone" + }, + { + "no": 1018, + "code": "1F6A3 1F3FC 200D 2642 FE0F", + "char": "🚣🏼‍♂️", + "name": "man rowing boat: medium-light skin tone" + }, + { + "no": 1019, + "code": "1F6A3 1F3FD 200D 2642 FE0F", + "char": "🚣🏽‍♂️", + "name": "man rowing boat: medium skin tone" + }, + { + "no": 1020, + "code": "1F6A3 1F3FE 200D 2642 FE0F", + "char": "🚣🏾‍♂️", + "name": "man rowing boat: medium-dark skin tone" + }, + { + "no": 1021, + "code": "1F6A3 1F3FF 200D 2642 FE0F", + "char": "🚣🏿‍♂️", + "name": "man rowing boat: dark skin tone" + }, + { + "no": 1022, + "code": "1F6A3 200D 2640 FE0F", + "char": "🚣‍♀️", + "name": "woman rowing boat" + }, + { + "no": 1023, + "code": "1F6A3 1F3FB 200D 2640 FE0F", + "char": "🚣🏻‍♀️", + "name": "woman rowing boat: light skin tone" + }, + { + "no": 1024, + "code": "1F6A3 1F3FC 200D 2640 FE0F", + "char": "🚣🏼‍♀️", + "name": "woman rowing boat: medium-light skin tone" + }, + { + "no": 1025, + "code": "1F6A3 1F3FD 200D 2640 FE0F", + "char": "🚣🏽‍♀️", + "name": "woman rowing boat: medium skin tone" + }, + { + "no": 1026, + "code": "1F6A3 1F3FE 200D 2640 FE0F", + "char": "🚣🏾‍♀️", + "name": "woman rowing boat: medium-dark skin tone" + }, + { + "no": 1027, + "code": "1F6A3 1F3FF 200D 2640 FE0F", + "char": "🚣🏿‍♀️", + "name": "woman rowing boat: dark skin tone" + }, + { + "no": 1028, + "code": "1F3CA", + "char": "🏊", + "name": "person swimming" + }, + { + "no": 1029, + "code": "1F3CA 1F3FB", + "char": "🏊🏻", + "name": "person swimming: light skin tone" + }, + { + "no": 1030, + "code": "1F3CA 1F3FC", + "char": "🏊🏼", + "name": "person swimming: medium-light skin tone" + }, + { + "no": 1031, + "code": "1F3CA 1F3FD", + "char": "🏊🏽", + "name": "person swimming: medium skin tone" + }, + { + "no": 1032, + "code": "1F3CA 1F3FE", + "char": "🏊🏾", + "name": "person swimming: medium-dark skin tone" + }, + { + "no": 1033, + "code": "1F3CA 1F3FF", + "char": "🏊🏿", + "name": "person swimming: dark skin tone" + }, + { + "no": 1034, + "code": "1F3CA 200D 2642 FE0F", + "char": "🏊‍♂️", + "name": "man swimming" + }, + { + "no": 1035, + "code": "1F3CA 1F3FB 200D 2642 FE0F", + "char": "🏊🏻‍♂️", + "name": "man swimming: light skin tone" + }, + { + "no": 1036, + "code": "1F3CA 1F3FC 200D 2642 FE0F", + "char": "🏊🏼‍♂️", + "name": "man swimming: medium-light skin tone" + }, + { + "no": 1037, + "code": "1F3CA 1F3FD 200D 2642 FE0F", + "char": "🏊🏽‍♂️", + "name": "man swimming: medium skin tone" + }, + { + "no": 1038, + "code": "1F3CA 1F3FE 200D 2642 FE0F", + "char": "🏊🏾‍♂️", + "name": "man swimming: medium-dark skin tone" + }, + { + "no": 1039, + "code": "1F3CA 1F3FF 200D 2642 FE0F", + "char": "🏊🏿‍♂️", + "name": "man swimming: dark skin tone" + }, + { + "no": 1040, + "code": "1F3CA 200D 2640 FE0F", + "char": "🏊‍♀️", + "name": "woman swimming" + }, + { + "no": 1041, + "code": "1F3CA 1F3FB 200D 2640 FE0F", + "char": "🏊🏻‍♀️", + "name": "woman swimming: light skin tone" + }, + { + "no": 1042, + "code": "1F3CA 1F3FC 200D 2640 FE0F", + "char": "🏊🏼‍♀️", + "name": "woman swimming: medium-light skin tone" + }, + { + "no": 1043, + "code": "1F3CA 1F3FD 200D 2640 FE0F", + "char": "🏊🏽‍♀️", + "name": "woman swimming: medium skin tone" + }, + { + "no": 1044, + "code": "1F3CA 1F3FE 200D 2640 FE0F", + "char": "🏊🏾‍♀️", + "name": "woman swimming: medium-dark skin tone" + }, + { + "no": 1045, + "code": "1F3CA 1F3FF 200D 2640 FE0F", + "char": "🏊🏿‍♀️", + "name": "woman swimming: dark skin tone" + }, + { + "no": 1046, + "code": "26F9", + "char": "⛹", + "name": "person bouncing ball" + }, + { + "no": 1047, + "code": "26F9 1F3FB", + "char": "⛹🏻", + "name": "person bouncing ball: light skin tone" + }, + { + "no": 1048, + "code": "26F9 1F3FC", + "char": "⛹🏼", + "name": "person bouncing ball: medium-light skin tone" + }, + { + "no": 1049, + "code": "26F9 1F3FD", + "char": "⛹🏽", + "name": "person bouncing ball: medium skin tone" + }, + { + "no": 1050, + "code": "26F9 1F3FE", + "char": "⛹🏾", + "name": "person bouncing ball: medium-dark skin tone" + }, + { + "no": 1051, + "code": "26F9 1F3FF", + "char": "⛹🏿", + "name": "person bouncing ball: dark skin tone" + }, + { + "no": 1052, + "code": "26F9 FE0F 200D 2642 FE0F", + "char": "⛹️‍♂️", + "name": "man bouncing ball" + }, + { + "no": 1053, + "code": "26F9 1F3FB 200D 2642 FE0F", + "char": "⛹🏻‍♂️", + "name": "man bouncing ball: light skin tone" + }, + { + "no": 1054, + "code": "26F9 1F3FC 200D 2642 FE0F", + "char": "⛹🏼‍♂️", + "name": "man bouncing ball: medium-light skin tone" + }, + { + "no": 1055, + "code": "26F9 1F3FD 200D 2642 FE0F", + "char": "⛹🏽‍♂️", + "name": "man bouncing ball: medium skin tone" + }, + { + "no": 1056, + "code": "26F9 1F3FE 200D 2642 FE0F", + "char": "⛹🏾‍♂️", + "name": "man bouncing ball: medium-dark skin tone" + }, + { + "no": 1057, + "code": "26F9 1F3FF 200D 2642 FE0F", + "char": "⛹🏿‍♂️", + "name": "man bouncing ball: dark skin tone" + }, + { + "no": 1058, + "code": "26F9 FE0F 200D 2640 FE0F", + "char": "⛹️‍♀️", + "name": "woman bouncing ball" + }, + { + "no": 1059, + "code": "26F9 1F3FB 200D 2640 FE0F", + "char": "⛹🏻‍♀️", + "name": "woman bouncing ball: light skin tone" + }, + { + "no": 1060, + "code": "26F9 1F3FC 200D 2640 FE0F", + "char": "⛹🏼‍♀️", + "name": "woman bouncing ball: medium-light skin tone" + }, + { + "no": 1061, + "code": "26F9 1F3FD 200D 2640 FE0F", + "char": "⛹🏽‍♀️", + "name": "woman bouncing ball: medium skin tone" + }, + { + "no": 1062, + "code": "26F9 1F3FE 200D 2640 FE0F", + "char": "⛹🏾‍♀️", + "name": "woman bouncing ball: medium-dark skin tone" + }, + { + "no": 1063, + "code": "26F9 1F3FF 200D 2640 FE0F", + "char": "⛹🏿‍♀️", + "name": "woman bouncing ball: dark skin tone" + }, + { + "no": 1064, + "code": "1F3CB", + "char": "🏋", + "name": "person lifting weights" + }, + { + "no": 1065, + "code": "1F3CB 1F3FB", + "char": "🏋🏻", + "name": "person lifting weights: light skin tone" + }, + { + "no": 1066, + "code": "1F3CB 1F3FC", + "char": "🏋🏼", + "name": "person lifting weights: medium-light skin tone" + }, + { + "no": 1067, + "code": "1F3CB 1F3FD", + "char": "🏋🏽", + "name": "person lifting weights: medium skin tone" + }, + { + "no": 1068, + "code": "1F3CB 1F3FE", + "char": "🏋🏾", + "name": "person lifting weights: medium-dark skin tone" + }, + { + "no": 1069, + "code": "1F3CB 1F3FF", + "char": "🏋🏿", + "name": "person lifting weights: dark skin tone" + }, + { + "no": 1070, + "code": "1F3CB FE0F 200D 2642 FE0F", + "char": "🏋️‍♂️", + "name": "man lifting weights" + }, + { + "no": 1071, + "code": "1F3CB 1F3FB 200D 2642 FE0F", + "char": "🏋🏻‍♂️", + "name": "man lifting weights: light skin tone" + }, + { + "no": 1072, + "code": "1F3CB 1F3FC 200D 2642 FE0F", + "char": "🏋🏼‍♂️", + "name": "man lifting weights: medium-light skin tone" + }, + { + "no": 1073, + "code": "1F3CB 1F3FD 200D 2642 FE0F", + "char": "🏋🏽‍♂️", + "name": "man lifting weights: medium skin tone" + }, + { + "no": 1074, + "code": "1F3CB 1F3FE 200D 2642 FE0F", + "char": "🏋🏾‍♂️", + "name": "man lifting weights: medium-dark skin tone" + }, + { + "no": 1075, + "code": "1F3CB 1F3FF 200D 2642 FE0F", + "char": "🏋🏿‍♂️", + "name": "man lifting weights: dark skin tone" + }, + { + "no": 1076, + "code": "1F3CB FE0F 200D 2640 FE0F", + "char": "🏋️‍♀️", + "name": "woman lifting weights" + }, + { + "no": 1077, + "code": "1F3CB 1F3FB 200D 2640 FE0F", + "char": "🏋🏻‍♀️", + "name": "woman lifting weights: light skin tone" + }, + { + "no": 1078, + "code": "1F3CB 1F3FC 200D 2640 FE0F", + "char": "🏋🏼‍♀️", + "name": "woman lifting weights: medium-light skin tone" + }, + { + "no": 1079, + "code": "1F3CB 1F3FD 200D 2640 FE0F", + "char": "🏋🏽‍♀️", + "name": "woman lifting weights: medium skin tone" + }, + { + "no": 1080, + "code": "1F3CB 1F3FE 200D 2640 FE0F", + "char": "🏋🏾‍♀️", + "name": "woman lifting weights: medium-dark skin tone" + }, + { + "no": 1081, + "code": "1F3CB 1F3FF 200D 2640 FE0F", + "char": "🏋🏿‍♀️", + "name": "woman lifting weights: dark skin tone" + }, + { + "no": 1082, + "code": "1F6B4", + "char": "🚴", + "name": "person biking" + }, + { + "no": 1083, + "code": "1F6B4 1F3FB", + "char": "🚴🏻", + "name": "person biking: light skin tone" + }, + { + "no": 1084, + "code": "1F6B4 1F3FC", + "char": "🚴🏼", + "name": "person biking: medium-light skin tone" + }, + { + "no": 1085, + "code": "1F6B4 1F3FD", + "char": "🚴🏽", + "name": "person biking: medium skin tone" + }, + { + "no": 1086, + "code": "1F6B4 1F3FE", + "char": "🚴🏾", + "name": "person biking: medium-dark skin tone" + }, + { + "no": 1087, + "code": "1F6B4 1F3FF", + "char": "🚴🏿", + "name": "person biking: dark skin tone" + }, + { + "no": 1088, + "code": "1F6B4 200D 2642 FE0F", + "char": "🚴‍♂️", + "name": "man biking" + }, + { + "no": 1089, + "code": "1F6B4 1F3FB 200D 2642 FE0F", + "char": "🚴🏻‍♂️", + "name": "man biking: light skin tone" + }, + { + "no": 1090, + "code": "1F6B4 1F3FC 200D 2642 FE0F", + "char": "🚴🏼‍♂️", + "name": "man biking: medium-light skin tone" + }, + { + "no": 1091, + "code": "1F6B4 1F3FD 200D 2642 FE0F", + "char": "🚴🏽‍♂️", + "name": "man biking: medium skin tone" + }, + { + "no": 1092, + "code": "1F6B4 1F3FE 200D 2642 FE0F", + "char": "🚴🏾‍♂️", + "name": "man biking: medium-dark skin tone" + }, + { + "no": 1093, + "code": "1F6B4 1F3FF 200D 2642 FE0F", + "char": "🚴🏿‍♂️", + "name": "man biking: dark skin tone" + }, + { + "no": 1094, + "code": "1F6B4 200D 2640 FE0F", + "char": "🚴‍♀️", + "name": "woman biking" + }, + { + "no": 1095, + "code": "1F6B4 1F3FB 200D 2640 FE0F", + "char": "🚴🏻‍♀️", + "name": "woman biking: light skin tone" + }, + { + "no": 1096, + "code": "1F6B4 1F3FC 200D 2640 FE0F", + "char": "🚴🏼‍♀️", + "name": "woman biking: medium-light skin tone" + }, + { + "no": 1097, + "code": "1F6B4 1F3FD 200D 2640 FE0F", + "char": "🚴🏽‍♀️", + "name": "woman biking: medium skin tone" + }, + { + "no": 1098, + "code": "1F6B4 1F3FE 200D 2640 FE0F", + "char": "🚴🏾‍♀️", + "name": "woman biking: medium-dark skin tone" + }, + { + "no": 1099, + "code": "1F6B4 1F3FF 200D 2640 FE0F", + "char": "🚴🏿‍♀️", + "name": "woman biking: dark skin tone" + }, + { + "no": 1100, + "code": "1F6B5", + "char": "🚵", + "name": "person mountain biking" + }, + { + "no": 1101, + "code": "1F6B5 1F3FB", + "char": "🚵🏻", + "name": "person mountain biking: light skin tone" + }, + { + "no": 1102, + "code": "1F6B5 1F3FC", + "char": "🚵🏼", + "name": "person mountain biking: medium-light skin tone" + }, + { + "no": 1103, + "code": "1F6B5 1F3FD", + "char": "🚵🏽", + "name": "person mountain biking: medium skin tone" + }, + { + "no": 1104, + "code": "1F6B5 1F3FE", + "char": "🚵🏾", + "name": "person mountain biking: medium-dark skin tone" + }, + { + "no": 1105, + "code": "1F6B5 1F3FF", + "char": "🚵🏿", + "name": "person mountain biking: dark skin tone" + }, + { + "no": 1106, + "code": "1F6B5 200D 2642 FE0F", + "char": "🚵‍♂️", + "name": "man mountain biking" + }, + { + "no": 1107, + "code": "1F6B5 1F3FB 200D 2642 FE0F", + "char": "🚵🏻‍♂️", + "name": "man mountain biking: light skin tone" + }, + { + "no": 1108, + "code": "1F6B5 1F3FC 200D 2642 FE0F", + "char": "🚵🏼‍♂️", + "name": "man mountain biking: medium-light skin tone" + }, + { + "no": 1109, + "code": "1F6B5 1F3FD 200D 2642 FE0F", + "char": "🚵🏽‍♂️", + "name": "man mountain biking: medium skin tone" + }, + { + "no": 1110, + "code": "1F6B5 1F3FE 200D 2642 FE0F", + "char": "🚵🏾‍♂️", + "name": "man mountain biking: medium-dark skin tone" + }, + { + "no": 1111, + "code": "1F6B5 1F3FF 200D 2642 FE0F", + "char": "🚵🏿‍♂️", + "name": "man mountain biking: dark skin tone" + }, + { + "no": 1112, + "code": "1F6B5 200D 2640 FE0F", + "char": "🚵‍♀️", + "name": "woman mountain biking" + }, + { + "no": 1113, + "code": "1F6B5 1F3FB 200D 2640 FE0F", + "char": "🚵🏻‍♀️", + "name": "woman mountain biking: light skin tone" + }, + { + "no": 1114, + "code": "1F6B5 1F3FC 200D 2640 FE0F", + "char": "🚵🏼‍♀️", + "name": "woman mountain biking: medium-light skin tone" + }, + { + "no": 1115, + "code": "1F6B5 1F3FD 200D 2640 FE0F", + "char": "🚵🏽‍♀️", + "name": "woman mountain biking: medium skin tone" + }, + { + "no": 1116, + "code": "1F6B5 1F3FE 200D 2640 FE0F", + "char": "🚵🏾‍♀️", + "name": "woman mountain biking: medium-dark skin tone" + }, + { + "no": 1117, + "code": "1F6B5 1F3FF 200D 2640 FE0F", + "char": "🚵🏿‍♀️", + "name": "woman mountain biking: dark skin tone" + }, + { + "no": 1118, + "code": "1F3CE", + "char": "🏎", + "name": "racing car" + }, + { + "no": 1119, + "code": "1F3CD", + "char": "🏍", + "name": "motorcycle" + }, + { + "no": 1120, + "code": "1F938", + "char": "🤸", + "name": "person cartwheeling" + }, + { + "no": 1121, + "code": "1F938 1F3FB", + "char": "🤸🏻", + "name": "person cartwheeling: light skin tone" + }, + { + "no": 1122, + "code": "1F938 1F3FC", + "char": "🤸🏼", + "name": "person cartwheeling: medium-light skin tone" + }, + { + "no": 1123, + "code": "1F938 1F3FD", + "char": "🤸🏽", + "name": "person cartwheeling: medium skin tone" + }, + { + "no": 1124, + "code": "1F938 1F3FE", + "char": "🤸🏾", + "name": "person cartwheeling: medium-dark skin tone" + }, + { + "no": 1125, + "code": "1F938 1F3FF", + "char": "🤸🏿", + "name": "person cartwheeling: dark skin tone" + }, + { + "no": 1126, + "code": "1F938 200D 2642 FE0F", + "char": "🤸‍♂️", + "name": "man cartwheeling" + }, + { + "no": 1127, + "code": "1F938 1F3FB 200D 2642 FE0F", + "char": "🤸🏻‍♂️", + "name": "man cartwheeling: light skin tone" + }, + { + "no": 1128, + "code": "1F938 1F3FC 200D 2642 FE0F", + "char": "🤸🏼‍♂️", + "name": "man cartwheeling: medium-light skin tone" + }, + { + "no": 1129, + "code": "1F938 1F3FD 200D 2642 FE0F", + "char": "🤸🏽‍♂️", + "name": "man cartwheeling: medium skin tone" + }, + { + "no": 1130, + "code": "1F938 1F3FE 200D 2642 FE0F", + "char": "🤸🏾‍♂️", + "name": "man cartwheeling: medium-dark skin tone" + }, + { + "no": 1131, + "code": "1F938 1F3FF 200D 2642 FE0F", + "char": "🤸🏿‍♂️", + "name": "man cartwheeling: dark skin tone" + }, + { + "no": 1132, + "code": "1F938 200D 2640 FE0F", + "char": "🤸‍♀️", + "name": "woman cartwheeling" + }, + { + "no": 1133, + "code": "1F938 1F3FB 200D 2640 FE0F", + "char": "🤸🏻‍♀️", + "name": "woman cartwheeling: light skin tone" + }, + { + "no": 1134, + "code": "1F938 1F3FC 200D 2640 FE0F", + "char": "🤸🏼‍♀️", + "name": "woman cartwheeling: medium-light skin tone" + }, + { + "no": 1135, + "code": "1F938 1F3FD 200D 2640 FE0F", + "char": "🤸🏽‍♀️", + "name": "woman cartwheeling: medium skin tone" + }, + { + "no": 1136, + "code": "1F938 1F3FE 200D 2640 FE0F", + "char": "🤸🏾‍♀️", + "name": "woman cartwheeling: medium-dark skin tone" + }, + { + "no": 1137, + "code": "1F938 1F3FF 200D 2640 FE0F", + "char": "🤸🏿‍♀️", + "name": "woman cartwheeling: dark skin tone" + }, + { + "no": 1138, + "code": "1F93C", + "char": "🤼", + "name": "people wrestling" + }, + { + "no": 1139, + "code": "1F93C 200D 2642 FE0F", + "char": "🤼‍♂️", + "name": "men wrestling" + }, + { + "no": 1140, + "code": "1F93C 200D 2640 FE0F", + "char": "🤼‍♀️", + "name": "women wrestling" + }, + { + "no": 1141, + "code": "1F93D", + "char": "🤽", + "name": "person playing water polo" + }, + { + "no": 1142, + "code": "1F93D 1F3FB", + "char": "🤽🏻", + "name": "person playing water polo: light skin tone" + }, + { + "no": 1143, + "code": "1F93D 1F3FC", + "char": "🤽🏼", + "name": "person playing water polo: medium-light skin tone" + }, + { + "no": 1144, + "code": "1F93D 1F3FD", + "char": "🤽🏽", + "name": "person playing water polo: medium skin tone" + }, + { + "no": 1145, + "code": "1F93D 1F3FE", + "char": "🤽🏾", + "name": "person playing water polo: medium-dark skin tone" + }, + { + "no": 1146, + "code": "1F93D 1F3FF", + "char": "🤽🏿", + "name": "person playing water polo: dark skin tone" + }, + { + "no": 1147, + "code": "1F93D 200D 2642 FE0F", + "char": "🤽‍♂️", + "name": "man playing water polo" + }, + { + "no": 1148, + "code": "1F93D 1F3FB 200D 2642 FE0F", + "char": "🤽🏻‍♂️", + "name": "man playing water polo: light skin tone" + }, + { + "no": 1149, + "code": "1F93D 1F3FC 200D 2642 FE0F", + "char": "🤽🏼‍♂️", + "name": "man playing water polo: medium-light skin tone" + }, + { + "no": 1150, + "code": "1F93D 1F3FD 200D 2642 FE0F", + "char": "🤽🏽‍♂️", + "name": "man playing water polo: medium skin tone" + }, + { + "no": 1151, + "code": "1F93D 1F3FE 200D 2642 FE0F", + "char": "🤽🏾‍♂️", + "name": "man playing water polo: medium-dark skin tone" + }, + { + "no": 1152, + "code": "1F93D 1F3FF 200D 2642 FE0F", + "char": "🤽🏿‍♂️", + "name": "man playing water polo: dark skin tone" + }, + { + "no": 1153, + "code": "1F93D 200D 2640 FE0F", + "char": "🤽‍♀️", + "name": "woman playing water polo" + }, + { + "no": 1154, + "code": "1F93D 1F3FB 200D 2640 FE0F", + "char": "🤽🏻‍♀️", + "name": "woman playing water polo: light skin tone" + }, + { + "no": 1155, + "code": "1F93D 1F3FC 200D 2640 FE0F", + "char": "🤽🏼‍♀️", + "name": "woman playing water polo: medium-light skin tone" + }, + { + "no": 1156, + "code": "1F93D 1F3FD 200D 2640 FE0F", + "char": "🤽🏽‍♀️", + "name": "woman playing water polo: medium skin tone" + }, + { + "no": 1157, + "code": "1F93D 1F3FE 200D 2640 FE0F", + "char": "🤽🏾‍♀️", + "name": "woman playing water polo: medium-dark skin tone" + }, + { + "no": 1158, + "code": "1F93D 1F3FF 200D 2640 FE0F", + "char": "🤽🏿‍♀️", + "name": "woman playing water polo: dark skin tone" + }, + { + "no": 1159, + "code": "1F93E", + "char": "🤾", + "name": "person playing handball" + }, + { + "no": 1160, + "code": "1F93E 1F3FB", + "char": "🤾🏻", + "name": "person playing handball: light skin tone" + }, + { + "no": 1161, + "code": "1F93E 1F3FC", + "char": "🤾🏼", + "name": "person playing handball: medium-light skin tone" + }, + { + "no": 1162, + "code": "1F93E 1F3FD", + "char": "🤾🏽", + "name": "person playing handball: medium skin tone" + }, + { + "no": 1163, + "code": "1F93E 1F3FE", + "char": "🤾🏾", + "name": "person playing handball: medium-dark skin tone" + }, + { + "no": 1164, + "code": "1F93E 1F3FF", + "char": "🤾🏿", + "name": "person playing handball: dark skin tone" + }, + { + "no": 1165, + "code": "1F93E 200D 2642 FE0F", + "char": "🤾‍♂️", + "name": "man playing handball" + }, + { + "no": 1166, + "code": "1F93E 1F3FB 200D 2642 FE0F", + "char": "🤾🏻‍♂️", + "name": "man playing handball: light skin tone" + }, + { + "no": 1167, + "code": "1F93E 1F3FC 200D 2642 FE0F", + "char": "🤾🏼‍♂️", + "name": "man playing handball: medium-light skin tone" + }, + { + "no": 1168, + "code": "1F93E 1F3FD 200D 2642 FE0F", + "char": "🤾🏽‍♂️", + "name": "man playing handball: medium skin tone" + }, + { + "no": 1169, + "code": "1F93E 1F3FE 200D 2642 FE0F", + "char": "🤾🏾‍♂️", + "name": "man playing handball: medium-dark skin tone" + }, + { + "no": 1170, + "code": "1F93E 1F3FF 200D 2642 FE0F", + "char": "🤾🏿‍♂️", + "name": "man playing handball: dark skin tone" + }, + { + "no": 1171, + "code": "1F93E 200D 2640 FE0F", + "char": "🤾‍♀️", + "name": "woman playing handball" + }, + { + "no": 1172, + "code": "1F93E 1F3FB 200D 2640 FE0F", + "char": "🤾🏻‍♀️", + "name": "woman playing handball: light skin tone" + }, + { + "no": 1173, + "code": "1F93E 1F3FC 200D 2640 FE0F", + "char": "🤾🏼‍♀️", + "name": "woman playing handball: medium-light skin tone" + }, + { + "no": 1174, + "code": "1F93E 1F3FD 200D 2640 FE0F", + "char": "🤾🏽‍♀️", + "name": "woman playing handball: medium skin tone" + }, + { + "no": 1175, + "code": "1F93E 1F3FE 200D 2640 FE0F", + "char": "🤾🏾‍♀️", + "name": "woman playing handball: medium-dark skin tone" + }, + { + "no": 1176, + "code": "1F93E 1F3FF 200D 2640 FE0F", + "char": "🤾🏿‍♀️", + "name": "woman playing handball: dark skin tone" + }, + { + "no": 1177, + "code": "1F939", + "char": "🤹", + "name": "person juggling" + }, + { + "no": 1178, + "code": "1F939 1F3FB", + "char": "🤹🏻", + "name": "person juggling: light skin tone" + }, + { + "no": 1179, + "code": "1F939 1F3FC", + "char": "🤹🏼", + "name": "person juggling: medium-light skin tone" + }, + { + "no": 1180, + "code": "1F939 1F3FD", + "char": "🤹🏽", + "name": "person juggling: medium skin tone" + }, + { + "no": 1181, + "code": "1F939 1F3FE", + "char": "🤹🏾", + "name": "person juggling: medium-dark skin tone" + }, + { + "no": 1182, + "code": "1F939 1F3FF", + "char": "🤹🏿", + "name": "person juggling: dark skin tone" + }, + { + "no": 1183, + "code": "1F939 200D 2642 FE0F", + "char": "🤹‍♂️", + "name": "man juggling" + }, + { + "no": 1184, + "code": "1F939 1F3FB 200D 2642 FE0F", + "char": "🤹🏻‍♂️", + "name": "man juggling: light skin tone" + }, + { + "no": 1185, + "code": "1F939 1F3FC 200D 2642 FE0F", + "char": "🤹🏼‍♂️", + "name": "man juggling: medium-light skin tone" + }, + { + "no": 1186, + "code": "1F939 1F3FD 200D 2642 FE0F", + "char": "🤹🏽‍♂️", + "name": "man juggling: medium skin tone" + }, + { + "no": 1187, + "code": "1F939 1F3FE 200D 2642 FE0F", + "char": "🤹🏾‍♂️", + "name": "man juggling: medium-dark skin tone" + }, + { + "no": 1188, + "code": "1F939 1F3FF 200D 2642 FE0F", + "char": "🤹🏿‍♂️", + "name": "man juggling: dark skin tone" + }, + { + "no": 1189, + "code": "1F939 200D 2640 FE0F", + "char": "🤹‍♀️", + "name": "woman juggling" + }, + { + "no": 1190, + "code": "1F939 1F3FB 200D 2640 FE0F", + "char": "🤹🏻‍♀️", + "name": "woman juggling: light skin tone" + }, + { + "no": 1191, + "code": "1F939 1F3FC 200D 2640 FE0F", + "char": "🤹🏼‍♀️", + "name": "woman juggling: medium-light skin tone" + }, + { + "no": 1192, + "code": "1F939 1F3FD 200D 2640 FE0F", + "char": "🤹🏽‍♀️", + "name": "woman juggling: medium skin tone" + }, + { + "no": 1193, + "code": "1F939 1F3FE 200D 2640 FE0F", + "char": "🤹🏾‍♀️", + "name": "woman juggling: medium-dark skin tone" + }, + { + "no": 1194, + "code": "1F939 1F3FF 200D 2640 FE0F", + "char": "🤹🏿‍♀️", + "name": "woman juggling: dark skin tone" + }, + { + "no": 1195, + "code": "1F46B", + "char": "👫", + "name": "man and woman holding hands" + }, + { + "no": 1196, + "code": "1F46C", + "char": "👬", + "name": "two men holding hands" + }, + { + "no": 1197, + "code": "1F46D", + "char": "👭", + "name": "two women holding hands" + }, + { + "no": 1198, + "code": "1F48F", + "char": "💏", + "name": "kiss" + }, + { + "no": 1199, + "code": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F468", + "char": "👩‍❤️‍💋‍👨", + "name": "kiss: woman, man" + }, + { + "no": 1200, + "code": "1F468 200D 2764 FE0F 200D 1F48B 200D 1F468", + "char": "👨‍❤️‍💋‍👨", + "name": "kiss: man, man" + }, + { + "no": 1201, + "code": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F469", + "char": "👩‍❤️‍💋‍👩", + "name": "kiss: woman, woman" + }, + { + "no": 1202, + "code": "1F491", + "char": "💑", + "name": "couple with heart" + }, + { + "no": 1203, + "code": "1F469 200D 2764 FE0F 200D 1F468", + "char": "👩‍❤️‍👨", + "name": "couple with heart: woman, man" + }, + { + "no": 1204, + "code": "1F468 200D 2764 FE0F 200D 1F468", + "char": "👨‍❤️‍👨", + "name": "couple with heart: man, man" + }, + { + "no": 1205, + "code": "1F469 200D 2764 FE0F 200D 1F469", + "char": "👩‍❤️‍👩", + "name": "couple with heart: woman, woman" + }, + { + "no": 1206, + "code": "1F46A", + "char": "👪", + "name": "family" + }, + { + "no": 1207, + "code": "1F468 200D 1F469 200D 1F466", + "char": "👨‍👩‍👦", + "name": "family: man, woman, boy" + }, + { + "no": 1208, + "code": "1F468 200D 1F469 200D 1F467", + "char": "👨‍👩‍👧", + "name": "family: man, woman, girl" + }, + { + "no": 1209, + "code": "1F468 200D 1F469 200D 1F467 200D 1F466", + "char": "👨‍👩‍👧‍👦", + "name": "family: man, woman, girl, boy" + }, + { + "no": 1210, + "code": "1F468 200D 1F469 200D 1F466 200D 1F466", + "char": "👨‍👩‍👦‍👦", + "name": "family: man, woman, boy, boy" + }, + { + "no": 1211, + "code": "1F468 200D 1F469 200D 1F467 200D 1F467", + "char": "👨‍👩‍👧‍👧", + "name": "family: man, woman, girl, girl" + }, + { + "no": 1212, + "code": "1F468 200D 1F468 200D 1F466", + "char": "👨‍👨‍👦", + "name": "family: man, man, boy" + }, + { + "no": 1213, + "code": "1F468 200D 1F468 200D 1F467", + "char": "👨‍👨‍👧", + "name": "family: man, man, girl" + }, + { + "no": 1214, + "code": "1F468 200D 1F468 200D 1F467 200D 1F466", + "char": "👨‍👨‍👧‍👦", + "name": "family: man, man, girl, boy" + }, + { + "no": 1215, + "code": "1F468 200D 1F468 200D 1F466 200D 1F466", + "char": "👨‍👨‍👦‍👦", + "name": "family: man, man, boy, boy" + }, + { + "no": 1216, + "code": "1F468 200D 1F468 200D 1F467 200D 1F467", + "char": "👨‍👨‍👧‍👧", + "name": "family: man, man, girl, girl" + }, + { + "no": 1217, + "code": "1F469 200D 1F469 200D 1F466", + "char": "👩‍👩‍👦", + "name": "family: woman, woman, boy" + }, + { + "no": 1218, + "code": "1F469 200D 1F469 200D 1F467", + "char": "👩‍👩‍👧", + "name": "family: woman, woman, girl" + }, + { + "no": 1219, + "code": "1F469 200D 1F469 200D 1F467 200D 1F466", + "char": "👩‍👩‍👧‍👦", + "name": "family: woman, woman, girl, boy" + }, + { + "no": 1220, + "code": "1F469 200D 1F469 200D 1F466 200D 1F466", + "char": "👩‍👩‍👦‍👦", + "name": "family: woman, woman, boy, boy" + }, + { + "no": 1221, + "code": "1F469 200D 1F469 200D 1F467 200D 1F467", + "char": "👩‍👩‍👧‍👧", + "name": "family: woman, woman, girl, girl" + }, + { + "no": 1222, + "code": "1F468 200D 1F466", + "char": "👨‍👦", + "name": "family: man, boy" + }, + { + "no": 1223, + "code": "1F468 200D 1F466 200D 1F466", + "char": "👨‍👦‍👦", + "name": "family: man, boy, boy" + }, + { + "no": 1224, + "code": "1F468 200D 1F467", + "char": "👨‍👧", + "name": "family: man, girl" + }, + { + "no": 1225, + "code": "1F468 200D 1F467 200D 1F466", + "char": "👨‍👧‍👦", + "name": "family: man, girl, boy" + }, + { + "no": 1226, + "code": "1F468 200D 1F467 200D 1F467", + "char": "👨‍👧‍👧", + "name": "family: man, girl, girl" + }, + { + "no": 1227, + "code": "1F469 200D 1F466", + "char": "👩‍👦", + "name": "family: woman, boy" + }, + { + "no": 1228, + "code": "1F469 200D 1F466 200D 1F466", + "char": "👩‍👦‍👦", + "name": "family: woman, boy, boy" + }, + { + "no": 1229, + "code": "1F469 200D 1F467", + "char": "👩‍👧", + "name": "family: woman, girl" + }, + { + "no": 1230, + "code": "1F469 200D 1F467 200D 1F466", + "char": "👩‍👧‍👦", + "name": "family: woman, girl, boy" + }, + { + "no": 1231, + "code": "1F469 200D 1F467 200D 1F467", + "char": "👩‍👧‍👧", + "name": "family: woman, girl, girl" + }, + { + "no": 1232, + "code": "1F933", + "char": "🤳", + "name": "selfie" + }, + { + "no": 1233, + "code": "1F933 1F3FB", + "char": "🤳🏻", + "name": "selfie: light skin tone" + }, + { + "no": 1234, + "code": "1F933 1F3FC", + "char": "🤳🏼", + "name": "selfie: medium-light skin tone" + }, + { + "no": 1235, + "code": "1F933 1F3FD", + "char": "🤳🏽", + "name": "selfie: medium skin tone" + }, + { + "no": 1236, + "code": "1F933 1F3FE", + "char": "🤳🏾", + "name": "selfie: medium-dark skin tone" + }, + { + "no": 1237, + "code": "1F933 1F3FF", + "char": "🤳🏿", + "name": "selfie: dark skin tone" + }, + { + "no": 1238, + "code": "1F4AA", + "char": "💪", + "name": "flexed biceps" + }, + { + "no": 1239, + "code": "1F4AA 1F3FB", + "char": "💪🏻", + "name": "flexed biceps: light skin tone" + }, + { + "no": 1240, + "code": "1F4AA 1F3FC", + "char": "💪🏼", + "name": "flexed biceps: medium-light skin tone" + }, + { + "no": 1241, + "code": "1F4AA 1F3FD", + "char": "💪🏽", + "name": "flexed biceps: medium skin tone" + }, + { + "no": 1242, + "code": "1F4AA 1F3FE", + "char": "💪🏾", + "name": "flexed biceps: medium-dark skin tone" + }, + { + "no": 1243, + "code": "1F4AA 1F3FF", + "char": "💪🏿", + "name": "flexed biceps: dark skin tone" + }, + { + "no": 1244, + "code": "1F448", + "char": "👈", + "name": "backhand index pointing left" + }, + { + "no": 1245, + "code": "1F448 1F3FB", + "char": "👈🏻", + "name": "backhand index pointing left: light skin tone" + }, + { + "no": 1246, + "code": "1F448 1F3FC", + "char": "👈🏼", + "name": "backhand index pointing left: medium-light skin tone" + }, + { + "no": 1247, + "code": "1F448 1F3FD", + "char": "👈🏽", + "name": "backhand index pointing left: medium skin tone" + }, + { + "no": 1248, + "code": "1F448 1F3FE", + "char": "👈🏾", + "name": "backhand index pointing left: medium-dark skin tone" + }, + { + "no": 1249, + "code": "1F448 1F3FF", + "char": "👈🏿", + "name": "backhand index pointing left: dark skin tone" + }, + { + "no": 1250, + "code": "1F449", + "char": "👉", + "name": "backhand index pointing right" + }, + { + "no": 1251, + "code": "1F449 1F3FB", + "char": "👉🏻", + "name": "backhand index pointing right: light skin tone" + }, + { + "no": 1252, + "code": "1F449 1F3FC", + "char": "👉🏼", + "name": "backhand index pointing right: medium-light skin tone" + }, + { + "no": 1253, + "code": "1F449 1F3FD", + "char": "👉🏽", + "name": "backhand index pointing right: medium skin tone" + }, + { + "no": 1254, + "code": "1F449 1F3FE", + "char": "👉🏾", + "name": "backhand index pointing right: medium-dark skin tone" + }, + { + "no": 1255, + "code": "1F449 1F3FF", + "char": "👉🏿", + "name": "backhand index pointing right: dark skin tone" + }, + { + "no": 1256, + "code": "261D", + "char": "☝", + "name": "index pointing up" + }, + { + "no": 1257, + "code": "261D 1F3FB", + "char": "☝🏻", + "name": "index pointing up: light skin tone" + }, + { + "no": 1258, + "code": "261D 1F3FC", + "char": "☝🏼", + "name": "index pointing up: medium-light skin tone" + }, + { + "no": 1259, + "code": "261D 1F3FD", + "char": "☝🏽", + "name": "index pointing up: medium skin tone" + }, + { + "no": 1260, + "code": "261D 1F3FE", + "char": "☝🏾", + "name": "index pointing up: medium-dark skin tone" + }, + { + "no": 1261, + "code": "261D 1F3FF", + "char": "☝🏿", + "name": "index pointing up: dark skin tone" + }, + { + "no": 1262, + "code": "1F446", + "char": "👆", + "name": "backhand index pointing up" + }, + { + "no": 1263, + "code": "1F446 1F3FB", + "char": "👆🏻", + "name": "backhand index pointing up: light skin tone" + }, + { + "no": 1264, + "code": "1F446 1F3FC", + "char": "👆🏼", + "name": "backhand index pointing up: medium-light skin tone" + }, + { + "no": 1265, + "code": "1F446 1F3FD", + "char": "👆🏽", + "name": "backhand index pointing up: medium skin tone" + }, + { + "no": 1266, + "code": "1F446 1F3FE", + "char": "👆🏾", + "name": "backhand index pointing up: medium-dark skin tone" + }, + { + "no": 1267, + "code": "1F446 1F3FF", + "char": "👆🏿", + "name": "backhand index pointing up: dark skin tone" + }, + { + "no": 1268, + "code": "1F595", + "char": "🖕", + "name": "middle finger" + }, + { + "no": 1269, + "code": "1F595 1F3FB", + "char": "🖕🏻", + "name": "middle finger: light skin tone" + }, + { + "no": 1270, + "code": "1F595 1F3FC", + "char": "🖕🏼", + "name": "middle finger: medium-light skin tone" + }, + { + "no": 1271, + "code": "1F595 1F3FD", + "char": "🖕🏽", + "name": "middle finger: medium skin tone" + }, + { + "no": 1272, + "code": "1F595 1F3FE", + "char": "🖕🏾", + "name": "middle finger: medium-dark skin tone" + }, + { + "no": 1273, + "code": "1F595 1F3FF", + "char": "🖕🏿", + "name": "middle finger: dark skin tone" + }, + { + "no": 1274, + "code": "1F447", + "char": "👇", + "name": "backhand index pointing down" + }, + { + "no": 1275, + "code": "1F447 1F3FB", + "char": "👇🏻", + "name": "backhand index pointing down: light skin tone" + }, + { + "no": 1276, + "code": "1F447 1F3FC", + "char": "👇🏼", + "name": "backhand index pointing down: medium-light skin tone" + }, + { + "no": 1277, + "code": "1F447 1F3FD", + "char": "👇🏽", + "name": "backhand index pointing down: medium skin tone" + }, + { + "no": 1278, + "code": "1F447 1F3FE", + "char": "👇🏾", + "name": "backhand index pointing down: medium-dark skin tone" + }, + { + "no": 1279, + "code": "1F447 1F3FF", + "char": "👇🏿", + "name": "backhand index pointing down: dark skin tone" + }, + { + "no": 1280, + "code": "270C", + "char": "✌", + "name": "victory hand" + }, + { + "no": 1281, + "code": "270C 1F3FB", + "char": "✌🏻", + "name": "victory hand: light skin tone" + }, + { + "no": 1282, + "code": "270C 1F3FC", + "char": "✌🏼", + "name": "victory hand: medium-light skin tone" + }, + { + "no": 1283, + "code": "270C 1F3FD", + "char": "✌🏽", + "name": "victory hand: medium skin tone" + }, + { + "no": 1284, + "code": "270C 1F3FE", + "char": "✌🏾", + "name": "victory hand: medium-dark skin tone" + }, + { + "no": 1285, + "code": "270C 1F3FF", + "char": "✌🏿", + "name": "victory hand: dark skin tone" + }, + { + "no": 1286, + "code": "1F91E", + "char": "🤞", + "name": "crossed fingers" + }, + { + "no": 1287, + "code": "1F91E 1F3FB", + "char": "🤞🏻", + "name": "crossed fingers: light skin tone" + }, + { + "no": 1288, + "code": "1F91E 1F3FC", + "char": "🤞🏼", + "name": "crossed fingers: medium-light skin tone" + }, + { + "no": 1289, + "code": "1F91E 1F3FD", + "char": "🤞🏽", + "name": "crossed fingers: medium skin tone" + }, + { + "no": 1290, + "code": "1F91E 1F3FE", + "char": "🤞🏾", + "name": "crossed fingers: medium-dark skin tone" + }, + { + "no": 1291, + "code": "1F91E 1F3FF", + "char": "🤞🏿", + "name": "crossed fingers: dark skin tone" + }, + { + "no": 1292, + "code": "1F596", + "char": "🖖", + "name": "vulcan salute" + }, + { + "no": 1293, + "code": "1F596 1F3FB", + "char": "🖖🏻", + "name": "vulcan salute: light skin tone" + }, + { + "no": 1294, + "code": "1F596 1F3FC", + "char": "🖖🏼", + "name": "vulcan salute: medium-light skin tone" + }, + { + "no": 1295, + "code": "1F596 1F3FD", + "char": "🖖🏽", + "name": "vulcan salute: medium skin tone" + }, + { + "no": 1296, + "code": "1F596 1F3FE", + "char": "🖖🏾", + "name": "vulcan salute: medium-dark skin tone" + }, + { + "no": 1297, + "code": "1F596 1F3FF", + "char": "🖖🏿", + "name": "vulcan salute: dark skin tone" + }, + { + "no": 1298, + "code": "1F918", + "char": "🤘", + "name": "sign of the horns" + }, + { + "no": 1299, + "code": "1F918 1F3FB", + "char": "🤘🏻", + "name": "sign of the horns: light skin tone" + }, + { + "no": 1300, + "code": "1F918 1F3FC", + "char": "🤘🏼", + "name": "sign of the horns: medium-light skin tone" + }, + { + "no": 1301, + "code": "1F918 1F3FD", + "char": "🤘🏽", + "name": "sign of the horns: medium skin tone" + }, + { + "no": 1302, + "code": "1F918 1F3FE", + "char": "🤘🏾", + "name": "sign of the horns: medium-dark skin tone" + }, + { + "no": 1303, + "code": "1F918 1F3FF", + "char": "🤘🏿", + "name": "sign of the horns: dark skin tone" + }, + { + "no": 1304, + "code": "1F919", + "char": "🤙", + "name": "call me hand" + }, + { + "no": 1305, + "code": "1F919 1F3FB", + "char": "🤙🏻", + "name": "call me hand: light skin tone" + }, + { + "no": 1306, + "code": "1F919 1F3FC", + "char": "🤙🏼", + "name": "call me hand: medium-light skin tone" + }, + { + "no": 1307, + "code": "1F919 1F3FD", + "char": "🤙🏽", + "name": "call me hand: medium skin tone" + }, + { + "no": 1308, + "code": "1F919 1F3FE", + "char": "🤙🏾", + "name": "call me hand: medium-dark skin tone" + }, + { + "no": 1309, + "code": "1F919 1F3FF", + "char": "🤙🏿", + "name": "call me hand: dark skin tone" + }, + { + "no": 1310, + "code": "1F590", + "char": "🖐", + "name": "hand with fingers splayed" + }, + { + "no": 1311, + "code": "1F590 1F3FB", + "char": "🖐🏻", + "name": "hand with fingers splayed: light skin tone" + }, + { + "no": 1312, + "code": "1F590 1F3FC", + "char": "🖐🏼", + "name": "hand with fingers splayed: medium-light skin tone" + }, + { + "no": 1313, + "code": "1F590 1F3FD", + "char": "🖐🏽", + "name": "hand with fingers splayed: medium skin tone" + }, + { + "no": 1314, + "code": "1F590 1F3FE", + "char": "🖐🏾", + "name": "hand with fingers splayed: medium-dark skin tone" + }, + { + "no": 1315, + "code": "1F590 1F3FF", + "char": "🖐🏿", + "name": "hand with fingers splayed: dark skin tone" + }, + { + "no": 1316, + "code": "270B", + "char": "✋", + "name": "raised hand" + }, + { + "no": 1317, + "code": "270B 1F3FB", + "char": "✋🏻", + "name": "raised hand: light skin tone" + }, + { + "no": 1318, + "code": "270B 1F3FC", + "char": "✋🏼", + "name": "raised hand: medium-light skin tone" + }, + { + "no": 1319, + "code": "270B 1F3FD", + "char": "✋🏽", + "name": "raised hand: medium skin tone" + }, + { + "no": 1320, + "code": "270B 1F3FE", + "char": "✋🏾", + "name": "raised hand: medium-dark skin tone" + }, + { + "no": 1321, + "code": "270B 1F3FF", + "char": "✋🏿", + "name": "raised hand: dark skin tone" + }, + { + "no": 1322, + "code": "1F44C", + "char": "👌", + "name": "OK hand" + }, + { + "no": 1323, + "code": "1F44C 1F3FB", + "char": "👌🏻", + "name": "OK hand: light skin tone" + }, + { + "no": 1324, + "code": "1F44C 1F3FC", + "char": "👌🏼", + "name": "OK hand: medium-light skin tone" + }, + { + "no": 1325, + "code": "1F44C 1F3FD", + "char": "👌🏽", + "name": "OK hand: medium skin tone" + }, + { + "no": 1326, + "code": "1F44C 1F3FE", + "char": "👌🏾", + "name": "OK hand: medium-dark skin tone" + }, + { + "no": 1327, + "code": "1F44C 1F3FF", + "char": "👌🏿", + "name": "OK hand: dark skin tone" + }, + { + "no": 1328, + "code": "1F44D", + "char": "👍", + "name": "thumbs up" + }, + { + "no": 1329, + "code": "1F44D 1F3FB", + "char": "👍🏻", + "name": "thumbs up: light skin tone" + }, + { + "no": 1330, + "code": "1F44D 1F3FC", + "char": "👍🏼", + "name": "thumbs up: medium-light skin tone" + }, + { + "no": 1331, + "code": "1F44D 1F3FD", + "char": "👍🏽", + "name": "thumbs up: medium skin tone" + }, + { + "no": 1332, + "code": "1F44D 1F3FE", + "char": "👍🏾", + "name": "thumbs up: medium-dark skin tone" + }, + { + "no": 1333, + "code": "1F44D 1F3FF", + "char": "👍🏿", + "name": "thumbs up: dark skin tone" + }, + { + "no": 1334, + "code": "1F44E", + "char": "👎", + "name": "thumbs down" + }, + { + "no": 1335, + "code": "1F44E 1F3FB", + "char": "👎🏻", + "name": "thumbs down: light skin tone" + }, + { + "no": 1336, + "code": "1F44E 1F3FC", + "char": "👎🏼", + "name": "thumbs down: medium-light skin tone" + }, + { + "no": 1337, + "code": "1F44E 1F3FD", + "char": "👎🏽", + "name": "thumbs down: medium skin tone" + }, + { + "no": 1338, + "code": "1F44E 1F3FE", + "char": "👎🏾", + "name": "thumbs down: medium-dark skin tone" + }, + { + "no": 1339, + "code": "1F44E 1F3FF", + "char": "👎🏿", + "name": "thumbs down: dark skin tone" + }, + { + "no": 1340, + "code": "270A", + "char": "✊", + "name": "raised fist" + }, + { + "no": 1341, + "code": "270A 1F3FB", + "char": "✊🏻", + "name": "raised fist: light skin tone" + }, + { + "no": 1342, + "code": "270A 1F3FC", + "char": "✊🏼", + "name": "raised fist: medium-light skin tone" + }, + { + "no": 1343, + "code": "270A 1F3FD", + "char": "✊🏽", + "name": "raised fist: medium skin tone" + }, + { + "no": 1344, + "code": "270A 1F3FE", + "char": "✊🏾", + "name": "raised fist: medium-dark skin tone" + }, + { + "no": 1345, + "code": "270A 1F3FF", + "char": "✊🏿", + "name": "raised fist: dark skin tone" + }, + { + "no": 1346, + "code": "1F44A", + "char": "👊", + "name": "oncoming fist" + }, + { + "no": 1347, + "code": "1F44A 1F3FB", + "char": "👊🏻", + "name": "oncoming fist: light skin tone" + }, + { + "no": 1348, + "code": "1F44A 1F3FC", + "char": "👊🏼", + "name": "oncoming fist: medium-light skin tone" + }, + { + "no": 1349, + "code": "1F44A 1F3FD", + "char": "👊🏽", + "name": "oncoming fist: medium skin tone" + }, + { + "no": 1350, + "code": "1F44A 1F3FE", + "char": "👊🏾", + "name": "oncoming fist: medium-dark skin tone" + }, + { + "no": 1351, + "code": "1F44A 1F3FF", + "char": "👊🏿", + "name": "oncoming fist: dark skin tone" + }, + { + "no": 1352, + "code": "1F91B", + "char": "🤛", + "name": "left-facing fist" + }, + { + "no": 1353, + "code": "1F91B 1F3FB", + "char": "🤛🏻", + "name": "left-facing fist: light skin tone" + }, + { + "no": 1354, + "code": "1F91B 1F3FC", + "char": "🤛🏼", + "name": "left-facing fist: medium-light skin tone" + }, + { + "no": 1355, + "code": "1F91B 1F3FD", + "char": "🤛🏽", + "name": "left-facing fist: medium skin tone" + }, + { + "no": 1356, + "code": "1F91B 1F3FE", + "char": "🤛🏾", + "name": "left-facing fist: medium-dark skin tone" + }, + { + "no": 1357, + "code": "1F91B 1F3FF", + "char": "🤛🏿", + "name": "left-facing fist: dark skin tone" + }, + { + "no": 1358, + "code": "1F91C", + "char": "🤜", + "name": "right-facing fist" + }, + { + "no": 1359, + "code": "1F91C 1F3FB", + "char": "🤜🏻", + "name": "right-facing fist: light skin tone" + }, + { + "no": 1360, + "code": "1F91C 1F3FC", + "char": "🤜🏼", + "name": "right-facing fist: medium-light skin tone" + }, + { + "no": 1361, + "code": "1F91C 1F3FD", + "char": "🤜🏽", + "name": "right-facing fist: medium skin tone" + }, + { + "no": 1362, + "code": "1F91C 1F3FE", + "char": "🤜🏾", + "name": "right-facing fist: medium-dark skin tone" + }, + { + "no": 1363, + "code": "1F91C 1F3FF", + "char": "🤜🏿", + "name": "right-facing fist: dark skin tone" + }, + { + "no": 1364, + "code": "1F91A", + "char": "🤚", + "name": "raised back of hand" + }, + { + "no": 1365, + "code": "1F91A 1F3FB", + "char": "🤚🏻", + "name": "raised back of hand: light skin tone" + }, + { + "no": 1366, + "code": "1F91A 1F3FC", + "char": "🤚🏼", + "name": "raised back of hand: medium-light skin tone" + }, + { + "no": 1367, + "code": "1F91A 1F3FD", + "char": "🤚🏽", + "name": "raised back of hand: medium skin tone" + }, + { + "no": 1368, + "code": "1F91A 1F3FE", + "char": "🤚🏾", + "name": "raised back of hand: medium-dark skin tone" + }, + { + "no": 1369, + "code": "1F91A 1F3FF", + "char": "🤚🏿", + "name": "raised back of hand: dark skin tone" + }, + { + "no": 1370, + "code": "1F44B", + "char": "👋", + "name": "waving hand" + }, + { + "no": 1371, + "code": "1F44B 1F3FB", + "char": "👋🏻", + "name": "waving hand: light skin tone" + }, + { + "no": 1372, + "code": "1F44B 1F3FC", + "char": "👋🏼", + "name": "waving hand: medium-light skin tone" + }, + { + "no": 1373, + "code": "1F44B 1F3FD", + "char": "👋🏽", + "name": "waving hand: medium skin tone" + }, + { + "no": 1374, + "code": "1F44B 1F3FE", + "char": "👋🏾", + "name": "waving hand: medium-dark skin tone" + }, + { + "no": 1375, + "code": "1F44B 1F3FF", + "char": "👋🏿", + "name": "waving hand: dark skin tone" + }, + { + "no": 1376, + "code": "1F91F", + "char": "🤟", + "name": "⊛ love-you gesture" + }, + { + "no": 1377, + "code": "1F91F 1F3FB", + "char": "🤟🏻", + "name": "⊛ love-you gesture: light skin tone" + }, + { + "no": 1378, + "code": "1F91F 1F3FC", + "char": "🤟🏼", + "name": "⊛ love-you gesture: medium-light skin tone" + }, + { + "no": 1379, + "code": "1F91F 1F3FD", + "char": "🤟🏽", + "name": "⊛ love-you gesture: medium skin tone" + }, + { + "no": 1380, + "code": "1F91F 1F3FE", + "char": "🤟🏾", + "name": "⊛ love-you gesture: medium-dark skin tone" + }, + { + "no": 1381, + "code": "1F91F 1F3FF", + "char": "🤟🏿", + "name": "⊛ love-you gesture: dark skin tone" + }, + { + "no": 1382, + "code": "270D", + "char": "✍", + "name": "writing hand" + }, + { + "no": 1383, + "code": "270D 1F3FB", + "char": "✍🏻", + "name": "writing hand: light skin tone" + }, + { + "no": 1384, + "code": "270D 1F3FC", + "char": "✍🏼", + "name": "writing hand: medium-light skin tone" + }, + { + "no": 1385, + "code": "270D 1F3FD", + "char": "✍🏽", + "name": "writing hand: medium skin tone" + }, + { + "no": 1386, + "code": "270D 1F3FE", + "char": "✍🏾", + "name": "writing hand: medium-dark skin tone" + }, + { + "no": 1387, + "code": "270D 1F3FF", + "char": "✍🏿", + "name": "writing hand: dark skin tone" + }, + { + "no": 1388, + "code": "1F44F", + "char": "👏", + "name": "clapping hands" + }, + { + "no": 1389, + "code": "1F44F 1F3FB", + "char": "👏🏻", + "name": "clapping hands: light skin tone" + }, + { + "no": 1390, + "code": "1F44F 1F3FC", + "char": "👏🏼", + "name": "clapping hands: medium-light skin tone" + }, + { + "no": 1391, + "code": "1F44F 1F3FD", + "char": "👏🏽", + "name": "clapping hands: medium skin tone" + }, + { + "no": 1392, + "code": "1F44F 1F3FE", + "char": "👏🏾", + "name": "clapping hands: medium-dark skin tone" + }, + { + "no": 1393, + "code": "1F44F 1F3FF", + "char": "👏🏿", + "name": "clapping hands: dark skin tone" + }, + { + "no": 1394, + "code": "1F450", + "char": "👐", + "name": "open hands" + }, + { + "no": 1395, + "code": "1F450 1F3FB", + "char": "👐🏻", + "name": "open hands: light skin tone" + }, + { + "no": 1396, + "code": "1F450 1F3FC", + "char": "👐🏼", + "name": "open hands: medium-light skin tone" + }, + { + "no": 1397, + "code": "1F450 1F3FD", + "char": "👐🏽", + "name": "open hands: medium skin tone" + }, + { + "no": 1398, + "code": "1F450 1F3FE", + "char": "👐🏾", + "name": "open hands: medium-dark skin tone" + }, + { + "no": 1399, + "code": "1F450 1F3FF", + "char": "👐🏿", + "name": "open hands: dark skin tone" + }, + { + "no": 1400, + "code": "1F64C", + "char": "🙌", + "name": "raising hands" + }, + { + "no": 1401, + "code": "1F64C 1F3FB", + "char": "🙌🏻", + "name": "raising hands: light skin tone" + }, + { + "no": 1402, + "code": "1F64C 1F3FC", + "char": "🙌🏼", + "name": "raising hands: medium-light skin tone" + }, + { + "no": 1403, + "code": "1F64C 1F3FD", + "char": "🙌🏽", + "name": "raising hands: medium skin tone" + }, + { + "no": 1404, + "code": "1F64C 1F3FE", + "char": "🙌🏾", + "name": "raising hands: medium-dark skin tone" + }, + { + "no": 1405, + "code": "1F64C 1F3FF", + "char": "🙌🏿", + "name": "raising hands: dark skin tone" + }, + { + "no": 1406, + "code": "1F932", + "char": "🤲", + "name": "⊛ palms up together" + }, + { + "no": 1407, + "code": "1F932 1F3FB", + "char": "🤲🏻", + "name": "⊛ palms up together: light skin tone" + }, + { + "no": 1408, + "code": "1F932 1F3FC", + "char": "🤲🏼", + "name": "⊛ palms up together: medium-light skin tone" + }, + { + "no": 1409, + "code": "1F932 1F3FD", + "char": "🤲🏽", + "name": "⊛ palms up together: medium skin tone" + }, + { + "no": 1410, + "code": "1F932 1F3FE", + "char": "🤲🏾", + "name": "⊛ palms up together: medium-dark skin tone" + }, + { + "no": 1411, + "code": "1F932 1F3FF", + "char": "🤲🏿", + "name": "⊛ palms up together: dark skin tone" + }, + { + "no": 1412, + "code": "1F64F", + "char": "🙏", + "name": "folded hands" + }, + { + "no": 1413, + "code": "1F64F 1F3FB", + "char": "🙏🏻", + "name": "folded hands: light skin tone" + }, + { + "no": 1414, + "code": "1F64F 1F3FC", + "char": "🙏🏼", + "name": "folded hands: medium-light skin tone" + }, + { + "no": 1415, + "code": "1F64F 1F3FD", + "char": "🙏🏽", + "name": "folded hands: medium skin tone" + }, + { + "no": 1416, + "code": "1F64F 1F3FE", + "char": "🙏🏾", + "name": "folded hands: medium-dark skin tone" + }, + { + "no": 1417, + "code": "1F64F 1F3FF", + "char": "🙏🏿", + "name": "folded hands: dark skin tone" + }, + { + "no": 1418, + "code": "1F91D", + "char": "🤝", + "name": "handshake" + }, + { + "no": 1419, + "code": "1F485", + "char": "💅", + "name": "nail polish" + }, + { + "no": 1420, + "code": "1F485 1F3FB", + "char": "💅🏻", + "name": "nail polish: light skin tone" + }, + { + "no": 1421, + "code": "1F485 1F3FC", + "char": "💅🏼", + "name": "nail polish: medium-light skin tone" + }, + { + "no": 1422, + "code": "1F485 1F3FD", + "char": "💅🏽", + "name": "nail polish: medium skin tone" + }, + { + "no": 1423, + "code": "1F485 1F3FE", + "char": "💅🏾", + "name": "nail polish: medium-dark skin tone" + }, + { + "no": 1424, + "code": "1F485 1F3FF", + "char": "💅🏿", + "name": "nail polish: dark skin tone" + }, + { + "no": 1425, + "code": "1F442", + "char": "👂", + "name": "ear" + }, + { + "no": 1426, + "code": "1F442 1F3FB", + "char": "👂🏻", + "name": "ear: light skin tone" + }, + { + "no": 1427, + "code": "1F442 1F3FC", + "char": "👂🏼", + "name": "ear: medium-light skin tone" + }, + { + "no": 1428, + "code": "1F442 1F3FD", + "char": "👂🏽", + "name": "ear: medium skin tone" + }, + { + "no": 1429, + "code": "1F442 1F3FE", + "char": "👂🏾", + "name": "ear: medium-dark skin tone" + }, + { + "no": 1430, + "code": "1F442 1F3FF", + "char": "👂🏿", + "name": "ear: dark skin tone" + }, + { + "no": 1431, + "code": "1F443", + "char": "👃", + "name": "nose" + }, + { + "no": 1432, + "code": "1F443 1F3FB", + "char": "👃🏻", + "name": "nose: light skin tone" + }, + { + "no": 1433, + "code": "1F443 1F3FC", + "char": "👃🏼", + "name": "nose: medium-light skin tone" + }, + { + "no": 1434, + "code": "1F443 1F3FD", + "char": "👃🏽", + "name": "nose: medium skin tone" + }, + { + "no": 1435, + "code": "1F443 1F3FE", + "char": "👃🏾", + "name": "nose: medium-dark skin tone" + }, + { + "no": 1436, + "code": "1F443 1F3FF", + "char": "👃🏿", + "name": "nose: dark skin tone" + }, + { + "no": 1437, + "code": "1F463", + "char": "👣", + "name": "footprints" + }, + { + "no": 1438, + "code": "1F440", + "char": "👀", + "name": "eyes" + }, + { + "no": 1439, + "code": "1F441", + "char": "👁", + "name": "eye" + }, + { + "no": 1440, + "code": "1F441 FE0F 200D 1F5E8 FE0F", + "char": "👁️‍🗨️", + "name": "eye in speech bubble" + }, + { + "no": 1441, + "code": "1F9E0", + "char": "🧠", + "name": "⊛ brain" + }, + { + "no": 1442, + "code": "1F445", + "char": "👅", + "name": "tongue" + }, + { + "no": 1443, + "code": "1F444", + "char": "👄", + "name": "mouth" + }, + { + "no": 1444, + "code": "1F48B", + "char": "💋", + "name": "kiss mark" + }, + { + "no": 1445, + "code": "1F498", + "char": "💘", + "name": "heart with arrow" + }, + { + "no": 1446, + "code": "2764", + "char": "❤", + "name": "red heart" + }, + { + "no": 1447, + "code": "1F493", + "char": "💓", + "name": "beating heart" + }, + { + "no": 1448, + "code": "1F494", + "char": "💔", + "name": "broken heart" + }, + { + "no": 1449, + "code": "1F495", + "char": "💕", + "name": "two hearts" + }, + { + "no": 1450, + "code": "1F496", + "char": "💖", + "name": "sparkling heart" + }, + { + "no": 1451, + "code": "1F497", + "char": "💗", + "name": "growing heart" + }, + { + "no": 1452, + "code": "1F499", + "char": "💙", + "name": "blue heart" + }, + { + "no": 1453, + "code": "1F49A", + "char": "💚", + "name": "green heart" + }, + { + "no": 1454, + "code": "1F49B", + "char": "💛", + "name": "yellow heart" + }, + { + "no": 1455, + "code": "1F9E1", + "char": "🧡", + "name": "⊛ orange heart" + }, + { + "no": 1456, + "code": "1F49C", + "char": "💜", + "name": "purple heart" + }, + { + "no": 1457, + "code": "1F5A4", + "char": "🖤", + "name": "black heart" + }, + { + "no": 1458, + "code": "1F49D", + "char": "💝", + "name": "heart with ribbon" + }, + { + "no": 1459, + "code": "1F49E", + "char": "💞", + "name": "revolving hearts" + }, + { + "no": 1460, + "code": "1F49F", + "char": "💟", + "name": "heart decoration" + }, + { + "no": 1461, + "code": "2763", + "char": "❣", + "name": "heavy heart exclamation" + }, + { + "no": 1462, + "code": "1F48C", + "char": "💌", + "name": "love letter" + }, + { + "no": 1463, + "code": "1F4A4", + "char": "💤", + "name": "zzz" + }, + { + "no": 1464, + "code": "1F4A2", + "char": "💢", + "name": "anger symbol" + }, + { + "no": 1465, + "code": "1F4A3", + "char": "💣", + "name": "bomb" + }, + { + "no": 1466, + "code": "1F4A5", + "char": "💥", + "name": "collision" + }, + { + "no": 1467, + "code": "1F4A6", + "char": "💦", + "name": "sweat droplets" + }, + { + "no": 1468, + "code": "1F4A8", + "char": "💨", + "name": "dashing away" + }, + { + "no": 1469, + "code": "1F4AB", + "char": "💫", + "name": "dizzy" + }, + { + "no": 1470, + "code": "1F4AC", + "char": "💬", + "name": "speech balloon" + }, + { + "no": 1471, + "code": "1F5E8", + "char": "🗨", + "name": "left speech bubble" + }, + { + "no": 1472, + "code": "1F5EF", + "char": "🗯", + "name": "right anger bubble" + }, + { + "no": 1473, + "code": "1F4AD", + "char": "💭", + "name": "thought balloon" + }, + { + "no": 1474, + "code": "1F573", + "char": "🕳", + "name": "hole" + }, + { + "no": 1475, + "code": "1F453", + "char": "👓", + "name": "glasses" + }, + { + "no": 1476, + "code": "1F576", + "char": "🕶", + "name": "sunglasses" + }, + { + "no": 1477, + "code": "1F454", + "char": "👔", + "name": "necktie" + }, + { + "no": 1478, + "code": "1F455", + "char": "👕", + "name": "t-shirt" + }, + { + "no": 1479, + "code": "1F456", + "char": "👖", + "name": "jeans" + }, + { + "no": 1480, + "code": "1F9E3", + "char": "🧣", + "name": "⊛ scarf" + }, + { + "no": 1481, + "code": "1F9E4", + "char": "🧤", + "name": "⊛ gloves" + }, + { + "no": 1482, + "code": "1F9E5", + "char": "🧥", + "name": "⊛ coat" + }, + { + "no": 1483, + "code": "1F9E6", + "char": "🧦", + "name": "⊛ socks" + }, + { + "no": 1484, + "code": "1F457", + "char": "👗", + "name": "dress" + }, + { + "no": 1485, + "code": "1F458", + "char": "👘", + "name": "kimono" + }, + { + "no": 1486, + "code": "1F459", + "char": "👙", + "name": "bikini" + }, + { + "no": 1487, + "code": "1F45A", + "char": "👚", + "name": "woman’s clothes" + }, + { + "no": 1488, + "code": "1F45B", + "char": "👛", + "name": "purse" + }, + { + "no": 1489, + "code": "1F45C", + "char": "👜", + "name": "handbag" + }, + { + "no": 1490, + "code": "1F45D", + "char": "👝", + "name": "clutch bag" + }, + { + "no": 1491, + "code": "1F6CD", + "char": "🛍", + "name": "shopping bags" + }, + { + "no": 1492, + "code": "1F392", + "char": "🎒", + "name": "school backpack" + }, + { + "no": 1493, + "code": "1F45E", + "char": "👞", + "name": "man’s shoe" + }, + { + "no": 1494, + "code": "1F45F", + "char": "👟", + "name": "running shoe" + }, + { + "no": 1495, + "code": "1F460", + "char": "👠", + "name": "high-heeled shoe" + }, + { + "no": 1496, + "code": "1F461", + "char": "👡", + "name": "woman’s sandal" + }, + { + "no": 1497, + "code": "1F462", + "char": "👢", + "name": "woman’s boot" + }, + { + "no": 1498, + "code": "1F451", + "char": "👑", + "name": "crown" + }, + { + "no": 1499, + "code": "1F452", + "char": "👒", + "name": "woman’s hat" + }, + { + "no": 1500, + "code": "1F3A9", + "char": "🎩", + "name": "top hat" + }, + { + "no": 1501, + "code": "1F393", + "char": "🎓", + "name": "graduation cap" + }, + { + "no": 1502, + "code": "1F9E2", + "char": "🧢", + "name": "⊛ billed cap" + }, + { + "no": 1503, + "code": "26D1", + "char": "⛑", + "name": "rescue worker’s helmet" + }, + { + "no": 1504, + "code": "1F4FF", + "char": "📿", + "name": "prayer beads" + }, + { + "no": 1505, + "code": "1F484", + "char": "💄", + "name": "lipstick" + }, + { + "no": 1506, + "code": "1F48D", + "char": "💍", + "name": "ring" + }, + { + "no": 1507, + "code": "1F48E", + "char": "💎", + "name": "gem stone" + }, + { + "no": 1508, + "code": "1F435", + "char": "🐵", + "name": "monkey face" + }, + { + "no": 1509, + "code": "1F412", + "char": "🐒", + "name": "monkey" + }, + { + "no": 1510, + "code": "1F98D", + "char": "🦍", + "name": "gorilla" + }, + { + "no": 1511, + "code": "1F436", + "char": "🐶", + "name": "dog face" + }, + { + "no": 1512, + "code": "1F415", + "char": "🐕", + "name": "dog" + }, + { + "no": 1513, + "code": "1F429", + "char": "🐩", + "name": "poodle" + }, + { + "no": 1514, + "code": "1F43A", + "char": "🐺", + "name": "wolf face" + }, + { + "no": 1515, + "code": "1F98A", + "char": "🦊", + "name": "fox face" + }, + { + "no": 1516, + "code": "1F431", + "char": "🐱", + "name": "cat face" + }, + { + "no": 1517, + "code": "1F408", + "char": "🐈", + "name": "cat" + }, + { + "no": 1518, + "code": "1F981", + "char": "🦁", + "name": "lion face" + }, + { + "no": 1519, + "code": "1F42F", + "char": "🐯", + "name": "tiger face" + }, + { + "no": 1520, + "code": "1F405", + "char": "🐅", + "name": "tiger" + }, + { + "no": 1521, + "code": "1F406", + "char": "🐆", + "name": "leopard" + }, + { + "no": 1522, + "code": "1F434", + "char": "🐴", + "name": "horse face" + }, + { + "no": 1523, + "code": "1F40E", + "char": "🐎", + "name": "horse" + }, + { + "no": 1524, + "code": "1F984", + "char": "🦄", + "name": "unicorn face" + }, + { + "no": 1525, + "code": "1F993", + "char": "🦓", + "name": "⊛ zebra" + }, + { + "no": 1526, + "code": "1F98C", + "char": "🦌", + "name": "deer" + }, + { + "no": 1527, + "code": "1F42E", + "char": "🐮", + "name": "cow face" + }, + { + "no": 1528, + "code": "1F402", + "char": "🐂", + "name": "ox" + }, + { + "no": 1529, + "code": "1F403", + "char": "🐃", + "name": "water buffalo" + }, + { + "no": 1530, + "code": "1F404", + "char": "🐄", + "name": "cow" + }, + { + "no": 1531, + "code": "1F437", + "char": "🐷", + "name": "pig face" + }, + { + "no": 1532, + "code": "1F416", + "char": "🐖", + "name": "pig" + }, + { + "no": 1533, + "code": "1F417", + "char": "🐗", + "name": "boar" + }, + { + "no": 1534, + "code": "1F43D", + "char": "🐽", + "name": "pig nose" + }, + { + "no": 1535, + "code": "1F40F", + "char": "🐏", + "name": "ram" + }, + { + "no": 1536, + "code": "1F411", + "char": "🐑", + "name": "ewe" + }, + { + "no": 1537, + "code": "1F410", + "char": "🐐", + "name": "goat" + }, + { + "no": 1538, + "code": "1F42A", + "char": "🐪", + "name": "camel" + }, + { + "no": 1539, + "code": "1F42B", + "char": "🐫", + "name": "two-hump camel" + }, + { + "no": 1540, + "code": "1F992", + "char": "🦒", + "name": "⊛ giraffe" + }, + { + "no": 1541, + "code": "1F418", + "char": "🐘", + "name": "elephant" + }, + { + "no": 1542, + "code": "1F98F", + "char": "🦏", + "name": "rhinoceros" + }, + { + "no": 1543, + "code": "1F42D", + "char": "🐭", + "name": "mouse face" + }, + { + "no": 1544, + "code": "1F401", + "char": "🐁", + "name": "mouse" + }, + { + "no": 1545, + "code": "1F400", + "char": "🐀", + "name": "rat" + }, + { + "no": 1546, + "code": "1F439", + "char": "🐹", + "name": "hamster face" + }, + { + "no": 1547, + "code": "1F430", + "char": "🐰", + "name": "rabbit face" + }, + { + "no": 1548, + "code": "1F407", + "char": "🐇", + "name": "rabbit" + }, + { + "no": 1549, + "code": "1F43F", + "char": "🐿", + "name": "chipmunk" + }, + { + "no": 1550, + "code": "1F994", + "char": "🦔", + "name": "⊛ hedgehog" + }, + { + "no": 1551, + "code": "1F987", + "char": "🦇", + "name": "bat" + }, + { + "no": 1552, + "code": "1F43B", + "char": "🐻", + "name": "bear face" + }, + { + "no": 1553, + "code": "1F428", + "char": "🐨", + "name": "koala" + }, + { + "no": 1554, + "code": "1F43C", + "char": "🐼", + "name": "panda face" + }, + { + "no": 1555, + "code": "1F43E", + "char": "🐾", + "name": "paw prints" + }, + { + "no": 1556, + "code": "1F983", + "char": "🦃", + "name": "turkey" + }, + { + "no": 1557, + "code": "1F414", + "char": "🐔", + "name": "chicken" + }, + { + "no": 1558, + "code": "1F413", + "char": "🐓", + "name": "rooster" + }, + { + "no": 1559, + "code": "1F423", + "char": "🐣", + "name": "hatching chick" + }, + { + "no": 1560, + "code": "1F424", + "char": "🐤", + "name": "baby chick" + }, + { + "no": 1561, + "code": "1F425", + "char": "🐥", + "name": "front-facing baby chick" + }, + { + "no": 1562, + "code": "1F426", + "char": "🐦", + "name": "bird" + }, + { + "no": 1563, + "code": "1F427", + "char": "🐧", + "name": "penguin" + }, + { + "no": 1564, + "code": "1F54A", + "char": "🕊", + "name": "dove" + }, + { + "no": 1565, + "code": "1F985", + "char": "🦅", + "name": "eagle" + }, + { + "no": 1566, + "code": "1F986", + "char": "🦆", + "name": "duck" + }, + { + "no": 1567, + "code": "1F989", + "char": "🦉", + "name": "owl" + }, + { + "no": 1568, + "code": "1F438", + "char": "🐸", + "name": "frog face" + }, + { + "no": 1569, + "code": "1F40A", + "char": "🐊", + "name": "crocodile" + }, + { + "no": 1570, + "code": "1F422", + "char": "🐢", + "name": "turtle" + }, + { + "no": 1571, + "code": "1F98E", + "char": "🦎", + "name": "lizard" + }, + { + "no": 1572, + "code": "1F40D", + "char": "🐍", + "name": "snake" + }, + { + "no": 1573, + "code": "1F432", + "char": "🐲", + "name": "dragon face" + }, + { + "no": 1574, + "code": "1F409", + "char": "🐉", + "name": "dragon" + }, + { + "no": 1575, + "code": "1F995", + "char": "🦕", + "name": "⊛ sauropod" + }, + { + "no": 1576, + "code": "1F996", + "char": "🦖", + "name": "⊛ T-Rex" + }, + { + "no": 1577, + "code": "1F433", + "char": "🐳", + "name": "spouting whale" + }, + { + "no": 1578, + "code": "1F40B", + "char": "🐋", + "name": "whale" + }, + { + "no": 1579, + "code": "1F42C", + "char": "🐬", + "name": "dolphin" + }, + { + "no": 1580, + "code": "1F41F", + "char": "🐟", + "name": "fish" + }, + { + "no": 1581, + "code": "1F420", + "char": "🐠", + "name": "tropical fish" + }, + { + "no": 1582, + "code": "1F421", + "char": "🐡", + "name": "blowfish" + }, + { + "no": 1583, + "code": "1F988", + "char": "🦈", + "name": "shark" + }, + { + "no": 1584, + "code": "1F419", + "char": "🐙", + "name": "octopus" + }, + { + "no": 1585, + "code": "1F41A", + "char": "🐚", + "name": "spiral shell" + }, + { + "no": 1586, + "code": "1F980", + "char": "🦀", + "name": "crab" + }, + { + "no": 1587, + "code": "1F990", + "char": "🦐", + "name": "shrimp" + }, + { + "no": 1588, + "code": "1F991", + "char": "🦑", + "name": "squid" + }, + { + "no": 1589, + "code": "1F40C", + "char": "🐌", + "name": "snail" + }, + { + "no": 1590, + "code": "1F98B", + "char": "🦋", + "name": "butterfly" + }, + { + "no": 1591, + "code": "1F41B", + "char": "🐛", + "name": "bug" + }, + { + "no": 1592, + "code": "1F41C", + "char": "🐜", + "name": "ant" + }, + { + "no": 1593, + "code": "1F41D", + "char": "🐝", + "name": "honeybee" + }, + { + "no": 1594, + "code": "1F41E", + "char": "🐞", + "name": "lady beetle" + }, + { + "no": 1595, + "code": "1F997", + "char": "🦗", + "name": "⊛ cricket" + }, + { + "no": 1596, + "code": "1F577", + "char": "🕷", + "name": "spider" + }, + { + "no": 1597, + "code": "1F578", + "char": "🕸", + "name": "spider web" + }, + { + "no": 1598, + "code": "1F982", + "char": "🦂", + "name": "scorpion" + }, + { + "no": 1599, + "code": "1F490", + "char": "💐", + "name": "bouquet" + }, + { + "no": 1600, + "code": "1F338", + "char": "🌸", + "name": "cherry blossom" + }, + { + "no": 1601, + "code": "1F4AE", + "char": "💮", + "name": "white flower" + }, + { + "no": 1602, + "code": "1F3F5", + "char": "🏵", + "name": "rosette" + }, + { + "no": 1603, + "code": "1F339", + "char": "🌹", + "name": "rose" + }, + { + "no": 1604, + "code": "1F940", + "char": "🥀", + "name": "wilted flower" + }, + { + "no": 1605, + "code": "1F33A", + "char": "🌺", + "name": "hibiscus" + }, + { + "no": 1606, + "code": "1F33B", + "char": "🌻", + "name": "sunflower" + }, + { + "no": 1607, + "code": "1F33C", + "char": "🌼", + "name": "blossom" + }, + { + "no": 1608, + "code": "1F337", + "char": "🌷", + "name": "tulip" + }, + { + "no": 1609, + "code": "1F331", + "char": "🌱", + "name": "seedling" + }, + { + "no": 1610, + "code": "1F332", + "char": "🌲", + "name": "evergreen tree" + }, + { + "no": 1611, + "code": "1F333", + "char": "🌳", + "name": "deciduous tree" + }, + { + "no": 1612, + "code": "1F334", + "char": "🌴", + "name": "palm tree" + }, + { + "no": 1613, + "code": "1F335", + "char": "🌵", + "name": "cactus" + }, + { + "no": 1614, + "code": "1F33E", + "char": "🌾", + "name": "sheaf of rice" + }, + { + "no": 1615, + "code": "1F33F", + "char": "🌿", + "name": "herb" + }, + { + "no": 1616, + "code": "2618", + "char": "☘", + "name": "shamrock" + }, + { + "no": 1617, + "code": "1F340", + "char": "🍀", + "name": "four leaf clover" + }, + { + "no": 1618, + "code": "1F341", + "char": "🍁", + "name": "maple leaf" + }, + { + "no": 1619, + "code": "1F342", + "char": "🍂", + "name": "fallen leaf" + }, + { + "no": 1620, + "code": "1F343", + "char": "🍃", + "name": "leaf fluttering in wind" + }, + { + "no": 1621, + "code": "1F347", + "char": "🍇", + "name": "grapes" + }, + { + "no": 1622, + "code": "1F348", + "char": "🍈", + "name": "melon" + }, + { + "no": 1623, + "code": "1F349", + "char": "🍉", + "name": "watermelon" + }, + { + "no": 1624, + "code": "1F34A", + "char": "🍊", + "name": "tangerine" + }, + { + "no": 1625, + "code": "1F34B", + "char": "🍋", + "name": "lemon" + }, + { + "no": 1626, + "code": "1F34C", + "char": "🍌", + "name": "banana" + }, + { + "no": 1627, + "code": "1F34D", + "char": "🍍", + "name": "pineapple" + }, + { + "no": 1628, + "code": "1F34E", + "char": "🍎", + "name": "red apple" + }, + { + "no": 1629, + "code": "1F34F", + "char": "🍏", + "name": "green apple" + }, + { + "no": 1630, + "code": "1F350", + "char": "🍐", + "name": "pear" + }, + { + "no": 1631, + "code": "1F351", + "char": "🍑", + "name": "peach" + }, + { + "no": 1632, + "code": "1F352", + "char": "🍒", + "name": "cherries" + }, + { + "no": 1633, + "code": "1F353", + "char": "🍓", + "name": "strawberry" + }, + { + "no": 1634, + "code": "1F95D", + "char": "🥝", + "name": "kiwi fruit" + }, + { + "no": 1635, + "code": "1F345", + "char": "🍅", + "name": "tomato" + }, + { + "no": 1636, + "code": "1F965", + "char": "🥥", + "name": "⊛ coconut" + }, + { + "no": 1637, + "code": "1F951", + "char": "🥑", + "name": "avocado" + }, + { + "no": 1638, + "code": "1F346", + "char": "🍆", + "name": "eggplant" + }, + { + "no": 1639, + "code": "1F954", + "char": "🥔", + "name": "potato" + }, + { + "no": 1640, + "code": "1F955", + "char": "🥕", + "name": "carrot" + }, + { + "no": 1641, + "code": "1F33D", + "char": "🌽", + "name": "ear of corn" + }, + { + "no": 1642, + "code": "1F336", + "char": "🌶", + "name": "hot pepper" + }, + { + "no": 1643, + "code": "1F952", + "char": "🥒", + "name": "cucumber" + }, + { + "no": 1644, + "code": "1F966", + "char": "🥦", + "name": "⊛ broccoli" + }, + { + "no": 1645, + "code": "1F344", + "char": "🍄", + "name": "mushroom" + }, + { + "no": 1646, + "code": "1F95C", + "char": "🥜", + "name": "peanuts" + }, + { + "no": 1647, + "code": "1F330", + "char": "🌰", + "name": "chestnut" + }, + { + "no": 1648, + "code": "1F35E", + "char": "🍞", + "name": "bread" + }, + { + "no": 1649, + "code": "1F950", + "char": "🥐", + "name": "croissant" + }, + { + "no": 1650, + "code": "1F956", + "char": "🥖", + "name": "baguette bread" + }, + { + "no": 1651, + "code": "1F968", + "char": "🥨", + "name": "⊛ pretzel" + }, + { + "no": 1652, + "code": "1F95E", + "char": "🥞", + "name": "pancakes" + }, + { + "no": 1653, + "code": "1F9C0", + "char": "🧀", + "name": "cheese wedge" + }, + { + "no": 1654, + "code": "1F356", + "char": "🍖", + "name": "meat on bone" + }, + { + "no": 1655, + "code": "1F357", + "char": "🍗", + "name": "poultry leg" + }, + { + "no": 1656, + "code": "1F969", + "char": "🥩", + "name": "⊛ cut of meat" + }, + { + "no": 1657, + "code": "1F953", + "char": "🥓", + "name": "bacon" + }, + { + "no": 1658, + "code": "1F354", + "char": "🍔", + "name": "hamburger" + }, + { + "no": 1659, + "code": "1F35F", + "char": "🍟", + "name": "french fries" + }, + { + "no": 1660, + "code": "1F355", + "char": "🍕", + "name": "pizza" + }, + { + "no": 1661, + "code": "1F32D", + "char": "🌭", + "name": "hot dog" + }, + { + "no": 1662, + "code": "1F96A", + "char": "🥪", + "name": "⊛ sandwich" + }, + { + "no": 1663, + "code": "1F32E", + "char": "🌮", + "name": "taco" + }, + { + "no": 1664, + "code": "1F32F", + "char": "🌯", + "name": "burrito" + }, + { + "no": 1665, + "code": "1F959", + "char": "🥙", + "name": "stuffed flatbread" + }, + { + "no": 1666, + "code": "1F95A", + "char": "🥚", + "name": "egg" + }, + { + "no": 1667, + "code": "1F373", + "char": "🍳", + "name": "cooking" + }, + { + "no": 1668, + "code": "1F958", + "char": "🥘", + "name": "shallow pan of food" + }, + { + "no": 1669, + "code": "1F372", + "char": "🍲", + "name": "pot of food" + }, + { + "no": 1670, + "code": "1F963", + "char": "🥣", + "name": "⊛ bowl with spoon" + }, + { + "no": 1671, + "code": "1F957", + "char": "🥗", + "name": "green salad" + }, + { + "no": 1672, + "code": "1F37F", + "char": "🍿", + "name": "popcorn" + }, + { + "no": 1673, + "code": "1F96B", + "char": "🥫", + "name": "⊛ canned food" + }, + { + "no": 1674, + "code": "1F371", + "char": "🍱", + "name": "bento box" + }, + { + "no": 1675, + "code": "1F358", + "char": "🍘", + "name": "rice cracker" + }, + { + "no": 1676, + "code": "1F359", + "char": "🍙", + "name": "rice ball" + }, + { + "no": 1677, + "code": "1F35A", + "char": "🍚", + "name": "cooked rice" + }, + { + "no": 1678, + "code": "1F35B", + "char": "🍛", + "name": "curry rice" + }, + { + "no": 1679, + "code": "1F35C", + "char": "🍜", + "name": "steaming bowl" + }, + { + "no": 1680, + "code": "1F35D", + "char": "🍝", + "name": "spaghetti" + }, + { + "no": 1681, + "code": "1F360", + "char": "🍠", + "name": "roasted sweet potato" + }, + { + "no": 1682, + "code": "1F362", + "char": "🍢", + "name": "oden" + }, + { + "no": 1683, + "code": "1F363", + "char": "🍣", + "name": "sushi" + }, + { + "no": 1684, + "code": "1F364", + "char": "🍤", + "name": "fried shrimp" + }, + { + "no": 1685, + "code": "1F365", + "char": "🍥", + "name": "fish cake with swirl" + }, + { + "no": 1686, + "code": "1F361", + "char": "🍡", + "name": "dango" + }, + { + "no": 1687, + "code": "1F95F", + "char": "🥟", + "name": "⊛ dumpling" + }, + { + "no": 1688, + "code": "1F960", + "char": "🥠", + "name": "⊛ fortune cookie" + }, + { + "no": 1689, + "code": "1F961", + "char": "🥡", + "name": "⊛ takeout box" + }, + { + "no": 1690, + "code": "1F366", + "char": "🍦", + "name": "soft ice cream" + }, + { + "no": 1691, + "code": "1F367", + "char": "🍧", + "name": "shaved ice" + }, + { + "no": 1692, + "code": "1F368", + "char": "🍨", + "name": "ice cream" + }, + { + "no": 1693, + "code": "1F369", + "char": "🍩", + "name": "doughnut" + }, + { + "no": 1694, + "code": "1F36A", + "char": "🍪", + "name": "cookie" + }, + { + "no": 1695, + "code": "1F382", + "char": "🎂", + "name": "birthday cake" + }, + { + "no": 1696, + "code": "1F370", + "char": "🍰", + "name": "shortcake" + }, + { + "no": 1697, + "code": "1F967", + "char": "🥧", + "name": "⊛ pie" + }, + { + "no": 1698, + "code": "1F36B", + "char": "🍫", + "name": "chocolate bar" + }, + { + "no": 1699, + "code": "1F36C", + "char": "🍬", + "name": "candy" + }, + { + "no": 1700, + "code": "1F36D", + "char": "🍭", + "name": "lollipop" + }, + { + "no": 1701, + "code": "1F36E", + "char": "🍮", + "name": "custard" + }, + { + "no": 1702, + "code": "1F36F", + "char": "🍯", + "name": "honey pot" + }, + { + "no": 1703, + "code": "1F37C", + "char": "🍼", + "name": "baby bottle" + }, + { + "no": 1704, + "code": "1F95B", + "char": "🥛", + "name": "glass of milk" + }, + { + "no": 1705, + "code": "2615", + "char": "☕", + "name": "hot beverage" + }, + { + "no": 1706, + "code": "1F375", + "char": "🍵", + "name": "teacup without handle" + }, + { + "no": 1707, + "code": "1F376", + "char": "🍶", + "name": "sake" + }, + { + "no": 1708, + "code": "1F37E", + "char": "🍾", + "name": "bottle with popping cork" + }, + { + "no": 1709, + "code": "1F377", + "char": "🍷", + "name": "wine glass" + }, + { + "no": 1710, + "code": "1F378", + "char": "🍸", + "name": "cocktail glass" + }, + { + "no": 1711, + "code": "1F379", + "char": "🍹", + "name": "tropical drink" + }, + { + "no": 1712, + "code": "1F37A", + "char": "🍺", + "name": "beer mug" + }, + { + "no": 1713, + "code": "1F37B", + "char": "🍻", + "name": "clinking beer mugs" + }, + { + "no": 1714, + "code": "1F942", + "char": "🥂", + "name": "clinking glasses" + }, + { + "no": 1715, + "code": "1F943", + "char": "🥃", + "name": "tumbler glass" + }, + { + "no": 1716, + "code": "1F964", + "char": "🥤", + "name": "⊛ cup with straw" + }, + { + "no": 1717, + "code": "1F962", + "char": "🥢", + "name": "⊛ chopsticks" + }, + { + "no": 1718, + "code": "1F37D", + "char": "🍽", + "name": "fork and knife with plate" + }, + { + "no": 1719, + "code": "1F374", + "char": "🍴", + "name": "fork and knife" + }, + { + "no": 1720, + "code": "1F944", + "char": "🥄", + "name": "spoon" + }, + { + "no": 1721, + "code": "1F52A", + "char": "🔪", + "name": "kitchen knife" + }, + { + "no": 1722, + "code": "1F3FA", + "char": "🏺", + "name": "amphora" + }, + { + "no": 1723, + "code": "1F30D", + "char": "🌍", + "name": "globe showing Europe-Africa" + }, + { + "no": 1724, + "code": "1F30E", + "char": "🌎", + "name": "globe showing Americas" + }, + { + "no": 1725, + "code": "1F30F", + "char": "🌏", + "name": "globe showing Asia-Australia" + }, + { + "no": 1726, + "code": "1F310", + "char": "🌐", + "name": "globe with meridians" + }, + { + "no": 1727, + "code": "1F5FA", + "char": "🗺", + "name": "world map" + }, + { + "no": 1728, + "code": "1F5FE", + "char": "🗾", + "name": "map of Japan" + }, + { + "no": 1729, + "code": "1F3D4", + "char": "🏔", + "name": "snow-capped mountain" + }, + { + "no": 1730, + "code": "26F0", + "char": "⛰", + "name": "mountain" + }, + { + "no": 1731, + "code": "1F30B", + "char": "🌋", + "name": "volcano" + }, + { + "no": 1732, + "code": "1F5FB", + "char": "🗻", + "name": "mount fuji" + }, + { + "no": 1733, + "code": "1F3D5", + "char": "🏕", + "name": "camping" + }, + { + "no": 1734, + "code": "1F3D6", + "char": "🏖", + "name": "beach with umbrella" + }, + { + "no": 1735, + "code": "1F3DC", + "char": "🏜", + "name": "desert" + }, + { + "no": 1736, + "code": "1F3DD", + "char": "🏝", + "name": "desert island" + }, + { + "no": 1737, + "code": "1F3DE", + "char": "🏞", + "name": "national park" + }, + { + "no": 1738, + "code": "1F3DF", + "char": "🏟", + "name": "stadium" + }, + { + "no": 1739, + "code": "1F3DB", + "char": "🏛", + "name": "classical building" + }, + { + "no": 1740, + "code": "1F3D7", + "char": "🏗", + "name": "building construction" + }, + { + "no": 1741, + "code": "1F3D8", + "char": "🏘", + "name": "houses" + }, + { + "no": 1742, + "code": "1F3D9", + "char": "🏙", + "name": "cityscape" + }, + { + "no": 1743, + "code": "1F3DA", + "char": "🏚", + "name": "derelict house" + }, + { + "no": 1744, + "code": "1F3E0", + "char": "🏠", + "name": "house" + }, + { + "no": 1745, + "code": "1F3E1", + "char": "🏡", + "name": "house with garden" + }, + { + "no": 1746, + "code": "1F3E2", + "char": "🏢", + "name": "office building" + }, + { + "no": 1747, + "code": "1F3E3", + "char": "🏣", + "name": "Japanese post office" + }, + { + "no": 1748, + "code": "1F3E4", + "char": "🏤", + "name": "post office" + }, + { + "no": 1749, + "code": "1F3E5", + "char": "🏥", + "name": "hospital" + }, + { + "no": 1750, + "code": "1F3E6", + "char": "🏦", + "name": "bank" + }, + { + "no": 1751, + "code": "1F3E8", + "char": "🏨", + "name": "hotel" + }, + { + "no": 1752, + "code": "1F3E9", + "char": "🏩", + "name": "love hotel" + }, + { + "no": 1753, + "code": "1F3EA", + "char": "🏪", + "name": "convenience store" + }, + { + "no": 1754, + "code": "1F3EB", + "char": "🏫", + "name": "school" + }, + { + "no": 1755, + "code": "1F3EC", + "char": "🏬", + "name": "department store" + }, + { + "no": 1756, + "code": "1F3ED", + "char": "🏭", + "name": "factory" + }, + { + "no": 1757, + "code": "1F3EF", + "char": "🏯", + "name": "Japanese castle" + }, + { + "no": 1758, + "code": "1F3F0", + "char": "🏰", + "name": "castle" + }, + { + "no": 1759, + "code": "1F492", + "char": "💒", + "name": "wedding" + }, + { + "no": 1760, + "code": "1F5FC", + "char": "🗼", + "name": "Tokyo tower" + }, + { + "no": 1761, + "code": "1F5FD", + "char": "🗽", + "name": "Statue of Liberty" + }, + { + "no": 1762, + "code": "26EA", + "char": "⛪", + "name": "church" + }, + { + "no": 1763, + "code": "1F54C", + "char": "🕌", + "name": "mosque" + }, + { + "no": 1764, + "code": "1F54D", + "char": "🕍", + "name": "synagogue" + }, + { + "no": 1765, + "code": "26E9", + "char": "⛩", + "name": "shinto shrine" + }, + { + "no": 1766, + "code": "1F54B", + "char": "🕋", + "name": "kaaba" + }, + { + "no": 1767, + "code": "26F2", + "char": "⛲", + "name": "fountain" + }, + { + "no": 1768, + "code": "26FA", + "char": "⛺", + "name": "tent" + }, + { + "no": 1769, + "code": "1F301", + "char": "🌁", + "name": "foggy" + }, + { + "no": 1770, + "code": "1F303", + "char": "🌃", + "name": "night with stars" + }, + { + "no": 1771, + "code": "1F304", + "char": "🌄", + "name": "sunrise over mountains" + }, + { + "no": 1772, + "code": "1F305", + "char": "🌅", + "name": "sunrise" + }, + { + "no": 1773, + "code": "1F306", + "char": "🌆", + "name": "cityscape at dusk" + }, + { + "no": 1774, + "code": "1F307", + "char": "🌇", + "name": "sunset" + }, + { + "no": 1775, + "code": "1F309", + "char": "🌉", + "name": "bridge at night" + }, + { + "no": 1776, + "code": "2668", + "char": "♨", + "name": "hot springs" + }, + { + "no": 1777, + "code": "1F30C", + "char": "🌌", + "name": "milky way" + }, + { + "no": 1778, + "code": "1F3A0", + "char": "🎠", + "name": "carousel horse" + }, + { + "no": 1779, + "code": "1F3A1", + "char": "🎡", + "name": "ferris wheel" + }, + { + "no": 1780, + "code": "1F3A2", + "char": "🎢", + "name": "roller coaster" + }, + { + "no": 1781, + "code": "1F488", + "char": "💈", + "name": "barber pole" + }, + { + "no": 1782, + "code": "1F3AA", + "char": "🎪", + "name": "circus tent" + }, + { + "no": 1783, + "code": "1F3AD", + "char": "🎭", + "name": "performing arts" + }, + { + "no": 1784, + "code": "1F5BC", + "char": "🖼", + "name": "framed picture" + }, + { + "no": 1785, + "code": "1F3A8", + "char": "🎨", + "name": "artist palette" + }, + { + "no": 1786, + "code": "1F3B0", + "char": "🎰", + "name": "slot machine" + }, + { + "no": 1787, + "code": "1F682", + "char": "🚂", + "name": "locomotive" + }, + { + "no": 1788, + "code": "1F683", + "char": "🚃", + "name": "railway car" + }, + { + "no": 1789, + "code": "1F684", + "char": "🚄", + "name": "high-speed train" + }, + { + "no": 1790, + "code": "1F685", + "char": "🚅", + "name": "bullet train" + }, + { + "no": 1791, + "code": "1F686", + "char": "🚆", + "name": "train" + }, + { + "no": 1792, + "code": "1F687", + "char": "🚇", + "name": "metro" + }, + { + "no": 1793, + "code": "1F688", + "char": "🚈", + "name": "light rail" + }, + { + "no": 1794, + "code": "1F689", + "char": "🚉", + "name": "station" + }, + { + "no": 1795, + "code": "1F68A", + "char": "🚊", + "name": "tram" + }, + { + "no": 1796, + "code": "1F69D", + "char": "🚝", + "name": "monorail" + }, + { + "no": 1797, + "code": "1F69E", + "char": "🚞", + "name": "mountain railway" + }, + { + "no": 1798, + "code": "1F68B", + "char": "🚋", + "name": "tram car" + }, + { + "no": 1799, + "code": "1F68C", + "char": "🚌", + "name": "bus" + }, + { + "no": 1800, + "code": "1F68D", + "char": "🚍", + "name": "oncoming bus" + }, + { + "no": 1801, + "code": "1F68E", + "char": "🚎", + "name": "trolleybus" + }, + { + "no": 1802, + "code": "1F690", + "char": "🚐", + "name": "minibus" + }, + { + "no": 1803, + "code": "1F691", + "char": "🚑", + "name": "ambulance" + }, + { + "no": 1804, + "code": "1F692", + "char": "🚒", + "name": "fire engine" + }, + { + "no": 1805, + "code": "1F693", + "char": "🚓", + "name": "police car" + }, + { + "no": 1806, + "code": "1F694", + "char": "🚔", + "name": "oncoming police car" + }, + { + "no": 1807, + "code": "1F695", + "char": "🚕", + "name": "taxi" + }, + { + "no": 1808, + "code": "1F696", + "char": "🚖", + "name": "oncoming taxi" + }, + { + "no": 1809, + "code": "1F697", + "char": "🚗", + "name": "automobile" + }, + { + "no": 1810, + "code": "1F698", + "char": "🚘", + "name": "oncoming automobile" + }, + { + "no": 1811, + "code": "1F699", + "char": "🚙", + "name": "sport utility vehicle" + }, + { + "no": 1812, + "code": "1F69A", + "char": "🚚", + "name": "delivery truck" + }, + { + "no": 1813, + "code": "1F69B", + "char": "🚛", + "name": "articulated lorry" + }, + { + "no": 1814, + "code": "1F69C", + "char": "🚜", + "name": "tractor" + }, + { + "no": 1815, + "code": "1F6B2", + "char": "🚲", + "name": "bicycle" + }, + { + "no": 1816, + "code": "1F6F4", + "char": "🛴", + "name": "kick scooter" + }, + { + "no": 1817, + "code": "1F6F5", + "char": "🛵", + "name": "motor scooter" + }, + { + "no": 1818, + "code": "1F68F", + "char": "🚏", + "name": "bus stop" + }, + { + "no": 1819, + "code": "1F6E3", + "char": "🛣", + "name": "motorway" + }, + { + "no": 1820, + "code": "1F6E4", + "char": "🛤", + "name": "railway track" + }, + { + "no": 1821, + "code": "26FD", + "char": "⛽", + "name": "fuel pump" + }, + { + "no": 1822, + "code": "1F6A8", + "char": "🚨", + "name": "police car light" + }, + { + "no": 1823, + "code": "1F6A5", + "char": "🚥", + "name": "horizontal traffic light" + }, + { + "no": 1824, + "code": "1F6A6", + "char": "🚦", + "name": "vertical traffic light" + }, + { + "no": 1825, + "code": "1F6A7", + "char": "🚧", + "name": "construction" + }, + { + "no": 1826, + "code": "1F6D1", + "char": "🛑", + "name": "stop sign" + }, + { + "no": 1827, + "code": "2693", + "char": "⚓", + "name": "anchor" + }, + { + "no": 1828, + "code": "26F5", + "char": "⛵", + "name": "sailboat" + }, + { + "no": 1829, + "code": "1F6F6", + "char": "🛶", + "name": "canoe" + }, + { + "no": 1830, + "code": "1F6A4", + "char": "🚤", + "name": "speedboat" + }, + { + "no": 1831, + "code": "1F6F3", + "char": "🛳", + "name": "passenger ship" + }, + { + "no": 1832, + "code": "26F4", + "char": "⛴", + "name": "ferry" + }, + { + "no": 1833, + "code": "1F6E5", + "char": "🛥", + "name": "motor boat" + }, + { + "no": 1834, + "code": "1F6A2", + "char": "🚢", + "name": "ship" + }, + { + "no": 1835, + "code": "2708", + "char": "✈", + "name": "airplane" + }, + { + "no": 1836, + "code": "1F6E9", + "char": "🛩", + "name": "small airplane" + }, + { + "no": 1837, + "code": "1F6EB", + "char": "🛫", + "name": "airplane departure" + }, + { + "no": 1838, + "code": "1F6EC", + "char": "🛬", + "name": "airplane arrival" + }, + { + "no": 1839, + "code": "1F4BA", + "char": "💺", + "name": "seat" + }, + { + "no": 1840, + "code": "1F681", + "char": "🚁", + "name": "helicopter" + }, + { + "no": 1841, + "code": "1F69F", + "char": "🚟", + "name": "suspension railway" + }, + { + "no": 1842, + "code": "1F6A0", + "char": "🚠", + "name": "mountain cableway" + }, + { + "no": 1843, + "code": "1F6A1", + "char": "🚡", + "name": "aerial tramway" + }, + { + "no": 1844, + "code": "1F6F0", + "char": "🛰", + "name": "satellite" + }, + { + "no": 1845, + "code": "1F680", + "char": "🚀", + "name": "rocket" + }, + { + "no": 1846, + "code": "1F6F8", + "char": "🛸", + "name": "⊛ flying saucer" + }, + { + "no": 1847, + "code": "1F6CE", + "char": "🛎", + "name": "bellhop bell" + }, + { + "no": 1848, + "code": "1F6AA", + "char": "🚪", + "name": "door" + }, + { + "no": 1849, + "code": "1F6CF", + "char": "🛏", + "name": "bed" + }, + { + "no": 1850, + "code": "1F6CB", + "char": "🛋", + "name": "couch and lamp" + }, + { + "no": 1851, + "code": "1F6BD", + "char": "🚽", + "name": "toilet" + }, + { + "no": 1852, + "code": "1F6BF", + "char": "🚿", + "name": "shower" + }, + { + "no": 1853, + "code": "1F6C1", + "char": "🛁", + "name": "bathtub" + }, + { + "no": 1854, + "code": "231B", + "char": "⌛", + "name": "hourglass done" + }, + { + "no": 1855, + "code": "23F3", + "char": "⏳", + "name": "hourglass not done" + }, + { + "no": 1856, + "code": "231A", + "char": "⌚", + "name": "watch" + }, + { + "no": 1857, + "code": "23F0", + "char": "⏰", + "name": "alarm clock" + }, + { + "no": 1858, + "code": "23F1", + "char": "⏱", + "name": "stopwatch" + }, + { + "no": 1859, + "code": "23F2", + "char": "⏲", + "name": "timer clock" + }, + { + "no": 1860, + "code": "1F570", + "char": "🕰", + "name": "mantelpiece clock" + }, + { + "no": 1861, + "code": "1F55B", + "char": "🕛", + "name": "twelve o’clock" + }, + { + "no": 1862, + "code": "1F567", + "char": "🕧", + "name": "twelve-thirty" + }, + { + "no": 1863, + "code": "1F550", + "char": "🕐", + "name": "one o’clock" + }, + { + "no": 1864, + "code": "1F55C", + "char": "🕜", + "name": "one-thirty" + }, + { + "no": 1865, + "code": "1F551", + "char": "🕑", + "name": "two o’clock" + }, + { + "no": 1866, + "code": "1F55D", + "char": "🕝", + "name": "two-thirty" + }, + { + "no": 1867, + "code": "1F552", + "char": "🕒", + "name": "three o’clock" + }, + { + "no": 1868, + "code": "1F55E", + "char": "🕞", + "name": "three-thirty" + }, + { + "no": 1869, + "code": "1F553", + "char": "🕓", + "name": "four o’clock" + }, + { + "no": 1870, + "code": "1F55F", + "char": "🕟", + "name": "four-thirty" + }, + { + "no": 1871, + "code": "1F554", + "char": "🕔", + "name": "five o’clock" + }, + { + "no": 1872, + "code": "1F560", + "char": "🕠", + "name": "five-thirty" + }, + { + "no": 1873, + "code": "1F555", + "char": "🕕", + "name": "six o’clock" + }, + { + "no": 1874, + "code": "1F561", + "char": "🕡", + "name": "six-thirty" + }, + { + "no": 1875, + "code": "1F556", + "char": "🕖", + "name": "seven o’clock" + }, + { + "no": 1876, + "code": "1F562", + "char": "🕢", + "name": "seven-thirty" + }, + { + "no": 1877, + "code": "1F557", + "char": "🕗", + "name": "eight o’clock" + }, + { + "no": 1878, + "code": "1F563", + "char": "🕣", + "name": "eight-thirty" + }, + { + "no": 1879, + "code": "1F558", + "char": "🕘", + "name": "nine o’clock" + }, + { + "no": 1880, + "code": "1F564", + "char": "🕤", + "name": "nine-thirty" + }, + { + "no": 1881, + "code": "1F559", + "char": "🕙", + "name": "ten o’clock" + }, + { + "no": 1882, + "code": "1F565", + "char": "🕥", + "name": "ten-thirty" + }, + { + "no": 1883, + "code": "1F55A", + "char": "🕚", + "name": "eleven o’clock" + }, + { + "no": 1884, + "code": "1F566", + "char": "🕦", + "name": "eleven-thirty" + }, + { + "no": 1885, + "code": "1F311", + "char": "🌑", + "name": "new moon" + }, + { + "no": 1886, + "code": "1F312", + "char": "🌒", + "name": "waxing crescent moon" + }, + { + "no": 1887, + "code": "1F313", + "char": "🌓", + "name": "first quarter moon" + }, + { + "no": 1888, + "code": "1F314", + "char": "🌔", + "name": "waxing gibbous moon" + }, + { + "no": 1889, + "code": "1F315", + "char": "🌕", + "name": "full moon" + }, + { + "no": 1890, + "code": "1F316", + "char": "🌖", + "name": "waning gibbous moon" + }, + { + "no": 1891, + "code": "1F317", + "char": "🌗", + "name": "last quarter moon" + }, + { + "no": 1892, + "code": "1F318", + "char": "🌘", + "name": "waning crescent moon" + }, + { + "no": 1893, + "code": "1F319", + "char": "🌙", + "name": "crescent moon" + }, + { + "no": 1894, + "code": "1F31A", + "char": "🌚", + "name": "new moon face" + }, + { + "no": 1895, + "code": "1F31B", + "char": "🌛", + "name": "first quarter moon face" + }, + { + "no": 1896, + "code": "1F31C", + "char": "🌜", + "name": "last quarter moon face" + }, + { + "no": 1897, + "code": "1F321", + "char": "🌡", + "name": "thermometer" + }, + { + "no": 1898, + "code": "2600", + "char": "☀", + "name": "sun" + }, + { + "no": 1899, + "code": "1F31D", + "char": "🌝", + "name": "full moon face" + }, + { + "no": 1900, + "code": "1F31E", + "char": "🌞", + "name": "sun with face" + }, + { + "no": 1901, + "code": "2B50", + "char": "⭐", + "name": "white medium star" + }, + { + "no": 1902, + "code": "1F31F", + "char": "🌟", + "name": "glowing star" + }, + { + "no": 1903, + "code": "1F320", + "char": "🌠", + "name": "shooting star" + }, + { + "no": 1904, + "code": "2601", + "char": "☁", + "name": "cloud" + }, + { + "no": 1905, + "code": "26C5", + "char": "⛅", + "name": "sun behind cloud" + }, + { + "no": 1906, + "code": "26C8", + "char": "⛈", + "name": "cloud with lightning and rain" + }, + { + "no": 1907, + "code": "1F324", + "char": "🌤", + "name": "sun behind small cloud" + }, + { + "no": 1908, + "code": "1F325", + "char": "🌥", + "name": "sun behind large cloud" + }, + { + "no": 1909, + "code": "1F326", + "char": "🌦", + "name": "sun behind rain cloud" + }, + { + "no": 1910, + "code": "1F327", + "char": "🌧", + "name": "cloud with rain" + }, + { + "no": 1911, + "code": "1F328", + "char": "🌨", + "name": "cloud with snow" + }, + { + "no": 1912, + "code": "1F329", + "char": "🌩", + "name": "cloud with lightning" + }, + { + "no": 1913, + "code": "1F32A", + "char": "🌪", + "name": "tornado" + }, + { + "no": 1914, + "code": "1F32B", + "char": "🌫", + "name": "fog" + }, + { + "no": 1915, + "code": "1F32C", + "char": "🌬", + "name": "wind face" + }, + { + "no": 1916, + "code": "1F300", + "char": "🌀", + "name": "cyclone" + }, + { + "no": 1917, + "code": "1F308", + "char": "🌈", + "name": "rainbow" + }, + { + "no": 1918, + "code": "1F302", + "char": "🌂", + "name": "closed umbrella" + }, + { + "no": 1919, + "code": "2602", + "char": "☂", + "name": "umbrella" + }, + { + "no": 1920, + "code": "2614", + "char": "☔", + "name": "umbrella with rain drops" + }, + { + "no": 1921, + "code": "26F1", + "char": "⛱", + "name": "umbrella on ground" + }, + { + "no": 1922, + "code": "26A1", + "char": "⚡", + "name": "high voltage" + }, + { + "no": 1923, + "code": "2744", + "char": "❄", + "name": "snowflake" + }, + { + "no": 1924, + "code": "2603", + "char": "☃", + "name": "snowman" + }, + { + "no": 1925, + "code": "26C4", + "char": "⛄", + "name": "snowman without snow" + }, + { + "no": 1926, + "code": "2604", + "char": "☄", + "name": "comet" + }, + { + "no": 1927, + "code": "1F525", + "char": "🔥", + "name": "fire" + }, + { + "no": 1928, + "code": "1F4A7", + "char": "💧", + "name": "droplet" + }, + { + "no": 1929, + "code": "1F30A", + "char": "🌊", + "name": "water wave" + }, + { + "no": 1930, + "code": "1F383", + "char": "🎃", + "name": "jack-o-lantern" + }, + { + "no": 1931, + "code": "1F384", + "char": "🎄", + "name": "Christmas tree" + }, + { + "no": 1932, + "code": "1F386", + "char": "🎆", + "name": "fireworks" + }, + { + "no": 1933, + "code": "1F387", + "char": "🎇", + "name": "sparkler" + }, + { + "no": 1934, + "code": "2728", + "char": "✨", + "name": "sparkles" + }, + { + "no": 1935, + "code": "1F388", + "char": "🎈", + "name": "balloon" + }, + { + "no": 1936, + "code": "1F389", + "char": "🎉", + "name": "party popper" + }, + { + "no": 1937, + "code": "1F38A", + "char": "🎊", + "name": "confetti ball" + }, + { + "no": 1938, + "code": "1F38B", + "char": "🎋", + "name": "tanabata tree" + }, + { + "no": 1939, + "code": "1F38D", + "char": "🎍", + "name": "pine decoration" + }, + { + "no": 1940, + "code": "1F38E", + "char": "🎎", + "name": "Japanese dolls" + }, + { + "no": 1941, + "code": "1F38F", + "char": "🎏", + "name": "carp streamer" + }, + { + "no": 1942, + "code": "1F390", + "char": "🎐", + "name": "wind chime" + }, + { + "no": 1943, + "code": "1F391", + "char": "🎑", + "name": "moon viewing ceremony" + }, + { + "no": 1944, + "code": "1F380", + "char": "🎀", + "name": "ribbon" + }, + { + "no": 1945, + "code": "1F381", + "char": "🎁", + "name": "wrapped gift" + }, + { + "no": 1946, + "code": "1F397", + "char": "🎗", + "name": "reminder ribbon" + }, + { + "no": 1947, + "code": "1F39F", + "char": "🎟", + "name": "admission tickets" + }, + { + "no": 1948, + "code": "1F3AB", + "char": "🎫", + "name": "ticket" + }, + { + "no": 1949, + "code": "1F396", + "char": "🎖", + "name": "military medal" + }, + { + "no": 1950, + "code": "1F3C6", + "char": "🏆", + "name": "trophy" + }, + { + "no": 1951, + "code": "1F3C5", + "char": "🏅", + "name": "sports medal" + }, + { + "no": 1952, + "code": "1F947", + "char": "🥇", + "name": "1st place medal" + }, + { + "no": 1953, + "code": "1F948", + "char": "🥈", + "name": "2nd place medal" + }, + { + "no": 1954, + "code": "1F949", + "char": "🥉", + "name": "3rd place medal" + }, + { + "no": 1955, + "code": "26BD", + "char": "⚽", + "name": "soccer ball" + }, + { + "no": 1956, + "code": "26BE", + "char": "⚾", + "name": "baseball" + }, + { + "no": 1957, + "code": "1F3C0", + "char": "🏀", + "name": "basketball" + }, + { + "no": 1958, + "code": "1F3D0", + "char": "🏐", + "name": "volleyball" + }, + { + "no": 1959, + "code": "1F3C8", + "char": "🏈", + "name": "american football" + }, + { + "no": 1960, + "code": "1F3C9", + "char": "🏉", + "name": "rugby football" + }, + { + "no": 1961, + "code": "1F3BE", + "char": "🎾", + "name": "tennis" + }, + { + "no": 1962, + "code": "1F3B1", + "char": "🎱", + "name": "pool 8 ball" + }, + { + "no": 1963, + "code": "1F3B3", + "char": "🎳", + "name": "bowling" + }, + { + "no": 1964, + "code": "1F3CF", + "char": "🏏", + "name": "cricket game" + }, + { + "no": 1965, + "code": "1F3D1", + "char": "🏑", + "name": "field hockey" + }, + { + "no": 1966, + "code": "1F3D2", + "char": "🏒", + "name": "ice hockey" + }, + { + "no": 1967, + "code": "1F3D3", + "char": "🏓", + "name": "ping pong" + }, + { + "no": 1968, + "code": "1F3F8", + "char": "🏸", + "name": "badminton" + }, + { + "no": 1969, + "code": "1F94A", + "char": "🥊", + "name": "boxing glove" + }, + { + "no": 1970, + "code": "1F94B", + "char": "🥋", + "name": "martial arts uniform" + }, + { + "no": 1971, + "code": "1F945", + "char": "🥅", + "name": "goal net" + }, + { + "no": 1972, + "code": "1F3AF", + "char": "🎯", + "name": "direct hit" + }, + { + "no": 1973, + "code": "26F3", + "char": "⛳", + "name": "flag in hole" + }, + { + "no": 1974, + "code": "26F8", + "char": "⛸", + "name": "ice skate" + }, + { + "no": 1975, + "code": "1F3A3", + "char": "🎣", + "name": "fishing pole" + }, + { + "no": 1976, + "code": "1F3BD", + "char": "🎽", + "name": "running shirt" + }, + { + "no": 1977, + "code": "1F3BF", + "char": "🎿", + "name": "skis" + }, + { + "no": 1978, + "code": "1F6F7", + "char": "🛷", + "name": "⊛ sled" + }, + { + "no": 1979, + "code": "1F94C", + "char": "🥌", + "name": "⊛ curling stone" + }, + { + "no": 1980, + "code": "1F3AE", + "char": "🎮", + "name": "video game" + }, + { + "no": 1981, + "code": "1F579", + "char": "🕹", + "name": "joystick" + }, + { + "no": 1982, + "code": "1F3B2", + "char": "🎲", + "name": "game die" + }, + { + "no": 1983, + "code": "2660", + "char": "♠", + "name": "spade suit" + }, + { + "no": 1984, + "code": "2665", + "char": "♥", + "name": "heart suit" + }, + { + "no": 1985, + "code": "2666", + "char": "♦", + "name": "diamond suit" + }, + { + "no": 1986, + "code": "2663", + "char": "♣", + "name": "club suit" + }, + { + "no": 1987, + "code": "1F0CF", + "char": "🃏", + "name": "joker" + }, + { + "no": 1988, + "code": "1F004", + "char": "🀄", + "name": "mahjong red dragon" + }, + { + "no": 1989, + "code": "1F3B4", + "char": "🎴", + "name": "flower playing cards" + }, + { + "no": 1990, + "code": "1F507", + "char": "🔇", + "name": "muted speaker" + }, + { + "no": 1991, + "code": "1F508", + "char": "🔈", + "name": "speaker low volume" + }, + { + "no": 1992, + "code": "1F509", + "char": "🔉", + "name": "speaker medium volume" + }, + { + "no": 1993, + "code": "1F50A", + "char": "🔊", + "name": "speaker high volume" + }, + { + "no": 1994, + "code": "1F4E2", + "char": "📢", + "name": "loudspeaker" + }, + { + "no": 1995, + "code": "1F4E3", + "char": "📣", + "name": "megaphone" + }, + { + "no": 1996, + "code": "1F4EF", + "char": "📯", + "name": "postal horn" + }, + { + "no": 1997, + "code": "1F514", + "char": "🔔", + "name": "bell" + }, + { + "no": 1998, + "code": "1F515", + "char": "🔕", + "name": "bell with slash" + }, + { + "no": 1999, + "code": "1F3BC", + "char": "🎼", + "name": "musical score" + }, + { + "no": 2000, + "code": "1F3B5", + "char": "🎵", + "name": "musical note" + }, + { + "no": 2001, + "code": "1F3B6", + "char": "🎶", + "name": "musical notes" + }, + { + "no": 2002, + "code": "1F399", + "char": "🎙", + "name": "studio microphone" + }, + { + "no": 2003, + "code": "1F39A", + "char": "🎚", + "name": "level slider" + }, + { + "no": 2004, + "code": "1F39B", + "char": "🎛", + "name": "control knobs" + }, + { + "no": 2005, + "code": "1F3A4", + "char": "🎤", + "name": "microphone" + }, + { + "no": 2006, + "code": "1F3A7", + "char": "🎧", + "name": "headphone" + }, + { + "no": 2007, + "code": "1F4FB", + "char": "📻", + "name": "radio" + }, + { + "no": 2008, + "code": "1F3B7", + "char": "🎷", + "name": "saxophone" + }, + { + "no": 2009, + "code": "1F3B8", + "char": "🎸", + "name": "guitar" + }, + { + "no": 2010, + "code": "1F3B9", + "char": "🎹", + "name": "musical keyboard" + }, + { + "no": 2011, + "code": "1F3BA", + "char": "🎺", + "name": "trumpet" + }, + { + "no": 2012, + "code": "1F3BB", + "char": "🎻", + "name": "violin" + }, + { + "no": 2013, + "code": "1F941", + "char": "🥁", + "name": "drum" + }, + { + "no": 2014, + "code": "1F4F1", + "char": "📱", + "name": "mobile phone" + }, + { + "no": 2015, + "code": "1F4F2", + "char": "📲", + "name": "mobile phone with arrow" + }, + { + "no": 2016, + "code": "260E", + "char": "☎", + "name": "telephone" + }, + { + "no": 2017, + "code": "1F4DE", + "char": "📞", + "name": "telephone receiver" + }, + { + "no": 2018, + "code": "1F4DF", + "char": "📟", + "name": "pager" + }, + { + "no": 2019, + "code": "1F4E0", + "char": "📠", + "name": "fax machine" + }, + { + "no": 2020, + "code": "1F50B", + "char": "🔋", + "name": "battery" + }, + { + "no": 2021, + "code": "1F50C", + "char": "🔌", + "name": "electric plug" + }, + { + "no": 2022, + "code": "1F4BB", + "char": "💻", + "name": "laptop computer" + }, + { + "no": 2023, + "code": "1F5A5", + "char": "🖥", + "name": "desktop computer" + }, + { + "no": 2024, + "code": "1F5A8", + "char": "🖨", + "name": "printer" + }, + { + "no": 2025, + "code": "2328", + "char": "⌨", + "name": "keyboard" + }, + { + "no": 2026, + "code": "1F5B1", + "char": "🖱", + "name": "computer mouse" + }, + { + "no": 2027, + "code": "1F5B2", + "char": "🖲", + "name": "trackball" + }, + { + "no": 2028, + "code": "1F4BD", + "char": "💽", + "name": "computer disk" + }, + { + "no": 2029, + "code": "1F4BE", + "char": "💾", + "name": "floppy disk" + }, + { + "no": 2030, + "code": "1F4BF", + "char": "💿", + "name": "optical disk" + }, + { + "no": 2031, + "code": "1F4C0", + "char": "📀", + "name": "dvd" + }, + { + "no": 2032, + "code": "1F3A5", + "char": "🎥", + "name": "movie camera" + }, + { + "no": 2033, + "code": "1F39E", + "char": "🎞", + "name": "film frames" + }, + { + "no": 2034, + "code": "1F4FD", + "char": "📽", + "name": "film projector" + }, + { + "no": 2035, + "code": "1F3AC", + "char": "🎬", + "name": "clapper board" + }, + { + "no": 2036, + "code": "1F4FA", + "char": "📺", + "name": "television" + }, + { + "no": 2037, + "code": "1F4F7", + "char": "📷", + "name": "camera" + }, + { + "no": 2038, + "code": "1F4F8", + "char": "📸", + "name": "camera with flash" + }, + { + "no": 2039, + "code": "1F4F9", + "char": "📹", + "name": "video camera" + }, + { + "no": 2040, + "code": "1F4FC", + "char": "📼", + "name": "videocassette" + }, + { + "no": 2041, + "code": "1F50D", + "char": "🔍", + "name": "magnifying glass tilted left" + }, + { + "no": 2042, + "code": "1F50E", + "char": "🔎", + "name": "magnifying glass tilted right" + }, + { + "no": 2043, + "code": "1F52C", + "char": "🔬", + "name": "microscope" + }, + { + "no": 2044, + "code": "1F52D", + "char": "🔭", + "name": "telescope" + }, + { + "no": 2045, + "code": "1F4E1", + "char": "📡", + "name": "satellite antenna" + }, + { + "no": 2046, + "code": "1F56F", + "char": "🕯", + "name": "candle" + }, + { + "no": 2047, + "code": "1F4A1", + "char": "💡", + "name": "light bulb" + }, + { + "no": 2048, + "code": "1F526", + "char": "🔦", + "name": "flashlight" + }, + { + "no": 2049, + "code": "1F3EE", + "char": "🏮", + "name": "red paper lantern" + }, + { + "no": 2050, + "code": "1F4D4", + "char": "📔", + "name": "notebook with decorative cover" + }, + { + "no": 2051, + "code": "1F4D5", + "char": "📕", + "name": "closed book" + }, + { + "no": 2052, + "code": "1F4D6", + "char": "📖", + "name": "open book" + }, + { + "no": 2053, + "code": "1F4D7", + "char": "📗", + "name": "green book" + }, + { + "no": 2054, + "code": "1F4D8", + "char": "📘", + "name": "blue book" + }, + { + "no": 2055, + "code": "1F4D9", + "char": "📙", + "name": "orange book" + }, + { + "no": 2056, + "code": "1F4DA", + "char": "📚", + "name": "books" + }, + { + "no": 2057, + "code": "1F4D3", + "char": "📓", + "name": "notebook" + }, + { + "no": 2058, + "code": "1F4D2", + "char": "📒", + "name": "ledger" + }, + { + "no": 2059, + "code": "1F4C3", + "char": "📃", + "name": "page with curl" + }, + { + "no": 2060, + "code": "1F4DC", + "char": "📜", + "name": "scroll" + }, + { + "no": 2061, + "code": "1F4C4", + "char": "📄", + "name": "page facing up" + }, + { + "no": 2062, + "code": "1F4F0", + "char": "📰", + "name": "newspaper" + }, + { + "no": 2063, + "code": "1F5DE", + "char": "🗞", + "name": "rolled-up newspaper" + }, + { + "no": 2064, + "code": "1F4D1", + "char": "📑", + "name": "bookmark tabs" + }, + { + "no": 2065, + "code": "1F516", + "char": "🔖", + "name": "bookmark" + }, + { + "no": 2066, + "code": "1F3F7", + "char": "🏷", + "name": "label" + }, + { + "no": 2067, + "code": "1F4B0", + "char": "💰", + "name": "money bag" + }, + { + "no": 2068, + "code": "1F4B4", + "char": "💴", + "name": "yen banknote" + }, + { + "no": 2069, + "code": "1F4B5", + "char": "💵", + "name": "dollar banknote" + }, + { + "no": 2070, + "code": "1F4B6", + "char": "💶", + "name": "euro banknote" + }, + { + "no": 2071, + "code": "1F4B7", + "char": "💷", + "name": "pound banknote" + }, + { + "no": 2072, + "code": "1F4B8", + "char": "💸", + "name": "money with wings" + }, + { + "no": 2073, + "code": "1F4B3", + "char": "💳", + "name": "credit card" + }, + { + "no": 2074, + "code": "1F4B9", + "char": "💹", + "name": "chart increasing with yen" + }, + { + "no": 2075, + "code": "1F4B1", + "char": "💱", + "name": "currency exchange" + }, + { + "no": 2076, + "code": "1F4B2", + "char": "💲", + "name": "heavy dollar sign" + }, + { + "no": 2077, + "code": "2709", + "char": "✉", + "name": "envelope" + }, + { + "no": 2078, + "code": "1F4E7", + "char": "📧", + "name": "e-mail" + }, + { + "no": 2079, + "code": "1F4E8", + "char": "📨", + "name": "incoming envelope" + }, + { + "no": 2080, + "code": "1F4E9", + "char": "📩", + "name": "envelope with arrow" + }, + { + "no": 2081, + "code": "1F4E4", + "char": "📤", + "name": "outbox tray" + }, + { + "no": 2082, + "code": "1F4E5", + "char": "📥", + "name": "inbox tray" + }, + { + "no": 2083, + "code": "1F4E6", + "char": "📦", + "name": "package" + }, + { + "no": 2084, + "code": "1F4EB", + "char": "📫", + "name": "closed mailbox with raised flag" + }, + { + "no": 2085, + "code": "1F4EA", + "char": "📪", + "name": "closed mailbox with lowered flag" + }, + { + "no": 2086, + "code": "1F4EC", + "char": "📬", + "name": "open mailbox with raised flag" + }, + { + "no": 2087, + "code": "1F4ED", + "char": "📭", + "name": "open mailbox with lowered flag" + }, + { + "no": 2088, + "code": "1F4EE", + "char": "📮", + "name": "postbox" + }, + { + "no": 2089, + "code": "1F5F3", + "char": "🗳", + "name": "ballot box with ballot" + }, + { + "no": 2090, + "code": "270F", + "char": "✏", + "name": "pencil" + }, + { + "no": 2091, + "code": "2712", + "char": "✒", + "name": "black nib" + }, + { + "no": 2092, + "code": "1F58B", + "char": "🖋", + "name": "fountain pen" + }, + { + "no": 2093, + "code": "1F58A", + "char": "🖊", + "name": "pen" + }, + { + "no": 2094, + "code": "1F58C", + "char": "🖌", + "name": "paintbrush" + }, + { + "no": 2095, + "code": "1F58D", + "char": "🖍", + "name": "crayon" + }, + { + "no": 2096, + "code": "1F4DD", + "char": "📝", + "name": "memo" + }, + { + "no": 2097, + "code": "1F4BC", + "char": "💼", + "name": "briefcase" + }, + { + "no": 2098, + "code": "1F4C1", + "char": "📁", + "name": "file folder" + }, + { + "no": 2099, + "code": "1F4C2", + "char": "📂", + "name": "open file folder" + }, + { + "no": 2100, + "code": "1F5C2", + "char": "🗂", + "name": "card index dividers" + }, + { + "no": 2101, + "code": "1F4C5", + "char": "📅", + "name": "calendar" + }, + { + "no": 2102, + "code": "1F4C6", + "char": "📆", + "name": "tear-off calendar" + }, + { + "no": 2103, + "code": "1F5D2", + "char": "🗒", + "name": "spiral notepad" + }, + { + "no": 2104, + "code": "1F5D3", + "char": "🗓", + "name": "spiral calendar" + }, + { + "no": 2105, + "code": "1F4C7", + "char": "📇", + "name": "card index" + }, + { + "no": 2106, + "code": "1F4C8", + "char": "📈", + "name": "chart increasing" + }, + { + "no": 2107, + "code": "1F4C9", + "char": "📉", + "name": "chart decreasing" + }, + { + "no": 2108, + "code": "1F4CA", + "char": "📊", + "name": "bar chart" + }, + { + "no": 2109, + "code": "1F4CB", + "char": "📋", + "name": "clipboard" + }, + { + "no": 2110, + "code": "1F4CC", + "char": "📌", + "name": "pushpin" + }, + { + "no": 2111, + "code": "1F4CD", + "char": "📍", + "name": "round pushpin" + }, + { + "no": 2112, + "code": "1F4CE", + "char": "📎", + "name": "paperclip" + }, + { + "no": 2113, + "code": "1F587", + "char": "🖇", + "name": "linked paperclips" + }, + { + "no": 2114, + "code": "1F4CF", + "char": "📏", + "name": "straight ruler" + }, + { + "no": 2115, + "code": "1F4D0", + "char": "📐", + "name": "triangular ruler" + }, + { + "no": 2116, + "code": "2702", + "char": "✂", + "name": "scissors" + }, + { + "no": 2117, + "code": "1F5C3", + "char": "🗃", + "name": "card file box" + }, + { + "no": 2118, + "code": "1F5C4", + "char": "🗄", + "name": "file cabinet" + }, + { + "no": 2119, + "code": "1F5D1", + "char": "🗑", + "name": "wastebasket" + }, + { + "no": 2120, + "code": "1F512", + "char": "🔒", + "name": "locked" + }, + { + "no": 2121, + "code": "1F513", + "char": "🔓", + "name": "unlocked" + }, + { + "no": 2122, + "code": "1F50F", + "char": "🔏", + "name": "locked with pen" + }, + { + "no": 2123, + "code": "1F510", + "char": "🔐", + "name": "locked with key" + }, + { + "no": 2124, + "code": "1F511", + "char": "🔑", + "name": "key" + }, + { + "no": 2125, + "code": "1F5DD", + "char": "🗝", + "name": "old key" + }, + { + "no": 2126, + "code": "1F528", + "char": "🔨", + "name": "hammer" + }, + { + "no": 2127, + "code": "26CF", + "char": "⛏", + "name": "pick" + }, + { + "no": 2128, + "code": "2692", + "char": "⚒", + "name": "hammer and pick" + }, + { + "no": 2129, + "code": "1F6E0", + "char": "🛠", + "name": "hammer and wrench" + }, + { + "no": 2130, + "code": "1F5E1", + "char": "🗡", + "name": "dagger" + }, + { + "no": 2131, + "code": "2694", + "char": "⚔", + "name": "crossed swords" + }, + { + "no": 2132, + "code": "1F52B", + "char": "🔫", + "name": "pistol" + }, + { + "no": 2133, + "code": "1F3F9", + "char": "🏹", + "name": "bow and arrow" + }, + { + "no": 2134, + "code": "1F6E1", + "char": "🛡", + "name": "shield" + }, + { + "no": 2135, + "code": "1F527", + "char": "🔧", + "name": "wrench" + }, + { + "no": 2136, + "code": "1F529", + "char": "🔩", + "name": "nut and bolt" + }, + { + "no": 2137, + "code": "2699", + "char": "⚙", + "name": "gear" + }, + { + "no": 2138, + "code": "1F5DC", + "char": "🗜", + "name": "clamp" + }, + { + "no": 2139, + "code": "2697", + "char": "⚗", + "name": "alembic" + }, + { + "no": 2140, + "code": "2696", + "char": "⚖", + "name": "balance scale" + }, + { + "no": 2141, + "code": "1F517", + "char": "🔗", + "name": "link" + }, + { + "no": 2142, + "code": "26D3", + "char": "⛓", + "name": "chains" + }, + { + "no": 2143, + "code": "1F489", + "char": "💉", + "name": "syringe" + }, + { + "no": 2144, + "code": "1F48A", + "char": "💊", + "name": "pill" + }, + { + "no": 2145, + "code": "1F6AC", + "char": "🚬", + "name": "cigarette" + }, + { + "no": 2146, + "code": "26B0", + "char": "⚰", + "name": "coffin" + }, + { + "no": 2147, + "code": "26B1", + "char": "⚱", + "name": "funeral urn" + }, + { + "no": 2148, + "code": "1F5FF", + "char": "🗿", + "name": "moai" + }, + { + "no": 2149, + "code": "1F6E2", + "char": "🛢", + "name": "oil drum" + }, + { + "no": 2150, + "code": "1F52E", + "char": "🔮", + "name": "crystal ball" + }, + { + "no": 2151, + "code": "1F6D2", + "char": "🛒", + "name": "shopping cart" + }, + { + "no": 2152, + "code": "1F3E7", + "char": "🏧", + "name": "ATM sign" + }, + { + "no": 2153, + "code": "1F6AE", + "char": "🚮", + "name": "litter in bin sign" + }, + { + "no": 2154, + "code": "1F6B0", + "char": "🚰", + "name": "potable water" + }, + { + "no": 2155, + "code": "267F", + "char": "♿", + "name": "wheelchair symbol" + }, + { + "no": 2156, + "code": "1F6B9", + "char": "🚹", + "name": "men’s room" + }, + { + "no": 2157, + "code": "1F6BA", + "char": "🚺", + "name": "women’s room" + }, + { + "no": 2158, + "code": "1F6BB", + "char": "🚻", + "name": "restroom" + }, + { + "no": 2159, + "code": "1F6BC", + "char": "🚼", + "name": "baby symbol" + }, + { + "no": 2160, + "code": "1F6BE", + "char": "🚾", + "name": "water closet" + }, + { + "no": 2161, + "code": "1F6C2", + "char": "🛂", + "name": "passport control" + }, + { + "no": 2162, + "code": "1F6C3", + "char": "🛃", + "name": "customs" + }, + { + "no": 2163, + "code": "1F6C4", + "char": "🛄", + "name": "baggage claim" + }, + { + "no": 2164, + "code": "1F6C5", + "char": "🛅", + "name": "left luggage" + }, + { + "no": 2165, + "code": "26A0", + "char": "⚠", + "name": "warning" + }, + { + "no": 2166, + "code": "1F6B8", + "char": "🚸", + "name": "children crossing" + }, + { + "no": 2167, + "code": "26D4", + "char": "⛔", + "name": "no entry" + }, + { + "no": 2168, + "code": "1F6AB", + "char": "🚫", + "name": "prohibited" + }, + { + "no": 2169, + "code": "1F6B3", + "char": "🚳", + "name": "no bicycles" + }, + { + "no": 2170, + "code": "1F6AD", + "char": "🚭", + "name": "no smoking" + }, + { + "no": 2171, + "code": "1F6AF", + "char": "🚯", + "name": "no littering" + }, + { + "no": 2172, + "code": "1F6B1", + "char": "🚱", + "name": "non-potable water" + }, + { + "no": 2173, + "code": "1F6B7", + "char": "🚷", + "name": "no pedestrians" + }, + { + "no": 2174, + "code": "1F4F5", + "char": "📵", + "name": "no mobile phones" + }, + { + "no": 2175, + "code": "1F51E", + "char": "🔞", + "name": "no one under eighteen" + }, + { + "no": 2176, + "code": "2622", + "char": "☢", + "name": "radioactive" + }, + { + "no": 2177, + "code": "2623", + "char": "☣", + "name": "biohazard" + }, + { + "no": 2178, + "code": "2B06", + "char": "⬆", + "name": "up arrow" + }, + { + "no": 2179, + "code": "2197", + "char": "↗", + "name": "up-right arrow" + }, + { + "no": 2180, + "code": "27A1", + "char": "➡", + "name": "right arrow" + }, + { + "no": 2181, + "code": "2198", + "char": "↘", + "name": "down-right arrow" + }, + { + "no": 2182, + "code": "2B07", + "char": "⬇", + "name": "down arrow" + }, + { + "no": 2183, + "code": "2199", + "char": "↙", + "name": "down-left arrow" + }, + { + "no": 2184, + "code": "2B05", + "char": "⬅", + "name": "left arrow" + }, + { + "no": 2185, + "code": "2196", + "char": "↖", + "name": "up-left arrow" + }, + { + "no": 2186, + "code": "2195", + "char": "↕", + "name": "up-down arrow" + }, + { + "no": 2187, + "code": "2194", + "char": "↔", + "name": "left-right arrow" + }, + { + "no": 2188, + "code": "21A9", + "char": "↩", + "name": "right arrow curving left" + }, + { + "no": 2189, + "code": "21AA", + "char": "↪", + "name": "left arrow curving right" + }, + { + "no": 2190, + "code": "2934", + "char": "⤴", + "name": "right arrow curving up" + }, + { + "no": 2191, + "code": "2935", + "char": "⤵", + "name": "right arrow curving down" + }, + { + "no": 2192, + "code": "1F503", + "char": "🔃", + "name": "clockwise vertical arrows" + }, + { + "no": 2193, + "code": "1F504", + "char": "🔄", + "name": "counterclockwise arrows button" + }, + { + "no": 2194, + "code": "1F519", + "char": "🔙", + "name": "BACK arrow" + }, + { + "no": 2195, + "code": "1F51A", + "char": "🔚", + "name": "END arrow" + }, + { + "no": 2196, + "code": "1F51B", + "char": "🔛", + "name": "ON! arrow" + }, + { + "no": 2197, + "code": "1F51C", + "char": "🔜", + "name": "SOON arrow" + }, + { + "no": 2198, + "code": "1F51D", + "char": "🔝", + "name": "TOP arrow" + }, + { + "no": 2199, + "code": "1F6D0", + "char": "🛐", + "name": "place of worship" + }, + { + "no": 2200, + "code": "269B", + "char": "⚛", + "name": "atom symbol" + }, + { + "no": 2201, + "code": "1F549", + "char": "🕉", + "name": "om" + }, + { + "no": 2202, + "code": "2721", + "char": "✡", + "name": "star of David" + }, + { + "no": 2203, + "code": "2638", + "char": "☸", + "name": "wheel of dharma" + }, + { + "no": 2204, + "code": "262F", + "char": "☯", + "name": "yin yang" + }, + { + "no": 2205, + "code": "271D", + "char": "✝", + "name": "latin cross" + }, + { + "no": 2206, + "code": "2626", + "char": "☦", + "name": "orthodox cross" + }, + { + "no": 2207, + "code": "262A", + "char": "☪", + "name": "star and crescent" + }, + { + "no": 2208, + "code": "262E", + "char": "☮", + "name": "peace symbol" + }, + { + "no": 2209, + "code": "1F54E", + "char": "🕎", + "name": "menorah" + }, + { + "no": 2210, + "code": "1F52F", + "char": "🔯", + "name": "dotted six-pointed star" + }, + { + "no": 2211, + "code": "2648", + "char": "♈", + "name": "Aries" + }, + { + "no": 2212, + "code": "2649", + "char": "♉", + "name": "Taurus" + }, + { + "no": 2213, + "code": "264A", + "char": "♊", + "name": "Gemini" + }, + { + "no": 2214, + "code": "264B", + "char": "♋", + "name": "Cancer" + }, + { + "no": 2215, + "code": "264C", + "char": "♌", + "name": "Leo" + }, + { + "no": 2216, + "code": "264D", + "char": "♍", + "name": "Virgo" + }, + { + "no": 2217, + "code": "264E", + "char": "♎", + "name": "Libra" + }, + { + "no": 2218, + "code": "264F", + "char": "♏", + "name": "Scorpius" + }, + { + "no": 2219, + "code": "2650", + "char": "♐", + "name": "Sagittarius" + }, + { + "no": 2220, + "code": "2651", + "char": "♑", + "name": "Capricorn" + }, + { + "no": 2221, + "code": "2652", + "char": "♒", + "name": "Aquarius" + }, + { + "no": 2222, + "code": "2653", + "char": "♓", + "name": "Pisces" + }, + { + "no": 2223, + "code": "26CE", + "char": "⛎", + "name": "Ophiuchus" + }, + { + "no": 2224, + "code": "1F500", + "char": "🔀", + "name": "shuffle tracks button" + }, + { + "no": 2225, + "code": "1F501", + "char": "🔁", + "name": "repeat button" + }, + { + "no": 2226, + "code": "1F502", + "char": "🔂", + "name": "repeat single button" + }, + { + "no": 2227, + "code": "25B6", + "char": "▶", + "name": "play button" + }, + { + "no": 2228, + "code": "23E9", + "char": "⏩", + "name": "fast-forward button" + }, + { + "no": 2229, + "code": "23ED", + "char": "⏭", + "name": "next track button" + }, + { + "no": 2230, + "code": "23EF", + "char": "⏯", + "name": "play or pause button" + }, + { + "no": 2231, + "code": "25C0", + "char": "◀", + "name": "reverse button" + }, + { + "no": 2232, + "code": "23EA", + "char": "⏪", + "name": "fast reverse button" + }, + { + "no": 2233, + "code": "23EE", + "char": "⏮", + "name": "last track button" + }, + { + "no": 2234, + "code": "1F53C", + "char": "🔼", + "name": "up button" + }, + { + "no": 2235, + "code": "23EB", + "char": "⏫", + "name": "fast up button" + }, + { + "no": 2236, + "code": "1F53D", + "char": "🔽", + "name": "down button" + }, + { + "no": 2237, + "code": "23EC", + "char": "⏬", + "name": "fast down button" + }, + { + "no": 2238, + "code": "23F8", + "char": "⏸", + "name": "pause button" + }, + { + "no": 2239, + "code": "23F9", + "char": "⏹", + "name": "stop button" + }, + { + "no": 2240, + "code": "23FA", + "char": "⏺", + "name": "record button" + }, + { + "no": 2241, + "code": "23CF", + "char": "⏏", + "name": "eject button" + }, + { + "no": 2242, + "code": "1F3A6", + "char": "🎦", + "name": "cinema" + }, + { + "no": 2243, + "code": "1F505", + "char": "🔅", + "name": "dim button" + }, + { + "no": 2244, + "code": "1F506", + "char": "🔆", + "name": "bright button" + }, + { + "no": 2245, + "code": "1F4F6", + "char": "📶", + "name": "antenna bars" + }, + { + "no": 2246, + "code": "1F4F3", + "char": "📳", + "name": "vibration mode" + }, + { + "no": 2247, + "code": "1F4F4", + "char": "📴", + "name": "mobile phone off" + }, + { + "no": 2248, + "code": "2640", + "char": "♀", + "name": "female sign" + }, + { + "no": 2249, + "code": "2642", + "char": "♂", + "name": "male sign" + }, + { + "no": 2250, + "code": "2695", + "char": "⚕", + "name": "medical symbol" + }, + { + "no": 2251, + "code": "267B", + "char": "♻", + "name": "recycling symbol" + }, + { + "no": 2252, + "code": "269C", + "char": "⚜", + "name": "fleur-de-lis" + }, + { + "no": 2253, + "code": "1F531", + "char": "🔱", + "name": "trident emblem" + }, + { + "no": 2254, + "code": "1F4DB", + "char": "📛", + "name": "name badge" + }, + { + "no": 2255, + "code": "1F530", + "char": "🔰", + "name": "Japanese symbol for beginner" + }, + { + "no": 2256, + "code": "2B55", + "char": "⭕", + "name": "heavy large circle" + }, + { + "no": 2257, + "code": "2705", + "char": "✅", + "name": "white heavy check mark" + }, + { + "no": 2258, + "code": "2611", + "char": "☑", + "name": "ballot box with check" + }, + { + "no": 2259, + "code": "2714", + "char": "✔", + "name": "heavy check mark" + }, + { + "no": 2260, + "code": "2716", + "char": "✖", + "name": "heavy multiplication x" + }, + { + "no": 2261, + "code": "274C", + "char": "❌", + "name": "cross mark" + }, + { + "no": 2262, + "code": "274E", + "char": "❎", + "name": "cross mark button" + }, + { + "no": 2263, + "code": "2795", + "char": "➕", + "name": "heavy plus sign" + }, + { + "no": 2264, + "code": "2796", + "char": "➖", + "name": "heavy minus sign" + }, + { + "no": 2265, + "code": "2797", + "char": "➗", + "name": "heavy division sign" + }, + { + "no": 2266, + "code": "27B0", + "char": "➰", + "name": "curly loop" + }, + { + "no": 2267, + "code": "27BF", + "char": "➿", + "name": "double curly loop" + }, + { + "no": 2268, + "code": "303D", + "char": "〽", + "name": "part alternation mark" + }, + { + "no": 2269, + "code": "2733", + "char": "✳", + "name": "eight-spoked asterisk" + }, + { + "no": 2270, + "code": "2734", + "char": "✴", + "name": "eight-pointed star" + }, + { + "no": 2271, + "code": "2747", + "char": "❇", + "name": "sparkle" + }, + { + "no": 2272, + "code": "203C", + "char": "‼", + "name": "double exclamation mark" + }, + { + "no": 2273, + "code": "2049", + "char": "⁉", + "name": "exclamation question mark" + }, + { + "no": 2274, + "code": "2753", + "char": "❓", + "name": "question mark" + }, + { + "no": 2275, + "code": "2754", + "char": "❔", + "name": "white question mark" + }, + { + "no": 2276, + "code": "2755", + "char": "❕", + "name": "white exclamation mark" + }, + { + "no": 2277, + "code": "2757", + "char": "❗", + "name": "exclamation mark" + }, + { + "no": 2278, + "code": "3030", + "char": "〰", + "name": "wavy dash" + }, + { + "no": 2279, + "code": "00A9", + "char": "©", + "name": "copyright" + }, + { + "no": 2280, + "code": "00AE", + "char": "®", + "name": "registered" + }, + { + "no": 2281, + "code": "2122", + "char": "™", + "name": "trade mark" + }, + { + "no": 2282, + "code": "0023 FE0F 20E3", + "char": "#️⃣", + "name": "keycap: #" + }, + { + "no": 2283, + "code": "002A FE0F 20E3", + "char": "*️⃣", + "name": "keycap: *" + }, + { + "no": 2284, + "code": "0030 FE0F 20E3", + "char": "0️⃣", + "name": "keycap: 0" + }, + { + "no": 2285, + "code": "0031 FE0F 20E3", + "char": "1️⃣", + "name": "keycap: 1" + }, + { + "no": 2286, + "code": "0032 FE0F 20E3", + "char": "2️⃣", + "name": "keycap: 2" + }, + { + "no": 2287, + "code": "0033 FE0F 20E3", + "char": "3️⃣", + "name": "keycap: 3" + }, + { + "no": 2288, + "code": "0034 FE0F 20E3", + "char": "4️⃣", + "name": "keycap: 4" + }, + { + "no": 2289, + "code": "0035 FE0F 20E3", + "char": "5️⃣", + "name": "keycap: 5" + }, + { + "no": 2290, + "code": "0036 FE0F 20E3", + "char": "6️⃣", + "name": "keycap: 6" + }, + { + "no": 2291, + "code": "0037 FE0F 20E3", + "char": "7️⃣", + "name": "keycap: 7" + }, + { + "no": 2292, + "code": "0038 FE0F 20E3", + "char": "8️⃣", + "name": "keycap: 8" + }, + { + "no": 2293, + "code": "0039 FE0F 20E3", + "char": "9️⃣", + "name": "keycap: 9" + }, + { + "no": 2294, + "code": "1F51F", + "char": "🔟", + "name": "keycap 10" + }, + { + "no": 2295, + "code": "1F4AF", + "char": "💯", + "name": "hundred points" + }, + { + "no": 2296, + "code": "1F520", + "char": "🔠", + "name": "input latin uppercase" + }, + { + "no": 2297, + "code": "1F521", + "char": "🔡", + "name": "input latin lowercase" + }, + { + "no": 2298, + "code": "1F522", + "char": "🔢", + "name": "input numbers" + }, + { + "no": 2299, + "code": "1F523", + "char": "🔣", + "name": "input symbols" + }, + { + "no": 2300, + "code": "1F524", + "char": "🔤", + "name": "input latin letters" + }, + { + "no": 2301, + "code": "1F170", + "char": "🅰", + "name": "A button (blood type)" + }, + { + "no": 2302, + "code": "1F18E", + "char": "🆎", + "name": "AB button (blood type)" + }, + { + "no": 2303, + "code": "1F171", + "char": "🅱", + "name": "B button (blood type)" + }, + { + "no": 2304, + "code": "1F191", + "char": "🆑", + "name": "CL button" + }, + { + "no": 2305, + "code": "1F192", + "char": "🆒", + "name": "COOL button" + }, + { + "no": 2306, + "code": "1F193", + "char": "🆓", + "name": "FREE button" + }, + { + "no": 2307, + "code": "2139", + "char": "ℹ", + "name": "information" + }, + { + "no": 2308, + "code": "1F194", + "char": "🆔", + "name": "ID button" + }, + { + "no": 2309, + "code": "24C2", + "char": "Ⓜ", + "name": "circled M" + }, + { + "no": 2310, + "code": "1F195", + "char": "🆕", + "name": "NEW button" + }, + { + "no": 2311, + "code": "1F196", + "char": "🆖", + "name": "NG button" + }, + { + "no": 2312, + "code": "1F17E", + "char": "🅾", + "name": "O button (blood type)" + }, + { + "no": 2313, + "code": "1F197", + "char": "🆗", + "name": "OK button" + }, + { + "no": 2314, + "code": "1F17F", + "char": "🅿", + "name": "P button" + }, + { + "no": 2315, + "code": "1F198", + "char": "🆘", + "name": "SOS button" + }, + { + "no": 2316, + "code": "1F199", + "char": "🆙", + "name": "UP! button" + }, + { + "no": 2317, + "code": "1F19A", + "char": "🆚", + "name": "VS button" + }, + { + "no": 2318, + "code": "1F201", + "char": "🈁", + "name": "Japanese “here” button" + }, + { + "no": 2319, + "code": "1F202", + "char": "🈂", + "name": "Japanese “service charge” button" + }, + { + "no": 2320, + "code": "1F237", + "char": "🈷", + "name": "Japanese “monthly amount” button" + }, + { + "no": 2321, + "code": "1F236", + "char": "🈶", + "name": "Japanese “not free of charge” button" + }, + { + "no": 2322, + "code": "1F22F", + "char": "🈯", + "name": "Japanese “reserved” button" + }, + { + "no": 2323, + "code": "1F250", + "char": "🉐", + "name": "Japanese “bargain” button" + }, + { + "no": 2324, + "code": "1F239", + "char": "🈹", + "name": "Japanese “discount” button" + }, + { + "no": 2325, + "code": "1F21A", + "char": "🈚", + "name": "Japanese “free of charge” button" + }, + { + "no": 2326, + "code": "1F232", + "char": "🈲", + "name": "Japanese “prohibited” button" + }, + { + "no": 2327, + "code": "1F251", + "char": "🉑", + "name": "Japanese “acceptable” button" + }, + { + "no": 2328, + "code": "1F238", + "char": "🈸", + "name": "Japanese “application” button" + }, + { + "no": 2329, + "code": "1F234", + "char": "🈴", + "name": "Japanese “passing grade” button" + }, + { + "no": 2330, + "code": "1F233", + "char": "🈳", + "name": "Japanese “vacancy” button" + }, + { + "no": 2331, + "code": "3297", + "char": "㊗", + "name": "Japanese “congratulations” button" + }, + { + "no": 2332, + "code": "3299", + "char": "㊙", + "name": "Japanese “secret” button" + }, + { + "no": 2333, + "code": "1F23A", + "char": "🈺", + "name": "Japanese “open for business” button" + }, + { + "no": 2334, + "code": "1F235", + "char": "🈵", + "name": "Japanese “no vacancy” button" + }, + { + "no": 2335, + "code": "25AA", + "char": "▪", + "name": "black small square" + }, + { + "no": 2336, + "code": "25AB", + "char": "▫", + "name": "white small square" + }, + { + "no": 2337, + "code": "25FB", + "char": "◻", + "name": "white medium square" + }, + { + "no": 2338, + "code": "25FC", + "char": "◼", + "name": "black medium square" + }, + { + "no": 2339, + "code": "25FD", + "char": "◽", + "name": "white medium-small square" + }, + { + "no": 2340, + "code": "25FE", + "char": "◾", + "name": "black medium-small square" + }, + { + "no": 2341, + "code": "2B1B", + "char": "⬛", + "name": "black large square" + }, + { + "no": 2342, + "code": "2B1C", + "char": "⬜", + "name": "white large square" + }, + { + "no": 2343, + "code": "1F536", + "char": "🔶", + "name": "large orange diamond" + }, + { + "no": 2344, + "code": "1F537", + "char": "🔷", + "name": "large blue diamond" + }, + { + "no": 2345, + "code": "1F538", + "char": "🔸", + "name": "small orange diamond" + }, + { + "no": 2346, + "code": "1F539", + "char": "🔹", + "name": "small blue diamond" + }, + { + "no": 2347, + "code": "1F53A", + "char": "🔺", + "name": "red triangle pointed up" + }, + { + "no": 2348, + "code": "1F53B", + "char": "🔻", + "name": "red triangle pointed down" + }, + { + "no": 2349, + "code": "1F4A0", + "char": "💠", + "name": "diamond with a dot" + }, + { + "no": 2350, + "code": "1F518", + "char": "🔘", + "name": "radio button" + }, + { + "no": 2351, + "code": "1F532", + "char": "🔲", + "name": "black square button" + }, + { + "no": 2352, + "code": "1F533", + "char": "🔳", + "name": "white square button" + }, + { + "no": 2353, + "code": "26AA", + "char": "⚪", + "name": "white circle" + }, + { + "no": 2354, + "code": "26AB", + "char": "⚫", + "name": "black circle" + }, + { + "no": 2355, + "code": "1F534", + "char": "🔴", + "name": "red circle" + }, + { + "no": 2356, + "code": "1F535", + "char": "🔵", + "name": "blue circle" + }, + { + "no": 2357, + "code": "1F3C1", + "char": "🏁", + "name": "chequered flag" + }, + { + "no": 2358, + "code": "1F6A9", + "char": "🚩", + "name": "triangular flag" + }, + { + "no": 2359, + "code": "1F38C", + "char": "🎌", + "name": "crossed flags" + }, + { + "no": 2360, + "code": "1F3F4", + "char": "🏴", + "name": "black flag" + }, + { + "no": 2361, + "code": "1F3F3", + "char": "🏳", + "name": "white flag" + }, + { + "no": 2362, + "code": "1F3F3 FE0F 200D 1F308", + "char": "🏳️‍🌈", + "name": "rainbow flag" + }, + { + "no": 2363, + "code": "1F1E6 1F1E8", + "char": "🇦🇨", + "name": "Ascension Island" + }, + { + "no": 2364, + "code": "1F1E6 1F1E9", + "char": "🇦🇩", + "name": "Andorra" + }, + { + "no": 2365, + "code": "1F1E6 1F1EA", + "char": "🇦🇪", + "name": "United Arab Emirates" + }, + { + "no": 2366, + "code": "1F1E6 1F1EB", + "char": "🇦🇫", + "name": "Afghanistan" + }, + { + "no": 2367, + "code": "1F1E6 1F1EC", + "char": "🇦🇬", + "name": "Antigua & Barbuda" + }, + { + "no": 2368, + "code": "1F1E6 1F1EE", + "char": "🇦🇮", + "name": "Anguilla" + }, + { + "no": 2369, + "code": "1F1E6 1F1F1", + "char": "🇦🇱", + "name": "Albania" + }, + { + "no": 2370, + "code": "1F1E6 1F1F2", + "char": "🇦🇲", + "name": "Armenia" + }, + { + "no": 2371, + "code": "1F1E6 1F1F4", + "char": "🇦🇴", + "name": "Angola" + }, + { + "no": 2372, + "code": "1F1E6 1F1F6", + "char": "🇦🇶", + "name": "Antarctica" + }, + { + "no": 2373, + "code": "1F1E6 1F1F7", + "char": "🇦🇷", + "name": "Argentina" + }, + { + "no": 2374, + "code": "1F1E6 1F1F8", + "char": "🇦🇸", + "name": "American Samoa" + }, + { + "no": 2375, + "code": "1F1E6 1F1F9", + "char": "🇦🇹", + "name": "Austria" + }, + { + "no": 2376, + "code": "1F1E6 1F1FA", + "char": "🇦🇺", + "name": "Australia" + }, + { + "no": 2377, + "code": "1F1E6 1F1FC", + "char": "🇦🇼", + "name": "Aruba" + }, + { + "no": 2378, + "code": "1F1E6 1F1FD", + "char": "🇦🇽", + "name": "Åland Islands" + }, + { + "no": 2379, + "code": "1F1E6 1F1FF", + "char": "🇦🇿", + "name": "Azerbaijan" + }, + { + "no": 2380, + "code": "1F1E7 1F1E6", + "char": "🇧🇦", + "name": "Bosnia & Herzegovina" + }, + { + "no": 2381, + "code": "1F1E7 1F1E7", + "char": "🇧🇧", + "name": "Barbados" + }, + { + "no": 2382, + "code": "1F1E7 1F1E9", + "char": "🇧🇩", + "name": "Bangladesh" + }, + { + "no": 2383, + "code": "1F1E7 1F1EA", + "char": "🇧🇪", + "name": "Belgium" + }, + { + "no": 2384, + "code": "1F1E7 1F1EB", + "char": "🇧🇫", + "name": "Burkina Faso" + }, + { + "no": 2385, + "code": "1F1E7 1F1EC", + "char": "🇧🇬", + "name": "Bulgaria" + }, + { + "no": 2386, + "code": "1F1E7 1F1ED", + "char": "🇧🇭", + "name": "Bahrain" + }, + { + "no": 2387, + "code": "1F1E7 1F1EE", + "char": "🇧🇮", + "name": "Burundi" + }, + { + "no": 2388, + "code": "1F1E7 1F1EF", + "char": "🇧🇯", + "name": "Benin" + }, + { + "no": 2389, + "code": "1F1E7 1F1F1", + "char": "🇧🇱", + "name": "St. Barthélemy" + }, + { + "no": 2390, + "code": "1F1E7 1F1F2", + "char": "🇧🇲", + "name": "Bermuda" + }, + { + "no": 2391, + "code": "1F1E7 1F1F3", + "char": "🇧🇳", + "name": "Brunei" + }, + { + "no": 2392, + "code": "1F1E7 1F1F4", + "char": "🇧🇴", + "name": "Bolivia" + }, + { + "no": 2393, + "code": "1F1E7 1F1F6", + "char": "🇧🇶", + "name": "Caribbean Netherlands" + }, + { + "no": 2394, + "code": "1F1E7 1F1F7", + "char": "🇧🇷", + "name": "Brazil" + }, + { + "no": 2395, + "code": "1F1E7 1F1F8", + "char": "🇧🇸", + "name": "Bahamas" + }, + { + "no": 2396, + "code": "1F1E7 1F1F9", + "char": "🇧🇹", + "name": "Bhutan" + }, + { + "no": 2397, + "code": "1F1E7 1F1FB", + "char": "🇧🇻", + "name": "Bouvet Island" + }, + { + "no": 2398, + "code": "1F1E7 1F1FC", + "char": "🇧🇼", + "name": "Botswana" + }, + { + "no": 2399, + "code": "1F1E7 1F1FE", + "char": "🇧🇾", + "name": "Belarus" + }, + { + "no": 2400, + "code": "1F1E7 1F1FF", + "char": "🇧🇿", + "name": "Belize" + }, + { + "no": 2401, + "code": "1F1E8 1F1E6", + "char": "🇨🇦", + "name": "Canada" + }, + { + "no": 2402, + "code": "1F1E8 1F1E8", + "char": "🇨🇨", + "name": "Cocos (Keeling) Islands" + }, + { + "no": 2403, + "code": "1F1E8 1F1E9", + "char": "🇨🇩", + "name": "Congo - Kinshasa" + }, + { + "no": 2404, + "code": "1F1E8 1F1EB", + "char": "🇨🇫", + "name": "Central African Republic" + }, + { + "no": 2405, + "code": "1F1E8 1F1EC", + "char": "🇨🇬", + "name": "Congo - Brazzaville" + }, + { + "no": 2406, + "code": "1F1E8 1F1ED", + "char": "🇨🇭", + "name": "Switzerland" + }, + { + "no": 2407, + "code": "1F1E8 1F1EE", + "char": "🇨🇮", + "name": "Côte d’Ivoire" + }, + { + "no": 2408, + "code": "1F1E8 1F1F0", + "char": "🇨🇰", + "name": "Cook Islands" + }, + { + "no": 2409, + "code": "1F1E8 1F1F1", + "char": "🇨🇱", + "name": "Chile" + }, + { + "no": 2410, + "code": "1F1E8 1F1F2", + "char": "🇨🇲", + "name": "Cameroon" + }, + { + "no": 2411, + "code": "1F1E8 1F1F3", + "char": "🇨🇳", + "name": "China" + }, + { + "no": 2412, + "code": "1F1E8 1F1F4", + "char": "🇨🇴", + "name": "Colombia" + }, + { + "no": 2413, + "code": "1F1E8 1F1F5", + "char": "🇨🇵", + "name": "Clipperton Island" + }, + { + "no": 2414, + "code": "1F1E8 1F1F7", + "char": "🇨🇷", + "name": "Costa Rica" + }, + { + "no": 2415, + "code": "1F1E8 1F1FA", + "char": "🇨🇺", + "name": "Cuba" + }, + { + "no": 2416, + "code": "1F1E8 1F1FB", + "char": "🇨🇻", + "name": "Cape Verde" + }, + { + "no": 2417, + "code": "1F1E8 1F1FC", + "char": "🇨🇼", + "name": "Curaçao" + }, + { + "no": 2418, + "code": "1F1E8 1F1FD", + "char": "🇨🇽", + "name": "Christmas Island" + }, + { + "no": 2419, + "code": "1F1E8 1F1FE", + "char": "🇨🇾", + "name": "Cyprus" + }, + { + "no": 2420, + "code": "1F1E8 1F1FF", + "char": "🇨🇿", + "name": "Czechia" + }, + { + "no": 2421, + "code": "1F1E9 1F1EA", + "char": "🇩🇪", + "name": "Germany" + }, + { + "no": 2422, + "code": "1F1E9 1F1EC", + "char": "🇩🇬", + "name": "Diego Garcia" + }, + { + "no": 2423, + "code": "1F1E9 1F1EF", + "char": "🇩🇯", + "name": "Djibouti" + }, + { + "no": 2424, + "code": "1F1E9 1F1F0", + "char": "🇩🇰", + "name": "Denmark" + }, + { + "no": 2425, + "code": "1F1E9 1F1F2", + "char": "🇩🇲", + "name": "Dominica" + }, + { + "no": 2426, + "code": "1F1E9 1F1F4", + "char": "🇩🇴", + "name": "Dominican Republic" + }, + { + "no": 2427, + "code": "1F1E9 1F1FF", + "char": "🇩🇿", + "name": "Algeria" + }, + { + "no": 2428, + "code": "1F1EA 1F1E6", + "char": "🇪🇦", + "name": "Ceuta & Melilla" + }, + { + "no": 2429, + "code": "1F1EA 1F1E8", + "char": "🇪🇨", + "name": "Ecuador" + }, + { + "no": 2430, + "code": "1F1EA 1F1EA", + "char": "🇪🇪", + "name": "Estonia" + }, + { + "no": 2431, + "code": "1F1EA 1F1EC", + "char": "🇪🇬", + "name": "Egypt" + }, + { + "no": 2432, + "code": "1F1EA 1F1ED", + "char": "🇪🇭", + "name": "Western Sahara" + }, + { + "no": 2433, + "code": "1F1EA 1F1F7", + "char": "🇪🇷", + "name": "Eritrea" + }, + { + "no": 2434, + "code": "1F1EA 1F1F8", + "char": "🇪🇸", + "name": "Spain" + }, + { + "no": 2435, + "code": "1F1EA 1F1F9", + "char": "🇪🇹", + "name": "Ethiopia" + }, + { + "no": 2436, + "code": "1F1EA 1F1FA", + "char": "🇪🇺", + "name": "European Union" + }, + { + "no": 2437, + "code": "1F1EB 1F1EE", + "char": "🇫🇮", + "name": "Finland" + }, + { + "no": 2438, + "code": "1F1EB 1F1EF", + "char": "🇫🇯", + "name": "Fiji" + }, + { + "no": 2439, + "code": "1F1EB 1F1F0", + "char": "🇫🇰", + "name": "Falkland Islands" + }, + { + "no": 2440, + "code": "1F1EB 1F1F2", + "char": "🇫🇲", + "name": "Micronesia" + }, + { + "no": 2441, + "code": "1F1EB 1F1F4", + "char": "🇫🇴", + "name": "Faroe Islands" + }, + { + "no": 2442, + "code": "1F1EB 1F1F7", + "char": "🇫🇷", + "name": "France" + }, + { + "no": 2443, + "code": "1F1EC 1F1E6", + "char": "🇬🇦", + "name": "Gabon" + }, + { + "no": 2444, + "code": "1F1EC 1F1E7", + "char": "🇬🇧", + "name": "United Kingdom" + }, + { + "no": 2445, + "code": "1F1EC 1F1E9", + "char": "🇬🇩", + "name": "Grenada" + }, + { + "no": 2446, + "code": "1F1EC 1F1EA", + "char": "🇬🇪", + "name": "Georgia" + }, + { + "no": 2447, + "code": "1F1EC 1F1EB", + "char": "🇬🇫", + "name": "French Guiana" + }, + { + "no": 2448, + "code": "1F1EC 1F1EC", + "char": "🇬🇬", + "name": "Guernsey" + }, + { + "no": 2449, + "code": "1F1EC 1F1ED", + "char": "🇬🇭", + "name": "Ghana" + }, + { + "no": 2450, + "code": "1F1EC 1F1EE", + "char": "🇬🇮", + "name": "Gibraltar" + }, + { + "no": 2451, + "code": "1F1EC 1F1F1", + "char": "🇬🇱", + "name": "Greenland" + }, + { + "no": 2452, + "code": "1F1EC 1F1F2", + "char": "🇬🇲", + "name": "Gambia" + }, + { + "no": 2453, + "code": "1F1EC 1F1F3", + "char": "🇬🇳", + "name": "Guinea" + }, + { + "no": 2454, + "code": "1F1EC 1F1F5", + "char": "🇬🇵", + "name": "Guadeloupe" + }, + { + "no": 2455, + "code": "1F1EC 1F1F6", + "char": "🇬🇶", + "name": "Equatorial Guinea" + }, + { + "no": 2456, + "code": "1F1EC 1F1F7", + "char": "🇬🇷", + "name": "Greece" + }, + { + "no": 2457, + "code": "1F1EC 1F1F8", + "char": "🇬🇸", + "name": "South Georgia & South Sandwich Islands" + }, + { + "no": 2458, + "code": "1F1EC 1F1F9", + "char": "🇬🇹", + "name": "Guatemala" + }, + { + "no": 2459, + "code": "1F1EC 1F1FA", + "char": "🇬🇺", + "name": "Guam" + }, + { + "no": 2460, + "code": "1F1EC 1F1FC", + "char": "🇬🇼", + "name": "Guinea-Bissau" + }, + { + "no": 2461, + "code": "1F1EC 1F1FE", + "char": "🇬🇾", + "name": "Guyana" + }, + { + "no": 2462, + "code": "1F1ED 1F1F0", + "char": "🇭🇰", + "name": "Hong Kong SAR China" + }, + { + "no": 2463, + "code": "1F1ED 1F1F2", + "char": "🇭🇲", + "name": "Heard & McDonald Islands" + }, + { + "no": 2464, + "code": "1F1ED 1F1F3", + "char": "🇭🇳", + "name": "Honduras" + }, + { + "no": 2465, + "code": "1F1ED 1F1F7", + "char": "🇭🇷", + "name": "Croatia" + }, + { + "no": 2466, + "code": "1F1ED 1F1F9", + "char": "🇭🇹", + "name": "Haiti" + }, + { + "no": 2467, + "code": "1F1ED 1F1FA", + "char": "🇭🇺", + "name": "Hungary" + }, + { + "no": 2468, + "code": "1F1EE 1F1E8", + "char": "🇮🇨", + "name": "Canary Islands" + }, + { + "no": 2469, + "code": "1F1EE 1F1E9", + "char": "🇮🇩", + "name": "Indonesia" + }, + { + "no": 2470, + "code": "1F1EE 1F1EA", + "char": "🇮🇪", + "name": "Ireland" + }, + { + "no": 2471, + "code": "1F1EE 1F1F1", + "char": "🇮🇱", + "name": "Israel" + }, + { + "no": 2472, + "code": "1F1EE 1F1F2", + "char": "🇮🇲", + "name": "Isle of Man" + }, + { + "no": 2473, + "code": "1F1EE 1F1F3", + "char": "🇮🇳", + "name": "India" + }, + { + "no": 2474, + "code": "1F1EE 1F1F4", + "char": "🇮🇴", + "name": "British Indian Ocean Territory" + }, + { + "no": 2475, + "code": "1F1EE 1F1F6", + "char": "🇮🇶", + "name": "Iraq" + }, + { + "no": 2476, + "code": "1F1EE 1F1F7", + "char": "🇮🇷", + "name": "Iran" + }, + { + "no": 2477, + "code": "1F1EE 1F1F8", + "char": "🇮🇸", + "name": "Iceland" + }, + { + "no": 2478, + "code": "1F1EE 1F1F9", + "char": "🇮🇹", + "name": "Italy" + }, + { + "no": 2479, + "code": "1F1EF 1F1EA", + "char": "🇯🇪", + "name": "Jersey" + }, + { + "no": 2480, + "code": "1F1EF 1F1F2", + "char": "🇯🇲", + "name": "Jamaica" + }, + { + "no": 2481, + "code": "1F1EF 1F1F4", + "char": "🇯🇴", + "name": "Jordan" + }, + { + "no": 2482, + "code": "1F1EF 1F1F5", + "char": "🇯🇵", + "name": "Japan" + }, + { + "no": 2483, + "code": "1F1F0 1F1EA", + "char": "🇰🇪", + "name": "Kenya" + }, + { + "no": 2484, + "code": "1F1F0 1F1EC", + "char": "🇰🇬", + "name": "Kyrgyzstan" + }, + { + "no": 2485, + "code": "1F1F0 1F1ED", + "char": "🇰🇭", + "name": "Cambodia" + }, + { + "no": 2486, + "code": "1F1F0 1F1EE", + "char": "🇰🇮", + "name": "Kiribati" + }, + { + "no": 2487, + "code": "1F1F0 1F1F2", + "char": "🇰🇲", + "name": "Comoros" + }, + { + "no": 2488, + "code": "1F1F0 1F1F3", + "char": "🇰🇳", + "name": "St. Kitts & Nevis" + }, + { + "no": 2489, + "code": "1F1F0 1F1F5", + "char": "🇰🇵", + "name": "North Korea" + }, + { + "no": 2490, + "code": "1F1F0 1F1F7", + "char": "🇰🇷", + "name": "South Korea" + }, + { + "no": 2491, + "code": "1F1F0 1F1FC", + "char": "🇰🇼", + "name": "Kuwait" + }, + { + "no": 2492, + "code": "1F1F0 1F1FE", + "char": "🇰🇾", + "name": "Cayman Islands" + }, + { + "no": 2493, + "code": "1F1F0 1F1FF", + "char": "🇰🇿", + "name": "Kazakhstan" + }, + { + "no": 2494, + "code": "1F1F1 1F1E6", + "char": "🇱🇦", + "name": "Laos" + }, + { + "no": 2495, + "code": "1F1F1 1F1E7", + "char": "🇱🇧", + "name": "Lebanon" + }, + { + "no": 2496, + "code": "1F1F1 1F1E8", + "char": "🇱🇨", + "name": "St. Lucia" + }, + { + "no": 2497, + "code": "1F1F1 1F1EE", + "char": "🇱🇮", + "name": "Liechtenstein" + }, + { + "no": 2498, + "code": "1F1F1 1F1F0", + "char": "🇱🇰", + "name": "Sri Lanka" + }, + { + "no": 2499, + "code": "1F1F1 1F1F7", + "char": "🇱🇷", + "name": "Liberia" + }, + { + "no": 2500, + "code": "1F1F1 1F1F8", + "char": "🇱🇸", + "name": "Lesotho" + }, + { + "no": 2501, + "code": "1F1F1 1F1F9", + "char": "🇱🇹", + "name": "Lithuania" + }, + { + "no": 2502, + "code": "1F1F1 1F1FA", + "char": "🇱🇺", + "name": "Luxembourg" + }, + { + "no": 2503, + "code": "1F1F1 1F1FB", + "char": "🇱🇻", + "name": "Latvia" + }, + { + "no": 2504, + "code": "1F1F1 1F1FE", + "char": "🇱🇾", + "name": "Libya" + }, + { + "no": 2505, + "code": "1F1F2 1F1E6", + "char": "🇲🇦", + "name": "Morocco" + }, + { + "no": 2506, + "code": "1F1F2 1F1E8", + "char": "🇲🇨", + "name": "Monaco" + }, + { + "no": 2507, + "code": "1F1F2 1F1E9", + "char": "🇲🇩", + "name": "Moldova" + }, + { + "no": 2508, + "code": "1F1F2 1F1EA", + "char": "🇲🇪", + "name": "Montenegro" + }, + { + "no": 2509, + "code": "1F1F2 1F1EB", + "char": "🇲🇫", + "name": "St. Martin" + }, + { + "no": 2510, + "code": "1F1F2 1F1EC", + "char": "🇲🇬", + "name": "Madagascar" + }, + { + "no": 2511, + "code": "1F1F2 1F1ED", + "char": "🇲🇭", + "name": "Marshall Islands" + }, + { + "no": 2512, + "code": "1F1F2 1F1F0", + "char": "🇲🇰", + "name": "Macedonia" + }, + { + "no": 2513, + "code": "1F1F2 1F1F1", + "char": "🇲🇱", + "name": "Mali" + }, + { + "no": 2514, + "code": "1F1F2 1F1F2", + "char": "🇲🇲", + "name": "Myanmar (Burma)" + }, + { + "no": 2515, + "code": "1F1F2 1F1F3", + "char": "🇲🇳", + "name": "Mongolia" + }, + { + "no": 2516, + "code": "1F1F2 1F1F4", + "char": "🇲🇴", + "name": "Macau SAR China" + }, + { + "no": 2517, + "code": "1F1F2 1F1F5", + "char": "🇲🇵", + "name": "Northern Mariana Islands" + }, + { + "no": 2518, + "code": "1F1F2 1F1F6", + "char": "🇲🇶", + "name": "Martinique" + }, + { + "no": 2519, + "code": "1F1F2 1F1F7", + "char": "🇲🇷", + "name": "Mauritania" + }, + { + "no": 2520, + "code": "1F1F2 1F1F8", + "char": "🇲🇸", + "name": "Montserrat" + }, + { + "no": 2521, + "code": "1F1F2 1F1F9", + "char": "🇲🇹", + "name": "Malta" + }, + { + "no": 2522, + "code": "1F1F2 1F1FA", + "char": "🇲🇺", + "name": "Mauritius" + }, + { + "no": 2523, + "code": "1F1F2 1F1FB", + "char": "🇲🇻", + "name": "Maldives" + }, + { + "no": 2524, + "code": "1F1F2 1F1FC", + "char": "🇲🇼", + "name": "Malawi" + }, + { + "no": 2525, + "code": "1F1F2 1F1FD", + "char": "🇲🇽", + "name": "Mexico" + }, + { + "no": 2526, + "code": "1F1F2 1F1FE", + "char": "🇲🇾", + "name": "Malaysia" + }, + { + "no": 2527, + "code": "1F1F2 1F1FF", + "char": "🇲🇿", + "name": "Mozambique" + }, + { + "no": 2528, + "code": "1F1F3 1F1E6", + "char": "🇳🇦", + "name": "Namibia" + }, + { + "no": 2529, + "code": "1F1F3 1F1E8", + "char": "🇳🇨", + "name": "New Caledonia" + }, + { + "no": 2530, + "code": "1F1F3 1F1EA", + "char": "🇳🇪", + "name": "Niger" + }, + { + "no": 2531, + "code": "1F1F3 1F1EB", + "char": "🇳🇫", + "name": "Norfolk Island" + }, + { + "no": 2532, + "code": "1F1F3 1F1EC", + "char": "🇳🇬", + "name": "Nigeria" + }, + { + "no": 2533, + "code": "1F1F3 1F1EE", + "char": "🇳🇮", + "name": "Nicaragua" + }, + { + "no": 2534, + "code": "1F1F3 1F1F1", + "char": "🇳🇱", + "name": "Netherlands" + }, + { + "no": 2535, + "code": "1F1F3 1F1F4", + "char": "🇳🇴", + "name": "Norway" + }, + { + "no": 2536, + "code": "1F1F3 1F1F5", + "char": "🇳🇵", + "name": "Nepal" + }, + { + "no": 2537, + "code": "1F1F3 1F1F7", + "char": "🇳🇷", + "name": "Nauru" + }, + { + "no": 2538, + "code": "1F1F3 1F1FA", + "char": "🇳🇺", + "name": "Niue" + }, + { + "no": 2539, + "code": "1F1F3 1F1FF", + "char": "🇳🇿", + "name": "New Zealand" + }, + { + "no": 2540, + "code": "1F1F4 1F1F2", + "char": "🇴🇲", + "name": "Oman" + }, + { + "no": 2541, + "code": "1F1F5 1F1E6", + "char": "🇵🇦", + "name": "Panama" + }, + { + "no": 2542, + "code": "1F1F5 1F1EA", + "char": "🇵🇪", + "name": "Peru" + }, + { + "no": 2543, + "code": "1F1F5 1F1EB", + "char": "🇵🇫", + "name": "French Polynesia" + }, + { + "no": 2544, + "code": "1F1F5 1F1EC", + "char": "🇵🇬", + "name": "Papua New Guinea" + }, + { + "no": 2545, + "code": "1F1F5 1F1ED", + "char": "🇵🇭", + "name": "Philippines" + }, + { + "no": 2546, + "code": "1F1F5 1F1F0", + "char": "🇵🇰", + "name": "Pakistan" + }, + { + "no": 2547, + "code": "1F1F5 1F1F1", + "char": "🇵🇱", + "name": "Poland" + }, + { + "no": 2548, + "code": "1F1F5 1F1F2", + "char": "🇵🇲", + "name": "St. Pierre & Miquelon" + }, + { + "no": 2549, + "code": "1F1F5 1F1F3", + "char": "🇵🇳", + "name": "Pitcairn Islands" + }, + { + "no": 2550, + "code": "1F1F5 1F1F7", + "char": "🇵🇷", + "name": "Puerto Rico" + }, + { + "no": 2551, + "code": "1F1F5 1F1F8", + "char": "🇵🇸", + "name": "Palestinian Territories" + }, + { + "no": 2552, + "code": "1F1F5 1F1F9", + "char": "🇵🇹", + "name": "Portugal" + }, + { + "no": 2553, + "code": "1F1F5 1F1FC", + "char": "🇵🇼", + "name": "Palau" + }, + { + "no": 2554, + "code": "1F1F5 1F1FE", + "char": "🇵🇾", + "name": "Paraguay" + }, + { + "no": 2555, + "code": "1F1F6 1F1E6", + "char": "🇶🇦", + "name": "Qatar" + }, + { + "no": 2556, + "code": "1F1F7 1F1EA", + "char": "🇷🇪", + "name": "Réunion" + }, + { + "no": 2557, + "code": "1F1F7 1F1F4", + "char": "🇷🇴", + "name": "Romania" + }, + { + "no": 2558, + "code": "1F1F7 1F1F8", + "char": "🇷🇸", + "name": "Serbia" + }, + { + "no": 2559, + "code": "1F1F7 1F1FA", + "char": "🇷🇺", + "name": "Russia" + }, + { + "no": 2560, + "code": "1F1F7 1F1FC", + "char": "🇷🇼", + "name": "Rwanda" + }, + { + "no": 2561, + "code": "1F1F8 1F1E6", + "char": "🇸🇦", + "name": "Saudi Arabia" + }, + { + "no": 2562, + "code": "1F1F8 1F1E7", + "char": "🇸🇧", + "name": "Solomon Islands" + }, + { + "no": 2563, + "code": "1F1F8 1F1E8", + "char": "🇸🇨", + "name": "Seychelles" + }, + { + "no": 2564, + "code": "1F1F8 1F1E9", + "char": "🇸🇩", + "name": "Sudan" + }, + { + "no": 2565, + "code": "1F1F8 1F1EA", + "char": "🇸🇪", + "name": "Sweden" + }, + { + "no": 2566, + "code": "1F1F8 1F1EC", + "char": "🇸🇬", + "name": "Singapore" + }, + { + "no": 2567, + "code": "1F1F8 1F1ED", + "char": "🇸🇭", + "name": "St. Helena" + }, + { + "no": 2568, + "code": "1F1F8 1F1EE", + "char": "🇸🇮", + "name": "Slovenia" + }, + { + "no": 2569, + "code": "1F1F8 1F1EF", + "char": "🇸🇯", + "name": "Svalbard & Jan Mayen" + }, + { + "no": 2570, + "code": "1F1F8 1F1F0", + "char": "🇸🇰", + "name": "Slovakia" + }, + { + "no": 2571, + "code": "1F1F8 1F1F1", + "char": "🇸🇱", + "name": "Sierra Leone" + }, + { + "no": 2572, + "code": "1F1F8 1F1F2", + "char": "🇸🇲", + "name": "San Marino" + }, + { + "no": 2573, + "code": "1F1F8 1F1F3", + "char": "🇸🇳", + "name": "Senegal" + }, + { + "no": 2574, + "code": "1F1F8 1F1F4", + "char": "🇸🇴", + "name": "Somalia" + }, + { + "no": 2575, + "code": "1F1F8 1F1F7", + "char": "🇸🇷", + "name": "Suriname" + }, + { + "no": 2576, + "code": "1F1F8 1F1F8", + "char": "🇸🇸", + "name": "South Sudan" + }, + { + "no": 2577, + "code": "1F1F8 1F1F9", + "char": "🇸🇹", + "name": "São Tomé & Príncipe" + }, + { + "no": 2578, + "code": "1F1F8 1F1FB", + "char": "🇸🇻", + "name": "El Salvador" + }, + { + "no": 2579, + "code": "1F1F8 1F1FD", + "char": "🇸🇽", + "name": "Sint Maarten" + }, + { + "no": 2580, + "code": "1F1F8 1F1FE", + "char": "🇸🇾", + "name": "Syria" + }, + { + "no": 2581, + "code": "1F1F8 1F1FF", + "char": "🇸🇿", + "name": "Swaziland" + }, + { + "no": 2582, + "code": "1F1F9 1F1E6", + "char": "🇹🇦", + "name": "Tristan da Cunha" + }, + { + "no": 2583, + "code": "1F1F9 1F1E8", + "char": "🇹🇨", + "name": "Turks & Caicos Islands" + }, + { + "no": 2584, + "code": "1F1F9 1F1E9", + "char": "🇹🇩", + "name": "Chad" + }, + { + "no": 2585, + "code": "1F1F9 1F1EB", + "char": "🇹🇫", + "name": "French Southern Territories" + }, + { + "no": 2586, + "code": "1F1F9 1F1EC", + "char": "🇹🇬", + "name": "Togo" + }, + { + "no": 2587, + "code": "1F1F9 1F1ED", + "char": "🇹🇭", + "name": "Thailand" + }, + { + "no": 2588, + "code": "1F1F9 1F1EF", + "char": "🇹🇯", + "name": "Tajikistan" + }, + { + "no": 2589, + "code": "1F1F9 1F1F0", + "char": "🇹🇰", + "name": "Tokelau" + }, + { + "no": 2590, + "code": "1F1F9 1F1F1", + "char": "🇹🇱", + "name": "Timor-Leste" + }, + { + "no": 2591, + "code": "1F1F9 1F1F2", + "char": "🇹🇲", + "name": "Turkmenistan" + }, + { + "no": 2592, + "code": "1F1F9 1F1F3", + "char": "🇹🇳", + "name": "Tunisia" + }, + { + "no": 2593, + "code": "1F1F9 1F1F4", + "char": "🇹🇴", + "name": "Tonga" + }, + { + "no": 2594, + "code": "1F1F9 1F1F7", + "char": "🇹🇷", + "name": "Turkey" + }, + { + "no": 2595, + "code": "1F1F9 1F1F9", + "char": "🇹🇹", + "name": "Trinidad & Tobago" + }, + { + "no": 2596, + "code": "1F1F9 1F1FB", + "char": "🇹🇻", + "name": "Tuvalu" + }, + { + "no": 2597, + "code": "1F1F9 1F1FC", + "char": "🇹🇼", + "name": "Taiwan" + }, + { + "no": 2598, + "code": "1F1F9 1F1FF", + "char": "🇹🇿", + "name": "Tanzania" + }, + { + "no": 2599, + "code": "1F1FA 1F1E6", + "char": "🇺🇦", + "name": "Ukraine" + }, + { + "no": 2600, + "code": "1F1FA 1F1EC", + "char": "🇺🇬", + "name": "Uganda" + }, + { + "no": 2601, + "code": "1F1FA 1F1F2", + "char": "🇺🇲", + "name": "U.S. Outlying Islands" + }, + { + "no": 2602, + "code": "1F1FA 1F1F3", + "char": "🇺🇳", + "name": "United Nations" + }, + { + "no": 2603, + "code": "1F1FA 1F1F8", + "char": "🇺🇸", + "name": "United States" + }, + { + "no": 2604, + "code": "1F1FA 1F1FE", + "char": "🇺🇾", + "name": "Uruguay" + }, + { + "no": 2605, + "code": "1F1FA 1F1FF", + "char": "🇺🇿", + "name": "Uzbekistan" + }, + { + "no": 2606, + "code": "1F1FB 1F1E6", + "char": "🇻🇦", + "name": "Vatican City" + }, + { + "no": 2607, + "code": "1F1FB 1F1E8", + "char": "🇻🇨", + "name": "St. Vincent & Grenadines" + }, + { + "no": 2608, + "code": "1F1FB 1F1EA", + "char": "🇻🇪", + "name": "Venezuela" + }, + { + "no": 2609, + "code": "1F1FB 1F1EC", + "char": "🇻🇬", + "name": "British Virgin Islands" + }, + { + "no": 2610, + "code": "1F1FB 1F1EE", + "char": "🇻🇮", + "name": "U.S. Virgin Islands" + }, + { + "no": 2611, + "code": "1F1FB 1F1F3", + "char": "🇻🇳", + "name": "Vietnam" + }, + { + "no": 2612, + "code": "1F1FB 1F1FA", + "char": "🇻🇺", + "name": "Vanuatu" + }, + { + "no": 2613, + "code": "1F1FC 1F1EB", + "char": "🇼🇫", + "name": "Wallis & Futuna" + }, + { + "no": 2614, + "code": "1F1FC 1F1F8", + "char": "🇼🇸", + "name": "Samoa" + }, + { + "no": 2615, + "code": "1F1FD 1F1F0", + "char": "🇽🇰", + "name": "Kosovo" + }, + { + "no": 2616, + "code": "1F1FE 1F1EA", + "char": "🇾🇪", + "name": "Yemen" + }, + { + "no": 2617, + "code": "1F1FE 1F1F9", + "char": "🇾🇹", + "name": "Mayotte" + }, + { + "no": 2618, + "code": "1F1FF 1F1E6", + "char": "🇿🇦", + "name": "South Africa" + }, + { + "no": 2619, + "code": "1F1FF 1F1F2", + "char": "🇿🇲", + "name": "Zambia" + }, + { + "no": 2620, + "code": "1F1FF 1F1FC", + "char": "🇿🇼", + "name": "Zimbabwe" + }, + { + "no": 2621, + "code": "1F3F4 E0067 E0062 E0065 E006E E0067 E007F", + "char": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + "name": "⊛ England" + }, + { + "no": 2622, + "code": "1F3F4 E0067 E0062 E0073 E0063 E0074 E007F", + "char": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + "name": "⊛ Scotland" + }, + { + "no": 2623, + "code": "1F3F4 E0067 E0062 E0077 E006C E0073 E007F", + "char": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + "name": "⊛ Wales" + } +] diff --git a/data/gnome-shell-dbus-interfaces.gresource.xml b/data/gnome-shell-dbus-interfaces.gresource.xml new file mode 100644 index 0000000..3352e0d --- /dev/null +++ b/data/gnome-shell-dbus-interfaces.gresource.xml @@ -0,0 +1,57 @@ + + + + net.hadess.SensorProxy.xml + net.hadess.SwitcherooControl.xml + org.freedesktop.Application.xml + org.freedesktop.bolt1.Device.xml + org.freedesktop.bolt1.Manager.xml + org.freedesktop.DBus.xml + org.freedesktop.GeoClue2.Agent.xml + org.freedesktop.GeoClue2.Manager.xml + org.freedesktop.impl.portal.Access.xml + org.freedesktop.impl.portal.PermissionStore.xml + org.freedesktop.impl.portal.Request.xml + org.freedesktop.login1.Manager.xml + org.freedesktop.login1.Session.xml + org.freedesktop.login1.User.xml + org.freedesktop.ModemManager1.Modem.Modem3gpp.xml + org.freedesktop.ModemManager1.Modem.ModemCdma.xml + org.freedesktop.ModemManager1.Modem.xml + org.freedesktop.ModemManager.Modem.Cdma.xml + org.freedesktop.ModemManager.Modem.Gsm.Network.xml + org.freedesktop.Notifications.xml + org.freedesktop.PackageKit.Offline.xml + org.freedesktop.realmd.Provider.xml + org.freedesktop.realmd.Realm.xml + org.freedesktop.realmd.Service.xml + org.freedesktop.UPower.Device.xml + org.freedesktop.UPower.xml + org.gnome.Magnifier.xml + org.gnome.Magnifier.ZoomRegion.xml + org.gnome.ScreenSaver.xml + org.gnome.SessionManager.EndSessionDialog.xml + org.gnome.SessionManager.Inhibitor.xml + org.gnome.SessionManager.Presence.xml + org.gnome.SessionManager.xml + org.gnome.SettingsDaemon.Color.xml + org.gnome.SettingsDaemon.Power.Screen.xml + org.gnome.SettingsDaemon.Rfkill.xml + org.gnome.SettingsDaemon.Wacom.xml + org.gnome.Shell.AudioDeviceSelection.xml + org.gnome.Shell.CalendarServer.xml + org.gnome.Shell.Extensions.xml + org.gnome.Shell.Introspect.xml + org.gnome.Shell.HotplugSniffer.xml + org.gnome.Shell.PerfHelper.xml + org.gnome.Shell.PortalHelper.xml + org.gnome.Shell.Screencast.xml + org.gnome.Shell.Screenshot.xml + org.gnome.Shell.Wacom.PadOsd.xml + org.gnome.Shell.xml + org.Gtk.MountOperationHandler.xml + org.gtk.Notifications.xml + org.mpris.MediaPlayer2.Player.xml + org.mpris.MediaPlayer2.xml + + diff --git a/data/gnome-shell-extension-prefs.desktop.in.in b/data/gnome-shell-extension-prefs.desktop.in.in new file mode 100644 index 0000000..1b144c5 --- /dev/null +++ b/data/gnome-shell-extension-prefs.desktop.in.in @@ -0,0 +1,12 @@ +[Desktop Entry] +Type=Application +Name=Shell Extensions +Comment=Configure GNOME Shell Extensions +Exec=@bindir@/gnome-shell-extension-prefs %u +X-GNOME-Bugzilla-Bugzilla=GNOME +X-GNOME-Bugzilla-Product=gnome-shell +X-GNOME-Bugzilla-Component=extensions +X-GNOME-Bugzilla-Version=@VERSION@ +Categories=GNOME;GTK; +OnlyShowIn=GNOME; +NoDisplay=true diff --git a/data/gnome-shell-osk-layouts.gresource.xml b/data/gnome-shell-osk-layouts.gresource.xml new file mode 100644 index 0000000..8730e1d --- /dev/null +++ b/data/gnome-shell-osk-layouts.gresource.xml @@ -0,0 +1,60 @@ + + + + am.json + ara.json + be.json + bg.json + by.json + ca.json + cz.json + de.json + dk.json + ee.json + epo.json + es+cat.json + es.json + fi.json + fr.json + ge.json + gr.json + hr.json + hu.json + id.json + il.json + in+bolnagri.json + in+mal.json + ir.json + is.json + it.json + ke.json + kg.json + kh.json + la.json + latam.json + lt.json + lv.json + mk.json + mn.json + my.json + nl.json + no.json + ph.json + pl.json + pt.json + ro.json + rs.json + ru.json + se.json + si.json + sk.json + th.json + tr.json + ua.json + uk.json + us.json + vn.json + za.json + emoji.json + + diff --git a/data/gnome-shell-overrides-migration.desktop.in b/data/gnome-shell-overrides-migration.desktop.in new file mode 100644 index 0000000..99452e6 --- /dev/null +++ b/data/gnome-shell-overrides-migration.desktop.in @@ -0,0 +1,5 @@ +[Desktop Entry] +Type=Application +Name=GNOME settings overrides migration +NoDisplay=true +Exec=@libexecdir@/gnome-shell-overrides-migration.sh diff --git a/data/gnome-shell-overrides.convert b/data/gnome-shell-overrides.convert new file mode 100644 index 0000000..142790a --- /dev/null +++ b/data/gnome-shell-overrides.convert @@ -0,0 +1,4 @@ +[org.gnome.shell.overrides] +attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs +edge-tiling = /desktop/gnome/shell/windows/edge_tiling +workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml new file mode 100644 index 0000000..c05be6b --- /dev/null +++ b/data/gnome-shell-theme.gresource.xml @@ -0,0 +1,29 @@ + + + + calendar-today.svg + checkbox-focused.svg + checkbox-off-focused.svg + checkbox-off.svg + checkbox.svg + dash-placeholder.svg + gnome-shell.css + gnome-shell-high-contrast.css + key-enter.svg + key-hide.svg + key-layout.svg + key-shift.svg + key-shift-uppercase.svg + key-shift-latched-uppercase.svg + message-indicator-symbolic.svg + no-events.svg + no-notifications.svg + noise-texture.png + pad-osd.css + process-working.svg + toggle-off-intl.svg + toggle-off-hc.svg + toggle-on-intl.svg + toggle-on-hc.svg + + diff --git a/data/gnome-shell-wayland.target b/data/gnome-shell-wayland.target new file mode 100644 index 0000000..a75da3e --- /dev/null +++ b/data/gnome-shell-wayland.target @@ -0,0 +1,5 @@ +[Unit] +Description=GNOME Shell (wayland sync point) +After=gnome-shell.service +BindsTo=gnome-shell.service +Conflicts=gnome-shell-x11.target diff --git a/data/gnome-shell-x11.target b/data/gnome-shell-x11.target new file mode 100644 index 0000000..4da1350 --- /dev/null +++ b/data/gnome-shell-x11.target @@ -0,0 +1,5 @@ +[Unit] +Description=GNOME Shell (x11 sync point) +After=gnome-shell.service +BindsTo=gnome-shell.service +Conflicts=gnome-shell-wayland.target diff --git a/data/gnome-shell.portal b/data/gnome-shell.portal new file mode 100644 index 0000000..b704637 --- /dev/null +++ b/data/gnome-shell.portal @@ -0,0 +1,4 @@ +[portal] +DBusName=org.freedesktop.impl.portal.desktop.gnome +Interfaces=org.freedesktop.impl.portal.Access +UseIn=gnome diff --git a/data/gnome-shell.service.in b/data/gnome-shell.service.in new file mode 100644 index 0000000..ee275fa --- /dev/null +++ b/data/gnome-shell.service.in @@ -0,0 +1,11 @@ +[Unit] +Description=GNOME Shell +Wants=gnome-session.service +After=graphical-session-pre.target gnome-session-bus.target +PartOf=graphical-session.target + +[Service] +Type=dbus +ExecStart=@bindir@/gnome-shell +Restart=on-failure +BusName=org.gnome.Shell diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 0000000..31ac451 --- /dev/null +++ b/data/meson.build @@ -0,0 +1,121 @@ +desktop_files = [ + 'org.gnome.Shell.desktop', + 'gnome-shell-extension-prefs.desktop' +] +service_files = [] + +if have_networkmanager + desktop_files += 'org.gnome.Shell.PortalHelper.desktop' + service_files += 'org.gnome.Shell.PortalHelper.service' +endif + +desktopconf = configuration_data() +# We substitute in bindir so it works as an autostart +# file when built in a non-system prefix +desktopconf.set('bindir', bindir) +desktopconf.set('VERSION', meson.project_version()) +foreach desktop_file : desktop_files + i18n.merge_file('desktop', + input: configure_file( + input: desktop_file + '.in.in', + output: desktop_file + '.in', + configuration: desktopconf + ), + output: desktop_file, + po_dir: '../po', + install: true, + install_dir: desktopdir, + type: 'desktop' + ) +endforeach + +serviceconf = configuration_data() +serviceconf.set('libexecdir', libexecdir) +foreach service_file : service_files + configure_file( + input: service_file + '.in', + output: service_file, + configuration: serviceconf, + install_dir: servicedir + ) +endforeach + + +subdir('dbus-interfaces') +subdir('theme') + +data_resources = [ + ['dbus-interfaces', []], + ['osk-layouts', []], + ['theme', theme_deps] +] +foreach resource : data_resources + gnome.compile_resources( + 'gnome-shell-' + resource[0], + 'gnome-shell-@0@.gresource.xml'.format(resource[0]), + source_dir: resource[0], + dependencies: resource[1], + gresource_bundle: true, + install: true, + install_dir: pkgdatadir + ) +endforeach + +perfconf = configuration_data() +perfconf.set('datadir', datadir) +configure_file( + input: 'perf-background.xml.in', + output: 'perf-background.xml', + configuration: perfconf, + install_dir: pkgdatadir +) + + +install_data('gnome-shell.portal', install_dir: portaldir) +install_data('50-gnome-shell-system.xml', install_dir: keysdir) + + +schemaconf = configuration_data() +schemaconf.set('GETTEXT_PACKAGE', meson.project_name()) +schema = configure_file( + input: 'org.gnome.shell.gschema.xml.in', + output: 'org.gnome.shell.gschema.xml', + configuration: schemaconf, + install_dir: schemadir +) +install_data('00_org.gnome.shell.gschema.override', install_dir: schemadir) + +overrides_migration_conf = configuration_data() +overrides_migration_conf.set('libexecdir', libexecdir) +overrides_migration = configure_file( + input: 'gnome-shell-overrides-migration.desktop.in', + output: 'gnome-shell-overrides-migration.desktop', + configuration: overrides_migration_conf, + install_dir: autostartdir +) + +if have_systemd + unitconf = configuration_data() + unitconf.set('bindir', bindir) + + unit = configure_file( + input: 'gnome-shell.service.in', + output: 'gnome-shell.service', + configuration: unitconf, + install_dir: systemduserunitdir + ) + + units = files('gnome-shell-wayland.target', + 'gnome-shell-x11.target') + + install_data(units, install_dir: systemduserunitdir) +endif + +# for unit tests - gnome.compile_schemas() only looks in srcdir +custom_target('compile-schemas', + input: schema, + output: 'gschemas.compiled', + command: [find_program('glib-compile-schemas'), meson.current_build_dir()], + build_by_default: true) + +install_data('gnome-shell-overrides.convert', install_dir: convertdir) diff --git a/data/org.gnome.Shell.PortalHelper.desktop.in.in b/data/org.gnome.Shell.PortalHelper.desktop.in.in new file mode 100644 index 0000000..269669e --- /dev/null +++ b/data/org.gnome.Shell.PortalHelper.desktop.in.in @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Network Login +Type=Application +Exec=gapplication launch org.gnome.Shell.PortalHelper +DBusActivatable=true +NoDisplay=true +# Translators: Do NOT translate or transliterate this text (this is an icon file name)! +Icon=network-workgroup +StartupNotify=true +OnlyShowIn=GNOME; diff --git a/data/org.gnome.Shell.PortalHelper.service.in b/data/org.gnome.Shell.PortalHelper.service.in new file mode 100644 index 0000000..5465a32 --- /dev/null +++ b/data/org.gnome.Shell.PortalHelper.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.gnome.Shell.PortalHelper +Exec=@libexecdir@/gnome-shell-portal-helper diff --git a/data/org.gnome.Shell.desktop.in.in b/data/org.gnome.Shell.desktop.in.in new file mode 100644 index 0000000..09543e8 --- /dev/null +++ b/data/org.gnome.Shell.desktop.in.in @@ -0,0 +1,16 @@ +[Desktop Entry] +Type=Application +Name=GNOME Shell +Comment=Window management and application launching +Exec=@bindir@/gnome-shell +X-GNOME-Bugzilla-Bugzilla=GNOME +X-GNOME-Bugzilla-Product=gnome-shell +X-GNOME-Bugzilla-Component=general +X-GNOME-Bugzilla-Version=@VERSION@ +Categories=GNOME;GTK;Core; +OnlyShowIn=GNOME; +NoDisplay=true +X-GNOME-Autostart-Phase=DisplayServer +X-GNOME-Provides=panel;windowmanager; +X-GNOME-Autostart-Notify=true +X-GNOME-AutoRestart=false diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in new file mode 100644 index 0000000..24e2a75 --- /dev/null +++ b/data/org.gnome.shell.gschema.xml.in @@ -0,0 +1,281 @@ + + + + true + + Enable internal tools useful for developers and testers from Alt-F2 + + + Allows access to internal debugging and monitoring tools + using the Alt-F2 dialog. + + + + [] + UUIDs of extensions to enable + + GNOME Shell extensions have a UUID property; this key lists extensions + which should be loaded. Any extension that wants to be loaded needs + to be in this list. You can also manipulate this list with the + EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell. + + + + false + Disable user extensions + + Disable all extensions the user has enabled without affecting + the “enabled-extension” setting. + + + + true + Disables the validation of extension version compatibility + + GNOME Shell will only load extensions that claim to support the current + running version. Enabling this option will disable this check and try to + load all extensions regardless of the versions they claim to support. + + + + [ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ] + List of desktop file IDs for favorite applications + + The applications corresponding to these identifiers + will be displayed in the favorites area. + + + + 0 + App Picker View + + Index of the currently selected view in the application picker. + + + + [] + History for command (Alt-F2) dialog + + + [] + + History for the looking glass dialog + + + false + Always show the “Log out” menu item in the user menu. + + This key overrides the automatic hiding of the “Log out” + menu item in single-user, single-session situations. + + + + false + Whether to remember password for mounting encrypted or remote filesystems + + The shell will request a password when an encrypted device or a + remote filesystem is mounted. If the password can be saved for + future use a “Remember Password” checkbox will be present. + This key sets the default state of the checkbox. + + + + false + Whether the default Bluetooth adapter had set up devices associated to it + + The shell will only show a Bluetooth menu item if a Bluetooth + adapter is powered, or if there were devices set up associated + with the default adapter. This will be reset if the default + adapter is ever seen not to have devices associated to it. + + + + false + Enable introspection API + + Enables a D-Bus API that allows to introspect the application state of + the shell. + + + + + + + + + ["<Super>F10"] + Keybinding to open the application menu + + Keybinding to open the application menu. + + + + ["<Super>a"] + Keybinding to open the “Show Applications” view + + Keybinding to open the “Show Applications” view of the Activities + Overview. + + + + ["<Super>s"] + Keybinding to open the overview + + Keybinding to open the Activities Overview. + + + + ["<Super>v","<Super>m"] + Keybinding to toggle the visibility of the notification list + + Keybinding to toggle the visibility of the notification list. + + + + ["<Super>n"] + Keybinding to focus the active notification + + Keybinding to focus the active notification. + + + + [] + Keybinding that pauses and resumes all running tweens, for debugging purposes + + + + ["<Super>1"] + Switch to application 1 + + + ["<Super>2"] + Switch to application 2 + + + ["<Super>3"] + Switch to application 3 + + + ["<Super>4"] + Switch to application 4 + + + ["<Super>5"] + Switch to application 5 + + + ["<Super>6"] + Switch to application 6 + + + ["<Super>7"] + Switch to application 7 + + + ["<Super>8"] + Switch to application 8 + + + ["<Super>9"] + Switch to application 9 + + + + + + 'touch' + Which keyboard to use + + The type of keyboard to use. + + + + + + + false + Limit switcher to current workspace. + + If true, only applications that have windows on the current workspace are shown in the switcher. + Otherwise, all applications are included. + + + + + + + + + + + + 'both' + The application icon mode. + + Configures how the windows are shown in the switcher. Valid possibilities + are “thumbnail-only” (shows a thumbnail of the window), “app-icon-only” + (shows only the application icon) or “both”. + + + + true + Limit switcher to current workspace. + + If true, only windows from the current workspace are shown in the switcher. + Otherwise, all windows are included. + + + + + + + + true + Attach modal dialog to the parent window + + This key overrides the key in org.gnome.mutter when running + GNOME Shell. + + + + + true + Enable edge tiling when dropping windows on screen edges + + This key overrides the key in org.gnome.mutter when running GNOME Shell. + + + + + true + Workspaces are managed dynamically + + This key overrides the key in org.gnome.mutter when running GNOME Shell. + + + + + true + Workspaces only on primary monitor + + This key overrides the key in org.gnome.mutter when running GNOME Shell. + + + + + true + Delay focus changes in mouse mode until the pointer stops moving + + This key overrides the key in org.gnome.mutter when running GNOME Shell. + + + + diff --git a/data/osk-layouts/am.json b/data/osk-layouts/am.json new file mode 100644 index 0000000..23c86ba --- /dev/null +++ b/data/osk-layouts/am.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ara.json b/data/osk-layouts/ara.json new file mode 100644 index 0000000..0a4900c --- /dev/null +++ b/data/osk-layouts/ara.json @@ -0,0 +1,488 @@ +{ + "levels": [ + { + "level": "", + "mode": "default", + "rows": [ + [ + [ + "ض" + ], + [ + "ص" + ], + [ + "ث" + ], + [ + "ق", + "ڨ" + ], + [ + "ف", + "ڤ", + "ڢ", + "ڥ" + ], + [ + "غ" + ], + [ + "ع" + ], + [ + "ه", + "ه‍" + ], + [ + "خ" + ], + [ + "ح" + ], + [ + "ج", + "چ" + ] + ], + [ + [ + "ش", + "ڜ" + ], + [ + "س" + ], + [ + "ي", + "ئ", + "ى" + ], + [ + "ب", + "پ" + ], + [ + "ل", + "لا", + "لأ", + "لإ", + "لآ" + ], + [ + "ا", + "آ", + "ء", + "أ", + "إ", + "ٱ" + ], + [ + "ت" + ], + [ + "ن" + ], + [ + "م" + ], + [ + "ك", + "گ", + "ک" + ], + [ + "ط" + ] + ], + [ + [ + "ذ" + ], + [ + "ء" + ], + [ + "ؤ" + ], + [ + "ر" + ], + [ + "ى", + "ئ" + ], + [ + "ة" + ], + [ + "و" + ], + [ + "ز", + "ژ" + ], + [ + "ظ" + ], + [ + "د" + ] + ], + [ + [ + "،" + ], + [ + " " + ], + [ + ".", + "\"", + "'", + "#", + "-", + ":", + "!", + "،", + "؟", + "@", + "&", + "%", + "+", + "؛", + "/", + ")", + "(" + ] + ] + ] + }, + { + "level": "opt", + "mode": "locked", + "rows": [ + [ + [ + "١", + "¹", + "½", + "⅓", + "¼", + "⅛" + ], + [ + "٢", + "²", + "⅔" + ], + [ + "٣", + "³", + "¾", + "⅜" + ], + [ + "٤", + "⁴" + ], + [ + "٥", + "⅝" + ], + [ + "٦" + ], + [ + "٧", + "⅞" + ], + [ + "٨" + ], + [ + "٩" + ], + [ + "٠", + "ⁿ", + "∅" + ] + ], + [ + [ + "@" + ], + [ + "#" + ], + [ + "$", + "¢", + "£", + "€", + "¥", + "₱" + ], + [ + "٪", + "%", + "‰" + ], + [ + "&" + ], + [ + "-", + "_", + "–", + "—", + "·" + ], + [ + "+", + "±" + ], + [ + "(", + "﴿", + ">", + "}", + "]" + ], + [ + ")", + "﴾", + "<", + "{", + "[" + ] + ], + [ + [ + "*", + "★", + "٭" + ], + [ + "\"", + "“", + "”", + "«", + "»" + ], + [ + "'", + "‘", + "’", + "‹", + "›" + ], + [ + ":" + ], + [ + "؛", + ";" + ], + [ + "!", + "¡" + ], + [ + "؟", + "?" + ] + ], + [ + [ + "_" + ], + [ + "/" + ], + [ + " " + ], + [ + "،", + "؟", + "؛", + "!", + ":", + "-", + "/", + "'", + "\"" + ], + [ + ".", + "ٕ", + "ٔ", + "ْ", + "ٍ", + "ٌ", + "ً", + "ّ", + "ٖ", + "ٰ", + "ٓ", + "ِ", + "ُ", + "َ", + "ـ" + ] + ] + ] + }, + { + "level": "opt+shift", + "mode": "locked", + "rows": [ + [ + [ + "~" + ], + [ + "`" + ], + [ + "|" + ], + [ + "•", + "♪" + ], + [ + "√" + ], + [ + "Π", + "π" + ], + [ + "÷" + ], + [ + "×" + ], + [ + "¶", + "§" + ], + [ + "∆" + ] + ], + [ + [ + "£" + ], + [ + "¢" + ], + [ + "€" + ], + [ + "¥" + ], + [ + "^", + "↑", + "↓", + "←", + "→" + ], + [ + "°", + "′", + "″" + ], + [ + "=", + "≠", + "≈", + "∞" + ], + [ + "{" + ], + [ + "}" + ] + ], + [ + [ + "\\" + ], + [ + "©" + ], + [ + "®" + ], + [ + "™" + ], + [ + "℅" + ], + [ + "[" + ], + [ + "]" + ] + ], + [ + [ + "<", + "›", + "≥", + "»" + ], + [ + ">", + "‹", + "≤", + "«" + ], + [ + " " + ], + [ + "،", + "؟", + "؛", + "!", + ":", + "-", + "/", + "'", + "\"" + ], + [ + ".", + "ٕ", + "ٔ", + "ْ", + "ٍ", + "ٌ", + "ً", + "ّ", + "ٖ", + "ٰ", + "ٓ", + "ِ", + "ُ", + "َ", + "ـ" + ] + ] + ] + } + ], + "locale": "ar", + "name": "Arabic" +} \ No newline at end of file diff --git a/data/osk-layouts/be.json b/data/osk-layouts/be.json new file mode 100644 index 0000000..2427916 --- /dev/null +++ b/data/osk-layouts/be.json @@ -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)" +} \ No newline at end of file diff --git a/data/osk-layouts/bg.json b/data/osk-layouts/bg.json new file mode 100644 index 0000000..5c8528f --- /dev/null +++ b/data/osk-layouts/bg.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/by.json b/data/osk-layouts/by.json new file mode 100644 index 0000000..1f98cd2 --- /dev/null +++ b/data/osk-layouts/by.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ca.json b/data/osk-layouts/ca.json new file mode 100644 index 0000000..2b2bedc --- /dev/null +++ b/data/osk-layouts/ca.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/cz.json b/data/osk-layouts/cz.json new file mode 100644 index 0000000..9bad074 --- /dev/null +++ b/data/osk-layouts/cz.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/de.json b/data/osk-layouts/de.json new file mode 100644 index 0000000..751a856 --- /dev/null +++ b/data/osk-layouts/de.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/dk.json b/data/osk-layouts/dk.json new file mode 100644 index 0000000..80df9ae --- /dev/null +++ b/data/osk-layouts/dk.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ee.json b/data/osk-layouts/ee.json new file mode 100644 index 0000000..5fd2f11 --- /dev/null +++ b/data/osk-layouts/ee.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/epo.json b/data/osk-layouts/epo.json new file mode 100644 index 0000000..71f9ef8 --- /dev/null +++ b/data/osk-layouts/epo.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/es+cat.json b/data/osk-layouts/es+cat.json new file mode 100644 index 0000000..d0bd125 --- /dev/null +++ b/data/osk-layouts/es+cat.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/es.json b/data/osk-layouts/es.json new file mode 100644 index 0000000..0bb5d72 --- /dev/null +++ b/data/osk-layouts/es.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/fi.json b/data/osk-layouts/fi.json new file mode 100644 index 0000000..3ba5b56 --- /dev/null +++ b/data/osk-layouts/fi.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/fr.json b/data/osk-layouts/fr.json new file mode 100644 index 0000000..dd572b1 --- /dev/null +++ b/data/osk-layouts/fr.json @@ -0,0 +1,614 @@ +{ + "levels": [ + { + "level": "", + "mode": "default", + "rows": [ + [ + [ + "a", + "à", + "â", + "%", + "æ", + "á", + "ä", + "ã", + "å", + "ā", + "ª" + ], + [ + "z" + ], + [ + "e", + "é", + "è", + "ê", + "ë", + "%", + "ę", + "ė", + "ē" + ], + [ + "r" + ], + [ + "t" + ], + [ + "y", + "%", + "ÿ" + ], + [ + "u", + "ù", + "û", + "%", + "ü", + "ú", + "ū" + ], + [ + "i", + "î", + "%", + "ï", + "ì", + "í", + "į", + "ī" + ], + [ + "o", + "ô", + "œ", + "%", + "ö", + "ò", + "ó", + "õ", + "ø", + "ō", + "º" + ], + [ + "p" + ] + ], + [ + [ + "q" + ], + [ + "s" + ], + [ + "d" + ], + [ + "f" + ], + [ + "g" + ], + [ + "h" + ], + [ + "j" + ], + [ + "k" + ], + [ + "l" + ], + [ + "m" + ] + ], + [ + [ + "w" + ], + [ + "x" + ], + [ + "c", + "ç", + "ć", + "č" + ], + [ + "v" + ], + [ + "b" + ], + [ + "n" + ], + [ + "'", + "‘", + "’", + "‹", + "›" + ] + ], + [ + [ + "," + ], + [ + " " + ], + [ + ".", + "#", + "!", + ",", + "?", + "-", + ":", + "'", + "@" + ] + ] + ] + }, + { + "level": "shift", + "mode": "latched", + "rows": [ + [ + [ + "A", + "À", + "Â", + "%", + "Æ", + "Á", + "Ä", + "Ã", + "Å", + "Ā", + "ª" + ], + [ + "Z" + ], + [ + "E", + "É", + "È", + "Ê", + "Ë", + "%", + "Ę", + "Ė", + "Ē" + ], + [ + "R" + ], + [ + "T" + ], + [ + "Y", + "%", + "Ÿ" + ], + [ + "U", + "Ù", + "Û", + "%", + "Ü", + "Ú", + "Ū" + ], + [ + "I", + "Î", + "%", + "Ï", + "Ì", + "Í", + "Į", + "Ī" + ], + [ + "O", + "Ô", + "Œ", + "%", + "Ö", + "Ò", + "Ó", + "Õ", + "Ø", + "Ō", + "º" + ], + [ + "P" + ] + ], + [ + [ + "Q" + ], + [ + "S" + ], + [ + "D" + ], + [ + "F" + ], + [ + "G" + ], + [ + "H" + ], + [ + "J" + ], + [ + "K" + ], + [ + "L" + ], + [ + "M" + ] + ], + [ + [ + "W" + ], + [ + "X" + ], + [ + "C", + "Ç", + "Ć", + "Č" + ], + [ + "V" + ], + [ + "B" + ], + [ + "N" + ], + [ + "'", + "‘", + "’", + "‹", + "›" + ] + ], + [ + [ + "," + ], + [ + " " + ], + [ + ".", + "#", + "!", + ",", + "?", + "-", + ":", + "'", + "@" + ] + ] + ] + }, + { + "level": "opt", + "mode": "locked", + "rows": [ + [ + [ + "1", + "¹", + "½", + "⅓", + "¼", + "⅛" + ], + [ + "2", + "²", + "⅔" + ], + [ + "3", + "³", + "¾", + "⅜" + ], + [ + "4", + "⁴" + ], + [ + "5", + "⅝" + ], + [ + "6" + ], + [ + "7", + "⅞" + ], + [ + "8" + ], + [ + "9" + ], + [ + "0", + "ⁿ", + "∅" + ] + ], + [ + [ + "@" + ], + [ + "#" + ], + [ + "€", + "¢", + "£", + "$", + "¥", + "₱" + ], + [ + "%", + "‰" + ], + [ + "&" + ], + [ + "-", + "_", + "–", + "—", + "·" + ], + [ + "+", + "±" + ], + [ + "(", + "<", + "{", + "[" + ], + [ + ")", + ">", + "}", + "]" + ] + ], + [ + [ + "*", + "†", + "‡", + "★" + ], + [ + "\"", + "“", + "”", + "«", + "»" + ], + [ + "'", + "‘", + "’", + "‹", + "›" + ], + [ + ":" + ], + [ + ";" + ], + [ + "!", + "¡" + ], + [ + "?", + "¿" + ] + ], + [ + [ + "_" + ], + [ + "/" + ], + [ + " " + ], + [ + "," + ], + [ + ".", + "…" + ] + ] + ] + }, + { + "level": "opt+shift", + "mode": "locked", + "rows": [ + [ + [ + "~" + ], + [ + "`" + ], + [ + "|" + ], + [ + "•", + "♪", + "♥", + "♠", + "♦", + "♣" + ], + [ + "√" + ], + [ + "Π", + "π" + ], + [ + "÷" + ], + [ + "×" + ], + [ + "¶", + "§" + ], + [ + "∆" + ] + ], + [ + [ + "£" + ], + [ + "¥" + ], + [ + "$", + "¢" + ], + [ + "¢" + ], + [ + "^", + "↑", + "↓", + "←", + "→" + ], + [ + "°", + "′", + "″" + ], + [ + "=", + "≠", + "≈", + "∞" + ], + [ + "{" + ], + [ + "}" + ] + ], + [ + [ + "\\" + ], + [ + "©" + ], + [ + "®" + ], + [ + "™" + ], + [ + "℅" + ], + [ + "[" + ], + [ + "]" + ] + ], + [ + [ + "<", + "‹", + "≤", + "«" + ], + [ + ">", + "›", + "≥", + "»" + ], + [ + " " + ], + [ + "," + ], + [ + ".", + "…" + ] + ] + ] + } + ], + "locale": "fr", + "name": "French" +} \ No newline at end of file diff --git a/data/osk-layouts/ge.json b/data/osk-layouts/ge.json new file mode 100644 index 0000000..a94b3ba --- /dev/null +++ b/data/osk-layouts/ge.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/gr.json b/data/osk-layouts/gr.json new file mode 100644 index 0000000..b2337e5 --- /dev/null +++ b/data/osk-layouts/gr.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/hr.json b/data/osk-layouts/hr.json new file mode 100644 index 0000000..ff0d1d0 --- /dev/null +++ b/data/osk-layouts/hr.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/hu.json b/data/osk-layouts/hu.json new file mode 100644 index 0000000..9bcc532 --- /dev/null +++ b/data/osk-layouts/hu.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/id.json b/data/osk-layouts/id.json new file mode 100644 index 0000000..2342962 --- /dev/null +++ b/data/osk-layouts/id.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/il.json b/data/osk-layouts/il.json new file mode 100644 index 0000000..76dd588 --- /dev/null +++ b/data/osk-layouts/il.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/in+bolnagri.json b/data/osk-layouts/in+bolnagri.json new file mode 100644 index 0000000..36f10ac --- /dev/null +++ b/data/osk-layouts/in+bolnagri.json @@ -0,0 +1,439 @@ +{ + "levels": [ + { + "level": "", + "mode": "default", + "rows": [ + [ + [ + "◌ौ" + ], + [ + "◌ै" + ], + [ + "◌ा" + ], + [ + "◌ी" + ], + [ + "◌ू" + ], + [ + "ब", + "ब॒", + "%" + ], + [ + "ह" + ], + [ + "ग", + "ज्ञ", + "ग़", + "ग॒", + "%" + ], + [ + "द" + ], + [ + "ज", + "ज॒", + "ज्ञ", + "ज़", + "%" + ], + [ + "ड", + "ड॒", + "ड़" + ] + ], + [ + [ + "◌ो" + ], + [ + "◌े" + ], + [ + "◌्" + ], + [ + "◌ि" + ], + [ + "◌ु" + ], + [ + "प" + ], + [ + "र", + "ऋ", + "ऱ", + "ॠ" + ], + [ + "क", + "क़" + ], + [ + "त", + "त्र" + ], + [ + "च" + ], + [ + "ट" + ] + ], + [ + [ + "◌ॉ" + ], + [ + "◌ं" + ], + [ + "म", + "ॐ" + ], + [ + "न", + "ञ", + "ङ", + "ऩ" + ], + [ + "व" + ], + [ + "ल", + "ऌ", + "ॡ" + ], + [ + "स" + ], + [ + "य", + "य़" + ], + [ + "◌़" + ] + ], + [ + [ + "," + ], + [ + " " + ], + [ + ".", + "#", + "!", + ",", + "?", + "-", + ":", + "'", + "@" + ] + ] + ] + }, + { + "level": "opt", + "mode": "locked", + "rows": [ + [ + [ + "१", + "¹", + "½", + "⅓", + "¼", + "⅛" + ], + [ + "२", + "²", + "⅔" + ], + [ + "३", + "³", + "¾", + "⅜" + ], + [ + "४", + "⁴" + ], + [ + "५", + "⅝" + ], + [ + "६" + ], + [ + "७", + "⅞" + ], + [ + "८" + ], + [ + "९" + ], + [ + "०", + "ⁿ", + "∅" + ] + ], + [ + [ + "@" + ], + [ + "#" + ], + [ + "₹", + "$", + "¢", + "€", + "£", + "¥", + "₱" + ], + [ + "%", + "‰" + ], + [ + "&" + ], + [ + "-", + "_", + "–", + "—", + "·" + ], + [ + "+", + "±" + ], + [ + "(", + "<", + "{", + "[" + ], + [ + ")", + ">", + "}", + "]" + ] + ], + [ + [ + "*", + "†", + "‡", + "★" + ], + [ + "\"", + "“", + "”", + "«", + "»" + ], + [ + "'", + "‘", + "’", + "‹", + "›" + ], + [ + ":" + ], + [ + ";" + ], + [ + "!", + "¡" + ], + [ + "?", + "¿" + ] + ], + [ + [ + "_" + ], + [ + "/" + ], + [ + " " + ], + [ + "," + ], + [ + ".", + "…" + ] + ] + ] + }, + { + "level": "opt+shift", + "mode": "locked", + "rows": [ + [ + [ + "~" + ], + [ + "`" + ], + [ + "|" + ], + [ + "•", + "♪", + "♥", + "♠", + "♦", + "♣" + ], + [ + "√" + ], + [ + "Π", + "π" + ], + [ + "÷" + ], + [ + "×" + ], + [ + "¶", + "§" + ], + [ + "∆" + ] + ], + [ + [ + "£" + ], + [ + "€" + ], + [ + "$", + "¢" + ], + [ + "¢" + ], + [ + "^", + "↑", + "↓", + "←", + "→" + ], + [ + "°", + "′", + "″" + ], + [ + "=", + "≠", + "≈", + "∞" + ], + [ + "{" + ], + [ + "}" + ] + ], + [ + [ + "\\" + ], + [ + "©" + ], + [ + "®" + ], + [ + "™" + ], + [ + "℅" + ], + [ + "[" + ], + [ + "]" + ] + ], + [ + [ + "<", + "‹", + "≤", + "«" + ], + [ + ">", + "›", + "≥", + "»" + ], + [ + " " + ], + [ + "," + ], + [ + ".", + "…" + ] + ] + ] + } + ], + "locale": "hi", + "name": "Hindi" +} \ No newline at end of file diff --git a/data/osk-layouts/in+mal.json b/data/osk-layouts/in+mal.json new file mode 100644 index 0000000..bc153be --- /dev/null +++ b/data/osk-layouts/in+mal.json @@ -0,0 +1,559 @@ +{ + "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": "ml", + "name": "Malayalam" +} diff --git a/data/osk-layouts/ir.json b/data/osk-layouts/ir.json new file mode 100644 index 0000000..a773b14 --- /dev/null +++ b/data/osk-layouts/ir.json @@ -0,0 +1,495 @@ +{ + "levels": [ + { + "level": "", + "mode": "default", + "rows": [ + [ + [ + "ض" + ], + [ + "ص" + ], + [ + "ث" + ], + [ + "ق", + "ڨ" + ], + [ + "ف", + "ڤ", + "ڢ", + "ڥ" + ], + [ + "غ" + ], + [ + "ع" + ], + [ + "ه", + "ه‍" + ], + [ + "خ" + ], + [ + "ح" + ], + [ + "ج", + "چ" + ] + ], + [ + [ + "ش", + "ڜ" + ], + [ + "س" + ], + [ + "ي", + "ئ", + "ى" + ], + [ + "ب", + "پ" + ], + [ + "ل", + "لا", + "لأ", + "لإ", + "لآ" + ], + [ + "ا", + "آ", + "ء", + "أ", + "إ", + "ٱ" + ], + [ + "ت" + ], + [ + "ن" + ], + [ + "م" + ], + [ + "ك", + "گ", + "ک" + ], + [ + "ط" + ] + ], + [ + [ + "ذ" + ], + [ + "ء" + ], + [ + "ؤ" + ], + [ + "ر" + ], + [ + "ى", + "ئ" + ], + [ + "ة" + ], + [ + "و" + ], + [ + "ز", + "ژ" + ], + [ + "ظ" + ], + [ + "د" + ] + ], + [ + [ + "،" + ], + [ + " " + ], + [ + " " + ], + [ + ".", + "\"", + "'", + "#", + "-", + ":", + "!", + "،", + "؟", + "@", + "&", + "%", + "+", + "؛", + "/", + ")", + "(" + ] + ] + ] + }, + { + "level": "opt", + "mode": "locked", + "rows": [ + [ + [ + "۱", + "¹", + "½", + "⅓", + "¼", + "⅛" + ], + [ + "۲", + "²", + "⅔" + ], + [ + "۳", + "³", + "¾", + "⅜" + ], + [ + "۴", + "⁴" + ], + [ + "۵", + "⅝" + ], + [ + "۶" + ], + [ + "۷", + "⅞" + ], + [ + "۸" + ], + [ + "۹" + ], + [ + "۰", + "ⁿ", + "∅" + ] + ], + [ + [ + "٬", + "@" + ], + [ + "٫", + "#" + ], + [ + "﷼", + "$", + "¢", + "€", + "£", + "¥", + "₱" + ], + [ + "٪", + "%", + "‰" + ], + [ + "&" + ], + [ + "-", + "_", + "–", + "—", + "·" + ], + [ + "+", + "±" + ], + [ + "(", + "﴿", + ">", + "}", + "]" + ], + [ + ")", + "﴾", + "<", + "{", + "[" + ] + ], + [ + [ + "*", + "★", + "٭" + ], + [ + "«", + "“", + "”", + "«", + "»" + ], + [ + "»", + "‘", + "’", + "‹", + "›" + ], + [ + ":" + ], + [ + "؛", + ";" + ], + [ + "!", + "¡" + ], + [ + "؟", + "?" + ] + ], + [ + [ + "_" + ], + [ + "/" + ], + [ + " " + ], + [ + "،", + ":", + "!", + "؟", + "؛", + "-", + "/", + "»", + "«" + ], + [ + ".", + "ٕ", + "ٔ", + "ْ", + "ٍ", + "ٌ", + "ً", + "ّ", + "ٖ", + "ٰ", + "ٓ", + "ِ", + "ُ", + "َ", + "ـ" + ] + ] + ] + }, + { + "level": "opt+shift", + "mode": "locked", + "rows": [ + [ + [ + "~" + ], + [ + "`" + ], + [ + "|" + ], + [ + "•", + "♪" + ], + [ + "√" + ], + [ + "Π", + "π" + ], + [ + "÷" + ], + [ + "×" + ], + [ + "¶", + "§" + ], + [ + "∆" + ] + ], + [ + [ + "£" + ], + [ + "€" + ], + [ + "$", + "¢" + ], + [ + "¢" + ], + [ + "^", + "↑", + "↓", + "←", + "→" + ], + [ + "°", + "′", + "″" + ], + [ + "=", + "≠", + "≈", + "∞" + ], + [ + "{" + ], + [ + "}" + ] + ], + [ + [ + "\\" + ], + [ + "©" + ], + [ + "®" + ], + [ + "™" + ], + [ + "℅" + ], + [ + "[" + ], + [ + "]" + ] + ], + [ + [ + "«", + "›", + "≥", + ">" + ], + [ + "»", + "‹", + "≤", + "<" + ], + [ + " " + ], + [ + "،", + ":", + "!", + "؟", + "؛", + "-", + "/", + "»", + "«" + ], + [ + ".", + "ٕ", + "ٔ", + "ْ", + "ٍ", + "ٌ", + "ً", + "ّ", + "ٖ", + "ٰ", + "ٓ", + "ِ", + "ُ", + "َ", + "ـ" + ] + ] + ] + } + ], + "locale": "fa", + "name": "Persian" +} \ No newline at end of file diff --git a/data/osk-layouts/is.json b/data/osk-layouts/is.json new file mode 100644 index 0000000..b53df32 --- /dev/null +++ b/data/osk-layouts/is.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/it.json b/data/osk-layouts/it.json new file mode 100644 index 0000000..d865266 --- /dev/null +++ b/data/osk-layouts/it.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ke.json b/data/osk-layouts/ke.json new file mode 100644 index 0000000..9c3e935 --- /dev/null +++ b/data/osk-layouts/ke.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/kg.json b/data/osk-layouts/kg.json new file mode 100644 index 0000000..b56915a --- /dev/null +++ b/data/osk-layouts/kg.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/kh.json b/data/osk-layouts/kh.json new file mode 100644 index 0000000..e5d34cb --- /dev/null +++ b/data/osk-layouts/kh.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/la.json b/data/osk-layouts/la.json new file mode 100644 index 0000000..aedff60 --- /dev/null +++ b/data/osk-layouts/la.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/latam.json b/data/osk-layouts/latam.json new file mode 100644 index 0000000..4095c7a --- /dev/null +++ b/data/osk-layouts/latam.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/lt.json b/data/osk-layouts/lt.json new file mode 100644 index 0000000..7cd5352 --- /dev/null +++ b/data/osk-layouts/lt.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/lv.json b/data/osk-layouts/lv.json new file mode 100644 index 0000000..bab6ae3 --- /dev/null +++ b/data/osk-layouts/lv.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/mk.json b/data/osk-layouts/mk.json new file mode 100644 index 0000000..2815121 --- /dev/null +++ b/data/osk-layouts/mk.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/mn.json b/data/osk-layouts/mn.json new file mode 100644 index 0000000..88eaa24 --- /dev/null +++ b/data/osk-layouts/mn.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/my.json b/data/osk-layouts/my.json new file mode 100644 index 0000000..dfd5e09 --- /dev/null +++ b/data/osk-layouts/my.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/nl.json b/data/osk-layouts/nl.json new file mode 100644 index 0000000..7a630b4 --- /dev/null +++ b/data/osk-layouts/nl.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/no.json b/data/osk-layouts/no.json new file mode 100644 index 0000000..037f12c --- /dev/null +++ b/data/osk-layouts/no.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ph.json b/data/osk-layouts/ph.json new file mode 100644 index 0000000..8d127b5 --- /dev/null +++ b/data/osk-layouts/ph.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/pl.json b/data/osk-layouts/pl.json new file mode 100644 index 0000000..4b08cd5 --- /dev/null +++ b/data/osk-layouts/pl.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/pt.json b/data/osk-layouts/pt.json new file mode 100644 index 0000000..efd857a --- /dev/null +++ b/data/osk-layouts/pt.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ro.json b/data/osk-layouts/ro.json new file mode 100644 index 0000000..c690f4e --- /dev/null +++ b/data/osk-layouts/ro.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/rs.json b/data/osk-layouts/rs.json new file mode 100644 index 0000000..7bdab9f --- /dev/null +++ b/data/osk-layouts/rs.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ru.json b/data/osk-layouts/ru.json new file mode 100644 index 0000000..9126cb0 --- /dev/null +++ b/data/osk-layouts/ru.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/se.json b/data/osk-layouts/se.json new file mode 100644 index 0000000..513a0b8 --- /dev/null +++ b/data/osk-layouts/se.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/si.json b/data/osk-layouts/si.json new file mode 100644 index 0000000..f5c99c0 --- /dev/null +++ b/data/osk-layouts/si.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/sk.json b/data/osk-layouts/sk.json new file mode 100644 index 0000000..678232b --- /dev/null +++ b/data/osk-layouts/sk.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/th.json b/data/osk-layouts/th.json new file mode 100644 index 0000000..c229a64 --- /dev/null +++ b/data/osk-layouts/th.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/tr.json b/data/osk-layouts/tr.json new file mode 100644 index 0000000..b3786cc --- /dev/null +++ b/data/osk-layouts/tr.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/ua.json b/data/osk-layouts/ua.json new file mode 100644 index 0000000..1185687 --- /dev/null +++ b/data/osk-layouts/ua.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/uk.json b/data/osk-layouts/uk.json new file mode 100644 index 0000000..c36a723 --- /dev/null +++ b/data/osk-layouts/uk.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/us.json b/data/osk-layouts/us.json new file mode 100644 index 0000000..94dd6d3 --- /dev/null +++ b/data/osk-layouts/us.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/vn.json b/data/osk-layouts/vn.json new file mode 100644 index 0000000..4c7c9b4 --- /dev/null +++ b/data/osk-layouts/vn.json @@ -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" +} \ No newline at end of file diff --git a/data/osk-layouts/za.json b/data/osk-layouts/za.json new file mode 100644 index 0000000..ccd2447 --- /dev/null +++ b/data/osk-layouts/za.json @@ -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" +} \ No newline at end of file diff --git a/data/perf-background.xml.in b/data/perf-background.xml.in new file mode 100644 index 0000000..752a552 --- /dev/null +++ b/data/perf-background.xml.in @@ -0,0 +1,31 @@ + + + + 1990 + 1 + 1 + 0 + 00 + 00 + + + + +1261440000.0 +@datadir@/backgrounds/gnome/adwaita-morning.jpg +@datadir@/backgrounds/gnome/adwaita-day.jpg + + + + +60 +/usr/share/backgrounds/gnome/Sandstone.jpg + + + diff --git a/data/theme/README.md b/data/theme/README.md new file mode 100644 index 0000000..192dc65 --- /dev/null +++ b/data/theme/README.md @@ -0,0 +1,32 @@ +## Summary + +Do not edit the CSS directly, edit the source SCSS files and the CSS files +will be generated automatically when building with meson + ninja and left +inside the build directory to be incorporated into the gresource XML (you'll +need to have sassc installed). + +## How to tweak the theme + +Adwaita is a complex theme, so to keep it maintainable it's written and +processed in SASS, the generated CSS is then transformed into a gresource +file during gtk build and used at runtime in a non-legible or editable form. + +It is very likely your change will happen in the [_common.scss][common] file. +That's where all the widget selectors are defined. Here's a rundown of +the "supporting" stylesheets, that are unlikely to be the right place +for a drive by stylesheet fix: + +| File | Description | +| ------------------------ | ----------------- | +| [_colors.scss][colors] | global color definitions. We keep the number of defined colors to a necessary minimum, most colors are derived from a handful of basics. It is an exact copy of the gtk+ counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell default. | +| [_drawing.scss][drawing] | drawing helper mixings/functions to allow easier definition of widget drawing under specific context. This is why Adwaita isn't 15000 LOC. | +| [_common.scss][common] | actual definitions of style for each widget. This is where you are likely to add/remove your changes. | + +You can read about SASS on its [web page][sass-web]. Once you make your +changes to the [_common.scss][common] file, you can run ninja to generate the +final CSS files. + +[common]: data/theme/gnome-shell-sass/_common.scss +[colors]: data/theme/gnome-shell-sass/_colors.scss +[drawing]: data/theme/gnome-shell-sass/_drawing.scss +[sass-web]: http://sass-lang.com/documentation/ diff --git a/data/theme/calendar-today.svg b/data/theme/calendar-today.svg new file mode 100644 index 0000000..5e77084 --- /dev/null +++ b/data/theme/calendar-today.svg @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/data/theme/checkbox-focused.svg b/data/theme/checkbox-focused.svg new file mode 100644 index 0000000..9d15354 --- /dev/null +++ b/data/theme/checkbox-focused.svg @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/data/theme/checkbox-off-focused.svg b/data/theme/checkbox-off-focused.svg new file mode 100644 index 0000000..428bafe --- /dev/null +++ b/data/theme/checkbox-off-focused.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/data/theme/checkbox-off.svg b/data/theme/checkbox-off.svg new file mode 100644 index 0000000..2c7a951 --- /dev/null +++ b/data/theme/checkbox-off.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/data/theme/checkbox.svg b/data/theme/checkbox.svg new file mode 100644 index 0000000..ec66846 --- /dev/null +++ b/data/theme/checkbox.svg @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/data/theme/dash-placeholder.svg b/data/theme/dash-placeholder.svg new file mode 100644 index 0000000..cbae148 --- /dev/null +++ b/data/theme/dash-placeholder.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/theme/gnome-shell-high-contrast.scss b/data/theme/gnome-shell-high-contrast.scss new file mode 100644 index 0000000..23279ca --- /dev/null +++ b/data/theme/gnome-shell-high-contrast.scss @@ -0,0 +1,14 @@ +@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors +@import "gnome-shell-sass/_drawing"; +@import "gnome-shell-sass/_common"; + +//force symbolic icons +stage { + -st-icon-style: symbolic; +} + +.toggle-switch { width: 48px; } +.toggle-switch-us, .toggle-switch-intl { + background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg"); + &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); } +} diff --git a/data/theme/gnome-shell-sass/COPYING b/data/theme/gnome-shell-sass/COPYING new file mode 100644 index 0000000..e55e5b8 --- /dev/null +++ b/data/theme/gnome-shell-sass/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/data/theme/gnome-shell-sass/NEWS b/data/theme/gnome-shell-sass/NEWS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/data/theme/gnome-shell-sass/NEWS diff --git a/data/theme/gnome-shell-sass/README.md b/data/theme/gnome-shell-sass/README.md new file mode 100644 index 0000000..a5f219a --- /dev/null +++ b/data/theme/gnome-shell-sass/README.md @@ -0,0 +1,16 @@ +# GNOME Shell Sass +GNOME Shell Sass is a project intended to allow the sharing of the +theme sources in sass between gnome-shell and other projects like +gnome-shell-extensions. + +Any changes should be done in the [GNOME Shell subtree][shell-subtree] +and not the stand-alone [gnome-shell-sass repository][sass-repo]. They +will then be synchronized periodically before releases. + +## License +GNOME Shell Sass is distributed under the terms of the GNU General Public +License, version 2 or later. See the [COPYING][license] file for details. + +[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass +[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass +[license]: COPYING diff --git a/data/theme/gnome-shell-sass/_colors.scss b/data/theme/gnome-shell-sass/_colors.scss new file mode 100644 index 0000000..0a851f3 --- /dev/null +++ b/data/theme/gnome-shell-sass/_colors.scss @@ -0,0 +1,41 @@ +// When color definition differs for dark and light variant, +// it gets @if ed depending on $variant + + +$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%)); +$bg_color: if($variant == 'light', #f6f5f4, desaturate(#3d3846, 10%)); +$fg_color: if($variant == 'light', #2e3436, #eeeeec); + +$selected_fg_color: #ffffff; +$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%)); +$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%)); +$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%)); +$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93)); +$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%)); +$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%)); +$top_hilight: $borders_edge; + +$warning_color: #f57900; +$error_color: #ff8080; +$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%)); +$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%)); + +$osd_fg_color: #eeeeec; +$osd_bg_color: #2e3436; +$osd_borders_color: transparentize(black, 0.3); +$osd_outer_borders_color: transparentize(white, 0.9); + +$tooltip_borders_color: $osd_outer_borders_color; + +//insensitive state derived colors +$insensitive_fg_color: mix($fg_color, $bg_color, 50%); +$insensitive_bg_color: mix($bg_color, $base_color, 60%); +$insensitive_borders_color: $borders_color; + +//colors for the backdrop state, derived from the main colors. +$backdrop_base_color: if($variant =='light', darken($base_color,1%), lighten($base_color,1%)); +$backdrop_bg_color: $bg_color; +$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%); +$backdrop_insensitive_color: if($variant =='light', darken($backdrop_bg_color,15%), lighten($backdrop_bg_color,15%)); +$backdrop_borders_color: mix($borders_color, $bg_color, 90%); +$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%); diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss new file mode 100644 index 0000000..a6357ba --- /dev/null +++ b/data/theme/gnome-shell-sass/_common.scss @@ -0,0 +1,2048 @@ +//This is the RIGHT PLACE to edit the stylesheet + +//let's start by telling people not to edit the generated CSS: +$cakeisalie: "This stylesheet is generated, DO NOT EDIT"; +/* #{$cakeisalie} */ + +$panel-corner-radius: 6px; + +/* Copyright 2009, 2015 Red Hat, Inc. + * + * Portions adapted from Mx's data/style/default.css + * Copyright 2009 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + */ + + +/* GLOBALS */ +$font-size: 11; +$font-family: Cantarell, Sans-Serif; +$_bubble_bg_color: opacify($osd_bg_color,0.25); +$_bubble_fg_color: $osd_fg_color; +$_bubble_borders_color: transparentize($osd_fg_color,0.8); + +stage { + font-family: $font-family; + @include fontsize($font-size); + color: $fg_color; +} + +/* WIDGETS */ + +/* Buttons */ +.button { + border-radius: 3px; + border-width: 1px; + padding: 4px 32px; + @include button(normal); + &:focus { @include button(focus); } + &:hover { @include button(hover); } + &:insensitive { @include button(insensitive); } + &:active { @include button(active); } +} + +.modal-dialog-linked-button { + border-right-width: 1px; + @include button(normal); + &:insensitive { @include button(insensitive); } + &:hover { @include button(hover); } + &:focus { @include button(focus); } + &:active { @include button(active); } + padding: 12px; + + &:first-child { + border-radius: 0px 0px 0px 6px; + } + &:last-child { + border-right-width: 0px; + border-radius: 0px 0px 6px 0px; + } + &:first-child:last-child { + border-right-width: 0px; + border-radius: 0px 0px 6px 6px; + } +} + +/* Entries */ +StEntry { + border-radius: 3px; + padding: 4px; + border-width: 1px; + color: $fg_color; + @include entry(normal); + //&:hover { @include entry(hover);} + &:focus { @include entry(focus,$fc:transparentize($fg_color,0.5));} + &:insensitive { @include entry(insensitive);} + selection-background-color: $selected_bg_color; + selected-color: $selected_fg_color; + StIcon.capslock-warning { + icon-size: 16px; + warning-color: $warning_color; + padding: 0 4px; + } +} + + +/* Scrollbars */ + +StScrollView { + &.vfade { -st-vfade-offset: 68px; } + &.hfade { -st-hfade-offset: 68px; } +} + +StScrollBar { + padding: 0; + + StScrollView & { + min-width: 14px; + min-height: 14px; + } + + StBin#trough { + border-radius: 0; + background-color: transparent; + } + + StButton#vhandle, StButton#hhandle { + border-radius: 8px; + background-color: mix($fg_color, $bg_color, 60%); + //border: 3px solid transparent; //would be nice to margin or at least to transparent + margin: 3px; + &:hover { background-color: mix($fg_color, $bg_color, 80%); } + &:active { background-color: $selected_bg_color; } + } +} + +/* Slider */ + +.slider { + height: 1em; + -barlevel-height: 0.3em; + -barlevel-background-color: $insensitive_bg_color; //background of the trough + -barlevel-border-color: $borders_color; //trough border color + -barlevel-active-background-color: $selected_bg_color; //active trough fill + -barlevel-active-border-color: darken($selected_bg_color,10%); //active trough border + -barlevel-overdrive-color: $destructive_color; + -barlevel-overdrive-border-color: darken($destructive_color,10%); + -barlevel-overdrive-separator-width: 0.2em; + -barlevel-border-width: 1px; + -slider-handle-radius: 6px; +} + +/* Check Boxes */ + +.check-box { + StBoxLayout { spacing: .8em; } + StBin { + width: 24px; + height: 22px; + background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); + } + &:focus StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); } + &:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); } + &:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); } +} + +/* Switches */ +.toggle-switch { + width: 46px; + height: 22px; + background-size: contain; + background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg"); + &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); } +} + +/* links */ +.shell-link { + color: $link_color; + &:hover { color: lighten($link_color,10%); } +} + +/* Modal Dialogs */ + +.headline { font-size: 110%; } +.lightbox { background-color: black; } +.flashspot { background-color: white; } + +.modal-dialog { + border-radius: 9px; + color: $osd_fg_color; + background-color: transparentize(darken($osd_bg_color,10%),0.05); + border: 1px solid $_bubble_borders_color; + .modal-dialog-content-box { + padding: 24px; + } + .run-dialog-entry { width: 20em; margin-bottom: 6px; } + .run-dialog-error-box { + padding-top: 16px; + spacing: 6px; + } + .run-dialog-button-box { padding-top: 1em; } + .run-dialog-label { + @include fontsize($font-size + 1.1); + font-weight: bold; + color: darken($osd_fg_color,10%); + padding-bottom: .4em; + } + +} + + .mount-dialog-subject, + .end-session-dialog-subject { //this should be a generic header class + @include fontsize($font-size * 1.3); + } + +/* Message Dialog */ + .message-dialog-main-layout { + padding: 12px 20px 0; + spacing: 12px; + } + + .message-dialog-content { + max-width: 28em; + spacing: 20px; + } + + .message-dialog-icon { + min-width: 48px; + icon-size: 48px; + } + + .message-dialog-title { + font-weight: bold; + } + + .message-dialog-subtitle { + color: darken($fg_color,40%); + font-weight: bold; + } + +/* End Session Dialog */ +.end-session-dialog { + spacing: 42px; + border: 1px solid $_bubble_borders_color; +} + + .end-session-dialog-list { + padding-top: 20px; + } + + .end-session-dialog-layout { + padding-left: 17px; + &:rtl { padding-right: 17px; } + } + + .end-session-dialog-description { + width: 28em; + padding-bottom: 10px; + &:rtl { + text-align: right; + } + } + + .end-session-dialog-warning { + width: 28em; + color: $warning_color; + padding-top: 6px; + &:rtl { + text-align: right; + } + } + + .end-session-dialog-logout-icon { + border-radius: 99px; + width: 48px; + height: 48px; + background-size: contain; + } + + .end-session-dialog-shutdown-icon { + color: $fg_color; + width: 48px; + height: 48px; + } + + .end-session-dialog-inhibitor-layout { + spacing: 16px; + max-height: 200px; + padding-right: 65px; + padding-left: 65px; + } + + .end-session-dialog-session-list, + .end-session-dialog-app-list { + spacing: 1em; + } + + .end-session-dialog-list-header { + font-weight: bold; + &:rtl { text-align: right; } + } + + .end-session-dialog-app-list-item, + .end-session-dialog-session-list-item { + spacing: 1em; + } + + .end-session-dialog-app-list-item-name, + .end-session-dialog-session-list-item-name { + font-weight: bold; + } + + .end-session-dialog-app-list-item-description { + color: darken($fg_color,5%); + font-size: 10pt; + } + +/* ShellMountOperation Dialogs */ +.shell-mount-operation-icon { icon-size: 48px; } + + .mount-dialog { + spacing: 24px; + + .message-dialog-title { + padding-top: 10px; + padding-left: 17px; + padding-bottom: 6px; + max-width: 34em; + } + + .message-dialog-title:rtl { + padding-left: 0px; + padding-right: 17px; + } + + .message-dialog-body { + padding-left: 17px; + width: 28em; + } + + .message-dialog-body:rtl { + padding-left: 0px; + padding-right: 17px; + } + } + + .mount-dialog-app-list { + max-height: 200px; + padding-top: 24px; + padding-left: 49px; + padding-right: 32px; + } + + .mount-dialog-app-list:rtl { + padding-right: 49px; + padding-left: 32px; + } + + .mount-dialog-app-list-item { + color: darken($fg_color,10%); + &:hover { color: $fg_color; } + &:ltr { padding-right: 1em; } + &:rtl { padding-left: 1em; } + } + + .mount-dialog-app-list-item-icon { + &:ltr { padding-right: 17px; } + &:rtl { padding-left: 17px; } + } + + .mount-dialog-app-list-item-name { + font-size: 10pt; + } + + +/* Password or Authentication Dialog */ + +.prompt-dialog { + //this is the width of the entire modal popup + width: 34em; + border: 3px solid $_bubble_borders_color; + + .message-dialog-main-layout { spacing: 24px; padding: 10px; } + .message-dialog-content { spacing: 16px; } + .message-dialog-title { color: darken($osd_fg_color,25%); } +} + + .prompt-dialog-description:rtl { + text-align: right; + } + + .prompt-dialog-password-box { + spacing: 1em; + padding-bottom: 1em; + } + + .prompt-dialog-error-label { + font-size: 10pt; + color: $warning_color; + padding-bottom: 8px; + } + + .prompt-dialog-info-label { + font-size: 10pt; + padding-bottom: 8px; + } + + .hidden { + color: rgba(0,0,0,0); + } + + .prompt-dialog-null-label { + font-size: 10pt; + padding-bottom: 8px; + } + + +/* Polkit Dialog */ + +.polkit-dialog-user-layout { + padding-left: 10px; + spacing: 10px; + &:rtl { + padding-left: 0px; + padding-right: 10px; + } +} + + .polkit-dialog-user-root-label { + color: $warning_color; + } + + .polkit-dialog-user-icon { + border-radius: 99px; + background-size: contain; + width: 48px; + height: 48px; + } + +/* Audio selection dialog */ +.audio-device-selection-dialog { + spacing: 30px; +} + + .audio-selection-content { + spacing: 20px; + padding: 24px; + } + + .audio-selection-title { + font-weight: bold; + text-align: center; + } + + .audio-selection-box { + spacing: 20px; + } + + .audio-selection-device { + border: 1px solid $_bubble_borders_color; + border-radius: 12px; + &:active,&:hover,&:focus { background-color: $selected_bg_color; } + } + + .audio-selection-device-box { + padding: 20px; + spacing: 20px; + } + + .audio-selection-device-icon { + icon-size: 64px; + } + +/* Access Dialog */ +.access-dialog { + spacing: 30px; +} + +/* Geolocation Dialog */ +.geolocation-dialog { + spacing: 30px; +} + +/* Extension Dialog */ +.extension-dialog { + .message-dialog-main-layout { spacing: 24px; padding: 10px; } + .message-dialog-title { color: darken($osd_fg_color,25%); } +} + +/* Inhibit-Shortcuts Dialog */ +.inhibit-shortcuts-dialog { + spacing: 30px; +} + +/* Network Agent Dialog */ + +.network-dialog-secret-table { + spacing-rows: 15px; + spacing-columns: 1em; +} + +.keyring-dialog-control-table { + spacing-rows: 15px; + spacing-columns: 1em; +} + +/* Popovers/Menus */ + +.popup-menu { + min-width: 15em; + + .popup-menu-arrow { } //defined globally in the TOP BAR + .popup-sub-menu { + padding-bottom: 1px; + background-color: darken($bg_color,2%); + box-shadow: inset 0 -1px 0px lighten($borders_color,5%); + } + + .popup-menu-content { padding: 1em 0em; } + .popup-menu-item { + spacing: 12px; + + &:ltr { padding: .4em 1.75em .4em 0em; } + &:rtl { padding: .4em 0em .4em 1.75em; } + &:checked { + background-color: darken($bg_color,2%); + box-shadow: inset 0 1px 0px lighten($borders_color,5%); + font-weight: bold; + } + &.selected { background-color: transparentize($fg_color,0.9); color: $fg_color; } + &:active { background-color: $selected_bg_color; color: $selected_fg_color; } + &:insensitive { color: transparentize($fg_color,.5); } + } + + .popup-inactive-menu-item { //all icons and other graphical elements + color: $fg_color; + + &:insensitive { color: transparentize($fg_color,0.5); } + } + //.popup-status-menu-item { font-weight: normal; color: pink; } //dunno what that is + &.panel-menu { + -boxpointer-gap: 4px; + margin-bottom: 1.75em; + } +} + + + + .popup-menu-ornament { + text-align: right; + width: 1.2em; + } + .popup-menu-boxpointer, + .candidate-popup-boxpointer { + -arrow-border-radius: 3px; + -arrow-background-color: $bg_color; + -arrow-border-width: 1px; + -arrow-border-color: $borders_color; + -arrow-base: 24px; + -arrow-rise: 11px; + -arrow-box-shadow: 0 1px 3px black; //dreaming. bug #689995 + } + + .popup-separator-menu-item { + //-margin-horizontal: 24px; + height: 1px; //not really the whole box + margin: 6px 64px; + background-color: transparent; + border-color: lighten($borders_color,10%); + border-bottom-width: 1px; + border-bottom-style: solid; + } + + +// Background menu +.background-menu { -boxpointer-gap: 4px; -arrow-rise: 0px; } + +/* fallback menu +- odd thing for styling App menu when apparently not running under shell. Light Adwaita styled + app menu inside the main app window itself rather than the top bar +*/ + + +/* OSD */ +.osd-window { + text-align: center; + font-weight: bold; + spacing: 1em; + margin: 32px; + min-width: 64px; + min-height: 64px; + + .osd-monitor-label { font-size: 3em; } + .level { + height: 0.6em; + -barlevel-height: 0.6em; + -barlevel-background-color: transparentize(darken($osd_bg_color,15%),0.5); + -barlevel-active-background-color: $osd_fg_color; + -barlevel-overdrive-color: $destructive_color; + -barlevel-overdrive-separator-width: 0.2em; + } +} + +/* Pad OSD */ +.pad-osd-window { + padding: 32px; + background-color: transparentize(black, 0.2); + + .pad-osd-title-box { spacing: 12px; } + .pad-osd-title-menu-box { spacing: 6px; } +} + +.combo-box-label { + width: 15em; +} + +/* App Switcher */ +.switcher-popup { + padding: 8px; + spacing: 16px; +} + +.osd-window, +.resize-popup, +.switcher-list { + @extend %osd-panel; +} + + .switcher-list-item-container { spacing: 8px; } + + .switcher-list .item-box { + padding: 8px; + border-radius: 4px; + } + + .switcher-list .item-box:outlined { + padding: 6px; + border: 2px solid darken($borders_color,10%); + } + + .switcher-list .item-box:selected { + background-color: $selected_bg_color; + color: $selected_fg_color; + } + + .switcher-list .thumbnail-box { + padding: 2px; + spacing: 4px; + } + + .switcher-list .thumbnail { + width: 256px; + } + + .switcher-list .separator { + width: 1px; + background: $borders_color; + } + + .switcher-arrow { + border-color: rgba(0,0,0,0); + color: transparentize($fg_color,0.2); + &:highlighted { + color: $fg_color; + } + } + + .input-source-switcher-symbol { + font-size: 34pt; + width: 96px; + height: 96px; + } + +/* Window Cycler */ +.cycler-highlight { border: 5px solid $selected_bg_color; } + +/* Workspace Switcher */ +.workspace-switcher-group { padding: 12px; } + + .workspace-switcher-container { + @extend %osd-panel; + } + + .workspace-switcher { + background: transparent; + border: 0px; + border-radius: 0px; + padding: 0px; + spacing: 8px; + } + + .ws-switcher-active-up, .ws-switcher-active-down { + height: 50px; + background-color: $selected_bg_color; + color: $selected_fg_color; + background-size: 32px; + border-radius: 8px; + } + + .ws-switcher-box { + height: 50px; + border: 1px solid transparentize($osd_fg_color,0.9); + background: transparent; + border-radius: 8px; + } + +%osd-panel { + color: $_bubble_fg_color; + background-color: $_bubble_bg_color; + border: 1px solid $_bubble_borders_color; + border-radius: 12px; + padding: 12px; +} + +/* Tiled window previews */ +.tile-preview { + background-color: transparentize($selected_bg_color,0.5); + border: 1px solid $selected_bg_color; +} + + .tile-preview-left.on-primary { + border-radius: $panel-corner-radius 0 0 0; + } + + .tile-preview-right.on-primary { + border-radius: 0 $panel-corner-radius 0 0; + } + + .tile-preview-left.tile-preview-right.on-primary { + border-radius: $panel-corner-radius $panel-corner-radius 0 0; + } + +/* TOP BAR */ + +#panel { + background-color: black; + font-weight: bold; + height: 1.86em; + font-feature-settings: "tnum"; + + &.unlock-screen, + &.login-screen, + &.lock-screen { + background-color: transparent; + } + + #panelLeft, #panelCenter { // spacing between activities<>app menu and such + spacing: 4px; + } + + .panel-corner { + -panel-corner-radius: $panel-corner-radius; + -panel-corner-background-color: black; + -panel-corner-border-width: 2px; + -panel-corner-border-color: transparent; + + &:active, &:overview, &:focus { + -panel-corner-border-color: lighten($selected_bg_color,5%); + } + + &.lock-screen, &.login-screen, &.unlock-screen { + -panel-corner-radius: 0; + -panel-corner-background-color: transparent; + -panel-corner-border-color: transparent; + } + } + + .panel-button { + -natural-hpadding: 12px; + -minimum-hpadding: 6px; + font-weight: bold; + color: #ccc; + + .app-menu-icon { + -st-icon-style: symbolic; + margin-left: 4px; + margin-right: 4px; + //dimensions of the icon are hardcoded + } + + &:hover { + color: lighten($fg_color, 10%); + } + + &:active, &:overview, &:focus, &:checked { + // Trick due to St limitations. It needs a background to draw + // a box-shadow + background-color: rgba(0, 0, 0, 0.01); + box-shadow: inset 0 -2px 0px lighten($selected_bg_color,5%); + color: lighten($fg_color,10%); + } + + .system-status-icon { icon-size: 1.09em; padding: 0 5px; } + .unlock-screen &, + .login-screen &, + .lock-screen & { + color: lighten($fg_color, 10%); + &:focus, &:hover, &:active { color: lighten($fg_color, 10%); } + } + } + + .panel-status-indicators-box, + .panel-status-menu-box { + spacing: 2px; + } + + // spacing between power icon and (optional) percentage label + .power-status.panel-status-indicators-box { + spacing: 0; + } + + .screencast-indicator { color: $warning_color; } + + .remote-access-indicator { color: $warning_color; } +} + + // calendar popover + #calendarArea { + padding: 0.75em 1.0em; + } + + .calendar { + margin-bottom: 1em; + } + + .calendar, + .datemenu-today-button, + .datemenu-displays-box, + .message-list-sections { + margin: 0 1.5em; + } + + .datemenu-calendar-column { spacing: 0.5em; } + .datemenu-displays-section { padding-bottom: 3em; } + .datemenu-displays-box { spacing: 1em; } + + .datemenu-calendar-column { + border: 0 solid lighten($bg_color,5%); + &:ltr { border-left-width: 1px; } + &:rtl { border-right-width: 1px; } + } + + .datemenu-today-button, + .world-clocks-button, + .weather-button, + .events-section-title { + border-radius: 4px; + padding: .4em; + } + + .message-list-section-list:ltr { + padding-left: .4em; + } + + .message-list-section-list:rtl { + padding-right: .4em; + } + + .datemenu-today-button, + .world-clocks-button, + .weather-button, + .events-section-title { + &:hover,&:focus { background-color: lighten($bg_color,5%); } + &:active { + color: lighten($selected_fg_color,5%); + background-color: $selected_bg_color; + } + } + + .datemenu-today-button .day-label { + } + + .datemenu-today-button .date-label { + font-size: 1.5em; + font-weight: 300; + } + + .world-clocks-header, + .weather-header, + .events-section-title { + color: darken($fg_color,40%); + font-weight: bold; + } + + .weather-header.location { + font-weight: normal; + font-size: 0.9em; + } + + .world-clocks-grid, + .weather-grid { + spacing-rows: 0.4em; + spacing-columns: 0.8em; + } + + .weather-box { + spacing: 0.4em; + } + + .world-clocks-city { + font-weight: bold; + font-size: 0.9em; + } + + .world-clocks-time { + color: darken($fg_color,20%); + font-feature-settings: "tnum"; + font-size: 1.2em; + } + + .world-clocks-timezone { + color: darken($fg_color,40%); + font-feature-settings: "tnum"; + font-size: 0.9em; + } + + .weather-forecast-icon { + icon-size: 2.18em; + } + + .weather-forecast-time { + color: darken($fg_color,40%); + font-size: 0.8em; + } + + .calendar-month-label { + color: darken($fg_color,5%); + font-weight: bold; + padding: 8px 0; + &:focus {} + } + + .pager-button { + background-color: transparent; + width: 32px; + border-radius: 4px; + &:hover, &:focus { background-color: transparentize($fg_color,0.95); } + &:active { background-color: transparentize($bg_color,0.95); } + } + + .calendar-change-month-back StIcon, .calendar-change-month-forward StIcon { // arrows + icon-size: 1.09em; + } + + .calendar-day-base { + font-size: 80%; + text-align: center; + width: 2.4em; height: 2.4em; + padding: 0.1em; + margin: 2px; + border-radius: 1.4em; + font-feature-settings: "tnum"; + &:hover,&:focus { background-color: lighten($bg_color,5%); } + &:active,&:selected { + color: lighten($selected_fg_color,5%); + background-color: $selected_bg_color; + border-color: transparent; //avoid jumparound due to today + } + &.calendar-day-heading { //day of week heading + color: darken($fg_color,40%); + margin-top: 1em; + font-size: 70%; + } + } + .calendar-day { //border collapse hack - see calendar.js + border-width: 0; + } + .calendar-day-top { border-top-width: 1px; } + .calendar-day-left { border-left-width: 1px; } + .calendar-work-day { + + } + .calendar-nonwork-day { + color: $insensitive_fg_color; + } + .calendar-today { + font-weight: bold; + //color: lighten($fg_color,10%); + //background-color: darken($bg_color,5%); + border: 1px solid transparentize($borders_color,0.5); + } + .calendar-day-with-events { + color: lighten($fg_color,10%); + font-weight: bold; + background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); + } + .calendar-other-month-day { + color: transparentize($fg_color,0.85); + opacity: 0.5; + } + .calendar-week-number { + font-size: 70%; + font-weight: bold; + width: 2.3em; height: 1.8em; + border-radius: 2px; + padding: 0.5em 0 0; + margin: 6px; + background-color: transparentize($fg_color,0.7); + color: $bg_color; + } + + /* Message list */ + .message-list { + width: 31.5em; + } + + .message-list-clear-button.button { + background-color: transparent; + &:hover,&:focus { background-color: lighten($bg_color,5%); } + margin: 1.5em 1.5em 0; + } + + .message-list-sections { + spacing: 1em; + } + + .message-list-section, + .message-list-section-list { + spacing: 0.4em; + } + + .message { + &:hover,&:focus { background-color: lighten($bg_color,5%); } + border-radius: 3px; + } + + .message-icon-bin { + padding: 0.68em 0.2em 0.68em 0.68em; + &:rtl { padding: 0.68em 0.68em 0.68em 0.2em; } + } + + .message-icon-bin > StIcon { + color: darken($fg_color,20%); + icon-size: 1.09em; + -st-icon-style: symbolic; + } + + .message-icon-bin > .fallback-window-icon { + width: 1.09em; + height: 1.09em; + } + + .message-secondary-bin { + padding: 0 0.82em;; + } + + .message-secondary-bin > .event-time { + color: darken($fg_color,40%); + font-size: 0.7em; + /* HACK: the label should be baseline-aligned with a 1em label, + fake this with some bottom padding */ + padding-bottom: 0.13em; + } + + .message-secondary-bin > StIcon { + icon-size: 1.09em; + } + + .message-title { + color: darken($fg_color,5%); + } + + .message-content { + color: darken($fg_color,20%); + padding: 10px; + } + + .message-media-control { + padding: 12px; + color: darken($fg_color, 20%); + + &:last-child:ltr { padding-right: 18px; } + &:last-child:rtl { padding-left: 18px; } + &:hover { color: $fg_color; } + &:insensitive { color: darken($fg_color,40%); } + } + + .media-message-cover-icon { + icon-size: 48px !important; + &.fallback { + color: lighten($bg_color,10%); + background-color: $bg_color; + border: 2px solid $bg_color; + border-radius: 2px; + icon-size: 32px !important; + padding: 6px; } + } + + + // a little unstructured mess: + + .system-switch-user-submenu-icon { + icon-size: 16px; + padding: 0 4px; + } + + #appMenu { + spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg"); + spacing: 4px; + + .label-shadow { color: transparent; } + } + + .app-menu, + .app-well-menu { + max-width: 27.25em; + } + + .aggregate-menu { + min-width: 21em; + .popup-menu-icon { padding: 0 4px; } + .popup-sub-menu .popup-menu-item > :first-child { + &:ltr { /* 12px spacing + 2*4px padding */ + padding-left: 20px; margin-left: 1.09em; } + &:rtl { /* 12px spacing + 2*4px padding */ + padding-right: 20px; margin-right: 1.09em; } + } + } + + .system-menu-action { + -st-icon-style: symbolic; + color: $fg_color; + border-radius: 32px; /* wish we could do 50% */ + padding: 13px; + border: 1px solid lighten($borders_color,5%); + + &:hover, &:focus { + background-color: transparentize($fg_color,0.9); + color: $fg_color; + border: none; + padding: 14px; + } + &:active { background-color: $selected_bg_color; color: $selected_fg_color; } + + & > StIcon { icon-size: 16px; } + } + +// Activities Ripples +.ripple-box { + width: 52px; + height: 52px; + border-radius: 0 0 52px 0; // radius the size of the box give us the curve + background-color: lighten(transparentize($selected_bg_color, 0.7), 40%); + box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%); +} + +.ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position + +// Rubberband for select-area screenshots +.select-area-rubberband { + background-color: transparentize($selected_bg_color,0.7); + border: 1px solid $selected_bg_color; +} + +// not really top bar only +.popup-menu-arrow { icon-size: 1.09em; } +.popup-menu-icon { icon-size: 1.09em; } + +//close buttons + +.window-close { + background-color: white; + border-radius: 24px; + border: 4px solid $selected_bg_color; + box-shadow: inset 0 -4px 0 0 transparentize($selected_bg_color, 0.5); + color: $selected_bg_color; + height: 24px; + width: 24px; + -shell-close-overlap: 14px; + + &:hover { + background-color: $selected_bg_color; + border-color: white; + color: white; + } + + &:active { + background-color: mix(white, $selected_bg_color, 75%); + border-color: $selected_bg_color; + color: $selected_bg_color; + } +} + +/* NETWORK DIALOGS */ + +.nm-dialog { + max-height: 34em; + min-height: 31em; + min-width: 32em; +} + + .nm-dialog-content { + spacing: 20px; + padding: 24px; + } + .nm-dialog-header-hbox { spacing: 10px; } + .nm-dialog-airplane-box { spacing: 12px; } + + .nm-dialog-airplane-headline { + font-weight: bold; + text-align: center; + } + + .nm-dialog-airplane-text { color: $fg_color; } + .nm-dialog-header-icon { icon-size: 32px; } + .nm-dialog-scroll-view { border: 2px solid $borders_color; } + .nm-dialog-header { font-weight: bold; } + + .nm-dialog-item { + font-size: 110%; + border-bottom: 1px solid $borders_color; + padding: 12px; + spacing: 20px; + } + + .nm-dialog-item:selected { + background-color: $selected_bg_color; + color: $selected_fg_color; + } + + .nm-dialog-icons { spacing: .5em; } + .nm-dialog-icon { icon-size: 16px; } + .no-networks-label { color: #999999; } + .no-networks-box { spacing: 12px; } + +/* OVERVIEW */ + +#overview { + spacing: 24px; // +} + +.overview-controls { + padding-bottom: 32px; +} + + .window-picker { //container around window thumbnails + -horizontal-spacing: 16px; + -vertical-spacing: 16px; + padding: 0 16px 16px; + + &.external-monitor { padding: 16px; } + } + + .window-clone-border { + border: 4px solid $selected_bg_color; + border-radius: 4px; + // For window decorations with round corners we can't match + // the exact shape when the window is scaled. So apply a shadow + // to fix that case + box-shadow: inset 0px 0px 0px 1px $selected_bg_color; + } + .window-caption { + spacing: 25px; + color: $selected_fg_color; + background-color: $selected_bg_color; + border-radius: 8px; + padding: 4px 12px; + } + + //search entry + .search-entry { + width: 320px; + padding: 7px 9px; + border-radius: 6px; + border-color: darken($osd_fg_color,50%); + color: $osd_fg_color; + background-color: $osd_bg_color; + &:focus { + padding: 6px 8px; + border-width: 2px; + border-color: $selected_bg_color; + } + + .search-entry-icon { icon-size: 1em; padding: 0 4px; color: transparentize($fg_color,.3); } + + &:hover, &:focus { + .search-entry-icon { color: $fg_color; } + } + } + + //search results + + #searchResultsBin { + max-width: 1000px; + } + + #searchResultsContent { + padding-left: 20px; + padding-right: 20px; + spacing: 16px; + } + + .search-section { spacing: 16px; } // This should be equal to #searchResultsContent spacing + .search-section-content { spacing: 32px; } // This is the space between the provider icon and the results container + .search-statustext { // "no results" + @extend %status_text; + } + .list-search-results { spacing: 3px; } + + .search-section-separator { height: 2px; background-color: rgba(255, 255, 255, 0.2); } + + .search-section:last-child .search-section-separator { background-color: transparent; } + + .list-search-result-content { spacing: 30px; } + .list-search-result-title { color: darken($osd_fg_color,5%); spacing: 12px; } + .list-search-result-description { color: transparentize(darken($osd_fg_color,15%), 0.5); } + .list-search-provider-details { width: 150px; color: darken($osd_fg_color,5%); margin-top: 0.24em; } + .list-search-provider-content { spacing: 20px; } + .search-provider-icon { padding: 15px; } + + + /* DASHBOARD */ + + #dash { + font-size: 9pt; + color: $_bubble_fg_color; + background-color: $_bubble_bg_color; + padding: 4px 0; + border: 1px solid rgba(128, 128, 128, 0.4); + border-left: 0px; + border-radius: 0px 9px 9px 0px; + + &:rtl { + border-radius: 9px 0 0 9px; + } + + .placeholder { + background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg"); + background-size: contain; + height: 24px; + } + + .empty-dash-drop-target { + width: 24px; + height: 24px; + } + + } + + .dash-item-container > StWidget { + padding: 4px 8px; + } + + .dash-label { //osd tooltip + border-radius: 7px; + padding: 4px 12px; + color: $osd_fg_color; + background-color: transparentize($osd_bg_color,0.3); + text-align: center; + -x-offset: 8px; + } + + /* App Vault/Grid */ + .icon-grid { + spacing: 30px; + -shell-grid-horizontal-item-size: 136px; + -shell-grid-vertical-item-size: 136px; + + .overview-icon { icon-size: 96px; } + } + //.app-display { spacing: 20px; } + + .system-action-icon { + background-color: black; + color: white; + border-radius: 99px; + icon-size: 48px; + } + + .app-view-controls { //favorties | all toggle container + padding-bottom: 32px; + } + .app-view-control { //favorties | all toggle button + padding: 4px 32px; + &:checked { @include button(active); } + &:first-child { + border-right-width: 0; + border-radius: 3px 0 0 3px; + } + &:last-child { + border-radius: 0 3px 3px 0; + } + } + + //Icon tile + .search-provider-icon, + .list-search-result { + @extend %icon_tile; + &:active, &:checked { background-color: transparentize(darken($osd_bg_color,10%),.1); } + &:focus, &:selected, &:hover { + background-color: transparentize($osd_fg_color,.9); + transition-duration: 200ms; + } + } + .app-well-app, + .app-well-app.app-folder, + .show-apps, + .grid-search-result { + & .overview-icon { + @extend %icon_tile; + } + &:active .overview-icon, + &:checked .overview-icon { + background-color: transparentize(darken($osd_bg_color,10%),.1); + box-shadow: inset 0 1px 2px $osd_borders_color; + } + &:hover .overview-icon, + &:focus .overview-icon, + &:selected .overview-icon { + background-color: transparentize($osd_fg_color,.9); + transition-duration: 0ms; + border-image: none; + background-image: none; + } + + } + + .app-well-app-running-dot { //running apps indicator + width: 10px; height: 3px; + background-color: $selected_bg_color; + margin-bottom: 2px; + } + + %icon_tile { + color: $osd_fg_color; + border-radius: 4px; + padding: 6px; + border: 1px solid transparent; + transition-duration: 100ms; + text-align: center; + } + + .app-well-app.app-folder > .overview-icon { + background-color: transparentize($osd_bg_color,.6); + } + + .show-apps:checked .show-apps-icon, + .show-apps:focus .show-apps-icon { + color: white; + transition-duration: 100ms; + } + + + // Collections + .app-folder-popup { //expanded collection + -arrow-border-radius: 8px; + -arrow-background-color: transparentize($osd_bg_color,0.7); + -arrow-base: 24px; + -arrow-rise: 11px; + } + .app-folder-popup-bin { padding: 5px; } + .app-folder-icon { + padding: 5px; + spacing-rows: 5px; + spacing-columns: 5px; + } + + .page-indicator { + padding: 15px 20px; + + .page-indicator-icon { + width: 12px; + height: 12px; + background-color: transparent; + border: 2px solid rgba(255, 255, 255, 0.4); + border-radius: 12px; + } + + &:hover .page-indicator-icon { border-color: white; } + &:active .page-indicator-icon { border: none; margin: 2px; background-color: white; } + &:checked .page-indicator-icon, + &:checked:active .page-indicator-icon { background-color: white;} + } + + .no-frequent-applications-label { @extend %status_text; } + + .app-well-app > .overview-icon.overview-icon-with-label, + .grid-search-result .overview-icon.overview-icon-with-label { + padding: 10px 8px 5px 8px; + spacing: 4px; + } + + // Workspace pager + .workspace-thumbnails { //container ala dash + @extend %overview-panel; + visible-width: 32px; //amount visible before hover + spacing: 11px; + padding: 8px; + border-radius: 9px 0 0 9px; + //border-width: 1px 0 1px 1px; //fixme: can't have non unoform borders :( + &:rtl { border-radius: 0 9px 9px 0;} + + .placeholder { + background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg"); + background-size: contain; + height: 24px; + } + } + .workspace-thumbnail-indicator { + border: 4px solid $selected_bg_color; + padding: 1px; + } + + //Some hacks I don't even + .search-display > StBoxLayout, + .all-apps, + .frequent-apps > StBoxLayout { + // horizontal padding to make sure scrollbars or dash don't overlap content + padding: 0px 88px 10px 88px; + } + +%overview-panel { + color: $_bubble_fg_color; + background-color: $_bubble_bg_color; + border: 1px solid $_bubble_borders_color; +} + +%status_text { + font-size: 2em; + font-weight: bold; + color: $fg_color; +} + +/* NOTIFICATIONS & MESSAGE TRAY */ + + .url-highlighter { link-color: lighten($selected_bg_color,10%); } + + // Banners + .notification-banner { + font-size: 11pt; + width: 34em; + margin: 5px; + border-radius: 6px; + color: $_bubble_fg_color; + background-color: $_bubble_bg_color; + border: 1px solid $borders_color; + //box-shadow: 0 1px 4px black; + &:hover { background-color: $_bubble_bg_color; } + &:focus { background-color: $_bubble_bg_color; } + + .notification-icon { padding: 5px; } + .notification-content { padding: 5px; spacing: 5px; } + .secondary-icon { icon-size: 1.09em; } + .notification-actions { + background-color: $borders_color; + padding-top: 2px; + spacing: 1px; + } + .notification-button { + padding: 4px 4px 5px; + background-color: darken($_bubble_bg_color,5%); + &:first-child { border-radius: 0 0 0 6px; } + &:last-child { border-radius: 0 0 6px 0; } + &:hover, &focus { background-color: darken($_bubble_bg_color,2%); } + } + } + .summary-source-counter { + font-size: 10pt; + font-weight: bold; + height: 1.6em; width: 1.6em; + -shell-counter-overlap-x: 3px; + -shell-counter-overlap-y: 3px; + background-color: $selected_bg_color; + color: $selected_fg_color; + border: 2px solid $osd_fg_color; + box-shadow: 0 2px 2px rgba(0,0,0,0.5); + border-radius: 0.9em; // should be 0.8 but whatever; wish I could do 50%; + } + + .secondary-icon { icon-size: 1.09em; } + + //chat bubbles + .chat-body { spacing: 5px; } + .chat-response { margin: 5px; } + .chat-log-message { color: darken($fg_color,10%); } + .chat-new-group { padding-top: 1em; } + .chat-received { + padding-left: 4px; + &:rtl { padding-left: 0px; padding-right: 4px; } + } + .chat-sent { + padding-left: 18pt; + color: darken($fg_color, 15%); + &:rtl { padding-left: 0; padding-right: 18pt; } + } + .chat-meta-message { + padding-left: 4px; + font-size: 9pt; + font-weight: bold; + color: darken($fg_color,20%); + &:rtl { padding-left: 0; padding-right: 4px; } + } + + //hotplug + .hotplug-transient-box { + spacing: 6px; + padding: 2px 72px 2px 12px; + } + .hotplug-notification-item { + padding: 2px 10px; + &:focus { padding: 1px 71px 1px 11px; } + } + + .hotplug-notification-item-icon { + icon-size: 24px; + padding: 2px 5px; + } + + .hotplug-resident-box { spacing: 8px; } + + .hotplug-resident-mount { + spacing: 8px; + border-radius: 4px; + &:hover { background-color: transparentize($bg_color,0.7); } + } + + .hotplug-resident-mount-label { + color: inherit; + padding-left: 6px; + } + + .hotplug-resident-mount-icon { + icon-size: 24px; + padding-left: 6px; + } + + .hotplug-resident-eject-icon { + icon-size: 16px; + } + + .hotplug-resident-eject-button { + padding: 7px; + border-radius: 5px; + color: pink; + } + +/* Eeeky things */ + +//magnifier + +.magnifier-zoom-region { + border: 2px solid $selected_bg_color; + &.full-screen { border-width: 0; } +} + +//Keyboard +/* On-screen Keyboard */ +.word-suggestions { + font-size: 14pt; + spacing: 12px; + min-height: 20pt; +} + +#keyboard { + background-color: transparentize($osd_bg_color, 0.3); + + .page-indicator { + padding: 4px 4px; + + .page-indicator-icon { + width: 6px; + height: 6px + } + } +} + + .key-container { + padding: 4px; + spacing: 4px; + } + + .keyboard-key { + background-color: #393f3f; + min-height: 1.2em; + min-width: 1.2em; + font-size: 16pt; + border-radius: 3px; + border: 1px solid #464d4d; + color: #e5e5e5; + &:focus { @include button(focus); } + &:hover,&:checked { @include button(hover); } + &:active { @include button(active);} + &:grayed { //FIXME + background-color: $osd_bg_color; + color: $osd_fg_color; + border-color: $osd_borders_color; + } + &.default-key { + border-color: #2d3232; + background-color: #1d2020; + background-size: 20px; + } + &.enter-key { + border-color: #005684; + background-color: #006098; + background-image: url("resource:///org/gnome/shell/theme/key-enter.svg"); + } + &.shift-key-lowercase { + background-image: url("resource:///org/gnome/shell/theme/key-shift.svg"); + } + &.shift-key-uppercase { + background-image: url("resource:///org/gnome/shell/theme/key-shift-uppercase.svg"); + } + &.shift-key-uppercase:latched { + background-image: url("resource:///org/gnome/shell/theme/key-shift-latched-uppercase.svg"); + } + &.hide-key { + background-image: url("resource:///org/gnome/shell/theme/key-hide.svg"); + } + &.layout-key { + background-image: url("resource:///org/gnome/shell/theme/key-layout.svg"); + } + } + + .keyboard-subkeys { //long press on a key popup + color: white; + -arrow-border-radius: 10px; + -arrow-background-color: transparentize($osd_bg_color, 0.3); + -arrow-border-width: 2px; + -arrow-border-color: $_bubble_borders_color; + -arrow-base: 20px; + -arrow-rise: 10px; + -boxpointer-gap: 5px; + } + +.emoji-page { + .keyboard-key { + background-color: transparent; + border: none; + } +} + +.emoji-panel { + .keyboard-key:latched { + border-color: #005684; + background-color: #006098; + } +} + +// IBus Candidate Popup + +.candidate-popup-content { + padding: 0.5em; + spacing: 0.3em; +} + + .candidate-index { + padding: 0 0.5em 0 0; + color: darken($fg_color,10%); + } + + .candidate-box { + padding: 0.3em 0.5em 0.3em 0.5em; + border-radius: 4px; + &:selected,&:hover { background-color: $selected_bg_color; color: $selected_fg_color; } + } + + .candidate-page-button-box { + height: 2em; + .vertical & { padding-top: 0.5em; } + .horizontal & { padding-left: 0.5em; } + } + + .candidate-page-button { + padding: 4px; + } + + .candidate-page-button-previous { border-radius: 4px 0px 0px 4px; border-right-width: 0; } + .candidate-page-button-next { border-radius: 0px 4px 4px 0px; } + .candidate-page-button-icon { icon-size: 1em; } + +/* Auth Dialogs & Screen Shield */ + +.user-icon { + background-size: contain; + color: $osd_fg_color; + border-radius: 99px; + &:hover { + color: lighten($osd_fg_color,30%); + } +} + +// LOGIN DIALOG + +.login-dialog-banner-view { + padding-top: 24px; + max-width: 23em; +} + +.login-dialog { + //reset + border: none; + background-color: transparent; + + .modal-dialog-button-box { spacing: 3px; } + .modal-dialog-button { + padding: 3px 18px; + &:default { + @include button(normal,$c:$selected_bg_color); + &:hover,&:focus { @include button(hover,$c:$selected_bg_color); } + &:active { @include button(active,$c:$selected_bg_color); } + &:insensitive { @include button(insensitive); } + + } + } + +} + + .login-dialog-logo-bin { padding: 24px 0px; } + .login-dialog-banner { color: darken($osd_fg_color,10%); } + .login-dialog-button-box { spacing: 5px; } + .login-dialog-message-warning { color: $warning_color; } + .login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; } + .login-dialog-user-selection-box { padding: 100px 0px; } + .login-dialog-not-listed-label { + padding-left: 2px; + .login-dialog-not-listed-button:focus &, + .login-dialog-not-listed-button:hover & { + color: $osd_fg_color; + } + } + .login-dialog-not-listed-label { + font-size: 90%; + font-weight: bold; + color: darken($osd_fg_color,30%); + padding-top: 1em; + } + + .login-dialog-user-list-view { -st-vfade-offset: 1em; } + .login-dialog-user-list { + spacing: 12px; + width: 23em; + &:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; } + &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; } + } + .login-dialog-user-list-item { + border-radius: 5px; + padding: 6px; + color: darken($osd_fg_color,30%); + &:ltr .user-widget { padding-right: 1em; } + &:rtl .user-widget { padding-left: 1em; } + .login-dialog-timed-login-indicator { + height: 2px; + margin-top: 6px; + background-color: $osd_fg_color; + } + &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; } + } + + .login-dialog-username, + .user-widget-label { + color: $osd_fg_color; + font-size: 120%; + font-weight: bold; + text-align: left; + padding-left: 15px; + } + .user-widget-label { + &:ltr { padding-left: 14px; } + &:rtl { padding-right: 14px; } + } + + .login-dialog-prompt-layout { + padding-top: 24px; + padding-bottom: 12px; + spacing: 8px; + width: 23em; + } + + .login-dialog-prompt-label { + color: darken($osd_fg_color, 20%); + font-size: 110%; + padding-top: 1em; + } + + .login-dialog-session-list-button StIcon { + icon-size: 1.25em; + } + + .login-dialog-session-list-button { + color: darken($osd_fg_color,30%); + &:hover,&:focus { color: $osd_fg_color; } + &:active { color: darken($osd_fg_color, 50%); } + } + +//SCREEN SHIELD + +.screen-shield-arrows { + padding-bottom: 3em; +} + +.screen-shield-arrows Gjs_Arrow { + color: white; + width: 80px; + height: 48px; + -arrow-thickness: 12px; + -arrow-shadow: 0 1px 1px rgba(0,0,0,0.4); +} + +.screen-shield-clock { + color: white; + text-shadow: 0px 1px 2px rgba(0,0,0,0.6); + font-weight: bold; + text-align: center; + padding-bottom: 1.5em; +} + +.screen-shield-clock-time { + font-size: 72pt; + text-shadow: 0px 2px 2px rgba(0,0,0,0.4); + font-feature-settings: "tnum"; +} + +.screen-shield-clock-date { + font-size: 28pt; + font-weight: normal; +} + +.screen-shield-notifications-container { + spacing: 6px; + width: 30em; + background-color: transparent; + max-height: 500px; + .summary-notification-stack-scrollview { + padding-top: 0; + padding-bottom: 0; + } + + .notification, + .screen-shield-notification-source { + padding: 12px 6px; + border: 1px solid $_bubble_borders_color; + background-color: transparentize($osd_bg_color,0.5); + color: $_bubble_fg_color; + border-radius: 4px; + } + .notification { margin-right: 15px; } //compensate for space allocated to the scrollbar +} + + +.screen-shield-notification-label { + font-weight: bold; + padding: 0px 0px 0px 12px; +} + +.screen-shield-notification-count-text { padding: 0px 0px 0px 12px; } + +#panel.lock-screen { background-color: transparentize($_bubble_bg_color, 0.5); } + +.screen-shield-background { //just the shadow, really + background: black; + box-shadow: 0px 2px 4px transparentize(black,0.6); +} + +#lockDialogGroup { + background: #2e3436 url(resource:///org/gnome/shell/theme/noise-texture.png); + background-repeat: repeat; +} + +#screenShieldNotifications { + StButton#vhandle, StButton#hhandle { + background-color: transparentize($bg_color,0.7); + &:hover, &:focus { background-color: transparentize($bg_color,0.5); } + &:active { background-color: transparentize($selected_bg_color,0.5); } + } +} + + +// Looking Glass +#LookingGlassDialog { + background-color: rgba(0,0,0,0.80); + spacing: 4px; + padding: 4px; + border: 2px solid grey; + border-radius: 4px; + & > #Toolbar { + border: 1px solid grey; + border-radius: 4px; + } + .labels { spacing: 4px; } + .notebook-tab { + -natural-hpadding: 12px; + -minimum-hpadding: 6px; + font-weight: bold; + color: #ccc; + transition-duration: 100ms; + padding-left: .3em; + padding-right: .3em; + &:hover { + color: white; + text-shadow: black 0px 2px 2px; + } + &:selected { + border-bottom-width: 2px; + border-color: lighten($selected_bg_color,5%); + color: white; + text-shadow: black 0px 2px 2px; + } + } + StBoxLayout#EvalBox { padding: 4px; spacing: 4px; } + StBoxLayout#ResultsArea { spacing: 4px; } +} + + .lg-dialog { + StEntry { + selection-background-color: #bbbbbb; + selected-color: #333333; + } + .shell-link { + color: #999999; + &:hover { color: #dddddd; } + } + } + + .lg-completions-text { + font-size: .9em; + font-style: italic; + } + + .lg-obj-inspector-title { + spacing: 4px; + } + + .lg-obj-inspector-button { + border: 1px solid gray; + padding: 4px; + border-radius: 4px; + &:hover { border: 1px solid #ffffff; } + } + + #lookingGlassExtensions { padding: 4px; } + + .lg-extensions-list { + padding: 4px; + spacing: 6px; + } + + .lg-extension { + border: 1px solid #6f6f6f; + border-radius: 4px; + padding: 4px; + } + + .lg-extension-name { + font-weight: bold; + } + + .lg-extension-meta { + spacing: 6px; + } + + #LookingGlassPropertyInspector { + background: rgba(0, 0, 0, 0.8); + border: 2px solid grey; + border-radius: 4px; + padding: 6px; + } diff --git a/data/theme/gnome-shell-sass/_drawing.scss b/data/theme/gnome-shell-sass/_drawing.scss new file mode 100644 index 0000000..7ac18b1 --- /dev/null +++ b/data/theme/gnome-shell-sass/_drawing.scss @@ -0,0 +1,221 @@ +// Drawing mixins + +// generic drawing of more complex things + +@function _widget_edge($c:$borders_edge) { +// outer highlight "used" on most widgets + @return 0 1px $c; +} + +// provide font size in rem, with px fallback +@mixin fontsize($size: 24, $base: 16) { + font-size: round($size) + pt; + //font-size: ($size / $base) * 1rem; +} + +@mixin _shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) { +// +// Helper function to stack up to 4 box-shadows; +// + @if $shadow4!=none { box-shadow: $shadow1, $shadow2, $shadow3, $shadow4; } + @else if $shadow3!=none { box-shadow: $shadow1, $shadow2, $shadow3; } + @else if $shadow2!=none { box-shadow: $shadow1, $shadow2; } + @else { box-shadow: $shadow1; } +} + +// entries + +@mixin entry($t, $fc:$selected_bg_color, $edge: $borders_edge) { +// +// Entries drawing function +// +// $t: entry type +// $fc: focus color +// $edge: set to none to not draw the bottom edge or specify a color to not +// use the default one +// +// possible $t values: +// normal, focus, insensitive +// + $_inner_shadows: inset 0 2px 4px transparentize(black, 0.6); + + @if $t==normal { + background-color: $base_color; + border-color: $borders_color; + @include _shadows($_inner_shadows); + + } + @if $t==focus { + @include _shadows($_inner_shadows); + border-color: if($fc==$selected_bg_color, + $selected_borders_color, + darken($fc,35%)); + } + @if $t==hover { } + @if $t==insensitive { + color: $insensitive_fg_color; + border-color: $insensitive_bg_color; + box-shadow: none; + } +} + +// buttons + +@function _border_color ($c) { @return darken($c,25%); } // colored buttons want + // the border form the + // base color + +@function _text_shadow_color ($tc:$fg_color, $bg:$bg_color) { +// +// calculate the color of text shadows +// +// $tc is the text color +// $bg is the background color +// + $_lbg: lightness($bg)/100%; + @if lightness($tc)<50% { @return transparentize(white,1-$_lbg/($_lbg*1.3)); } + @else { @return transparentize(black,$_lbg*0.8); } +} + +@function _button_hilight_color($c) { +// +// calculate the right top hilight color for buttons +// +// $c: base color; +// + @if lightness($c)>90% { @return white; } + @else if lightness($c)>80% { @return transparentize(white, 0.3); } + @else if lightness($c)>50% { @return transparentize(white, 0.5); } + @else if lightness($c)>40% { @return transparentize(white, 0.7); } + @else { @return transparentize(white, 0.9); } +} + +@mixin _button_text_shadow ($tc:$fg_color, $bg:$bg_color) { +// +// helper function for the text emboss effect +// +// $tc is the optional text color, not the shadow color +// +// TODO: this functions needs a way to deal with special cases +// + + $_shadow: _text_shadow_color($tc, $bg); + + @if lightness($tc)<50% { + text-shadow: 0 1px $_shadow; + icon-shadow: 0 1px $_shadow; + } + @else { + text-shadow: 0 -1px $_shadow; + icon-shadow: 0 -1px $_shadow; + } +} + +@mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) { +// +// Button drawing function +// +// $t: button type, +// $c: base button color for colored* types +// $tc: optional text color for colored* types +// $edge: set to none to not draw the bottom edge or specify a color to not +// use the default one +// +// possible $t values: +// normal, hover, active, insensitive, insensitive-active, +// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active, +// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated +// + + $_hilight_color: _button_hilight_color($c); + $_button_edge: if($edge == none, none, _widget_edge($edge)); + $_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1))); + + + @if $t==normal { + // + // normal button + // + $_bg: if($c!=$osd_bg_color, transparentize($c, 0.5), + $osd_bg_color); + + color: $osd_fg_color; + background-color: $_bg; + border-color: $osd_borders_color; + box-shadow: inset 0 1px lighten($osd_bg_color,10%); + text-shadow: 0 1px black; + icon-shadow: 0 1px black; + } + @if $t==focus { + // + // focused button + // + $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), + lighten($osd_bg_color,3%)); + + color: $osd_fg_color; + text-shadow: 0 1px black; + icon-shadow: 0 1px black; + box-shadow: inset 0px 0px 0px 1px $selected_bg_color; + } + + @else if $t==hover { + // + // active osd button + // + $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), + lighten($osd_bg_color,3%)); + + color: white; + border-color: $osd_borders_color; + background-color: $_bg; + box-shadow: inset 0 1px lighten($osd_bg_color,20%); + text-shadow: 0 1px black; + icon-shadow: 0 1px black; + + } + @else if $t==active { + // + // active osd button + // + $_bg: if($c!=$bg_color, $c, $osd_borders_color); + + color: white; + border-color: $osd_borders_color; + background-color: $selected_bg_color; + // This should be none, but it's creating some issues with borders, so to + // workaround it for now, use inset wich goes through a different code path. + // see https://bugzilla.gnome.org/show_bug.cgi?id=752934 + box-shadow: inset 0 0 black; + text-shadow: none; + icon-shadow: none; + } + @else if $t==insensitive { + // + // insensitive osd button + // + $_bg: transparentize(mix($insensitive_fg_color,$osd_bg_color,20%),0.3); + + color: $insensitive_fg_color; + border-color: $osd_borders_color; + background-color: $_bg; + box-shadow: none; + text-shadow: none; + icon-shadow: none; + } + @else if $t==undecorated { + // + // reset + // + border-color: transparent; + background-color: transparent; + background-image: none; + + @include _shadows(inset 0 1px transparentize(white,1), + $_blank_edge); + + text-shadow: none; + icon-shadow: none; + } +} + diff --git a/data/theme/gnome-shell-sass/_high-contrast-colors.scss b/data/theme/gnome-shell-sass/_high-contrast-colors.scss new file mode 100644 index 0000000..af1e52f --- /dev/null +++ b/data/theme/gnome-shell-sass/_high-contrast-colors.scss @@ -0,0 +1,41 @@ +// When color definition differs for dark and light variant, +// it gets @if ed depending on $variant + + +$base_color: #222; +$bg_color: #000; +$fg_color: #fff; + +$selected_fg_color: #ffffff; +$selected_bg_color: darken(#4a90d9,20%); +$selected_borders_color: darken($selected_bg_color, 20%); +$borders_color: darken($bg_color,12%); +$borders_edge: transparentize($fg_color, 0.9); +$link_color: lighten($selected_bg_color,20%); +$link_visited_color: lighten($selected_bg_color,10%); +$top_hilight: $borders_edge; + +$warning_color: #f57900; +$error_color: #cc0000; +$success_color: darken(#73d216,10%); +$destructive_color: darken(#ef2929,10%); + +$osd_fg_color: #eeeeec; +$osd_bg_color: #2e3436; +$osd_borders_color: transparentize(black, 0.3); +$osd_outer_borders_color: transparentize(white, 0.9); + +$tooltip_borders_color: $osd_outer_borders_color; + +//insensitive state derived colors +$insensitive_fg_color: mix($fg_color, $bg_color, 50%); +$insensitive_bg_color: mix($bg_color, $base_color, 60%); +$insensitive_borders_color: $borders_color; + +//colors for the backdrop state, derived from the main colors. +$backdrop_base_color: lighten($base_color,1%); +$backdrop_bg_color: $bg_color; +$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%); +$backdrop_insensitive_color: lighten($backdrop_bg_color,15%); +$backdrop_borders_color: mix($borders_color, $bg_color, 90%); +$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%); diff --git a/data/theme/gnome-shell-sass/gnome-shell-sass.doap b/data/theme/gnome-shell-sass/gnome-shell-sass.doap new file mode 100644 index 0000000..f18ec1b --- /dev/null +++ b/data/theme/gnome-shell-sass/gnome-shell-sass.doap @@ -0,0 +1,37 @@ + + + GNOME Shell Sass + Sass sources of GNOME Shell + GNOME Shell Sass is a project intended to allow the sharing of the + sass theme sources between gnome-shell and other projects like gnome-shell-extensions. + + + sass + css + + + + Carlos Soriano + + csoriano + + + + + Florian Müllner + + fmuellner + + + + + Jakub Steiner + + jimmac + + + diff --git a/data/theme/gnome-shell.scss b/data/theme/gnome-shell.scss new file mode 100644 index 0000000..3def589 --- /dev/null +++ b/data/theme/gnome-shell.scss @@ -0,0 +1,5 @@ +$variant: 'dark'; + +@import "gnome-shell-sass/_colors"; //use gtk colors +@import "gnome-shell-sass/_drawing"; +@import "gnome-shell-sass/_common"; diff --git a/data/theme/key-enter.svg b/data/theme/key-enter.svg new file mode 100644 index 0000000..ea7b243 --- /dev/null +++ b/data/theme/key-enter.svg @@ -0,0 +1,109 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + + + + diff --git a/data/theme/key-hide.svg b/data/theme/key-hide.svg new file mode 100644 index 0000000..288fe88 --- /dev/null +++ b/data/theme/key-hide.svg @@ -0,0 +1,114 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + + + + diff --git a/data/theme/key-layout.svg b/data/theme/key-layout.svg new file mode 100644 index 0000000..7993069 --- /dev/null +++ b/data/theme/key-layout.svg @@ -0,0 +1,129 @@ + + + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + + + + + + diff --git a/data/theme/key-shift-latched-uppercase.svg b/data/theme/key-shift-latched-uppercase.svg new file mode 100644 index 0000000..02bddd5 --- /dev/null +++ b/data/theme/key-shift-latched-uppercase.svg @@ -0,0 +1,109 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + + + + diff --git a/data/theme/key-shift-uppercase.svg b/data/theme/key-shift-uppercase.svg new file mode 100644 index 0000000..b4e293b --- /dev/null +++ b/data/theme/key-shift-uppercase.svg @@ -0,0 +1,104 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + + + diff --git a/data/theme/key-shift.svg b/data/theme/key-shift.svg new file mode 100644 index 0000000..e925164 --- /dev/null +++ b/data/theme/key-shift.svg @@ -0,0 +1,108 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + + + diff --git a/data/theme/meson.build b/data/theme/meson.build new file mode 100644 index 0000000..22bae3d --- /dev/null +++ b/data/theme/meson.build @@ -0,0 +1,25 @@ +theme_sources = files([ + 'gnome-shell-high-contrast.scss', + 'gnome-shell.scss', + 'gnome-shell-sass/_colors.scss', + 'gnome-shell-sass/_common.scss', + 'gnome-shell-sass/_drawing.scss', + 'gnome-shell-sass/_high-contrast-colors.scss' +]) + +styles = [ + 'gnome-shell-high-contrast', + 'gnome-shell' +] + +theme_deps = [] + +foreach style: styles + theme_deps += custom_target('style-' + style, + input: '@0@.scss'.format(style), + output: '@0@.css'.format(style), + command: [ + sassc, '-a', '@INPUT@', '@OUTPUT@' + ], + depend_files: theme_sources) +endforeach diff --git a/data/theme/message-indicator-symbolic.svg b/data/theme/message-indicator-symbolic.svg new file mode 100644 index 0000000..257a984 --- /dev/null +++ b/data/theme/message-indicator-symbolic.svg @@ -0,0 +1,40 @@ + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/data/theme/no-events.svg b/data/theme/no-events.svg new file mode 100644 index 0000000..8ab08a9 --- /dev/null +++ b/data/theme/no-events.svg @@ -0,0 +1,119 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/theme/no-notifications.svg b/data/theme/no-notifications.svg new file mode 100644 index 0000000..862e2d1 --- /dev/null +++ b/data/theme/no-notifications.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/theme/noise-texture.png b/data/theme/noise-texture.png new file mode 100644 index 0000000..6b70a2d Binary files /dev/null and b/data/theme/noise-texture.png differ diff --git a/data/theme/pad-osd.css b/data/theme/pad-osd.css new file mode 100644 index 0000000..31c2377 --- /dev/null +++ b/data/theme/pad-osd.css @@ -0,0 +1,30 @@ +.Leader { + stroke-width: .5 !important; + stroke: #535353; + fill: none !important; +} + +.Button { + stroke-width: .25; + stroke: #ededed; + fill: #ededed; +} + +.Ring { + stroke-width: .5 !important; + stroke: #535353 !important; + fill: none !important; +} + +.Label { + stroke: none !important; + stroke-width: .1 !important; + font-size: .1 !important; + fill: transparent !important; +} + +.TouchStrip, .TouchRing { + stroke-width: .1 !important; + stroke: #ededed !important; + fill: #535353 !important; +} diff --git a/data/theme/process-working.svg b/data/theme/process-working.svg new file mode 100644 index 0000000..920a67d --- /dev/null +++ b/data/theme/process-working.svg @@ -0,0 +1,3084 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/theme/running-indicator.svg b/data/theme/running-indicator.svg new file mode 100644 index 0000000..ebe7ecf --- /dev/null +++ b/data/theme/running-indicator.svg @@ -0,0 +1,130 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/theme/toggle-off-hc.svg b/data/theme/toggle-off-hc.svg new file mode 100644 index 0000000..809cd3f --- /dev/null +++ b/data/theme/toggle-off-hc.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/data/theme/toggle-off-intl.svg b/data/theme/toggle-off-intl.svg new file mode 100644 index 0000000..cb08712 --- /dev/null +++ b/data/theme/toggle-off-intl.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/data/theme/toggle-on-hc.svg b/data/theme/toggle-on-hc.svg new file mode 100644 index 0000000..9952f95 --- /dev/null +++ b/data/theme/toggle-on-hc.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/data/theme/toggle-on-intl.svg b/data/theme/toggle-on-intl.svg new file mode 100644 index 0000000..142e0a8 --- /dev/null +++ b/data/theme/toggle-on-intl.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/data/update-osk-layouts.sh b/data/update-osk-layouts.sh new file mode 100755 index 0000000..72f33fe --- /dev/null +++ b/data/update-osk-layouts.sh @@ -0,0 +1,49 @@ +#!/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 + +for f in $DESTDIR/*.json +do + echo " $(basename $f)" >>$TMP_GRESOURCE_FILE +done + +cat >>$TMP_GRESOURCE_FILE <emoji.json + + +EOF + +# Rewrite old gresources xml +mv $TMP_GRESOURCE_FILE $GRESOURCE_FILE diff --git a/docs/reference/meson.build b/docs/reference/meson.build new file mode 100644 index 0000000..77d9fde --- /dev/null +++ b/docs/reference/meson.build @@ -0,0 +1,5 @@ +version_conf = configuration_data() +version_conf.set('VERSION', meson.project_version()) + +subdir('shell') +subdir('st') diff --git a/docs/reference/shell/meson.build b/docs/reference/shell/meson.build new file mode 100644 index 0000000..a963db7 --- /dev/null +++ b/docs/reference/shell/meson.build @@ -0,0 +1,56 @@ +private_headers = [ + 'gactionmuxer.h', + 'gactionobservable.h', + 'gactionobserver.h', + 'shell-network-agent.h', + 'shell-recorder-src.h' +] + +if not enable_recorder + private_headers += 'shell-recorder.h' +endif + +exclude_directories = [ + 'calendar-server', + 'hotplug-sniffer', + 'st', + 'tray' +] + +ifaces = [ + ['org.gnome.Shell.Screenshot', 'org.gnome.Shell.Screenshot.xml'], + ['org.gnome.ShellSearchProvider', 'org.gnome.Shell.SearchProvider.xml'], + ['org.gnome.ShellSearchProvider2', 'org.gnome.Shell.SearchProvider2.xml'] +] +foreach iface : ifaces + custom_target(iface[0] + ' docs', + input: '../../../data/dbus-interfaces/@0@.xml'.format(iface[0]), + output: 'doc-gen-' + iface[1], + command: [ + 'gdbus-codegen', + '--interface-prefix=@0@.'.format(iface), + '--generate-docbook', 'doc-gen', + '--output-directory', '@OUTDIR@', + '@INPUT@' + ], + build_by_default: true + ) +endforeach + +configure_file( + input: 'version.xml.in', + output: 'version.xml', + configuration: version_conf +) + +gnome.gtkdoc('shell', + main_sgml: 'shell-docs.sgml', + src_dir: [ + join_paths(meson.source_root(), 'src'), + join_paths(meson.build_root(), 'src') + ], + scan_args: [ + '--ignore-headers=' + ' '.join(private_headers + exclude_directories) + ], + install: true +) diff --git a/docs/reference/shell/shell-docs.sgml b/docs/reference/shell/shell-docs.sgml new file mode 100644 index 0000000..2ca6090 --- /dev/null +++ b/docs/reference/shell/shell-docs.sgml @@ -0,0 +1,73 @@ + + + +]> + + + Shell Reference Manual + + for Shell &version;. + + + + + + Actors + + + + Application tracking + + + + + + Search + + + + Tray Icons + + + + + + + Recorder + + + + Integration helpers and utilities + + + + + + + + + + + + + API Index + + + + Index of deprecated API + + + + + diff --git a/docs/reference/shell/version.xml.in b/docs/reference/shell/version.xml.in new file mode 100644 index 0000000..d78bda9 --- /dev/null +++ b/docs/reference/shell/version.xml.in @@ -0,0 +1 @@ +@VERSION@ diff --git a/docs/reference/st/meson.build b/docs/reference/st/meson.build new file mode 100644 index 0000000..3e9e9ab --- /dev/null +++ b/docs/reference/st/meson.build @@ -0,0 +1,23 @@ +private_headers = [ + 'st-private.h', + 'st-theme-node-private.h' +] + +configure_file( + input: 'version.xml.in', + output: 'version.xml', + configuration: version_conf +) + +gnome.gtkdoc('st', + main_sgml: 'st-docs.sgml', + src_dir: [ + join_paths(meson.source_root(), 'src', 'st'), + join_paths(meson.build_root(), 'src', 'st') + ], + scan_args: [ + '--ignore-headers=' + ' '.join(private_headers), + '--rebuild-sections' + ], + install: true +) diff --git a/docs/reference/st/st-docs.sgml b/docs/reference/st/st-docs.sgml new file mode 100644 index 0000000..be4cec2 --- /dev/null +++ b/docs/reference/st/st-docs.sgml @@ -0,0 +1,69 @@ + + + +]> + + + St Reference Manual + + for St &version;. + + + + + + API reference + + Abstract classes and Interfaces + + + + + + Widgets + + + + + + + + Containers + + + + + + + Styling + + + + + + + + + + + API Index + + + + Index of deprecated API + + + + + diff --git a/docs/reference/st/version.xml.in b/docs/reference/st/version.xml.in new file mode 100644 index 0000000..d78bda9 --- /dev/null +++ b/docs/reference/st/version.xml.in @@ -0,0 +1 @@ +@VERSION@ diff --git a/gnome-shell.doap b/gnome-shell.doap new file mode 100644 index 0000000..49af104 --- /dev/null +++ b/gnome-shell.doap @@ -0,0 +1,69 @@ + + + GNOME Shell + Next generation GNOME desktop shell + GNOME Shell provides core user interface functions for the GNOME 3 +desktop, like switching to windows and launching applications. +GNOME Shell takes advantage of the capabilities of modern graphics +hardware and introduces innovative user interface concepts to +provide a visually attractive and easy to use experience. + +Tarball releases are provided largely for distributions to build +packages. If you are interested in building GNOME Shell from source, +we would recommend building from version control using the build +script described at: + + https://wiki.gnome.org/Projects/GnomeShell + +Not only will that give you the very latest version of this rapidly +changing project, it will be much easier than get GNOME Shell and +its dependencies to build from tarballs. + + + + + + + JavaScript + C + + + + William Jon McCann + + mccann + + + + + Owen Taylor + + otaylor + + + + + Colin Walters + + walters + + + + + Marina Zhurakhinskaya + + marinaz + + + + + Florian Müllner + + fmuellner + + + diff --git a/js/extensionPrefs/main.js b/js/extensionPrefs/main.js new file mode 100644 index 0000000..43efa95 --- /dev/null +++ b/js/extensionPrefs/main.js @@ -0,0 +1,636 @@ +const Gettext = imports.gettext; +const { Gdk, GLib, Gio, GObject, Gtk, Pango } = imports.gi; +const Format = imports.format; + +const _ = Gettext.gettext; + +const Config = imports.misc.config; +const ExtensionUtils = imports.misc.extensionUtils; +const { loadInterfaceXML } = imports.misc.fileUtils; + +const GnomeShellIface = loadInterfaceXML('org.gnome.Shell.Extensions'); +const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface); + +function stripPrefix(string, prefix) { + if (string.slice(0, prefix.length) == prefix) + return string.slice(prefix.length); + return string; +} + +var Application = class { + constructor() { + GLib.set_prgname('gnome-shell-extension-prefs'); + this.application = new Gtk.Application({ + application_id: 'org.gnome.shell.ExtensionPrefs', + flags: Gio.ApplicationFlags.HANDLES_COMMAND_LINE + }); + + this.application.connect('activate', this._onActivate.bind(this)); + this.application.connect('command-line', this._onCommandLine.bind(this)); + this.application.connect('startup', this._onStartup.bind(this)); + + this._extensionPrefsModules = {}; + + this._startupUuid = null; + this._loaded = false; + this._skipMainWindow = false; + } + + _extensionAvailable(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + + if (!extension) + return false; + + if (!extension.dir.get_child('prefs.js').query_exists(null)) + return false; + + return true; + } + + _getExtensionPrefsModule(extension) { + let uuid = extension.metadata.uuid; + + if (this._extensionPrefsModules.hasOwnProperty(uuid)) + return this._extensionPrefsModules[uuid]; + + ExtensionUtils.installImporter(extension); + + let prefsModule = extension.imports.prefs; + prefsModule.init(extension.metadata); + + this._extensionPrefsModules[uuid] = prefsModule; + return prefsModule; + } + + _selectExtension(uuid) { + if (!this._extensionAvailable(uuid)) + return; + + let extension = ExtensionUtils.extensions[uuid]; + let widget; + + try { + let prefsModule = this._getExtensionPrefsModule(extension); + widget = prefsModule.buildPrefsWidget(); + } catch (e) { + widget = this._buildErrorUI(extension, e); + } + + let dialog = new Gtk.Window({ modal: !this._skipMainWindow, + type_hint: Gdk.WindowTypeHint.DIALOG }); + dialog.set_titlebar(new Gtk.HeaderBar({ show_close_button: true, + title: extension.metadata.name, + visible: true })); + + if (this._skipMainWindow) { + this.application.add_window(dialog); + if (this._window) + this._window.destroy(); + this._window = dialog; + this._window.window_position = Gtk.WindowPosition.CENTER; + } else { + dialog.transient_for = this._window; + } + + dialog.set_default_size(600, 400); + dialog.add(widget); + dialog.show(); + } + + _buildErrorUI(extension, exc) { + let scroll = new Gtk.ScrolledWindow({ + hscrollbar_policy: Gtk.PolicyType.NEVER, + propagate_natural_height: true + }); + + let box = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 12, + margin: 100, + margin_bottom: 60 + }); + scroll.add(box); + + let label = new Gtk.Label({ + label: '%s'.format(_("Something’s gone wrong")), + use_markup: true + }); + label.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL); + box.add(label); + + label = new Gtk.Label({ + label: _("We’re very sorry, but there’s been a problem: the settings for this extension can’t be displayed. We recommend that you report the issue to the extension authors."), + justify: Gtk.Justification.CENTER, + wrap: true + }); + box.add(label); + + let expander = new Expander({ + label: _("Technical Details"), + margin_top: 12 + }); + box.add(expander); + + let errortext = `${exc}\n\nStack trace:\n${ + // Indent stack trace. + exc.stack.split('\n').map(line => ` ${line}`).join('\n') + }`; + + let buffer = new Gtk.TextBuffer({ text: errortext }); + let textview = new Gtk.TextView({ + buffer: buffer, + wrap_mode: Gtk.WrapMode.WORD, + monospace: true, + editable: false, + top_margin: 12, + bottom_margin: 12, + left_margin: 12, + right_margin: 12 + }); + + let toolbar = new Gtk.Toolbar(); + let provider = new Gtk.CssProvider(); + provider.load_from_data(`* { + border: 0 solid @borders; + border-top-width: 1px; + }`); + toolbar.get_style_context().add_provider( + provider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ); + + let copyButton = new Gtk.ToolButton({ + icon_name: 'edit-copy-symbolic', + tooltip_text: _("Copy Error") + }); + toolbar.add(copyButton); + + copyButton.connect('clicked', w => { + let clipboard = Gtk.Clipboard.get_default(w.get_display()); + let backticks = '```'; + clipboard.set_text( + // markdown for pasting in gitlab issues + `The settings of extension ${extension.uuid} had an error:\n${ + backticks}\n${exc}\n${backticks}\n\nStack trace:\n${ + backticks}\n${exc.stack}${backticks}\n`, -1 + ); + }); + + let spacing = new Gtk.SeparatorToolItem({ draw: false }); + toolbar.add(spacing); + toolbar.child_set_property(spacing, "expand", true); + + let urlButton = new Gtk.ToolButton({ + label: _("Homepage"), + tooltip_text: _("Visit extension homepage"), + no_show_all: true, + visible: extension.metadata.url != null + }); + toolbar.add(urlButton); + + urlButton.connect('clicked', w => { + let context = w.get_display().get_app_launch_context(); + Gio.AppInfo.launch_default_for_uri(extension.metadata.url, context); + }); + + let expandedBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL + }); + expandedBox.add(textview); + expandedBox.add(toolbar); + + expander.add(expandedBox); + + scroll.show_all(); + return scroll; + } + + _buildUI(app) { + this._window = new Gtk.ApplicationWindow({ application: app, + window_position: Gtk.WindowPosition.CENTER }); + + this._window.set_default_size(800, 500); + + this._titlebar = new Gtk.HeaderBar({ show_close_button: true, + title: _("Shell Extensions") }); + this._window.set_titlebar(this._titlebar); + + let killSwitch = new Gtk.Switch({ valign: Gtk.Align.CENTER }); + this._titlebar.pack_end(killSwitch); + + this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); + this._settings.bind('disable-user-extensions', killSwitch, 'active', + Gio.SettingsBindFlags.DEFAULT | + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._mainStack = new Gtk.Stack({ + transition_type: Gtk.StackTransitionType.CROSSFADE + }); + this._window.add(this._mainStack); + + let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER }); + + this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE }); + this._extensionSelector.set_sort_func(this._sortList.bind(this)); + this._extensionSelector.set_header_func(this._updateHeader.bind(this)); + + scroll.add(this._extensionSelector); + + this._mainStack.add_named(scroll, 'listing'); + this._mainStack.add_named(new EmptyPlaceholder(), 'placeholder'); + + this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell'); + this._shellProxy.connectSignal('ExtensionStatusChanged', (proxy, senderName, [uuid, state, error]) => { + if (ExtensionUtils.extensions[uuid] !== undefined) + this._scanExtensions(); + }); + + this._window.show_all(); + } + + _sortList(row1, row2) { + let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name; + let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name; + return name1.localeCompare(name2); + } + + _updateHeader(row, before) { + if (!before || row.get_header()) + return; + + let sep = new Gtk.Separator({ orientation: Gtk.Orientation.HORIZONTAL }); + row.set_header(sep); + } + + _scanExtensions() { + let finder = new ExtensionUtils.ExtensionFinder(); + finder.connect('extension-found', this._extensionFound.bind(this)); + finder.scanExtensions(); + this._extensionsLoaded(); + } + + _extensionFound(finder, extension) { + let row = new ExtensionRow(extension.uuid); + + row.prefsButton.visible = this._extensionAvailable(row.uuid); + row.prefsButton.connect('clicked', () => { + this._selectExtension(row.uuid); + }); + + row.show_all(); + this._extensionSelector.add(row); + } + + _extensionsLoaded() { + if (this._extensionSelector.get_children().length > 0) + this._mainStack.visible_child_name = 'listing'; + else + this._mainStack.visible_child_name = 'placeholder'; + + if (this._startupUuid && this._extensionAvailable(this._startupUuid)) + this._selectExtension(this._startupUuid); + this._startupUuid = null; + this._skipMainWindow = false; + this._loaded = true; + } + + _onActivate() { + this._window.present(); + } + + _onStartup(app) { + this._buildUI(app); + this._scanExtensions(); + } + + _onCommandLine(app, commandLine) { + app.activate(); + let args = commandLine.get_arguments(); + + if (args.length) { + let uuid = args[0]; + + this._skipMainWindow = true; + + // Strip off "extension:///" prefix which fakes a URI, if it exists + uuid = stripPrefix(uuid, "extension:///"); + + if (this._extensionAvailable(uuid)) + this._selectExtension(uuid); + else if (!this._loaded) + this._startupUuid = uuid; + else + this._skipMainWindow = false; + } + return 0; + } +}; + +var Expander = GObject.registerClass({ + Properties: { + 'label': GObject.ParamSpec.string( + 'label', 'label', 'label', + GObject.ParamFlags.READWRITE, + null + ) + } +}, class Expander extends Gtk.Box { + _init(params = {}) { + this._labelText = null; + + super._init(Object.assign(params, { + orientation: Gtk.Orientation.VERTICAL, + spacing: 0 + })); + + this._frame = new Gtk.Frame({ + shadow_type: Gtk.ShadowType.IN, + hexpand: true + }); + + let eventBox = new Gtk.EventBox(); + this._frame.add(eventBox); + + let hbox = new Gtk.Box({ + spacing: 6, + margin: 12 + }); + eventBox.add(hbox); + + this._arrow = new Gtk.Image({ + icon_name: 'pan-end-symbolic' + }); + hbox.add(this._arrow); + + this._label = new Gtk.Label({ label: this._labelText }); + hbox.add(this._label); + + this._revealer = new Gtk.Revealer(); + + this._childBin = new Gtk.Frame({ + shadow_type: Gtk.ShadowType.IN + }); + this._revealer.add(this._childBin); + + // Directly chain up to parent for internal children + super.add(this._frame); + super.add(this._revealer); + + let provider = new Gtk.CssProvider(); + provider.load_from_data('* { border-top-width: 0; }'); + this._childBin.get_style_context().add_provider( + provider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ); + + this._gesture = new Gtk.GestureMultiPress({ + widget: this._frame, + button: 0, + exclusive: true + }); + this._gesture.connect('released', (gesture, nPress) => { + if (nPress == 1) + this._revealer.reveal_child = !this._revealer.reveal_child; + }); + this._revealer.connect('notify::reveal-child', () => { + if (this._revealer.reveal_child) + this._arrow.icon_name = 'pan-down-symbolic'; + else + this._arrow.icon_name = 'pan-end-symbolic'; + }); + } + + get label() { + return this._labelText; + } + + set label(text) { + if (this._labelText == text) + return; + + if (this._label) + this._label.label = text; + this._labelText = text; + this.notify('label'); + } + + add(child) { + // set expanded child + this._childBin.get_children().forEach(c => { + this._childBin.remove(c); + }); + + if (child) + this._childBin.add(child); + } +}); + +var EmptyPlaceholder = GObject.registerClass( +class EmptyPlaceholder extends Gtk.Box { + _init() { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 6, + margin: 32 + }); + + let image = new Gtk.Image({ + icon_name: 'application-x-addon-symbolic', + pixel_size: 96, + visible: true, + vexpand: true, + valign: Gtk.Align.END + }); + image.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL); + this.add(image); + + let label = new Gtk.Label({ + label: `${_("No Extensions Installed" )}`, + use_markup: true, + visible: true + }); + label.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL); + this.add(label); + + let appInfo = Gio.DesktopAppInfo.new('org.gnome.Software.desktop'); + + let desc = new Gtk.Label({ + label: _("Extensions can be installed through Software or extensions.gnome.org."), + use_markup: true, + wrap: true, + justify: Gtk.Justification.CENTER, + visible: true, + max_width_chars: 50, + hexpand: true, + vexpand: (appInfo == null), + halign: Gtk.Align.CENTER, + valign: Gtk.Align.START + }); + this.add(desc); + + if (appInfo) { + let button = new Gtk.Button({ + label: _("Browse in Software"), + image: new Gtk.Image({ + icon_name: "org.gnome.Software-symbolic" + }), + always_show_image: true, + margin_top: 12, + visible: true, + halign: Gtk.Align.CENTER, + valign: Gtk.Align.START, + vexpand: true + }); + this.add(button); + + button.connect('clicked', w => { + let context = w.get_display().get_app_launch_context(); + appInfo.launch([], context); + }); + } + } +}); + +var DescriptionLabel = GObject.registerClass( +class DescriptionLabel extends Gtk.Label { + vfunc_get_preferred_height_for_width(width) { + // Hack: Request the maximum height allowed by the line limit + if (this.lines > 0) + return super.vfunc_get_preferred_height_for_width(0); + return super.vfunc_get_preferred_height_for_width(width); + } +}); + +var ExtensionRow = GObject.registerClass( +class ExtensionRow extends Gtk.ListBoxRow { + _init(uuid) { + super._init(); + + this.uuid = uuid; + + this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); + this._settings.connect('changed::enabled-extensions', () => { + this._switch.state = this._isEnabled(); + }); + this._settings.connect('changed::disable-extension-version-validation', + () => { + this._switch.sensitive = this._canEnable(); + }); + this._settings.connect('changed::disable-user-extensions', + () => { + this._switch.sensitive = this._canEnable(); + }); + + this._buildUI(); + } + + _buildUI() { + let extension = ExtensionUtils.extensions[this.uuid]; + + let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL, + hexpand: true, margin_end: 24, spacing: 24, + margin: 12 }); + this.add(hbox); + + let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, + spacing: 6, hexpand: true }); + hbox.add(vbox); + + let name = GLib.markup_escape_text(extension.metadata.name, -1); + let label = new Gtk.Label({ label: '' + name + '', + use_markup: true, + halign: Gtk.Align.START }); + vbox.add(label); + + let desc = extension.metadata.description.split('\n')[0]; + label = new DescriptionLabel({ label: desc, wrap: true, lines: 2, + ellipsize: Pango.EllipsizeMode.END, + xalign: 0, yalign: 0 }); + vbox.add(label); + + let button = new Gtk.Button({ valign: Gtk.Align.CENTER, + no_show_all: true }); + button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic', + icon_size: Gtk.IconSize.BUTTON, + visible: true })); + button.get_style_context().add_class('circular'); + hbox.add(button); + + this.prefsButton = button; + + this._switch = new Gtk.Switch({ valign: Gtk.Align.CENTER, + sensitive: this._canEnable(), + state: this._isEnabled() }); + this._switch.connect('notify::active', () => { + if (this._switch.active) + this._enable(); + else + this._disable(); + }); + this._switch.connect('state-set', () => true); + hbox.add(this._switch); + } + + _canEnable() { + let extension = ExtensionUtils.extensions[this.uuid]; + let checkVersion = !this._settings.get_boolean('disable-extension-version-validation'); + + return !this._settings.get_boolean('disable-user-extensions') && + !(checkVersion && ExtensionUtils.isOutOfDate(extension)); + } + + _isEnabled() { + let extensions = this._settings.get_strv('enabled-extensions'); + return extensions.indexOf(this.uuid) != -1; + } + + _enable() { + let extensions = this._settings.get_strv('enabled-extensions'); + if (extensions.indexOf(this.uuid) != -1) + return; + + extensions.push(this.uuid); + this._settings.set_strv('enabled-extensions', extensions); + } + + _disable() { + let extensions = this._settings.get_strv('enabled-extensions'); + let pos = extensions.indexOf(this.uuid); + if (pos == -1) + return; + do { + extensions.splice(pos, 1); + pos = extensions.indexOf(this.uuid); + } while (pos != -1); + this._settings.set_strv('enabled-extensions', extensions); + } +}); + +function initEnvironment() { + // Monkey-patch in a "global" object that fakes some Shell utilities + // that ExtensionUtils depends on. + window.global = { + log() { + print([].join.call(arguments, ', ')); + }, + + logError(s) { + log('ERROR: ' + s); + }, + + userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell']) + }; + + String.prototype.format = Format.format; +} + +function main(argv) { + initEnvironment(); + + Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR); + Gettext.textdomain(Config.GETTEXT_PACKAGE); + + let app = new Application(); + app.application.run(argv); +} diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js new file mode 100644 index 0000000..d7f53a9 --- /dev/null +++ b/js/gdm/authPrompt.js @@ -0,0 +1,512 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Pango, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Animation = imports.ui.animation; +const Batch = imports.gdm.batch; +const GdmUtil = imports.gdm.util; +const Params = imports.misc.params; +const ShellEntry = imports.ui.shellEntry; +const Tweener = imports.ui.tweener; +const UserWidget = imports.ui.userWidget; + +var DEFAULT_BUTTON_WELL_ICON_SIZE = 16; +var DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0; +var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3; + +var MESSAGE_FADE_OUT_ANIMATION_TIME = 0.5; + +var AuthPromptMode = { + UNLOCK_ONLY: 0, + UNLOCK_OR_LOG_IN: 1 +}; + +var AuthPromptStatus = { + NOT_VERIFYING: 0, + VERIFYING: 1, + VERIFICATION_FAILED: 2, + VERIFICATION_SUCCEEDED: 3 +}; + +var BeginRequestType = { + PROVIDE_USERNAME: 0, + DONT_PROVIDE_USERNAME: 1 +}; + +var AuthPrompt = class { + constructor(gdmClient, mode) { + this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; + + this._gdmClient = gdmClient; + this._mode = mode; + + let reauthenticationOnly; + if (this._mode == AuthPromptMode.UNLOCK_ONLY) + reauthenticationOnly = true; + else if (this._mode == AuthPromptMode.UNLOCK_OR_LOG_IN) + reauthenticationOnly = false; + + this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly: reauthenticationOnly }); + + this._userVerifier.connect('ask-question', this._onAskQuestion.bind(this)); + this._userVerifier.connect('show-message', this._onShowMessage.bind(this)); + this._userVerifier.connect('verification-failed', this._onVerificationFailed.bind(this)); + this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this)); + this._userVerifier.connect('reset', this._onReset.bind(this)); + this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this)); + this._userVerifier.connect('ovirt-user-authenticated', this._onOVirtUserAuthenticated.bind(this)); + this.smartcardDetected = this._userVerifier.smartcardDetected; + + this.connect('next', () => { + this.updateSensitivity(false); + this.startSpinning(); + if (this._queryingService) { + this._userVerifier.answerQuery(this._queryingService, this._entry.text); + } else { + this._preemptiveAnswer = this._entry.text; + } + }); + + this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout', + vertical: true }); + this.actor.connect('destroy', this._onDestroy.bind(this)); + this.actor.connect('key-press-event', (actor, event) => { + if (event.get_key_symbol() == Clutter.KEY_Escape) + this.cancel(); + return Clutter.EVENT_PROPAGATE; + }); + + this._userWell = new St.Bin({ x_fill: true, + x_align: St.Align.START }); + this.actor.add(this._userWell, + { x_align: St.Align.START, + x_fill: true, + y_fill: true, + expand: true }); + this._label = new St.Label({ style_class: 'login-dialog-prompt-label' }); + + this.actor.add(this._label, + { expand: true, + x_fill: false, + y_fill: true, + x_align: St.Align.START }); + this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry', + can_focus: true }); + ShellEntry.addContextMenu(this._entry, { isPassword: true, actionMode: Shell.ActionMode.NONE }); + + this.actor.add(this._entry, + { expand: true, + x_fill: true, + y_fill: false, + x_align: St.Align.START }); + + this._entry.grab_key_focus(); + + this._message = new St.Label({ opacity: 0, + styleClass: 'login-dialog-message' }); + this._message.clutter_text.line_wrap = true; + this._message.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this.actor.add(this._message, { x_fill: false, x_align: St.Align.START, y_align: St.Align.START }); + + this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box', + vertical: false }); + this.actor.add(this._buttonBox, + { expand: true, + x_align: St.Align.MIDDLE, + y_align: St.Align.END }); + + this._defaultButtonWell = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._defaultButtonWellActor = null; + + this._initButtons(); + + this._spinner = new Animation.Spinner(DEFAULT_BUTTON_WELL_ICON_SIZE); + this._spinner.actor.opacity = 0; + this._spinner.actor.show(); + this._defaultButtonWell.add_child(this._spinner.actor); + } + + _onDestroy() { + this._userVerifier.destroy(); + this._userVerifier = null; + } + + _initButtons() { + this.cancelButton = new St.Button({ style_class: 'modal-dialog-button button', + button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, + reactive: true, + can_focus: true, + label: _("Cancel") }); + this.cancelButton.connect('clicked', () => { this.cancel(); }); + this._buttonBox.add(this.cancelButton, + { expand: false, + x_fill: false, + y_fill: false, + x_align: St.Align.START, + y_align: St.Align.END }); + + this._buttonBox.add(this._defaultButtonWell, + { expand: true, + x_fill: false, + y_fill: false, + x_align: St.Align.END, + y_align: St.Align.MIDDLE }); + this.nextButton = new St.Button({ style_class: 'modal-dialog-button button', + button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, + reactive: true, + can_focus: true, + label: _("Next") }); + this.nextButton.connect('clicked', () => { this.emit('next'); }); + this.nextButton.add_style_pseudo_class('default'); + this._buttonBox.add(this.nextButton, + { expand: false, + x_fill: false, + y_fill: false, + x_align: St.Align.END, + y_align: St.Align.END }); + + this._updateNextButtonSensitivity(this._entry.text.length > 0); + + this._entry.clutter_text.connect('text-changed', () => { + if (!this._userVerifier.hasPendingMessages) + this._fadeOutMessage(); + + this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING); + }); + this._entry.clutter_text.connect('activate', () => { + if (this.nextButton.reactive) + this.emit('next'); + }); + } + + _onAskQuestion(verifier, serviceName, question, passwordChar) { + if (this._queryingService) + this.clear(); + + this._queryingService = serviceName; + if (this._preemptiveAnswer) { + this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer); + this._preemptiveAnswer = null; + return; + } + this.setPasswordChar(passwordChar); + this.setQuestion(question); + + if (passwordChar) { + if (this._userVerifier.reauthenticating) + this.nextButton.label = _("Unlock"); + else + this.nextButton.label = C_("button", "Sign In"); + } else { + this.nextButton.label = _("Next"); + } + + this.updateSensitivity(true); + this.emit('prompted'); + } + + _onOVirtUserAuthenticated() { + if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) + this.reset(); + } + + _onSmartcardStatusChanged() { + this.smartcardDetected = this._userVerifier.smartcardDetected; + + // Most of the time we want to reset if the user inserts or removes + // a smartcard. Smartcard insertion "preempts" what the user was + // doing, and smartcard removal aborts the preemption. + // The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying + // with a smartcard + // 2) Don't reset if we've already succeeded at verification and + // the user is getting logged in. + if (this._userVerifier.serviceIsDefault(GdmUtil.SMARTCARD_SERVICE_NAME) && + this.verificationStatus == AuthPromptStatus.VERIFYING && + this.smartcardDetected) + return; + + if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) + this.reset(); + } + + _onShowMessage(userVerifier, message, type) { + this.setMessage(message, type); + this.emit('prompted'); + } + + _onVerificationFailed(userVerifier, canRetry) { + this._queryingService = null; + this.clear(); + + this.updateSensitivity(canRetry); + this.setActorInDefaultButtonWell(null); + this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; + } + + _onVerificationComplete() { + this.setActorInDefaultButtonWell(null); + this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED; + this.cancelButton.reactive = false; + } + + _onReset() { + this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; + this.reset(); + } + + addActorToDefaultButtonWell(actor) { + this._defaultButtonWell.add_child(actor); + } + + setActorInDefaultButtonWell(actor, animate) { + if (!this._defaultButtonWellActor && + !actor) + return; + + let oldActor = this._defaultButtonWellActor; + + if (oldActor) + Tweener.removeTweens(oldActor); + + let wasSpinner; + if (oldActor == this._spinner.actor) + wasSpinner = true; + else + wasSpinner = false; + + let isSpinner; + if (actor == this._spinner.actor) + isSpinner = true; + else + isSpinner = false; + + if (this._defaultButtonWellActor != actor && oldActor) { + if (!animate) { + oldActor.opacity = 0; + + if (wasSpinner) { + if (this._spinner) + this._spinner.stop(); + } + } else { + Tweener.addTween(oldActor, + { opacity: 0, + time: DEFAULT_BUTTON_WELL_ANIMATION_TIME, + delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY, + transition: 'linear', + onCompleteScope: this, + onComplete() { + if (wasSpinner) { + if (this._spinner) + this._spinner.stop(); + } + } + }); + } + } + + if (actor) { + if (isSpinner) + this._spinner.play(); + + if (!animate) + actor.opacity = 255; + else + Tweener.addTween(actor, + { opacity: 255, + time: DEFAULT_BUTTON_WELL_ANIMATION_TIME, + delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY, + transition: 'linear' }); + } + + this._defaultButtonWellActor = actor; + } + + startSpinning() { + this.setActorInDefaultButtonWell(this._spinner.actor, true); + } + + stopSpinning() { + this.setActorInDefaultButtonWell(null, false); + } + + clear() { + this._entry.text = ''; + this.stopSpinning(); + } + + setPasswordChar(passwordChar) { + this._entry.clutter_text.set_password_char(passwordChar); + this._entry.menu.isPassword = passwordChar != ''; + } + + setQuestion(question) { + this._label.set_text(question); + + this._label.show(); + this._entry.show(); + + this._entry.grab_key_focus(); + } + + getAnswer() { + let text; + + if (this._preemptiveAnswer) { + text = this._preemptiveAnswer; + this._preemptiveAnswer = null; + } else { + text = this._entry.get_text(); + } + + return text; + } + + _fadeOutMessage() { + if (this._message.opacity == 0) + return; + Tweener.removeTweens(this._message); + Tweener.addTween(this._message, + { opacity: 0, + time: MESSAGE_FADE_OUT_ANIMATION_TIME, + transition: 'easeOutQuad' + }); + } + + setMessage(message, type) { + if (type == GdmUtil.MessageType.ERROR) + this._message.add_style_class_name('login-dialog-message-warning'); + else + this._message.remove_style_class_name('login-dialog-message-warning'); + + if (type == GdmUtil.MessageType.HINT) + this._message.add_style_class_name('login-dialog-message-hint'); + else + this._message.remove_style_class_name('login-dialog-message-hint'); + + if (message) { + Tweener.removeTweens(this._message); + this._message.text = message; + this._message.opacity = 255; + } else { + this._message.opacity = 0; + } + } + + _updateNextButtonSensitivity(sensitive) { + this.nextButton.reactive = sensitive; + this.nextButton.can_focus = sensitive; + } + + updateSensitivity(sensitive) { + this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING)); + this._entry.reactive = sensitive; + this._entry.clutter_text.editable = sensitive; + } + + hide() { + this.setActorInDefaultButtonWell(null, true); + this.actor.hide(); + this._message.opacity = 0; + + this.setUser(null); + + this.updateSensitivity(true); + this._entry.set_text(''); + } + + setUser(user) { + let oldChild = this._userWell.get_child(); + if (oldChild) + oldChild.destroy(); + + if (user) { + let userWidget = new UserWidget.UserWidget(user); + this._userWell.set_child(userWidget.actor); + } + } + + reset() { + let oldStatus = this.verificationStatus; + this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; + this.cancelButton.reactive = true; + this.nextButton.label = _("Next"); + this._preemptiveAnswer = null; + + if (this._userVerifier) + this._userVerifier.cancel(); + + this._queryingService = null; + this.clear(); + this._message.opacity = 0; + this.setUser(null); + this.stopSpinning(); + + if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED) + this.emit('failed'); + + let beginRequestType; + + if (this._mode == AuthPromptMode.UNLOCK_ONLY) { + // The user is constant at the unlock screen, so it will immediately + // respond to the request with the username + beginRequestType = BeginRequestType.PROVIDE_USERNAME; + } else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) || + this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME)) { + // We don't need to know the username if the user preempted the login screen + // with a smartcard or with preauthenticated oVirt credentials + beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME; + } else { + // In all other cases, we should get the username up front. + beginRequestType = BeginRequestType.PROVIDE_USERNAME; + } + + this.emit('reset', beginRequestType); + } + + addCharacter(unichar) { + if (!this._entry.visible) + return; + + this._entry.grab_key_focus(); + this._entry.clutter_text.insert_unichar(unichar); + } + + begin(params) { + params = Params.parse(params, { userName: null, + hold: null }); + + this.updateSensitivity(false); + + let hold = params.hold; + if (!hold) + hold = new Batch.Hold(); + + this._userVerifier.begin(params.userName, hold); + this.verificationStatus = AuthPromptStatus.VERIFYING; + } + + finish(onComplete) { + if (!this._userVerifier.hasPendingMessages) { + this._userVerifier.clear(); + onComplete(); + return; + } + + let signalId = this._userVerifier.connect('no-more-messages', () => { + this._userVerifier.disconnect(signalId); + this._userVerifier.clear(); + onComplete(); + }); + } + + cancel() { + if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) { + return; + } + this.reset(); + this.emit('cancelled'); + } +}; +Signals.addSignalMethods(AuthPrompt.prototype); diff --git a/js/gdm/batch.js b/js/gdm/batch.js new file mode 100644 index 0000000..bd84c92 --- /dev/null +++ b/js/gdm/batch.js @@ -0,0 +1,211 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +/* + * Copyright 2011 Red Hat, Inc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +/* + * In order for transformation animations to look good, they need to be + * incremental and have some order to them (e.g., fade out hidden items, + * then shrink to close the void left over). Chaining animations in this way can + * be error-prone and wordy using just Tweener callbacks. + * + * The classes in this file help with this: + * + * - Task. encapsulates schedulable work to be run in a specific scope. + * + * - ConsecutiveBatch. runs a series of tasks in order and completes + * when the last in the series finishes. + * + * - ConcurrentBatch. runs a set of tasks at the same time and completes + * when the last to finish completes. + * + * - Hold. prevents a batch from completing the pending task until + * the hold is released. + * + * The tasks associated with a batch are specified in a list at batch + * construction time as either task objects or plain functions. + * Batches are task objects, themselves, so they can be nested. + * + * These classes aren't specific to GDM, but were found to be unintuitive and so + * are not used elsewhere. These APIs may ultimately get dropped entirely and + * replaced by something else. + */ + +const Signals = imports.signals; + +var Task = class { + constructor(scope, handler) { + if (scope) + this.scope = scope; + else + this.scope = this; + + this.handler = handler; + } + + run() { + if (this.handler) + return this.handler.call(this.scope); + + return null; + } +}; +Signals.addSignalMethods(Task.prototype); + +var Hold = class extends Task { + constructor() { + super(null, () => this); + + this._acquisitions = 1; + } + + acquire() { + if (this._acquisitions <= 0) + throw new Error("Cannot acquire hold after it's been released"); + this._acquisitions++; + } + + acquireUntilAfter(hold) { + if (!hold.isAcquired()) + return; + + this.acquire(); + let signalId = hold.connect('release', () => { + hold.disconnect(signalId); + this.release(); + }); + } + + release() { + this._acquisitions--; + + if (this._acquisitions == 0) + this.emit('release'); + } + + isAcquired() { + return this._acquisitions > 0; + } +}; +Signals.addSignalMethods(Hold.prototype); + +var Batch = class extends Task { + constructor(scope, tasks) { + super(); + + this.tasks = []; + + for (let i = 0; i < tasks.length; i++) { + let task; + + if (tasks[i] instanceof Task) { + task = tasks[i]; + } else if (typeof tasks[i] == 'function') { + task = new Task(scope, tasks[i]); + } else { + throw new Error('Batch tasks must be functions or Task, Hold or Batch objects'); + } + + this.tasks.push(task); + } + } + + process() { + throw new Error('Not implemented'); + } + + runTask() { + if (!(this._currentTaskIndex in this.tasks)) { + return null; + } + + return this.tasks[this._currentTaskIndex].run(); + } + + _finish() { + this.hold.release(); + } + + nextTask() { + this._currentTaskIndex++; + + // if the entire batch of tasks is finished, release + // the hold and notify anyone waiting on the batch + if (this._currentTaskIndex >= this.tasks.length) { + this._finish(); + return; + } + + this.process(); + } + + _start() { + // acquire a hold to get released when the entire + // batch of tasks is finished + this.hold = new Hold(); + this._currentTaskIndex = 0; + this.process(); + } + + run() { + this._start(); + + // hold may be destroyed at this point + // if we're already done running + return this.hold; + } + + cancel() { + this.tasks = this.tasks.splice(0, this._currentTaskIndex + 1); + } +}; +Signals.addSignalMethods(Batch.prototype); + +var ConcurrentBatch = class extends Batch { + process() { + let hold = this.runTask(); + + if (hold) { + this.hold.acquireUntilAfter(hold); + } + + // Regardless of the state of the just run task, + // fire off the next one, so all the tasks can run + // concurrently. + this.nextTask(); + } +}; +Signals.addSignalMethods(ConcurrentBatch.prototype); + +var ConsecutiveBatch = class extends Batch { + process() { + let hold = this.runTask(); + + if (hold && hold.isAcquired()) { + // This task is inhibiting the batch. Wait on it + // before processing the next one. + let signalId = hold.connect('release', () => { + hold.disconnect(signalId); + this.nextTask(); + }); + return; + } else { + // This task finished, process the next one + this.nextTask(); + } + } +}; +Signals.addSignalMethods(ConsecutiveBatch.prototype); diff --git a/js/gdm/fingerprint.js b/js/gdm/fingerprint.js new file mode 100644 index 0000000..5bf2bec --- /dev/null +++ b/js/gdm/fingerprint.js @@ -0,0 +1,32 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; + +const FprintManagerIface = ` + + + + + + +`; + +const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface); + +function FprintManager() { + var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system, + g_interface_name: FprintManagerInfo.name, + g_interface_info: FprintManagerInfo, + g_name: 'net.reactivated.Fprint', + g_object_path: '/net/reactivated/Fprint/Manager', + g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) }); + + try { + self.init(null); + } catch(e) { + log('Failed to connect to Fprint service: ' + e.message); + return null; + } + + return self; +} diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js new file mode 100644 index 0000000..6c4d135 --- /dev/null +++ b/js/gdm/loginDialog.js @@ -0,0 +1,1260 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +/* + * Copyright 2011 Red Hat, Inc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +const { AccountsService, Atk, Clutter, Gdm, Gio, + GLib, GObject, Meta, Pango, Shell, St } = imports.gi; +const Signals = imports.signals; + +const AuthPrompt = imports.gdm.authPrompt; +const Batch = imports.gdm.batch; +const BoxPointer = imports.ui.boxpointer; +const CtrlAltTab = imports.ui.ctrlAltTab; +const GdmUtil = imports.gdm.util; +const Layout = imports.ui.layout; +const LoginManager = imports.misc.loginManager; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Realmd = imports.gdm.realmd; +const Tweener = imports.ui.tweener; +const UserWidget = imports.ui.userWidget; + +const _FADE_ANIMATION_TIME = 0.25; +const _SCROLL_ANIMATION_TIME = 0.5; +const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0; +const _LOGO_ICON_HEIGHT = 48; +const _MAX_BOTTOM_MENU_ITEMS = 5; + +var UserListItem = class { + constructor(user) { + this.user = user; + this._userChangedId = this.user.connect('changed', + this._onUserChanged.bind(this)); + + let layout = new St.BoxLayout({ vertical: true }); + this.actor = new St.Button({ style_class: 'login-dialog-user-list-item', + button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, + can_focus: true, + child: layout, + reactive: true, + x_align: St.Align.START, + x_fill: true }); + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this.actor.connect('key-focus-in', () => { + this._setSelected(true); + }); + this.actor.connect('key-focus-out', () => { + this._setSelected(false); + }); + this.actor.connect('notify::hover', () => { + this._setSelected(this.actor.hover); + }); + + this._userWidget = new UserWidget.UserWidget(this.user); + layout.add(this._userWidget.actor); + + this._userWidget.actor.bind_property('label-actor', this.actor, 'label-actor', + GObject.BindingFlags.SYNC_CREATE); + + this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator', + scale_x: 0, + visible: false }); + layout.add(this._timedLoginIndicator); + + this.actor.connect('clicked', this._onClicked.bind(this)); + this._onUserChanged(); + } + + _onUserChanged() { + this._updateLoggedIn(); + } + + _updateLoggedIn() { + if (this.user.is_logged_in()) + this.actor.add_style_pseudo_class('logged-in'); + else + this.actor.remove_style_pseudo_class('logged-in'); + } + + _onDestroy() { + this.user.disconnect(this._userChangedId); + } + + _onClicked() { + this.emit('activate'); + } + + _setSelected(selected) { + if (selected) { + this.actor.add_style_pseudo_class('selected'); + this.actor.grab_key_focus(); + } else { + this.actor.remove_style_pseudo_class('selected'); + } + } + + showTimedLoginIndicator(time) { + let hold = new Batch.Hold(); + + this.hideTimedLoginIndicator(); + + this._timedLoginIndicator.visible = true; + + let startTime = GLib.get_monotonic_time(); + + this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33, + () => { + let currentTime = GLib.get_monotonic_time(); + let elapsedTime = (currentTime - startTime) / GLib.USEC_PER_SEC; + this._timedLoginIndicator.scale_x = elapsedTime / time; + if (elapsedTime >= time) { + this._timedLoginTimeoutId = 0; + hold.release(); + return GLib.SOURCE_REMOVE; + } + + return GLib.SOURCE_CONTINUE; + }); + + GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId'); + + return hold; + } + + hideTimedLoginIndicator() { + if (this._timedLoginTimeoutId) { + GLib.source_remove(this._timedLoginTimeoutId); + this._timedLoginTimeoutId = 0; + } + + this._timedLoginIndicator.visible = false; + this._timedLoginIndicator.scale_x = 0.; + } +}; +Signals.addSignalMethods(UserListItem.prototype); + +var UserList = class { + constructor() { + this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'}); + this.actor.set_policy(St.PolicyType.NEVER, + St.PolicyType.AUTOMATIC); + + this._box = new St.BoxLayout({ vertical: true, + style_class: 'login-dialog-user-list', + pseudo_class: 'expanded' }); + + this.actor.add_actor(this._box); + this._items = {}; + + this.actor.connect('key-focus-in', this._moveFocusToItems.bind(this)); + } + + _moveFocusToItems() { + let hasItems = Object.keys(this._items).length > 0; + + if (!hasItems) + return; + + if (global.stage.get_key_focus() != this.actor) + return; + + let focusSet = this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + if (!focusSet) { + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._moveFocusToItems(); + return false; + }); + } + } + + _onItemActivated(activatedItem) { + this.emit('activate', activatedItem); + } + + updateStyle(isExpanded) { + let tasks = []; + + if (isExpanded) + this._box.add_style_pseudo_class('expanded'); + else + this._box.remove_style_pseudo_class('expanded'); + + for (let userName in this._items) { + let item = this._items[userName]; + item.actor.sync_hover(); + } + } + + scrollToItem(item) { + let box = item.actor.get_allocation_box(); + + let adjustment = this.actor.get_vscroll_bar().get_adjustment(); + + let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0); + Tweener.removeTweens(adjustment); + Tweener.addTween (adjustment, + { value: value, + time: _SCROLL_ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + + jumpToItem(item) { + let box = item.actor.get_allocation_box(); + + let adjustment = this.actor.get_vscroll_bar().get_adjustment(); + + let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0); + + adjustment.set_value(value); + } + + getItemFromUserName(userName) { + let item = this._items[userName]; + + if (!item) + return null; + + return item; + } + + containsUser(user) { + return this._items[user.get_user_name()] != null; + } + + addUser(user) { + if (!user.is_loaded) + return; + + if (user.is_system_account()) + return; + + if (user.locked) + return; + + let userName = user.get_user_name(); + + if (!userName) + return; + + this.removeUser(user); + + let item = new UserListItem(user); + this._box.add(item.actor, { x_fill: true }); + + this._items[userName] = item; + + item.connect('activate', this._onItemActivated.bind(this)); + + // Try to keep the focused item front-and-center + item.actor.connect('key-focus-in', () => { this.scrollToItem(item); }); + + this._moveFocusToItems(); + + this.emit('item-added', item); + } + + removeUser(user) { + if (!user.is_loaded) + return; + + let userName = user.get_user_name(); + + if (!userName) + return; + + let item = this._items[userName]; + + if (!item) + return; + + item.actor.destroy(); + delete this._items[userName]; + } + + numItems() { + return Object.keys(this._items).length; + } +}; +Signals.addSignalMethods(UserList.prototype); + +var SessionMenuButton = class { + constructor() { + let gearIcon = new St.Icon({ icon_name: 'emblem-system-symbolic' }); + this._button = new St.Button({ style_class: 'login-dialog-session-list-button', + reactive: true, + track_hover: true, + can_focus: true, + accessible_name: _("Choose Session"), + accessible_role: Atk.Role.MENU, + child: gearIcon }); + + this.actor = new St.Bin({ child: this._button }); + + let side = St.Side.TOP; + let align = 0; + if (Gdm.get_session_ids().length > _MAX_BOTTOM_MENU_ITEMS) { + if (this.actor.text_direction == Clutter.TextDirection.RTL) + side = St.Side.RIGHT; + else + side = St.Side.LEFT; + align = 0.5; + } + this._menu = new PopupMenu.PopupMenu(this._button, align, side); + Main.uiGroup.add_actor(this._menu.actor); + this._menu.actor.hide(); + + this._menu.connect('open-state-changed', (menu, isOpen) => { + if (isOpen) + this._button.add_style_pseudo_class('active'); + else + this._button.remove_style_pseudo_class('active'); + }); + + this._manager = new PopupMenu.PopupMenuManager({ actor: this._button }, + { actionMode: Shell.ActionMode.NONE }); + this._manager.addMenu(this._menu); + + this._button.connect('clicked', () => { this._menu.toggle(); }); + + this._items = {}; + this._activeSessionId = null; + this._populate(); + } + + updateSensitivity(sensitive) { + this._button.reactive = sensitive; + this._button.can_focus = sensitive; + this._menu.close(BoxPointer.PopupAnimation.NONE); + } + + _updateOrnament() { + let itemIds = Object.keys(this._items); + for (let i = 0; i < itemIds.length; i++) { + if (itemIds[i] == this._activeSessionId) + this._items[itemIds[i]].setOrnament(PopupMenu.Ornament.DOT); + else + this._items[itemIds[i]].setOrnament(PopupMenu.Ornament.NONE); + } + } + + setActiveSession(sessionId) { + if (sessionId == this._activeSessionId) + return; + + this._activeSessionId = sessionId; + this._updateOrnament(); + } + + close() { + this._menu.close(); + } + + _populate() { + let ids = Gdm.get_session_ids(); + ids.sort(); + + if (ids.length <= 1) { + this._button.hide(); + return; + } + + for (let i = 0; i < ids.length; i++) { + let [sessionName, sessionDescription] = Gdm.get_session_name_and_description(ids[i]); + + let id = ids[i]; + let item = new PopupMenu.PopupMenuItem(sessionName); + this._menu.addMenuItem(item); + this._items[id] = item; + + item.connect('activate', () => { + this.setActiveSession(id); + this.emit('session-activated', this._activeSessionId); + }); + } + } +}; +Signals.addSignalMethods(SessionMenuButton.prototype); + +var LoginDialog = GObject.registerClass({ + Signals: { 'failed': {} }, +}, class LoginDialog extends St.Widget { + _init(parentActor) { + super._init({ style_class: 'login-dialog', + visible: false }); + + this.get_accessible().set_role(Atk.Role.WINDOW); + + this.add_constraint(new Layout.MonitorConstraint({ primary: true })); + this.connect('destroy', this._onDestroy.bind(this)); + parentActor.add_child(this); + + this._userManager = AccountsService.UserManager.get_default() + this._gdmClient = new Gdm.Client(); + + this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA }); + + this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY, + this._updateBanner.bind(this)); + this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY, + this._updateBanner.bind(this)); + this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY, + this._updateDisableUserList.bind(this)); + this._settings.connect('changed::' + GdmUtil.LOGO_KEY, + this._updateLogo.bind(this)); + + this._textureCache = St.TextureCache.get_default(); + this._updateLogoTextureId = this._textureCache.connect('texture-file-changed', + this._updateLogoTexture.bind(this)); + + this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box', + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: true, + visible: false }); + this.add_child(this._userSelectionBox); + + this._userList = new UserList(); + this._userSelectionBox.add(this._userList.actor, + { expand: true, + x_fill: true, + y_fill: true }); + + this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN); + this._authPrompt.connect('prompted', this._onPrompted.bind(this)); + this._authPrompt.connect('reset', this._onReset.bind(this)); + this._authPrompt.hide(); + this.add_child(this._authPrompt.actor); + + // translators: this message is shown below the user list on the + // login screen. It can be activated to reveal an entry for + // manually entering the username. + let notListedLabel = new St.Label({ text: _("Not listed?"), + style_class: 'login-dialog-not-listed-label' }); + this._notListedButton = new St.Button({ style_class: 'login-dialog-not-listed-button', + button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, + can_focus: true, + child: notListedLabel, + reactive: true, + x_align: St.Align.START, + x_fill: true }); + + this._notListedButton.connect('clicked', this._hideUserListAskForUsernameAndBeginVerification.bind(this)); + + this._notListedButton.hide(); + + this._userSelectionBox.add(this._notListedButton, + { expand: false, + x_align: St.Align.START, + x_fill: true }); + + this._bannerView = new St.ScrollView({ style_class: 'login-dialog-banner-view', + opacity: 0, + vscrollbar_policy: St.PolicyType.AUTOMATIC, + hscrollbar_policy: St.PolicyType.NEVER }); + this.add_child(this._bannerView); + + let bannerBox = new St.BoxLayout({ vertical: true }); + + this._bannerView.add_actor(bannerBox); + this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner', + text: '' }); + this._bannerLabel.clutter_text.line_wrap = true; + this._bannerLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + bannerBox.add_child(this._bannerLabel); + this._updateBanner(); + + this._logoBin = new St.Widget({ style_class: 'login-dialog-logo-bin', + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END }); + this._logoBin.connect('resource-scale-changed', () => { + this._updateLogoTexture(this._textureCache, this._logoFile); + }); + this.add_child(this._logoBin); + this._updateLogo(); + + this._userList.connect('activate', (userList, item) => { + this._onUserListActivated(item); + }); + + + this._sessionMenuButton = new SessionMenuButton(); + this._sessionMenuButton.connect('session-activated', + (list, sessionId) => { + this._greeter.call_select_session_sync (sessionId, null); + }); + this._sessionMenuButton.actor.opacity = 0; + this._sessionMenuButton.actor.show(); + this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor); + + this._disableUserList = undefined; + this._userListLoaded = false; + + this._realmManager = new Realmd.Manager(); + this._realmSignalId = this._realmManager.connect('login-format-changed', + this._showRealmLoginHint.bind(this)); + + LoginManager.getLoginManager().getCurrentSessionProxy(this._gotGreeterSessionProxy.bind(this)); + + // If the user list is enabled, it should take key focus; make sure the + // screen shield is initialized first to prevent it from stealing the + // focus later + this._startupCompleteId = Main.layoutManager.connect('startup-complete', + this._updateDisableUserList.bind(this)); + } + + _getBannerAllocation(dialogBox) { + let actorBox = new Clutter.ActorBox(); + + let [minWidth, minHeight, natWidth, natHeight] = this._bannerView.get_preferred_size(); + let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2; + + actorBox.x1 = Math.floor(centerX - natWidth / 2); + actorBox.y1 = dialogBox.y1 + Main.layoutManager.panelBox.height; + actorBox.x2 = actorBox.x1 + natWidth; + actorBox.y2 = actorBox.y1 + natHeight; + + return actorBox; + } + + _getLogoBinAllocation(dialogBox) { + let actorBox = new Clutter.ActorBox(); + + let [minWidth, minHeight, natWidth, natHeight] = this._logoBin.get_preferred_size(); + let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2; + + actorBox.x1 = Math.floor(centerX - natWidth / 2); + actorBox.y1 = dialogBox.y2 - natHeight; + actorBox.x2 = actorBox.x1 + natWidth; + actorBox.y2 = actorBox.y1 + natHeight; + + return actorBox; + } + + _getCenterActorAllocation(dialogBox, actor) { + let actorBox = new Clutter.ActorBox(); + + let [minWidth, minHeight, natWidth, natHeight] = actor.get_preferred_size(); + let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2; + let centerY = dialogBox.y1 + (dialogBox.y2 - dialogBox.y1) / 2; + + natWidth = Math.min(natWidth, dialogBox.x2 - dialogBox.x1); + natHeight = Math.min(natHeight, dialogBox.y2 - dialogBox.y1); + + actorBox.x1 = Math.floor(centerX - natWidth / 2); + actorBox.y1 = Math.floor(centerY - natHeight / 2); + actorBox.x2 = actorBox.x1 + natWidth; + actorBox.y2 = actorBox.y1 + natHeight; + + return actorBox; + } + + vfunc_allocate(dialogBox, flags) { + this.set_allocation(dialogBox, flags); + + let themeNode = this.get_theme_node(); + dialogBox = themeNode.get_content_box(dialogBox); + + let dialogWidth = dialogBox.x2 - dialogBox.x1; + let dialogHeight = dialogBox.y2 - dialogBox.y1; + + // First find out what space the children require + let bannerAllocation = null; + let bannerHeight = 0; + let bannerWidth = 0; + if (this._bannerView.visible) { + bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView); + bannerHeight = bannerAllocation.y2 - bannerAllocation.y1; + bannerWidth = bannerAllocation.x2 - bannerAllocation.x1; + } + + let authPromptAllocation = null; + let authPromptHeight = 0; + let authPromptWidth = 0; + if (this._authPrompt.actor.visible) { + authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor); + authPromptHeight = authPromptAllocation.y2 - authPromptAllocation.y1; + authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1; + } + + let userSelectionAllocation = null; + let userSelectionHeight = 0; + if (this._userSelectionBox.visible) { + userSelectionAllocation = this._getCenterActorAllocation(dialogBox, this._userSelectionBox); + userSelectionHeight = userSelectionAllocation.y2 - userSelectionAllocation.y1; + } + + let logoAllocation = null; + let logoHeight = 0; + if (this._logoBin.visible) { + logoAllocation = this._getLogoBinAllocation(dialogBox); + logoHeight = logoAllocation.y2 - logoAllocation.y1; + } + + // Then figure out if we're overly constrained and need to + // try a different layout, or if we have what extra space we + // can hand out + if (bannerAllocation) { + let bannerSpace; + + if (authPromptAllocation) + bannerSpace = authPromptAllocation.y1 - bannerAllocation.y1; + else + bannerSpace = 0; + + let leftOverYSpace = bannerSpace - bannerHeight; + + if (leftOverYSpace > 0) { + // First figure out how much left over space is up top + let leftOverTopSpace = leftOverYSpace / 2; + + // Then, shift the banner into the middle of that extra space + let yShift = Math.floor(leftOverTopSpace / 2); + + bannerAllocation.y1 += yShift; + bannerAllocation.y2 += yShift; + } else { + // Then figure out how much space there would be if we switched to a + // wide layout with banner on one side and authprompt on the other. + let leftOverXSpace = dialogWidth - authPromptWidth; + + // In a wide view, half of the available space goes to the banner, + // and the other half goes to the margins. + let wideBannerWidth = leftOverXSpace / 2; + let wideSpacing = leftOverXSpace - wideBannerWidth; + + // If we do go with a wide layout, we need there to be at least enough + // space for the banner and the auth prompt to be the same width, + // so it doesn't look unbalanced. + if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) { + let centerX = dialogBox.x1 + dialogWidth / 2; + let centerY = dialogBox.y1 + dialogHeight / 2; + + // A small portion of the spacing goes down the center of the + // screen to help delimit the two columns of the wide view + let centerGap = wideSpacing / 8; + + // place the banner along the left edge of the center margin + bannerAllocation.x2 = Math.floor(centerX - centerGap / 2); + bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth); + + // figure out how tall it would like to be and try to accomodate + // but don't let it get too close to the logo + let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth); + + let maxWideHeight = dialogHeight - 3 * logoHeight; + wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight); + bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2); + bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight; + + // place the auth prompt along the right edge of the center margin + authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2); + authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth; + } else { + // If we aren't going to do a wide view, then we need to limit + // the height of the banner so it will present scrollbars + + // First figure out how much space there is without the banner + leftOverYSpace += bannerHeight; + + // Then figure out how much of that space is up top + let availableTopSpace = Math.floor(leftOverYSpace / 2); + + // Then give all of that space to the banner + bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace; + } + } + } else if (userSelectionAllocation) { + // Grow the user list to fill the space + let leftOverYSpace = dialogHeight - userSelectionHeight - logoHeight; + + if (leftOverYSpace > 0) { + let topExpansion = Math.floor(leftOverYSpace / 2); + let bottomExpansion = topExpansion; + + userSelectionAllocation.y1 -= topExpansion; + userSelectionAllocation.y2 += bottomExpansion; + } + } + + // Finally hand out the allocations + if (bannerAllocation) { + this._bannerView.allocate(bannerAllocation, flags); + } + + if (authPromptAllocation) + this._authPrompt.actor.allocate(authPromptAllocation, flags); + + if (userSelectionAllocation) + this._userSelectionBox.allocate(userSelectionAllocation, flags); + + if (logoAllocation) + this._logoBin.allocate(logoAllocation, flags); + } + + _ensureUserListLoaded() { + if (!this._userManager.is_loaded) { + this._userManagerLoadedId = this._userManager.connect('notify::is-loaded', + () => { + if (this._userManager.is_loaded) { + this._loadUserList(); + this._userManager.disconnect(this._userManagerLoadedId); + this._userManagerLoadedId = 0; + } + }); + } else { + let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, this._loadUserList.bind(this)); + GLib.Source.set_name_by_id(id, '[gnome-shell] _loadUserList'); + } + } + + _updateDisableUserList() { + let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); + + // Disable user list when there are no users. + if (this._userListLoaded && this._userList.numItems() == 0) + disableUserList = true; + + if (disableUserList != this._disableUserList) { + this._disableUserList = disableUserList; + + if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) + this._authPrompt.reset(); + } + } + + _updateCancelButton() { + let cancelVisible; + + // Hide the cancel button if the user list is disabled and we're asking for + // a username + if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING && this._disableUserList) + cancelVisible = false; + else + cancelVisible = true; + + this._authPrompt.cancelButton.visible = cancelVisible; + } + + _updateBanner() { + let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY); + let text = this._settings.get_string(GdmUtil.BANNER_MESSAGE_TEXT_KEY); + + if (enabled && text) { + this._bannerLabel.set_text(text); + this._bannerLabel.show(); + } else { + this._bannerLabel.hide(); + } + } + + _fadeInBannerView() { + this._bannerView.show(); + Tweener.addTween(this._bannerView, + { opacity: 255, + time: _FADE_ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + + _hideBannerView() { + Tweener.removeTweens(this._bannerView); + this._bannerView.opacity = 0; + this._bannerView.hide(); + } + + _updateLogoTexture(cache, file) { + if (this._logoFile && !this._logoFile.equal(file)) + return; + + this._logoBin.destroy_all_children(); + if (this._logoFile && this._logoBin.resource_scale > 0) { + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile, + -1, _LOGO_ICON_HEIGHT, + scaleFactor, + this._logoBin.resource_scale)); + } + } + + _updateLogo() { + let path = this._settings.get_string(GdmUtil.LOGO_KEY); + + this._logoFile = path ? Gio.file_new_for_path(path) : null; + this._updateLogoTexture(this._textureCache, this._logoFile); + } + + _onPrompted() { + if (this._shouldShowSessionMenuButton()) { + this._sessionMenuButton.updateSensitivity(true); + this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor); + } else { + this._sessionMenuButton.updateSensitivity(false); + } + this._showPrompt(); + } + + _resetGreeterProxy() { + if (GLib.getenv('GDM_GREETER_TEST') != '1') { + if (this._greeter) { + this._greeter.run_dispose(); + } + this._greeter = this._gdmClient.get_greeter_sync(null); + + this._defaultSessionChangedId = this._greeter.connect('default-session-name-changed', + this._onDefaultSessionChanged.bind(this)); + this._sessionOpenedId = this._greeter.connect('session-opened', + this._onSessionOpened.bind(this)); + this._timedLoginRequestedId = this._greeter.connect('timed-login-requested', + this._onTimedLoginRequested.bind(this)); + } + } + + _onReset(authPrompt, beginRequest) { + this._resetGreeterProxy(); + this._sessionMenuButton.updateSensitivity(true); + + this._user = null; + + if (this._nextSignalId) { + this._authPrompt.disconnect(this._nextSignalId); + this._nextSignalId = 0; + } + + if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) { + if (!this._disableUserList) + this._showUserList(); + else + this._hideUserListAskForUsernameAndBeginVerification(); + } else { + this._hideUserListAndBeginVerification(); + } + } + + _onDefaultSessionChanged(client, sessionId) { + this._sessionMenuButton.setActiveSession(sessionId); + } + + _shouldShowSessionMenuButton() { + if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING && + this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED) + return false; + + if (this._user && this._user.is_loaded && this._user.is_logged_in()) + return false; + + return true; + } + + _showPrompt() { + if (this._authPrompt.actor.visible) + return; + this._authPrompt.actor.opacity = 0; + this._authPrompt.actor.show(); + Tweener.addTween(this._authPrompt.actor, + { opacity: 255, + time: _FADE_ANIMATION_TIME, + transition: 'easeOutQuad' }); + this._fadeInBannerView(); + } + + _showRealmLoginHint(realmManager, hint) { + if (!hint) + return; + + hint = hint.replace(/%U/g, 'user'); + hint = hint.replace(/%D/g, 'DOMAIN'); + hint = hint.replace(/%[^UD]/g, ''); + + // Translators: this message is shown below the username entry field + // to clue the user in on how to login to the local network realm + this._authPrompt.setMessage(_("(e.g., user or %s)").format(hint), GdmUtil.MessageType.HINT); + } + + _askForUsernameAndBeginVerification() { + this._authPrompt.setPasswordChar(''); + this._authPrompt.setQuestion(_("Username: ")); + + this._showRealmLoginHint(this._realmManager.loginFormat); + + if (this._nextSignalId) + this._authPrompt.disconnect(this._nextSignalId); + this._nextSignalId = this._authPrompt.connect('next', + () => { + this._authPrompt.disconnect(this._nextSignalId); + this._nextSignalId = 0; + this._authPrompt.updateSensitivity(false); + let answer = this._authPrompt.getAnswer(); + this._user = this._userManager.get_user(answer); + this._authPrompt.clear(); + this._authPrompt.startSpinning(); + this._authPrompt.begin({ userName: answer }); + this._updateCancelButton(); + }); + this._updateCancelButton(); + + this._sessionMenuButton.updateSensitivity(false); + this._authPrompt.updateSensitivity(true); + this._showPrompt(); + } + + _loginScreenSessionActivated() { + if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) + return; + + Tweener.addTween(this, + { opacity: 255, + time: _FADE_ANIMATION_TIME, + transition: 'easeOutQuad', + onUpdate() { + let children = Main.layoutManager.uiGroup.get_children(); + + for (let i = 0; i < children.length; i++) { + if (children[i] != Main.layoutManager.screenShieldGroup) + children[i].opacity = this.opacity; + } + }, + onUpdateScope: this, + onComplete() { + if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING) + this._authPrompt.reset(); + }, + onCompleteScope: this }); + } + + _gotGreeterSessionProxy(proxy) { + this._greeterSessionProxy = proxy; + this._greeterSessionProxyChangedId = + proxy.connect('g-properties-changed', () => { + if (proxy.Active) + this._loginScreenSessionActivated(); + }); + } + + _startSession(serviceName) { + Tweener.addTween(this, + { opacity: 0, + time: _FADE_ANIMATION_TIME, + transition: 'easeOutQuad', + onUpdate() { + let children = Main.layoutManager.uiGroup.get_children(); + + for (let i = 0; i < children.length; i++) { + if (children[i] != Main.layoutManager.screenShieldGroup) + children[i].opacity = this.opacity; + } + }, + onUpdateScope: this, + onComplete() { + this._greeter.call_start_session_when_ready_sync(serviceName, true, null); + }, + onCompleteScope: this }); + } + + _onSessionOpened(client, serviceName) { + this._authPrompt.finish(() => { this._startSession(serviceName); }); + } + + _waitForItemForUser(userName) { + let item = this._userList.getItemFromUserName(userName); + + if (item) + return null; + + let hold = new Batch.Hold(); + let signalId = this._userList.connect('item-added', + () => { + let item = this._userList.getItemFromUserName(userName); + + if (item) + hold.release(); + }); + + hold.connect('release', () => { this._userList.disconnect(signalId); }); + + return hold; + } + + _blockTimedLoginUntilIdle() { + let hold = new Batch.Hold(); + + this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD, + () => { + this._timedLoginIdleTimeOutId = 0; + hold.release(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId'); + return hold; + } + + _startTimedLogin(userName, delay) { + let firstRun = true; + + // Cancel execution of old batch + if (this._timedLoginBatch) { + this._timedLoginBatch.cancel(); + this._timedLoginBatch = null; + firstRun = false; + } + + // Reset previous idle-timeout + if (this._timedLoginIdleTimeOutId) { + GLib.source_remove(this._timedLoginIdleTimeOutId); + this._timedLoginIdleTimeOutId = 0; + } + + let loginItem = null; + let animationTime; + + let tasks = [() => this._waitForItemForUser(userName), + + () => { + loginItem = this._userList.getItemFromUserName(userName); + + // If there is an animation running on the item, reset it. + loginItem.hideTimedLoginIndicator(); + }, + + () => { + // If we're just starting out, start on the right item. + if (!this._userManager.is_loaded) { + this._userList.jumpToItem(loginItem); + } + }, + + () => { + // This blocks the timed login animation until a few + // seconds after the user stops interacting with the + // login screen. + + // We skip this step if the timed login delay is very short. + if (delay > _TIMED_LOGIN_IDLE_THRESHOLD) { + animationTime = delay - _TIMED_LOGIN_IDLE_THRESHOLD; + return this._blockTimedLoginUntilIdle(); + } else { + animationTime = delay; + } + }, + + () => { + // If idle timeout is done, make sure the timed login indicator is shown + if (delay > _TIMED_LOGIN_IDLE_THRESHOLD && + this._authPrompt.actor.visible) + this._authPrompt.cancel(); + + if (delay > _TIMED_LOGIN_IDLE_THRESHOLD || firstRun) { + this._userList.scrollToItem(loginItem); + loginItem.actor.grab_key_focus(); + } + }, + + () => loginItem.showTimedLoginIndicator(animationTime), + + () => { + this._timedLoginBatch = null; + this._greeter.call_begin_auto_login_sync(userName, null); + }]; + + this._timedLoginBatch = new Batch.ConsecutiveBatch(this, tasks); + + return this._timedLoginBatch.run(); + } + + _onTimedLoginRequested(client, userName, seconds) { + if (this._timedLoginBatch) + return; + + this._startTimedLogin(userName, seconds); + + // Restart timed login on user interaction + global.stage.connect('captured-event', (actor, event) => { + if (event.type() == Clutter.EventType.KEY_PRESS || + event.type() == Clutter.EventType.BUTTON_PRESS) { + this._startTimedLogin(userName, seconds); + } + + return Clutter.EVENT_PROPAGATE; + }); + } + + _setUserListExpanded(expanded) { + this._userList.updateStyle(expanded); + this._userSelectionBox.visible = expanded; + } + + _hideUserList() { + this._setUserListExpanded(false); + if (this._userSelectionBox.visible) + GdmUtil.cloneAndFadeOutActor(this._userSelectionBox); + } + + _hideUserListAskForUsernameAndBeginVerification() { + this._hideUserList(); + this._askForUsernameAndBeginVerification(); + } + + _hideUserListAndBeginVerification() { + this._hideUserList(); + this._authPrompt.begin(); + } + + _showUserList() { + this._ensureUserListLoaded(); + this._authPrompt.hide(); + this._hideBannerView(); + this._sessionMenuButton.close(); + this._setUserListExpanded(true); + this._notListedButton.show(); + this._userList.actor.grab_key_focus(); + } + + _beginVerificationForItem(item) { + this._authPrompt.setUser(item.user); + + let userName = item.user.get_user_name(); + let hold = new Batch.Hold(); + + this._authPrompt.begin({ userName: userName, + hold: hold }); + return hold; + } + + _onUserListActivated(activatedItem) { + this._user = activatedItem.user; + + this._updateCancelButton(); + + let batch = new Batch.ConcurrentBatch(this, [GdmUtil.cloneAndFadeOutActor(this._userSelectionBox), + this._beginVerificationForItem(activatedItem)]); + batch.run(); + } + + _onDestroy() { + if (this._userManagerLoadedId) { + this._userManager.disconnect(this._userManagerLoadedId); + this._userManagerLoadedId = 0; + } + if (this._userAddedId) { + this._userManager.disconnect(this._userAddedId); + this._userAddedId = 0; + } + if (this._userRemovedId) { + this._userManager.disconnect(this._userRemovedId); + this._userRemovedId = 0; + } + if (this._userChangedId) { + this._userManager.disconnect(this._userChangedId); + this._userChangedId = 0; + } + this._textureCache.disconnect(this._updateLogoTextureId); + Main.layoutManager.disconnect(this._startupCompleteId); + if (this._settings) { + this._settings.run_dispose(); + this._settings = null; + } + if (this._greeter) { + this._greeter.disconnect(this._defaultSessionChangedId); + this._greeter.disconnect(this._sessionOpenedId); + this._greeter.disconnect(this._timedLoginRequestedId); + this._greeter = null; + } + if (this._greeterSessionProxy) { + this._greeterSessionProxy.disconnect(this._greeterSessionProxyChangedId); + this._greeterSessionProxy = null; + } + if (this._realmManager) { + this._realmManager.disconnect(this._realmSignalId); + this._realmSignalId = 0; + this._realmManager.release(); + this._realmManager = null; + } + } + + _loadUserList() { + if (this._userListLoaded) + return GLib.SOURCE_REMOVE; + + this._userListLoaded = true; + + let users = this._userManager.list_users(); + + for (let i = 0; i < users.length; i++) { + this._userList.addUser(users[i]); + } + + this._updateDisableUserList(); + + this._userAddedId = this._userManager.connect('user-added', + (userManager, user) => { + this._userList.addUser(user); + this._updateDisableUserList(); + }); + + this._userRemovedId = this._userManager.connect('user-removed', + (userManager, user) => { + this._userList.removeUser(user); + this._updateDisableUserList(); + }); + + this._userChangedId = this._userManager.connect('user-changed', + (userManager, user) => { + if (this._userList.containsUser(user) && user.locked) + this._userList.removeUser(user); + else if (!this._userList.containsUser(user) && !user.locked) + this._userList.addUser(user); + this._updateDisableUserList(); + }); + + return GLib.SOURCE_REMOVE; + } + + open() { + Main.ctrlAltTabManager.addGroup(this, + _("Login Window"), + 'dialog-password-symbolic', + { sortGroup: CtrlAltTab.SortGroup.MIDDLE }); + this._userList.actor.grab_key_focus(); + this.show(); + this.opacity = 0; + + Main.pushModal(this, { actionMode: Shell.ActionMode.LOGIN_SCREEN }); + + Tweener.addTween(this, + { opacity: 255, + time: 1, + transition: 'easeInQuad' }); + + return true; + } + + close() { + Main.popModal(this); + Main.ctrlAltTabManager.removeGroup(this); + } + + cancel() { + this._authPrompt.cancel(); + } + + addCharacter(unichar) { + // Don't allow type ahead at the login screen + } + + finish(onComplete) { + this._authPrompt.finish(onComplete); + } +}); diff --git a/js/gdm/oVirt.js b/js/gdm/oVirt.js new file mode 100644 index 0000000..d5f6fbb --- /dev/null +++ b/js/gdm/oVirt.js @@ -0,0 +1,63 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; +const Signals = imports.signals; + +const OVirtCredentialsIface = ` + + + + + + +`; + +const OVirtCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(OVirtCredentialsIface); + +let _oVirtCredentialsManager = null; + +function OVirtCredentials() { + var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system, + g_interface_name: OVirtCredentialsInfo.name, + g_interface_info: OVirtCredentialsInfo, + g_name: 'org.ovirt.vdsm.Credentials', + g_object_path: '/org/ovirt/vdsm/Credentials', + g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) }); + self.init(null); + return self; +} + +var OVirtCredentialsManager = class { + constructor() { + this._token = null; + + this._credentials = new OVirtCredentials(); + this._credentials.connectSignal('UserAuthenticated', + this._onUserAuthenticated.bind(this)); + } + + _onUserAuthenticated(proxy, sender, [token]) { + this._token = token; + this.emit('user-authenticated', token); + } + + hasToken() { + return this._token != null; + } + + getToken() { + return this._token; + } + + resetToken() { + this._token = null; + } +}; +Signals.addSignalMethods(OVirtCredentialsManager.prototype); + +function getOVirtCredentialsManager() { + if (!_oVirtCredentialsManager) + _oVirtCredentialsManager = new OVirtCredentialsManager(); + + return _oVirtCredentialsManager; +} diff --git a/js/gdm/realmd.js b/js/gdm/realmd.js new file mode 100644 index 0000000..50f3c58 --- /dev/null +++ b/js/gdm/realmd.js @@ -0,0 +1,107 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; +const Signals = imports.signals; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const ProviderIface = loadInterfaceXML("org.freedesktop.realmd.Provider"); +const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface); + +const ServiceIface = loadInterfaceXML("org.freedesktop.realmd.Service"); +const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface); + +const RealmIface = loadInterfaceXML("org.freedesktop.realmd.Realm"); +const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface); + +var Manager = class { + constructor(parentActor) { + this._aggregateProvider = Provider(Gio.DBus.system, + 'org.freedesktop.realmd', + '/org/freedesktop/realmd', + this._reloadRealms.bind(this)) + this._realms = {}; + + this._signalId = this._aggregateProvider.connect('g-properties-changed', + (proxy, properties) => { + if ('Realms' in properties.deep_unpack()) + this._reloadRealms(); + }); + } + + _reloadRealms() { + let realmPaths = this._aggregateProvider.Realms; + + if (!realmPaths) + return; + + for (let i = 0; i < realmPaths.length; i++) { + let realm = Realm(Gio.DBus.system, + 'org.freedesktop.realmd', + realmPaths[i], + this._onRealmLoaded.bind(this)); + } + } + + _reloadRealm(realm) { + if (!realm.Configured) { + if (this._realms[realm.get_object_path()]) + delete this._realms[realm.get_object_path()]; + + return; + } + + this._realms[realm.get_object_path()] = realm; + + this._updateLoginFormat(); + } + + _onRealmLoaded(realm, error) { + if (error) + return; + + this._reloadRealm(realm); + + realm.connect('g-properties-changed', (proxy, properties) => { + if ('Configured' in properties.deep_unpack()) + this._reloadRealm(realm); + }); + } + + _updateLoginFormat() { + let newLoginFormat; + + for (let realmPath in this._realms) { + let realm = this._realms[realmPath]; + if (realm.LoginFormats && realm.LoginFormats.length > 0) { + newLoginFormat = realm.LoginFormats[0]; + break; + } + } + + if (this._loginFormat != newLoginFormat) { + this._loginFormat = newLoginFormat; + this.emit('login-format-changed', newLoginFormat); + } + } + + get loginFormat() { + if (this._loginFormat !== undefined) + return this._loginFormat; + + this._updateLoginFormat(); + + return this._loginFormat; + } + + release() { + Service(Gio.DBus.system, + 'org.freedesktop.realmd', + '/org/freedesktop/realmd', + service => { service.ReleaseRemote(); }); + this._aggregateProvider.disconnect(this._signalId); + this._realms = { }; + this._updateLoginFormat(); + } +}; +Signals.addSignalMethods(Manager.prototype) diff --git a/js/gdm/util.js b/js/gdm/util.js new file mode 100644 index 0000000..2e99352 --- /dev/null +++ b/js/gdm/util.js @@ -0,0 +1,583 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib } = imports.gi; +const Signals = imports.signals; + +const Batch = imports.gdm.batch; +const Fprint = imports.gdm.fingerprint; +const OVirt = imports.gdm.oVirt; +const Main = imports.ui.main; +const Params = imports.misc.params; +const SmartcardManager = imports.misc.smartcardManager; +const Tweener = imports.ui.tweener; + +var PASSWORD_SERVICE_NAME = 'gdm-password'; +var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint'; +var SMARTCARD_SERVICE_NAME = 'gdm-smartcard'; +var OVIRT_SERVICE_NAME = 'gdm-ovirtcred'; +var FADE_ANIMATION_TIME = 0.16; +var CLONE_FADE_ANIMATION_TIME = 0.25; + +var LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen'; +var PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication'; +var FINGERPRINT_AUTHENTICATION_KEY = 'enable-fingerprint-authentication'; +var SMARTCARD_AUTHENTICATION_KEY = 'enable-smartcard-authentication'; +var BANNER_MESSAGE_KEY = 'banner-message-enable'; +var BANNER_MESSAGE_TEXT_KEY = 'banner-message-text'; +var ALLOWED_FAILURES_KEY = 'allowed-failures'; + +var LOGO_KEY = 'logo'; +var DISABLE_USER_LIST_KEY = 'disable-user-list'; + +// Give user 48ms to read each character of a PAM message +var USER_READ_TIME = 48 + +var MessageType = { + NONE: 0, + ERROR: 1, + INFO: 2, + HINT: 3 +}; + +function fadeInActor(actor) { + if (actor.opacity == 255 && actor.visible) + return null; + + let hold = new Batch.Hold(); + actor.show(); + let [minHeight, naturalHeight] = actor.get_preferred_height(-1); + + actor.opacity = 0; + actor.set_height(0); + Tweener.addTween(actor, + { opacity: 255, + height: naturalHeight, + time: FADE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete() { + this.set_height(-1); + hold.release(); + }, + }); + + return hold; +} + +function fadeOutActor(actor) { + if (!actor.visible || actor.opacity == 0) { + actor.opacity = 0; + actor.hide(); + return null; + } + + let hold = new Batch.Hold(); + Tweener.addTween(actor, + { opacity: 0, + height: 0, + time: FADE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete() { + this.hide(); + this.set_height(-1); + hold.release(); + }, + }); + return hold; +} + +function cloneAndFadeOutActor(actor) { + // Immediately hide actor so its sibling can have its space + // and position, but leave a non-reactive clone on-screen, + // so from the user's point of view it smoothly fades away + // and reveals its sibling. + actor.hide(); + + let clone = new Clutter.Clone({ source: actor, + reactive: false }); + + Main.uiGroup.add_child(clone); + + let [x, y] = actor.get_transformed_position(); + clone.set_position(x, y); + + let hold = new Batch.Hold(); + Tweener.addTween(clone, + { opacity: 0, + time: CLONE_FADE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete() { + clone.destroy(); + hold.release(); + } + }); + return hold; +} + +var ShellUserVerifier = class { + constructor(client, params) { + params = Params.parse(params, { reauthenticationOnly: false }); + this._reauthOnly = params.reauthenticationOnly; + + this._client = client; + + this._defaultService = null; + this._preemptingService = null; + + this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); + this._settings.connect('changed', + this._updateDefaultService.bind(this)); + this._updateDefaultService(); + + this._fprintManager = Fprint.FprintManager(); + this._smartcardManager = SmartcardManager.getSmartcardManager(); + + // We check for smartcards right away, since an inserted smartcard + // at startup should result in immediately initiating authentication. + // This is different than fingerprint readers, where we only check them + // after a user has been picked. + this.smartcardDetected = false; + this._checkForSmartcard(); + + this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted', + this._checkForSmartcard.bind(this)); + this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed', + this._checkForSmartcard.bind(this)); + + this._messageQueue = []; + this._messageQueueTimeoutId = 0; + this.hasPendingMessages = false; + this.reauthenticating = false; + + this._failCounter = 0; + + this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); + + if (this._oVirtCredentialsManager.hasToken()) + this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken()); + + this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated', + this._oVirtUserAuthenticated.bind(this)); + } + + begin(userName, hold) { + this._cancellable = new Gio.Cancellable(); + this._hold = hold; + this._userName = userName; + this.reauthenticating = false; + + this._checkForFingerprintReader(); + + if (userName) { + // If possible, reauthenticate an already running session, + // so any session specific credentials get updated appropriately + this._client.open_reauthentication_channel(userName, this._cancellable, + this._reauthenticationChannelOpened.bind(this)); + } else { + this._client.get_user_verifier(this._cancellable, this._userVerifierGot.bind(this)); + } + } + + cancel() { + if (this._cancellable) + this._cancellable.cancel(); + + if (this._userVerifier) { + this._userVerifier.call_cancel_sync(null); + this.clear(); + } + } + + _clearUserVerifier() { + if (this._userVerifier) { + this._userVerifier.run_dispose(); + this._userVerifier = null; + } + } + + clear() { + if (this._cancellable) { + this._cancellable.cancel(); + this._cancellable = null; + } + + this._clearUserVerifier(); + this._clearMessageQueue(); + } + + destroy() { + this.clear(); + + this._settings.run_dispose(); + this._settings = null; + + this._smartcardManager.disconnect(this._smartcardInsertedId); + this._smartcardManager.disconnect(this._smartcardRemovedId); + this._smartcardManager = null; + + this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId); + this._oVirtCredentialsManager = null; + } + + answerQuery(serviceName, answer) { + if (!this.hasPendingMessages) { + this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); + } else { + let signalId = this.connect('no-more-messages', () => { + this.disconnect(signalId); + this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); + }); + } + } + + _getIntervalForMessage(message) { + // We probably could be smarter here + return message.length * USER_READ_TIME; + } + + finishMessageQueue() { + if (!this.hasPendingMessages) + return; + + this._messageQueue = []; + + this.hasPendingMessages = false; + this.emit('no-more-messages'); + } + + _queueMessageTimeout() { + if (this._messageQueue.length == 0) { + this.finishMessageQueue(); + return; + } + + if (this._messageQueueTimeoutId != 0) + return; + + let message = this._messageQueue.shift(); + + this.emit('show-message', message.text, message.type); + + this._messageQueueTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, + message.interval, + () => { + this._messageQueueTimeoutId = 0; + this._queueMessageTimeout(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout'); + } + + _queueMessage(message, messageType) { + let interval = this._getIntervalForMessage(message); + + this.hasPendingMessages = true; + this._messageQueue.push({ text: message, type: messageType, interval: interval }); + this._queueMessageTimeout(); + } + + _clearMessageQueue() { + this.finishMessageQueue(); + + if (this._messageQueueTimeoutId != 0) { + GLib.source_remove(this._messageQueueTimeoutId); + this._messageQueueTimeoutId = 0; + } + this.emit('show-message', null, MessageType.NONE); + } + + _checkForFingerprintReader() { + this._haveFingerprintReader = false; + + if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY) || + this._fprintManager == null) { + this._updateDefaultService(); + return; + } + + this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, + (device, error) => { + if (!error && device) { + this._haveFingerprintReader = true; + this._updateDefaultService(); + } + }); + } + + _oVirtUserAuthenticated(token) { + this._preemptingService = OVIRT_SERVICE_NAME; + this.emit('ovirt-user-authenticated'); + } + + _checkForSmartcard() { + let smartcardDetected; + + if (!this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY)) + smartcardDetected = false; + else if (this._reauthOnly) + smartcardDetected = this._smartcardManager.hasInsertedLoginToken(); + else + smartcardDetected = this._smartcardManager.hasInsertedTokens(); + + if (smartcardDetected != this.smartcardDetected) { + this.smartcardDetected = smartcardDetected; + + if (this.smartcardDetected) + this._preemptingService = SMARTCARD_SERVICE_NAME; + else if (this._preemptingService == SMARTCARD_SERVICE_NAME) + this._preemptingService = null; + + this.emit('smartcard-status-changed'); + } + } + + _reportInitError(where, error) { + logError(error, where); + this._hold.release(); + + this._queueMessage(_("Authentication error"), MessageType.ERROR); + this._verificationFailed(false); + } + + _reauthenticationChannelOpened(client, result) { + try { + this._clearUserVerifier(); + this._userVerifier = client.open_reauthentication_channel_finish(result); + } catch(e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + return; + if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) && + !this._reauthOnly) { + // Gdm emits org.freedesktop.DBus.Error.AccessDenied when there + // is no session to reauthenticate. Fall back to performing + // verification from this login session + client.get_user_verifier(this._cancellable, + this._userVerifierGot.bind(this)); + return; + } + + this._reportInitError('Failed to open reauthentication channel', e); + return; + } + + this.reauthenticating = true; + this._connectSignals(); + this._beginVerification(); + this._hold.release(); + } + + _userVerifierGot(client, result) { + try { + this._clearUserVerifier(); + this._userVerifier = client.get_user_verifier_finish(result); + } catch(e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + return; + this._reportInitError('Failed to obtain user verifier', e); + return; + } + + this._connectSignals(); + this._beginVerification(); + this._hold.release(); + } + + _connectSignals() { + this._userVerifier.connect('info', this._onInfo.bind(this)); + this._userVerifier.connect('problem', this._onProblem.bind(this)); + this._userVerifier.connect('info-query', this._onInfoQuery.bind(this)); + this._userVerifier.connect('secret-info-query', this._onSecretInfoQuery.bind(this)); + this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this)); + this._userVerifier.connect('reset', this._onReset.bind(this)); + this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this)); + } + + _getForegroundService() { + if (this._preemptingService) + return this._preemptingService; + + return this._defaultService; + } + + serviceIsForeground(serviceName) { + return serviceName == this._getForegroundService(); + } + + serviceIsDefault(serviceName) { + return serviceName == this._defaultService; + } + + _updateDefaultService() { + if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) + this._defaultService = PASSWORD_SERVICE_NAME; + else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY)) + this._defaultService = SMARTCARD_SERVICE_NAME; + else if (this._haveFingerprintReader) + this._defaultService = FINGERPRINT_SERVICE_NAME; + + if (!this._defaultService) { + log("no authentication service is enabled, using password authentication"); + this._defaultService = PASSWORD_SERVICE_NAME; + } + } + + _startService(serviceName) { + this._hold.acquire(); + if (this._userName) { + this._userVerifier.call_begin_verification_for_user(serviceName, + this._userName, + this._cancellable, + (obj, result) => { + try { + obj.call_begin_verification_for_user_finish(result); + } catch(e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + return; + this._reportInitError('Failed to start verification for user', e); + return; + } + + this._hold.release(); + }); + } else { + this._userVerifier.call_begin_verification(serviceName, + this._cancellable, + (obj, result) => { + try { + obj.call_begin_verification_finish(result); + } catch(e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + return; + this._reportInitError('Failed to start verification', e); + return; + } + + this._hold.release(); + }); + } + } + + _beginVerification() { + this._startService(this._getForegroundService()); + + if (this._userName && this._haveFingerprintReader && !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME)) + this._startService(FINGERPRINT_SERVICE_NAME); + } + + _onInfo(client, serviceName, info) { + if (this.serviceIsForeground(serviceName)) { + this._queueMessage(info, MessageType.INFO); + } else if (serviceName == FINGERPRINT_SERVICE_NAME && + this._haveFingerprintReader) { + // We don't show fingerprint messages directly since it's + // not the main auth service. Instead we use the messages + // as a cue to display our own message. + + // Translators: this message is shown below the password entry field + // to indicate the user can swipe their finger instead + this._queueMessage(_("(or swipe finger)"), MessageType.HINT); + } + } + + _onProblem(client, serviceName, problem) { + if (!this.serviceIsForeground(serviceName)) + return; + + this._queueMessage(problem, MessageType.ERROR); + } + + _onInfoQuery(client, serviceName, question) { + if (!this.serviceIsForeground(serviceName)) + return; + + this.emit('ask-question', serviceName, question, ''); + } + + _onSecretInfoQuery(client, serviceName, secretQuestion) { + if (!this.serviceIsForeground(serviceName)) + return; + + if (serviceName == OVIRT_SERVICE_NAME) { + // The only question asked by this service is "Token?" + this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken()); + return; + } + + this.emit('ask-question', serviceName, secretQuestion, '\u25cf'); + } + + _onReset() { + // Clear previous attempts to authenticate + this._failCounter = 0; + this._updateDefaultService(); + + this.emit('reset'); + } + + _onVerificationComplete() { + this.emit('verification-complete'); + } + + _cancelAndReset() { + this.cancel(); + this._onReset(); + } + + _retry() { + this.begin(this._userName, new Batch.Hold()); + } + + _verificationFailed(retry) { + // For Not Listed / enterprise logins, immediately reset + // the dialog + // Otherwise, when in login mode we allow ALLOWED_FAILURES attempts. + // After that, we go back to the welcome screen. + + this._failCounter++; + let canRetry = retry && this._userName && + (this._reauthOnly || + this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY)); + + if (canRetry) { + if (!this.hasPendingMessages) { + this._retry(); + } else { + let signalId = this.connect('no-more-messages', () => { + this.disconnect(signalId); + if (this._cancellable && !this._cancellable.is_cancelled()) + this._retry(); + }); + } + } else { + if (!this.hasPendingMessages) { + this._cancelAndReset(); + } else { + let signalId = this.connect('no-more-messages', () => { + this.disconnect(signalId); + this._cancelAndReset(); + }); + } + } + + this.emit('verification-failed', canRetry); + } + + _onConversationStopped(client, serviceName) { + // If the login failed with the preauthenticated oVirt credentials + // then discard the credentials and revert to default authentication + // mechanism. + if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) { + this._oVirtCredentialsManager.resetToken(); + this._preemptingService = null; + this._verificationFailed(false); + return; + } + + // if the password service fails, then cancel everything. + // But if, e.g., fingerprint fails, still give + // password authentication a chance to succeed + if (this.serviceIsForeground(serviceName)) { + this._verificationFailed(true); + } + } +}; +Signals.addSignalMethods(ShellUserVerifier.prototype); diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml new file mode 100644 index 0000000..836d1c6 --- /dev/null +++ b/js/js-resources.gresource.xml @@ -0,0 +1,136 @@ + + + + gdm/authPrompt.js + gdm/batch.js + gdm/fingerprint.js + gdm/loginDialog.js + gdm/oVirt.js + gdm/realmd.js + gdm/util.js + + misc/config.js + misc/extensionUtils.js + misc/fileUtils.js + misc/gnomeSession.js + misc/history.js + misc/ibusManager.js + misc/inputMethod.js + misc/introspect.js + misc/jsParse.js + misc/keyboardManager.js + misc/loginManager.js + misc/modemManager.js + misc/objectManager.js + misc/params.js + misc/permissionStore.js + misc/smartcardManager.js + misc/systemActions.js + misc/util.js + misc/weather.js + + perf/core.js + perf/hwtest.js + + ui/accessDialog.js + ui/altTab.js + ui/animation.js + ui/appDisplay.js + ui/appFavorites.js + ui/audioDeviceSelection.js + ui/backgroundMenu.js + ui/background.js + ui/barLevel.js + ui/boxpointer.js + ui/calendar.js + ui/checkBox.js + ui/closeDialog.js + ui/ctrlAltTab.js + ui/dash.js + ui/dateMenu.js + ui/dialog.js + ui/dnd.js + ui/edgeDragAction.js + ui/endSessionDialog.js + ui/environment.js + ui/extensionDownloader.js + ui/extensionSystem.js + ui/focusCaretTracker.js + ui/grabHelper.js + ui/ibusCandidatePopup.js + ui/iconGrid.js + ui/inhibitShortcutsDialog.js + ui/kbdA11yDialog.js + ui/keyboard.js + ui/layout.js + ui/lightbox.js + ui/lookingGlass.js + ui/magnifier.js + ui/magnifierDBus.js + ui/main.js + ui/messageTray.js + ui/messageList.js + ui/modalDialog.js + ui/mpris.js + ui/notificationDaemon.js + ui/osdWindow.js + ui/osdMonitorLabeler.js + ui/overview.js + ui/overviewControls.js + ui/padOsd.js + ui/pageIndicators.js + ui/panel.js + ui/panelMenu.js + ui/pointerWatcher.js + ui/popupMenu.js + ui/remoteSearch.js + ui/runDialog.js + ui/screenShield.js + ui/screencast.js + ui/screenshot.js + ui/scripting.js + ui/search.js + ui/sessionMode.js + ui/shellDBus.js + ui/shellEntry.js + ui/shellMountOperation.js + ui/slider.js + ui/switcherPopup.js + ui/switchMonitor.js + ui/tweener.js + ui/unlockDialog.js + ui/userWidget.js + ui/viewSelector.js + ui/windowAttentionHandler.js + ui/windowMenu.js + ui/windowManager.js + ui/workspace.js + ui/workspaceSwitcherPopup.js + ui/workspaceThumbnail.js + ui/workspacesView.js + ui/xdndHandler.js + + ui/components/__init__.js + ui/components/autorunManager.js + ui/components/automountManager.js + ui/components/networkAgent.js + ui/components/polkitAgent.js + ui/components/telepathyClient.js + ui/components/keyring.js + + ui/status/accessibility.js + ui/status/brightness.js + ui/status/location.js + ui/status/keyboard.js + ui/status/nightLight.js + ui/status/network.js + ui/status/power.js + ui/status/rfkill.js + ui/status/volume.js + ui/status/bluetooth.js + ui/status/remoteAccess.js + ui/status/screencast.js + ui/status/system.js + ui/status/thunderbolt.js + + diff --git a/js/meson.build b/js/meson.build new file mode 100644 index 0000000..4a572c5 --- /dev/null +++ b/js/meson.build @@ -0,0 +1,22 @@ +subdir('misc') + +js_resources = gnome.compile_resources( + 'js-resources', 'js-resources.gresource.xml', + source_dir: ['.', meson.current_build_dir()], + c_name: 'shell_js_resources', + dependencies: [config_js] +) + +portal_resources = gnome.compile_resources( + 'portal-resources', 'portal-resources.gresource.xml', + source_dir: ['.', meson.current_build_dir()], + c_name: 'portal_js_resources', + dependencies: [config_js] +) + +prefs_resources = gnome.compile_resources( + 'prefs-resources', 'prefs-resources.gresource.xml', + source_dir: ['.', meson.current_build_dir()], + c_name: 'prefs_js_resources', + dependencies: [config_js] +) diff --git a/js/misc/config.js.in b/js/misc/config.js.in new file mode 100644 index 0000000..065d7a0 --- /dev/null +++ b/js/misc/config.js.in @@ -0,0 +1,20 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +/* The name of this package (not localized) */ +var PACKAGE_NAME = '@PACKAGE_NAME@'; +/* The version of this package */ +var PACKAGE_VERSION = '@PACKAGE_VERSION@'; +/* 1 if gnome-bluetooth is available, 0 otherwise */ +var HAVE_BLUETOOTH = @HAVE_BLUETOOTH@; +/* 1 if networkmanager is available, 0 otherwise */ +var HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@; +/* gettext package */ +var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@'; +/* locale dir */ +var LOCALEDIR = '@datadir@/locale'; +/* other standard directories */ +var LIBEXECDIR = '@libexecdir@'; +var PKGDATADIR = '@datadir@/@PACKAGE_NAME@'; +var VPNDIR = '@vpndir@'; +/* g-i package versions */ +var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@' diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js new file mode 100644 index 0000000..cf308b3 --- /dev/null +++ b/js/misc/extensionUtils.js @@ -0,0 +1,254 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +// Common utils for the extension system and the extension +// preferences tool + +const Gettext = imports.gettext; +const Signals = imports.signals; + +const Gio = imports.gi.Gio; + +const Config = imports.misc.config; +const FileUtils = imports.misc.fileUtils; + +var ExtensionType = { + SYSTEM: 1, + PER_USER: 2 +}; + +// Maps uuid -> metadata object +var extensions = {}; + +/** + * getCurrentExtension: + * + * Returns the current extension, or null if not called from an extension. + */ +function getCurrentExtension() { + let stack = (new Error()).stack.split('\n'); + let extensionStackLine; + + // Search for an occurrence of an extension stack frame + // Start at 1 because 0 is the stack frame of this function + for (let i = 1; i < stack.length; i++) { + if (stack[i].indexOf('/gnome-shell/extensions/') > -1) { + extensionStackLine = stack[i]; + break; + } + } + if (!extensionStackLine) + return null; + + // The stack line is like: + // init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8 + // + // In the case that we're importing from + // module scope, the first field is blank: + // @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8 + let match = new RegExp('@(.+):\\d+').exec(extensionStackLine); + if (!match) + return null; + + let path = match[1]; + let file = Gio.File.new_for_path(path); + + // Walk up the directory tree, looking for an extension with + // the same UUID as a directory name. + while (file != null) { + let extension = extensions[file.get_basename()]; + if (extension !== undefined) + return extension; + file = file.get_parent(); + } + + return null; +} + +/** + * initTranslations: + * @domain: (optional): the gettext domain to use + * + * Initialize Gettext to load translations from extensionsdir/locale. + * If @domain is not provided, it will be taken from metadata['gettext-domain'] + */ +function initTranslations(domain) { + let extension = getCurrentExtension(); + + if (!extension) + throw new Error('initTranslations() can only be called from extensions'); + + domain = domain || extension.metadata['gettext-domain']; + + // Expect USER extensions to have a locale/ subfolder, otherwise assume a + // SYSTEM extension that has been installed in the same prefix as the shell + let localeDir = extension.dir.get_child('locale'); + if (localeDir.query_exists(null)) + Gettext.bindtextdomain(domain, localeDir.get_path()); + else + Gettext.bindtextdomain(domain, Config.LOCALEDIR); +} + +/** + * getSettings: + * @schema: (optional): the GSettings schema id + * + * Builds and returns a GSettings schema for @schema, using schema files + * in extensionsdir/schemas. If @schema is omitted, it is taken from + * metadata['settings-schema']. + */ +function getSettings(schema) { + let extension = getCurrentExtension(); + + if (!extension) + throw new Error('getSettings() can only be called from extensions'); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Expect USER extensions to have a schemas/ subfolder, otherwise assume a + // SYSTEM extension that has been installed in the same prefix as the shell + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + else + schemaSource = GioSSS.get_default(); + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error(`Schema ${schema} could not be found for extension ${extension.metadata.uuid}. Please check your installation`); + + return new Gio.Settings({ settings_schema: schemaObj }); +} + +/** + * versionCheck: + * @required: an array of versions we're compatible with + * @current: the version we have + * + * Check if a component is compatible for an extension. + * @required is an array, and at least one version must match. + * @current must be in the format ... + * is always ignored + * is ignored if is even (so you can target the + * whole stable release) + * and must match + * Each target version must be at least and + */ +function versionCheck(required, current) { + let currentArray = current.split('.'); + let major = currentArray[0]; + let minor = currentArray[1]; + let point = currentArray[2]; + for (let i = 0; i < required.length; i++) { + let requiredArray = required[i].split('.'); + if (requiredArray[0] == major && + requiredArray[1] == minor && + (requiredArray[2] == point || + (requiredArray[2] == undefined && parseInt(minor) % 2 == 0))) + return true; + } + return false; +} + +function isOutOfDate(extension) { + if (!versionCheck(extension.metadata['shell-version'], Config.PACKAGE_VERSION)) + return true; + + return false; +} + +function createExtensionObject(uuid, dir, type) { + let info; + + let metadataFile = dir.get_child('metadata.json'); + if (!metadataFile.query_exists(null)) { + throw new Error('Missing metadata.json'); + } + + let metadataContents, success, tag; + try { + [success, metadataContents, tag] = metadataFile.load_contents(null); + if (metadataContents instanceof Uint8Array) + metadataContents = imports.byteArray.toString(metadataContents); + } catch (e) { + throw new Error('Failed to load metadata.json: ' + e); + } + let meta; + try { + meta = JSON.parse(metadataContents); + } catch (e) { + throw new Error('Failed to parse metadata.json: ' + e); + } + + let requiredProperties = ['uuid', 'name', 'description', 'shell-version']; + for (let i = 0; i < requiredProperties.length; i++) { + let prop = requiredProperties[i]; + if (!meta[prop]) { + throw new Error('missing "' + prop + '" property in metadata.json'); + } + } + + if (uuid != meta.uuid) { + throw new Error('uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"'); + } + + let extension = {}; + + extension.metadata = meta; + extension.uuid = meta.uuid; + extension.type = type; + extension.dir = dir; + extension.path = dir.get_path(); + extension.error = ''; + extension.hasPrefs = dir.get_child('prefs.js').query_exists(null); + + extensions[uuid] = extension; + + return extension; +} + +function installImporter(extension) { + let oldSearchPath = imports.searchPath.slice(); // make a copy + imports.searchPath = [extension.dir.get_parent().get_path()]; + // importing a "subdir" creates a new importer object that doesn't affect + // the global one + extension.imports = imports[extension.uuid]; + imports.searchPath = oldSearchPath; +} + +var ExtensionFinder = class { + _loadExtension(extensionDir, info, perUserDir) { + let fileType = info.get_file_type(); + if (fileType != Gio.FileType.DIRECTORY) + return; + let uuid = info.get_name(); + let existing = extensions[uuid]; + if (existing) { + log('Extension %s already installed in %s. %s will not be loaded'.format(uuid, existing.path, extensionDir.get_path())); + return; + } + + let extension; + let type = extensionDir.has_prefix(perUserDir) ? ExtensionType.PER_USER + : ExtensionType.SYSTEM; + try { + extension = createExtensionObject(uuid, extensionDir, type); + } catch(e) { + logError(e, 'Could not load extension %s'.format(uuid)); + return; + } + this.emit('extension-found', extension); + } + + scanExtensions() { + let perUserDir = Gio.File.new_for_path(global.userdatadir); + FileUtils.collectFromDatadirs('extensions', true, (dir, info) => { + this._loadExtension(dir, info, perUserDir); + }); + } +}; +Signals.addSignalMethods(ExtensionFinder.prototype); diff --git a/js/misc/fileUtils.js b/js/misc/fileUtils.js new file mode 100644 index 0000000..6488416 --- /dev/null +++ b/js/misc/fileUtils.js @@ -0,0 +1,97 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib } = imports.gi; +const Config = imports.misc.config; + +function collectFromDatadirs(subdir, includeUserDir, processFile) { + let dataDirs = GLib.get_system_data_dirs(); + if (includeUserDir) + dataDirs.unshift(GLib.get_user_data_dir()); + + for (let i = 0; i < dataDirs.length; i++) { + let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', subdir]); + let dir = Gio.File.new_for_path(path); + + let fileEnum; + try { + fileEnum = dir.enumerate_children('standard::name,standard::type', + Gio.FileQueryInfoFlags.NONE, null); + } catch (e) { + fileEnum = null; + } + if (fileEnum != null) { + let info; + while ((info = fileEnum.next_file(null))) + processFile(fileEnum.get_child(info), info); + } + } +} + +function deleteGFile(file) { + // Work around 'delete' being a keyword in JS. + return file['delete'](null); +} + +function recursivelyDeleteDir(dir, deleteParent) { + let children = dir.enumerate_children('standard::name,standard::type', + Gio.FileQueryInfoFlags.NONE, null); + + let info, child; + while ((info = children.next_file(null)) != null) { + let type = info.get_file_type(); + let child = dir.get_child(info.get_name()); + if (type == Gio.FileType.REGULAR) + deleteGFile(child); + else if (type == Gio.FileType.DIRECTORY) + recursivelyDeleteDir(child, true); + } + + if (deleteParent) + deleteGFile(dir); +} + +function recursivelyMoveDir(srcDir, destDir) { + let children = srcDir.enumerate_children('standard::name,standard::type', + Gio.FileQueryInfoFlags.NONE, null); + + if (!destDir.query_exists(null)) + destDir.make_directory_with_parents(null); + + let info, child; + while ((info = children.next_file(null)) != null) { + let type = info.get_file_type(); + let srcChild = srcDir.get_child(info.get_name()); + let destChild = destDir.get_child(info.get_name()); + if (type == Gio.FileType.REGULAR) + srcChild.move(destChild, Gio.FileCopyFlags.NONE, null, null); + else if (type == Gio.FileType.DIRECTORY) + recursivelyMoveDir(srcChild, destChild); + } +} + +let _ifaceResource = null; +function loadInterfaceXML(iface) { + if (!_ifaceResource) { + // don't use global.datadir so the method is usable from tests/tools + let dir = GLib.getenv ('GNOME_SHELL_DATADIR') || Config.PKGDATADIR; + let path = dir + '/gnome-shell-dbus-interfaces.gresource'; + _ifaceResource = Gio.Resource.load(path); + _ifaceResource._register(); + } + + let xml = null; + let uri = 'resource:///org/gnome/shell/dbus-interfaces/' + iface + '.xml'; + let f = Gio.File.new_for_uri(uri); + + try { + let [ok, bytes] = f.load_contents(null); + if (bytes instanceof Uint8Array) + xml = imports.byteArray.toString(bytes) + else + xml = bytes.toString(); + } catch (e) { + log('Failed to load D-Bus interface ' + iface); + } + + return xml; +} diff --git a/js/misc/gnomeSession.js b/js/misc/gnomeSession.js new file mode 100644 index 0000000..89b860d --- /dev/null +++ b/js/misc/gnomeSession.js @@ -0,0 +1,36 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const PresenceIface = loadInterfaceXML('org.gnome.SessionManager.Presence'); + +var PresenceStatus = { + AVAILABLE: 0, + INVISIBLE: 1, + BUSY: 2, + IDLE: 3 +}; + +var PresenceProxy = Gio.DBusProxy.makeProxyWrapper(PresenceIface); +function Presence(initCallback, cancellable) { + return new PresenceProxy(Gio.DBus.session, 'org.gnome.SessionManager', + '/org/gnome/SessionManager/Presence', initCallback, cancellable); +} + +// Note inhibitors are immutable objects, so they don't +// change at runtime (changes always come in the form +// of new inhibitors) +const InhibitorIface = loadInterfaceXML('org.gnome.SessionManager.Inhibitor'); +var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface); +function Inhibitor(objectPath, initCallback, cancellable) { + return new InhibitorProxy(Gio.DBus.session, 'org.gnome.SessionManager', objectPath, initCallback, cancellable); +} + +// Not the full interface, only the methods we use +const SessionManagerIface = loadInterfaceXML('org.gnome.SessionManager'); +var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface); +function SessionManager(initCallback, cancellable) { + return new SessionManagerProxy(Gio.DBus.session, 'org.gnome.SessionManager', '/org/gnome/SessionManager', initCallback, cancellable); +} diff --git a/js/misc/history.js b/js/misc/history.js new file mode 100644 index 0000000..fbe1c08 --- /dev/null +++ b/js/misc/history.js @@ -0,0 +1,109 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Signals = imports.signals; +const Clutter = imports.gi.Clutter; +const Params = imports.misc.params; + +var DEFAULT_LIMIT = 512; + +var HistoryManager = class { + constructor(params) { + params = Params.parse(params, { gsettingsKey: null, + limit: DEFAULT_LIMIT, + entry: null }); + + this._key = params.gsettingsKey; + this._limit = params.limit; + + this._historyIndex = 0; + if (this._key) { + this._history = global.settings.get_strv(this._key); + global.settings.connect('changed::' + this._key, + this._historyChanged.bind(this)); + + } else { + this._history = []; + } + + this._entry = params.entry; + + if (this._entry) { + this._entry.connect('key-press-event', + this._onEntryKeyPress.bind(this)); + } + } + + _historyChanged() { + this._history = global.settings.get_strv(this._key); + this._historyIndex = this._history.length; + } + + _setPrevItem(text) { + if (this._historyIndex <= 0) + return false; + + if (text) + this._history[this._historyIndex] = text; + this._historyIndex--; + this._indexChanged(); + return true; + } + + _setNextItem(text) { + if (this._historyIndex >= this._history.length) + return false; + + if (text) + this._history[this._historyIndex] = text; + this._historyIndex++; + this._indexChanged(); + return true; + } + + lastItem() { + if (this._historyIndex != this._history.length) { + this._historyIndex = this._history.length; + this._indexChanged(); + } + + return this._historyIndex ? this._history[this._historyIndex -1] : null; + } + + addItem(input) { + if (this._history.length == 0 || + this._history[this._history.length - 1] != input) { + + this._history = this._history.filter(entry => entry != input); + this._history.push(input); + this._save(); + } + this._historyIndex = this._history.length; + } + + _onEntryKeyPress(entry, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Up) { + return this._setPrevItem(entry.get_text()); + } else if (symbol == Clutter.KEY_Down) { + return this._setNextItem(entry.get_text()); + } + return Clutter.EVENT_PROPAGATE; + } + + _indexChanged() { + let current = this._history[this._historyIndex] || ''; + this.emit('changed', current); + + if (this._entry) + this._entry.set_text(current); + } + + _save() { + if (this._history.length > this._limit) + this._history.splice(0, this._history.length - this._limit); + + if (this._key) + global.settings.set_strv(this._key, this._history); + } +}; +Signals.addSignalMethods(HistoryManager.prototype); diff --git a/js/misc/ibusManager.js b/js/misc/ibusManager.js new file mode 100644 index 0000000..d20ad2f --- /dev/null +++ b/js/misc/ibusManager.js @@ -0,0 +1,234 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib, IBus } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const IBusCandidatePopup = imports.ui.ibusCandidatePopup; + +// Ensure runtime version matches +_checkIBusVersion(1, 5, 2); + +let _ibusManager = null; + +function _checkIBusVersion(requiredMajor, requiredMinor, requiredMicro) { + if ((IBus.MAJOR_VERSION > requiredMajor) || + (IBus.MAJOR_VERSION == requiredMajor && IBus.MINOR_VERSION > requiredMinor) || + (IBus.MAJOR_VERSION == requiredMajor && IBus.MINOR_VERSION == requiredMinor && + IBus.MICRO_VERSION >= requiredMicro)) + return; + + throw "Found IBus version %d.%d.%d but required is %d.%d.%d". + format(IBus.MAJOR_VERSION, IBus.MINOR_VERSION, IBus.MINOR_VERSION, + requiredMajor, requiredMinor, requiredMicro); +} + +function getIBusManager() { + if (_ibusManager == null) + _ibusManager = new IBusManager(); + return _ibusManager; +} + +var IBusManager = class { + constructor() { + IBus.init(); + + // This is the longest we'll keep the keyboard frozen until an input + // source is active. + this._MAX_INPUT_SOURCE_ACTIVATION_TIME = 4000; // ms + this._PRELOAD_ENGINES_DELAY_TIME = 30; // sec + + + this._candidatePopup = new IBusCandidatePopup.CandidatePopup(); + + this._panelService = null; + this._engines = {}; + this._ready = false; + this._registerPropertiesId = 0; + this._currentEngineName = null; + this._preloadEnginesId = 0; + + this._ibus = IBus.Bus.new_async(); + this._ibus.connect('connected', this._onConnected.bind(this)); + this._ibus.connect('disconnected', this._clear.bind(this)); + // Need to set this to get 'global-engine-changed' emitions + this._ibus.set_watch_ibus_signal(true); + this._ibus.connect('global-engine-changed', this._engineChanged.bind(this)); + + this._spawn(); + } + + _spawn() { + try { + Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'], + Gio.SubprocessFlags.NONE); + } catch(e) { + log('Failed to launch ibus-daemon: ' + e.message); + } + } + + _clear() { + if (this._panelService) + this._panelService.destroy(); + + this._panelService = null; + this._candidatePopup.setPanelService(null); + this._engines = {}; + this._ready = false; + this._registerPropertiesId = 0; + this._currentEngineName = null; + + this.emit('ready', false); + + this._spawn(); + } + + _onConnected() { + this._ibus.list_engines_async(-1, null, this._initEngines.bind(this)); + this._ibus.request_name_async(IBus.SERVICE_PANEL, + IBus.BusNameFlag.REPLACE_EXISTING, + -1, null, + this._initPanelService.bind(this)); + } + + _initEngines(ibus, result) { + let enginesList = this._ibus.list_engines_async_finish(result); + if (enginesList) { + for (let i = 0; i < enginesList.length; ++i) { + let name = enginesList[i].get_name(); + this._engines[name] = enginesList[i]; + } + this._updateReadiness(); + } else { + this._clear(); + } + } + + _initPanelService(ibus, result) { + let success = this._ibus.request_name_async_finish(result); + if (success) { + this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(), + object_path: IBus.PATH_PANEL }); + this._candidatePopup.setPanelService(this._panelService); + this._panelService.connect('update-property', this._updateProperty.bind(this)); + this._panelService.connect('set-cursor-location', (ps, x, y, w, h) => { + let cursorLocation = { x, y, width: w, height: h }; + this.emit('set-cursor-location', cursorLocation); + }); + this._panelService.connect('focus-in', (panel, path) => { + if (!GLib.str_has_suffix(path, '/InputContext_1')) + this.emit ('focus-in'); + }); + this._panelService.connect('focus-out', () => { this.emit('focus-out'); }); + + try { + // IBus versions older than 1.5.10 have a bug which + // causes spurious set-content-type emissions when + // switching input focus that temporarily lose purpose + // and hints defeating its intended semantics and + // confusing users. We thus don't use it in that case. + _checkIBusVersion(1, 5, 10); + this._panelService.connect('set-content-type', this._setContentType.bind(this)); + } catch (e) { + } + // If an engine is already active we need to get its properties + this._ibus.get_global_engine_async(-1, null, (i, result) => { + let engine; + try { + engine = this._ibus.get_global_engine_async_finish(result); + if (!engine) + return; + } catch(e) { + return; + } + this._engineChanged(this._ibus, engine.get_name()); + }); + this._updateReadiness(); + } else { + this._clear(); + } + } + + _updateReadiness() { + this._ready = (Object.keys(this._engines).length > 0 && + this._panelService != null); + this.emit('ready', this._ready); + } + + _engineChanged(bus, engineName) { + if (!this._ready) + return; + + this._currentEngineName = engineName; + + if (this._registerPropertiesId != 0) + return; + + this._registerPropertiesId = + this._panelService.connect('register-properties', (p, props) => { + if (!props.get(0)) + return; + + this._panelService.disconnect(this._registerPropertiesId); + this._registerPropertiesId = 0; + + this.emit('properties-registered', this._currentEngineName, props); + }); + } + + _updateProperty(panel, prop) { + this.emit('property-updated', this._currentEngineName, prop); + } + + _setContentType(panel, purpose, hints) { + this.emit('set-content-type', purpose, hints); + } + + activateProperty(key, state) { + this._panelService.property_activate(key, state); + } + + getEngineDesc(id) { + if (!this._ready || !this._engines.hasOwnProperty(id)) + return null; + + return this._engines[id]; + } + + setEngine(id, callback) { + // Send id even if id == this._currentEngineName + // because 'properties-registered' signal can be emitted + // while this._ibusSources == null on a lock screen. + if (!this._ready) { + if (callback) + callback(); + return; + } + + this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME, + null, callback || null); + } + + preloadEngines(ids) { + if (!this._ibus || ids.length == 0) + return; + + if (this._preloadEnginesId != 0) { + Mainloop.source_remove(this._preloadEnginesId); + this._preloadEnginesId = 0; + } + + this._preloadEnginesId = + Mainloop.timeout_add_seconds(this._PRELOAD_ENGINES_DELAY_TIME, + () => { + this._ibus.preload_engines_async( + ids, + -1, + null, + null); + this._preloadEnginesId = 0; + return GLib.SOURCE_REMOVE; + }); + } +}; +Signals.addSignalMethods(IBusManager.prototype); diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js new file mode 100644 index 0000000..8d46264 --- /dev/null +++ b/js/misc/inputMethod.js @@ -0,0 +1,270 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +const { Clutter, GLib, GObject, IBus } = imports.gi; + +const Keyboard = imports.ui.status.keyboard; + +var HIDE_PANEL_TIME = 50; + +var InputMethod = GObject.registerClass( +class InputMethod extends Clutter.InputMethod { + _init() { + super._init(); + this._hints = 0; + this._purpose = 0; + this._currentFocus = null; + this._preeditStr = ''; + this._preeditPos = 0; + this._preeditVisible = false; + this._hidePanelId = 0; + this._ibus = IBus.Bus.new_async(); + this._ibus.connect('connected', this._onConnected.bind(this)); + this._ibus.connect('disconnected', this._clear.bind(this)); + this.connect('notify::can-show-preedit', this._updateCapabilities.bind(this)); + + this._inputSourceManager = Keyboard.getInputSourceManager(); + this._sourceChangedId = this._inputSourceManager.connect('current-source-changed', + this._onSourceChanged.bind(this)); + this._currentSource = this._inputSourceManager.currentSource; + + if (this._ibus.is_connected()) + this._onConnected(); + } + + get currentFocus() { + return this._currentFocus; + } + + _updateCapabilities() { + 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() { + this._currentSource = this._inputSourceManager.currentSource; + } + + _onConnected() { + this._ibus.create_input_context_async ('gnome-shell', -1, null, + this._setContext.bind(this)); + } + + _setContext(bus, res) { + this._context = this._ibus.create_input_context_async_finish(res); + this._context.connect('commit-text', this._onCommitText.bind(this)); + this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this)); + this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this)); + this._context.connect('show-preedit-text', this._onShowPreeditText.bind(this)); + this._context.connect('hide-preedit-text', this._onHidePreeditText.bind(this)); + this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this)); + + this._updateCapabilities(); + } + + _clear() { + this._context = null; + this._hints = 0; + this._purpose = 0; + this._preeditStr = '' + this._preeditPos = 0; + this._preeditVisible = false; + } + + _emitRequestSurrounding() { + if (this._context.needs_surrounding_text()) + this.emit('request-surrounding'); + } + + _onCommitText(context, text) { + this.commit(text.get_text()); + } + + _onDeleteSurroundingText(context) { + this.delete_surrounding(); + } + + _onUpdatePreeditText(context, text, pos, visible) { + if (text == null) + return; + + let preedit = text.get_text(); + + if (visible) + this.set_preedit_text(preedit, pos); + else if (this._preeditVisible) + this.set_preedit_text(null, pos); + + this._preeditStr = preedit; + this._preeditPos = pos; + this._preeditVisible = visible; + } + + _onShowPreeditText(context) { + this._preeditVisible = true; + this.set_preedit_text(this._preeditStr, this._preeditPos); + } + + _onHidePreeditText(context) { + this.set_preedit_text(null, this._preeditPos); + this._preeditVisible = false; + } + + _onForwardKeyEvent(context, keyval, keycode, state) { + let press = (state & IBus.ModifierType.RELEASE_MASK) == 0; + state &= ~(IBus.ModifierType.RELEASE_MASK); + + let curEvent = Clutter.get_current_event(); + let time; + if (curEvent) + time = curEvent.get_time(); + else + time = global.display.get_current_time_roundtrip(); + + this.forward_key(keyval, keycode + 8, state & Clutter.ModifierType.MODIFIER_MASK, time, press); + } + + vfunc_focus_in(focus) { + this._currentFocus = focus; + if (this._context) { + this._context.focus_in(); + this._updateCapabilities(); + this._emitRequestSurrounding(); + } + + if (this._hidePanelId) { + GLib.source_remove(this._hidePanelId); + this._hidePanelId = 0; + } + } + + vfunc_focus_out() { + this._currentFocus = null; + if (this._context) { + this._context.focus_out(); + this._updateCapabilities(); + } + + if (this._preeditStr) { + // Unset any preedit text + this.set_preedit_text(null, 0); + this._preeditStr = null; + } + + this._hidePanelId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, HIDE_PANEL_TIME, () => { + this.set_input_panel_state(Clutter.InputPanelState.OFF); + this._hidePanelId = 0; + return GLib.SOURCE_REMOVE; + }); + } + + vfunc_reset() { + if (this._context) { + this._context.reset(); + this._emitRequestSurrounding(); + } + + if (this._preeditStr) { + // Unset any preedit text + this.set_preedit_text(null, 0); + this._preeditStr = null; + } + } + + vfunc_set_cursor_location(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(text, cursor, anchor) { + if (!this._context || !text) + return; + + let ibusText = IBus.Text.new_from_string(text); + this._context.set_surrounding_text(ibusText, cursor, anchor); + } + + vfunc_update_content_hints(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(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(event) { + if (!this._context) + return false; + if (!this._currentSource) + 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, + (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; + } +}); diff --git a/js/misc/introspect.js b/js/misc/introspect.js new file mode 100644 index 0000000..f7a7f2f --- /dev/null +++ b/js/misc/introspect.js @@ -0,0 +1,160 @@ +const { Gio, GLib, Meta, Shell } = imports.gi; + +const INTROSPECT_SCHEMA = 'org.gnome.shell'; +const INTROSPECT_KEY = 'introspect'; +const APP_WHITELIST = ['org.freedesktop.impl.portal.desktop.gtk']; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const IntrospectDBusIface = loadInterfaceXML('org.gnome.Shell.Introspect'); + +var IntrospectService = class { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(IntrospectDBusIface, + this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Introspect'); + Gio.DBus.session.own_name('org.gnome.Shell.Introspect', + Gio.BusNameOwnerFlags.REPLACE, + null, null); + + this._runningApplications = {}; + this._runningApplicationsDirty = true; + this._activeApplication = null; + this._activeApplicationDirty = true; + + this._appSystem = Shell.AppSystem.get_default(); + this._appSystem.connect('app-state-changed', + () => { + this._runningApplicationsDirty = true; + this._syncRunningApplications(); + }); + + this._settings = new Gio.Settings({ schema_id: INTROSPECT_SCHEMA }); + + let tracker = Shell.WindowTracker.get_default(); + tracker.connect('notify::focus-app', + () => { + this._activeApplicationDirty = true; + this._syncRunningApplications(); + }); + + this._syncRunningApplications(); + } + + _isStandaloneApp(app) { + let windows = app.get_windows(); + + return app.get_windows().some(w => w.transient_for == null); + } + + _isIntrospectEnabled() { + return this._settings.get_boolean(INTROSPECT_KEY); + } + + _isSenderWhitelisted(sender) { + return APP_WHITELIST.includes(sender); + } + + _syncRunningApplications() { + let tracker = Shell.WindowTracker.get_default(); + let apps = this._appSystem.get_running(); + let seatName = "seat0"; + let newRunningApplications = {}; + + let newActiveApplication = null; + let focusedApp = tracker.focus_app; + + for (let app of apps) { + let appInfo = {}; + let isAppActive = (focusedApp == app); + + if (!this._isStandaloneApp(app)) + continue; + + if (isAppActive) { + appInfo['active-on-seats'] = new GLib.Variant('as', [seatName]); + newActiveApplication = app.get_id(); + } + + newRunningApplications[app.get_id()] = appInfo; + } + + if (this._runningApplicationsDirty || + (this._activeApplicationDirty && + this._activeApplication != newActiveApplication)) { + this._runningApplications = newRunningApplications; + this._activeApplication = newActiveApplication; + + this._dbusImpl.emit_signal('RunningApplicationsChanged', null); + } + this._runningApplicationsDirty = false; + this._activeApplicationDirty = false; + } + + _isEligibleWindow(window) { + if (window.is_override_redirect()) + return false; + + let type = window.get_window_type(); + return (type == Meta.WindowType.NORMAL || + type == Meta.WindowType.DIALOG || + type == Meta.WindowType.MODAL_DIALOG || + type == Meta.WindowType.UTILITY); + } + + GetRunningApplicationsAsync(params, invocation) { + if (!this._isIntrospectEnabled() && + !this._isSenderWhitelisted(invocation.get_sender())) { + invocation.return_error_literal(Gio.DBusError, + Gio.DBusError.ACCESS_DENIED, + 'App introspection not allowed'); + return; + } + + invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications])); + } + + GetWindowsAsync(params, invocation) { + let focusWindow = global.display.get_focus_window(); + let apps = this._appSystem.get_running(); + let windowsList = {}; + + if (!this._isIntrospectEnabled()) { + invocation.return_error_literal(Gio.DBusError, + Gio.DBusError.ACCESS_DENIED, + 'App introspection not allowed'); + return; + } + + for (let app of apps) { + let windows = app.get_windows(); + for (let window of windows) { + + if (!this._isEligibleWindow(window)) + continue; + + let windowId = window.get_id(); + let frameRect = window.get_frame_rect(); + let title = window.get_title(); + let wmClass = window.get_wm_class(); + + windowsList[windowId] = { + 'app-id': GLib.Variant.new('s', app.get_id()), + 'client-type': GLib.Variant.new('u', window.get_client_type()), + 'is-hidden': GLib.Variant.new('b', window.is_hidden()), + 'has-focus': GLib.Variant.new('b', (window == focusWindow)), + 'width': GLib.Variant.new('u', frameRect.width), + 'height': GLib.Variant.new('u', frameRect.height) + }; + + // These properties may not be available for all windows: + if (title != null) + windowsList[windowId]['title'] = GLib.Variant.new('s', title); + + if (wmClass != null) + windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass); + } + } + invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList])); + } +}; diff --git a/js/misc/jsParse.js b/js/misc/jsParse.js new file mode 100644 index 0000000..2f3f7af --- /dev/null +++ b/js/misc/jsParse.js @@ -0,0 +1,246 @@ +/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ + +// Returns a list of potential completions for text. Completions either +// follow a dot (e.g. foo.ba -> bar) or they are picked from globalCompletionList (e.g. fo -> foo) +// commandHeader is prefixed on any expression before it is eval'ed. It will most likely +// consist of global constants that might not carry over from the calling environment. +// +// This function is likely the one you want to call from external modules +function getCompletions(text, commandHeader, globalCompletionList) { + let methods = []; + let expr, base; + let attrHead = ''; + if (globalCompletionList == null) { + globalCompletionList = []; + } + + let offset = getExpressionOffset(text, text.length - 1); + if (offset >= 0) { + text = text.slice(offset); + + // Look for expressions like "Main.panel.foo" and match Main.panel and foo + let matches = text.match(/(.*)\.(.*)/); + if (matches) { + [expr, base, attrHead] = matches; + + methods = getPropertyNamesFromExpression(base, commandHeader).filter( + attr => attr.slice(0, attrHead.length) == attrHead + ); + } + + // Look for the empty expression or partially entered words + // not proceeded by a dot and match them against global constants + matches = text.match(/^(\w*)$/); + if (text == '' || matches) { + [expr, attrHead] = matches; + methods = globalCompletionList.filter( + attr => attr.slice(0, attrHead.length) == attrHead + ); + } + } + + return [methods, attrHead]; +} + + +// +// A few functions for parsing strings of javascript code. +// + +// Identify characters that delimit an expression. That is, +// if we encounter anything that isn't a letter, '.', ')', or ']', +// we should stop parsing. +function isStopChar(c) { + return !c.match(/[\w\.\)\]]/); +} + +// Given the ending position of a quoted string, find where it starts +function findMatchingQuote(expr, offset) { + let quoteChar = expr.charAt(offset); + for (let i = offset - 1; i >= 0; --i) { + if (expr.charAt(i) == quoteChar && expr.charAt(i-1) != '\\'){ + return i; + } + } + return -1; +} + +// Given the ending position of a regex, find where it starts +function findMatchingSlash(expr, offset) { + for (let i = offset - 1; i >= 0; --i) { + if (expr.charAt(i) == '/' && expr.charAt(i-1) != '\\'){ + return i; + } + } + return -1; +} + +// If expr.charAt(offset) is ')' or ']', +// return the position of the corresponding '(' or '[' bracket. +// This function does not check for syntactic correctness. e.g., +// findMatchingBrace("[(])", 3) returns 1. +function findMatchingBrace(expr, offset) { + let closeBrace = expr.charAt(offset); + let openBrace = ({')': '(', ']': '['})[closeBrace]; + + function findTheBrace(expr, offset) { + if (offset < 0) { + return -1; + } + + if (expr.charAt(offset) == openBrace) { + return offset; + } + if (expr.charAt(offset).match(/['"]/)) { + return findTheBrace(expr, findMatchingQuote(expr, offset) - 1); + } + if (expr.charAt(offset) == '/') { + return findTheBrace(expr, findMatchingSlash(expr, offset) - 1); + } + if (expr.charAt(offset) == closeBrace) { + return findTheBrace(expr, findTheBrace(expr, offset - 1) - 1); + } + + return findTheBrace(expr, offset - 1); + + } + + return findTheBrace(expr, offset - 1); +} + +// Walk expr backwards from offset looking for the beginning of an +// expression suitable for passing to eval. +// There is no guarantee of correct javascript syntax between the return +// value and offset. This function is meant to take a string like +// "foo(Obj.We.Are.Completing" and allow you to extract "Obj.We.Are.Completing" +function getExpressionOffset(expr, offset) { + while (offset >= 0) { + let currChar = expr.charAt(offset); + + if (isStopChar(currChar)){ + return offset + 1; + } + + if (currChar.match(/[\)\]]/)) { + offset = findMatchingBrace(expr, offset); + } + + --offset; + } + + return offset + 1; +} + +// Things with non-word characters or that start with a number +// are not accessible via .foo notation and so aren't returned +function isValidPropertyName(w) { + return !(w.match(/\W/) || w.match(/^\d/)); +} + +// To get all properties (enumerable and not), we need to walk +// the prototype chain ourselves +function getAllProps(obj) { + if (obj === null || obj === undefined) { + return []; + } + return Object.getOwnPropertyNames(obj).concat( getAllProps(Object.getPrototypeOf(obj)) ); +} + +// Given a string _expr_, returns all methods +// that can be accessed via '.' notation. +// e.g., expr="({ foo: null, bar: null, 4: null })" will +// return ["foo", "bar", ...] but the list will not include "4", +// since methods accessed with '.' notation must star with a letter or _. +function getPropertyNamesFromExpression(expr, commandHeader) { + if (commandHeader == null) { + commandHeader = ''; + } + + let obj = {}; + if (!isUnsafeExpression(expr)) { + try { + obj = eval(commandHeader + expr); + } catch (e) { + return []; + } + } else { + return []; + } + + let propsUnique = {}; + if (typeof obj === 'object'){ + let allProps = getAllProps(obj); + // Get only things we are allowed to complete following a '.' + allProps = allProps.filter( isValidPropertyName ); + + // Make sure propsUnique contains one key for every + // property so we end up with a unique list of properties + allProps.map(p => propsUnique[p] = null); + } + return Object.keys(propsUnique).sort(); +} + +// Given a list of words, returns the longest prefix they all have in common +function getCommonPrefix(words) { + let word = words[0]; + for (let i = 0; i < word.length; i++) { + for (let w = 1; w < words.length; w++) { + if (words[w].charAt(i) != word.charAt(i)) + return word.slice(0, i); + } + } + return word; +} + +// Returns true if there is reason to think that eval(str) +// will modify the global scope +function isUnsafeExpression(str) { + // Remove any blocks that are quoted or are in a regex + function removeLiterals(str) { + if (str.length == 0) { + return ''; + } + + let currChar = str.charAt(str.length - 1); + if (currChar == '"' || currChar == '\'') { + return removeLiterals(str.slice(0, findMatchingQuote(str, str.length - 1))); + } else if (currChar == '/') { + return removeLiterals(str.slice(0, findMatchingSlash(str, str.length - 1))); + } + + return removeLiterals(str.slice(0, str.length - 1)) + currChar; + } + + // Check for any sort of assignment + // The strategy used is dumb: remove any quotes + // or regexs and comparison operators and see if there is an '=' character. + // If there is, it might be an unsafe assignment. + + let prunedStr = removeLiterals(str); + prunedStr = prunedStr.replace(/[=!]==/g, ''); //replace === and !== with nothing + prunedStr = prunedStr.replace(/[=<>!]=/g, ''); //replace ==, <=, >=, != with nothing + + if (prunedStr.match(/=/)) { + return true; + } else if (prunedStr.match(/;/)) { + // If we contain a semicolon not inside of a quote/regex, assume we're unsafe as well + return true; + } + + return false; +} + +// Returns a list of global keywords derived from str +function getDeclaredConstants(str) { + let ret = []; + str.split(';').forEach(s => { + let base, keyword; + let match = s.match(/const\s+(\w+)\s*=/); + if (match) { + [base, keyword] = match; + ret.push(keyword); + } + }); + + return ret; +} diff --git a/js/misc/keyboardManager.js b/js/misc/keyboardManager.js new file mode 100644 index 0000000..99e1002 --- /dev/null +++ b/js/misc/keyboardManager.js @@ -0,0 +1,158 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { GLib, GnomeDesktop, Meta } = imports.gi; + +const Main = imports.ui.main; + +var DEFAULT_LOCALE = 'en_US'; +var DEFAULT_LAYOUT = 'us'; +var DEFAULT_VARIANT = ''; + +let _xkbInfo = null; + +function getXkbInfo() { + if (_xkbInfo == null) + _xkbInfo = new GnomeDesktop.XkbInfo(); + return _xkbInfo; +} + +let _keyboardManager = null; + +function getKeyboardManager() { + if (_keyboardManager == null) + _keyboardManager = new KeyboardManager(); + return _keyboardManager; +} + +function releaseKeyboard() { + if (Main.modalCount > 0) + global.display.unfreeze_keyboard(global.get_current_time()); + else + global.display.ungrab_keyboard(global.get_current_time()); +} + +function holdKeyboard() { + global.display.freeze_keyboard(global.get_current_time()); +} + +var KeyboardManager = class { + constructor() { + // The XKB protocol doesn't allow for more that 4 layouts in a + // keymap. Wayland doesn't impose this limit and libxkbcommon can + // handle up to 32 layouts but since we need to support X clients + // even as a Wayland compositor, we can't bump this. + this.MAX_LAYOUTS_PER_GROUP = 4; + + this._xkbInfo = getXkbInfo(); + this._current = null; + this._localeLayoutInfo = this._getLocaleLayout(); + this._layoutInfos = {}; + this._currentKeymap = null; + } + + _applyLayoutGroup(group) { + let options = this._buildOptionsString(); + let [layouts, variants] = this._buildGroupStrings(group); + + if (this._currentKeymap && + this._currentKeymap.layouts == layouts && + this._currentKeymap.variants == variants && + this._currentKeymap.options == options) + return; + + this._currentKeymap = {layouts, variants, options}; + Meta.get_backend().set_keymap(layouts, variants, options); + } + + _applyLayoutGroupIndex(idx) { + Meta.get_backend().lock_layout_group(idx); + } + + apply(id) { + let info = this._layoutInfos[id]; + if (!info) + return; + + if (this._current && this._current.group == info.group) { + if (this._current.groupIndex != info.groupIndex) + this._applyLayoutGroupIndex(info.groupIndex); + } else { + this._applyLayoutGroup(info.group); + this._applyLayoutGroupIndex(info.groupIndex); + } + + this._current = info; + } + + reapply() { + if (!this._current) + return; + + this._applyLayoutGroup(this._current.group); + this._applyLayoutGroupIndex(this._current.groupIndex); + } + + setUserLayouts(ids) { + this._current = null; + this._layoutInfos = {}; + + for (let i = 0; i < ids.length; ++i) { + let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(ids[i]); + if (found) + this._layoutInfos[ids[i]] = { id: ids[i], layout: _layout, variant: _variant }; + } + + let i = 0; + let group = []; + for (let id in this._layoutInfos) { + // We need to leave one slot on each group free so that we + // can add a layout containing the symbols for the + // language used in UI strings to ensure that toolkits can + // handle mnemonics like Alt+Ф even if the user is + // actually typing in a different layout. + let groupIndex = i % (this.MAX_LAYOUTS_PER_GROUP - 1); + if (groupIndex == 0) + group = []; + + let info = this._layoutInfos[id]; + group[groupIndex] = info; + info.group = group; + info.groupIndex = groupIndex; + + i += 1; + } + } + + _getLocaleLayout() { + let locale = GLib.get_language_names()[0]; + if (locale.indexOf('_') == -1) + locale = DEFAULT_LOCALE; + + let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale); + if (!found) + [, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE); + + let _layout, _variant; + [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id); + if (found) + return { layout: _layout, variant: _variant }; + else + return { layout: DEFAULT_LAYOUT, variant: DEFAULT_VARIANT }; + } + + _buildGroupStrings(_group) { + let group = _group.concat(this._localeLayoutInfo); + let layouts = group.map(g => g.layout).join(','); + let variants = group.map(g => g.variant).join(','); + return [layouts, variants]; + } + + setKeyboardOptions(options) { + this._xkbOptions = options; + } + + _buildOptionsString() { + let options = this._xkbOptions.join(','); + return options; + } +}; diff --git a/js/misc/loginManager.js b/js/misc/loginManager.js new file mode 100644 index 0000000..f615b4f --- /dev/null +++ b/js/misc/loginManager.js @@ -0,0 +1,203 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { GLib, Gio } = imports.gi; +const Signals = imports.signals; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const SystemdLoginManagerIface = loadInterfaceXML('org.freedesktop.login1.Manager'); +const SystemdLoginSessionIface = loadInterfaceXML('org.freedesktop.login1.Session'); +const SystemdLoginUserIface = loadInterfaceXML('org.freedesktop.login1.User'); + +const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); +const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); +const SystemdLoginUser = Gio.DBusProxy.makeProxyWrapper(SystemdLoginUserIface); + +function haveSystemd() { + return GLib.access("/run/systemd/seats", 0) >= 0; +} + +function versionCompare(required, reference) { + required = required.split('.'); + reference = reference.split('.'); + + for (let i = 0; i < required.length; i++) { + let requiredInt = parseInt(required[i]); + let referenceInt = parseInt(reference[i]); + if (requiredInt != referenceInt) + return requiredInt < referenceInt; + } + + return true; +} + +function canLock() { + try { + let params = GLib.Variant.new('(ss)', ['org.gnome.DisplayManager.Manager', 'Version']); + let result = Gio.DBus.system.call_sync('org.gnome.DisplayManager', + '/org/gnome/DisplayManager/Manager', + 'org.freedesktop.DBus.Properties', + 'Get', params, null, + Gio.DBusCallFlags.NONE, + -1, null); + + let version = result.deep_unpack()[0].deep_unpack(); + return haveSystemd() && versionCompare('3.5.91', version); + } catch(e) { + return false; + } +} + +let _loginManager = null; + +/** + * LoginManager: + * An abstraction over systemd/logind and ConsoleKit. + * + */ +function getLoginManager() { + if (_loginManager == null) { + if (haveSystemd()) + _loginManager = new LoginManagerSystemd(); + else + _loginManager = new LoginManagerDummy(); + } + + return _loginManager; +} + +var LoginManagerSystemd = class { + constructor() { + this._proxy = new SystemdLoginManager(Gio.DBus.system, + 'org.freedesktop.login1', + '/org/freedesktop/login1'); + this._userProxy = new SystemdLoginUser(Gio.DBus.system, + 'org.freedesktop.login1', + '/org/freedesktop/login1/user/self'); + this._proxy.connectSignal('PrepareForSleep', + this._prepareForSleep.bind(this)); + } + + getCurrentSessionProxy(callback) { + if (this._currentSession) { + callback (this._currentSession); + return; + } + + let sessionId = GLib.getenv('XDG_SESSION_ID'); + if (!sessionId) { + log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session. Asking logind directly.'); + let [session, objectPath] = this._userProxy.Display; + if (session) { + log(`Will monitor session ${session}`); + sessionId = session; + } else { + log('Failed to find "Display" session; are we the greeter?'); + + for (let [session, objectPath] of this._userProxy.Sessions) { + let sessionProxy = new SystemdLoginSession(Gio.DBus.system, + 'org.freedesktop.login1', + objectPath); + log(`Considering ${session}, class=${sessionProxy.Class}`); + if (sessionProxy.Class == 'greeter') { + log(`Yes, will monitor session ${session}`); + sessionId = session; + break; + } + } + + if (!sessionId) { + log('No, failed to get session from logind.'); + return; + } + } + } + + this._proxy.GetSessionRemote(sessionId, (result, error) => { + if (error) { + logError(error, 'Could not get a proxy for the current session'); + } else { + this._currentSession = new SystemdLoginSession(Gio.DBus.system, + 'org.freedesktop.login1', + result[0]); + callback(this._currentSession); + } + }); + } + + canSuspend(asyncCallback) { + this._proxy.CanSuspendRemote((result, error) => { + if (error) { + asyncCallback(false, false); + } else { + let needsAuth = result[0] == 'challenge'; + let canSuspend = needsAuth || result[0] == 'yes'; + asyncCallback(canSuspend, needsAuth); + } + }); + } + + listSessions(asyncCallback) { + this._proxy.ListSessionsRemote((result, error) => { + if (error) + asyncCallback([]); + else + asyncCallback(result[0]); + }); + } + + suspend() { + this._proxy.SuspendRemote(true); + } + + inhibit(reason, callback) { + let inVariant = GLib.Variant.new('(ssss)', + ['sleep', + 'GNOME Shell', + reason, + 'delay']); + this._proxy.call_with_unix_fd_list('Inhibit', inVariant, 0, -1, null, null, + (proxy, result) => { + let fd = -1; + try { + let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result); + fd = fdList.steal_fds()[0]; + callback(new Gio.UnixInputStream({ fd: fd })); + } catch(e) { + logError(e, "Error getting systemd inhibitor"); + callback(null); + } + }); + } + + _prepareForSleep(proxy, sender, [aboutToSuspend]) { + this.emit('prepare-for-sleep', aboutToSuspend); + } +}; +Signals.addSignalMethods(LoginManagerSystemd.prototype); + +var LoginManagerDummy = class { + getCurrentSessionProxy(callback) { + // we could return a DummySession object that fakes whatever callers + // expect (at the time of writing: connect() and connectSignal() + // methods), but just never calling the callback should be safer + } + + canSuspend(asyncCallback) { + asyncCallback(false, false); + } + + listSessions(asyncCallback) { + asyncCallback([]); + } + + suspend() { + this.emit('prepare-for-sleep', true); + this.emit('prepare-for-sleep', false); + } + + inhibit(reason, callback) { + callback(null); + } +}; +Signals.addSignalMethods(LoginManagerDummy.prototype); diff --git a/js/misc/meson.build b/js/misc/meson.build new file mode 100644 index 0000000..5a48717 --- /dev/null +++ b/js/misc/meson.build @@ -0,0 +1,16 @@ +jsconf = configuration_data() +jsconf.set('PACKAGE_NAME', meson.project_name()) +jsconf.set('PACKAGE_VERSION', meson.project_version()) +jsconf.set('GETTEXT_PACKAGE', meson.project_name()) +jsconf.set('LIBMUTTER_API_VERSION', mutter_api_version) +jsconf.set10('HAVE_BLUETOOTH', bt_dep.found()) +jsconf.set10('HAVE_NETWORKMANAGER', have_networkmanager) +jsconf.set('datadir', datadir) +jsconf.set('libexecdir', libexecdir) +jsconf.set('vpndir', vpndir) + +config_js = configure_file( + input: 'config.js.in', + output: 'config.js', + configuration: jsconf +) diff --git a/js/misc/modemManager.js b/js/misc/modemManager.js new file mode 100644 index 0000000..7c6c39a --- /dev/null +++ b/js/misc/modemManager.js @@ -0,0 +1,260 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, NMA } = imports.gi; +const Signals = imports.signals; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +// _getMobileProvidersDatabase: +// +// Gets the database of mobile providers, with references between MCCMNC/SID and +// operator name +// +let _mpd; +function _getMobileProvidersDatabase() { + if (_mpd == null) { + try { + _mpd = new NMA.MobileProvidersDatabase(); + _mpd.init(null); + } catch (e) { + log(e.message); + _mpd = null; + } + } + + return _mpd; +} + +// _findProviderForMccMnc: +// @operator_name: operator name +// @operator_code: operator code +// +// Given an operator name string (which may not be a real operator name) and an +// operator code string, tries to find a proper operator name to display. +// +function _findProviderForMccMnc(operator_name, operator_code) { + if (operator_name) { + if (operator_name.length != 0 && + (operator_name.length > 6 || operator_name.length < 5)) { + // this looks like a valid name, i.e. not an MCCMNC (that some + // devices return when not yet connected + return operator_name; + } + + if (isNaN(parseInt(operator_name))) { + // name is definitely not a MCCMNC, so it may be a name + // after all; return that + return operator_name; + } + } + + let needle; + if ((!operator_name || operator_name.length == 0) && operator_code) + needle = operator_code; + else if (operator_name && (operator_name.length == 6 || operator_name.length == 5)) + needle = operator_name; + else // nothing to search + return null; + + let mpd = _getMobileProvidersDatabase(); + if (mpd) { + let provider = mpd.lookup_3gpp_mcc_mnc(needle); + if (provider) + return provider.get_name(); + } + return null; +} + +// _findProviderForSid: +// @sid: System Identifier of the serving CDMA network +// +// Tries to find the operator name corresponding to the given SID +// +function _findProviderForSid(sid) { + if (sid == 0) + return null; + + let mpd = _getMobileProvidersDatabase(); + if (mpd) { + let provider = mpd.lookup_cdma_sid(sid); + if (provider) + return provider.get_name(); + } + return null; +} + + +//------------------------------------------------------------------------------ +// Support for the old ModemManager interface (MM < 0.7) +//------------------------------------------------------------------------------ + + +// The following are not the complete interfaces, just the methods we need +// (or may need in the future) + +const ModemGsmNetworkInterface = loadInterfaceXML('org.freedesktop.ModemManager.Modem.Gsm.Network'); +const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface); + +const ModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager.Modem.Cdma'); +const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface); + +var ModemGsm = class { + constructor(path) { + this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); + + this.signal_quality = 0; + this.operator_name = null; + + // Code is duplicated because the function have different signatures + this._proxy.connectSignal('SignalQuality', (proxy, sender, [quality]) => { + this.signal_quality = quality; + this.emit('notify::signal-quality'); + }); + this._proxy.connectSignal('RegistrationInfo', (proxy, sender, [status, code, name]) => { + this.operator_name = _findProviderForMccMnc(name, code); + this.emit('notify::operator-name'); + }); + this._proxy.GetRegistrationInfoRemote(([result], err) => { + if (err) { + log(err); + return; + } + + let [status, code, name] = result; + this.operator_name = _findProviderForMccMnc(name, code); + this.emit('notify::operator-name'); + }); + this._proxy.GetSignalQualityRemote((result, err) => { + if (err) { + // it will return an error if the device is not connected + this.signal_quality = 0; + } else { + let [quality] = result; + this.signal_quality = quality; + } + this.emit('notify::signal-quality'); + }); + } +}; +Signals.addSignalMethods(ModemGsm.prototype); + +var ModemCdma = class { + constructor(path) { + this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); + + this.signal_quality = 0; + this.operator_name = null; + this._proxy.connectSignal('SignalQuality', (proxy, sender, params) => { + this.signal_quality = params[0]; + this.emit('notify::signal-quality'); + + // receiving this signal means the device got activated + // and we can finally call GetServingSystem + if (this.operator_name == null) + this._refreshServingSystem(); + }); + this._proxy.GetSignalQualityRemote((result, err) => { + if (err) { + // it will return an error if the device is not connected + this.signal_quality = 0; + } else { + let [quality] = result; + this.signal_quality = quality; + } + this.emit('notify::signal-quality'); + }); + } + + _refreshServingSystem() { + this._proxy.GetServingSystemRemote(([result], err) => { + if (err) { + // it will return an error if the device is not connected + this.operator_name = null; + } else { + let [bandClass, band, sid] = result; + + this.operator_name = _findProviderForSid(sid) + } + this.emit('notify::operator-name'); + }); + } +}; +Signals.addSignalMethods(ModemCdma.prototype); + + +//------------------------------------------------------------------------------ +// Support for the new ModemManager1 interface (MM >= 0.7) +//------------------------------------------------------------------------------ + +const BroadbandModemInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem'); +const BroadbandModemProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemInterface); + +const BroadbandModem3gppInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem.Modem3gpp'); +const BroadbandModem3gppProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModem3gppInterface); + +const BroadbandModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem.ModemCdma'); +const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface); + +var BroadbandModem = class { + constructor(path, capabilities) { + this._proxy = new BroadbandModemProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path); + this._proxy_3gpp = new BroadbandModem3gppProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path); + this._proxy_cdma = new BroadbandModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path); + this._capabilities = capabilities; + + this._proxy.connect('g-properties-changed', (proxy, properties) => { + if ('SignalQuality' in properties.deep_unpack()) + this._reloadSignalQuality(); + }); + this._reloadSignalQuality(); + + this._proxy_3gpp.connect('g-properties-changed', (proxy, properties) => { + let unpacked = properties.deep_unpack(); + if ('OperatorName' in unpacked || 'OperatorCode' in unpacked) + this._reload3gppOperatorName(); + }); + this._reload3gppOperatorName(); + + this._proxy_cdma.connect('g-properties-changed', (proxy, properties) => { + let unpacked = properties.deep_unpack(); + if ('Nid' in unpacked || 'Sid' in unpacked) + this._reloadCdmaOperatorName(); + }); + this._reloadCdmaOperatorName(); + } + + _reloadSignalQuality() { + let [quality, recent] = this._proxy.SignalQuality; + this.signal_quality = quality; + this.emit('notify::signal-quality'); + } + + _reloadOperatorName() { + let new_name = ""; + if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0) + new_name += this.operator_name_3gpp; + + if (this.operator_name_cdma && this.operator_name_cdma.length > 0) { + if (new_name != "") + new_name += ", "; + new_name += this.operator_name_cdma; + } + + this.operator_name = new_name; + this.emit('notify::operator-name'); + } + + _reload3gppOperatorName() { + let name = this._proxy_3gpp.OperatorName; + let code = this._proxy_3gpp.OperatorCode; + this.operator_name_3gpp = _findProviderForMccMnc(name, code); + this._reloadOperatorName(); + } + + _reloadCdmaOperatorName() { + let sid = this._proxy_cdma.Sid; + this.operator_name_cdma = _findProviderForSid(sid); + this._reloadOperatorName(); + } +}; +Signals.addSignalMethods(BroadbandModem.prototype); diff --git a/js/misc/objectManager.js b/js/misc/objectManager.js new file mode 100644 index 0000000..56b4cc9 --- /dev/null +++ b/js/misc/objectManager.js @@ -0,0 +1,293 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib } = imports.gi; +const Params = imports.misc.params; +const Signals = imports.signals; + +// Specified in the D-Bus specification here: +// http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager +const ObjectManagerIface = ` + + + + + + + + + + + + + + +`; + +const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface); + +var ObjectManager = class { + constructor(params) { + params = Params.parse(params, { connection: null, + name: null, + objectPath: null, + knownInterfaces: null, + cancellable: null, + onLoaded: null }); + + this._connection = params.connection; + this._serviceName = params.name; + this._managerPath = params.objectPath; + this._cancellable = params.cancellable; + + this._managerProxy = new Gio.DBusProxy({ g_connection: this._connection, + g_interface_name: ObjectManagerInfo.name, + g_interface_info: ObjectManagerInfo, + g_name: this._serviceName, + g_object_path: this._managerPath, + g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START }); + + this._interfaceInfos = {}; + this._objects = {}; + this._interfaces = {}; + this._onLoaded = params.onLoaded; + + if (params.knownInterfaces) + this._registerInterfaces(params.knownInterfaces); + + // Start out inhibiting load until at least the proxy + // manager is loaded and the remote objects are fetched + this._numLoadInhibitors = 1; + this._managerProxy.init_async(GLib.PRIORITY_DEFAULT, + this._cancellable, + this._onManagerProxyLoaded.bind(this)); + } + + _tryToCompleteLoad() { + if (this._numLoadInhibitors == 0) + return; + + this._numLoadInhibitors--; + if (this._numLoadInhibitors == 0) { + if (this._onLoaded) + this._onLoaded(); + } + } + + _addInterface(objectPath, interfaceName, onFinished) { + let info = this._interfaceInfos[interfaceName]; + + if (!info) { + if (onFinished) + onFinished(); + return; + } + + let proxy = new Gio.DBusProxy({ g_connection: this._connection, + g_name: this._serviceName, + g_object_path: objectPath, + g_interface_name: interfaceName, + g_interface_info: info, + g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START }); + + proxy.init_async(GLib.PRIORITY_DEFAULT, + this._cancellable, + (initable, result) => { + let error = null; + try { + initable.init_finish(result); + } catch(e) { + logError(e, 'could not initialize proxy for interface ' + interfaceName); + + if (onFinished) + onFinished(); + return; + } + + let isNewObject; + if (!this._objects[objectPath]) { + this._objects[objectPath] = {}; + isNewObject = true; + } else { + isNewObject = false; + } + + this._objects[objectPath][interfaceName] = proxy; + + if (!this._interfaces[interfaceName]) + this._interfaces[interfaceName] = []; + + this._interfaces[interfaceName].push(proxy); + + if (isNewObject) + this.emit('object-added', objectPath); + + this.emit('interface-added', interfaceName, proxy); + + if (onFinished) + onFinished(); + }); + } + + _removeInterface(objectPath, interfaceName) { + if (!this._objects[objectPath]) + return; + + let proxy = this._objects[objectPath][interfaceName]; + + if (this._interfaces[interfaceName]) { + let index = this._interfaces[interfaceName].indexOf(proxy); + + if (index >= 0) + this._interfaces[interfaceName].splice(index, 1); + + if (this._interfaces[interfaceName].length == 0) + delete this._interfaces[interfaceName]; + } + + this.emit('interface-removed', interfaceName, proxy); + + this._objects[objectPath][interfaceName] = null; + + if (Object.keys(this._objects[objectPath]).length == 0) { + delete this._objects[objectPath]; + this.emit('object-removed', objectPath); + } + } + + _onManagerProxyLoaded(initable, result) { + let error = null; + try { + initable.init_finish(result); + } catch(e) { + logError(e, 'could not initialize object manager for object ' + this._serviceName); + + this._tryToCompleteLoad(); + return; + } + + this._managerProxy.connectSignal('InterfacesAdded', + (objectManager, sender, [objectPath, interfaces]) => { + let interfaceNames = Object.keys(interfaces); + for (let i = 0; i < interfaceNames.length; i++) + this._addInterface(objectPath, interfaceNames[i]); + }); + this._managerProxy.connectSignal('InterfacesRemoved', + (objectManager, sender, [objectPath, interfaceNames]) => { + for (let i = 0; i < interfaceNames.length; i++) + this._removeInterface(objectPath, interfaceNames[i]); + }); + + if (Object.keys(this._interfaceInfos).length == 0) { + this._tryToCompleteLoad(); + return; + } + + this._managerProxy.connect('notify::g-name-owner', () => { + if (this._managerProxy.g_name_owner) + this._onNameAppeared(); + else + this._onNameVanished(); + }); + + if (this._managerProxy.g_name_owner) + this._onNameAppeared(); + } + + _onNameAppeared() { + this._managerProxy.GetManagedObjectsRemote((result, error) => { + if (!result) { + if (error) { + logError(error, 'could not get remote objects for service ' + this._serviceName + ' path ' + this._managerPath); + } + + this._tryToCompleteLoad(); + return; + } + + let [objects] = result; + + if (!objects) { + this._tryToCompleteLoad(); + return; + } + + let objectPaths = Object.keys(objects); + for (let i = 0; i < objectPaths.length; i++) { + let objectPath = objectPaths[i]; + let object = objects[objectPath]; + + let interfaceNames = Object.getOwnPropertyNames(object); + for (let j = 0; j < interfaceNames.length; j++) { + let interfaceName = interfaceNames[j]; + + // Prevent load from completing until the interface is loaded + this._numLoadInhibitors++; + this._addInterface(objectPath, + interfaceName, + this._tryToCompleteLoad.bind(this)); + } + } + this._tryToCompleteLoad(); + }); + } + + _onNameVanished() { + let objectPaths = Object.keys(this._objects); + for (let i = 0; i < objectPaths.length; i++) { + let objectPath = objectPaths[i]; + let object = this._objects[objectPath]; + + let interfaceNames = Object.keys(object); + for (let j = 0; j < interfaceNames.length; j++) { + let interfaceName = interfaceNames[j]; + + if (object[interfaceName]) + this._removeInterface(objectPath, interfaceName); + } + } + } + + _registerInterfaces(interfaces) { + for (let i = 0; i < interfaces.length; i++) { + let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]); + this._interfaceInfos[info.name] = info; + } + } + + getProxy(objectPath, interfaceName) { + let object = this._objects[objectPath]; + + if (!object) + return null; + + return object[interfaceName]; + } + + getProxiesForInterface(interfaceName) { + let proxyList = this._interfaces[interfaceName]; + + if (!proxyList) + return []; + + return proxyList; + } + + getAllProxies() { + let proxies = []; + + let objectPaths = Object.keys(this._objects); + for (let i = 0; i < objectPaths.length; i++) { + let object = this._objects[objectPaths]; + + let interfaceNames = Object.keys(object); + for (let j = 0; j < interfaceNames.length; j++) { + let interfaceName = interfaceNames[j]; + if (object[interfaceName]) + proxies.push(object(interfaceName)); + } + } + + return proxies; + } +}; +Signals.addSignalMethods(ObjectManager.prototype); diff --git a/js/misc/params.js b/js/misc/params.js new file mode 100644 index 0000000..04691ba --- /dev/null +++ b/js/misc/params.js @@ -0,0 +1,35 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +// parse: +// @params: caller-provided parameter object, or %null +// @defaults-provided defaults object +// @allowExtras: whether or not to allow properties not in @default +// +// Examines @params and fills in default values from @defaults for +// any properties in @defaults that don't appear in @params. If +// @allowExtras is not %true, it will throw an error if @params +// contains any properties that aren't in @defaults. +// +// If @params is %null, this returns the values from @defaults. +// +// Return value: a new object, containing the merged parameters from +// @params and @defaults +function parse(params, defaults, allowExtras) { + let ret = {}, prop; + + if (!params) + params = {}; + + for (prop in params) { + if (!(prop in defaults) && !allowExtras) + throw new Error('Unrecognized parameter "' + prop + '"'); + ret[prop] = params[prop]; + } + + for (prop in defaults) { + if (!(prop in params)) + ret[prop] = defaults[prop]; + } + + return ret; +} \ No newline at end of file diff --git a/js/misc/permissionStore.js b/js/misc/permissionStore.js new file mode 100644 index 0000000..9118d4d --- /dev/null +++ b/js/misc/permissionStore.js @@ -0,0 +1,15 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const PermissionStoreIface = loadInterfaceXML('org.freedesktop.impl.portal.PermissionStore'); +const PermissionStoreProxy = Gio.DBusProxy.makeProxyWrapper(PermissionStoreIface); + +function PermissionStore(initCallback, cancellable) { + return new PermissionStoreProxy(Gio.DBus.session, + 'org.freedesktop.impl.portal.PermissionStore', + '/org/freedesktop/impl/portal/PermissionStore', + initCallback, cancellable); +}; diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js new file mode 100644 index 0000000..fda782d --- /dev/null +++ b/js/misc/smartcardManager.js @@ -0,0 +1,116 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; +const Signals = imports.signals; + +const ObjectManager = imports.misc.objectManager; + +const SmartcardTokenIface = ` + + + + + + + +`; + +let _smartcardManager = null; + +function getSmartcardManager() { + if (_smartcardManager == null) + _smartcardManager = new SmartcardManager(); + + return _smartcardManager; +} + +var SmartcardManager = class { + constructor() { + this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session, + name: "org.gnome.SettingsDaemon.Smartcard", + objectPath: '/org/gnome/SettingsDaemon/Smartcard', + knownInterfaces: [ SmartcardTokenIface ], + onLoaded: this._onLoaded.bind(this) }); + this._insertedTokens = {}; + this._loginToken = null; + } + + _onLoaded() { + let tokens = this._objectManager.getProxiesForInterface('org.gnome.SettingsDaemon.Smartcard.Token'); + + for (let i = 0; i < tokens.length; i++) + this._addToken(tokens[i]); + + this._objectManager.connect('interface-added', (objectManager, interfaceName, proxy) => { + if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token') + this._addToken(proxy); + }); + + this._objectManager.connect('interface-removed', (objectManager, interfaceName, proxy) => { + if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token') + this._removeToken(proxy); + }); + } + + _updateToken(token) { + let objectPath = token.get_object_path(); + + delete this._insertedTokens[objectPath]; + + if (token.IsInserted) + this._insertedTokens[objectPath] = token; + + if (token.UsedToLogin) + this._loginToken = token; + } + + _addToken(token) { + this._updateToken(token); + + token.connect('g-properties-changed', (proxy, properties) => { + if ('IsInserted' in properties.deep_unpack()) { + this._updateToken(token); + + if (token.IsInserted) { + this.emit('smartcard-inserted', token); + } else { + this.emit('smartcard-removed', token); + } + } + }); + + // Emit a smartcard-inserted at startup if it's already plugged in + if (token.IsInserted) + this.emit('smartcard-inserted', token); + } + + _removeToken(token) { + let objectPath = token.get_object_path(); + + if (this._insertedTokens[objectPath] == token) { + delete this._insertedTokens[objectPath]; + this.emit('smartcard-removed', token); + } + + if (this._loginToken == token) + this._loginToken = null; + + token.disconnectAll(); + } + + hasInsertedTokens() { + return Object.keys(this._insertedTokens).length > 0; + } + + hasInsertedLoginToken() { + if (!this._loginToken) + return false; + + if (!this._loginToken.IsInserted) + return false; + + return true; + } + +}; +Signals.addSignalMethods(SmartcardManager.prototype); diff --git a/js/misc/systemActions.js b/js/misc/systemActions.js new file mode 100644 index 0000000..aa79bfe --- /dev/null +++ b/js/misc/systemActions.js @@ -0,0 +1,429 @@ +const { AccountsService, Clutter, Gdm, Gio, GLib, GObject, Meta } = imports.gi; + +const GnomeSession = imports.misc.gnomeSession; +const LoginManager = imports.misc.loginManager; +const Main = imports.ui.main; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; +const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen'; +const DISABLE_USER_SWITCH_KEY = 'disable-user-switching'; +const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen'; +const DISABLE_LOG_OUT_KEY = 'disable-log-out'; +const DISABLE_RESTART_KEY = 'disable-restart-buttons'; +const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out'; + +const SENSOR_BUS_NAME = 'net.hadess.SensorProxy'; +const SENSOR_OBJECT_PATH = '/net/hadess/SensorProxy'; + +const SensorProxyInterface = loadInterfaceXML('net.hadess.SensorProxy'); + +const POWER_OFF_ACTION_ID = 'power-off'; +const LOCK_SCREEN_ACTION_ID = 'lock-screen'; +const LOGOUT_ACTION_ID = 'logout'; +const SUSPEND_ACTION_ID = 'suspend'; +const SWITCH_USER_ACTION_ID = 'switch-user'; +const LOCK_ORIENTATION_ACTION_ID = 'lock-orientation'; + +const SensorProxy = Gio.DBusProxy.makeProxyWrapper(SensorProxyInterface); + +let _singleton = null; + +function getDefault() { + if (_singleton == null) + _singleton = new SystemActions(); + + return _singleton; +} + +const SystemActions = GObject.registerClass({ + Properties: { + 'can-power-off': GObject.ParamSpec.boolean('can-power-off', + 'can-power-off', + 'can-power-off', + GObject.ParamFlags.READABLE, + false), + 'can-suspend': GObject.ParamSpec.boolean('can-suspend', + 'can-suspend', + 'can-suspend', + GObject.ParamFlags.READABLE, + false), + 'can-lock-screen': GObject.ParamSpec.boolean('can-lock-screen', + 'can-lock-screen', + 'can-lock-screen', + GObject.ParamFlags.READABLE, + false), + 'can-switch-user': GObject.ParamSpec.boolean('can-switch-user', + 'can-switch-user', + 'can-switch-user', + GObject.ParamFlags.READABLE, + false), + 'can-logout': GObject.ParamSpec.boolean('can-logout', + 'can-logout', + 'can-logout', + GObject.ParamFlags.READABLE, + false), + 'can-lock-orientation': GObject.ParamSpec.boolean('can-lock-orientation', + 'can-lock-orientation', + 'can-lock-orientation', + GObject.ParamFlags.READABLE, + false), + 'orientation-lock-icon': GObject.ParamSpec.string('orientation-lock-icon', + 'orientation-lock-icon', + 'orientation-lock-icon', + GObject.ParamFlags.READWRITE, + null) + } +}, class SystemActions extends GObject.Object { + _init() { + super._init(); + + this._canHavePowerOff = true; + this._canHaveSuspend = true; + + this._actions = new Map(); + this._actions.set(POWER_OFF_ACTION_ID, + { // Translators: The name of the power-off action in search + name: C_("search-result", "Power Off"), + iconName: 'system-shutdown-symbolic', + // Translators: A list of keywords that match the power-off action, separated by semicolons + keywords: _("power off;shutdown;reboot;restart").split(';'), + available: false }); + this._actions.set(LOCK_SCREEN_ACTION_ID, + { // Translators: The name of the lock screen action in search + name: C_("search-result", "Lock Screen"), + iconName: 'system-lock-screen-symbolic', + // Translators: A list of keywords that match the lock screen action, separated by semicolons + keywords: _("lock screen").split(';'), + available: false }); + this._actions.set(LOGOUT_ACTION_ID, + { // Translators: The name of the logout action in search + name: C_("search-result", "Log Out"), + iconName: 'application-exit-symbolic', + // Translators: A list of keywords that match the logout action, separated by semicolons + keywords: _("logout;sign off").split(';'), + available: false }); + this._actions.set(SUSPEND_ACTION_ID, + { // Translators: The name of the suspend action in search + name: C_("search-result", "Suspend"), + iconName: 'media-playback-pause-symbolic', + // Translators: A list of keywords that match the suspend action, separated by semicolons + keywords: _("suspend;sleep").split(';'), + available: false }); + this._actions.set(SWITCH_USER_ACTION_ID, + { // Translators: The name of the switch user action in search + name: C_("search-result", "Switch User"), + iconName: 'system-switch-user-symbolic', + // Translators: A list of keywords that match the switch user action, separated by semicolons + keywords: _("switch user").split(';'), + available: false }); + this._actions.set(LOCK_ORIENTATION_ACTION_ID, + { // Translators: The name of the lock orientation action in search + name: C_("search-result", "Lock Orientation"), + iconName: '', + // Translators: A list of keywords that match the lock orientation action, separated by semicolons + keywords: _("lock orientation;screen;rotation").split(';'), + available: false }); + + this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); + this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); + this._orientationSettings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.peripherals.touchscreen' }); + + this._session = new GnomeSession.SessionManager(); + this._loginManager = LoginManager.getLoginManager(); + this._monitorManager = Meta.MonitorManager.get(); + + this._userManager = AccountsService.UserManager.get_default(); + + this._userManager.connect('notify::is-loaded', + () => { this._updateMultiUser(); }); + this._userManager.connect('notify::has-multiple-users', + () => { this._updateMultiUser(); }); + this._userManager.connect('user-added', + () => { this._updateMultiUser(); }); + this._userManager.connect('user-removed', + () => { this._updateMultiUser(); }); + + this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY, + () => { this._updateSwitchUser(); }); + this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY, + () => { this._updateLogout(); }); + global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY, + () => { this._updateLogout(); }); + + this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY, + () => { this._updateLockScreen(); }); + + this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY, + () => { this._updateHaveShutdown(); }); + + this.forceUpdate(); + + this._orientationSettings.connect('changed::orientation-lock', + () => { this._updateOrientationLock(); + this._updateOrientationLockIcon(); }); + Main.layoutManager.connect('monitors-changed', + () => { this._updateOrientationLock(); }); + Gio.DBus.system.watch_name(SENSOR_BUS_NAME, + Gio.BusNameWatcherFlags.NONE, + () => { this._sensorProxyAppeared(); }, + () => { + this._sensorProxy = null; + this._updateOrientationLock(); + }); + this._updateOrientationLock(); + this._updateOrientationLockIcon(); + + Main.sessionMode.connect('updated', () => { this._sessionUpdated(); }); + this._sessionUpdated(); + } + + get can_power_off() { + return this._actions.get(POWER_OFF_ACTION_ID).available; + } + + get can_suspend() { + return this._actions.get(SUSPEND_ACTION_ID).available; + } + + get can_lock_screen() { + return this._actions.get(LOCK_SCREEN_ACTION_ID).available; + } + + get can_switch_user() { + return this._actions.get(SWITCH_USER_ACTION_ID).available; + } + + get can_logout() { + return this._actions.get(LOGOUT_ACTION_ID).available; + } + + get can_lock_orientation() { + return this._actions.get(LOCK_ORIENTATION_ACTION_ID).available; + } + + get orientation_lock_icon() { + return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName; + } + + _sensorProxyAppeared() { + this._sensorProxy = new SensorProxy(Gio.DBus.system, SENSOR_BUS_NAME, SENSOR_OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + this._sensorProxy.connect('g-properties-changed', + () => { this._updateOrientationLock(); }); + this._updateOrientationLock(); + }); + } + + _updateOrientationLock() { + let available = false; + if (this._sensorProxy) + available = this._sensorProxy.HasAccelerometer && + this._monitorManager.get_is_builtin_display_on(); + + this._actions.get(LOCK_ORIENTATION_ACTION_ID).available = available; + + this.notify('can-lock-orientation'); + } + + _updateOrientationLockIcon() { + let locked = this._orientationSettings.get_boolean('orientation-lock'); + let iconName = locked ? 'rotation-locked-symbolic' + : 'rotation-allowed-symbolic'; + this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName; + + this.notify('orientation-lock-icon'); + } + + _sessionUpdated() { + this._updateLockScreen(); + this._updatePowerOff(); + this._updateSuspend(); + this._updateMultiUser(); + } + + forceUpdate() { + // Whether those actions are available or not depends on both lockdown + // settings and Polkit policy - we don't get change notifications for the + // latter, so their value may be outdated; force an update now + this._updateHaveShutdown(); + this._updateHaveSuspend(); + } + + getMatchingActions(terms) { + // terms is a list of strings + terms = terms.map((term) => { return term.toLowerCase(); }); + + let results = []; + + for (let [key, {available, keywords}] of this._actions) + if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0)))) + results.push(key); + + return results; + } + + getName(id) { + return this._actions.get(id).name; + } + + getIconName(id) { + return this._actions.get(id).iconName; + } + + activateAction(id) { + switch (id) { + case POWER_OFF_ACTION_ID: + this.activatePowerOff(); + break; + case LOCK_SCREEN_ACTION_ID: + this.activateLockScreen(); + break; + case LOGOUT_ACTION_ID: + this.activateLogout(); + break; + case SUSPEND_ACTION_ID: + this.activateSuspend(); + break; + case SWITCH_USER_ACTION_ID: + this.activateSwitchUser(); + break; + case LOCK_ORIENTATION_ACTION_ID: + this.activateLockOrientation(); + break; + } + } + + _updateLockScreen() { + let showLock = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY); + this._actions.get(LOCK_SCREEN_ACTION_ID).available = showLock && allowLockScreen && LoginManager.canLock(); + this.notify('can-lock-screen'); + } + + _updateHaveShutdown() { + this._session.CanShutdownRemote((result, error) => { + if (error) + return; + + this._canHavePowerOff = result[0]; + this._updatePowerOff(); + }); + } + + _updatePowerOff() { + let disabled = Main.sessionMode.isLocked || + (Main.sessionMode.isGreeter && + this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY)); + this._actions.get(POWER_OFF_ACTION_ID).available = this._canHavePowerOff && !disabled; + this.notify('can-power-off'); + } + + _updateHaveSuspend() { + this._loginManager.canSuspend( + (canSuspend, needsAuth) => { + this._canHaveSuspend = canSuspend; + this._suspendNeedsAuth = needsAuth; + this._updateSuspend(); + }); + } + + _updateSuspend() { + let disabled = (Main.sessionMode.isLocked && + this._suspendNeedsAuth) || + (Main.sessionMode.isGreeter && + this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY)); + this._actions.get(SUSPEND_ACTION_ID).available = this._canHaveSuspend && !disabled; + this.notify('can-suspend'); + } + + _updateMultiUser() { + this._updateLogout(); + this._updateSwitchUser(); + } + + _updateSwitchUser() { + let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY); + let multiUser = this._userManager.can_switch() && this._userManager.has_multiple_users; + let shouldShowInMode = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + + let visible = allowSwitch && multiUser && shouldShowInMode; + this._actions.get(SWITCH_USER_ACTION_ID).available = visible; + this.notify('can-switch-user'); + + return visible; + } + + _updateLogout() { + let user = this._userManager.get_user(GLib.get_user_name()); + + let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY); + let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY); + let systemAccount = user.system_account; + let localAccount = user.local_account; + let multiUser = this._userManager.has_multiple_users; + let multiSession = Gdm.get_session_ids().length > 1; + let shouldShowInMode = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + + let visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount) && shouldShowInMode; + this._actions.get(LOGOUT_ACTION_ID).available = visible; + this.notify('can-logout'); + + return visible; + } + + activateLockOrientation() { + if (!this._actions.get(LOCK_ORIENTATION_ACTION_ID).available) + throw new Error('The lock-orientation action is not available!'); + + let locked = this._orientationSettings.get_boolean('orientation-lock'); + this._orientationSettings.set_boolean('orientation-lock', !locked); + } + + activateLockScreen() { + if (!this._actions.get(LOCK_SCREEN_ACTION_ID).available) + throw new Error('The lock-screen action is not available!'); + + Main.screenShield.lock(true); + } + + activateSwitchUser() { + if (!this._actions.get(SWITCH_USER_ACTION_ID).available) + throw new Error('The switch-user action is not available!'); + + if (Main.screenShield) + Main.screenShield.lock(false); + + Clutter.threads_add_repaint_func_full(Clutter.RepaintFlags.POST_PAINT, () => { + Gdm.goto_login_session_sync(null); + return false; + }); + } + + activateLogout() { + if (!this._actions.get(LOGOUT_ACTION_ID).available) + throw new Error('The logout action is not available!'); + + Main.overview.hide(); + this._session.LogoutRemote(0); + } + + activatePowerOff() { + if (!this._actions.get(POWER_OFF_ACTION_ID).available) + throw new Error('The power-off action is not available!'); + + this._session.ShutdownRemote(0); + } + + activateSuspend() { + if (!this._actions.get(SUSPEND_ACTION_ID).available) + throw new Error('The suspend action is not available!'); + + this._loginManager.suspend(); + } +}); diff --git a/js/misc/util.js b/js/misc/util.js new file mode 100644 index 0000000..a8bea64 --- /dev/null +++ b/js/misc/util.js @@ -0,0 +1,520 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Shell, St } = imports.gi; +const Gettext = imports.gettext; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; +const Params = imports.misc.params; + +var SCROLL_TIME = 0.1; + +// http://daringfireball.net/2010/07/improved_regex_for_matching_urls +const _balancedParens = '\\([^\\s()<>]+\\)'; +const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]'; +const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]'; + +const _urlRegexp = new RegExp( + '(^|' + _leadingJunk + ')' + + '(' + + '(?:' + + '(?:http|https|ftp)://' + // scheme:// + '|' + + 'www\\d{0,3}[.]' + // www. + '|' + + '[a-z0-9.\\-]+[.][a-z]{2,4}/' + // foo.xx/ + ')' + + '(?:' + // one or more: + '[^\\s()<>]+' + // run of non-space non-() + '|' + // or + _balancedParens + // balanced parens + ')+' + + '(?:' + // end with: + _balancedParens + // balanced parens + '|' + // or + _notTrailingJunk + // last non-junk char + ')' + + ')', 'gi'); + +let _desktopSettings = null; + +// findUrls: +// @str: string to find URLs in +// +// Searches @str for URLs and returns an array of objects with %url +// properties showing the matched URL string, and %pos properties indicating +// the position within @str where the URL was found. +// +// Return value: the list of match objects, as described above +function findUrls(str) { + let res = [], match; + while ((match = _urlRegexp.exec(str))) + res.push({ url: match[2], pos: match.index + match[1].length }); + return res; +} + +// spawn: +// @argv: an argv array +// +// Runs @argv in the background, handling any errors that occur +// when trying to start the program. +function spawn(argv) { + try { + trySpawn(argv); + } catch (err) { + _handleSpawnError(argv[0], err); + } +} + +// spawnCommandLine: +// @command_line: a command line +// +// Runs @command_line in the background, handling any errors that +// occur when trying to parse or start the program. +function spawnCommandLine(command_line) { + try { + let [success, argv] = GLib.shell_parse_argv(command_line); + trySpawn(argv); + } catch (err) { + _handleSpawnError(command_line, err); + } +} + +// spawnApp: +// @argv: an argv array +// +// Runs @argv as if it was an application, handling startup notification +function spawnApp(argv) { + try { + let app = Gio.AppInfo.create_from_commandline(argv.join(' '), null, + Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION); + + let context = global.create_app_launch_context(0, -1); + app.launch([], context); + } catch(err) { + _handleSpawnError(argv[0], err); + } +} + +// trySpawn: +// @argv: an argv array +// +// Runs @argv in the background. If launching @argv fails, +// this will throw an error. +function trySpawn(argv) +{ + var success, pid; + try { + [success, pid] = GLib.spawn_async(null, argv, null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null); + } catch (err) { + /* Rewrite the error in case of ENOENT */ + if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) { + throw new GLib.SpawnError({ code: GLib.SpawnError.NOENT, + message: _("Command not found") }); + } else if (err instanceof GLib.Error) { + // The exception from gjs contains an error string like: + // Error invoking GLib.spawn_command_line_async: Failed to + // execute child process "foo" (No such file or directory) + // We are only interested in the part in the parentheses. (And + // we can't pattern match the text, since it gets localized.) + let message = err.message.replace(/.*\((.+)\)/, '$1'); + throw new (err.constructor)({ code: err.code, + message: message }); + } else { + throw err; + } + } + // Dummy child watch; we don't want to double-fork internally + // because then we lose the parent-child relationship, which + // can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275 + GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, () => {}); +} + +// trySpawnCommandLine: +// @command_line: a command line +// +// Runs @command_line in the background. If launching @command_line +// fails, this will throw an error. +function trySpawnCommandLine(command_line) { + let success, argv; + + try { + [success, argv] = GLib.shell_parse_argv(command_line); + } catch (err) { + // Replace "Error invoking GLib.shell_parse_argv: " with + // something nicer + err.message = err.message.replace(/[^:]*: /, _("Could not parse command:") + "\n"); + throw err; + } + + trySpawn(argv); +} + +function _handleSpawnError(command, err) { + let title = _("Execution of “%s” failed:").format(command); + Main.notifyError(title, err.message); +} + +function formatTimeSpan(date) { + let now = GLib.DateTime.new_now_local(); + + let timespan = now.difference(date); + + let minutesAgo = timespan / GLib.TIME_SPAN_MINUTE; + let hoursAgo = timespan / GLib.TIME_SPAN_HOUR; + let daysAgo = timespan / GLib.TIME_SPAN_DAY; + let weeksAgo = daysAgo / 7; + let monthsAgo = daysAgo / 30; + let yearsAgo = weeksAgo / 52; + + if (minutesAgo < 5) + return _("Just now"); + if (hoursAgo < 1) + return Gettext.ngettext("%d minute ago", + "%d minutes ago", minutesAgo).format(minutesAgo); + if (daysAgo < 1) + return Gettext.ngettext("%d hour ago", + "%d hours ago", hoursAgo).format(hoursAgo); + if (daysAgo < 2) + return _("Yesterday"); + if (daysAgo < 15) + return Gettext.ngettext("%d day ago", + "%d days ago", daysAgo).format(daysAgo); + if (weeksAgo < 8) + return Gettext.ngettext("%d week ago", + "%d weeks ago", weeksAgo).format(weeksAgo); + if (yearsAgo < 1) + return Gettext.ngettext("%d month ago", + "%d months ago", monthsAgo).format(monthsAgo); + return Gettext.ngettext("%d year ago", + "%d years ago", yearsAgo).format(yearsAgo); +} + +function formatTime(time, params) { + let date; + // HACK: The built-in Date type sucks at timezones, which we need for the + // world clock; it's often more convenient though, so allow either + // Date or GLib.DateTime as parameter + if (time instanceof Date) + date = GLib.DateTime.new_from_unix_local(time.getTime() / 1000); + else + date = time; + + let now = GLib.DateTime.new_now_local(); + + let daysAgo = now.difference(date) / (24 * 60 * 60 * 1000 * 1000); + + let format; + + if (_desktopSettings == null) + _desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); + let clockFormat = _desktopSettings.get_string('clock-format'); + + params = Params.parse(params, { timeOnly: false }); + + if (clockFormat == '24h') { + // Show only the time if date is on today + if (daysAgo < 1 || params.timeOnly) + /* Translators: Time in 24h format */ + format = N_("%H\u2236%M"); + // Show the word "Yesterday" and time if date is on yesterday + else if (daysAgo <2) + /* Translators: this is the word "Yesterday" followed by a + time string in 24h format. i.e. "Yesterday, 14:30" */ + // xgettext:no-c-format + format = N_("Yesterday, %H\u2236%M"); + // Show a week day and time if date is in the last week + else if (daysAgo < 7) + /* Translators: this is the week day name followed by a time + string in 24h format. i.e. "Monday, 14:30" */ + // xgettext:no-c-format + format = N_("%A, %H\u2236%M"); + else if (date.get_year() == now.get_year()) + /* Translators: this is the month name and day number + followed by a time string in 24h format. + i.e. "May 25, 14:30" */ + // xgettext:no-c-format + format = N_("%B %-d, %H\u2236%M"); + else + /* Translators: this is the month name, day number, year + number followed by a time string in 24h format. + i.e. "May 25 2012, 14:30" */ + // xgettext:no-c-format + format = N_("%B %-d %Y, %H\u2236%M"); + } else { + // Show only the time if date is on today + if (daysAgo < 1 || params.timeOnly) + /* Translators: Time in 12h format */ + format = N_("%l\u2236%M %p"); + // Show the word "Yesterday" and time if date is on yesterday + else if (daysAgo <2) + /* Translators: this is the word "Yesterday" followed by a + time string in 12h format. i.e. "Yesterday, 2:30 pm" */ + // xgettext:no-c-format + format = N_("Yesterday, %l\u2236%M %p"); + // Show a week day and time if date is in the last week + else if (daysAgo < 7) + /* Translators: this is the week day name followed by a time + string in 12h format. i.e. "Monday, 2:30 pm" */ + // xgettext:no-c-format + format = N_("%A, %l\u2236%M %p"); + else if (date.get_year() == now.get_year()) + /* Translators: this is the month name and day number + followed by a time string in 12h format. + i.e. "May 25, 2:30 pm" */ + // xgettext:no-c-format + format = N_("%B %-d, %l\u2236%M %p"); + else + /* Translators: this is the month name, day number, year + number followed by a time string in 12h format. + i.e. "May 25 2012, 2:30 pm"*/ + // xgettext:no-c-format + format = N_("%B %-d %Y, %l\u2236%M %p"); + } + + let formattedTime = date.format(Shell.util_translate_time_string(format)); + // prepend LTR-mark to colon/ratio to force a text direction on times + return formattedTime.replace(/([:\u2236])/g, '\u200e$1'); +} + +function createTimeLabel(date, params) { + if (_desktopSettings == null) + _desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); + + let label = new St.Label({ text: formatTime(date, params) }); + let id = _desktopSettings.connect('changed::clock-format', () => { + label.text = formatTime(date, params); + }); + label.connect('destroy', () => { _desktopSettings.disconnect(id); }); + return label; +} + +// lowerBound: +// @array: an array or array-like object, already sorted +// according to @cmp +// @val: the value to add +// @cmp: a comparator (or undefined to compare as numbers) +// +// Returns the position of the first element that is not +// lower than @val, according to @cmp. +// That is, returns the first position at which it +// is possible to insert @val without violating the +// order. +// This is quite like an ordinary binary search, except +// that it doesn't stop at first element comparing equal. + +function lowerBound(array, val, cmp) { + let min, max, mid, v; + cmp = cmp || ((a, b) => a - b); + + if (array.length == 0) + return 0; + + min = 0; max = array.length; + while (min < (max - 1)) { + mid = Math.floor((min + max) / 2); + v = cmp(array[mid], val); + + if (v < 0) + min = mid + 1; + else + max = mid; + } + + return (min == max || cmp(array[min], val) < 0) ? max : min; +} + +// insertSorted: +// @array: an array sorted according to @cmp +// @val: a value to insert +// @cmp: the sorting function +// +// Inserts @val into @array, preserving the +// sorting invariants. +// Returns the position at which it was inserted +function insertSorted(array, val, cmp) { + let pos = lowerBound(array, val, cmp); + array.splice(pos, 0, val); + + return pos; +} + +var CloseButton = GObject.registerClass( +class CloseButton extends St.Button { + _init(boxpointer) { + super._init({ style_class: 'notification-close'}); + + // This is a bit tricky. St.Bin has its own x-align/y-align properties + // that compete with Clutter's properties. This should be fixed for + // Clutter 2.0. Since St.Bin doesn't define its own setters, the + // setters are a workaround to get Clutter's version. + this.set_x_align(Clutter.ActorAlign.END); + this.set_y_align(Clutter.ActorAlign.START); + + // XXX Clutter 2.0 workaround: ClutterBinLayout needs expand + // to respect the alignments. + this.set_x_expand(true); + this.set_y_expand(true); + + this._boxPointer = boxpointer; + if (boxpointer) + this._boxPointer.connect('arrow-side-changed', this._sync.bind(this)); + } + + _computeBoxPointerOffset() { + if (!this._boxPointer || !this._boxPointer.actor.get_stage()) + return 0; + + let side = this._boxPointer.arrowSide; + if (side == St.Side.TOP) + return this._boxPointer.getArrowHeight(); + else + return 0; + } + + _sync() { + let themeNode = this.get_theme_node(); + + let offY = this._computeBoxPointerOffset(); + this.translation_x = themeNode.get_length('-shell-close-overlap-x') + this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY; + } + + vfunc_style_changed() { + this._sync(); + super.vfunc_style_changed(); + } +}); + +function makeCloseButton(boxpointer) { + return new CloseButton(boxpointer); +} + +function ensureActorVisibleInScrollView(scrollView, actor) { + let adjustment = scrollView.vscroll.adjustment; + let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values(); + + let offset = 0; + let vfade = scrollView.get_effect("fade"); + if (vfade) + offset = vfade.vfade_offset; + + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2; + + let parent = actor.get_parent(); + while (parent != scrollView) { + if (!parent) + throw new Error("actor not in scroll view"); + + let box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + parent = parent.get_parent(); + } + + if (y1 < value + offset) + value = Math.max(0, y1 - offset); + else if (y2 > value + pageSize - offset) + value = Math.min(upper, y2 + offset - pageSize); + else + return; + + Tweener.addTween(adjustment, + { value: value, + time: SCROLL_TIME, + transition: 'easeOutQuad' }); +} + +var AppSettingsMonitor = class { + constructor(appId, schemaId) { + this._appId = appId; + this._schemaId = schemaId; + + this._app = null; + this._settings = null; + this._handlers = []; + + this._schemaSource = Gio.SettingsSchemaSource.get_default(); + + this._appSystem = Shell.AppSystem.get_default(); + this._appSystem.connect('installed-changed', + this._onInstalledChanged.bind(this)); + this._onInstalledChanged(); + } + + get available() { + return this._app != null && this._settings != null; + } + + activateApp() { + if (this._app) + this._app.activate(); + } + + watchSetting(key, callback) { + let handler = { id: 0, key: key, callback: callback }; + this._handlers.push(handler); + + this._connectHandler(handler); + } + + _connectHandler(handler) { + if (!this._settings || handler.id > 0) + return; + + handler.id = this._settings.connect('changed::' + handler.key, + handler.callback); + handler.callback(this._settings, handler.key); + } + + _disconnectHandler(handler) { + if (this._settings && handler.id > 0) + this._settings.disconnect(handler.id); + handler.id = 0; + } + + _onInstalledChanged() { + let hadApp = (this._app != null); + this._app = this._appSystem.lookup_app(this._appId); + let haveApp = (this._app != null); + + if (hadApp == haveApp) + return; + + if (haveApp) + this._checkSettings(); + else + this._setSettings(null); + } + + _setSettings(settings) { + this._handlers.forEach((handler) => { this._disconnectHandler(handler); }); + + let hadSettings = (this._settings != null); + this._settings = settings; + let haveSettings = (this._settings != null); + + this._handlers.forEach((handler) => { this._connectHandler(handler); }); + + if (hadSettings != haveSettings) + this.emit('available-changed'); + } + + _checkSettings() { + let schema = this._schemaSource.lookup(this._schemaId, true); + if (schema) { + this._setSettings(new Gio.Settings({ settings_schema: schema })); + } else if (this._app) { + Mainloop.timeout_add_seconds(1, () => { + this._checkSettings(); + return GLib.SOURCE_REMOVE; + }); + } + } +}; +Signals.addSignalMethods(AppSettingsMonitor.prototype); diff --git a/js/misc/weather.js b/js/misc/weather.js new file mode 100644 index 0000000..e804bde --- /dev/null +++ b/js/misc/weather.js @@ -0,0 +1,249 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Geoclue, Gio, GLib, GWeather } = imports.gi; +const Signals = imports.signals; + +const PermissionStore = imports.misc.permissionStore; +const Util = imports.misc.util; + +// Minimum time between updates to show loading indication +var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE; + +var WeatherClient = class { + constructor() { + this._loading = false; + this._locationValid = false; + this._lastUpdate = GLib.DateTime.new_from_unix_local(0); + + this._autoLocationRequested = false; + this._mostRecentLocation = null; + + this._gclueService = null; + this._gclueStarted = false; + this._gclueStarting = false; + this._gclueLocationChangedId = 0; + + this._weatherAuthorized = false; + this._permStore = new PermissionStore.PermissionStore((proxy, error) => { + if (error) { + log('Failed to connect to permissionStore: ' + error.message); + return; + } + + if (this._permStore.g_name_owner == null) { + // Failed to auto-start, likely because xdg-desktop-portal + // isn't installed; don't restrict access to location service + this._weatherAuthorized = true; + this._updateAutoLocation(); + return; + } + + this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => { + if (error) + log('Error looking up permission: ' + error.message); + + let [perms, data] = error ? [{}, null] : res; + let params = ['gnome', 'geolocation', false, data, perms]; + this._onPermStoreChanged(this._permStore, '', params); + }); + }); + this._permStore.connectSignal('Changed', + this._onPermStoreChanged.bind(this)); + + this._locationSettings = new Gio.Settings({ schema_id: 'org.gnome.system.location' }); + this._locationSettings.connect('changed::enabled', + this._updateAutoLocation.bind(this)); + + this._world = GWeather.Location.get_world(); + + this._providers = GWeather.Provider.METAR | + GWeather.Provider.YR_NO | + GWeather.Provider.OWM; + + this._weatherInfo = new GWeather.Info({ enabled_providers: 0 }); + this._weatherInfo.connect_after('updated', () => { + this._lastUpdate = GLib.DateTime.new_now_local(); + this.emit('changed'); + }); + + this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.desktop', + 'org.gnome.Weather'); + this._weatherAppMon.connect('available-changed', () => { this.emit('changed'); }); + this._weatherAppMon.watchSetting('automatic-location', + this._onAutomaticLocationChanged.bind(this)); + this._weatherAppMon.watchSetting('locations', + this._onLocationsChanged.bind(this)); + } + + get available() { + return this._weatherAppMon.available; + } + + get loading() { + return this._loading; + } + + get hasLocation() { + return this._locationValid; + } + + get info() { + return this._weatherInfo; + } + + activateApp() { + this._weatherAppMon.activateApp(); + } + + update() { + if (!this._locationValid) + return; + + let now = GLib.DateTime.new_now_local(); + // Update without loading indication if the current info is recent enough + if (this._weatherInfo.is_valid() && + now.difference(this._lastUpdate) < UPDATE_THRESHOLD) + this._weatherInfo.update(); + else + this._loadInfo(); + } + + get _useAutoLocation() { + return this._autoLocationRequested && + this._locationSettings.get_boolean('enabled') && + this._weatherAuthorized; + } + + _loadInfo() { + let id = this._weatherInfo.connect('updated', () => { + this._weatherInfo.disconnect(id); + this._loading = false; + }); + + this._loading = true; + this.emit('changed'); + + this._weatherInfo.update(); + } + + _locationsEqual(loc1, loc2) { + if (loc1 == loc2) + return true; + + if (loc1 == null || loc2 == null) + return false; + + return loc1.equal(loc2); + } + + _setLocation(location) { + if (this._locationsEqual(this._weatherInfo.location, location)) + return; + + this._weatherInfo.abort(); + this._weatherInfo.set_location(location); + this._locationValid = (location != null); + + this._weatherInfo.set_enabled_providers(location ? this._providers : 0); + + if (location) + this._loadInfo(); + else + this.emit('changed'); + } + + _updateLocationMonitoring() { + if (this._useAutoLocation) { + if (this._gclueLocationChangedId != 0 || this._gclueService == null) + return; + + this._gclueLocationChangedId = + this._gclueService.connect('notify::location', + this._onGClueLocationChanged.bind(this)); + this._onGClueLocationChanged(); + } else { + if (this._gclueLocationChangedId) + this._gclueService.disconnect(this._gclueLocationChangedId); + this._gclueLocationChangedId = 0; + } + } + + _startGClueService() { + if (this._gclueStarting) + return; + + this._gclueStarting = true; + + Geoclue.Simple.new('org.gnome.Shell', Geoclue.AccuracyLevel.CITY, null, + (o, res) => { + try { + this._gclueService = Geoclue.Simple.new_finish(res); + } catch(e) { + log('Failed to connect to Geoclue2 service: ' + e.message); + this._setLocation(this._mostRecentLocation); + return; + } + this._gclueStarted = true; + this._gclueService.get_client().distance_threshold = 100; + this._updateLocationMonitoring(); + }); + } + + _onGClueLocationChanged() { + let geoLocation = this._gclueService.location; + let location = GWeather.Location.new_detached(geoLocation.description, + null, + geoLocation.latitude, + geoLocation.longitude); + this._setLocation(location); + } + + _onAutomaticLocationChanged(settings, key) { + let useAutoLocation = settings.get_boolean(key); + if (this._autoLocationRequested == useAutoLocation) + return; + + this._autoLocationRequested = useAutoLocation; + + this._updateAutoLocation(); + } + + _updateAutoLocation() { + this._updateLocationMonitoring(); + + if (this._useAutoLocation) + this._startGClueService(); + else + this._setLocation(this._mostRecentLocation); + } + + _onLocationsChanged(settings, key) { + let serialized = settings.get_value(key).deep_unpack().shift(); + let mostRecentLocation = null; + + if (serialized) + mostRecentLocation = this._world.deserialize(serialized); + + if (this._locationsEqual(this._mostRecentLocation, mostRecentLocation)) + return; + + this._mostRecentLocation = mostRecentLocation; + + if (!this._useAutoLocation || !this._gclueStarted) + this._setLocation(this._mostRecentLocation); + } + + _onPermStoreChanged(proxy, sender, params) { + let [table, id, deleted, data, perms] = params; + + if (table != 'gnome' || id != 'geolocation') + return; + + let permission = perms['org.gnome.Weather'] || ['NONE']; + let [accuracy] = permission; + this._weatherAuthorized = accuracy != 'NONE'; + + this._updateAutoLocation(); + } +}; +Signals.addSignalMethods(WeatherClient.prototype); diff --git a/js/perf/core.js b/js/perf/core.js new file mode 100644 index 0000000..04ea3c4 --- /dev/null +++ b/js/perf/core.js @@ -0,0 +1,234 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const System = imports.system; + +const Main = imports.ui.main; +const Scripting = imports.ui.scripting; + +// This performance script measure the most important (core) performance +// metrics for the shell. By looking at the output metrics of this script +// someone should be able to get an idea of how well the shell is performing +// on a particular system. + +var METRICS = { + overviewLatencyFirst: + { description: "Time to first frame after triggering overview, first time", + units: "us" }, + overviewFpsFirst: + { description: "Frame rate when going to the overview, first time", + units: "frames / s" }, + overviewLatencySubsequent: + { description: "Time to first frame after triggering overview, second time", + units: "us"}, + overviewFpsSubsequent: + { description: "Frames rate when going to the overview, second time", + units: "frames / s" }, + overviewFps5Windows: + { description: "Frames rate when going to the overview, 5 windows open", + units: "frames / s" }, + overviewFps10Windows: + { description: "Frames rate when going to the overview, 10 windows open", + units: "frames / s" }, + overviewFps5Maximized: + { description: "Frames rate when going to the overview, 5 maximized windows open", + units: "frames / s" }, + overviewFps10Maximized: + { description: "Frames rate when going to the overview, 10 maximized windows open", + units: "frames / s" }, + overviewFps5Alpha: + { description: "Frames rate when going to the overview, 5 alpha-transparent windows open", + units: "frames / s" }, + overviewFps10Alpha: + { description: "Frames rate when going to the overview, 10 alpha-transparent windows open", + units: "frames / s" }, + usedAfterOverview: + { description: "Malloc'ed bytes after the overview is shown once", + units: "B" }, + leakedAfterOverview: + { description: "Additional malloc'ed bytes the second time the overview is shown", + units: "B" }, + applicationsShowTimeFirst: + { description: "Time to switch to applications view, first time", + units: "us" }, + applicationsShowTimeSubsequent: + { description: "Time to switch to applications view, second time", + units: "us"} +}; + +let WINDOW_CONFIGS = [ + { width: 640, height: 480, alpha: false, maximized: false, count: 1, metric: 'overviewFpsSubsequent' }, + { width: 640, height: 480, alpha: false, maximized: false, count: 5, metric: 'overviewFps5Windows' }, + { width: 640, height: 480, alpha: false, maximized: false, count: 10, metric: 'overviewFps10Windows' }, + { width: 640, height: 480, alpha: false, maximized: true, count: 5, metric: 'overviewFps5Maximized' }, + { width: 640, height: 480, alpha: false, maximized: true, count: 10, metric: 'overviewFps10Maximized' }, + { width: 640, height: 480, alpha: true, maximized: false, count: 5, metric: 'overviewFps5Alpha' }, + { width: 640, height: 480, alpha: true, maximized: false, count: 10, metric: 'overviewFps10Alpha' } +]; + +function *run() { + Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview"); + Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing"); + Scripting.defineScriptEvent("afterShowHide", "After a show/hide cycle for the overview"); + Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view"); + Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view"); + + // Enable recording of timestamps for different points in the frame cycle + global.frame_timestamps = true; + + Main.overview.connect('shown', () => { + Scripting.scriptEvent('overviewShowDone'); + }); + + yield Scripting.sleep(1000); + + for (let i = 0; i < 2 * WINDOW_CONFIGS.length; i++) { + // We go to the overview twice for each configuration; the first time + // to calculate the mipmaps for the windows, the second time to get + // a clean set of numbers. + if ((i % 2) == 0) { + let config = WINDOW_CONFIGS[i / 2]; + yield Scripting.destroyTestWindows(); + + for (let k = 0; k < config.count; k++) + yield Scripting.createTestWindow({ width: config.width, + height: config.height, + alpha: config.alpha, + maximized: config.maximized }); + + yield Scripting.waitTestWindows(); + yield Scripting.sleep(1000); + yield Scripting.waitLeisure(); + } + + Scripting.scriptEvent('overviewShowStart'); + Main.overview.show(); + + yield Scripting.waitLeisure(); + Main.overview.hide(); + yield Scripting.waitLeisure(); + + System.gc(); + yield Scripting.sleep(1000); + Scripting.collectStatistics(); + Scripting.scriptEvent('afterShowHide'); + } + + yield Scripting.destroyTestWindows(); + yield Scripting.sleep(1000); + + Main.overview.show(); + yield Scripting.waitLeisure(); + + for (let i = 0; i < 2; i++) { + Scripting.scriptEvent('applicationsShowStart'); + Main.overview._dash.showAppsButton.checked = true; + yield Scripting.waitLeisure(); + Scripting.scriptEvent('applicationsShowDone'); + Main.overview._dash.showAppsButton.checked = false; + yield Scripting.waitLeisure(); + } +} + +let showingOverview = false; +let finishedShowingOverview = false; +let overviewShowStart; +let overviewFrames; +let overviewLatency; +let mallocUsedSize = 0; +let overviewShowCount = 0; +let firstOverviewUsedSize; +let haveSwapComplete = false; +let applicationsShowStart; +let applicationsShowCount = 0; + +function script_overviewShowStart(time) { + showingOverview = true; + finishedShowingOverview = false; + overviewShowStart = time; + overviewFrames = 0; +} + +function script_overviewShowDone(time) { + // We've set up the state at the end of the zoom out, but we + // need to wait for one more frame to paint before we count + // ourselves as done. + finishedShowingOverview = true; +} + +function script_applicationsShowStart(time) { + applicationsShowStart = time; +} + +function script_applicationsShowDone(time) { + applicationsShowCount++; + if (applicationsShowCount == 1) + METRICS.applicationsShowTimeFirst.value = time - applicationsShowStart; + else + METRICS.applicationsShowTimeSubsequent.value = time - applicationsShowStart; +} + +function script_afterShowHide(time) { + if (overviewShowCount == 1) { + METRICS.usedAfterOverview.value = mallocUsedSize; + } else { + METRICS.leakedAfterOverview.value = mallocUsedSize - METRICS.usedAfterOverview.value; + } +} + +function malloc_usedSize(time, bytes) { + mallocUsedSize = bytes; +} + +function _frameDone(time) { + if (showingOverview) { + if (overviewFrames == 0) + overviewLatency = time - overviewShowStart; + + overviewFrames++; + } + + if (finishedShowingOverview) { + showingOverview = false; + finishedShowingOverview = false; + overviewShowCount++; + + let dt = (time - (overviewShowStart + overviewLatency)) / 1000000; + + // If we see a start frame and an end frame, that would + // be 1 frame for a FPS computation, hence the '- 1' + let fps = (overviewFrames - 1) / dt; + + if (overviewShowCount == 1) { + METRICS.overviewLatencyFirst.value = overviewLatency; + METRICS.overviewFpsFirst.value = fps; + } else if (overviewShowCount == 2) { + METRICS.overviewLatencySubsequent.value = overviewLatency; + } + + // Other than overviewFpsFirst, we collect FPS metrics the second + // we show each window configuration. overviewShowCount is 1,2,3... + if (overviewShowCount % 2 == 0) { + let config = WINDOW_CONFIGS[(overviewShowCount / 2) - 1]; + METRICS[config.metric].value = fps; + } + } +} + +function glx_swapComplete(time, swapTime) { + haveSwapComplete = true; + + _frameDone(swapTime); +} + +function clutter_stagePaintDone(time) { + // If we aren't receiving GLXBufferSwapComplete events, then we approximate + // the time the user sees a frame with the time we finished doing drawing + // commands for the frame. This doesn't take into account the time for + // the GPU to finish painting, and the time for waiting for the buffer + // swap, but if this are uniform - every frame takes the same time to draw - + // then it won't upset our FPS calculation, though the latency value + // will be slightly too low. + + if (!haveSwapComplete) + _frameDone(time); +} diff --git a/js/perf/hwtest.js b/js/perf/hwtest.js new file mode 100644 index 0000000..661f2ef --- /dev/null +++ b/js/perf/hwtest.js @@ -0,0 +1,299 @@ +const { Clutter, Gio, Shell } = imports.gi; +const Main = imports.ui.main; +const Scripting = imports.ui.scripting; + +var METRICS = { + timeToDesktop: + { description: "Time from starting graphical.target to desktop showing", + units: "us" }, + + overviewShowTime: + { description: "Time to switch to overview view, first time", + units: "us" }, + + applicationsShowTime: + { description: "Time to switch to applications view, first time", + units: "us" }, + + mainViewRedrawTime: + { description: "Time to redraw the main view, full screen", + units: "us" }, + + overviewRedrawTime: + { description: "Time to redraw the overview, full screen, 5 windows", + units: "us" }, + + applicationRedrawTime: + { description: "Time to redraw frame with a maximized application update", + units: "us" }, + + geditStartTime: + { description: "Time from gedit launch to window drawn", + units: "us" }, +} + +function waitAndDraw(milliseconds) { + let cb; + + let timeline = new Clutter.Timeline({ duration: milliseconds }); + timeline.start(); + + timeline.connect('new-frame', (timeline, frame) => { + global.stage.queue_redraw(); + }); + + timeline.connect('completed', () => { + timeline.stop(); + if (cb) + cb(); + }); + + return callback => { cb = callback; }; +} + +function waitSignal(object, signal) { + let cb; + + let id = object.connect(signal, () => { + object.disconnect(id); + if (cb) + cb(); + }); + + return callback => { cb = callback; }; +} + +function extractBootTimestamp() { + let sp = Gio.Subprocess.new(['journalctl', '-b', + 'MESSAGE_ID=7d4958e842da4a758f6c1cdc7b36dcc5', + 'UNIT=graphical.target', + '-o', + 'json'], + Gio.SubprocessFlags.STDOUT_PIPE); + let result = null; + + let datastream = Gio.DataInputStream.new(sp.get_stdout_pipe()); + while (true) { + let [line, length] = datastream.read_line_utf8(null); + if (line === null) + break; + + let fields = JSON.parse(line); + result = Number(fields['__MONOTONIC_TIMESTAMP']); + } + datastream.close(null); + return result; +} + +function *run() { + Scripting.defineScriptEvent("desktopShown", "Finished initial animation"); + Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview"); + Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing"); + Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view"); + Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view"); + Scripting.defineScriptEvent("mainViewDrawStart", "Drawing main view"); + Scripting.defineScriptEvent("mainViewDrawDone", "Ending timing main view drawing"); + Scripting.defineScriptEvent("overviewDrawStart", "Drawing overview"); + Scripting.defineScriptEvent("overviewDrawDone", "Ending timing overview drawing"); + Scripting.defineScriptEvent("redrawTestStart", "Drawing application window"); + Scripting.defineScriptEvent("redrawTestDone", "Ending timing application window drawing"); + Scripting.defineScriptEvent("collectTimings", "Accumulate frame timings from redraw tests"); + Scripting.defineScriptEvent("geditLaunch", "gedit application launch"); + Scripting.defineScriptEvent("geditFirstFrame", "first frame of gedit window drawn"); + + yield Scripting.waitLeisure(); + Scripting.scriptEvent('desktopShown'); + + let interfaceSettings = new Gio.Settings({ + schema_id: 'org.gnome.desktop.interface' + }); + interfaceSettings.set_boolean('enable-animations', false); + + Scripting.scriptEvent('overviewShowStart'); + Main.overview.show(); + yield Scripting.waitLeisure(); + Scripting.scriptEvent('overviewShowDone'); + + yield Scripting.sleep(1000); + + Scripting.scriptEvent('applicationsShowStart'); + Main.overview._dash.showAppsButton.checked = true; + + yield Scripting.waitLeisure(); + Scripting.scriptEvent('applicationsShowDone'); + + yield Scripting.sleep(1000); + + Main.overview.hide(); + yield Scripting.waitLeisure(); + + //////////////////////////////////////// + // Tests of redraw speed + //////////////////////////////////////// + + global.frame_timestamps = true; + global.frame_finish_timestamp = true; + + for (let k = 0; k < 5; k++) + yield Scripting.createTestWindow({ maximized: true }); + yield Scripting.waitTestWindows(); + + yield Scripting.sleep(1000); + + Scripting.scriptEvent('mainViewDrawStart'); + yield waitAndDraw(1000); + Scripting.scriptEvent('mainViewDrawDone'); + + Main.overview.show(); + Scripting.waitLeisure(); + + yield Scripting.sleep(1500); + + Scripting.scriptEvent('overviewDrawStart'); + yield waitAndDraw(1000); + Scripting.scriptEvent('overviewDrawDone'); + + yield Scripting.destroyTestWindows(); + Main.overview.hide(); + + yield Scripting.createTestWindow({ maximized: true, + redraws: true}); + yield Scripting.waitTestWindows(); + + yield Scripting.sleep(1000); + + Scripting.scriptEvent('redrawTestStart'); + yield Scripting.sleep(1000); + Scripting.scriptEvent('redrawTestDone'); + + yield Scripting.sleep(1000); + Scripting.scriptEvent('collectTimings'); + + yield Scripting.destroyTestWindows(); + + global.frame_timestamps = false; + global.frame_finish_timestamp = false; + + yield Scripting.sleep(1000); + + //////////////////////////////////////// + + let appSys = Shell.AppSystem.get_default(); + let app = appSys.lookup_app('org.gnome.gedit.desktop'); + + Scripting.scriptEvent('geditLaunch'); + app.activate(); + + let windows = app.get_windows(); + if (windows.length > 0) + throw new Error('gedit was already running'); + + while (windows.length == 0) { + yield waitSignal(global.display, 'window-created'); + windows = app.get_windows(); + } + + let actor = windows[0].get_compositor_private(); + yield waitSignal(actor, 'first-frame'); + Scripting.scriptEvent('geditFirstFrame'); + + yield Scripting.sleep(1000); + + windows[0].delete(global.get_current_time()); + + yield Scripting.sleep(1000); + + interfaceSettings.set_boolean('enable-animations', true); +} + +let overviewShowStart; +let applicationsShowStart; +let stagePaintStart; +let redrawTiming; +let redrawTimes = {}; +let geditLaunchTime; + +function script_desktopShown(time) { + let bootTimestamp = extractBootTimestamp(); + METRICS.timeToDesktop.value = time - bootTimestamp; +} + +function script_overviewShowStart(time) { + overviewShowStart = time; +} + +function script_overviewShowDone(time) { + METRICS.overviewShowTime.value = time - overviewShowStart; +} + +function script_applicationsShowStart(time) { + applicationsShowStart = time; +} + +function script_applicationsShowDone(time) { + METRICS.applicationsShowTime.value = time - applicationsShowStart; +} + +function script_mainViewDrawStart(time) { + redrawTiming = 'mainView'; +} + +function script_mainViewDrawDone(time) { + redrawTiming = null; +} + +function script_overviewDrawStart(time) { + redrawTiming = 'overview'; +} + +function script_overviewDrawDone(time) { + redrawTiming = null; +} + +function script_redrawTestStart(time) { + redrawTiming = 'application'; +} + +function script_redrawTestDone(time) { + redrawTiming = null; +} + +function script_collectTimings(time) { + for (let timing in redrawTimes) { + let times = redrawTimes[timing]; + times.sort((a, b) => a - b); + + let len = times.length; + let median; + + if (len == 0) + median = -1; + else if (len % 2 == 1) + median = times[(len - 1)/ 2]; + else + median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2); + + METRICS[timing + 'RedrawTime'].value = median; + } +} + +function script_geditLaunch(time) { + geditLaunchTime = time; +} + +function script_geditFirstFrame(time) { + METRICS.geditStartTime.value = time - geditLaunchTime; +} + +function clutter_stagePaintStart(time) { + stagePaintStart = time; +} + +function clutter_paintCompletedTimestamp(time) { + if (redrawTiming != null && stagePaintStart != null) { + if (!(redrawTiming in redrawTimes)) + redrawTimes[redrawTiming] = []; + redrawTimes[redrawTiming].push(time - stagePaintStart); + } + stagePaintStart = null; +} diff --git a/js/portal-resources.gresource.xml b/js/portal-resources.gresource.xml new file mode 100644 index 0000000..f4858cb --- /dev/null +++ b/js/portal-resources.gresource.xml @@ -0,0 +1,10 @@ + + + + portalHelper/main.js + + misc/config.js + misc/fileUtils.js + misc/params.js + + diff --git a/js/portalHelper/main.js b/js/portalHelper/main.js new file mode 100644 index 0000000..e163d65 --- /dev/null +++ b/js/portalHelper/main.js @@ -0,0 +1,353 @@ +const Format = imports.format; +const Gettext = imports.gettext; +const { Gio, GLib, GObject, Gtk, Pango, Soup, WebKit2: WebKit } = imports.gi; + +const _ = Gettext.gettext; + +const Config = imports.misc.config; +const { loadInterfaceXML } = imports.misc.fileUtils; + +const PortalHelperResult = { + CANCELLED: 0, + COMPLETED: 1, + RECHECK: 2 +}; + +const PortalHelperSecurityLevel = { + NOT_YET_DETERMINED: 0, + SECURE: 1, + INSECURE: 2 +}; + +const INACTIVITY_TIMEOUT = 30000; //ms +const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org'; +const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST; +const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC; + +const HelperDBusInterface = loadInterfaceXML('org.gnome.Shell.PortalHelper'); + +var PortalHeaderBar = GObject.registerClass( +class PortalHeaderBar extends Gtk.HeaderBar { + _init() { + super._init({ show_close_button: true }); + + // See ephy-title-box.c in epiphany for the layout + let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, + spacing: 0 }); + this.set_custom_title(vbox); + + /* TRANSLATORS: this is the title of the wifi captive portal login window */ + let titleLabel = new Gtk.Label({ label: _("Hotspot Login"), + wrap: false, + single_line_mode: true, + ellipsize: Pango.EllipsizeMode.END }); + titleLabel.get_style_context().add_class('title'); + vbox.add(titleLabel); + + let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL, + spacing: 4, + halign: Gtk.Align.CENTER, + valign: Gtk.Align.BASELINE }); + hbox.get_style_context().add_class('subtitle'); + vbox.add(hbox); + + this._lockImage = new Gtk.Image({ icon_size: Gtk.IconSize.MENU, + valign: Gtk.Align.BASELINE }); + hbox.add(this._lockImage); + + this.subtitleLabel = new Gtk.Label({ wrap: false, + single_line_mode: true, + ellipsize: Pango.EllipsizeMode.END, + valign: Gtk.Align.BASELINE, + selectable: true}); + this.subtitleLabel.get_style_context().add_class('subtitle'); + hbox.add(this.subtitleLabel); + + vbox.show_all(); + } + + setSubtitle(label) { + this.subtitleLabel.set_text(label); + } + + setSecurityIcon(securityLevel) { + switch (securityLevel) { + case PortalHelperSecurityLevel.NOT_YET_DETERMINED: + this._lockImage.hide(); + break; + case PortalHelperSecurityLevel.SECURE: + this._lockImage.show(); + this._lockImage.set_from_icon_name("channel-secure-symbolic", Gtk.IconSize.MENU); + this._lockImage.set_tooltip_text(null); + break; + case PortalHelperSecurityLevel.INSECURE: + this._lockImage.show(); + this._lockImage.set_from_icon_name("channel-insecure-symbolic", Gtk.IconSize.MENU); + this._lockImage.set_tooltip_text(_('Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby.')); + break; + } + } +}); + +var PortalWindow = GObject.registerClass( +class PortalWindow extends Gtk.ApplicationWindow { + _init(application, url, timestamp, doneCallback) { + super._init({ application: application }); + + this.connect('delete-event', this.destroyWindow.bind(this)); + this._headerBar = new PortalHeaderBar(); + this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED); + this.set_titlebar(this._headerBar); + this._headerBar.show(); + + if (!url) { + url = CONNECTIVITY_CHECK_URI; + this._originalUrlWasGnome = true; + } else { + this._originalUrlWasGnome = false; + } + this._uri = new Soup.URI(url); + this._everSeenRedirect = false; + this._originalUrl = url; + this._doneCallback = doneCallback; + this._lastRecheck = 0; + this._recheckAtExit = false; + + this._webContext = WebKit.WebContext.new_ephemeral(); + this._webContext.set_cache_model(WebKit.CacheModel.DOCUMENT_VIEWER); + this._webContext.set_network_proxy_settings(WebKit.NetworkProxyMode.NO_PROXY, null); + + this._webView = WebKit.WebView.new_with_context(this._webContext); + this._webView.connect('decide-policy', this._onDecidePolicy.bind(this)); + this._webView.connect('load-changed', this._onLoadChanged.bind(this)); + this._webView.connect('insecure-content-detected', this._onInsecureContentDetected.bind(this)); + this._webView.connect('load-failed-with-tls-errors', this._onLoadFailedWithTlsErrors.bind(this)); + this._webView.load_uri(url); + this._webView.connect('notify::uri', this._syncUri.bind(this)); + this._syncUri(); + + this.add(this._webView); + this._webView.show(); + this.set_size_request(600, 450); + this.maximize(); + this.present_with_time(timestamp); + + this.application.set_accels_for_action('app.quit', ['q', 'w']); + } + + destroyWindow() { + this.destroy(); + } + + _syncUri() { + let uri = this._webView.uri; + if (uri) + this._headerBar.setSubtitle(GLib.uri_unescape_string(uri, null)); + else + this._headerBar.setSubtitle(''); + } + + refresh() { + this._everSeenRedirect = false; + this._webView.load_uri(this._originalUrl); + } + + vfunc_delete_event(event) { + if (this._recheckAtExit) + this._doneCallback(PortalHelperResult.RECHECK); + else + this._doneCallback(PortalHelperResult.CANCELLED); + return false; + } + + _onLoadChanged(view, loadEvent) { + if (loadEvent == WebKit.LoadEvent.STARTED) { + this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED); + } else if (loadEvent == WebKit.LoadEvent.COMMITTED) { + let tlsInfo = this._webView.get_tls_info(); + let ret = tlsInfo[0]; + let flags = tlsInfo[2]; + if (ret && flags == 0) + this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.SECURE); + else + this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE); + } + } + + _onInsecureContentDetected() { + this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE); + } + + _onLoadFailedWithTlsErrors(view, failingURI, certificate, errors) { + this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE); + let uri = new Soup.URI(failingURI); + this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host()); + this._webView.load_uri(failingURI); + return true; + } + + _onDecidePolicy(view, decision, type) { + if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) { + let navigationAction = decision.get_navigation_action(); + if (navigationAction.is_user_gesture()) { + // Even though the portal asks for a new window, + // perform the navigation in the current one. Some + // portals open a window as their last login step and + // ignoring that window causes them to not let the + // user go through. We don't risk popups taking over + // the page because we check that the navigation is + // user initiated. + this._webView.load_request(navigationAction.get_request()); + } + + decision.ignore(); + return true; + } + + if (type != WebKit.PolicyDecisionType.NAVIGATION_ACTION) + return false; + + let request = decision.get_request(); + let uri = new Soup.URI(request.get_uri()); + + if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) { + if (uri.get_host() == CONNECTIVITY_CHECK_HOST && this._everSeenRedirect) { + // Yay, we got to gnome! + decision.ignore(); + this._doneCallback(PortalHelperResult.COMPLETED); + return true; + } else if (uri.get_host() != CONNECTIVITY_CHECK_HOST) { + this._everSeenRedirect = true; + } + } + + // We *may* have finished here, but we don't know for + // sure. Tell gnome-shell to run another connectivity check + // (but ratelimit the checks, we don't want to spam + // nmcheck.gnome.org for portals that have 10 or more internal + // redirects - and unfortunately they exist) + // If we hit the rate limit, we also queue a recheck + // when the window is closed, just in case we miss the + // final check and don't realize we're connected + // This should not be a problem in the cancelled logic, + // because if the user doesn't want to start the login, + // we should not see any redirect at all, outside this._uri + + let now = GLib.get_monotonic_time(); + let shouldRecheck = (now - this._lastRecheck) > + CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT; + + if (shouldRecheck) { + this._lastRecheck = now; + this._recheckAtExit = false; + this._doneCallback(PortalHelperResult.RECHECK); + } else { + this._recheckAtExit = true; + } + + // Update the URI, in case of chained redirects, so we still + // think we're doing the login until gnome-shell kills us + this._uri = uri; + + decision.use(); + return true; + } +}); + +var WebPortalHelper = GObject.registerClass( +class WebPortalHelper extends Gtk.Application { + _init() { + super._init({ application_id: 'org.gnome.Shell.PortalHelper', + flags: Gio.ApplicationFlags.IS_SERVICE, + inactivity_timeout: 30000 }); + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this); + this._queue = []; + + let action = new Gio.SimpleAction({ name: 'quit' }); + action.connect('activate', () => { this.active_window.destroyWindow(); }); + this.add_action(action); + } + + vfunc_dbus_register(connection, path) { + this._dbusImpl.export(connection, path); + super.vfunc_dbus_register(connection, path); + return true; + } + + vfunc_dbus_unregister(connection, path) { + this._dbusImpl.unexport_from_connection(connection); + super.vfunc_dbus_unregister(connection, path); + } + + vfunc_activate() { + // If launched manually (for example for testing), force a dummy authentication + // session with the default url + this.Authenticate('/org/gnome/dummy', '', 0); + } + + Authenticate(connection, url, timestamp) { + this._queue.push({ connection: connection, url: url, timestamp: timestamp }); + + this._processQueue(); + } + + Close(connection) { + for (let i = 0; i < this._queue.length; i++) { + let obj = this._queue[i]; + + if (obj.connection == connection) { + if (obj.window) + obj.window.destroyWindow(); + this._queue.splice(i, 1); + break; + } + } + + this._processQueue(); + } + + Refresh(connection) { + for (let i = 0; i < this._queue.length; i++) { + let obj = this._queue[i]; + + if (obj.connection == connection) { + if (obj.window) + obj.window.refresh(); + break; + } + } + } + + _processQueue() { + if (this._queue.length == 0) + return; + + let top = this._queue[0]; + if (top.window != null) + return; + + top.window = new PortalWindow(this, top.url, top.timestamp, result => { + this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result])); + }); + } +}); + +function initEnvironment() { + String.prototype.format = Format.format; +} + +function main(argv) { + initEnvironment(); + + if (!WebKit.WebContext.new_ephemeral) { + log('WebKitGTK 2.16 is required for the portal-helper, see https://bugzilla.gnome.org/show_bug.cgi?id=780453'); + return 1; + } + + Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR); + Gettext.textdomain(Config.GETTEXT_PACKAGE); + + let app = new WebPortalHelper(); + return app.run(argv); +} diff --git a/js/prefs-resources.gresource.xml b/js/prefs-resources.gresource.xml new file mode 100644 index 0000000..653c4cb --- /dev/null +++ b/js/prefs-resources.gresource.xml @@ -0,0 +1,11 @@ + + + + extensionPrefs/main.js + + misc/config.js + misc/extensionUtils.js + misc/fileUtils.js + misc/params.js + + diff --git a/js/ui/accessDialog.js b/js/ui/accessDialog.js new file mode 100644 index 0000000..69ba42c --- /dev/null +++ b/js/ui/accessDialog.js @@ -0,0 +1,152 @@ +const { Clutter, Gio, GLib, Shell } = imports.gi; + +const CheckBox = imports.ui.checkBox; +const Dialog = imports.ui.dialog; +const ModalDialog = imports.ui.modalDialog; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const RequestIface = loadInterfaceXML('org.freedesktop.impl.portal.Request'); +const AccessIface = loadInterfaceXML('org.freedesktop.impl.portal.Access'); + +var DialogResponse = { + OK: 0, + CANCEL: 1, + CLOSED: 2 +}; + +var AccessDialog = class extends ModalDialog.ModalDialog { + constructor(invocation, handle, title, subtitle, body, options) { + super({ styleClass: 'access-dialog' }); + + this._invocation = invocation; + this._handle = handle; + + this._requestExported = false; + this._request = Gio.DBusExportedObject.wrapJSObject(RequestIface, this); + + for (let option in options) + options[option] = options[option].deep_unpack(); + + this._buildLayout(title, subtitle, body, options); + } + + _buildLayout(title, subtitle, body, options) { + // No support for non-modal system dialogs, so ignore the option + //let modal = options['modal'] || true; + let denyLabel = options['deny_label'] || _("Deny Access"); + let grantLabel = options['grant_label'] || _("Grant Access"); + let iconName = options['icon'] || null; + let choices = options['choices'] || []; + + let contentParams = { title, subtitle, body }; + if (iconName) + contentParams.icon = new Gio.ThemedIcon({ name: iconName }); + let content = new Dialog.MessageDialogContent(contentParams); + this.contentLayout.add_actor(content); + + this._choices = new Map(); + + for (let i = 0; i < choices.length; i++) { + let [id, name, opts, selected] = choices[i]; + if (opts.length > 0) + continue; // radio buttons, not implemented + + let check = new CheckBox.CheckBox(); + check.getLabelActor().text = name; + check.actor.checked = selected == "true"; + content.insertBeforeBody(check.actor); + + this._choices.set(id, check); + } + + this.addButton({ label: denyLabel, + action: () => { + this._sendResponse(DialogResponse.CANCEL); + }, + key: Clutter.KEY_Escape }); + this.addButton({ label: grantLabel, + action: () => { + this._sendResponse(DialogResponse.OK); + }}); + } + + open() { + super.open(); + + let connection = this._invocation.get_connection(); + this._requestExported = this._request.export(connection, this._handle); + } + + CloseAsync(invocation, params) { + if (this._invocation.get_sender() != invocation.get_sender()) { + invocation.return_error_literal(Gio.DBusError, + Gio.DBusError.ACCESS_DENIED, + ''); + return; + } + + this._sendResponse(DialogResponse.CLOSED); + } + + _sendResponse(response) { + if (this._requestExported) + this._request.unexport(); + this._requestExported = false; + + let results = {}; + if (response == DialogResponse.OK) { + for (let [id, check] of this._choices) { + let checked = check.actor.checked ? 'true' : 'false'; + results[id] = new GLib.Variant('s', checked); + } + } + + // Delay actual response until the end of the close animation (if any) + this.connect('closed', () => { + this._invocation.return_value(new GLib.Variant('(ua{sv})', + [response, results])); + }); + this.close(); + } +}; + +var AccessDialogDBus = class { + constructor() { + this._accessDialog = null; + + this._windowTracker = Shell.WindowTracker.get_default(); + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AccessIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop'); + + Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null); + } + + AccessDialogAsync(params, invocation) { + if (this._accessDialog) { + invocation.return_error_literal(Gio.DBusError, + Gio.DBusError.LIMITS_EXCEEDED, + 'Already showing a system access dialog'); + return; + } + + let [handle, appId, parentWindow, title, subtitle, body, options] = params; + // We probably want to use parentWindow and global.display.focus_window + // for this check in the future + if (appId && appId + '.desktop' != this._windowTracker.focus_app.id) { + invocation.return_error_literal(Gio.DBusError, + Gio.DBusError.ACCESS_DENIED, + 'Only the focused app is allowed to show a system access dialog'); + return; + } + + let dialog = new AccessDialog(invocation, handle, title, + subtitle, body, options); + dialog.open(); + + dialog.connect('closed', () => { this._accessDialog = null; }); + + this._accessDialog = dialog; + } +}; diff --git a/js/ui/altTab.js b/js/ui/altTab.js new file mode 100644 index 0000000..fb9c875 --- /dev/null +++ b/js/ui/altTab.js @@ -0,0 +1,1114 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; + +const Main = imports.ui.main; +const SwitcherPopup = imports.ui.switcherPopup; +const Tweener = imports.ui.tweener; + +var APP_ICON_HOVER_TIMEOUT = 200; // milliseconds + +var THUMBNAIL_DEFAULT_SIZE = 256; +var THUMBNAIL_POPUP_TIME = 500; // milliseconds +var THUMBNAIL_FADE_TIME = 0.1; // seconds + +var WINDOW_PREVIEW_SIZE = 128; +var APP_ICON_SIZE = 96; +var APP_ICON_SIZE_SMALL = 48; + +const baseIconSizes = [96, 64, 48, 32, 22]; + +var AppIconMode = { + THUMBNAIL_ONLY: 1, + APP_ICON_ONLY: 2, + BOTH: 3, +}; + +function _createWindowClone(window, size) { + let [width, height] = window.get_size(); + let scale = Math.min(1.0, size / width, size / height); + return new Clutter.Clone({ source: window, + width: width * scale, + height: height * scale, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + // usual hack for the usual bug in ClutterBinLayout... + x_expand: true, + y_expand: true }); +}; + +function getWindows(workspace) { + // We ignore skip-taskbar windows in switchers, but if they are attached + // to their parent, their position in the MRU list may be more appropriate + // than the parent; so start with the complete list ... + let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, + workspace); + // ... map windows to their parent where appropriate ... + return windows.map(w => { + return w.is_attached_dialog() ? w.get_transient_for() : w; + // ... and filter out skip-taskbar windows and duplicates + }).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i); +} + +var AppSwitcherPopup = GObject.registerClass( +class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup { + _init() { + super._init(); + + this._thumbnails = null; + this._thumbnailTimeoutId = 0; + this._currentWindow = -1; + + this.thumbnailsVisible = false; + + let apps = Shell.AppSystem.get_default().get_running (); + + if (apps.length == 0) + return; + + this._switcherList = new AppSwitcher(apps, this); + this._items = this._switcherList.icons; + } + + vfunc_allocate(box, flags) { + super.vfunc_allocate(box, flags); + + // Allocate the thumbnails + // We try to avoid overflowing the screen so we base the resulting size on + // those calculations + if (this._thumbnails) { + let childBox = this._switcherList.get_allocation_box(); + let primary = Main.layoutManager.primaryMonitor; + + let leftPadding = this.get_theme_node().get_padding(St.Side.LEFT); + let rightPadding = this.get_theme_node().get_padding(St.Side.RIGHT); + let bottomPadding = this.get_theme_node().get_padding(St.Side.BOTTOM); + let hPadding = leftPadding + rightPadding; + + let icon = this._items[this._selectedIndex]; + let [posX, posY] = icon.get_transformed_position(); + let thumbnailCenter = posX + icon.width / 2; + let [childMinWidth, childNaturalWidth] = this._thumbnails.get_preferred_width(-1); + childBox.x1 = Math.max(primary.x + leftPadding, Math.floor(thumbnailCenter - childNaturalWidth / 2)); + if (childBox.x1 + childNaturalWidth > primary.x + primary.width - hPadding) { + let offset = childBox.x1 + childNaturalWidth - primary.width + hPadding; + childBox.x1 = Math.max(primary.x + leftPadding, childBox.x1 - offset - hPadding); + } + + let spacing = this.get_theme_node().get_length('spacing'); + + childBox.x2 = childBox.x1 + childNaturalWidth; + if (childBox.x2 > primary.x + primary.width - rightPadding) + childBox.x2 = primary.x + primary.width - rightPadding; + childBox.y1 = this._switcherList.allocation.y2 + spacing; + this._thumbnails.addClones(primary.y + primary.height - bottomPadding - childBox.y1); + let [childMinHeight, childNaturalHeight] = this._thumbnails.get_preferred_height(-1); + childBox.y2 = childBox.y1 + childNaturalHeight; + this._thumbnails.allocate(childBox, flags); + } + } + + _initialSelection(backward, binding) { + if (binding == 'switch-group') { + if (backward) { + this._select(0, this._items[0].cachedWindows.length - 1); + } else { + if (this._items[0].cachedWindows.length > 1) + this._select(0, 1); + else + this._select(0, 0); + } + } else if (binding == 'switch-group-backward') { + this._select(0, this._items[0].cachedWindows.length - 1); + } else if (binding == 'switch-applications-backward') { + this._select(this._items.length - 1); + } else if (this._items.length == 1) { + this._select(0); + } else if (backward) { + this._select(this._items.length - 1); + } else { + this._select(1); + } + } + + _nextWindow() { + // We actually want the second window if we're in the unset state + if (this._currentWindow == -1) + this._currentWindow = 0; + return SwitcherPopup.mod(this._currentWindow + 1, + this._items[this._selectedIndex].cachedWindows.length); + } + + _previousWindow() { + // Also assume second window here + if (this._currentWindow == -1) + this._currentWindow = 1; + return SwitcherPopup.mod(this._currentWindow - 1, + this._items[this._selectedIndex].cachedWindows.length); + } + + _closeAppWindow(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(appIndex) { + let appIcon = this._items[appIndex]; + if (!appIcon) + return; + + appIcon.app.request_quit(); + } + + _keyPressHandler(keysym, action) { + if (action == Meta.KeyBindingAction.SWITCH_GROUP) { + if (!this._thumbnailsFocused) + this._select(this._selectedIndex, 0); + else + this._select(this._selectedIndex, this._nextWindow()); + } else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) { + this._select(this._selectedIndex, this._previousWindow()); + } else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS) { + 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()); + else if (keysym == Clutter.Right) + 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 { + if (keysym == Clutter.Left) + this._select(this._previous()); + else if (keysym == Clutter.Right) + this._select(this._next()); + else if (keysym == Clutter.Down) + this._select(this._selectedIndex, 0); + else + return Clutter.EVENT_PROPAGATE; + } + + return Clutter.EVENT_STOP; + } + + _scrollHandler(direction) { + if (direction == Clutter.ScrollDirection.UP) { + if (this._thumbnailsFocused) { + if (this._currentWindow == 0 || this._currentWindow == -1) + this._select(this._previous()); + else + this._select(this._selectedIndex, this._previousWindow()); + } else { + let nwindows = this._items[this._selectedIndex].cachedWindows.length; + if (nwindows > 1) + this._select(this._selectedIndex, nwindows - 1); + else + this._select(this._previous()); + } + } else if (direction == Clutter.ScrollDirection.DOWN) { + if (this._thumbnailsFocused) { + if (this._currentWindow == this._items[this._selectedIndex].cachedWindows.length - 1) + this._select(this._next()); + else + this._select(this._selectedIndex, this._nextWindow()); + } else { + let nwindows = this._items[this._selectedIndex].cachedWindows.length; + if (nwindows > 1) + this._select(this._selectedIndex, 0); + else + this._select(this._next()); + } + } + } + + _itemActivatedHandler(n) { + // If the user clicks on the selected app, activate the + // selected window; otherwise (eg, they click on an app while + // !mouseActive) activate the clicked-on app. + if (n == this._selectedIndex && this._currentWindow >= 0) + this._select(n, this._currentWindow); + else + this._select(n); + } + + _itemEnteredHandler(n) { + this._select(n); + } + + _windowActivated(thumbnailList, n) { + let appIcon = this._items[this._selectedIndex]; + Main.activateWindow(appIcon.cachedWindows[n]); + this.fadeAndDestroy(); + } + + _windowEntered(thumbnailList, n) { + if (!this.mouseActive) + return; + + this._select(this._selectedIndex, n); + } + + _windowRemoved(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(timestamp) { + let appIcon = this._items[this._selectedIndex]; + if (this._currentWindow < 0) + appIcon.app.activate_window(appIcon.cachedWindows[0], timestamp); + else if (appIcon.cachedWindows[this._currentWindow]) + Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp); + + super._finish(timestamp); + } + + _onDestroy() { + super._onDestroy(); + + if (this._thumbnails) + this._destroyThumbnails(); + if (this._thumbnailTimeoutId != 0) + Mainloop.source_remove(this._thumbnailTimeoutId); + } + + /** + * _select: + * @app: index of the app to select + * @window: (optional) index of which of @app's windows to select + * @forceAppFocus: optional flag, see below + * + * Selects the indicated @app, and optional @window, and sets + * this._thumbnailsFocused appropriately to indicate whether the + * arrow keys should act on the app list or the thumbnail list. + * + * If @app is specified and @window is unspecified or %null, then + * the app is highlighted (ie, given a light background), and the + * current thumbnail list, if any, is destroyed. If @app has + * multiple windows, and @forceAppFocus is not %true, then a + * timeout is started to open a thumbnail list. + * + * If @app and @window are specified (and @forceAppFocus is not), + * then @app will be outlined, a thumbnail list will be created + * and focused (if it hasn't been already), and the @window'th + * window in it will be highlighted. + * + * If @app and @window are specified and @forceAppFocus is %true, + * then @app will be highlighted, and @window outlined, and the + * app list will have the keyboard focus. + */ + _select(app, window, forceAppFocus) { + if (app != this._selectedIndex || window == null) { + if (this._thumbnails) + this._destroyThumbnails(); + } + + if (this._thumbnailTimeoutId != 0) { + Mainloop.source_remove(this._thumbnailTimeoutId); + this._thumbnailTimeoutId = 0; + } + + this._thumbnailsFocused = (window != null) && !forceAppFocus; + + this._selectedIndex = app; + this._currentWindow = window ? window : -1; + this._switcherList.highlight(app, this._thumbnailsFocused); + + if (window != null) { + if (!this._thumbnails) + this._createThumbnails(); + this._currentWindow = window; + this._thumbnails.highlight(window, forceAppFocus); + } else if (this._items[this._selectedIndex].cachedWindows.length > 1 && + !forceAppFocus) { + this._thumbnailTimeoutId = Mainloop.timeout_add ( + THUMBNAIL_POPUP_TIME, + this._timeoutPopupThumbnails.bind(this)); + GLib.Source.set_name_by_id(this._thumbnailTimeoutId, '[gnome-shell] this._timeoutPopupThumbnails'); + } + } + + _timeoutPopupThumbnails() { + if (!this._thumbnails) + this._createThumbnails(); + this._thumbnailTimeoutId = 0; + this._thumbnailsFocused = false; + return GLib.SOURCE_REMOVE; + } + + _destroyThumbnails() { + let thumbnailsActor = this._thumbnails; + Tweener.addTween(thumbnailsActor, + { opacity: 0, + time: THUMBNAIL_FADE_TIME, + transition: 'easeOutQuad', + onComplete: () => { + thumbnailsActor.destroy(); + this.thumbnailsVisible = false; + } + }); + this._thumbnails = null; + if (this._switcherList._items[this._selectedIndex]) + this._switcherList._items[this._selectedIndex].remove_accessible_state (Atk.StateType.EXPANDED); + } + + _createThumbnails() { + this._thumbnails = new ThumbnailList (this._items[this._selectedIndex].cachedWindows); + this._thumbnails.connect('item-activated', this._windowActivated.bind(this)); + this._thumbnails.connect('item-entered', this._windowEntered.bind(this)); + this._thumbnails.connect('item-removed', this._windowRemoved.bind(this)); + this._thumbnails.connect('destroy', () => { + this._thumbnails = null; + this._thumbnailsFocused = false; + }); + + this.add_actor(this._thumbnails); + + // Need to force an allocation so we can figure out whether we + // need to scroll when selecting + this._thumbnails.get_allocation_box(); + + this._thumbnails.opacity = 0; + Tweener.addTween(this._thumbnails, + { opacity: 255, + time: THUMBNAIL_FADE_TIME, + transition: 'easeOutQuad', + onComplete: () => { this.thumbnailsVisible = true; } + }); + + this._switcherList._items[this._selectedIndex].add_accessible_state (Atk.StateType.EXPANDED); + } +}); + +class CyclerHighlight { + constructor() { + this._window = null; + + this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + + this._clone = new Clutter.Clone(); + this.actor.add_actor(this._clone); + + this._highlight = new St.Widget({ style_class: 'cycler-highlight' }); + this.actor.add_actor(this._highlight); + + let coordinate = Clutter.BindCoordinate.ALL; + let constraint = new Clutter.BindConstraint({ coordinate: coordinate }); + this._clone.bind_property('source', constraint, 'source', 0); + + this.actor.add_constraint(constraint); + + this.actor.connect('notify::allocation', + this._onAllocationChanged.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + } + + set window(w) { + if (this._window == w) + return; + + this._window = w; + + if (this._clone.source) + this._clone.source.sync_visibility(); + + let windowActor = this._window ? this._window.get_compositor_private() + : null; + + if (windowActor) + windowActor.hide(); + + this._clone.source = windowActor; + } + + _onAllocationChanged() { + if (!this._window) { + this._highlight.set_size(0, 0); + this._highlight.hide(); + } else { + let [x, y] = this.actor.allocation.get_origin(); + let rect = this._window.get_frame_rect(); + this._highlight.set_size(rect.width, rect.height); + this._highlight.set_position(rect.x - x, rect.y - y); + this._highlight.show(); + } + } + + _onDestroy() { + this.window = null; + } +}; + +// We don't show an actual popup, so just provide what SwitcherPopup +// expects instead of inheriting from SwitcherList +var CyclerList = GObject.registerClass({ + Signals: { 'item-activated': { param_types: [GObject.TYPE_INT] }, + 'item-entered': { param_types: [GObject.TYPE_INT] }, + 'item-removed': { param_types: [GObject.TYPE_INT] }, + 'item-highlighted': { param_types: [GObject.TYPE_INT] } }, +}, class CyclerList extends St.Widget { + highlight(index, justOutline) { + this.emit('item-highlighted', index); + } +}); + +var CyclerPopup = GObject.registerClass( +class CyclerPopup extends SwitcherPopup.SwitcherPopup { + _init() { + if (new.target === CyclerPopup) + throw new TypeError('Cannot instantiate abstract class ' + new.target.name); + + super._init(); + + this._items = this._getWindows(); + + if (this._items.length == 0) + return; + + this._highlight = new CyclerHighlight(); + global.window_group.add_actor(this._highlight.actor); + + this._switcherList = new CyclerList(); + this._switcherList.connect('item-highlighted', (list, index) => { + this._highlightItem(index); + }); + } + + _highlightItem(index, justOutline) { + this._highlight.window = this._items[index]; + global.window_group.set_child_above_sibling(this._highlight.actor, null); + } + + _finish() { + let window = this._items[this._selectedIndex]; + let ws = window.get_workspace(); + let workspaceManager = global.workspace_manager; + let activeWs = workspaceManager.get_active_workspace(); + + if (window.minimized) { + Main.wm.skipNextEffect(window.get_compositor_private()); + window.unminimize(); + } + + if (activeWs == ws) { + Main.activateWindow(window); + } else { + // If the selected window is on a different workspace, we don't + // want it to disappear, then slide in with the workspace; instead, + // always activate it on the active workspace ... + activeWs.activate_with_focus(window, global.get_current_time()); + + // ... then slide it over to the original workspace if necessary + Main.wm.actionMoveWindow(window, ws); + } + + super._finish(); + } + + _onDestroy() { + this._highlight.actor.destroy(); + + super._onDestroy(); + } +}); + + +var GroupCyclerPopup = GObject.registerClass( +class GroupCyclerPopup extends CyclerPopup { + _getWindows() { + let app = Shell.WindowTracker.get_default().focus_app; + return app ? app.get_windows() : []; + } + + _keyPressHandler(keysym, action) { + if (action == Meta.KeyBindingAction.CYCLE_GROUP) + this._select(this._next()); + else if (action == Meta.KeyBindingAction.CYCLE_GROUP_BACKWARD) + this._select(this._previous()); + else + return Clutter.EVENT_PROPAGATE; + + return Clutter.EVENT_STOP; + } +}); + +var WindowSwitcherPopup = GObject.registerClass( +class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup { + _init() { + super._init(); + this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); + + let windows = this._getWindowList(); + + if (windows.length == 0) + return; + + let mode = this._settings.get_enum('app-icon-mode'); + this._switcherList = new WindowList(windows, mode); + this._items = this._switcherList.icons; + } + + _getWindowList() { + let workspace = null; + + if (this._settings.get_boolean('current-workspace-only')) { + let workspaceManager = global.workspace_manager; + + workspace = workspaceManager.get_active_workspace(); + } + + return getWindows(workspace); + } + + _closeWindow(windowIndex) { + let windowIcon = this._items[windowIndex]; + if (!windowIcon) + return; + + windowIcon.window.delete(global.get_current_time()); + } + + _keyPressHandler(keysym, action) { + if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) { + this._select(this._next()); + } else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD) { + this._select(this._previous()); + } else { + if (keysym == Clutter.Left) + 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; + } + + return Clutter.EVENT_STOP; + } + + _finish() { + Main.activateWindow(this._items[this._selectedIndex].window); + + super._finish(); + } +}); + +var WindowCyclerPopup = GObject.registerClass( +class WindowCyclerPopup extends CyclerPopup { + _init() { + this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); + super._init(); + } + + _getWindows() { + let workspace = null; + + if (this._settings.get_boolean('current-workspace-only')) { + let workspaceManager = global.workspace_manager; + + workspace = workspaceManager.get_active_workspace(); + } + + return getWindows(workspace); + } + + _keyPressHandler(keysym, action) { + if (action == Meta.KeyBindingAction.CYCLE_WINDOWS) + this._select(this._next()); + else if (action == Meta.KeyBindingAction.CYCLE_WINDOWS_BACKWARD) + this._select(this._previous()); + else + return Clutter.EVENT_PROPAGATE; + + return Clutter.EVENT_STOP; + } +}); + +var AppIcon = GObject.registerClass( +class AppIcon extends St.BoxLayout { + _init(app) { + super._init({ style_class: 'alt-tab-app', + vertical: true }); + + this.app = app; + this.icon = null; + this._iconBin = new St.Bin({ x_fill: true, y_fill: true }); + + this.add(this._iconBin, { x_fill: false, y_fill: false } ); + this.label = new St.Label({ text: this.app.get_name() }); + this.add(this.label, { x_fill: false }); + } + + set_size(size) { + this.icon = this.app.create_icon_texture(size); + this._iconBin.child = this.icon; + this._iconBin.set_size(size, size); + } + + vfunc_get_preferred_width(forHeight) { + let [minWidth, ] = super.vfunc_get_preferred_width(forHeight); + + minWidth = Math.max(minWidth, forHeight); + return [minWidth, minWidth]; + } +}); + +var AppSwitcher = GObject.registerClass( +class AppSwitcher extends SwitcherPopup.SwitcherList { + _init(apps, altTabPopup) { + super._init(true); + + this.icons = []; + this._arrows = []; + + let windowTracker = Shell.WindowTracker.get_default(); + let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' }); + + let workspace = null; + if (settings.get_boolean('current-workspace-only')) { + let workspaceManager = global.workspace_manager; + + workspace = workspaceManager.get_active_workspace(); + } + + let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); + + // Construct the AppIcons, add to the popup + for (let i = 0; i < apps.length; i++) { + let appIcon = new AppIcon(apps[i]); + // Cache the window list now; we don't handle dynamic changes here, + // and we don't want to be continually retrieving it + appIcon.cachedWindows = allWindows.filter( + w => windowTracker.get_window_app (w) == appIcon.app + ); + if (appIcon.cachedWindows.length > 0) + this._addIcon(appIcon); + } + + this._curApp = -1; + this._altTabPopup = altTabPopup; + this._mouseTimeOutId = 0; + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._mouseTimeOutId != 0) + Mainloop.source_remove(this._mouseTimeOutId); + + this.icons.forEach(icon => { + icon.app.disconnect(icon._stateChangedId); + }); + } + + _setIconSize() { + let j = 0; + while(this._items.length > 1 && this._items[j].style_class != 'item-box') { + j++; + } + let themeNode = this._items[j].get_theme_node(); + + let iconPadding = themeNode.get_horizontal_padding(); + let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT); + let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1); + let iconSpacing = iconNaturalHeight + iconPadding + iconBorder; + let totalSpacing = this._list.spacing * (this._items.length - 1); + + // We just assume the whole screen here due to weirdness happing with the passed width + let primary = Main.layoutManager.primaryMonitor; + let parentPadding = this.get_parent().get_theme_node().get_horizontal_padding(); + let availWidth = primary.width - parentPadding - this.get_theme_node().get_horizontal_padding(); + + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + let iconSizes = baseIconSizes.map(s => s * scaleFactor); + let iconSize = baseIconSizes[0]; + + if (this._items.length > 1) { + for(let i = 0; i < baseIconSizes.length; i++) { + iconSize = baseIconSizes[i]; + let height = iconSizes[i] + iconSpacing; + let w = height * this._items.length + totalSpacing; + if (w <= availWidth) + break; + } + } + + this._iconSize = iconSize; + + for(let i = 0; i < this.icons.length; i++) { + if (this.icons[i].icon != null) + break; + this.icons[i].set_size(iconSize); + } + } + + vfunc_get_preferred_height(forWidth) { + this._setIconSize(); + return super.vfunc_get_preferred_height(forWidth); + } + + vfunc_allocate(box, flags) { + // Allocate the main list items + super.vfunc_allocate(box, flags); + + let contentBox = this.get_theme_node().get_content_box(box); + + let arrowHeight = Math.floor(this.get_theme_node().get_padding(St.Side.BOTTOM) / 3); + let arrowWidth = arrowHeight * 2; + + // Now allocate each arrow underneath its item + let childBox = new Clutter.ActorBox(); + for (let i = 0; i < this._items.length; i++) { + let itemBox = this._items[i].allocation; + childBox.x1 = contentBox.x1 + Math.floor(itemBox.x1 + (itemBox.x2 - itemBox.x1 - arrowWidth) / 2); + childBox.x2 = childBox.x1 + arrowWidth; + childBox.y1 = contentBox.y1 + itemBox.y2 + arrowHeight; + childBox.y2 = childBox.y1 + arrowHeight; + this._arrows[i].allocate(childBox, flags); + } + } + + // We override SwitcherList's _onItemEnter method to delay + // activation when the thumbnail list is open + _onItemEnter(index) { + if (this._mouseTimeOutId != 0) + Mainloop.source_remove(this._mouseTimeOutId); + if (this._altTabPopup.thumbnailsVisible) { + this._mouseTimeOutId = Mainloop.timeout_add(APP_ICON_HOVER_TIMEOUT, + () => { + this._enterItem(index); + this._mouseTimeOutId = 0; + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem'); + } else + this._itemEntered(index); + } + + _enterItem(index) { + let [x, y, mask] = global.get_pointer(); + let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); + if (this._items[index].contains(pickedActor)) + this._itemEntered(index); + } + + // We override SwitcherList's highlight() method to also deal with + // the AppSwitcher->ThumbnailList arrows. Apps with only 1 window + // will hide their arrows by default, but show them when their + // thumbnails are visible (ie, when the app icon is supposed to be + // in justOutline mode). Apps with multiple windows will normally + // show a dim arrow, but show a bright arrow when they are + // highlighted. + highlight(n, justOutline) { + if (this.icons[this._curApp]) { + if (this.icons[this._curApp].cachedWindows.length == 1) + this._arrows[this._curApp].hide(); + else + this._arrows[this._curApp].remove_style_pseudo_class('highlighted'); + } + + super.highlight(n, justOutline); + this._curApp = n; + + if (this._curApp != -1) { + if (justOutline && this.icons[this._curApp].cachedWindows.length == 1) + this._arrows[this._curApp].show(); + else + this._arrows[this._curApp].add_style_pseudo_class('highlighted'); + } + } + + _addIcon(appIcon) { + this.icons.push(appIcon); + let item = this.addItem(appIcon, 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', () => { SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM); }); + this.add_actor(arrow); + this._arrows.push(arrow); + + if (appIcon.cachedWindows.length == 1) + arrow.hide(); + else + item.add_accessible_state (Atk.StateType.EXPANDABLE); + } + + _removeIcon(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 = GObject.registerClass( +class ThumbnailList extends SwitcherPopup.SwitcherList { + _init(windows) { + super._init(false); + + this._labels = new Array(); + this._thumbnailBins = new Array(); + this._clones = new Array(); + this._windows = windows; + + for (let i = 0; i < windows.length; i++) { + let box = new St.BoxLayout({ style_class: 'thumbnail-box', + vertical: true }); + + let bin = new St.Bin({ style_class: 'thumbnail' }); + + box.add_actor(bin); + this._thumbnailBins.push(bin); + + let title = windows[i].get_title(); + if (title) { + let name = new St.Label({ text: title }); + // St.Label doesn't support text-align so use a Bin + let bin = new St.Bin({ x_align: St.Align.MIDDLE }); + this._labels.push(bin); + bin.add_actor(name); + box.add_actor(bin); + + this.addItem(box, name); + } else { + this.addItem(box, null); + } + + } + + this.connect('destroy', this._onDestroy.bind(this)); + } + + addClones(availHeight) { + if (!this._thumbnailBins.length) + return; + let totalPadding = this._items[0].get_theme_node().get_horizontal_padding() + this._items[0].get_theme_node().get_vertical_padding(); + totalPadding += this.get_theme_node().get_horizontal_padding() + this.get_theme_node().get_vertical_padding(); + let [labelMinHeight, labelNaturalHeight] = this._labels[0].get_preferred_height(-1); + let spacing = this._items[0].child.get_theme_node().get_length('spacing'); + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + let thumbnailSize = THUMBNAIL_DEFAULT_SIZE * scaleFactor; + + availHeight = Math.min(availHeight - labelNaturalHeight - totalPadding - spacing, thumbnailSize); + let binHeight = availHeight + this._items[0].get_theme_node().get_vertical_padding() + this.get_theme_node().get_vertical_padding() - spacing; + binHeight = Math.min(thumbnailSize, binHeight); + + for (let i = 0; i < this._thumbnailBins.length; i++) { + let mutterWindow = this._windows[i].get_compositor_private(); + if (!mutterWindow) + continue; + + let clone = _createWindowClone(mutterWindow, thumbnailSize); + this._thumbnailBins[i].set_height(binHeight); + this._thumbnailBins[i].add_actor(clone); + + clone._destroyId = mutterWindow.connect('destroy', source => { + this._removeThumbnail(source, clone); + }); + this._clones.push(clone); + } + + // Make sure we only do this once + this._thumbnailBins = new Array(); + } + + _removeThumbnail(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.destroy(); + } + + _onDestroy() { + this._clones.forEach(clone => { + if (clone.source) + clone.source.disconnect(clone._destroyId); + }); + } +}); + +var WindowIcon = GObject.registerClass( +class WindowIcon extends St.BoxLayout { + _init(window, mode) { + super._init({ style_class: 'alt-tab-app', + vertical: true }); + + this.window = window; + + this._icon = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + + this.add(this._icon, { x_fill: false, y_fill: false } ); + this.label = new St.Label({ text: window.get_title() }); + + let tracker = Shell.WindowTracker.get_default(); + this.app = tracker.get_window_app(window); + + let mutterWindow = this.window.get_compositor_private(); + let size; + + this._icon.destroy_all_children(); + + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + + switch (mode) { + case AppIconMode.THUMBNAIL_ONLY: + size = WINDOW_PREVIEW_SIZE; + this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor)); + break; + + case AppIconMode.BOTH: + size = WINDOW_PREVIEW_SIZE; + this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor)); + + if (this.app) + this._icon.add_actor(this._createAppIcon(this.app, + APP_ICON_SIZE_SMALL)); + break; + + case AppIconMode.APP_ICON_ONLY: + size = APP_ICON_SIZE; + this._icon.add_actor(this._createAppIcon(this.app, size)); + } + + this._icon.set_size(size * scaleFactor, size * scaleFactor); + } + + _createAppIcon(app, size) { + let appIcon = app ? app.create_icon_texture(size) + : new St.Icon({ icon_name: 'icon-missing', + icon_size: size }); + appIcon.x_expand = appIcon.y_expand = true; + appIcon.x_align = appIcon.y_align = Clutter.ActorAlign.END; + + return appIcon; + } +}); + +var WindowList = GObject.registerClass( +class WindowList extends SwitcherPopup.SwitcherList { + _init(windows, mode) { + super._init(true); + + this._label = new St.Label({ x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER }); + this.add_actor(this._label); + + this.windows = windows; + this.icons = []; + + for (let i = 0; i < windows.length; i++) { + let win = windows[i]; + let icon = new WindowIcon(win, mode); + + this.addItem(icon, icon.label); + this.icons.push(icon); + + icon._unmanagedSignalId = icon.window.connect('unmanaged', (window) => { + this._removeWindow(window) + }); + } + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + this.icons.forEach(icon => { + icon.window.disconnect(icon._unmanagedSignalId); + }); + } + + vfunc_get_preferred_height(forWidth) { + let [minHeight, natHeight] = super.vfunc_get_preferred_height(forWidth); + + let spacing = this.get_theme_node().get_padding(St.Side.BOTTOM); + let [labelMin, labelNat] = this._label.get_preferred_height(-1); + + minHeight += labelMin + spacing; + natHeight += labelNat + spacing; + + return [minHeight, natHeight]; + } + + vfunc_allocate(box, flags) { + let themeNode = this.get_theme_node(); + let contentBox = themeNode.get_content_box(box); + + let childBox = new Clutter.ActorBox(); + childBox.x1 = contentBox.x1; + childBox.x2 = contentBox.x2; + childBox.y2 = contentBox.y2; + childBox.y1 = childBox.y2 - this._label.height; + this._label.allocate(childBox, flags); + + let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM) + childBox.x1 = box.x1; + childBox.x2 = box.x2; + childBox.y1 = box.y1; + childBox.y2 = box.y2 - totalLabelHeight; + super.vfunc_allocate(childBox, flags); + + // Hooking up the parent vfunc will call this.set_allocation() with + // the height without the label height, so call it again with the + // correct size here. + this.set_allocation(box, flags); + } + + highlight(index, justOutline) { + super.highlight(index, justOutline); + + this._label.set_text(index == -1 ? '' : this.icons[index].label.text); + } + + _removeWindow(window) { + let index = this.icons.findIndex(icon => { + return icon.window == window; + }); + if (index === -1) + return; + + this.icons.splice(index, 1); + this.removeItem(index); + } +}); diff --git a/js/ui/animation.js b/js/ui/animation.js new file mode 100644 index 0000000..c21b225 --- /dev/null +++ b/js/ui/animation.js @@ -0,0 +1,173 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { GLib, Gio, St } = imports.gi; +const Mainloop = imports.mainloop; + +const Tweener = imports.ui.tweener; + +var ANIMATED_ICON_UPDATE_TIMEOUT = 16; +var SPINNER_ANIMATION_TIME = 0.3; +var SPINNER_ANIMATION_DELAY = 1.0; + +var Animation = class { + constructor(file, width, height, speed) { + this.actor = new St.Bin(); + this.actor.set_size(width, height); + this.actor.connect('destroy', this._onDestroy.bind(this)); + this.actor.connect('notify::size', this._syncAnimationSize.bind(this)); + this.actor.connect('resource-scale-changed', + this._loadFile.bind(this, file, width, height)); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + this._scaleChangedId = themeContext.connect('notify::scale-factor', + this._loadFile.bind(this, file, width, height)); + + this._speed = speed; + + this._isLoaded = false; + this._isPlaying = false; + this._timeoutId = 0; + this._frame = 0; + + this._loadFile(file, width, height); + } + + play() { + if (this._isLoaded && this._timeoutId == 0) { + if (this._frame == 0) + this._showFrame(0); + + this._timeoutId = GLib.timeout_add(GLib.PRIORITY_LOW, this._speed, this._update.bind(this)); + GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update'); + } + + this._isPlaying = true; + } + + stop() { + if (this._timeoutId > 0) { + Mainloop.source_remove(this._timeoutId); + this._timeoutId = 0; + } + + this._isPlaying = false; + } + + _loadFile(file, width, height) { + let [validResourceScale, resourceScale] = this.actor.get_resource_scale(); + + this._isLoaded = false; + this.actor.destroy_all_children(); + + if (!validResourceScale) + return; + + let texture_cache = St.TextureCache.get_default(); + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + this._animations = texture_cache.load_sliced_image(file, width, height, + scaleFactor, resourceScale, + this._animationsLoaded.bind(this)); + this.actor.set_child(this._animations); + } + + _showFrame(frame) { + let oldFrameActor = this._animations.get_child_at_index(this._frame); + if (oldFrameActor) + oldFrameActor.hide(); + + this._frame = (frame % this._animations.get_n_children()); + + let newFrameActor = this._animations.get_child_at_index(this._frame); + if (newFrameActor) + newFrameActor.show(); + } + + _update() { + this._showFrame(this._frame + 1); + return GLib.SOURCE_CONTINUE; + } + + _syncAnimationSize() { + if (!this._isLoaded) + return; + + let [width, height] = this.actor.get_size(); + + for (let i = 0; i < this._animations.get_n_children(); ++i) + this._animations.get_child_at_index(i).set_size(width, height); + } + + _animationsLoaded() { + this._isLoaded = this._animations.get_n_children() > 0; + + this._syncAnimationSize(); + + if (this._isPlaying) + this.play(); + } + + _onDestroy() { + this.stop(); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + if (this._scaleChangedId) + themeContext.disconnect(this._scaleChangedId); + this._scaleChangedId = 0; + } +}; + +var AnimatedIcon = class extends Animation { + constructor(file, size) { + super(file, size, size, ANIMATED_ICON_UPDATE_TIMEOUT); + } +}; + +var Spinner = class extends AnimatedIcon { + constructor(size, animate=false) { + let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); + super(file, size); + + this.actor.opacity = 0; + this._animate = animate; + } + + _onDestroy() { + this._animate = false; + super._onDestroy(); + } + + play() { + Tweener.removeTweens(this.actor); + + if (this._animate) { + super.play(); + Tweener.addTween(this.actor, { + opacity: 255, + delay: SPINNER_ANIMATION_DELAY, + time: SPINNER_ANIMATION_TIME, + transition: 'linear' + }); + } else { + this.actor.opacity = 255; + super.play(); + } + } + + stop() { + Tweener.removeTweens(this.actor); + + if (this._animate) { + Tweener.addTween(this.actor, { + opacity: 0, + time: SPINNER_ANIMATION_TIME, + transition: 'linear', + onComplete: () => { + this.stop(false); + } + }); + } else { + this.actor.opacity = 0; + super.stop(); + } + } +}; diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js new file mode 100644 index 0000000..adaefa7 --- /dev/null +++ b/js/ui/appDisplay.js @@ -0,0 +1,1837 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; +const Mainloop = imports.mainloop; + +const AppFavorites = imports.ui.appFavorites; +const BoxPointer = imports.ui.boxpointer; +const DND = imports.ui.dnd; +const GrabHelper = imports.ui.grabHelper; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PageIndicators = imports.ui.pageIndicators; +const PopupMenu = imports.ui.popupMenu; +const Tweener = imports.ui.tweener; +const Search = imports.ui.search; +const Params = imports.misc.params; +const Util = imports.misc.util; +const SystemActions = imports.misc.systemActions; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +var MAX_APPLICATION_WORK_MILLIS = 75; +var MENU_POPUP_TIMEOUT = 600; +var MAX_COLUMNS = 6; +var MIN_COLUMNS = 4; +var MIN_ROWS = 4; + +var INACTIVE_GRID_OPACITY = 77; +// This time needs to be less than IconGrid.EXTRA_SPACE_ANIMATION_TIME +// to not clash with other animations +var INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.24; +var FOLDER_SUBICON_FRACTION = .4; + +var MIN_FREQUENT_APPS_COUNT = 3; + +var INDICATORS_BASE_TIME = 0.25; +var INDICATORS_ANIMATION_DELAY = 0.125; +var INDICATORS_ANIMATION_MAX_TIME = 0.75; + +var VIEWS_SWITCH_TIME = 0.4; +var VIEWS_SWITCH_ANIMATION_DELAY = 0.1; + +// Follow iconGrid animations approach and divide by 2 to animate out to +// not annoy the user when the user wants to quit appDisplay. +// Also, make sure we don't exceed iconGrid animation total time or +// views switch time. +var INDICATORS_BASE_TIME_OUT = 0.125; +var INDICATORS_ANIMATION_DELAY_OUT = 0.0625; +var INDICATORS_ANIMATION_MAX_TIME_OUT = + Math.min (VIEWS_SWITCH_TIME, + IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM); + +var PAGE_SWITCH_TIME = 0.3; + +const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl'; +const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl'; + +const SwitcherooProxyInterface = loadInterfaceXML('net.hadess.SwitcherooControl'); +const SwitcherooProxy = Gio.DBusProxy.makeProxyWrapper(SwitcherooProxyInterface); +let discreteGpuAvailable = false; + +function _getCategories(info) { + let categoriesStr = info.get_categories(); + if (!categoriesStr) + return []; + return categoriesStr.split(';'); +} + +function _listsIntersect(a, b) { + for (let itemA of a) + if (b.indexOf(itemA) >= 0) + return true; + return false; +} + +function _getFolderName(folder) { + let name = folder.get_string('name'); + + if (folder.get_boolean('translate')) { + let keyfile = new GLib.KeyFile(); + let path = 'desktop-directories/' + name; + + try { + keyfile.load_from_data_dirs(path, GLib.KeyFileFlags.NONE); + name = keyfile.get_locale_string('Desktop Entry', 'Name', null); + } catch(e) { + return name; + } + } + + return name; +} + +function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} + +class BaseAppView { + constructor(params, gridParams) { + if (new.target === BaseAppView) + throw new TypeError('Cannot instantiate abstract class ' + new.target.name); + + gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE, + columnLimit: MAX_COLUMNS, + minRows: MIN_ROWS, + minColumns: MIN_COLUMNS, + fillParent: false, + padWithSpacing: true }); + params = Params.parse(params, { usePagination: false }); + + if(params.usePagination) + this._grid = new IconGrid.PaginatedIconGrid(gridParams); + else + this._grid = new IconGrid.IconGrid(gridParams); + + this._grid.connect('child-focused', (grid, actor) => { + this._childFocused(actor); + }); + // Standard hack for ClutterBinLayout + this._grid.x_expand = true; + + this._items = {}; + this._allItems = []; + } + + _childFocused(actor) { + // Nothing by default + } + + removeAll() { + this._grid.destroyAll(); + this._items = {}; + this._allItems = []; + } + + _redisplay() { + this.removeAll(); + this._loadApps(); + } + + getAllItems() { + return this._allItems; + } + + addItem(icon) { + let id = icon.id; + if (this._items[id] !== undefined) + return; + + this._allItems.push(icon); + this._items[id] = icon; + } + + _compareItems(a, b) { + return a.name.localeCompare(b.name); + } + + loadGrid() { + this._allItems.sort(this._compareItems); + this._allItems.forEach(item => { this._grid.addItem(item); }); + this.emit('view-loaded'); + } + + _selectAppInternal(id) { + if (this._items[id]) + this._items[id].actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + else + log('No such application ' + id); + } + + selectApp(id) { + if (this._items[id] && this._items[id].actor.mapped) { + this._selectAppInternal(id); + } else if (this._items[id]) { + // Need to wait until the view is mapped + let signalId = this._items[id].actor.connect('notify::mapped', + actor => { + if (actor.mapped) { + actor.disconnect(signalId); + this._selectAppInternal(id); + } + }); + } else { + // Need to wait until the view is built + let signalId = this.connect('view-loaded', () => { + this.disconnect(signalId); + this.selectApp(id); + }); + } + } + + _doSpringAnimation(animationDirection) { + this._grid.opacity = 255; + this._grid.animateSpring(animationDirection, + Main.overview.getShowAppsButton()); + } + + animate(animationDirection, onComplete) { + if (onComplete) { + let animationDoneId = this._grid.connect('animation-done', () => { + this._grid.disconnect(animationDoneId); + onComplete(); + }); + } + + if (animationDirection == IconGrid.AnimationDirection.IN) { + let id = this._grid.connect('paint', () => { + this._grid.disconnect(id); + this._doSpringAnimation(animationDirection); + }); + } else { + this._doSpringAnimation(animationDirection); + } + } + + animateSwitch(animationDirection) { + Tweener.removeTweens(this.actor); + Tweener.removeTweens(this._grid); + + let params = { time: VIEWS_SWITCH_TIME, + transition: 'easeOutQuad' }; + if (animationDirection == IconGrid.AnimationDirection.IN) { + this.actor.show(); + params.opacity = 255; + params.delay = VIEWS_SWITCH_ANIMATION_DELAY; + } else { + params.opacity = 0; + params.delay = 0; + params.onComplete = () => { this.actor.hide(); }; + } + + Tweener.addTween(this._grid, params); + } +}; +Signals.addSignalMethods(BaseAppView.prototype); + +var AllView = class AllView extends BaseAppView { + constructor() { + super({ usePagination: true }, null); + this._scrollView = new St.ScrollView({ style_class: 'all-apps', + x_expand: true, + y_expand: true, + x_fill: true, + y_fill: false, + reactive: true, + y_align: St.Align.START }); + this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(), + x_expand:true, y_expand:true }); + this.actor.add_actor(this._scrollView); + + this._scrollView.set_policy(St.PolicyType.NEVER, + St.PolicyType.EXTERNAL); + this._adjustment = this._scrollView.vscroll.adjustment; + + this._pageIndicators = new PageIndicators.AnimatedPageIndicators(); + this._pageIndicators.connect('page-activated', + (indicators, pageIndex) => { + this.goToPage(pageIndex); + }); + this._pageIndicators.connect('scroll-event', this._onScroll.bind(this)); + this.actor.add_actor(this._pageIndicators); + + this.folderIcons = []; + + this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + let box = new St.BoxLayout({ vertical: true }); + + this._grid.currentPage = 0; + this._stack.add_actor(this._grid); + this._eventBlocker = new St.Widget({ x_expand: true, y_expand: true }); + this._stack.add_actor(this._eventBlocker); + + box.add_actor(this._stack); + this._scrollView.add_actor(box); + + this._scrollView.connect('scroll-event', this._onScroll.bind(this)); + + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', this._onPan.bind(this)); + panAction.connect('gesture-cancel', this._onPanEnd.bind(this)); + panAction.connect('gesture-end', this._onPanEnd.bind(this)); + this._panAction = panAction; + this._scrollView.add_action(panAction); + this._panning = false; + this._clickAction = new Clutter.ClickAction(); + this._clickAction.connect('clicked', () => { + if (!this._currentPopup) + return; + + let [x, y] = this._clickAction.get_coords(); + let actor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); + if (!this._currentPopup.actor.contains(actor)) + this._currentPopup.popdown(); + }); + this._eventBlocker.add_action(this._clickAction); + + this._displayingPopup = false; + + this._availWidth = 0; + this._availHeight = 0; + + Main.overview.connect('hidden', () => { this.goToPage(0); }); + this._grid.connect('space-opened', () => { + let fadeEffect = this._scrollView.get_effect('fade'); + if (fadeEffect) + fadeEffect.enabled = false; + + this.emit('space-ready'); + }); + this._grid.connect('space-closed', () => { + this._displayingPopup = false; + }); + + this.actor.connect('notify::mapped', () => { + if (this.actor.mapped) { + this._keyPressEventId = + global.stage.connect('key-press-event', + this._onKeyPressEvent.bind(this)); + } else { + if (this._keyPressEventId) + global.stage.disconnect(this._keyPressEventId); + this._keyPressEventId = 0; + } + }); + + this._redisplayWorkId = Main.initializeDeferredWork(this.actor, this._redisplay.bind(this)); + + Shell.AppSystem.get_default().connect('installed-changed', () => { + Main.queueDeferredWork(this._redisplayWorkId); + }); + this._folderSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' }); + this._folderSettings.connect('changed::folder-children', () => { + Main.queueDeferredWork(this._redisplayWorkId); + }); + } + + removeAll() { + this.folderIcons = []; + super.removeAll(); + } + + _itemNameChanged(item) { + // If an item's name changed, we can pluck it out of where it's + // supposed to be and reinsert it where it's sorted. + let oldIdx = this._allItems.indexOf(item); + this._allItems.splice(oldIdx, 1); + let newIdx = Util.insertSorted(this._allItems, item, this._compareItems); + + this._grid.removeItem(item); + this._grid.addItem(item, newIdx); + } + + _refilterApps() { + this._allItems.forEach(icon => { + if (icon instanceof AppIcon) + icon.actor.visible = true; + }); + + this.folderIcons.forEach(folder => { + let folderApps = folder.getAppIds(); + folderApps.forEach(appId => { + let appIcon = this._items[appId]; + appIcon.actor.visible = false; + }); + }); + } + + getAppInfos() { + return this._appInfoList; + } + + _loadApps() { + this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => { + try { + let id = appInfo.get_id(); // catch invalid file encodings + } catch(e) { + return false; + } + return appInfo.should_show(); + }); + + let apps = this._appInfoList.map(app => app.get_id()); + + let appSys = Shell.AppSystem.get_default(); + + let folders = this._folderSettings.get_strv('folder-children'); + folders.forEach(id => { + let path = this._folderSettings.path + 'folders/' + id + '/'; + let icon = new FolderIcon(id, path, this); + icon.connect('name-changed', this._itemNameChanged.bind(this)); + icon.connect('apps-changed', this._refilterApps.bind(this)); + this.addItem(icon); + this.folderIcons.push(icon); + }); + + // Allow dragging of the icon only if the Dash would accept a drop to + // change favorite-apps. There are no other possible drop targets from + // the app picker, so there's no other need for a drag to start, + // at least on single-monitor setups. + // This also disables drag-to-launch on multi-monitor setups, + // but we hope that is not used much. + let favoritesWritable = global.settings.is_writable('favorite-apps'); + + apps.forEach(appId => { + let app = appSys.lookup_app(appId); + + let icon = new AppIcon(app, + { isDraggable: favoritesWritable }); + this.addItem(icon); + }); + + this.loadGrid(); + this._refilterApps(); + } + + // Overriden from BaseAppView + animate(animationDirection, onComplete) { + this._scrollView.reactive = false; + let completionFunc = () => { + this._scrollView.reactive = true; + if (onComplete) + onComplete(); + }; + + if (animationDirection == IconGrid.AnimationDirection.OUT && + this._displayingPopup && this._currentPopup) { + this._currentPopup.popdown(); + let spaceClosedId = this._grid.connect('space-closed', () => { + this._grid.disconnect(spaceClosedId); + super.animate(animationDirection, completionFunc); + }); + } else { + super.animate(animationDirection, completionFunc); + if (animationDirection == IconGrid.AnimationDirection.OUT) + this._pageIndicators.animateIndicators(animationDirection); + } + } + + animateSwitch(animationDirection) { + super.animateSwitch(animationDirection); + + if (this._currentPopup && this._displayingPopup && + animationDirection == IconGrid.AnimationDirection.OUT) + Tweener.addTween(this._currentPopup.actor, + { time: VIEWS_SWITCH_TIME, + transition: 'easeOutQuad', + opacity: 0, + onComplete() { + this.opacity = 255; + } }); + + if (animationDirection == IconGrid.AnimationDirection.OUT) + this._pageIndicators.animateIndicators(animationDirection); + } + + getCurrentPageY() { + return this._grid.getPageY(this._grid.currentPage); + } + + goToPage(pageNumber) { + pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1); + + if (this._grid.currentPage == pageNumber && this._displayingPopup && this._currentPopup) + return; + if (this._displayingPopup && this._currentPopup) + this._currentPopup.popdown(); + + let velocity; + if (!this._panning) + velocity = 0; + else + velocity = Math.abs(this._panAction.get_velocity(0)[2]); + // Tween the change between pages. + // If velocity is not specified (i.e. scrolling with mouse wheel), + // use the same speed regardless of original position + // if velocity is specified, it's in pixels per milliseconds + let diffToPage = this._diffToPage(pageNumber); + let childBox = this._scrollView.get_allocation_box(); + let totalHeight = childBox.y2 - childBox.y1; + let time; + // Only take the velocity into account on page changes, otherwise + // return smoothly to the current page using the default velocity + if (this._grid.currentPage != pageNumber) { + let minVelocity = totalHeight / (PAGE_SWITCH_TIME * 1000); + velocity = Math.max(minVelocity, velocity); + time = (diffToPage / velocity) / 1000; + } else { + time = PAGE_SWITCH_TIME * diffToPage / totalHeight; + } + // When changing more than one page, make sure to not take + // longer than PAGE_SWITCH_TIME + time = Math.min(time, PAGE_SWITCH_TIME); + + this._grid.currentPage = pageNumber; + Tweener.addTween(this._adjustment, + { value: this._grid.getPageY(this._grid.currentPage), + time: time, + transition: 'easeOutQuad' }); + this._pageIndicators.setCurrentPage(pageNumber); + } + + _diffToPage(pageNumber) { + let currentScrollPosition = this._adjustment.value; + return Math.abs(currentScrollPosition - this._grid.getPageY(pageNumber)); + } + + openSpaceForPopup(item, side, nRows) { + this._updateIconOpacities(true); + this._displayingPopup = true; + this._grid.openExtraSpace(item, side, nRows); + } + + _closeSpaceForPopup() { + this._updateIconOpacities(false); + + let fadeEffect = this._scrollView.get_effect('fade'); + if (fadeEffect) + fadeEffect.enabled = true; + + this._grid.closeExtraSpace(); + } + + _onScroll(actor, event) { + if (this._displayingPopup || !this._scrollView.reactive) + return Clutter.EVENT_STOP; + + let direction = event.get_scroll_direction(); + if (direction == Clutter.ScrollDirection.UP) + this.goToPage(this._grid.currentPage - 1); + else if (direction == Clutter.ScrollDirection.DOWN) + this.goToPage(this._grid.currentPage + 1); + + return Clutter.EVENT_STOP; + } + + _onPan(action) { + if (this._displayingPopup) + return false; + this._panning = true; + this._clickAction.release(); + let [dist, dx, dy] = action.get_motion_delta(0); + let adjustment = this._adjustment; + adjustment.value -= (dy / this._scrollView.height) * adjustment.page_size; + return false; + } + + _onPanEnd(action) { + if (this._displayingPopup) + return; + + let pageHeight = this._grid.getPageHeight(); + + // Calculate the scroll value we'd be at, which is our current + // scroll plus any velocity the user had when they released + // their finger. + + let velocity = -action.get_velocity(0)[2]; + let endPanValue = this._adjustment.value + velocity; + + let closestPage = Math.round(endPanValue / pageHeight); + this.goToPage(closestPage); + + this._panning = false; + } + + _onKeyPressEvent(actor, event) { + if (this._displayingPopup) + return Clutter.EVENT_STOP; + + if (event.get_key_symbol() == Clutter.Page_Up) { + this.goToPage(this._grid.currentPage - 1); + return Clutter.EVENT_STOP; + } else if (event.get_key_symbol() == Clutter.Page_Down) { + this.goToPage(this._grid.currentPage + 1); + return Clutter.EVENT_STOP; + } + + return Clutter.EVENT_PROPAGATE; + } + + addFolderPopup(popup) { + this._stack.add_actor(popup.actor); + popup.connect('open-state-changed', (popup, isOpen) => { + this._eventBlocker.reactive = isOpen; + this._currentPopup = isOpen ? popup : null; + this._updateIconOpacities(isOpen); + if(!isOpen) + this._closeSpaceForPopup(); + }); + } + + _childFocused(icon) { + let itemPage = this._grid.getItemPage(icon); + this.goToPage(itemPage); + } + + _updateIconOpacities(folderOpen) { + for (let id in this._items) { + let params, opacity; + if (folderOpen && !this._items[id].actor.checked) + opacity = INACTIVE_GRID_OPACITY; + else + opacity = 255; + params = { opacity: opacity, + time: INACTIVE_GRID_OPACITY_ANIMATION_TIME, + transition: 'easeOutQuad' }; + Tweener.addTween(this._items[id].actor, params); + } + } + + // Called before allocation to calculate dynamic spacing + adaptToSize(width, height) { + let box = new Clutter.ActorBox(); + box.x1 = 0; + box.x2 = width; + box.y1 = 0; + box.y2 = height; + box = this.actor.get_theme_node().get_content_box(box); + box = this._scrollView.get_theme_node().get_content_box(box); + box = this._grid.get_theme_node().get_content_box(box); + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let oldNPages = this._grid.nPages(); + + this._grid.adaptToSize(availWidth, availHeight); + + let fadeOffset = Math.min(this._grid.topPadding, + this._grid.bottomPadding); + this._scrollView.update_fade_effect(fadeOffset, 0); + if (fadeOffset > 0) + this._scrollView.get_effect('fade').fade_edges = true; + + if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) { + this._adjustment.value = 0; + this._grid.currentPage = 0; + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._pageIndicators.setNPages(this._grid.nPages()); + this._pageIndicators.setCurrentPage(0); + }); + } + + this._availWidth = availWidth; + this._availHeight = availHeight; + // Update folder views + for (let i = 0; i < this.folderIcons.length; i++) + this.folderIcons[i].adaptToSize(availWidth, availHeight); + } +}; +Signals.addSignalMethods(AllView.prototype); + +var FrequentView = class FrequentView extends BaseAppView { + constructor() { + super(null, { fillParent: true }); + + this.actor = new St.Widget({ style_class: 'frequent-apps', + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true }); + + this._noFrequentAppsLabel = new St.Label({ text: _("Frequently used applications will appear here"), + style_class: 'no-frequent-applications-label', + x_align: Clutter.ActorAlign.CENTER, + x_expand: true, + y_align: Clutter.ActorAlign.CENTER, + y_expand: true }); + + this._grid.y_expand = true; + + this.actor.add_actor(this._grid); + this.actor.add_actor(this._noFrequentAppsLabel); + this._noFrequentAppsLabel.hide(); + + this._usage = Shell.AppUsage.get_default(); + + this.actor.connect('notify::mapped', () => { + if (this.actor.mapped) + this._redisplay(); + }); + } + + hasUsefulData() { + return this._usage.get_most_used().length >= MIN_FREQUENT_APPS_COUNT; + } + + _loadApps() { + let mostUsed = this._usage.get_most_used(); + let hasUsefulData = this.hasUsefulData(); + this._noFrequentAppsLabel.visible = !hasUsefulData; + if(!hasUsefulData) + return; + + // Allow dragging of the icon only if the Dash would accept a drop to + // change favorite-apps. There are no other possible drop targets from + // the app picker, so there's no other need for a drag to start, + // at least on single-monitor setups. + // This also disables drag-to-launch on multi-monitor setups, + // but we hope that is not used much. + let favoritesWritable = global.settings.is_writable('favorite-apps'); + + for (let i = 0; i < mostUsed.length; i++) { + if (!mostUsed[i].get_app_info().should_show()) + continue; + let appIcon = new AppIcon(mostUsed[i], + { isDraggable: favoritesWritable }); + this._grid.addItem(appIcon, -1); + } + } + + // Called before allocation to calculate dynamic spacing + adaptToSize(width, height) { + let box = new Clutter.ActorBox(); + box.x1 = box.y1 = 0; + box.x2 = width; + box.y2 = height; + box = this.actor.get_theme_node().get_content_box(box); + box = this._grid.get_theme_node().get_content_box(box); + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + this._grid.adaptToSize(availWidth, availHeight); + } +}; + +var Views = { + FREQUENT: 0, + ALL: 1 +}; + +var ControlsBoxLayout = GObject.registerClass( +class ControlsBoxLayout extends Clutter.BoxLayout { + /** + * Override the BoxLayout behavior to use the maximum preferred width of all + * buttons for each child + */ + vfunc_get_preferred_width(container, forHeight) { + let maxMinWidth = 0; + let maxNaturalWidth = 0; + for (let child = container.get_first_child(); + child; + child = child.get_next_sibling()) { + let [minWidth, natWidth] = child.get_preferred_width(forHeight); + maxMinWidth = Math.max(maxMinWidth, minWidth); + maxNaturalWidth = Math.max(maxNaturalWidth, natWidth); + } + let childrenCount = container.get_n_children(); + let totalSpacing = this.spacing * (childrenCount - 1); + return [maxMinWidth * childrenCount + totalSpacing, + maxNaturalWidth * childrenCount + totalSpacing]; + } +}); + +var ViewStackLayout = GObject.registerClass({ + Signals: { 'allocated-size-changed': { param_types: [GObject.TYPE_INT, + GObject.TYPE_INT] } }, +}, class ViewStackLayout extends Clutter.BinLayout { + vfunc_allocate(actor, box, flags) { + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + // Prepare children of all views for the upcoming allocation, calculate all + // the needed values to adapt available size + this.emit('allocated-size-changed', availWidth, availHeight); + super.vfunc_allocate(actor, box, flags); + } +}); + +var AppDisplay = class AppDisplay { + constructor() { + this._privacySettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.privacy' }); + this._privacySettings.connect('changed::remember-app-usage', + this._updateFrequentVisibility.bind(this)); + + this._views = []; + + let view, button; + view = new FrequentView(); + button = new St.Button({ label: _("Frequent"), + style_class: 'app-view-control button', + can_focus: true, + x_expand: true }); + this._views[Views.FREQUENT] = { 'view': view, 'control': button }; + + view = new AllView(); + button = new St.Button({ label: _("All"), + style_class: 'app-view-control button', + can_focus: true, + x_expand: true }); + this._views[Views.ALL] = { 'view': view, 'control': button }; + + this.actor = new St.BoxLayout ({ style_class: 'app-display', + x_expand: true, y_expand: true, + vertical: true }); + this._viewStackLayout = new ViewStackLayout(); + this._viewStack = new St.Widget({ x_expand: true, y_expand: true, + layout_manager: this._viewStackLayout }); + this._viewStackLayout.connect('allocated-size-changed', this._onAllocatedSizeChanged.bind(this)); + this.actor.add_actor(this._viewStack); + let layout = new ControlsBoxLayout({ homogeneous: true }); + this._controls = new St.Widget({ style_class: 'app-view-controls', + layout_manager: layout }); + this._controls.connect('notify::mapped', () => { + // controls are faded either with their parent or + // explicitly in animate(); we can't know how they'll be + // shown next, so make sure to restore their opacity + // when they are hidden + if (this._controls.mapped) + return; + + Tweener.removeTweens(this._controls); + this._controls.opacity = 255; + }); + + layout.hookup_style(this._controls); + this.actor.add_actor(new St.Bin({ child: this._controls })); + + for (let i = 0; i < this._views.length; i++) { + this._viewStack.add_actor(this._views[i].view.actor); + this._controls.add_actor(this._views[i].control); + + let viewIndex = i; + this._views[i].control.connect('clicked', actor => { + this._showView(viewIndex); + global.settings.set_uint('app-picker-view', viewIndex); + }); + } + let initialView = Math.min(global.settings.get_uint('app-picker-view'), + this._views.length - 1); + let frequentUseful = this._views[Views.FREQUENT].view.hasUsefulData(); + if (initialView == Views.FREQUENT && !frequentUseful) + initialView = Views.ALL; + this._showView(initialView); + this._updateFrequentVisibility(); + + Gio.DBus.system.watch_name(SWITCHEROO_BUS_NAME, + Gio.BusNameWatcherFlags.NONE, + this._switcherooProxyAppeared.bind(this), + () => { + this._switcherooProxy = null; + this._updateDiscreteGpuAvailable(); + }); + } + + _updateDiscreteGpuAvailable() { + if (!this._switcherooProxy) + discreteGpuAvailable = false; + else + discreteGpuAvailable = this._switcherooProxy.HasDualGpu; + } + + _switcherooProxyAppeared() { + this._switcherooProxy = new SwitcherooProxy(Gio.DBus.system, SWITCHEROO_BUS_NAME, SWITCHEROO_OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + this._updateDiscreteGpuAvailable(); + }); + } + + animate(animationDirection, onComplete) { + let currentView = this._views.filter(v => v.control.has_style_pseudo_class('checked')).pop().view; + + // Animate controls opacity using iconGrid animation time, since + // it will be the time the AllView or FrequentView takes to show + // it entirely. + let finalOpacity; + if (animationDirection == IconGrid.AnimationDirection.IN) { + this._controls.opacity = 0; + finalOpacity = 255; + } else { + finalOpacity = 0 + } + + Tweener.addTween(this._controls, + { time: IconGrid.ANIMATION_TIME_IN, + transition: 'easeInOutQuad', + opacity: finalOpacity, + }); + + currentView.animate(animationDirection, onComplete); + } + + _showView(activeIndex) { + for (let i = 0; i < this._views.length; i++) { + if (i == activeIndex) + this._views[i].control.add_style_pseudo_class('checked'); + else + this._views[i].control.remove_style_pseudo_class('checked'); + + let animationDirection = i == activeIndex ? IconGrid.AnimationDirection.IN : + IconGrid.AnimationDirection.OUT; + this._views[i].view.animateSwitch(animationDirection); + } + } + + _updateFrequentVisibility() { + let enabled = this._privacySettings.get_boolean('remember-app-usage'); + this._views[Views.FREQUENT].control.visible = enabled; + + let visibleViews = this._views.filter(v => v.control.visible); + this._controls.visible = visibleViews.length > 1; + + if (!enabled && this._views[Views.FREQUENT].view.actor.visible) + this._showView(Views.ALL); + } + + selectApp(id) { + this._showView(Views.ALL); + this._views[Views.ALL].view.selectApp(id); + } + + _onAllocatedSizeChanged(actor, width, height) { + let box = new Clutter.ActorBox(); + box.x1 = box.y1 =0; + box.x2 = width; + box.y2 = height; + box = this._viewStack.get_theme_node().get_content_box(box); + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + for (let i = 0; i < this._views.length; i++) + this._views[i].view.adaptToSize(availWidth, availHeight); + } +}; + +var AppSearchProvider = class AppSearchProvider { + constructor() { + this._appSys = Shell.AppSystem.get_default(); + this.id = 'applications'; + this.isRemoteProvider = false; + this.canLaunchSearch = false; + + this._systemActions = new SystemActions.getDefault(); + } + + getResultMetas(apps, callback) { + let metas = []; + for (let id of apps) { + if (id.endsWith('.desktop')) { + let app = this._appSys.lookup_app(id); + + metas.push({ 'id': app.get_id(), + 'name': app.get_name(), + 'createIcon'(size) { + return app.create_icon_texture(size); + } + }); + } else { + let name = this._systemActions.getName(id); + let iconName = this._systemActions.getIconName(id); + + let createIcon = size => new St.Icon({ icon_name: iconName, + width: size, + height: size, + style_class: 'system-action-icon' }); + + metas.push({ id, name, createIcon }); + } + } + + callback(metas); + } + + filterResults(results, maxNumber) { + return results.slice(0, maxNumber); + } + + getInitialResultSet(terms, callback, cancellable) { + let query = terms.join(' '); + let groups = Shell.AppSystem.search(query); + let usage = Shell.AppUsage.get_default(); + let results = []; + groups.forEach(group => { + group = group.filter(appID => { + let app = Gio.DesktopAppInfo.new(appID); + return app && app.should_show(); + }); + results = results.concat(group.sort( + (a, b) => usage.compare(a, b) + )); + }); + + results = results.concat(this._systemActions.getMatchingActions(terms)); + + callback(results); + } + + getSubsearchResultSet(previousResults, terms, callback, cancellable) { + this.getInitialResultSet(terms, callback, cancellable); + } + + createResultObject(resultMeta) { + if (resultMeta.id.endsWith('.desktop')) + return new AppIcon(this._appSys.lookup_app(resultMeta['id'])); + else + return new SystemActionIcon(this, resultMeta); + } +}; + +var FolderView = class FolderView extends BaseAppView { + constructor() { + super(null, null); + // If it not expand, the parent doesn't take into account its preferred_width when allocating + // the second time it allocates, so we apply the "Standard hack for ClutterBinLayout" + this._grid.x_expand = true; + + this.actor = new St.ScrollView({ overlay_scrollbars: true }); + this.actor.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + let scrollableContainer = new St.BoxLayout({ vertical: true, reactive: true }); + scrollableContainer.add_actor(this._grid); + this.actor.add_actor(scrollableContainer); + + let action = new Clutter.PanAction({ interpolate: true }); + action.connect('pan', this._onPan.bind(this)); + this.actor.add_action(action); + } + + _childFocused(actor) { + Util.ensureActorVisibleInScrollView(this.actor, actor); + } + + // Overriden from BaseAppView + animate(animationDirection) { + this._grid.animatePulse(animationDirection); + } + + createFolderIcon(size) { + let layout = new Clutter.GridLayout(); + let icon = new St.Widget({ layout_manager: layout, + style_class: 'app-folder-icon' }); + layout.hookup_style(icon); + let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size); + let scale = St.ThemeContext.get_for_stage(global.stage).scale_factor; + + let numItems = this._allItems.length; + let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL; + for (let i = 0; i < 4; i++) { + let bin = new St.Bin({ width: subSize * scale, height: subSize * scale }); + if (i < numItems) + bin.child = this._allItems[i].app.create_icon_texture(subSize); + layout.attach(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2), 1, 1); + } + + return icon; + } + + _onPan(action) { + let [dist, dx, dy] = action.get_motion_delta(0); + let adjustment = this.actor.vscroll.adjustment; + adjustment.value -= (dy / this.actor.height) * adjustment.page_size; + return false; + } + + adaptToSize(width, height) { + this._parentAvailableWidth = width; + this._parentAvailableHeight = height; + + this._grid.adaptToSize(width, height); + + // To avoid the fade effect being applied to the unscrolled grid, + // the offset would need to be applied after adjusting the padding; + // however the final padding is expected to be too small for the + // effect to look good, so use the unadjusted padding + let fadeOffset = Math.min(this._grid.topPadding, + this._grid.bottomPadding); + this.actor.update_fade_effect(fadeOffset, 0); + + // Set extra padding to avoid popup or close button being cut off + this._grid.topPadding = Math.max(this._grid.topPadding - this._offsetForEachSide, 0); + this._grid.bottomPadding = Math.max(this._grid.bottomPadding - this._offsetForEachSide, 0); + this._grid.leftPadding = Math.max(this._grid.leftPadding - this._offsetForEachSide, 0); + this._grid.rightPadding = Math.max(this._grid.rightPadding - this._offsetForEachSide, 0); + + this.actor.set_width(this.usedWidth()); + this.actor.set_height(this.usedHeight()); + } + + _getPageAvailableSize() { + let pageBox = new Clutter.ActorBox(); + pageBox.x1 = pageBox.y1 = 0; + pageBox.x2 = this._parentAvailableWidth; + pageBox.y2 = this._parentAvailableHeight; + + let contentBox = this.actor.get_theme_node().get_content_box(pageBox); + // We only can show icons inside the collection view boxPointer + // so we have to substract the required padding etc of the boxpointer + return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide]; + } + + usedWidth() { + let [availWidthPerPage, availHeightPerPage] = this._getPageAvailableSize(); + return this._grid.usedWidth(availWidthPerPage); + } + + usedHeight() { + return this._grid.usedHeightForNRows(this.nRowsDisplayedAtOnce()); + } + + nRowsDisplayedAtOnce() { + let [availWidthPerPage, availHeightPerPage] = this._getPageAvailableSize(); + let maxRows = this._grid.rowsForHeight(availHeightPerPage) - 1; + return Math.min(this._grid.nRows(availWidthPerPage), maxRows); + } + + setPaddingOffsets(offset) { + this._offsetForEachSide = offset; + } +}; + +var FolderIcon = class FolderIcon { + constructor(id, path, parentView) { + this.id = id; + this.name = ''; + this._parentView = parentView; + + this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder', + path: path }); + this.actor = new St.Button({ style_class: 'app-well-app app-folder', + button_mask: St.ButtonMask.ONE, + toggle_mode: true, + can_focus: true, + x_fill: true, + y_fill: true }); + this.actor._delegate = this; + // whether we need to update arrow side, position etc. + this._popupInvalidated = false; + + this.icon = new IconGrid.BaseIcon('', { createIcon: this._createIcon.bind(this), setSizeManually: true }); + this.actor.set_child(this.icon); + this.actor.label_actor = this.icon.label; + + this.view = new FolderView(); + + this.actor.connect('clicked', () => { + this._ensurePopup(); + this.view.actor.vscroll.adjustment.value = 0; + this._openSpaceForPopup(); + }); + this.actor.connect('notify::mapped', () => { + if (!this.actor.mapped && this._popup) + this._popup.popdown(); + }); + + this._folder.connect('changed', this._redisplay.bind(this)); + this._redisplay(); + } + + getAppIds() { + return this.view.getAllItems().map(item => item.id); + } + + _updateName() { + let name = _getFolderName(this._folder); + if (this.name == name) + return; + + this.name = name; + this.icon.label.text = this.name; + this.emit('name-changed'); + } + + _redisplay() { + this._updateName(); + + this.view.removeAll(); + + let excludedApps = this._folder.get_strv('excluded-apps'); + let appSys = Shell.AppSystem.get_default(); + let addAppId = appId => { + if (excludedApps.indexOf(appId) >= 0) + return; + + let app = appSys.lookup_app(appId); + if (!app) + return; + + if (!app.get_app_info().should_show()) + return; + + let icon = new AppIcon(app); + this.view.addItem(icon); + }; + + let folderApps = this._folder.get_strv('apps'); + folderApps.forEach(addAppId); + + let folderCategories = this._folder.get_strv('categories'); + let appInfos = this._parentView.getAppInfos(); + appInfos.forEach(appInfo => { + let appCategories = _getCategories(appInfo); + if (!_listsIntersect(folderCategories, appCategories)) + return; + + addAppId(appInfo.get_id()); + }); + + this.actor.visible = this.view.getAllItems().length > 0; + this.view.loadGrid(); + this.emit('apps-changed'); + } + + _createIcon(iconSize) { + return this.view.createFolderIcon(iconSize, this); + } + + _popupHeight() { + let usedHeight = this.view.usedHeight() + this._popup.getOffset(St.Side.TOP) + this._popup.getOffset(St.Side.BOTTOM); + return usedHeight; + } + + _openSpaceForPopup() { + let id = this._parentView.connect('space-ready', () => { + this._parentView.disconnect(id); + this._popup.popup(); + this._updatePopupPosition(); + }); + this._parentView.openSpaceForPopup(this, this._boxPointerArrowside, this.view.nRowsDisplayedAtOnce()); + } + + _calculateBoxPointerArrowSide() { + let spaceTop = this.actor.y - this._parentView.getCurrentPageY(); + let spaceBottom = this._parentView.actor.height - (spaceTop + this.actor.height); + + return spaceTop > spaceBottom ? St.Side.BOTTOM : St.Side.TOP; + } + + _updatePopupSize() { + // StWidget delays style calculation until needed, make sure we use the correct values + this.view._grid.ensure_style(); + + let offsetForEachSide = Math.ceil((this._popup.getOffset(St.Side.TOP) + + this._popup.getOffset(St.Side.BOTTOM) - + this._popup.getCloseButtonOverlap()) / 2); + // Add extra padding to prevent boxpointer decorations and close button being cut off + this.view.setPaddingOffsets(offsetForEachSide); + this.view.adaptToSize(this._parentAvailableWidth, this._parentAvailableHeight); + } + + _updatePopupPosition() { + if (!this._popup) + return; + + if (this._boxPointerArrowside == St.Side.BOTTOM) + this._popup.actor.y = this.actor.allocation.y1 + this.actor.translation_y - this._popupHeight(); + else + this._popup.actor.y = this.actor.allocation.y1 + this.actor.translation_y + this.actor.height; + } + + _ensurePopup() { + if (this._popup && !this._popupInvalidated) + return; + this._boxPointerArrowside = this._calculateBoxPointerArrowSide(); + if (!this._popup) { + this._popup = new AppFolderPopup(this, this._boxPointerArrowside); + this._parentView.addFolderPopup(this._popup); + this._popup.connect('open-state-changed', (popup, isOpen) => { + if (!isOpen) + this.actor.checked = false; + }); + } else { + this._popup.updateArrowSide(this._boxPointerArrowside); + } + this._updatePopupSize(); + this._updatePopupPosition(); + this._popupInvalidated = false; + } + + adaptToSize(width, height) { + this._parentAvailableWidth = width; + this._parentAvailableHeight = height; + if(this._popup) + this.view.adaptToSize(width, height); + this._popupInvalidated = true; + } +}; +Signals.addSignalMethods(FolderIcon.prototype); + +var AppFolderPopup = class AppFolderPopup { + constructor(source, side) { + this._source = source; + this._view = source.view; + this._arrowSide = side; + + this._isOpen = false; + this.parentOffset = 0; + + this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(), + visible: false, + // We don't want to expand really, but look + // at the layout manager of our parent... + // + // DOUBLE HACK: if you set one, you automatically + // get the effect for the other direction too, so + // we need to set the y_align + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.START }); + this._boxPointer = new BoxPointer.BoxPointer(this._arrowSide, + { style_class: 'app-folder-popup-bin', + x_fill: true, + y_fill: true, + x_expand: true, + x_align: St.Align.START }); + + this._boxPointer.actor.style_class = 'app-folder-popup'; + this.actor.add_actor(this._boxPointer.actor); + this._boxPointer.bin.set_child(this._view.actor); + + this.closeButton = Util.makeCloseButton(this._boxPointer); + this.closeButton.connect('clicked', this.popdown.bind(this)); + this.actor.add_actor(this.closeButton); + + this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity', + GObject.BindingFlags.SYNC_CREATE); + + global.focus_manager.add_group(this.actor); + + source.actor.connect('destroy', () => { this.actor.destroy(); }); + this._grabHelper = new GrabHelper.GrabHelper(this.actor, { + actionMode: Shell.ActionMode.POPUP + }); + this._grabHelper.addActor(Main.layoutManager.overviewGroup); + this.actor.connect('key-press-event', this._onKeyPress.bind(this)); + } + + _onKeyPress(actor, event) { + if (global.stage.get_key_focus() != actor) + return Clutter.EVENT_PROPAGATE; + + // Since we need to only grab focus on one item child when the user + // actually press a key we don't use navigate_focus when opening + // the popup. + // Instead of that, grab the focus on the AppFolderPopup actor + // and actually moves the focus to a child only when the user + // actually press a key. + // It should work with just grab_key_focus on the AppFolderPopup + // actor, but since the arrow keys are not wrapping_around the focus + // is not grabbed by a child when the widget that has the current focus + // is the same that is requesting focus, so to make it works with arrow + // keys we need to connect to the key-press-event and navigate_focus + // when that happens using TAB_FORWARD or TAB_BACKWARD instead of arrow + // keys + + // Use TAB_FORWARD for down key and right key + // and TAB_BACKWARD for up key and left key on ltr + // languages + let direction; + let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR; + switch (event.get_key_symbol()) { + case Clutter.Down: + direction = St.DirectionType.TAB_FORWARD; + break; + case Clutter.Right: + direction = isLtr ? St.DirectionType.TAB_FORWARD : + St.DirectionType.TAB_BACKWARD; + break; + case Clutter.Up: + direction = St.DirectionType.TAB_BACKWARD; + break; + case Clutter.Left: + direction = isLtr ? St.DirectionType.TAB_BACKWARD : + St.DirectionType.TAB_FORWARD; + break; + default: + return Clutter.EVENT_PROPAGATE; + } + return actor.navigate_focus(null, direction, false); + } + + toggle() { + if (this._isOpen) + this.popdown(); + else + this.popup(); + } + + popup() { + if (this._isOpen) + return; + + this._isOpen = this._grabHelper.grab({ actor: this.actor, + onUngrab: this.popdown.bind(this) }); + + if (!this._isOpen) + return; + + this.actor.show(); + + this._boxPointer.setArrowActor(this._source.actor); + // We need to hide the icons of the view until the boxpointer animation + // is completed so we can animate the icons after as we like without + // showing them while boxpointer is animating. + this._view.actor.opacity = 0; + this._boxPointer.open(BoxPointer.PopupAnimation.FADE | + BoxPointer.PopupAnimation.SLIDE, + () => { + this._view.actor.opacity = 255; + this._view.animate(IconGrid.AnimationDirection.IN); + }); + + this.emit('open-state-changed', true); + } + + popdown() { + if (!this._isOpen) + return; + + this._grabHelper.ungrab({ actor: this.actor }); + + this._boxPointer.close(BoxPointer.PopupAnimation.FADE | + BoxPointer.PopupAnimation.SLIDE); + this._isOpen = false; + this.emit('open-state-changed', false); + } + + getCloseButtonOverlap() { + return this.closeButton.get_theme_node().get_length('-shell-close-overlap-y'); + } + + getOffset(side) { + let offset = this._boxPointer.getPadding(side); + if (this._arrowSide == side) + offset += this._boxPointer.getArrowHeight(); + return offset; + } + + updateArrowSide(side) { + this._arrowSide = side; + this._boxPointer.updateArrowSide(side); + } +}; +Signals.addSignalMethods(AppFolderPopup.prototype); + +var AppIcon = class AppIcon { + constructor(app, iconParams) { + this.app = app; + this.id = app.get_id(); + this.name = app.get_name(); + + this.actor = new St.Button({ style_class: 'app-well-app', + reactive: true, + button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO, + can_focus: true, + x_fill: true, + y_fill: true }); + + this._dot = new St.Widget({ style_class: 'app-well-app-running-dot', + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END }); + + this._iconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true }); + + this.actor.set_child(this._iconContainer); + this._iconContainer.add_child(this._dot); + + this.actor._delegate = this; + + if (!iconParams) + iconParams = {}; + + // Get the isDraggable property without passing it on to the BaseIcon: + let appIconParams = Params.parse(iconParams, { isDraggable: true }, true); + let isDraggable = appIconParams['isDraggable']; + delete iconParams['isDraggable']; + + iconParams['createIcon'] = this._createIcon.bind(this); + iconParams['setSizeManually'] = true; + this.icon = new IconGrid.BaseIcon(app.get_name(), iconParams); + this._iconContainer.add_child(this.icon); + + this.actor.label_actor = this.icon.label; + + this.actor.connect('leave-event', this._onLeaveEvent.bind(this)); + this.actor.connect('button-press-event', this._onButtonPress.bind(this)); + this.actor.connect('touch-event', this._onTouchEvent.bind(this)); + this.actor.connect('clicked', this._onClicked.bind(this)); + this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); + + this._menu = null; + this._menuManager = new PopupMenu.PopupMenuManager(this); + + if (isDraggable) { + this._draggable = DND.makeDraggable(this.actor); + this._draggable.connect('drag-begin', () => { + this._removeMenuTimeout(); + Main.overview.beginItemDrag(this); + }); + this._draggable.connect('drag-cancelled', () => { + Main.overview.cancelledItemDrag(this); + }); + this._draggable.connect('drag-end', () => { + Main.overview.endItemDrag(this); + }); + } + + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._menuTimeoutId = 0; + this._stateChangedId = this.app.connect('notify::state', () => { + this._updateRunningStyle(); + }); + this._updateRunningStyle(); + } + + _onDestroy() { + if (this._stateChangedId > 0) + this.app.disconnect(this._stateChangedId); + this._stateChangedId = 0; + this._removeMenuTimeout(); + } + + _createIcon(iconSize) { + return this.app.create_icon_texture(iconSize); + } + + _removeMenuTimeout() { + if (this._menuTimeoutId > 0) { + Mainloop.source_remove(this._menuTimeoutId); + this._menuTimeoutId = 0; + } + } + + _updateRunningStyle() { + if (this.app.state != Shell.AppState.STOPPED) + this._dot.show(); + else + this._dot.hide(); + } + + _setPopupTimeout() { + this._removeMenuTimeout(); + this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT, () => { + this._menuTimeoutId = 0; + this.popupMenu(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu'); + } + + _onLeaveEvent(actor, event) { + this.actor.fake_release(); + this._removeMenuTimeout(); + } + + _onButtonPress(actor, event) { + let button = event.get_button(); + if (button == 1) { + this._setPopupTimeout(); + } else if (button == 3) { + this.popupMenu(); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + _onTouchEvent(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) + this._setPopupTimeout(); + + return Clutter.EVENT_PROPAGATE; + } + + _onClicked(actor, button) { + this._removeMenuTimeout(); + this.activate(button); + } + + _onKeyboardPopupMenu() { + this.popupMenu(); + this._menu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + + getId() { + return this.app.get_id(); + } + + popupMenu() { + this._removeMenuTimeout(); + this.actor.fake_release(); + + if (this._draggable) + this._draggable.fakeRelease(); + + if (!this._menu) { + this._menu = new AppIconMenu(this); + this._menu.connect('activate-window', (menu, window) => { + this.activateWindow(window); + }); + this._menu.connect('open-state-changed', (menu, isPoppedUp) => { + if (!isPoppedUp) + this._onMenuPoppedDown(); + }); + let id = Main.overview.connect('hiding', () => { + this._menu.close(); + }); + this.actor.connect('destroy', () => { + Main.overview.disconnect(id); + }); + + this._menuManager.addMenu(this._menu); + } + + this.emit('menu-state-changed', true); + + this.actor.set_hover(true); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + } + + activateWindow(metaWindow) { + if (metaWindow) { + Main.activateWindow(metaWindow); + } else { + Main.overview.hide(); + } + } + + _onMenuPoppedDown() { + this.actor.sync_hover(); + this.emit('menu-state-changed', false); + } + + activate(button) { + let event = Clutter.get_current_event(); + let modifiers = event ? event.get_state() : 0; + let isMiddleButton = button && button == Clutter.BUTTON_MIDDLE; + let isCtrlPressed = (modifiers & Clutter.ModifierType.CONTROL_MASK) != 0; + let openNewWindow = this.app.can_open_new_window() && + this.app.state == Shell.AppState.RUNNING && + (isCtrlPressed || isMiddleButton); + + if (this.app.state == Shell.AppState.STOPPED || openNewWindow) + this.animateLaunch(); + + if (openNewWindow) + this.app.open_new_window(-1); + else + this.app.activate(); + + Main.overview.hide(); + } + + animateLaunch() { + this.icon.animateZoomOut(); + } + + shellWorkspaceLaunch(params) { + params = Params.parse(params, { workspace: -1, + timestamp: 0 }); + + this.app.open_new_window(params.workspace); + } + + getDragActor() { + return this.app.create_icon_texture(Main.overview.dashIconSize); + } + + // Returns the original actor that should align with the actor + // we show as the item is being dragged. + getDragActorSource() { + return this.icon.icon; + } + + shouldShowTooltip() { + return this.actor.hover && (!this._menu || !this._menu.isOpen); + } +}; +Signals.addSignalMethods(AppIcon.prototype); + +var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu { + constructor(source) { + let side = St.Side.LEFT; + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + side = St.Side.RIGHT; + + super(source.actor, 0.5, side); + + // We want to keep the item hovered while the menu is up + this.blockSourceEvents = true; + + this._source = source; + + this.actor.add_style_class_name('app-well-menu'); + + // Chain our visibility and lifecycle to that of the source + this._sourceMappedId = source.actor.connect('notify::mapped', () => { + if (!source.actor.mapped) + this.close(); + }); + source.actor.connect('destroy', () => { + source.actor.disconnect(this._sourceMappedId); + this.destroy(); + }); + + Main.uiGroup.add_actor(this.actor); + } + + _redisplay() { + this.removeAll(); + + let windows = this._source.app.get_windows().filter( + w => !w.skip_taskbar + ); + + // Display the app windows menu items and the separator between windows + // of the current desktop and other windows. + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace; + + for (let i = 0; i < windows.length; i++) { + let window = windows[i]; + if (!separatorShown && window.get_workspace() != activeWorkspace) { + this._appendSeparator(); + separatorShown = true; + } + let title = window.title ? window.title + : this._source.app.get_name(); + let item = this._appendMenuItem(title); + item.connect('activate', () => { + this.emit('activate-window', window); + }); + } + + if (!this._source.app.is_window_backed()) { + this._appendSeparator(); + + let appInfo = this._source.app.get_app_info(); + let actions = appInfo.list_actions(); + if (this._source.app.can_open_new_window() && + actions.indexOf('new-window') == -1) { + this._newWindowMenuItem = this._appendMenuItem(_("New Window")); + this._newWindowMenuItem.connect('activate', () => { + if (this._source.app.state == Shell.AppState.STOPPED) + this._source.animateLaunch(); + + this._source.app.open_new_window(-1); + this.emit('activate-window', null); + }); + this._appendSeparator(); + } + + if (discreteGpuAvailable && + this._source.app.state == Shell.AppState.STOPPED && + actions.indexOf('activate-discrete-gpu') == -1) { + this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card")); + this._onDiscreteGpuMenuItem.connect('activate', () => { + if (this._source.app.state == Shell.AppState.STOPPED) + this._source.animateLaunch(); + + this._source.app.launch(0, -1, true); + this.emit('activate-window', null); + }); + } + + for (let i = 0; i < actions.length; i++) { + let action = actions[i]; + let item = this._appendMenuItem(appInfo.get_action_name(action)); + item.connect('activate', (emitter, event) => { + this._source.app.launch_action(action, event.get_time(), -1); + this.emit('activate-window', null); + }); + } + + let canFavorite = global.settings.is_writable('favorite-apps'); + + if (canFavorite) { + this._appendSeparator(); + + let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id()); + + if (isFavorite) { + let item = this._appendMenuItem(_("Remove from Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.removeFavorite(this._source.app.get_id()); + }); + } else { + let item = this._appendMenuItem(_("Add to Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.addFavorite(this._source.app.get_id()); + }); + } + } + + if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) { + this._appendSeparator(); + let item = this._appendMenuItem(_("Show Details")); + item.connect('activate', () => { + let id = this._source.app.get_id(); + let args = GLib.Variant.new('(ss)', [id, '']); + Gio.DBus.get(Gio.BusType.SESSION, null, (o, res) => { + let bus = Gio.DBus.get_finish(res); + bus.call('org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Actions', 'Activate', + GLib.Variant.new('(sava{sv})', + ['details', [args], null]), + null, 0, -1, null, null); + Main.overview.hide(); + }); + }); + } + } + } + + _appendSeparator() { + let separator = new PopupMenu.PopupSeparatorMenuItem(); + this.addMenuItem(separator); + } + + _appendMenuItem(labelText) { + // FIXME: app-well-menu-item style + let item = new PopupMenu.PopupMenuItem(labelText); + this.addMenuItem(item); + return item; + } + + popup(activatingButton) { + this._redisplay(); + this.open(); + } +}; +Signals.addSignalMethods(AppIconMenu.prototype); + +var SystemActionIcon = class SystemActionIcon extends Search.GridSearchResult { + activate() { + SystemActions.getDefault().activateAction(this.metaInfo['id']); + Main.overview.hide(); + } +}; diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js new file mode 100644 index 0000000..657e159 --- /dev/null +++ b/js/ui/appFavorites.js @@ -0,0 +1,198 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Shell = imports.gi.Shell; +const Signals = imports.signals; + +const Main = imports.ui.main; + +// In alphabetical order +const RENAMED_DESKTOP_IDS = { + 'baobab.desktop': 'org.gnome.baobab.desktop', + 'cheese.desktop': 'org.gnome.Cheese.desktop', + 'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop', + 'empathy.desktop': 'org.gnome.Empathy.desktop', + 'epiphany.desktop': 'org.gnome.Epiphany.desktop', + 'evolution.desktop': 'org.gnome.Evolution.desktop', + 'file-roller.desktop': 'org.gnome.FileRoller.desktop', + 'five-or-more.desktop': 'org.gnome.five-or-more.desktop', + 'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop', + 'gcalctool.desktop': 'org.gnome.Calculator.desktop', + 'geary.desktop': 'org.gnome.Geary.desktop', + 'gedit.desktop': 'org.gnome.gedit.desktop', + 'glchess.desktop': 'org.gnome.Chess.desktop', + 'glines.desktop': 'org.gnome.five-or-more.desktop', + 'gnect.desktop': 'org.gnome.Four-in-a-row.desktop', + 'gnibbles.desktop': 'org.gnome.Nibbles.desktop', + 'gnobots2.desktop': 'org.gnome.Robots.desktop', + 'gnome-boxes.desktop': 'org.gnome.Boxes.desktop', + 'gnome-calculator.desktop': 'org.gnome.Calculator.desktop', + 'gnome-chess.desktop': 'org.gnome.Chess.desktop', + 'gnome-clocks.desktop': 'org.gnome.clocks.desktop', + 'gnome-contacts.desktop': 'org.gnome.Contacts.desktop', + 'gnome-documents.desktop': 'org.gnome.Documents.desktop', + 'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop', + 'gnome-klotski.desktop': 'org.gnome.Klotski.desktop', + 'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop', + 'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop', + 'gnome-mines.desktop': 'org.gnome.Mines.desktop', + 'gnome-music.desktop': 'org.gnome.Music.desktop', + 'gnome-photos.desktop': 'org.gnome.Photos.desktop', + 'gnome-robots.desktop': 'org.gnome.Robots.desktop', + 'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', + 'gnome-software.desktop': 'org.gnome.Software.desktop', + 'gnome-terminal.desktop': 'org.gnome.Terminal.desktop', + 'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop', + 'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop', + 'gnome-weather.desktop': 'org.gnome.Weather.desktop', + 'gnomine.desktop': 'org.gnome.Mines.desktop', + 'gnotravex.desktop': 'org.gnome.Tetravex.desktop', + 'gnotski.desktop': 'org.gnome.Klotski.desktop', + 'gtali.desktop': 'org.gnome.Tali.desktop', + 'iagno.desktop': 'org.gnome.Reversi.desktop', + 'nautilus.desktop': 'org.gnome.Nautilus.desktop', + 'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop', + 'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop', + 'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop', + 'polari.desktop': 'org.gnome.Polari.desktop', + 'tali.desktop': 'org.gnome.Tali.desktop', + 'totem.desktop': 'org.gnome.Totem.desktop', + 'evince.desktop': 'org.gnome.Evince.desktop', +}; + +class AppFavorites { + constructor() { + this.FAVORITE_APPS_KEY = 'favorite-apps'; + this._favorites = {}; + global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, this._onFavsChanged.bind(this)); + this.reload(); + } + + _onFavsChanged() { + this.reload(); + this.emit('changed'); + } + + reload() { + let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY); + let appSys = Shell.AppSystem.get_default(); + + // Map old desktop file names to the current ones + let updated = false; + ids = ids.map(id => { + let newId = RENAMED_DESKTOP_IDS[id]; + if (newId !== undefined && + appSys.lookup_app(newId) != null) { + updated = true; + return newId; + } + return id; + }); + // ... and write back the updated desktop file names + if (updated) + global.settings.set_strv(this.FAVORITE_APPS_KEY, ids); + + let apps = ids.map(id => appSys.lookup_app(id)) + .filter(app => app != null); + this._favorites = {}; + for (let i = 0; i < apps.length; i++) { + let app = apps[i]; + this._favorites[app.get_id()] = app; + } + } + + _getIds() { + let ret = []; + for (let id in this._favorites) + ret.push(id); + return ret; + } + + getFavoriteMap() { + return this._favorites; + } + + getFavorites() { + let ret = []; + for (let id in this._favorites) + ret.push(this._favorites[id]); + return ret; + } + + isFavorite(appId) { + return appId in this._favorites; + } + + _addFavorite(appId, pos) { + if (appId in this._favorites) + return false; + + let app = Shell.AppSystem.get_default().lookup_app(appId); + + if (!app) + return false; + + let ids = this._getIds(); + if (pos == -1) + ids.push(appId); + else + ids.splice(pos, 0, appId); + global.settings.set_strv(this.FAVORITE_APPS_KEY, ids); + return true; + } + + addFavoriteAtPos(appId, pos) { + if (!this._addFavorite(appId, pos)) + return; + + let app = Shell.AppSystem.get_default().lookup_app(appId); + + Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()), + { forFeedback: true, + undoCallback: () => { + this._removeFavorite(appId); + } + }); + } + + addFavorite(appId) { + this.addFavoriteAtPos(appId, -1); + } + + moveFavoriteToPos(appId, pos) { + this._removeFavorite(appId); + this._addFavorite(appId, pos); + } + + _removeFavorite(appId) { + if (!(appId in this._favorites)) + return false; + + let ids = this._getIds().filter(id => id != appId); + global.settings.set_strv(this.FAVORITE_APPS_KEY, ids); + return true; + } + + removeFavorite(appId) { + let ids = this._getIds(); + let pos = ids.indexOf(appId); + + let app = this._favorites[appId]; + if (!this._removeFavorite(appId)) + return; + + Main.overview.setMessage(_("%s has been removed from your favorites.").format(app.get_name()), + { forFeedback: true, + undoCallback: () => { + this._addFavorite(appId, pos); + } + }); + } +}; +Signals.addSignalMethods(AppFavorites.prototype); + +var appFavoritesInstance = null; +function getAppFavorites() { + if (appFavoritesInstance == null) + appFavoritesInstance = new AppFavorites(); + return appFavoritesInstance; +} diff --git a/js/ui/audioDeviceSelection.js b/js/ui/audioDeviceSelection.js new file mode 100644 index 0000000..25fde89 --- /dev/null +++ b/js/ui/audioDeviceSelection.js @@ -0,0 +1,192 @@ +const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi; + +const Main = imports.ui.main; +const ModalDialog = imports.ui.modalDialog; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +var AudioDevice = { + HEADPHONES: 1 << 0, + HEADSET: 1 << 1, + MICROPHONE: 1 << 2 +}; + +const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection'); + +var AudioDeviceSelectionDialog = +class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog { + constructor(devices) { + super({ styleClass: 'audio-device-selection-dialog' }); + + this._deviceItems = {}; + + this._buildLayout(); + + if (devices & AudioDevice.HEADPHONES) + this._addDevice(AudioDevice.HEADPHONES); + if (devices & AudioDevice.HEADSET) + this._addDevice(AudioDevice.HEADSET); + if (devices & AudioDevice.MICROPHONE) + this._addDevice(AudioDevice.MICROPHONE); + + if (this._selectionBox.get_n_children() < 2) + throw new Error('Too few devices for a selection'); + } + + destroy() { + super.destroy(); + } + + _buildLayout(devices) { + let title = new St.Label({ style_class: 'audio-selection-title', + text: _("Select Audio Device"), + x_align: Clutter.ActorAlign.CENTER }); + + this.contentLayout.style_class = 'audio-selection-content'; + this.contentLayout.add(title); + + this._selectionBox = new St.BoxLayout({ style_class: 'audio-selection-box' }); + this.contentLayout.add(this._selectionBox, { expand: true }); + + if (Main.sessionMode.allowSettings) + this.addButton({ action: this._openSettings.bind(this), + label: _("Sound Settings") }); + this.addButton({ action: this.close.bind(this), + label: _("Cancel"), + key: Clutter.Escape }); + } + + _getDeviceLabel(device) { + switch(device) { + case AudioDevice.HEADPHONES: + return _("Headphones"); + case AudioDevice.HEADSET: + return _("Headset"); + case AudioDevice.MICROPHONE: + return _("Microphone"); + default: + return null; + } + } + + _getDeviceIcon(device) { + switch(device) { + case AudioDevice.HEADPHONES: + return 'audio-headphones-symbolic'; + case AudioDevice.HEADSET: + return 'audio-headset-symbolic'; + case AudioDevice.MICROPHONE: + return 'audio-input-microphone-symbolic'; + default: + return null; + } + } + + _addDevice(device) { + let box = new St.BoxLayout({ style_class: 'audio-selection-device-box', + vertical: true }); + box.connect('notify::height', () => { + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + box.width = box.height; + }); + }); + + let icon = new St.Icon({ style_class: 'audio-selection-device-icon', + icon_name: this._getDeviceIcon(device) }); + box.add(icon); + + let label = new St.Label({ style_class: 'audio-selection-device-label', + text: this._getDeviceLabel(device), + x_align: Clutter.ActorAlign.CENTER }); + box.add(label); + + let button = new St.Button({ style_class: 'audio-selection-device', + can_focus: true, + child: box }); + this._selectionBox.add(button); + + button.connect('clicked', () => { + this.emit('device-selected', device); + this.close(); + Main.overview.hide(); + }); + } + + _openSettings() { + let desktopFile = 'gnome-sound-panel.desktop' + let app = Shell.AppSystem.get_default().lookup_app(desktopFile); + + if (!app) { + log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!'); + return; + } + + this.close(); + Main.overview.hide(); + app.activate(); + } +}; + +var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus { + constructor() { + this._audioSelectionDialog = null; + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection'); + + Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, null, null); + } + + _onDialogClosed() { + this._audioSelectionDialog = null; + } + + _onDeviceSelected(dialog, device) { + let connection = this._dbusImpl.get_connection(); + let info = this._dbusImpl.get_info(); + let deviceName = Object.keys(AudioDevice).filter( + dev => AudioDevice[dev] == device + )[0].toLowerCase(); + connection.emit_signal(this._audioSelectionDialog._sender, + this._dbusImpl.get_object_path(), + info ? info.name : null, + 'DeviceSelected', + GLib.Variant.new('(s)', [deviceName])); + } + + OpenAsync(params, invocation) { + if (this._audioSelectionDialog) { + invocation.return_value(null); + return; + } + + let [deviceNames] = params; + let devices = 0; + deviceNames.forEach(n => { devices |= AudioDevice[n.toUpperCase()]; }); + + let dialog; + try { + dialog = new AudioDeviceSelectionDialog(devices); + } catch(e) { + invocation.return_value(null); + return; + } + dialog._sender = invocation.get_sender(); + + dialog.connect('closed', this._onDialogClosed.bind(this)); + dialog.connect('device-selected', + this._onDeviceSelected.bind(this)); + dialog.open(); + + this._audioSelectionDialog = dialog; + invocation.return_value(null); + } + + CloseAsync(params, invocation) { + if (this._audioSelectionDialog && + this._audioSelectionDialog._sender == invocation.get_sender()) + this._audioSelectionDialog.close(); + + invocation.return_value(null); + } +}; diff --git a/js/ui/background.js b/js/ui/background.js new file mode 100644 index 0000000..06e0388 --- /dev/null +++ b/js/ui/background.js @@ -0,0 +1,772 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +// READ THIS FIRST +// Background handling is a maze of objects, both objects in this file, and +// also objects inside Mutter. They all have a role. +// +// BackgroundManager +// The only object that other parts of GNOME Shell deal with; a +// BackgroundManager creates background actors and adds them to +// the specified container. When the background is changed by the +// user it will fade out the old actor and fade in the new actor. +// (This is separate from the fading for an animated background, +// since using two actors is quite inefficient.) +// +// MetaBackgroundImage +// An object represented an image file that will be used for drawing +// the background. MetaBackgroundImage objects asynchronously load, +// so they are first created in an unloaded state, then later emit +// a ::loaded signal when the Cogl object becomes available. +// +// MetaBackgroundImageCache +// A cache from filename to MetaBackgroundImage. +// +// BackgroundSource +// An object that is created for each GSettings schema (separate +// settings schemas are used for the lock screen and main background), +// and holds a reference to shared Background objects. +// +// MetaBackground +// Holds the specification of a background - a background color +// or gradient and one or two images blended together. +// +// Background +// JS delegate object that Connects a MetaBackground to the GSettings +// schema for the background. +// +// Animation +// A helper object that handles loading a XML-based animation; it is a +// wrapper for GnomeDesktop.BGSlideShow +// +// MetaBackgroundActor +// An actor that draws the background for a single monitor +// +// BackgroundCache +// A cache of Settings schema => BackgroundSource and of a single Animation. +// Also used to share file monitors. +// +// A static image, background color or gradient is relatively straightforward. The +// calling code creates a separate BackgroundManager for each monitor. Since they +// are created for the same GSettings schema, they will use the same BackgroundSource +// object, which provides a single Background and correspondingly a single +// MetaBackground object. +// +// BackgroundManager BackgroundManager +// | \ / | +// | BackgroundSource | looked up in BackgroundCache +// | | | +// | Background | +// | | | +// MetaBackgroundActor | MetaBackgroundActor +// \ | / +// `------- MetaBackground ------' +// | +// MetaBackgroundImage looked up in MetaBackgroundImageCache +// +// The animated case is tricker because the animation XML file can specify different +// files for different monitor resolutions and aspect ratios. For this reason, +// the BackgroundSource provides different Background share a single Animation object, +// which tracks the animation, but use different MetaBackground objects. In the +// common case, the different MetaBackground objects will be created for the +// same filename and look up the *same* MetaBackgroundImage object, so there is +// little wasted memory: +// +// BackgroundManager BackgroundManager +// | \ / | +// | BackgroundSource | looked up in BackgroundCache +// | / \ | +// | Background Background | +// | | \ / | | +// | | Animation | | looked up in BackgroundCache +// MetaBackgroundA|tor Me|aBackgroundActor +// \ | | / +// MetaBackground MetaBackground +// \ / +// MetaBackgroundImage looked up in MetaBackgroundImageCache +// MetaBackgroundImage +// +// But the case of different filenames and different background images +// is possible as well: +// .... +// MetaBackground MetaBackground +// | | +// MetaBackgroundImage MetaBackgroundImage +// MetaBackgroundImage MetaBackgroundImage + +const { Clutter, GDesktopEnums, Gio, GLib, GnomeDesktop, Meta } = imports.gi; +const Signals = imports.signals; + +const LoginManager = imports.misc.loginManager; +const Main = imports.ui.main; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; + +var DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff); + +const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; +const PRIMARY_COLOR_KEY = 'primary-color'; +const SECONDARY_COLOR_KEY = 'secondary-color'; +const COLOR_SHADING_TYPE_KEY = 'color-shading-type'; +const BACKGROUND_STYLE_KEY = 'picture-options'; +const PICTURE_OPACITY_KEY = 'picture-opacity'; +const PICTURE_URI_KEY = 'picture-uri'; + +var FADE_ANIMATION_TIME = 1.0; + +// These parameters affect how often we redraw. +// The first is how different (percent crossfaded) the slide show +// has to look before redrawing and the second is the minimum +// frequency (in seconds) we're willing to wake up +var ANIMATION_OPACITY_STEP_INCREMENT = 4.0; +var ANIMATION_MIN_WAKEUP_INTERVAL = 1.0; + +let _backgroundCache = null; + +function _fileEqual0(file1, file2) { + if (file1 == file2) + return true; + + if (!file1 || !file2) + return false; + + return file1.equal(file2); +} + +var BackgroundCache = class BackgroundCache { + constructor() { + this._fileMonitors = {}; + this._backgroundSources = {}; + this._animations = {}; + } + + monitorFile(file) { + let key = file.hash(); + if (this._fileMonitors[key]) + return; + + let monitor = file.monitor(Gio.FileMonitorFlags.NONE, null); + monitor.connect('changed', + (obj, file, otherFile, eventType) => { + // Ignore CHANGED and CREATED events, since in both cases + // we'll get a CHANGES_DONE_HINT event when done. + if (eventType != Gio.FileMonitorEvent.CHANGED && + eventType != Gio.FileMonitorEvent.CREATED) + this.emit('file-changed', file); + }); + + this._fileMonitors[key] = monitor; + } + + getAnimation(params) { + params = Params.parse(params, { file: null, + settingsSchema: null, + onLoaded: null }); + + let animation = this._animations[params.settingsSchema]; + if (animation && _fileEqual0(animation.file, params.file)) { + if (params.onLoaded) { + let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + params.onLoaded(this._animations[params.settingsSchema]); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded'); + } + return; + } + + animation = new Animation({ file: params.file }); + + animation.load(() => { + this._animations[params.settingsSchema] = animation; + + if (params.onLoaded) { + let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + params.onLoaded(this._animations[params.settingsSchema]); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded'); + } + }); + } + + getBackgroundSource(layoutManager, settingsSchema) { + // The layoutManager is always the same one; we pass in it since + // Main.layoutManager may not be set yet + + if (!(settingsSchema in this._backgroundSources)) { + this._backgroundSources[settingsSchema] = new BackgroundSource(layoutManager, settingsSchema); + this._backgroundSources[settingsSchema]._useCount = 1; + } else { + this._backgroundSources[settingsSchema]._useCount++; + } + + return this._backgroundSources[settingsSchema]; + } + + releaseBackgroundSource(settingsSchema) { + if (settingsSchema in this._backgroundSources) { + let source = this._backgroundSources[settingsSchema]; + source._useCount--; + if (source._useCount == 0) { + delete this._backgroundSources[settingsSchema]; + source.destroy(); + } + } + } +}; +Signals.addSignalMethods(BackgroundCache.prototype); + +function getBackgroundCache() { + if (!_backgroundCache) + _backgroundCache = new BackgroundCache(); + return _backgroundCache; +} + +var Background = class Background { + constructor(params) { + params = Params.parse(params, { monitorIndex: 0, + layoutManager: Main.layoutManager, + settings: null, + file: null, + style: null }); + + this.background = new Meta.Background({ meta_display: global.display }); + this.background._delegate = this; + + this._settings = params.settings; + this._file = params.file; + this._style = params.style; + this._monitorIndex = params.monitorIndex; + this._layoutManager = params.layoutManager; + this._fileWatches = {}; + this._cancellable = new Gio.Cancellable(); + this.isLoaded = false; + + this._clock = new GnomeDesktop.WallClock(); + this._timezoneChangedId = this._clock.connect('notify::timezone', + () => { + if (this._animation) + this._loadAnimation(this._animation.file); + }); + + let loginManager = LoginManager.getLoginManager(); + this._prepareForSleepId = loginManager.connect('prepare-for-sleep', + (lm, aboutToSuspend) => { + if (aboutToSuspend) + return; + this._refreshAnimation(); + }); + + this._settingsChangedSignalId = this._settings.connect('changed', () => { + this.emit('changed'); + }); + + this._load(); + } + + destroy() { + this._cancellable.cancel(); + this._removeAnimationTimeout(); + + let i; + let keys = Object.keys(this._fileWatches); + for (i = 0; i < keys.length; i++) { + this._cache.disconnect(this._fileWatches[keys[i]]); + } + this._fileWatches = null; + + if (this._timezoneChangedId != 0) + this._clock.disconnect(this._timezoneChangedId); + this._timezoneChangedId = 0; + + this._clock = null; + + if (this._prepareForSleepId != 0) + LoginManager.getLoginManager().disconnect(this._prepareForSleepId); + this._prepareForSleepId = 0; + + if (this._settingsChangedSignalId != 0) + this._settings.disconnect(this._settingsChangedSignalId); + this._settingsChangedSignalId = 0; + } + + updateResolution() { + if (this._animation) + this._refreshAnimation(); + } + + _refreshAnimation() { + if (!this._animation) + return; + + this._removeAnimationTimeout(); + this._updateAnimation(); + } + + _setLoaded() { + if (this.isLoaded) + return; + + this.isLoaded = true; + + let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + this.emit('loaded'); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] this.emit'); + } + + _loadPattern() { + let colorString, res, color, secondColor; + + colorString = this._settings.get_string(PRIMARY_COLOR_KEY); + [res, color] = Clutter.Color.from_string(colorString); + colorString = this._settings.get_string(SECONDARY_COLOR_KEY); + [res, secondColor] = Clutter.Color.from_string(colorString); + + let shadingType = this._settings.get_enum(COLOR_SHADING_TYPE_KEY); + + if (shadingType == GDesktopEnums.BackgroundShading.SOLID) + this.background.set_color(color); + else + this.background.set_gradient(shadingType, color, secondColor); + } + + _watchFile(file) { + let key = file.hash(); + if (this._fileWatches[key]) + return; + + this._cache.monitorFile(file); + let signalId = this._cache.connect('file-changed', + (cache, changedFile) => { + if (changedFile.equal(file)) { + let imageCache = Meta.BackgroundImageCache.get_default(); + imageCache.purge(changedFile); + this.emit('changed'); + } + }); + this._fileWatches[key] = signalId; + } + + _removeAnimationTimeout() { + if (this._updateAnimationTimeoutId) { + GLib.source_remove(this._updateAnimationTimeoutId); + this._updateAnimationTimeoutId = 0; + } + } + + _updateAnimation() { + this._updateAnimationTimeoutId = 0; + + this._animation.update(this._layoutManager.monitors[this._monitorIndex]); + let files = this._animation.keyFrameFiles; + + let finish = () => { + this._setLoaded(); + if (files.length > 1) { + this.background.set_blend(files[0], files[1], + this._animation.transitionProgress, + this._style); + } else if (files.length > 0) { + this.background.set_file(files[0], this._style); + } else { + this.background.set_file(null, this._style); + } + this._queueUpdateAnimation(); + }; + + let cache = Meta.BackgroundImageCache.get_default(); + let numPendingImages = files.length; + for (let i = 0; i < files.length; i++) { + this._watchFile(files[i]); + let image = cache.load(files[i]); + if (image.is_loaded()) { + numPendingImages--; + if (numPendingImages == 0) + finish(); + } else { + let id = image.connect('loaded', () => { + image.disconnect(id); + numPendingImages--; + if (numPendingImages == 0) + finish(); + }); + } + } + } + + _queueUpdateAnimation() { + if (this._updateAnimationTimeoutId != 0) + return; + + if (!this._cancellable || this._cancellable.is_cancelled()) + return; + + if (!this._animation.transitionDuration) + return; + + let nSteps = 255 / ANIMATION_OPACITY_STEP_INCREMENT; + let timePerStep = (this._animation.transitionDuration * 1000) / nSteps; + + let interval = Math.max(ANIMATION_MIN_WAKEUP_INTERVAL * 1000, + timePerStep); + + if (interval > GLib.MAXUINT32) + return; + + this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, + interval, + () => { + this._updateAnimationTimeoutId = 0; + this._updateAnimation(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation'); + } + + _loadAnimation(file) { + this._cache.getAnimation({ file: file, + settingsSchema: this._settings.schema_id, + onLoaded: animation => { + this._animation = animation; + + if (!this._animation || this._cancellable.is_cancelled()) { + this._setLoaded(); + return; + } + + this._updateAnimation(); + this._watchFile(file); + } + }); + } + + _loadImage(file) { + this.background.set_file(file, this._style); + this._watchFile(file); + + let cache = Meta.BackgroundImageCache.get_default(); + let image = cache.load(file); + if (image.is_loaded()) + this._setLoaded(); + else { + let id = image.connect('loaded', () => { + this._setLoaded(); + image.disconnect(id); + }); + } + } + + _loadFile(file) { + if (file.get_basename().endsWith('.xml')) + this._loadAnimation(file); + else + this._loadImage(file); + } + + _load() { + this._cache = getBackgroundCache(); + + this._loadPattern(); + + if (!this._file) { + this._setLoaded(); + return; + } + + this._loadFile(this._file); + } +}; +Signals.addSignalMethods(Background.prototype); + +let _systemBackground; + +var SystemBackground = class SystemBackground { + constructor() { + let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png'); + + if (_systemBackground == null) { + _systemBackground = new Meta.Background({ meta_display: global.display }); + _systemBackground.set_color(DEFAULT_BACKGROUND_COLOR); + _systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER); + } + + this.actor = new Meta.BackgroundActor({ meta_display: global.display, + monitor: 0, + background: _systemBackground }); + + let cache = Meta.BackgroundImageCache.get_default(); + let image = cache.load(file); + if (image.is_loaded()) { + image = null; + let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + this.emit('loaded'); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] SystemBackground.loaded'); + } else { + let id = image.connect('loaded', () => { + this.emit('loaded'); + image.disconnect(id); + image = null; + }); + } + } +}; +Signals.addSignalMethods(SystemBackground.prototype); + +var BackgroundSource = class BackgroundSource { + constructor(layoutManager, settingsSchema) { + // Allow override the background image setting for performance testing + this._layoutManager = layoutManager; + this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE'); + this._settings = new Gio.Settings({ schema_id: settingsSchema }); + this._backgrounds = []; + + let monitorManager = Meta.MonitorManager.get(); + this._monitorsChangedId = + monitorManager.connect('monitors-changed', + this._onMonitorsChanged.bind(this)); + } + + _onMonitorsChanged() { + for (let monitorIndex in this._backgrounds) { + let background = this._backgrounds[monitorIndex]; + + if (monitorIndex < this._layoutManager.monitors.length) { + background.updateResolution(); + } else { + background.disconnect(background._changedId); + background.destroy(); + delete this._backgrounds[monitorIndex]; + } + } + } + + getBackground(monitorIndex) { + let file = null; + let style; + + // We don't watch changes to settings here, + // instead we rely on Background to watch those + // and emit 'changed' at the right time + + if (this._overrideImage != null) { + file = Gio.File.new_for_path(this._overrideImage); + style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode + } else { + style = this._settings.get_enum(BACKGROUND_STYLE_KEY); + if (style != GDesktopEnums.BackgroundStyle.NONE) { + let uri = this._settings.get_string(PICTURE_URI_KEY); + file = Gio.File.new_for_commandline_arg(uri); + } + } + + // Animated backgrounds are (potentially) per-monitor, since + // they can have variants that depend on the aspect ratio and + // size of the monitor; for other backgrounds we can use the + // same background object for all monitors. + if (file == null || !file.get_basename().endsWith('.xml')) + monitorIndex = 0; + + if (!(monitorIndex in this._backgrounds)) { + let background = new Background({ + monitorIndex: monitorIndex, + layoutManager: this._layoutManager, + settings: this._settings, + file: file, + style: style + }); + + background._changedId = background.connect('changed', () => { + background.disconnect(background._changedId); + background.destroy(); + delete this._backgrounds[monitorIndex]; + }); + + this._backgrounds[monitorIndex] = background; + } + + return this._backgrounds[monitorIndex]; + } + + destroy() { + let monitorManager = Meta.MonitorManager.get(); + monitorManager.disconnect(this._monitorsChangedId); + + for (let monitorIndex in this._backgrounds) { + let background = this._backgrounds[monitorIndex]; + background.disconnect(background._changedId); + background.destroy(); + } + + this._backgrounds = null; + } +}; + +var Animation = class Animation { + constructor(params) { + params = Params.parse(params, { file: null }); + + this.file = params.file; + this.keyFrameFiles = []; + this.transitionProgress = 0.0; + this.transitionDuration = 0.0; + this.loaded = false; + } + + load(callback) { + this._show = new GnomeDesktop.BGSlideShow({ filename: this.file.get_path() }); + + this._show.load_async(null, (object, result) => { + this.loaded = true; + if (callback) + callback(); + }); + } + + update(monitor) { + this.keyFrameFiles = []; + + if (!this._show) + return; + + if (this._show.get_num_slides() < 1) + return; + + let [progress, duration, isFixed, filename1, filename2] = this._show.get_current_slide(monitor.width, monitor.height); + + this.transitionDuration = duration; + this.transitionProgress = progress; + + if (filename1) + this.keyFrameFiles.push(Gio.File.new_for_path(filename1)); + + if (filename2) + this.keyFrameFiles.push(Gio.File.new_for_path(filename2)); + } +}; +Signals.addSignalMethods(Animation.prototype); + +var BackgroundManager = class BackgroundManager { + constructor(params) { + params = Params.parse(params, { container: null, + layoutManager: Main.layoutManager, + monitorIndex: null, + vignette: false, + controlPosition: true, + settingsSchema: BACKGROUND_SCHEMA }); + + let cache = getBackgroundCache(); + this._settingsSchema = params.settingsSchema; + this._backgroundSource = cache.getBackgroundSource(params.layoutManager, params.settingsSchema); + + this._container = params.container; + this._layoutManager = params.layoutManager; + this._vignette = params.vignette; + this._monitorIndex = params.monitorIndex; + this._controlPosition = params.controlPosition; + + this.backgroundActor = this._createBackgroundActor(); + this._newBackgroundActor = null; + } + + destroy() { + let cache = getBackgroundCache(); + cache.releaseBackgroundSource(this._settingsSchema); + this._backgroundSource = null; + + if (this._newBackgroundActor) { + this._newBackgroundActor.destroy(); + this._newBackgroundActor = null; + } + + if (this.backgroundActor) { + this.backgroundActor.destroy(); + this.backgroundActor = null; + } + } + + _swapBackgroundActor() { + let oldBackgroundActor = this.backgroundActor; + this.backgroundActor = this._newBackgroundActor; + this._newBackgroundActor = null; + this.emit('changed'); + + Tweener.addTween(oldBackgroundActor, + { opacity: 0, + time: FADE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete() { + oldBackgroundActor.background.run_dispose(); + oldBackgroundActor.destroy(); + } + }); + } + + _updateBackgroundActor() { + if (this._newBackgroundActor) { + /* Skip displaying existing background queued for load */ + this._newBackgroundActor.destroy(); + this._newBackgroundActor = null; + } + + let newBackgroundActor = this._createBackgroundActor(); + newBackgroundActor.vignette_sharpness = this.backgroundActor.vignette_sharpness; + newBackgroundActor.brightness = this.backgroundActor.brightness; + newBackgroundActor.visible = this.backgroundActor.visible; + + this._newBackgroundActor = newBackgroundActor; + + let background = newBackgroundActor.background._delegate; + + if (background.isLoaded) { + this._swapBackgroundActor(); + } else { + newBackgroundActor.loadedSignalId = background.connect('loaded', + () => { + background.disconnect(newBackgroundActor.loadedSignalId); + newBackgroundActor.loadedSignalId = 0; + + this._swapBackgroundActor(); + }); + } + } + + _createBackgroundActor() { + let background = this._backgroundSource.getBackground(this._monitorIndex); + let backgroundActor = new Meta.BackgroundActor({ meta_display: global.display, + monitor: this._monitorIndex, + background: background.background, + vignette: this._vignette, + vignette_sharpness: 0.5, + brightness: 0.5, + }); + + this._container.add_child(backgroundActor); + + if (this._controlPosition) { + let monitor = this._layoutManager.monitors[this._monitorIndex]; + backgroundActor.set_position(monitor.x, monitor.y); + backgroundActor.lower_bottom(); + } + + let changeSignalId = background.connect('changed', () => { + background.disconnect(changeSignalId); + changeSignalId = null; + this._updateBackgroundActor(); + }); + + backgroundActor.connect('destroy', () => { + if (changeSignalId) + background.disconnect(changeSignalId); + + if (backgroundActor.loadedSignalId) + background.disconnect(backgroundActor.loadedSignalId); + }); + + return backgroundActor; + } +}; +Signals.addSignalMethods(BackgroundManager.prototype); diff --git a/js/ui/backgroundMenu.js b/js/ui/backgroundMenu.js new file mode 100644 index 0000000..7d3941b --- /dev/null +++ b/js/ui/backgroundMenu.js @@ -0,0 +1,67 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, St } = imports.gi; + +const BoxPointer = imports.ui.boxpointer; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; + +var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu { + constructor(layoutManager) { + super(layoutManager.dummyCursor, 0, St.Side.TOP); + + this.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop'); + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop'); + this.addSettingsAction(_("Settings"), 'gnome-control-center.desktop'); + + this.actor.add_style_class_name('background-menu'); + + layoutManager.uiGroup.add_actor(this.actor); + this.actor.hide(); + } +}; + +function addBackgroundMenu(actor, layoutManager) { + actor.reactive = true; + actor._backgroundMenu = new BackgroundMenu(layoutManager); + actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor }); + actor._backgroundManager.addMenu(actor._backgroundMenu); + + function openMenu(x, y) { + Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0); + actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE); + } + + let clickAction = new Clutter.ClickAction(); + clickAction.connect('long-press', (action, actor, state) => { + if (state == Clutter.LongPressState.QUERY) + return ((action.get_button() == 0 || + action.get_button() == 1) && + !actor._backgroundMenu.isOpen); + if (state == Clutter.LongPressState.ACTIVATE) { + let [x, y] = action.get_coords(); + openMenu(x, y); + actor._backgroundManager.ignoreRelease(); + } + return true; + }); + clickAction.connect('clicked', action => { + if (action.get_button() == 3) { + let [x, y] = action.get_coords(); + openMenu(x, y); + } + }); + actor.add_action(clickAction); + + let grabOpBeginId = global.display.connect('grab-op-begin', () => { + clickAction.release(); + }); + + actor.connect('destroy', () => { + actor._backgroundMenu.destroy(); + actor._backgroundMenu = null; + actor._backgroundManager = null; + global.display.disconnect(grabOpBeginId); + }); +} diff --git a/js/ui/barLevel.js b/js/ui/barLevel.js new file mode 100644 index 0000000..c4072e2 --- /dev/null +++ b/js/ui/barLevel.js @@ -0,0 +1,206 @@ +/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ + +const { Atk, Clutter, St } = imports.gi; +const Signals = imports.signals; + +var BarLevel = class { + constructor(value, params) { + if (isNaN(value)) + // Avoid spreading NaNs around + throw TypeError('The bar level value must be a number'); + this._maxValue = 1; + this._value = Math.max(Math.min(value, this._maxValue), 0); + this._overdriveStart = 1; + this._barLevelWidth = 0; + + if (params == undefined) + params = {} + + this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel', + can_focus: params['canFocus'] || false, + reactive: params['reactive'] || false, + accessible_role: params['accessibleRole'] || Atk.Role.LEVEL_BAR }); + this.actor.connect('repaint', this._barLevelRepaint.bind(this)); + this.actor.connect('allocation-changed', (actor, box) => { + this._barLevelWidth = box.get_width(); + }); + + this._customAccessible = St.GenericAccessible.new_for_actor(this.actor); + this.actor.set_accessible(this._customAccessible); + + this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this)); + this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this)); + this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this)); + this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this)); + + this.connect('value-changed', this._valueChanged.bind(this)); + } + + setValue(value) { + if (isNaN(value)) + throw TypeError('The bar level value must be a number'); + + this._value = Math.max(Math.min(value, this._maxValue), 0); + this.actor.queue_repaint(); + } + + setMaximumValue(value) { + if (isNaN(value)) + throw TypeError('The bar level max value must be a number'); + + this._maxValue = Math.max(value, 1); + this._overdriveStart = Math.min(this._overdriveStart, this._maxValue); + this.actor.queue_repaint(); + } + + setOverdriveStart(value) { + if (isNaN(value)) + throw TypeError('The overdrive limit value must be a number'); + if (value > this._maxValue) + throw new Error(`Tried to set overdrive value to ${value}, ` + + `which is a number greater than the maximum allowed value ${this._maxValue}`); + + this._overdriveStart = value; + this._value = Math.max(Math.min(value, this._maxValue), 0); + this.actor.queue_repaint(); + } + + _barLevelRepaint(area) { + let cr = area.get_context(); + let themeNode = area.get_theme_node(); + let [width, height] = area.get_surface_size(); + + let barLevelHeight = themeNode.get_length('-barlevel-height'); + let barLevelBorderRadius = Math.min(width, barLevelHeight) / 2; + let fgColor = themeNode.get_foreground_color(); + + let barLevelColor = themeNode.get_color('-barlevel-background-color'); + let barLevelActiveColor = themeNode.get_color('-barlevel-active-background-color'); + let barLevelOverdriveColor = themeNode.get_color('-barlevel-overdrive-color'); + + let barLevelBorderWidth = Math.min(themeNode.get_length('-barlevel-border-width'), 1); + let [hasBorderColor, barLevelBorderColor] = + themeNode.lookup_color('-barlevel-border-color', false); + if (!hasBorderColor) + barLevelBorderColor = barLevelColor; + let [hasActiveBorderColor, barLevelActiveBorderColor] = + themeNode.lookup_color('-barlevel-active-border-color', false); + if (!hasActiveBorderColor) + barLevelActiveBorderColor = barLevelActiveColor; + let [hasOverdriveBorderColor, barLevelOverdriveBorderColor] = + themeNode.lookup_color('-barlevel-overdrive-border-color', false); + if (!hasOverdriveBorderColor) + barLevelOverdriveBorderColor = barLevelOverdriveColor; + + const TAU = Math.PI * 2; + + let endX = 0; + if (this._maxValue > 0) + endX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._value / this._maxValue; + + let overdriveSeparatorX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._overdriveStart / this._maxValue; + let overdriveActive = this._overdriveStart !== this._maxValue; + let overdriveSeparatorWidth = 0; + if (overdriveActive) + overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width'); + + /* background bar */ + cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4); + cr.lineTo(endX, (height + barLevelHeight) / 2); + cr.lineTo(endX, (height - barLevelHeight) / 2); + cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2); + Clutter.cairo_set_source_color(cr, barLevelColor); + cr.fillPreserve(); + Clutter.cairo_set_source_color(cr, barLevelBorderColor); + cr.setLineWidth(barLevelBorderWidth); + cr.stroke(); + + /* normal progress bar */ + let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2); + cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 1 / 4, TAU * 3 / 4); + cr.lineTo(x, (height - barLevelHeight) / 2); + cr.lineTo(x, (height + barLevelHeight) / 2); + cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2); + if (this._value > 0) + Clutter.cairo_set_source_color(cr, barLevelActiveColor); + cr.fillPreserve(); + Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor); + cr.setLineWidth(barLevelBorderWidth); + cr.stroke(); + + /* overdrive progress barLevel */ + x = Math.min(endX, overdriveSeparatorX) + overdriveSeparatorWidth / 2; + if (this._value > this._overdriveStart) { + cr.moveTo(x, (height - barLevelHeight) / 2); + cr.lineTo(endX, (height - barLevelHeight) / 2); + cr.lineTo(endX, (height + barLevelHeight) / 2); + cr.lineTo(x, (height + barLevelHeight) / 2); + cr.lineTo(x, (height - barLevelHeight) / 2); + Clutter.cairo_set_source_color(cr, barLevelOverdriveColor); + cr.fillPreserve(); + Clutter.cairo_set_source_color(cr, barLevelOverdriveBorderColor); + cr.setLineWidth(barLevelBorderWidth); + cr.stroke(); + } + + /* end progress bar arc */ + if (this._value > 0) { + if (this._value <= this._overdriveStart) + Clutter.cairo_set_source_color(cr, barLevelActiveColor); + else + Clutter.cairo_set_source_color(cr, barLevelOverdriveColor); + cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4); + cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2); + cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2); + cr.lineTo(endX, (height - barLevelHeight) / 2); + cr.fillPreserve(); + cr.setLineWidth(barLevelBorderWidth); + cr.stroke(); + } + + /* draw overdrive separator */ + if (overdriveActive) { + cr.moveTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2); + cr.lineTo(overdriveSeparatorX + overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2); + cr.lineTo(overdriveSeparatorX + overdriveSeparatorWidth / 2, (height + barLevelHeight) / 2); + cr.lineTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height + barLevelHeight) / 2); + cr.lineTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2); + if (this._value <= this._overdriveStart) + Clutter.cairo_set_source_color(cr, fgColor); + else + Clutter.cairo_set_source_color(cr, barLevelColor); + cr.fill(); + } + + cr.$dispose(); + } + + _getCurrentValue(actor) { + return this._value; + } + + _getOverdriveStart(actor) { + return this._overdriveStart; + } + + _getMinimumValue(actor) { + return 0; + } + + _getMaximumValue(actor) { + return this._maxValue; + } + + _setCurrentValue(actor, value) { + this._value = value; + } + + _valueChanged(barLevel, value, property) { + this._customAccessible.notify("accessible-value"); + } + + get value() { + return this._value; + } +}; +Signals.addSignalMethods(BarLevel.prototype); diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js new file mode 100644 index 0000000..c8e5ced --- /dev/null +++ b/js/ui/boxpointer.js @@ -0,0 +1,670 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, Meta, Shell, St } = imports.gi; + +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +var PopupAnimation = { + NONE: 0, + SLIDE: 1 << 0, + FADE: 1 << 1, + FULL: ~0, +}; + +var POPUP_ANIMATION_TIME = 0.15; + +/** + * BoxPointer: + * @side: side to draw the arrow on + * @binProperties: Properties to set on contained bin + * + * An actor which displays a triangle "arrow" pointing to a given + * side. The .bin property is a container in which content can be + * placed. The arrow position may be controlled via + * setArrowOrigin(). The arrow side might be temporarily flipped + * depending on the box size and source position to keep the box + * totally inside the monitor workarea if possible. + * + */ +var BoxPointer = GObject.registerClass({ + Signals: { 'arrow-side-changed': {} }, +}, class BoxPointer extends St.Widget { + _init(arrowSide, binProperties) { + super._init(); + + this.actor = this; + + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this._arrowSide = arrowSide; + this._userArrowSide = arrowSide; + this._arrowOrigin = 0; + this._arrowActor = null; + this.bin = new St.Bin(binProperties); + this.add_actor(this.bin); + this._border = new St.DrawingArea(); + this._border.connect('repaint', this._drawBorder.bind(this)); + this.add_actor(this._border); + this.bin.raise(this._border); + this._sourceAlignment = 0.5; + this._capturedEventId = 0; + this._muteInput(); + } + + get arrowSide() { + return this._arrowSide; + } + + _muteInput() { + if (this._capturedEventId == 0) + this._capturedEventId = this.connect('captured-event', + () => Clutter.EVENT_STOP); + } + + _unmuteInput() { + if (this._capturedEventId != 0) { + this.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + } + + // BoxPointer.show() and BoxPointer.hide() are here for only compatibility + // purposes, and will be removed in 3.32. + show(animate, onComplete) { + if (animate !== undefined) { + try { + throw new Error('BoxPointer.show() has been moved to BoxPointer.open(), this code will break in the future.'); + } catch(e) { + logError(e); + this.open(animate, onComplete); + return; + } + } + + this.visible = true; + } + + hide(animate, onComplete) { + if (animate !== undefined) { + try { + throw new Error('BoxPointer.hide() has been moved to BoxPointer.close(), this code will break in the future.'); + } catch(e) { + logError(e); + this.close(animate, onComplete); + return; + } + } + + this.visible = false; + } + + open(animate, onComplete) { + let themeNode = this.get_theme_node(); + let rise = themeNode.get_length('-arrow-rise'); + let animationTime = (animate & PopupAnimation.FULL) ? POPUP_ANIMATION_TIME : 0; + + if (animate & PopupAnimation.FADE) + this.opacity = 0; + else + this.opacity = 255; + + this.show(); + + if (animate & PopupAnimation.SLIDE) { + switch (this._arrowSide) { + case St.Side.TOP: + this.translation_y = -rise; + break; + case St.Side.BOTTOM: + this.translation_y = rise; + break; + case St.Side.LEFT: + this.translation_x = -rise; + break; + case St.Side.RIGHT: + this.translation_x = rise; + break; + } + } + + Tweener.addTween(this, { opacity: 255, + translation_x: 0, + translation_y: 0, + transition: 'linear', + onComplete: () => { + this._unmuteInput(); + if (onComplete) + onComplete(); + }, + time: animationTime }); + } + + close(animate, onComplete) { + if (!this.visible) + return; + + let translationX = 0; + let translationY = 0; + let themeNode = this.get_theme_node(); + let rise = themeNode.get_length('-arrow-rise'); + let fade = (animate & PopupAnimation.FADE); + let animationTime = (animate & PopupAnimation.FULL) ? POPUP_ANIMATION_TIME : 0; + + if (animate & PopupAnimation.SLIDE) { + switch (this._arrowSide) { + case St.Side.TOP: + translationY = rise; + break; + case St.Side.BOTTOM: + translationY = -rise; + break; + case St.Side.LEFT: + translationX = rise; + break; + case St.Side.RIGHT: + translationX = -rise; + break; + } + } + + this._muteInput(); + + Tweener.removeTweens(this); + Tweener.addTween(this, { opacity: fade ? 0 : 255, + translation_x: translationX, + translation_y: translationY, + transition: 'linear', + time: animationTime, + onComplete: () => { + this.hide(); + this.opacity = 0; + this.translation_x = 0; + this.translation_y = 0; + if (onComplete) + onComplete(); + } + }); + } + + _adjustAllocationForArrow(isWidth, minSize, natSize) { + let themeNode = this.get_theme_node(); + let borderWidth = themeNode.get_length('-arrow-border-width'); + minSize += borderWidth * 2; + natSize += borderWidth * 2; + if ((!isWidth && (this._arrowSide == St.Side.TOP || this._arrowSide == St.Side.BOTTOM)) + || (isWidth && (this._arrowSide == St.Side.LEFT || this._arrowSide == St.Side.RIGHT))) { + let rise = themeNode.get_length('-arrow-rise'); + minSize += rise; + natSize += rise; + } + + return [minSize, natSize]; + } + + vfunc_get_preferred_width(forHeight) { + let themeNode = this.get_theme_node(); + forHeight = themeNode.adjust_for_height(forHeight); + + let width = this.bin.get_preferred_width(forHeight); + width = this._adjustAllocationForArrow(true, ...width); + + return themeNode.adjust_preferred_width(...width); + } + + vfunc_get_preferred_height(forWidth) { + let themeNode = this.get_theme_node(); + let borderWidth = themeNode.get_length('-arrow-border-width'); + forWidth = themeNode.adjust_for_width(forWidth); + + let height = this.bin.get_preferred_height(forWidth - 2 * borderWidth); + height = this._adjustAllocationForArrow(false, ...height); + + return themeNode.adjust_preferred_height(...height); + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let themeNode = this.get_theme_node(); + box = themeNode.get_content_box(box); + + let borderWidth = themeNode.get_length('-arrow-border-width'); + let rise = themeNode.get_length('-arrow-rise'); + let childBox = new Clutter.ActorBox(); + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + + childBox.x1 = 0; + childBox.y1 = 0; + childBox.x2 = availWidth; + childBox.y2 = availHeight; + this._border.allocate(childBox, flags); + + childBox.x1 = borderWidth; + childBox.y1 = borderWidth; + childBox.x2 = availWidth - borderWidth; + childBox.y2 = availHeight - borderWidth; + switch (this._arrowSide) { + case St.Side.TOP: + childBox.y1 += rise; + break; + case St.Side.BOTTOM: + childBox.y2 -= rise; + break; + case St.Side.LEFT: + childBox.x1 += rise; + break; + case St.Side.RIGHT: + childBox.x2 -= rise; + break; + } + this.bin.allocate(childBox, flags); + + if (this._sourceActor && this._sourceActor.mapped) { + this._reposition(); + this._updateFlip(); + } + } + + _drawBorder(area) { + let themeNode = this.get_theme_node(); + + if (this._arrowActor) { + let [sourceX, sourceY] = this._arrowActor.get_transformed_position(); + let [sourceWidth, sourceHeight] = this._arrowActor.get_transformed_size(); + let [absX, absY] = this.get_transformed_position(); + + if (this._arrowSide == St.Side.TOP || + this._arrowSide == St.Side.BOTTOM) { + this._arrowOrigin = sourceX - absX + sourceWidth / 2; + } else { + this._arrowOrigin = sourceY - absY + sourceHeight / 2; + } + } + + let borderWidth = themeNode.get_length('-arrow-border-width'); + let base = themeNode.get_length('-arrow-base'); + let rise = themeNode.get_length('-arrow-rise'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + + let halfBorder = borderWidth / 2; + let halfBase = Math.floor(base/2); + + let backgroundColor = themeNode.get_color('-arrow-background-color'); + + let [width, height] = area.get_surface_size(); + let [boxWidth, boxHeight] = [width, height]; + if (this._arrowSide == St.Side.TOP || this._arrowSide == St.Side.BOTTOM) { + boxHeight -= rise; + } else { + boxWidth -= rise; + } + let cr = area.get_context(); + + // Translate so that box goes from 0,0 to boxWidth,boxHeight, + // with the arrow poking out of that + if (this._arrowSide == St.Side.TOP) { + cr.translate(0, rise); + } else if (this._arrowSide == St.Side.LEFT) { + cr.translate(rise, 0); + } + + let [x1, y1] = [halfBorder, halfBorder]; + let [x2, y2] = [boxWidth - halfBorder, boxHeight - halfBorder]; + + let skipTopLeft = false; + let skipTopRight = false; + let skipBottomLeft = false; + let skipBottomRight = false; + + if (rise) { + switch (this._arrowSide) { + case St.Side.TOP: + if (this._arrowOrigin == x1) + skipTopLeft = true; + else if (this._arrowOrigin == x2) + skipTopRight = true; + break; + + case St.Side.RIGHT: + if (this._arrowOrigin == y1) + skipTopRight = true; + else if (this._arrowOrigin == y2) + skipBottomRight = true; + break; + + case St.Side.BOTTOM: + if (this._arrowOrigin == x1) + skipBottomLeft = true; + else if (this._arrowOrigin == x2) + skipBottomRight = true; + break; + + case St.Side.LEFT: + if (this._arrowOrigin == y1) + skipTopLeft = true; + else if (this._arrowOrigin == y2) + skipBottomLeft = true; + break; + } + } + + cr.moveTo(x1 + borderRadius, y1); + if (this._arrowSide == St.Side.TOP && rise) { + if (skipTopLeft) { + cr.moveTo(x1, y2 - borderRadius); + cr.lineTo(x1, y1 - rise); + cr.lineTo(x1 + halfBase, y1); + } else if (skipTopRight) { + cr.lineTo(x2 - halfBase, y1); + cr.lineTo(x2, y1 - rise); + cr.lineTo(x2, y1 + borderRadius); + } else { + cr.lineTo(this._arrowOrigin - halfBase, y1); + cr.lineTo(this._arrowOrigin, y1 - rise); + cr.lineTo(this._arrowOrigin + halfBase, y1); + } + } + + if (!skipTopRight) { + cr.lineTo(x2 - borderRadius, y1); + cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius, + 3*Math.PI/2, Math.PI*2); + } + + if (this._arrowSide == St.Side.RIGHT && rise) { + if (skipTopRight) { + cr.lineTo(x2 + rise, y1); + cr.lineTo(x2 + rise, y1 + halfBase); + } else if (skipBottomRight) { + cr.lineTo(x2, y2 - halfBase); + cr.lineTo(x2 + rise, y2); + cr.lineTo(x2 - borderRadius, y2); + } else { + cr.lineTo(x2, this._arrowOrigin - halfBase); + cr.lineTo(x2 + rise, this._arrowOrigin); + cr.lineTo(x2, this._arrowOrigin + halfBase); + } + } + + if (!skipBottomRight) { + cr.lineTo(x2, y2 - borderRadius); + cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius, + 0, Math.PI/2); + } + + if (this._arrowSide == St.Side.BOTTOM && rise) { + if (skipBottomLeft) { + cr.lineTo(x1 + halfBase, y2); + cr.lineTo(x1, y2 + rise); + cr.lineTo(x1, y2 - borderRadius); + } else if (skipBottomRight) { + cr.lineTo(x2, y2 + rise); + cr.lineTo(x2 - halfBase, y2); + } else { + cr.lineTo(this._arrowOrigin + halfBase, y2); + cr.lineTo(this._arrowOrigin, y2 + rise); + cr.lineTo(this._arrowOrigin - halfBase, y2); + } + } + + if (!skipBottomLeft) { + cr.lineTo(x1 + borderRadius, y2); + cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius, + Math.PI/2, Math.PI); + } + + if (this._arrowSide == St.Side.LEFT && rise) { + if (skipTopLeft) { + cr.lineTo(x1, y1 + halfBase); + cr.lineTo(x1 - rise, y1); + cr.lineTo(x1 + borderRadius, y1); + } else if (skipBottomLeft) { + cr.lineTo(x1 - rise, y2) + cr.lineTo(x1 - rise, y2 - halfBase); + } else { + cr.lineTo(x1, this._arrowOrigin + halfBase); + cr.lineTo(x1 - rise, this._arrowOrigin); + cr.lineTo(x1, this._arrowOrigin - halfBase); + } + } + + if (!skipTopLeft) { + cr.lineTo(x1, y1 + borderRadius); + cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius, + Math.PI, 3*Math.PI/2); + } + + Clutter.cairo_set_source_color(cr, backgroundColor); + cr.fillPreserve(); + + if (borderWidth > 0) { + let borderColor = themeNode.get_color('-arrow-border-color'); + Clutter.cairo_set_source_color(cr, borderColor); + cr.setLineWidth(borderWidth); + cr.stroke(); + } + + cr.$dispose(); + } + + setPosition(sourceActor, alignment) { + // We need to show it now to force an allocation, + // so that we can query the correct size. + this.show(); + + this._sourceActor = sourceActor; + this._arrowAlignment = alignment; + + this._reposition(); + this._updateFlip(); + } + + setSourceAlignment(alignment) { + this._sourceAlignment = alignment; + + if (!this._sourceActor) + return; + + this.setPosition(this._sourceActor, this._arrowAlignment); + } + + _reposition() { + let sourceActor = this._sourceActor; + let alignment = this._arrowAlignment; + let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor); + + this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor); + this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + + // Position correctly relative to the sourceActor + let sourceNode = sourceActor.get_theme_node(); + let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box()); + let sourceAllocation = this._sourceAllocation; + let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment; + let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment; + let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size(); + + // We also want to keep it onscreen, and separated from the + // edge by the same distance as the main part of the box is + // separated from its sourceActor + let workarea = this._workArea; + let themeNode = this.get_theme_node(); + let borderWidth = themeNode.get_length('-arrow-border-width'); + let arrowBase = themeNode.get_length('-arrow-base'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let margin = (4 * borderRadius + borderWidth + arrowBase); + + let gap = themeNode.get_length('-boxpointer-gap'); + let padding = themeNode.get_length('-arrow-rise'); + + let resX, resY; + + switch (this._arrowSide) { + case St.Side.TOP: + resY = sourceAllocation.y2 + gap; + break; + case St.Side.BOTTOM: + resY = sourceAllocation.y1 - natHeight - gap; + break; + case St.Side.LEFT: + resX = sourceAllocation.x2 + gap; + break; + case St.Side.RIGHT: + resX = sourceAllocation.x1 - natWidth - gap; + break; + } + + // Now align and position the pointing axis, making sure it fits on + // screen. If the arrowOrigin is so close to the edge that the arrow + // will not be isosceles, we try to compensate as follows: + // - We skip the rounded corner and settle for a right angled arrow + // as shown below. See _drawBorder for further details. + // |\_____ + // | + // | + // - If the arrow was going to be acute angled, we move the position + // of the box to maintain the arrow's accuracy. + + let arrowOrigin; + let halfBase = Math.floor(arrowBase/2); + let halfBorder = borderWidth / 2; + let halfMargin = margin / 2; + let [x1, y1] = [halfBorder, halfBorder]; + let [x2, y2] = [natWidth - halfBorder, natHeight - halfBorder]; + + switch (this._arrowSide) { + case St.Side.TOP: + case St.Side.BOTTOM: + resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment); + + resX = Math.max(resX, workarea.x + padding); + resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth)); + + arrowOrigin = sourceCenterX - resX; + if (arrowOrigin <= (x1 + (borderRadius + halfBase))) { + if (arrowOrigin > x1) + resX += (arrowOrigin - x1); + arrowOrigin = x1; + } else if (arrowOrigin >= (x2 - (borderRadius + halfBase))) { + if (arrowOrigin < x2) + resX -= (x2 - arrowOrigin); + arrowOrigin = x2; + } + break; + + case St.Side.LEFT: + case St.Side.RIGHT: + resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment); + + resY = Math.max(resY, workarea.y + padding); + resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight)); + + arrowOrigin = sourceCenterY - resY; + if (arrowOrigin <= (y1 + (borderRadius + halfBase))) { + if (arrowOrigin > y1) + resY += (arrowOrigin - y1); + arrowOrigin = y1; + } else if (arrowOrigin >= (y2 - (borderRadius + halfBase))) { + if (arrowOrigin < y2) + resX -= (y2 - arrowOrigin); + arrowOrigin = y2; + } + break; + } + + this.setArrowOrigin(arrowOrigin); + + let parent = this.get_parent(); + let success, x, y; + while (!success) { + [success, x, y] = parent.transform_stage_point(resX, resY); + parent = parent.get_parent(); + } + + // Actually set the position + this.x = Math.floor(x); + this.y = Math.floor(y); + } + + // @origin: Coordinate specifying middle of the arrow, along + // the Y axis for St.Side.LEFT, St.Side.RIGHT from the top and X axis from + // the left for St.Side.TOP and St.Side.BOTTOM. + setArrowOrigin(origin) { + if (this._arrowOrigin != origin) { + this._arrowOrigin = origin; + this._border.queue_repaint(); + } + } + + // @actor: an actor relative to which the arrow is positioned. + // Differently from setPosition, this will not move the boxpointer itself, + // on the arrow + setArrowActor(actor) { + if (this._arrowActor != actor) { + this._arrowActor = actor; + this._border.queue_repaint(); + } + } + + _calculateArrowSide(arrowSide) { + let sourceAllocation = this._sourceAllocation; + let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size(); + let workarea = this._workArea; + + switch (arrowSide) { + case St.Side.TOP: + if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height && + boxHeight < sourceAllocation.y1 - workarea.y) + return St.Side.BOTTOM; + break; + case St.Side.BOTTOM: + if (sourceAllocation.y1 - boxHeight < workarea.y && + boxHeight < workarea.y + workarea.height - sourceAllocation.y2) + return St.Side.TOP; + break; + case St.Side.LEFT: + if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width && + boxWidth < sourceAllocation.x1 - workarea.x) + return St.Side.RIGHT; + break; + case St.Side.RIGHT: + if (sourceAllocation.x1 - boxWidth < workarea.x && + boxWidth < workarea.x + workarea.width - sourceAllocation.x2) + return St.Side.LEFT; + break; + } + + return arrowSide; + } + + _updateFlip() { + let arrowSide = this._calculateArrowSide(this._userArrowSide); + if (this._arrowSide != arrowSide) { + this._arrowSide = arrowSide; + this._reposition(); + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this.queue_relayout(); + return false; + }); + + this.emit('arrow-side-changed'); + } + } + + updateArrowSide(side) { + this._arrowSide = side; + this._border.queue_repaint(); + + this.emit('arrow-side-changed'); + } + + getPadding(side) { + return this.bin.get_theme_node().get_padding(side); + } + + getArrowHeight() { + return this.get_theme_node().get_length('-arrow-rise'); + } +}); diff --git a/js/ui/calendar.js b/js/ui/calendar.js new file mode 100644 index 0000000..cd3e879 --- /dev/null +++ b/js/ui/calendar.js @@ -0,0 +1,1169 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const MessageList = imports.ui.messageList; +const MessageTray = imports.ui.messageTray; +const Mpris = imports.ui.mpris; +const Util = imports.misc.util; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +var MSECS_IN_DAY = 24 * 60 * 60 * 1000; +var SHOW_WEEKDATE_KEY = 'show-weekdate'; +var ELLIPSIS_CHAR = '\u2026'; + +var MESSAGE_ICON_SIZE = -1; // pick up from CSS + +var NC_ = (context, str) => context + '\u0004' + str; + +function sameYear(dateA, dateB) { + return (dateA.getYear() == dateB.getYear()); +} + +function sameMonth(dateA, dateB) { + return sameYear(dateA, dateB) && (dateA.getMonth() == dateB.getMonth()); +} + +function sameDay(dateA, dateB) { + return sameMonth(dateA, dateB) && (dateA.getDate() == dateB.getDate()); +} + +function isToday(date) { + return sameDay(new Date(), date); +} + +function _isWorkDay(date) { + /* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */ + let days = C_('calendar-no-work', "06"); + return days.indexOf(date.getDay().toString()) == -1; +} + +function _getBeginningOfDay(date) { + let ret = new Date(date.getTime()); + ret.setHours(0); + ret.setMinutes(0); + ret.setSeconds(0); + ret.setMilliseconds(0); + return ret; +} + +function _getEndOfDay(date) { + let ret = new Date(date.getTime()); + ret.setHours(23); + ret.setMinutes(59); + ret.setSeconds(59); + ret.setMilliseconds(999); + return ret; +} + +function _getCalendarDayAbbreviation(dayNumber) { + let abbreviations = [ + /* Translators: Calendar grid abbreviation for Sunday. + * + * NOTE: These grid abbreviations are always shown together + * and in order, e.g. "S M T W T F S". + */ + NC_("grid sunday", "S"), + /* Translators: Calendar grid abbreviation for Monday */ + NC_("grid monday", "M"), + /* Translators: Calendar grid abbreviation for Tuesday */ + NC_("grid tuesday", "T"), + /* Translators: Calendar grid abbreviation for Wednesday */ + NC_("grid wednesday", "W"), + /* Translators: Calendar grid abbreviation for Thursday */ + NC_("grid thursday", "T"), + /* Translators: Calendar grid abbreviation for Friday */ + NC_("grid friday", "F"), + /* Translators: Calendar grid abbreviation for Saturday */ + NC_("grid saturday", "S") + ]; + return Shell.util_translate_time_string(abbreviations[dayNumber]); +} + +// Abstraction for an appointment/event in a calendar + +var CalendarEvent = class CalendarEvent { + constructor(id, date, end, summary, allDay) { + this.id = id; + this.date = date; + this.end = end; + this.summary = summary; + this.allDay = allDay; + } +}; + +// Interface for appointments/events - e.g. the contents of a calendar +// + +// First, an implementation with no events +var EmptyEventSource = class EmptyEventSource { + constructor() { + this.isLoading = false; + this.isDummy = true; + this.hasCalendars = false; + } + + destroy() { + } + + requestRange(begin, end) { + } + + getEvents(begin, end) { + let result = []; + return result; + } + + hasEvents(day) { + return false; + } +}; +Signals.addSignalMethods(EmptyEventSource.prototype); + +const CalendarServerIface = loadInterfaceXML('org.gnome.Shell.CalendarServer'); + +const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface); + +function CalendarServer() { + return new Gio.DBusProxy({ g_connection: Gio.DBus.session, + g_interface_name: CalendarServerInfo.name, + g_interface_info: CalendarServerInfo, + g_name: 'org.gnome.Shell.CalendarServer', + g_object_path: '/org/gnome/Shell/CalendarServer' }); +} + +function _datesEqual(a, b) { + if (a < b) + return false; + else if (a > b) + return false; + return true; +} + +function _dateIntervalsOverlap(a0, a1, b0, b1) +{ + if (a1 <= b0) + return false; + else if (b1 <= a0) + return false; + else + return true; +} + +// an implementation that reads data from a session bus service +var DBusEventSource = class DBusEventSource { + constructor() { + this._resetCache(); + this.isLoading = false; + this.isDummy = false; + + this._initialized = false; + this._dbusProxy = new CalendarServer(); + this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, (object, result) => { + let loaded = false; + + try { + this._dbusProxy.init_finish(result); + loaded = true; + } catch(e) { + if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) { + // Ignore timeouts and install signals as normal, because with high + // probability the service will appear later on, and we will get a + // NameOwnerChanged which will finish loading + // + // (But still _initialized to false, because the proxy does not know + // about the HasCalendars property and would cause an exception trying + // to read it) + } else { + log('Error loading calendars: ' + e.message); + return; + } + } + + this._dbusProxy.connectSignal('Changed', this._onChanged.bind(this)); + + this._dbusProxy.connect('notify::g-name-owner', () => { + if (this._dbusProxy.g_name_owner) + this._onNameAppeared(); + else + this._onNameVanished(); + }); + + this._dbusProxy.connect('g-properties-changed', () => { + this.emit('notify::has-calendars'); + }); + + this._initialized = loaded; + if (loaded) { + this.emit('notify::has-calendars'); + this._onNameAppeared(); + } + }); + } + + destroy() { + this._dbusProxy.run_dispose(); + } + + get hasCalendars() { + if (this._initialized) + return this._dbusProxy.HasCalendars; + else + return false; + } + + _resetCache() { + this._events = []; + this._lastRequestBegin = null; + this._lastRequestEnd = null; + } + + _onNameAppeared(owner) { + this._initialized = true; + this._resetCache(); + this._loadEvents(true); + } + + _onNameVanished(oldOwner) { + this._resetCache(); + this.emit('changed'); + } + + _onChanged() { + this._loadEvents(false); + } + + _onEventsReceived(results, error) { + let newEvents = []; + let appointments = results ? results[0] : null; + if (appointments != null) { + for (let n = 0; n < appointments.length; n++) { + let a = appointments[n]; + let date = new Date(a[4] * 1000); + let end = new Date(a[5] * 1000); + let id = a[0]; + let summary = a[1]; + let allDay = a[3]; + let event = new CalendarEvent(id, date, end, summary, allDay); + newEvents.push(event); + } + newEvents.sort((ev1, ev2) => ev1.date.getTime() - ev2.date.getTime()); + } + + this._events = newEvents; + this.isLoading = false; + this.emit('changed'); + } + + _loadEvents(forceReload) { + // Ignore while loading + if (!this._initialized) + return; + + if (this._curRequestBegin && this._curRequestEnd){ + this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000, + this._curRequestEnd.getTime() / 1000, + forceReload, + this._onEventsReceived.bind(this), + Gio.DBusCallFlags.NONE); + } + } + + requestRange(begin, end) { + if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) { + this.isLoading = true; + this._lastRequestBegin = begin; + this._lastRequestEnd = end; + this._curRequestBegin = begin; + this._curRequestEnd = end; + this._loadEvents(false); + } + } + + getEvents(begin, end) { + let result = []; + for(let n = 0; n < this._events.length; n++) { + let event = this._events[n]; + + if (_dateIntervalsOverlap (event.date, event.end, begin, end)) { + result.push(event); + } + } + result.sort((event1, event2) => { + // sort events by end time on ending day + let d1 = event1.date < begin && event1.end <= end ? event1.end : event1.date; + let d2 = event2.date < begin && event2.end <= end ? event2.end : event2.date; + return d1.getTime() - d2.getTime(); + }); + return result; + } + + hasEvents(day) { + let dayBegin = _getBeginningOfDay(day); + let dayEnd = _getEndOfDay(day); + + let events = this.getEvents(dayBegin, dayEnd); + + if (events.length == 0) + return false; + + return true; + } +}; +Signals.addSignalMethods(DBusEventSource.prototype); + +var Calendar = class Calendar { + constructor() { + this._weekStart = Shell.util_get_week_start(); + this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' }); + + this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, this._onSettingsChange.bind(this)); + this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY); + + /** + * 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(); + + this._shouldDateGrabFocus = false; + + this.actor = new St.Widget({ style_class: 'calendar', + layout_manager: new Clutter.TableLayout(), + reactive: true }); + + this.actor.connect('scroll-event', + this._onScroll.bind(this)); + + this._buildHeader (); + } + + // @eventSource: is an object implementing the EventSource API, e.g. the + // requestRange(), getEvents(), hasEvents() methods and the ::changed signal. + setEventSource(eventSource) { + this._eventSource = eventSource; + this._eventSource.connect('changed', () => { + this._rebuildCalendar(); + this._update(); + }); + this._rebuildCalendar(); + this._update(); + } + + // Sets the calendar to show a specific date + setDate(date) { + if (sameDay(date, this._selectedDate)) + return; + + this._selectedDate = date; + this._update(); + this.emit('selected-date-changed', new Date(this._selectedDate)); + } + + updateTimeZone() { + // The calendar need to be rebuilt after a time zone update because + // the date might have changed. + this._rebuildCalendar(); + this._update(); + } + + _buildHeader() { + let layout = this.actor.layout_manager; + let offsetCols = this._useWeekdate ? 1 : 0; + this.actor.destroy_all_children(); + + // Top line of the calendar '<| September 2009 |>' + this._topBox = new St.BoxLayout(); + layout.pack(this._topBox, 0, 0); + layout.set_span(this._topBox, offsetCols + 7, 1); + + this._backButton = new St.Button({ style_class: 'calendar-change-month-back pager-button', + accessible_name: _("Previous month"), + can_focus: true }); + this._backButton.add_actor(new St.Icon({ icon_name: 'pan-start-symbolic' })); + this._topBox.add(this._backButton); + this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this)); + + this._monthLabel = new St.Label({style_class: 'calendar-month-label', + can_focus: true }); + this._topBox.add(this._monthLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE }); + + this._forwardButton = new St.Button({ style_class: 'calendar-change-month-forward pager-button', + accessible_name: _("Next month"), + can_focus: true }); + this._forwardButton.add_actor(new St.Icon({ icon_name: 'pan-end-symbolic' })); + this._topBox.add(this._forwardButton); + this._forwardButton.connect('clicked', this._onNextMonthButtonClicked.bind(this)); + + // Add weekday labels... + // + // We need to figure out the abbreviated localized names for the days of the week; + // we do this by just getting the next 7 days starting from right now and then putting + // them in the right cell in the table. It doesn't matter if we add them in order + let iter = new Date(this._selectedDate); + iter.setSeconds(0); // Leap second protection. Hah! + iter.setHours(12); + for (let i = 0; i < 7; i++) { + // Could use iter.toLocaleFormat('%a') but that normally gives three characters + // and we want, ideally, a single character for e.g. S M T W T F S + let customDayAbbrev = _getCalendarDayAbbreviation(iter.getDay()); + let label = new St.Label({ style_class: 'calendar-day-base calendar-day-heading', + text: customDayAbbrev, + can_focus: true }); + label.accessible_name = iter.toLocaleFormat('%A'); + let col; + if (this.actor.get_text_direction() == Clutter.TextDirection.RTL) + col = 6 - (7 + iter.getDay() - this._weekStart) % 7; + else + col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7; + layout.pack(label, col, 1); + iter.setTime(iter.getTime() + MSECS_IN_DAY); + } + + // All the children after this are days, and get removed when we update the calendar + this._firstDayIndex = this.actor.get_n_children(); + } + + _onScroll(actor, event) { + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + this._onPrevMonthButtonClicked(); + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + this._onNextMonthButtonClicked(); + break; + } + return Clutter.EVENT_PROPAGATE; + } + + _onPrevMonthButtonClicked() { + let newDate = new Date(this._selectedDate); + let oldMonth = newDate.getMonth(); + if (oldMonth == 0) { + newDate.setMonth(11); + newDate.setFullYear(newDate.getFullYear() - 1); + if (newDate.getMonth() != 11) { + let day = 32 - new Date(newDate.getFullYear() - 1, 11, 32).getDate(); + newDate = new Date(newDate.getFullYear() - 1, 11, day); + } + } + else { + newDate.setMonth(oldMonth - 1); + if (newDate.getMonth() != oldMonth - 1) { + let day = 32 - new Date(newDate.getFullYear(), oldMonth - 1, 32).getDate(); + newDate = new Date(newDate.getFullYear(), oldMonth - 1, day); + } + } + + this._backButton.grab_key_focus(); + + this.setDate(newDate); + } + + _onNextMonthButtonClicked() { + let newDate = new Date(this._selectedDate); + let oldMonth = newDate.getMonth(); + if (oldMonth == 11) { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + if (newDate.getMonth() != 0) { + let day = 32 - new Date(newDate.getFullYear() + 1, 0, 32).getDate(); + newDate = new Date(newDate.getFullYear() + 1, 0, day); + } + } + else { + newDate.setMonth(oldMonth + 1); + if (newDate.getMonth() != oldMonth + 1) { + let day = 32 - new Date(newDate.getFullYear(), oldMonth + 1, 32).getDate(); + newDate = new Date(newDate.getFullYear(), oldMonth + 1, day); + } + } + + this._forwardButton.grab_key_focus(); + + this.setDate(newDate); + } + + _onSettingsChange() { + this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY); + this._buildHeader(); + this._rebuildCalendar(); + this._update(); + } + + _rebuildCalendar() { + let now = new Date(); + + // Remove everything but the topBox and the weekday labels + let children = this.actor.get_children(); + for (let i = this._firstDayIndex; i < children.length; i++) + children[i].destroy(); + + this._buttons = []; + + // Start at the beginning of the week before the start of the month + // + // We want to show always 6 weeks (to keep the calendar menu at the same + // height if there are no events), so we pad it according to the following + // policy: + // + // 1 - If a month has 6 weeks, we place no padding (example: Dec 2012) + // 2 - If a month has 5 weeks and it starts on week start, we pad one week + // before it (example: Apr 2012) + // 3 - If a month has 5 weeks and it starts on any other day, we pad one week + // after it (example: Nov 2012) + // 4 - If a month has 4 weeks, we pad one week before and one after it + // (example: Feb 2010) + // + // Actually computing the number of weeks is complex, but we know that the + // problematic categories (2 and 4) always start on week start, and that + // all months at the end have 6 weeks. + let beginDate = new Date(this._selectedDate); + beginDate.setDate(1); + beginDate.setSeconds(0); + beginDate.setHours(12); + + this._calendarBegin = new Date(beginDate); + this._markedAsToday = now; + + let year = beginDate.getYear(); + + let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7; + let startsOnWeekStart = daysToWeekStart == 0; + let weekPadding = startsOnWeekStart ? 7 : 0; + + beginDate.setTime(beginDate.getTime() - (weekPadding + daysToWeekStart) * MSECS_IN_DAY); + + let layout = this.actor.layout_manager; + let iter = new Date(beginDate); + let row = 2; + // nRows here means 6 weeks + one header + one navbar + let nRows = 8; + while (row < 8) { + // xgettext:no-javascript-format + let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")), + can_focus: true }); + let rtl = button.get_text_direction() == Clutter.TextDirection.RTL; + + if (this._eventSource.isDummy) + button.reactive = false; + + button._date = new Date(iter); + button.connect('clicked', () => { + this._shouldDateGrabFocus = true; + this.setDate(button._date); + this._shouldDateGrabFocus = false; + }); + + let hasEvents = this._eventSource.hasEvents(iter); + let styleClass = 'calendar-day-base calendar-day'; + + if (_isWorkDay(iter)) + styleClass += ' calendar-work-day'; + else + styleClass += ' calendar-nonwork-day'; + + // Hack used in lieu of border-collapse - see gnome-shell.css + if (row == 2) + styleClass = 'calendar-day-top ' + styleClass; + + let leftMost = rtl ? iter.getDay() == (this._weekStart + 6) % 7 + : iter.getDay() == this._weekStart; + if (leftMost) + styleClass = 'calendar-day-left ' + styleClass; + + if (sameDay(now, iter)) + styleClass += ' calendar-today'; + else if (iter.getMonth() != this._selectedDate.getMonth()) + styleClass += ' calendar-other-month-day'; + + if (hasEvents) + styleClass += ' calendar-day-with-events'; + + button.style_class = styleClass; + + let offsetCols = this._useWeekdate ? 1 : 0; + let col; + if (rtl) + col = 6 - (7 + iter.getDay() - this._weekStart) % 7; + else + col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7; + layout.pack(button, col, row); + + this._buttons.push(button); + + if (this._useWeekdate && iter.getDay() == 4) { + let label = new St.Label({ text: iter.toLocaleFormat('%V'), + style_class: 'calendar-day-base calendar-week-number', + can_focus: true }); + let weekFormat = Shell.util_translate_time_string(N_("Week %V")); + label.accessible_name = iter.toLocaleFormat(weekFormat); + layout.pack(label, rtl ? 7 : 0, row); + } + + iter.setTime(iter.getTime() + MSECS_IN_DAY); + + if (iter.getDay() == this._weekStart) + row++; + } + + // Signal to the event source that we are interested in events + // only from this date range + this._eventSource.requestRange(beginDate, iter); + } + + _update() { + let now = new Date(); + + if (sameYear(this._selectedDate, now)) + this._monthLabel.text = this._selectedDate.toLocaleFormat(this._headerFormatWithoutYear); + else + this._monthLabel.text = this._selectedDate.toLocaleFormat(this._headerFormat); + + if (!this._calendarBegin || !sameMonth(this._selectedDate, this._calendarBegin) || !sameDay(now, this._markedAsToday)) + this._rebuildCalendar(); + + this._buttons.forEach(button => { + if (sameDay(button._date, this._selectedDate)) { + button.add_style_pseudo_class('selected'); + if (this._shouldDateGrabFocus) + button.grab_key_focus(); + } + else + button.remove_style_pseudo_class('selected'); + }); + } +}; +Signals.addSignalMethods(Calendar.prototype); + +var EventMessage = class EventMessage extends MessageList.Message { + constructor(event, date) { + super('', event.summary); + + this._event = event; + this._date = date; + + this.setTitle(this._formatEventTime()); + + this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' }); + this.setIcon(this._icon); + + this.actor.connect('style-changed', () => { + let iconVisible = this.actor.get_parent().has_style_pseudo_class('first-child'); + this._icon.opacity = (iconVisible ? 255 : 0); + }); + } + + _formatEventTime() { + let periodBegin = _getBeginningOfDay(this._date); + let periodEnd = _getEndOfDay(this._date); + let allDay = (this._event.allDay || (this._event.date <= periodBegin && + this._event.end >= periodEnd)); + let title; + if (allDay) { + /* Translators: Shown in calendar event list for all day events + * Keep it short, best if you can use less then 10 characters + */ + title = C_("event list time", "All Day"); + } else { + let date = this._event.date >= periodBegin ? this._event.date + : this._event.end; + title = Util.formatTime(date, { timeOnly: true }); + } + + let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; + if (this._event.date < periodBegin && !this._event.allDay) { + if (rtl) + title = title + ELLIPSIS_CHAR; + else + title = ELLIPSIS_CHAR + title; + } + if (this._event.end > periodEnd && !this._event.allDay) { + if (rtl) + title = ELLIPSIS_CHAR + title; + else + title = title + ELLIPSIS_CHAR; + } + return title; + } +}; + +var NotificationMessage = +class NotificationMessage extends MessageList.Message { + constructor(notification) { + super(notification.title, notification.bannerBodyText); + this.setUseBodyMarkup(notification.bannerBodyMarkup); + + this.notification = notification; + + this.setIcon(this._getIcon()); + + this.connect('close', () => { + this._closed = true; + if (this.notification) + this.notification.destroy(MessageTray.NotificationDestroyedReason.DISMISSED); + }); + this._destroyId = notification.connect('destroy', () => { + this._disconnectNotificationSignals(); + this.notification = null; + if (!this._closed) + this.close(); + }); + this._updatedId = notification.connect('updated', + this._onUpdated.bind(this)); + } + + _getIcon() { + if (this.notification.gicon) + return new St.Icon({ gicon: this.notification.gicon, + icon_size: MESSAGE_ICON_SIZE }); + else + return this.notification.source.createIcon(MESSAGE_ICON_SIZE); + } + + _onUpdated(n, clear) { + this.setIcon(this._getIcon()); + this.setTitle(n.title); + this.setBody(n.bannerBodyText); + this.setUseBodyMarkup(n.bannerBodyMarkup); + } + + _onClicked() { + this.notification.activate(); + } + + _onDestroy() { + super._onDestroy(); + this._disconnectNotificationSignals(); + } + + _disconnectNotificationSignals() { + if (this._updatedId) + this.notification.disconnect(this._updatedId); + this._updatedId = 0; + + if (this._destroyId) + this.notification.disconnect(this._destroyId); + this._destroyId = 0; + } + + canClose() { + return true; + } +}; + +var EventsSection = class EventsSection extends MessageList.MessageListSection { + constructor() { + super(); + + this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); + this._desktopSettings.connect('changed', this._reloadEvents.bind(this)); + this._eventSource = new EmptyEventSource(); + + this._messageById = new Map(); + + this._title = new St.Button({ style_class: 'events-section-title', + label: '', + x_align: St.Align.START, + can_focus: true }); + this.actor.insert_child_below(this._title, null); + + this._title.connect('clicked', this._onTitleClicked.bind(this)); + this._title.connect('key-focus-in', this._onKeyFocusIn.bind(this)); + + Shell.AppSystem.get_default().connect('installed-changed', + this._appInstalledChanged.bind(this)); + this._appInstalledChanged(); + } + + setEventSource(eventSource) { + this._eventSource = eventSource; + this._eventSource.connect('changed', this._reloadEvents.bind(this)); + } + + get allowed() { + return Main.sessionMode.showCalendarEvents; + } + + _updateTitle() { + this._title.visible = !isToday(this._date); + + if (!this._title.visible) + return; + + let dayFormat; + let now = new Date(); + if (sameYear(this._date, now)) + /* Translators: Shown on calendar heading when selected day occurs on current year */ + dayFormat = Shell.util_translate_time_string(NC_("calendar heading", + "%A, %B %-d")); + else + /* Translators: Shown on calendar heading when selected day occurs on different year */ + dayFormat = Shell.util_translate_time_string(NC_("calendar heading", + "%A, %B %-d, %Y")); + this._title.label = this._date.toLocaleFormat(dayFormat); + } + + _reloadEvents() { + if (this._eventSource.isLoading) + return; + + this._reloading = true; + + let periodBegin = _getBeginningOfDay(this._date); + let periodEnd = _getEndOfDay(this._date); + let events = this._eventSource.getEvents(periodBegin, periodEnd); + + let ids = events.map(e => e.id); + this._messageById.forEach((message, id) => { + if (ids.includes(id)) + return; + this._messageById.delete(id); + this.removeMessage(message); + }); + + for (let i = 0; i < events.length; i++) { + let event = events[i]; + + let message = this._messageById.get(event.id); + if (!message) { + message = new EventMessage(event, this._date); + this._messageById.set(event.id, message); + this.addMessage(message, false); + } else { + this.moveMessage(message, i, false); + } + } + + this._reloading = false; + this._sync(); + } + + _appInstalledChanged() { + this._calendarApp = undefined; + this._title.reactive = (this._getCalendarApp() != null); + } + + _getCalendarApp() { + if (this._calendarApp !== undefined) + return this._calendarApp; + + let apps = Gio.AppInfo.get_recommended_for_type('text/calendar'); + if (apps && (apps.length > 0)) { + let app = Gio.AppInfo.get_default_for_type('text/calendar', false); + let defaultInRecommended = apps.some(a => a.equal(app)); + this._calendarApp = defaultInRecommended ? app : apps[0]; + } else { + this._calendarApp = null; + } + return this._calendarApp; + } + + _onTitleClicked() { + Main.overview.hide(); + Main.panel.closeCalendar(); + + let app = this._getCalendarApp(); + if (app.get_id() == 'evolution.desktop') + app = Gio.DesktopAppInfo.new('evolution-calendar.desktop'); + app.launch([], global.create_app_launch_context(0, -1)); + } + + setDate(date) { + super.setDate(date); + this._updateTitle(); + this._reloadEvents(); + } + + _shouldShow() { + return !this.empty || !isToday(this._date); + } + + _sync() { + if (this._reloading) + return; + + super._sync(); + } +}; + +var NotificationSection = +class NotificationSection extends MessageList.MessageListSection { + constructor() { + super(); + + this._sources = new Map(); + this._nUrgent = 0; + + Main.messageTray.connect('source-added', this._sourceAdded.bind(this)); + Main.messageTray.getSources().forEach(source => { + this._sourceAdded(Main.messageTray, source); + }); + + this.actor.connect('notify::mapped', this._onMapped.bind(this)); + } + + get allowed() { + return Main.sessionMode.hasNotifications && + !Main.sessionMode.isGreeter; + } + + _createTimeLabel(datetime) { + let label = new St.Label({ style_class: 'event-time', + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.END }); + label.connect('notify::mapped', () => { + if (label.mapped) + label.text = Util.formatTimeSpan(datetime); + }); + return label; + } + + _sourceAdded(tray, source) { + let obj = { + destroyId: 0, + notificationAddedId: 0, + }; + + obj.destroyId = source.connect('destroy', source => { + this._onSourceDestroy(source, obj); + }); + obj.notificationAddedId = source.connect('notification-added', + this._onNotificationAdded.bind(this)); + + this._sources.set(source, obj); + } + + _onNotificationAdded(source, notification) { + let message = new NotificationMessage(notification); + message.setSecondaryActor(this._createTimeLabel(notification.datetime)); + + let isUrgent = notification.urgency == MessageTray.Urgency.CRITICAL; + + let updatedId = notification.connect('updated', () => { + message.setSecondaryActor(this._createTimeLabel(notification.datetime)); + this.moveMessage(message, isUrgent ? 0 : this._nUrgent, this.actor.mapped); + }); + let destroyId = notification.connect('destroy', () => { + notification.disconnect(destroyId); + notification.disconnect(updatedId); + if (isUrgent) + this._nUrgent--; + }); + + if (isUrgent) { + // Keep track of urgent notifications to keep them on top + this._nUrgent++; + } else if (this.mapped) { + // Only acknowledge non-urgent notifications in case it + // has important actions that are inaccessible when not + // shown as banner + notification.acknowledged = true; + } + + let index = isUrgent ? 0 : this._nUrgent; + this.addMessageAtIndex(message, index, this.actor.mapped); + } + + _onSourceDestroy(source, obj) { + source.disconnect(obj.destroyId); + source.disconnect(obj.notificationAddedId); + + this._sources.delete(source); + } + + _onMapped() { + if (!this.actor.mapped) + return; + + for (let message of this._messages.keys()) + if (message.notification.urgency != MessageTray.Urgency.CRITICAL) + message.notification.acknowledged = true; + } + + _shouldShow() { + return !this.empty && isToday(this._date); + } +}; + +var Placeholder = class Placeholder { + constructor() { + this.actor = new St.BoxLayout({ style_class: 'message-list-placeholder', + vertical: true }); + + this._date = new Date(); + + let todayFile = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/no-notifications.svg'); + let otherFile = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/no-events.svg'); + this._todayIcon = new Gio.FileIcon({ file: todayFile }); + this._otherIcon = new Gio.FileIcon({ file: otherFile }); + + this._icon = new St.Icon(); + this.actor.add_actor(this._icon); + + this._label = new St.Label(); + this.actor.add_actor(this._label); + + this._sync(); + } + + setDate(date) { + if (sameDay(this._date, date)) + return; + this._date = date; + this._sync(); + } + + _sync() { + let today = isToday(this._date); + if (today && this._icon.gicon == this._todayIcon) + return; + if (!today && this._icon.gicon == this._otherIcon) + return; + + if (today) { + this._icon.gicon = this._todayIcon; + this._label.text = _("No Notifications"); + } else { + this._icon.gicon = this._otherIcon; + this._label.text = _("No Events"); + } + } +}; + +var CalendarMessageList = class CalendarMessageList { + constructor() { + this.actor = new St.Widget({ style_class: 'message-list', + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true }); + + this._placeholder = new Placeholder(); + this.actor.add_actor(this._placeholder.actor); + + let box = new St.BoxLayout({ vertical: true, + x_expand: true, y_expand: true }); + this.actor.add_actor(box); + + this._scrollView = new St.ScrollView({ style_class: 'vfade', + overlay_scrollbars: true, + x_expand: true, y_expand: true, + x_fill: true, y_fill: true }); + this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + box.add_actor(this._scrollView); + + this._clearButton = new St.Button({ style_class: 'message-list-clear-button button', + label: _("Clear"), + can_focus: true }); + this._clearButton.set_x_align(Clutter.ActorAlign.END); + this._clearButton.connect('clicked', () => { + let sections = [...this._sections.keys()]; + sections.forEach((s) => { s.clear(); }); + }); + box.add_actor(this._clearButton); + + this._sectionList = new St.BoxLayout({ style_class: 'message-list-sections', + vertical: true, + y_expand: true, + y_align: Clutter.ActorAlign.START }); + this._scrollView.add_actor(this._sectionList); + this._sections = new Map(); + + this._mediaSection = new Mpris.MediaSection(); + this._addSection(this._mediaSection); + + this._notificationSection = new NotificationSection(); + this._addSection(this._notificationSection); + + this._eventsSection = new EventsSection(); + this._addSection(this._eventsSection); + + Main.sessionMode.connect('updated', this._sync.bind(this)); + } + + _addSection(section) { + let obj = { + destroyId: 0, + visibleId: 0, + emptyChangedId: 0, + canClearChangedId: 0, + keyFocusId: 0 + }; + obj.destroyId = section.actor.connect('destroy', () => { + this._removeSection(section); + }); + obj.visibleId = section.actor.connect('notify::visible', + this._sync.bind(this)); + obj.emptyChangedId = section.connect('empty-changed', + this._sync.bind(this)); + obj.canClearChangedId = section.connect('can-clear-changed', + this._sync.bind(this)); + obj.keyFocusId = section.connect('key-focus-in', + this._onKeyFocusIn.bind(this)); + + this._sections.set(section, obj); + this._sectionList.add_actor(section.actor); + this._sync(); + } + + _removeSection(section) { + let obj = this._sections.get(section); + section.actor.disconnect(obj.destroyId); + section.actor.disconnect(obj.visibleId); + section.disconnect(obj.emptyChangedId); + section.disconnect(obj.canClearChangedId); + section.disconnect(obj.keyFocusId); + + this._sections.delete(section); + this._sectionList.remove_actor(section.actor); + this._sync(); + } + + _onKeyFocusIn(section, actor) { + Util.ensureActorVisibleInScrollView(this._scrollView, actor); + } + + _sync() { + let sections = [...this._sections.keys()]; + let visible = sections.some(s => s.allowed); + this.actor.visible = visible; + if (!visible) + return; + + let empty = sections.every(s => s.empty || !s.actor.visible); + this._placeholder.actor.visible = empty; + this._clearButton.visible = !empty; + + let canClear = sections.some(s => s.canClear && s.actor.visible); + this._clearButton.reactive = canClear; + } + + setEventSource(eventSource) { + this._eventsSection.setEventSource(eventSource); + } + + setDate(date) { + for (let section of this._sections.keys()) + section.setDate(date); + this._placeholder.setDate(date); + } +}; diff --git a/js/ui/checkBox.js b/js/ui/checkBox.js new file mode 100644 index 0000000..deaa34a --- /dev/null +++ b/js/ui/checkBox.js @@ -0,0 +1,34 @@ +const { Clutter, Pango, St } = imports.gi; + +var CheckBox = class CheckBox { + constructor(label) { + let container = new St.BoxLayout(); + this.actor = new St.Button({ style_class: 'check-box', + child: container, + button_mask: St.ButtonMask.ONE, + toggle_mode: true, + can_focus: true, + x_fill: true, + y_fill: true }); + + this._box = new St.Bin(); + this._box.set_y_align(Clutter.ActorAlign.START); + container.add_actor(this._box); + + this._label = new St.Label(); + this._label.clutter_text.set_line_wrap(true); + this._label.clutter_text.set_ellipsize(Pango.EllipsizeMode.NONE); + container.add_actor(this._label); + + if (label) + this.setLabel(label); + } + + setLabel(label) { + this._label.set_text(label); + } + + getLabelActor() { + return this._label; + } +}; diff --git a/js/ui/closeDialog.js b/js/ui/closeDialog.js new file mode 100644 index 0000000..ee2045e --- /dev/null +++ b/js/ui/closeDialog.js @@ -0,0 +1,192 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Meta, Shell } = imports.gi; + +const Dialog = imports.ui.dialog; +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +var FROZEN_WINDOW_BRIGHTNESS = -0.3 +var DIALOG_TRANSITION_TIME = 0.15 +var ALIVE_TIMEOUT = 5000; + +var CloseDialog = GObject.registerClass({ + Implements: [ Meta.CloseDialog ], + Properties: { + 'window': GObject.ParamSpec.override('window', Meta.CloseDialog) + }, +}, class CloseDialog extends GObject.Object { + _init(window) { + super._init(); + this._window = window; + this._dialog = null; + this._tracked = undefined; + this._timeoutId = 0; + this._windowFocusChangedId = 0; + this._keyFocusChangedId = 0; + } + + get window() { + return this._window; + } + + set window(window) { + this._window = window; + } + + _createDialogContent() { + let tracker = Shell.WindowTracker.get_default(); + let windowApp = tracker.get_window_app(this._window); + + /* Translators: %s is an application name */ + let title = _("“%s” is not responding.").format(windowApp.get_name()); + let subtitle = _("You may choose to wait a short while for it to " + + "continue or force the application to quit entirely."); + let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' }); + return new Dialog.MessageDialogContent({ icon, title, subtitle }); + } + + _initDialog() { + if (this._dialog) + return; + + let windowActor = this._window.get_compositor_private(); + this._dialog = new Dialog.Dialog(windowActor, 'close-dialog'); + this._dialog.width = windowActor.width; + this._dialog.height = windowActor.height; + + this._dialog.addContent(this._createDialogContent()); + this._dialog.addButton({ label: _('Force Quit'), + action: this._onClose.bind(this), + default: true }); + this._dialog.addButton({ label: _('Wait'), + action: this._onWait.bind(this), + key: Clutter.Escape }); + + global.focus_manager.add_group(this._dialog); + } + + _addWindowEffect() { + // We set the effect on the surface actor, so the dialog itself + // (which is a child of the MetaWindowActor) does not get the + // effect applied itself. + let windowActor = this._window.get_compositor_private(); + let surfaceActor = windowActor.get_first_child(); + let effect = new Clutter.BrightnessContrastEffect(); + effect.set_brightness(FROZEN_WINDOW_BRIGHTNESS); + surfaceActor.add_effect_with_name("gnome-shell-frozen-window", effect); + } + + _removeWindowEffect() { + let windowActor = this._window.get_compositor_private(); + let surfaceActor = windowActor.get_first_child(); + surfaceActor.remove_effect_by_name("gnome-shell-frozen-window"); + } + + _onWait() { + this.response(Meta.CloseDialogResponse.WAIT); + } + + _onClose() { + this.response(Meta.CloseDialogResponse.FORCE_CLOSE); + } + + _onFocusChanged() { + if (Meta.is_wayland_compositor()) + return; + + let focusWindow = global.display.focus_window; + let keyFocus = global.stage.key_focus; + + let shouldTrack; + if (focusWindow != null) + shouldTrack = focusWindow == this._window; + else + shouldTrack = keyFocus && this._dialog.contains(keyFocus); + + if (this._tracked === shouldTrack) + return; + + if (shouldTrack) + Main.layoutManager.trackChrome(this._dialog, + { affectsInputRegion: true }); + else + Main.layoutManager.untrackChrome(this._dialog); + + // The buttons are broken when they aren't added to the input region, + // so disable them properly in that case + this._dialog.buttonLayout.get_children().forEach(b => { + b.reactive = shouldTrack; + }); + + this._tracked = shouldTrack; + } + + vfunc_show() { + if (this._dialog != null) + return; + + Meta.disable_unredirect_for_display(global.display); + + this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ALIVE_TIMEOUT, + () => { + this._window.check_alive(global.display.get_current_time_roundtrip()); + return GLib.SOURCE_CONTINUE; + }); + + this._windowFocusChangedId = + global.display.connect('notify::focus-window', + this._onFocusChanged.bind(this)); + + this._keyFocusChangedId = + global.stage.connect('notify::key-focus', + this._onFocusChanged.bind(this)); + + this._addWindowEffect(); + this._initDialog(); + + this._dialog.scale_y = 0; + this._dialog.set_pivot_point(0.5, 0.5); + + Tweener.addTween(this._dialog, + { scale_y: 1, + transition: 'linear', + time: DIALOG_TRANSITION_TIME, + onComplete: this._onFocusChanged.bind(this) + }); + } + + vfunc_hide() { + if (this._dialog == null) + return; + + Meta.enable_unredirect_for_display(global.display); + + GLib.source_remove(this._timeoutId); + this._timeoutId = 0; + + global.display.disconnect(this._windowFocusChangedId) + this._windowFocusChangedId = 0; + + global.stage.disconnect(this._keyFocusChangedId); + this._keyFocusChangedId = 0; + + let dialog = this._dialog; + this._dialog = null; + this._removeWindowEffect(); + + Tweener.addTween(dialog, + { scale_y: 0, + transition: 'linear', + time: DIALOG_TRANSITION_TIME, + onComplete: () => { + dialog.destroy(); + } + }); + } + + vfunc_focus() { + if (this._dialog) + this._dialog.grab_key_focus(); + } +}); diff --git a/js/ui/components/__init__.js b/js/ui/components/__init__.js new file mode 100644 index 0000000..6d6cc9d --- /dev/null +++ b/js/ui/components/__init__.js @@ -0,0 +1,61 @@ +const Main = imports.ui.main; + +var ComponentManager = class { + constructor() { + this._allComponents = {}; + this._enabledComponents = []; + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + } + + _sessionUpdated() { + let newEnabledComponents = Main.sessionMode.components; + + newEnabledComponents.filter( + name => this._enabledComponents.indexOf(name) == -1 + ).forEach(name => { + this._enableComponent(name); + }); + + this._enabledComponents.filter( + name => newEnabledComponents.indexOf(name) == -1 + ).forEach(name => { + this._disableComponent(name); + }); + + this._enabledComponents = newEnabledComponents; + } + + _importComponent(name) { + let module = imports.ui.components[name]; + return module.Component; + } + + _ensureComponent(name) { + let component = this._allComponents[name]; + if (component) + return component; + + if (Main.sessionMode.isLocked) + return null; + + let constructor = this._importComponent(name); + component = new constructor(); + this._allComponents[name] = component; + return component; + } + + _enableComponent(name) { + let component = this._ensureComponent(name); + if (component) + component.enable(); + } + + _disableComponent(name) { + let component = this._allComponents[name]; + if (component == null) + return; + component.disable(); + } +}; diff --git a/js/ui/components/automountManager.js b/js/ui/components/automountManager.js new file mode 100644 index 0000000..92f5b2b --- /dev/null +++ b/js/ui/components/automountManager.js @@ -0,0 +1,253 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib } = imports.gi; +const Mainloop = imports.mainloop; +const Params = imports.misc.params; + +const GnomeSession = imports.misc.gnomeSession; +const ShellMountOperation = imports.ui.shellMountOperation; + +var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16; + +// GSettings keys +const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling'; +const SETTING_ENABLE_AUTOMOUNT = 'automount'; + +var AUTORUN_EXPIRE_TIMEOUT_SECS = 10; + +var AutomountManager = class { + constructor() { + this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); + this._volumeQueue = []; + this._activeOperations = new Map(); + this._session = new GnomeSession.SessionManager(); + this._session.connectSignal('InhibitorAdded', + this._InhibitorsChanged.bind(this)); + this._session.connectSignal('InhibitorRemoved', + this._InhibitorsChanged.bind(this)); + this._inhibited = false; + + this._volumeMonitor = Gio.VolumeMonitor.get(); + } + + enable() { + this._volumeAddedId = this._volumeMonitor.connect('volume-added', this._onVolumeAdded.bind(this)); + this._volumeRemovedId = this._volumeMonitor.connect('volume-removed', this._onVolumeRemoved.bind(this)); + this._driveConnectedId = this._volumeMonitor.connect('drive-connected', this._onDriveConnected.bind(this)); + this._driveDisconnectedId = this._volumeMonitor.connect('drive-disconnected', this._onDriveDisconnected.bind(this)); + this._driveEjectButtonId = this._volumeMonitor.connect('drive-eject-button', this._onDriveEjectButton.bind(this)); + + this._mountAllId = Mainloop.idle_add(this._startupMountAll.bind(this)); + GLib.Source.set_name_by_id(this._mountAllId, '[gnome-shell] this._startupMountAll'); + } + + disable() { + this._volumeMonitor.disconnect(this._volumeAddedId); + this._volumeMonitor.disconnect(this._volumeRemovedId); + this._volumeMonitor.disconnect(this._driveConnectedId); + this._volumeMonitor.disconnect(this._driveDisconnectedId); + this._volumeMonitor.disconnect(this._driveEjectButtonId); + + if (this._mountAllId > 0) { + Mainloop.source_remove(this._mountAllId); + this._mountAllId = 0; + } + } + + _InhibitorsChanged(object, senderName, [inhibtor]) { + this._session.IsInhibitedRemote(GNOME_SESSION_AUTOMOUNT_INHIBIT, + (result, error) => { + if (!error) { + this._inhibited = result[0]; + } + }); + } + + _startupMountAll() { + let volumes = this._volumeMonitor.get_volumes(); + volumes.forEach(volume => { + this._checkAndMountVolume(volume, { checkSession: false, + useMountOp: false, + allowAutorun: false }); + }); + + this._mountAllId = 0; + return GLib.SOURCE_REMOVE; + } + + _onDriveConnected() { + // if we're not in the current ConsoleKit session, + // or screensaver is active, don't play sounds + if (!this._session.SessionIsActive) + return; + + let player = global.display.get_sound_player(); + player.play_from_theme('device-added-media', + _("External drive connected"), + null); + } + + _onDriveDisconnected() { + // if we're not in the current ConsoleKit session, + // or screensaver is active, don't play sounds + if (!this._session.SessionIsActive) + return; + + let player = global.display.get_sound_player(); + player.play_from_theme('device-removed-media', + _("External drive disconnected"), + null); + } + + _onDriveEjectButton(monitor, drive) { + // TODO: this code path is not tested, as the GVfs volume monitor + // doesn't emit this signal just yet. + if (!this._session.SessionIsActive) + return; + + // we force stop/eject in this case, so we don't have to pass a + // mount operation object + if (drive.can_stop()) { + drive.stop + (Gio.MountUnmountFlags.FORCE, null, null, + (drive, res) => { + try { + drive.stop_finish(res); + } catch (e) { + log("Unable to stop the drive after drive-eject-button " + e.toString()); + } + }); + } else if (drive.can_eject()) { + drive.eject_with_operation + (Gio.MountUnmountFlags.FORCE, null, null, + (drive, res) => { + try { + drive.eject_with_operation_finish(res); + } catch (e) { + log("Unable to eject the drive after drive-eject-button " + e.toString()); + } + }); + } + } + + _onVolumeAdded(monitor, volume) { + this._checkAndMountVolume(volume); + } + + _checkAndMountVolume(volume, params) { + params = Params.parse(params, { checkSession: true, + useMountOp: true, + allowAutorun: true }); + + if (params.checkSession) { + // if we're not in the current ConsoleKit session, + // don't attempt automount + if (!this._session.SessionIsActive) + return; + } + + if (this._inhibited) + return; + + // Volume is already mounted, don't bother. + if (volume.get_mount()) + return; + + if (!this._settings.get_boolean(SETTING_ENABLE_AUTOMOUNT) || + !volume.should_automount() || + !volume.can_mount()) { + // allow the autorun to run anyway; this can happen if the + // mount gets added programmatically later, even if + // should_automount() or can_mount() are false, like for + // blank optical media. + this._allowAutorun(volume); + this._allowAutorunExpire(volume); + + return; + } + + if (params.useMountOp) { + let operation = new ShellMountOperation.ShellMountOperation(volume); + this._mountVolume(volume, operation, params.allowAutorun); + } else { + this._mountVolume(volume, null, params.allowAutorun); + } + } + + _mountVolume(volume, operation, allowAutorun) { + if (allowAutorun) + this._allowAutorun(volume); + + let mountOp = operation ? operation.mountOp : null; + this._activeOperations.set(volume, operation); + + volume.mount(0, mountOp, null, + this._onVolumeMounted.bind(this)); + } + + _onVolumeMounted(volume, res) { + this._allowAutorunExpire(volume); + + try { + volume.mount_finish(res); + this._closeOperation(volume); + } catch (e) { + // FIXME: we will always get G_IO_ERROR_FAILED from the gvfs udisks + // backend, see https://bugs.freedesktop.org/show_bug.cgi?id=51271 + // To reask the password if the user input was empty or wrong, we + // will check for corresponding error messages. However, these + // error strings are not unique for the cases in the comments below. + if (e.message.includes('No key available with this passphrase') || // cryptsetup + e.message.includes('No key available to unlock device') || // udisks (no password) + e.message.includes('Error unlocking')) { // udisks (wrong password) + this._reaskPassword(volume); + } else { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED)) + log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString()); + + this._closeOperation(volume); + } + } + } + + _onVolumeRemoved(monitor, volume) { + if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) { + Mainloop.source_remove(volume._allowAutorunExpireId); + delete volume._allowAutorunExpireId; + } + this._volumeQueue = + this._volumeQueue.filter(element => (element != volume)); + } + + _reaskPassword(volume) { + let prevOperation = this._activeOperations.get(volume); + let existingDialog = prevOperation ? prevOperation.borrowDialog() : null; + let operation = + new ShellMountOperation.ShellMountOperation(volume, + { existingDialog: existingDialog }); + this._mountVolume(volume, operation); + } + + _closeOperation(volume) { + let operation = this._activeOperations.get(volume); + if (!operation) + return; + operation.close(); + this._activeOperations.delete(volume); + } + + _allowAutorun(volume) { + volume.allowAutorun = true; + } + + _allowAutorunExpire(volume) { + let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => { + volume.allowAutorun = false; + delete volume._allowAutorunExpireId; + return GLib.SOURCE_REMOVE; + }); + volume._allowAutorunExpireId = id; + GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun'); + } +}; +var Component = AutomountManager; diff --git a/js/ui/components/autorunManager.js b/js/ui/components/autorunManager.js new file mode 100644 index 0000000..34c7d62 --- /dev/null +++ b/js/ui/components/autorunManager.js @@ -0,0 +1,361 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, St } = imports.gi; + +const GnomeSession = imports.misc.gnomeSession; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +// GSettings keys +const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling'; +const SETTING_DISABLE_AUTORUN = 'autorun-never'; +const SETTING_START_APP = 'autorun-x-content-start-app'; +const SETTING_IGNORE = 'autorun-x-content-ignore'; +const SETTING_OPEN_FOLDER = 'autorun-x-content-open-folder'; + +var AutorunSetting = { + RUN: 0, + IGNORE: 1, + FILES: 2, + ASK: 3 +}; + +// misc utils +function shouldAutorunMount(mount) { + let root = mount.get_root(); + let volume = mount.get_volume(); + + if (!volume || !volume.allowAutorun) + return false; + + if (root.is_native() && isMountRootHidden(root)) + return false; + + return true; +} + +function isMountRootHidden(root) { + let path = root.get_path(); + + // skip any mounts in hidden directory hierarchies + return (path.indexOf('/.') != -1); +} + +function isMountNonLocal(mount) { + // If the mount doesn't have an associated volume, that means it's + // an uninteresting filesystem. Most devices that we care about will + // have a mount, like media players and USB sticks. + let volume = mount.get_volume(); + if (volume == null) + return true; + + return (volume.get_identifier("class") == "network"); +} + +function startAppForMount(app, mount) { + let files = []; + let root = mount.get_root(); + let retval = false; + + files.push(root); + + try { + retval = app.launch(files, + global.create_app_launch_context(0, -1)); + } catch (e) { + log('Unable to launch the application ' + app.get_name() + + ': ' + e.toString()); + } + + return retval; +} + +/******************************************/ + +const HotplugSnifferIface = loadInterfaceXML('org.gnome.Shell.HotplugSniffer'); +const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface); +function HotplugSniffer() { + return new HotplugSnifferProxy(Gio.DBus.session, + 'org.gnome.Shell.HotplugSniffer', + '/org/gnome/Shell/HotplugSniffer'); +} + +var ContentTypeDiscoverer = class { + constructor(callback) { + this._callback = callback; + this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); + } + + guessContentTypes(mount) { + let autorunEnabled = !this._settings.get_boolean(SETTING_DISABLE_AUTORUN); + let shouldScan = autorunEnabled && !isMountNonLocal(mount); + + if (shouldScan) { + // guess mount's content types using GIO + mount.guess_content_type(false, null, + this._onContentTypeGuessed.bind(this)); + } else { + this._emitCallback(mount, []); + } + } + + _onContentTypeGuessed(mount, res) { + let contentTypes = []; + + try { + contentTypes = mount.guess_content_type_finish(res); + } catch (e) { + log('Unable to guess content types on added mount ' + mount.get_name() + + ': ' + e.toString()); + } + + if (contentTypes.length) { + this._emitCallback(mount, contentTypes); + } else { + let root = mount.get_root(); + + let hotplugSniffer = new HotplugSniffer(); + hotplugSniffer.SniffURIRemote(root.get_uri(), + ([contentTypes]) => { + this._emitCallback(mount, contentTypes); + }); + } + } + + _emitCallback(mount, contentTypes) { + if (!contentTypes) + contentTypes = []; + + // we're not interested in win32 software content types here + contentTypes = contentTypes.filter( + type => (type != 'x-content/win32-software') + ); + + let apps = []; + contentTypes.forEach(type => { + let app = Gio.app_info_get_default_for_type(type, false); + + if (app) + apps.push(app); + }); + + if (apps.length == 0) + apps.push(Gio.app_info_get_default_for_type('inode/directory', false)); + + this._callback(mount, apps, contentTypes); + } +}; + +var AutorunManager = class { + constructor() { + this._session = new GnomeSession.SessionManager(); + this._volumeMonitor = Gio.VolumeMonitor.get(); + + this._dispatcher = new AutorunDispatcher(this); + } + + enable() { + this._mountAddedId = this._volumeMonitor.connect('mount-added', this._onMountAdded.bind(this)); + this._mountRemovedId = this._volumeMonitor.connect('mount-removed', this._onMountRemoved.bind(this)); + } + + disable() { + this._volumeMonitor.disconnect(this._mountAddedId); + this._volumeMonitor.disconnect(this._mountRemovedId); + } + + _onMountAdded(monitor, mount) { + // don't do anything if our session is not the currently + // active one + if (!this._session.SessionIsActive) + return; + + let discoverer = new ContentTypeDiscoverer((mount, apps, contentTypes) => { + this._dispatcher.addMount(mount, apps, contentTypes); + }); + discoverer.guessContentTypes(mount); + } + + _onMountRemoved(monitor, mount) { + this._dispatcher.removeMount(mount); + } +}; + +var AutorunDispatcher = class { + constructor(manager) { + this._manager = manager; + this._sources = []; + this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); + } + + _getAutorunSettingForType(contentType) { + let runApp = this._settings.get_strv(SETTING_START_APP); + if (runApp.indexOf(contentType) != -1) + return AutorunSetting.RUN; + + let ignore = this._settings.get_strv(SETTING_IGNORE); + if (ignore.indexOf(contentType) != -1) + return AutorunSetting.IGNORE; + + let openFiles = this._settings.get_strv(SETTING_OPEN_FOLDER); + if (openFiles.indexOf(contentType) != -1) + return AutorunSetting.FILES; + + return AutorunSetting.ASK; + } + + _getSourceForMount(mount) { + let filtered = this._sources.filter(source => (source.mount == mount)); + + // we always make sure not to add two sources for the same + // mount in addMount(), so it's safe to assume filtered.length + // is always either 1 or 0. + if (filtered.length == 1) + return filtered[0]; + + return null; + } + + _addSource(mount, apps) { + // if we already have a source showing for this + // mount, return + if (this._getSourceForMount(mount)) + return; + + // add a new source + this._sources.push(new AutorunSource(this._manager, mount, apps)); + } + + addMount(mount, apps, contentTypes) { + // if autorun is disabled globally, return + if (this._settings.get_boolean(SETTING_DISABLE_AUTORUN)) + return; + + // if the mount doesn't want to be autorun, return + if (!shouldAutorunMount(mount)) + return; + + let setting; + if (contentTypes.length > 0) + setting = this._getAutorunSettingForType(contentTypes[0]); + else + setting = AutorunSetting.ASK; + + // check at the settings for the first content type + // to see whether we should ask + if (setting == AutorunSetting.IGNORE) + return; // return right away + + let success = false; + let app = null; + + if (setting == AutorunSetting.RUN) { + app = Gio.app_info_get_default_for_type(contentTypes[0], false); + } else if (setting == AutorunSetting.FILES) { + app = Gio.app_info_get_default_for_type('inode/directory', false); + } + + if (app) + success = startAppForMount(app, mount); + + // we fallback here also in case the settings did not specify 'ask', + // but we failed launching the default app or the default file manager + if (!success) + this._addSource(mount, apps); + } + + removeMount(mount) { + let source = this._getSourceForMount(mount); + + // if we aren't tracking this mount, don't do anything + if (!source) + return; + + // destroy the notification source + source.destroy(); + } +}; + +var AutorunSource = class extends MessageTray.Source { + constructor(manager, mount, apps) { + super(mount.get_name()); + + this._manager = manager; + this.mount = mount; + this.apps = apps; + + this._notification = new AutorunNotification(this._manager, this); + + // add ourselves as a source, and popup the notification + Main.messageTray.add(this); + this.notify(this._notification); + } + + getIcon() { + return this.mount.get_icon(); + } + + _createPolicy() { + return new MessageTray.NotificationApplicationPolicy('org.gnome.Nautilus'); + } +}; + +var AutorunNotification = class extends MessageTray.Notification { + constructor(manager, source) { + super(source, source.title); + + this._manager = manager; + this._mount = source.mount; + } + + createBanner() { + let banner = new MessageTray.NotificationBanner(this); + + this.source.apps.forEach(app => { + let actor = this._buttonForApp(app); + + if (actor) + banner.addButton(actor); + }); + + return banner; + } + + _buttonForApp(app) { + let box = new St.BoxLayout(); + let icon = new St.Icon({ gicon: app.get_icon(), + style_class: 'hotplug-notification-item-icon' }); + box.add(icon); + + let label = new St.Bin({ y_align: St.Align.MIDDLE, + child: new St.Label + ({ text: _("Open with %s").format(app.get_name()) }) + }); + box.add(label); + + let button = new St.Button({ child: box, + x_fill: true, + x_align: St.Align.START, + x_expand: true, + button_mask: St.ButtonMask.ONE, + style_class: 'hotplug-notification-item button' }); + + button.connect('clicked', () => { + startAppForMount(app, this._mount); + this.destroy(); + }); + + return button; + } + + activate() { + super.activate(); + + let app = Gio.app_info_get_default_for_type('inode/directory', false); + startAppForMount(app, this._mount); + } +}; + +var Component = AutorunManager; diff --git a/js/ui/components/keyring.js b/js/ui/components/keyring.js new file mode 100644 index 0000000..0d9f1e4 --- /dev/null +++ b/js/ui/components/keyring.js @@ -0,0 +1,275 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gcr, Gio, GObject, Pango, Shell, St } = imports.gi; + +const Animation = imports.ui.animation; +const Dialog = imports.ui.dialog; +const ModalDialog = imports.ui.modalDialog; +const ShellEntry = imports.ui.shellEntry; +const CheckBox = imports.ui.checkBox; + +var WORK_SPINNER_ICON_SIZE = 16; + +var KeyringDialog = class extends ModalDialog.ModalDialog { + constructor() { + super({ styleClass: 'prompt-dialog' }); + + this.prompt = new Shell.KeyringPrompt(); + this.prompt.connect('show-password', this._onShowPassword.bind(this)); + this.prompt.connect('show-confirm', this._onShowConfirm.bind(this)); + this.prompt.connect('prompt-close', this._onHidePrompt.bind(this)); + + let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' }); + this._content = new Dialog.MessageDialogContent({ icon }); + this.contentLayout.add(this._content); + + // FIXME: Why does this break now? + /* + this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE); + this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE); + */ + this.prompt.connect('notify::message', () => { + this._content.title = this.prompt.message; + }); + this._content.title = this.prompt.message; + + this.prompt.connect('notify::description', () => { + this._content.body = this.prompt.description; + }); + this._content.body = this.prompt.description; + + this._workSpinner = null; + this._controlTable = null; + + this._cancelButton = this.addButton({ label: '', + action: this._onCancelButton.bind(this), + key: Clutter.Escape }); + this._continueButton = this.addButton({ label: '', + action: this._onContinueButton.bind(this), + default: true }); + + this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE); + this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE); + } + + _setWorking(working) { + if (!this._workSpinner) + return; + + if (working) + this._workSpinner.play(); + else + this._workSpinner.stop(); + } + + _buildControlTable() { + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + let table = new St.Widget({ style_class: 'keyring-dialog-control-table', + layout_manager: layout }); + layout.hookup_style(table); + let rtl = table.get_text_direction() == Clutter.TextDirection.RTL; + let row = 0; + + if (this.prompt.password_visible) { + let label = new St.Label({ style_class: 'prompt-dialog-password-label', + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER }); + label.set_text(_("Password:")); + label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', + text: '', + can_focus: true, + x_expand: true }); + this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE + ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); + this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this)); + + this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true); + + if (rtl) { + layout.attach(this._workSpinner.actor, 0, row, 1, 1); + layout.attach(this._passwordEntry, 1, row, 1, 1); + layout.attach(label, 2, row, 1, 1); + } else { + layout.attach(label, 0, row, 1, 1); + layout.attach(this._passwordEntry, 1, row, 1, 1); + layout.attach(this._workSpinner.actor, 2, row, 1, 1); + } + row++; + } else { + this._workSpinner = null; + this._passwordEntry = null; + } + + if (this.prompt.confirm_visible) { + var label = new St.Label(({ style_class: 'prompt-dialog-password-label', + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER })); + label.set_text(_("Type again:")); + this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', + text: '', + can_focus: true, + x_expand: true }); + this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE + ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true }); + this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this)); + if (rtl) { + layout.attach(this._confirmEntry, 0, row, 1, 1); + layout.attach(label, 1, row, 1, 1); + } else { + layout.attach(label, 0, row, 1, 1); + layout.attach(this._confirmEntry, 1, row, 1, 1); + } + row++; + } else { + this._confirmEntry = null; + } + + this.prompt.set_password_actor(this._passwordEntry ? this._passwordEntry.clutter_text : null); + this.prompt.set_confirm_actor(this._confirmEntry ? this._confirmEntry.clutter_text : null); + + if (this.prompt.choice_visible) { + let choice = new CheckBox.CheckBox(); + this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE); + this.prompt.bind_property('choice-chosen', choice.actor, 'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL); + layout.attach(choice.actor, rtl ? 0 : 1, row, 1, 1); + row++; + } + + let warning = new St.Label({ style_class: 'prompt-dialog-error-label', + x_align: Clutter.ActorAlign.START }); + warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + warning.clutter_text.line_wrap = true; + layout.attach(warning, rtl ? 0 : 1, row, 1, 1); + this.prompt.bind_property('warning-visible', warning, 'visible', GObject.BindingFlags.SYNC_CREATE); + this.prompt.bind_property('warning', warning, 'text', GObject.BindingFlags.SYNC_CREATE); + + if (this._controlTable) { + this._controlTable.destroy_all_children(); + this._controlTable.destroy(); + } + + this._controlTable = table; + this._content.messageBox.add(table, { x_fill: true, y_fill: true }); + } + + _updateSensitivity(sensitive) { + if (this._passwordEntry) { + this._passwordEntry.reactive = sensitive; + this._passwordEntry.clutter_text.editable = sensitive; + } + + if (this._confirmEntry) { + this._confirmEntry.reactive = sensitive; + this._confirmEntry.clutter_text.editable = sensitive; + } + + this._continueButton.can_focus = sensitive; + this._continueButton.reactive = sensitive; + this._setWorking(!sensitive); + } + + _ensureOpen() { + // NOTE: ModalDialog.open() is safe to call if the dialog is + // already open - it just returns true without side-effects + if (this.open()) + return true; + + // The above fail if e.g. unable to get input grab + // + // In an ideal world this wouldn't happen (because the + // Shell is in complete control of the session) but that's + // just not how things work right now. + + log('keyringPrompt: Failed to show modal dialog.' + + ' Dismissing prompt request'); + this.prompt.cancel() + return false; + } + + _onShowPassword(prompt) { + this._buildControlTable(); + this._ensureOpen(); + this._updateSensitivity(true); + this._passwordEntry.grab_key_focus(); + } + + _onShowConfirm(prompt) { + this._buildControlTable(); + this._ensureOpen(); + this._updateSensitivity(true); + this._continueButton.grab_key_focus(); + } + + _onHidePrompt(prompt) { + this.close(); + } + + _onPasswordActivate() { + if (this.prompt.confirm_visible) + this._confirmEntry.grab_key_focus(); + else + this._onContinueButton(); + } + + _onConfirmActivate() { + this._onContinueButton(); + } + + _onContinueButton() { + this._updateSensitivity(false); + this.prompt.complete(); + } + + _onCancelButton() { + this.prompt.cancel(); + } +}; + +var KeyringDummyDialog = class { + constructor() { + this.prompt = new Shell.KeyringPrompt(); + this.prompt.connect('show-password', this._cancelPrompt.bind(this)); + this.prompt.connect('show-confirm', this._cancelPrompt.bind(this)); + } + + _cancelPrompt() { + this.prompt.cancel(); + } +}; + +var KeyringPrompter = class { + constructor() { + this._prompter = new Gcr.SystemPrompter(); + this._prompter.connect('new-prompt', () => { + let dialog = this._enabled ? new KeyringDialog() + : new KeyringDummyDialog(); + this._currentPrompt = dialog.prompt; + return this._currentPrompt; + }); + this._dbusId = null; + this._registered = false; + this._enabled = false; + this._currentPrompt = null; + } + + enable() { + if (!this._registered) { + this._prompter.register(Gio.DBus.session); + this._dbusId = Gio.DBus.session.own_name('org.gnome.keyring.SystemPrompter', + Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null); + this._registered = true; + } + this._enabled = true; + } + + disable() { + this._enabled = false; + + if (this._prompter.prompting) + this._currentPrompt.cancel(); + this._currentPrompt = null; + } +}; + +var Component = KeyringPrompter; diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js new file mode 100644 index 0000000..f871c73 --- /dev/null +++ b/js/ui/components/networkAgent.js @@ -0,0 +1,819 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, NM, Pango, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Config = imports.misc.config; +const Dialog = imports.ui.dialog; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const ModalDialog = imports.ui.modalDialog; +const ShellEntry = imports.ui.shellEntry; + +const VPN_UI_GROUP = 'VPN Plugin UI'; + +var NetworkSecretDialog = class extends ModalDialog.ModalDialog { + constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) { + super({ styleClass: 'prompt-dialog' }); + + this._agent = agent; + this._requestId = requestId; + this._connection = connection; + this._settingName = settingName; + this._hints = hints; + + if (contentOverride) + this._content = contentOverride; + else + this._content = this._getContent(); + + let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' }); + let contentParams = { icon, + title: this._content.title, + body: this._content.message }; + let contentBox = new Dialog.MessageDialogContent(contentParams); + this.contentLayout.add_actor(contentBox); + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table', + layout_manager: layout }); + layout.hookup_style(secretTable); + + let rtl = secretTable.get_text_direction() == Clutter.TextDirection.RTL; + let initialFocusSet = false; + let pos = 0; + for (let i = 0; i < this._content.secrets.length; i++) { + let secret = this._content.secrets[i]; + let label = new St.Label({ style_class: 'prompt-dialog-password-label', + text: secret.label, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER }); + label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + + let reactive = secret.key != null; + + secret.entry = new St.Entry({ style_class: 'prompt-dialog-password-entry', + text: secret.value, can_focus: reactive, + reactive: reactive, + x_expand: true }); + ShellEntry.addContextMenu(secret.entry, + { isPassword: secret.password }); + + if (secret.validate) + secret.valid = secret.validate(secret); + else // no special validation, just ensure it's not empty + secret.valid = secret.value.length > 0; + + if (reactive) { + if (!initialFocusSet) { + this.setInitialKeyFocus(secret.entry); + initialFocusSet = true; + } + + secret.entry.clutter_text.connect('activate', this._onOk.bind(this)); + secret.entry.clutter_text.connect('text-changed', () => { + secret.value = secret.entry.get_text(); + if (secret.validate) + secret.valid = secret.validate(secret); + else + secret.valid = secret.value.length > 0; + this._updateOkButton(); + }); + } else + secret.valid = true; + + if (rtl) { + layout.attach(secret.entry, 0, pos, 1, 1); + layout.attach(label, 1, pos, 1, 1); + } else { + layout.attach(label, 0, pos, 1, 1); + layout.attach(secret.entry, 1, pos, 1, 1); + } + pos++; + + if (secret.password) + secret.entry.clutter_text.set_password_char('\u25cf'); + } + + contentBox.messageBox.add(secretTable); + + if (flags & NM.SecretAgentGetSecretsFlags.WPS_PBC_ACTIVE) { + let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description', + text: _("Alternatively you can connect by pushing the “WPS” button on your router.") }); + descriptionLabel.clutter_text.line_wrap = true; + descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + + contentBox.messageBox.add(descriptionLabel, + { y_fill: true, + y_align: St.Align.START, + expand: true }); + } + + this._okButton = { label: _("Connect"), + action: this._onOk.bind(this), + default: true + }; + + this.setButtons([{ label: _("Cancel"), + action: this.cancel.bind(this), + key: Clutter.KEY_Escape, + }, + this._okButton]); + + this._updateOkButton(); + } + + _updateOkButton() { + let valid = true; + for (let i = 0; i < this._content.secrets.length; i++) { + let secret = this._content.secrets[i]; + valid = valid && secret.valid; + } + + this._okButton.button.reactive = valid; + this._okButton.button.can_focus = valid; + } + + _onOk() { + let valid = true; + for (let i = 0; i < this._content.secrets.length; i++) { + let secret = this._content.secrets[i]; + valid = valid && secret.valid; + if (secret.key != null) + this._agent.set_password(this._requestId, secret.key, secret.value); + } + + if (valid) { + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED); + this.close(global.get_current_time()); + } + // do nothing if not valid + } + + cancel() { + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED); + this.close(global.get_current_time()); + } + + _validateWpaPsk(secret) { + let value = secret.value; + if (value.length == 64) { + // must be composed of hexadecimal digits only + for (let i = 0; i < 64; i++) { + if (!((value[i] >= 'a' && value[i] <= 'f') + || (value[i] >= 'A' && value[i] <= 'F') + || (value[i] >= '0' && value[i] <= '9'))) + return false; + } + return true; + } + + return (value.length >= 8 && value.length <= 63); + } + + _validateStaticWep(secret) { + let value = secret.value; + 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') + || (value[i] >= 'A' && value[i] <= 'F') + || (value[i] >= '0' && value[i] <= '9'))) + return false; + } + } else if (value.length == 5 || value.length == 13) { + for (let i = 0; i < value.length; i++) { + if (!((value[i] >= 'a' && value[i] <= 'z') + || (value[i] >= 'A' && value[i] <= 'Z'))) + return false; + } + } else + return false; + } else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) { + if (value.length < 0 || value.length > 64) + return false; + } + return true; + } + + _getWirelessSecrets(secrets, wirelessSetting) { + let wirelessSecuritySetting = this._connection.get_setting_wireless_security(); + + if (this._settingName == '802-1x') { + this._get8021xSecrets(secrets); + return; + } + + switch (wirelessSecuritySetting.key_mgmt) { + // First the easy ones + case 'wpa-none': + case 'wpa-psk': + secrets.push({ label: _("Password: "), key: 'psk', + value: wirelessSecuritySetting.psk || '', + validate: this._validateWpaPsk, password: true }); + break; + case 'none': // static WEP + secrets.push({ label: _("Key: "), key: 'wep-key' + wirelessSecuritySetting.wep_tx_keyidx, + value: wirelessSecuritySetting.get_wep_key(wirelessSecuritySetting.wep_tx_keyidx) || '', + wep_key_type: wirelessSecuritySetting.wep_key_type, + validate: this._validateStaticWep, password: true }); + break; + case 'ieee8021x': + if (wirelessSecuritySetting.auth_alg == 'leap') // Cisco LEAP + secrets.push({ label: _("Password: "), key: 'leap-password', + value: wirelessSecuritySetting.leap_password || '', password: true }); + else // Dynamic (IEEE 802.1x) WEP + this._get8021xSecrets(secrets); + break; + case 'wpa-eap': + this._get8021xSecrets(secrets); + break; + default: + log('Invalid wireless key management: ' + wirelessSecuritySetting.key_mgmt); + } + } + + _get8021xSecrets(secrets) { + let ieee8021xSetting = this._connection.get_setting_802_1x(); + let phase2method; + + /* If hints were given we know exactly what we need to ask */ + if (this._settingName == "802-1x" && this._hints.length) { + if (this._hints.includes('identity')) + secrets.push({ label: _("Username: "), key: 'identity', + value: ieee8021xSetting.identity || '', password: false }); + if (this._hints.includes('password')) + secrets.push({ label: _("Password: "), key: 'password', + value: ieee8021xSetting.password || '', password: true }); + if (this._hints.includes('private-key-password')) + secrets.push({ label: _("Private key password: "), key: 'private-key-password', + value: ieee8021xSetting.private_key_password || '', password: true }); + return; + } + + switch (ieee8021xSetting.get_eap_method(0)) { + case 'md5': + case 'leap': + case 'ttls': + case 'peap': + case 'fast': + // TTLS and PEAP are actually much more complicated, but this complication + // is not visible here since we only care about phase2 authentication + // (and don't even care of which one) + secrets.push({ label: _("Username: "), key: null, + value: ieee8021xSetting.identity || '', password: false }); + secrets.push({ label: _("Password: "), key: 'password', + value: ieee8021xSetting.password || '', password: true }); + break; + case 'tls': + secrets.push({ label: _("Identity: "), key: null, + value: ieee8021xSetting.identity || '', password: false }); + secrets.push({ label: _("Private key password: "), key: 'private-key-password', + value: ieee8021xSetting.private_key_password || '', password: true }); + break; + default: + log('Invalid EAP/IEEE802.1x method: ' + ieee8021xSetting.get_eap_method(0)); + } + } + + _getPPPoESecrets(secrets) { + let pppoeSetting = this._connection.get_setting_pppoe(); + secrets.push({ label: _("Username: "), key: 'username', + value: pppoeSetting.username || '', password: false }); + secrets.push({ label: _("Service: "), key: 'service', + value: pppoeSetting.service || '', password: false }); + secrets.push({ label: _("Password: "), key: 'password', + value: pppoeSetting.password || '', password: true }); + } + + _getMobileSecrets(secrets, connectionType) { + let setting; + if (connectionType == 'bluetooth') + setting = this._connection.get_setting_cdma() || this._connection.get_setting_gsm(); + else + setting = this._connection.get_setting_by_name(connectionType); + secrets.push({ label: _("Password: "), key: 'password', + value: setting.value || '', password: true }); + } + + _getContent() { + let connectionSetting = this._connection.get_setting_connection(); + let connectionType = connectionSetting.get_connection_type(); + let wirelessSetting; + let ssid; + + let content = { }; + content.secrets = [ ]; + + switch (connectionType) { + case '802-11-wireless': + wirelessSetting = this._connection.get_setting_wireless(); + 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); + break; + case '802-3-ethernet': + content.title = _("Wired 802.1X authentication"); + content.message = null; + content.secrets.push({ label: _("Network name: "), key: null, + value: connectionSetting.get_id(), password: false }); + this._get8021xSecrets(content.secrets); + break; + case 'pppoe': + content.title = _("DSL authentication"); + content.message = null; + this._getPPPoESecrets(content.secrets); + break; + case 'gsm': + if (this._hints.indexOf('pin') != -1) { + let gsmSetting = this._connection.get_setting_gsm(); + content.title = _("PIN code required"); + content.message = _("PIN code is needed for the mobile broadband device"); + content.secrets.push({ label: _("PIN: "), key: 'pin', + value: gsmSetting.pin || '', password: true }); + break; + } + // fall through + case 'cdma': + case 'bluetooth': + content.title = _("Mobile broadband network password"); + content.message = _("A password is required to connect to “%s”.").format(connectionSetting.get_id()); + this._getMobileSecrets(content.secrets, connectionType); + break; + default: + log('Invalid connection type: ' + connectionType); + }; + + return content; + } +}; + +var VPNRequestHandler = class { + constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) { + this._agent = agent; + this._requestId = requestId; + this._connection = connection; + this._flags = flags; + this._pluginOutBuffer = []; + this._title = null; + this._description = null; + this._content = [ ]; + this._shellDialog = null; + + let connectionSetting = connection.get_setting_connection(); + + let argv = [ authHelper.fileName, + '-u', connectionSetting.uuid, + '-n', connectionSetting.id, + '-s', serviceType + ]; + if (authHelper.externalUIMode) + argv.push('--external-ui-mode'); + if (flags & NM.SecretAgentGetSecretsFlags.ALLOW_INTERACTION) + argv.push('-i'); + if (flags & NM.SecretAgentGetSecretsFlags.REQUEST_NEW) + argv.push('-r'); + if (authHelper.supportsHints) { + for (let i = 0; i < hints.length; i++) { + argv.push('-t'); + argv.push(hints[i]); + } + } + + this._newStylePlugin = authHelper.externalUIMode; + + try { + let [success, pid, stdin, stdout, stderr] = + GLib.spawn_async_with_pipes(null, /* pwd */ + argv, + null, /* envp */ + GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null /* child_setup */); + + this._childPid = pid; + this._stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); + this._stdout = new Gio.UnixInputStream({ fd: stdout, close_fd: true }); + GLib.close(stderr); + this._dataStdout = new Gio.DataInputStream({ base_stream: this._stdout }); + + if (this._newStylePlugin) + this._readStdoutNewStyle(); + else + this._readStdoutOldStyle(); + + this._childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, + this._vpnChildFinished.bind(this)); + + this._writeConnection(); + } catch(e) { + logError(e, 'error while spawning VPN auth helper'); + + this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); + } + } + + cancel(respond) { + if (respond) + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED); + + if (this._newStylePlugin && this._shellDialog) { + this._shellDialog.close(global.get_current_time()); + this._shellDialog.destroy(); + } else { + try { + this._stdin.write('QUIT\n\n', null); + } catch(e) { /* ignore broken pipe errors */ } + } + + this.destroy(); + } + + destroy() { + if (this._destroyed) + return; + + this.emit('destroy'); + if (this._childWatch) + GLib.source_remove(this._childWatch); + + this._stdin.close(null); + // Stdout is closed when we finish reading from it + + this._destroyed = true; + } + + _vpnChildFinished(pid, status, requestObj) { + this._childWatch = 0; + if (this._newStylePlugin) { + // For new style plugin, all work is done in the async reading functions + // Just reap the process here + return; + } + + let [exited, exitStatus] = Shell.util_wifexited(status); + + if (exited) { + if (exitStatus != 0) + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED); + else + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED); + } else + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); + + this.destroy(); + } + + _vpnChildProcessLineOldStyle(line) { + if (this._previousLine != undefined) { + // Two consecutive newlines mean that the child should be closed + // (the actual newlines are eaten by Gio.DataInputStream) + // Send a termination message + if (line == '' && this._previousLine == '') { + try { + this._stdin.write('QUIT\n\n', null); + } catch(e) { /* ignore broken pipe errors */ } + } else { + this._agent.set_password(this._requestId, this._previousLine, line); + this._previousLine = undefined; + } + } else { + this._previousLine = line; + } + } + + _readStdoutOldStyle() { + this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null, (stream, result) => { + let [line, len] = this._dataStdout.read_line_finish_utf8(result); + + if (line == null) { + // end of file + this._stdout.close(null); + return; + } + + this._vpnChildProcessLineOldStyle(line); + + // try to read more! + this._readStdoutOldStyle(); + }); + } + + _readStdoutNewStyle() { + this._dataStdout.fill_async(-1, GLib.PRIORITY_DEFAULT, null, (stream, result) => { + let cnt = this._dataStdout.fill_finish(result); + + if (cnt == 0) { + // end of file + this._showNewStyleDialog(); + + this._stdout.close(null); + return; + } + + // Try to read more + this._dataStdout.set_buffer_size(2 * this._dataStdout.get_buffer_size()); + this._readStdoutNewStyle(); + }); + } + + _showNewStyleDialog() { + let keyfile = new GLib.KeyFile(); + let data; + let contentOverride; + + try { + data = this._dataStdout.peek_buffer(); + + if (data instanceof Uint8Array) + data = imports.byteArray.toGBytes(data); + else + data = data.toGBytes(); + + keyfile.load_from_bytes(data, GLib.KeyFileFlags.NONE); + + if (keyfile.get_integer(VPN_UI_GROUP, 'Version') != 2) + throw new Error('Invalid plugin keyfile version, is %d'); + + contentOverride = { title: keyfile.get_string(VPN_UI_GROUP, 'Title'), + message: keyfile.get_string(VPN_UI_GROUP, 'Description'), + secrets: [] }; + + let [groups, len] = keyfile.get_groups(); + for (let i = 0; i < groups.length; i++) { + if (groups[i] == VPN_UI_GROUP) + continue; + + let value = keyfile.get_string(groups[i], 'Value'); + let shouldAsk = keyfile.get_boolean(groups[i], 'ShouldAsk'); + + if (shouldAsk) { + contentOverride.secrets.push({ label: keyfile.get_string(groups[i], 'Label'), + key: groups[i], + value: value, + password: keyfile.get_boolean(groups[i], 'IsSecret') + }); + } else { + if (!value.length) // Ignore empty secrets + continue; + + this._agent.set_password(this._requestId, groups[i], value); + } + } + } catch(e) { + // No output is a valid case it means "both secrets are stored" + if (data.length > 0) { + logError(e, 'error while reading VPN plugin output keyfile'); + + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); + this.destroy(); + return; + } + } + + if (contentOverride && contentOverride.secrets.length) { + // Only show the dialog if we actually have something to ask + this._shellDialog = new NetworkSecretDialog(this._agent, this._requestId, this._connection, 'vpn', [], this._flags, contentOverride); + this._shellDialog.open(global.get_current_time()); + } else { + this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED); + this.destroy(); + } + } + + _writeConnection() { + let vpnSetting = this._connection.get_setting_vpn(); + + try { + vpnSetting.foreach_data_item((key, value) => { + this._stdin.write('DATA_KEY=' + key + '\n', null); + this._stdin.write('DATA_VAL=' + (value || '') + '\n\n', null); + }); + vpnSetting.foreach_secret((key, value) => { + this._stdin.write('SECRET_KEY=' + key + '\n', null); + this._stdin.write('SECRET_VAL=' + (value || '') + '\n\n', null); + }); + this._stdin.write('DONE\n\n', null); + } catch(e) { + 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 = class { + constructor() { + this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent', + capabilities: NM.SecretAgentCapabilities.VPN_HINTS, + auto_register: false + }); + + this._dialogs = { }; + this._vpnRequests = { }; + this._notifications = { }; + + 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; }); + } catch(e) { + log('Failed to create monitor for VPN plugin dir: ' + e.message); + } + + this._native.connect('new-request', this._newRequest.bind(this)); + this._native.connect('cancel-request', this._cancelRequest.bind(this)); + + this._initialized = false; + this._native.init_async(GLib.PRIORITY_DEFAULT, null, (o, res) => { + try { + this._native.init_finish(res); + this._initialized = true; + } catch(e) { + this._native = null; + logError(e, 'error initializing the NetworkManager Agent'); + } + }); + } + + enable() { + if (!this._native) + return; + + this._native.auto_register = true; + if (this._initialized && !this._native.registered) + this._native.register_async(null, null); + } + + disable() { + let requestId; + + for (requestId in this._dialogs) + this._dialogs[requestId].cancel(); + this._dialogs = { }; + + for (requestId in this._vpnRequests) + this._vpnRequests[requestId].cancel(true); + this._vpnRequests = { }; + + for (requestId in this._notifications) + this._notifications[requestId].destroy(); + this._notifications = { }; + + if (!this._native) + return; + + this._native.auto_register = false; + if (this._initialized && this._native.registered) + this._native.unregister_async(null, null); + } + + _showNotification(requestId, connection, settingName, hints, flags) { + let source = new MessageTray.Source(_("Network Manager"), 'network-transmit-receive'); + source.policy = new MessageTray.NotificationApplicationPolicy('gnome-network-panel'); + + let title, body; + + let connectionSetting = connection.get_setting_connection(); + let connectionType = connectionSetting.get_connection_type(); + switch (connectionType) { + case '802-11-wireless': + let wirelessSetting = connection.get_setting_wireless(); + let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data()); + title = _("Authentication required by wireless network"); + body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid); + break; + case '802-3-ethernet': + title = _("Wired 802.1X authentication"); + body = _("A password is required to connect to “%s”.".format(connection.get_id())); + break; + case 'pppoe': + title = _("DSL authentication"); + body = _("A password is required to connect to “%s”.".format(connection.get_id())); + break; + case 'gsm': + if (hints.indexOf('pin') != -1) { + let gsmSetting = connection.get_setting_gsm(); + title = _("PIN code required"); + body = _("PIN code is needed for the mobile broadband device"); + break; + } + // fall through + case 'cdma': + case 'bluetooth': + title = _("Mobile broadband network password"); + body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id()); + break; + default: + log('Invalid connection type: ' + connectionType); + this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); + return; + } + + let notification = new MessageTray.Notification(source, title, body); + + notification.connect('activated', () => { + notification.answered = true; + this._handleRequest(requestId, connection, settingName, hints, flags); + }); + + this._notifications[requestId] = notification; + notification.connect('destroy', () => { + if (!notification.answered) + this._native.respond(requestId, Shell.NetworkAgentResponse.USER_CANCELED); + delete this._notifications[requestId]; + }); + + Main.messageTray.add(source); + source.notify(notification); + } + + _newRequest(agent, requestId, connection, settingName, hints, flags) { + if (!(flags & NM.SecretAgentGetSecretsFlags.USER_REQUESTED)) + this._showNotification(requestId, connection, settingName, hints, flags); + else + this._handleRequest(requestId, connection, settingName, hints, flags); + } + + _handleRequest(requestId, connection, settingName, hints, flags) { + if (settingName == 'vpn') { + this._vpnRequest(requestId, connection, hints, flags); + return; + } + + let dialog = new NetworkSecretDialog(this._native, requestId, connection, settingName, hints, flags); + dialog.connect('destroy', () => { + delete this._dialogs[requestId]; + }); + this._dialogs[requestId] = dialog; + dialog.open(global.get_current_time()); + } + + _cancelRequest(agent, requestId) { + if (this._dialogs[requestId]) { + this._dialogs[requestId].close(global.get_current_time()); + this._dialogs[requestId].destroy(); + delete this._dialogs[requestId]; + } else if (this._vpnRequests[requestId]) { + this._vpnRequests[requestId].cancel(false); + delete this._vpnRequests[requestId]; + } + } + + _vpnRequest(requestId, connection, hints, flags) { + let vpnSetting = connection.get_setting_vpn(); + let serviceType = vpnSetting.service_type; + + this._buildVPNServiceCache(); + + let binary = this._vpnBinaries[serviceType]; + if (!binary) { + log('Invalid VPN service type (cannot find authentication binary)'); + + /* cancel the auth process */ + this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); + return; + } + + let vpnRequest = new VPNRequestHandler(this._native, requestId, binary, serviceType, connection, hints, flags); + vpnRequest.connect('destroy', () => { + delete this._vpnRequests[requestId]; + }); + this._vpnRequests[requestId] = vpnRequest; + } + + _buildVPNServiceCache() { + if (this._vpnCacheBuilt) + return; + + this._vpnCacheBuilt = true; + this._vpnBinaries = { }; + + NM.VpnPluginInfo.list_load().forEach(plugin => { + let service = plugin.get_service(); + let fileName = plugin.get_auth_dialog(); + let supportsHints = plugin.supports_hints(); + let externalUIMode = false; + + let prop = plugin.lookup_property('GNOME', 'supports-external-ui-mode'); + if (prop) { + prop = prop.trim().toLowerCase(); + externalUIMode = ['true', 'yes', 'on', '1'].includes(prop); + } + + if (GLib.file_test(fileName, GLib.FileTest.IS_EXECUTABLE)) { + let binary = { fileName, externalUIMode, supportsHints }; + this._vpnBinaries[service] = binary; + + plugin.get_aliases().forEach(alias => { + this._vpnBinaries[alias] = binary; + }); + } else { + log('VPN plugin at %s is not executable'.format(fileName)); + } + }); + } +}; +var Component = NetworkAgent; diff --git a/js/ui/components/polkitAgent.js b/js/ui/components/polkitAgent.js new file mode 100644 index 0000000..21feb40 --- /dev/null +++ b/js/ui/components/polkitAgent.js @@ -0,0 +1,406 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { AccountsService, Clutter, Gio, GLib, + Pango, PolkitAgent, Polkit, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Animation = imports.ui.animation; +const Dialog = imports.ui.dialog; +const Main = imports.ui.main; +const ModalDialog = imports.ui.modalDialog; +const ShellEntry = imports.ui.shellEntry; +const UserWidget = imports.ui.userWidget; + +var DIALOG_ICON_SIZE = 48; + +var WORK_SPINNER_ICON_SIZE = 16; + +var AuthenticationDialog = class extends ModalDialog.ModalDialog { + constructor(actionId, body, cookie, userNames) { + super({ styleClass: 'prompt-dialog' }); + + this.actionId = actionId; + this.message = body; + this.userNames = userNames; + this._wasDismissed = false; + + this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { + this._group.visible = !Main.sessionMode.isLocked; + }); + + this.connect('closed', this._onDialogClosed.bind(this)); + + let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' }); + let title = _("Authentication Required"); + + let content = new Dialog.MessageDialogContent({ icon, title, body }); + this.contentLayout.add_actor(content); + + if (userNames.length > 1) { + log('polkitAuthenticationAgent: Received ' + userNames.length + + ' identities that can be used for authentication. Only ' + + 'considering one.'); + } + + let userName = GLib.get_user_name(); + if (userNames.indexOf(userName) < 0) + userName = 'root'; + if (userNames.indexOf(userName) < 0) + userName = userNames[0]; + + this._user = AccountsService.UserManager.get_default().get_user(userName); + let userRealName = this._user.get_real_name() + this._userLoadedId = this._user.connect('notify::is_loaded', + this._onUserChanged.bind(this)); + this._userChangedId = this._user.connect('changed', + this._onUserChanged.bind(this)); + + // Special case 'root' + let userIsRoot = false; + if (userName == 'root') { + userIsRoot = true; + userRealName = _("Administrator"); + } + + if (userIsRoot) { + let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-root-label', + text: userRealName })); + content.messageBox.add(userLabel, { x_fill: false, + x_align: St.Align.START }); + } else { + let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout', + vertical: false }); + content.messageBox.add(userBox); + this._userAvatar = new UserWidget.Avatar(this._user, + { iconSize: DIALOG_ICON_SIZE, + styleClass: 'polkit-dialog-user-icon' }); + this._userAvatar.actor.hide(); + userBox.add(this._userAvatar.actor, + { x_fill: true, + y_fill: false, + x_align: St.Align.END, + y_align: St.Align.START }); + let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-label', + text: userRealName })); + userBox.add(userLabel, + { x_fill: true, + y_fill: false, + x_align: St.Align.END, + y_align: St.Align.MIDDLE }); + } + + this._onUserChanged(); + + this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' }); + content.messageBox.add(this._passwordBox); + this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label' })); + this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE }); + this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', + text: "", + can_focus: true}); + ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); + this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); + this._passwordBox.add(this._passwordEntry, + { expand: true }); + + this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true); + this._passwordBox.add(this._workSpinner.actor); + + this.setInitialKeyFocus(this._passwordEntry); + this._passwordBox.hide(); + + this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' }); + this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._errorMessageLabel.clutter_text.line_wrap = true; + content.messageBox.add(this._errorMessageLabel, { x_fill: false, x_align: St.Align.START }); + this._errorMessageLabel.hide(); + + this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' }); + this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._infoMessageLabel.clutter_text.line_wrap = true; + content.messageBox.add(this._infoMessageLabel); + this._infoMessageLabel.hide(); + + /* text is intentionally non-blank otherwise the height is not the same as for + * infoMessage and errorMessageLabel - but it is still invisible because + * gnome-shell.css sets the color to be transparent + */ + this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label', + text: 'abc'}); + this._nullMessageLabel.add_style_class_name('hidden'); + this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._nullMessageLabel.clutter_text.line_wrap = true; + content.messageBox.add(this._nullMessageLabel); + this._nullMessageLabel.show(); + + this._cancelButton = this.addButton({ label: _("Cancel"), + action: this.cancel.bind(this), + key: Clutter.Escape }); + this._okButton = this.addButton({ label: _("Authenticate"), + action: this._onAuthenticateButtonPressed.bind(this), + default: true }); + + this._doneEmitted = false; + + this._identityToAuth = Polkit.UnixUser.new_for_name(userName); + this._cookie = cookie; + } + + _setWorking(working) { + if (working) + this._workSpinner.play(); + else + this._workSpinner.stop(); + } + + performAuthentication() { + this._destroySession(); + this._session = new PolkitAgent.Session({ identity: this._identityToAuth, + cookie: this._cookie }); + this._sessionCompletedId = this._session.connect('completed', this._onSessionCompleted.bind(this)); + this._sessionRequestId = this._session.connect('request', this._onSessionRequest.bind(this)); + this._sessionShowErrorId = this._session.connect('show-error', this._onSessionShowError.bind(this)); + this._sessionShowInfoId = this._session.connect('show-info', this._onSessionShowInfo.bind(this)); + this._session.initiate(); + } + + _ensureOpen() { + // NOTE: ModalDialog.open() is safe to call if the dialog is + // already open - it just returns true without side-effects + if (!this.open(global.get_current_time())) { + // This can fail if e.g. unable to get input grab + // + // In an ideal world this wouldn't happen (because the + // Shell is in complete control of the session) but that's + // just not how things work right now. + // + // One way to make this happen is by running 'sleep 3; + // pkexec bash' and then opening a popup menu. + // + // We could add retrying if this turns out to be a problem + + log('polkitAuthenticationAgent: Failed to show modal dialog.' + + ' Dismissing authentication request for action-id ' + this.actionId + + ' cookie ' + this._cookie); + this._emitDone(true); + } + } + + _emitDone(dismissed) { + if (!this._doneEmitted) { + this._doneEmitted = true; + this.emit('done', dismissed); + } + } + + _updateSensitivity(sensitive) { + this._passwordEntry.reactive = sensitive; + this._passwordEntry.clutter_text.editable = sensitive; + + this._okButton.can_focus = sensitive; + this._okButton.reactive = sensitive; + this._setWorking(!sensitive); + } + + _onEntryActivate() { + let response = this._passwordEntry.get_text(); + this._updateSensitivity(false); + this._session.response(response); + // When the user responds, dismiss already shown info and + // error texts (if any) + this._errorMessageLabel.hide(); + this._infoMessageLabel.hide(); + this._nullMessageLabel.show(); + } + + _onAuthenticateButtonPressed() { + this._onEntryActivate(); + } + + _onSessionCompleted(session, gainedAuthorization) { + if (this._completed || this._doneEmitted) + return; + + this._completed = true; + + /* Yay, all done */ + if (gainedAuthorization) { + this._emitDone(false); + + } else { + /* Unless we are showing an existing error message from the PAM + * module (the PAM module could be reporting the authentication + * error providing authentication-method specific information), + * show "Sorry, that didn't work. Please try again." + */ + if (!this._errorMessageLabel.visible && !this._wasDismissed) { + /* Translators: "that didn't work" refers to the fact that the + * requested authentication was not gained; this can happen + * because of an authentication error (like invalid password), + * for instance. */ + this._errorMessageLabel.set_text(_("Sorry, that didn’t work. Please try again.")); + this._errorMessageLabel.show(); + this._infoMessageLabel.hide(); + this._nullMessageLabel.hide(); + } + + /* Try and authenticate again */ + this.performAuthentication(); + } + } + + _onSessionRequest(session, request, echo_on) { + // Cheap localization trick + if (request == 'Password:' || request == 'Password: ') + this._passwordLabel.set_text(_("Password:")); + else + this._passwordLabel.set_text(request); + + if (echo_on) + this._passwordEntry.clutter_text.set_password_char(''); + else + this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE + + this._passwordBox.show(); + this._passwordEntry.set_text(''); + this._passwordEntry.grab_key_focus(); + this._updateSensitivity(true); + this._ensureOpen(); + } + + _onSessionShowError(session, text) { + this._passwordEntry.set_text(''); + this._errorMessageLabel.set_text(text); + this._errorMessageLabel.show(); + this._infoMessageLabel.hide(); + this._nullMessageLabel.hide(); + this._ensureOpen(); + } + + _onSessionShowInfo(session, text) { + this._passwordEntry.set_text(''); + this._infoMessageLabel.set_text(text); + this._infoMessageLabel.show(); + this._errorMessageLabel.hide(); + this._nullMessageLabel.hide(); + this._ensureOpen(); + } + + _destroySession() { + if (this._session) { + if (!this._completed) + this._session.cancel(); + this._completed = false; + + this._session.disconnect(this._sessionCompletedId); + this._session.disconnect(this._sessionRequestId); + this._session.disconnect(this._sessionShowErrorId); + this._session.disconnect(this._sessionShowInfoId); + this._session = null; + } + } + + _onUserChanged() { + if (this._user.is_loaded && this._userAvatar) { + this._userAvatar.update(); + this._userAvatar.actor.show(); + } + } + + cancel() { + this._wasDismissed = true; + this.close(global.get_current_time()); + this._emitDone(true); + } + + _onDialogClosed() { + if (this._sessionUpdatedId) + Main.sessionMode.disconnect(this._sessionUpdatedId); + this._sessionUpdatedId = 0; + + if (this._user) { + this._user.disconnect(this._userLoadedId); + this._user.disconnect(this._userChangedId); + this._user = null; + } + + this._destroySession(); + } +}; +Signals.addSignalMethods(AuthenticationDialog.prototype); + +var AuthenticationAgent = class { + constructor() { + this._currentDialog = null; + this._handle = null; + this._native = new Shell.PolkitAuthenticationAgent(); + this._native.connect('initiate', this._onInitiate.bind(this)); + this._native.connect('cancel', this._onCancel.bind(this)); + this._sessionUpdatedId = 0; + } + + enable() { + try { + this._native.register(); + } catch(e) { + log('Failed to register AuthenticationAgent'); + } + } + + disable() { + try { + this._native.unregister(); + } catch(e) { + log('Failed to unregister AuthenticationAgent'); + } + } + + _onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) { + // Don't pop up a dialog while locked + if (Main.sessionMode.isLocked) { + this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { + Main.sessionMode.disconnect(this._sessionUpdatedId); + this._sessionUpdatedId = 0; + + this._onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames); + }); + return; + } + + this._currentDialog = new AuthenticationDialog(actionId, message, cookie, userNames); + + // We actually don't want to open the dialog until we know for + // sure that we're going to interact with the user. For + // example, if the password for the identity to auth is blank + // (which it will be on a live CD) then there will be no + // conversation at all... of course, we don't *know* that + // until we actually try it. + // + // See https://bugzilla.gnome.org/show_bug.cgi?id=643062 for more + // discussion. + + this._currentDialog.connect('done', this._onDialogDone.bind(this)); + this._currentDialog.performAuthentication(); + } + + _onCancel(nativeAgent) { + this._completeRequest(false); + } + + _onDialogDone(dialog, dismissed) { + this._completeRequest(dismissed); + } + + _completeRequest(dismissed) { + this._currentDialog.close(); + this._currentDialog = null; + + if (this._sessionUpdatedId) + Main.sessionMode.disconnect(this._sessionUpdatedId); + this._sessionUpdatedId = 0; + + this._native.complete(dismissed); + } +}; + +var Component = AuthenticationAgent; diff --git a/js/ui/components/telepathyClient.js b/js/ui/components/telepathyClient.js new file mode 100644 index 0000000..1df865f --- /dev/null +++ b/js/ui/components/telepathyClient.js @@ -0,0 +1,973 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, St } = imports.gi; +const Lang = imports.lang; +const Mainloop = imports.mainloop; + +var Tpl = null; +var Tp = null; +try { + ({ TelepathyGLib: Tp, TelepathyLogger: Tpl } = imports.gi); +} catch(e) { + log('Telepathy is not available, chat integration will be disabled.'); +} + +const History = imports.misc.history; +const Main = imports.ui.main; +const MessageList = imports.ui.messageList; +const MessageTray = imports.ui.messageTray; +const Params = imports.misc.params; +const Util = imports.misc.util; + +const HAVE_TP = (Tp != null && Tpl != null); + +// See Notification.appendMessage +var SCROLLBACK_IMMEDIATE_TIME = 3 * 60; // 3 minutes +var SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes +var SCROLLBACK_RECENT_LENGTH = 20; +var SCROLLBACK_IDLE_LENGTH = 5; + +// See Source._displayPendingMessages +var SCROLLBACK_HISTORY_LINES = 10; + +// See Notification._onEntryChanged +var COMPOSING_STOP_TIMEOUT = 5; + +var CHAT_EXPAND_LINES = 12; + +var NotificationDirection = { + SENT: 'chat-sent', + RECEIVED: 'chat-received' +}; + +var N_ = s => s; + +function makeMessageFromTpMessage(tpMessage, direction) { + let [text, flags] = tpMessage.to_text(); + + let timestamp = tpMessage.get_sent_timestamp(); + if (timestamp == 0) + timestamp = tpMessage.get_received_timestamp(); + + return { + messageType: tpMessage.get_message_type(), + text: text, + sender: tpMessage.sender.alias, + timestamp: timestamp, + direction: direction + }; +} + + +function makeMessageFromTplEvent(event) { + let sent = event.get_sender().get_entity_type() == Tpl.EntityType.SELF; + let direction = sent ? NotificationDirection.SENT : NotificationDirection.RECEIVED; + + return { + messageType: event.get_message_type(), + text: event.get_message(), + sender: event.get_sender().get_alias(), + timestamp: event.get_timestamp(), + direction: direction + }; +} + +var TelepathyComponent = class { + constructor() { + this._client = null; + + if (!HAVE_TP) + return; // Telepathy isn't available + + this._client = new TelepathyClient(); + } + + enable() { + if (!this._client) + return; + + try { + this._client.register(); + } catch (e) { + throw new Error('Couldn\'t register Telepathy client. Error: \n' + e); + } + + if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core())) + this._client.account_manager.prepare_async(null, null); + } + + disable() { + if (!this._client) + return; + + this._client.unregister(); + } +}; + +var TelepathyClient = HAVE_TP ? GObject.registerClass( +class TelepathyClient extends Tp.BaseClient { + _init() { + // channel path -> ChatSource + this._chatSources = {}; + this._chatState = Tp.ChannelChatState.ACTIVE; + + // account path -> AccountNotification + this._accountNotifications = {}; + + // Define features we want + this._accountManager = Tp.AccountManager.dup(); + let factory = this._accountManager.get_factory(); + factory.add_account_features([Tp.Account.get_feature_quark_connection()]); + factory.add_connection_features([Tp.Connection.get_feature_quark_contact_list()]); + factory.add_channel_features([Tp.Channel.get_feature_quark_contacts()]); + factory.add_contact_features([Tp.ContactFeature.ALIAS, + Tp.ContactFeature.AVATAR_DATA, + Tp.ContactFeature.PRESENCE, + Tp.ContactFeature.SUBSCRIPTION_STATES]); + + // Set up a SimpleObserver, which will call _observeChannels whenever a + // channel matching its filters is detected. + // The second argument, recover, means _observeChannels will be run + // for any existing channel as well. + super._init({ name: 'GnomeShell', + account_manager: this._accountManager, + uniquify_name: true }); + + // We only care about single-user text-based chats + let filter = {}; + filter[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT; + filter[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE] = Tp.HandleType.CONTACT; + + this.set_observer_recover(true); + this.add_observer_filter(filter); + this.add_approver_filter(filter); + this.add_handler_filter(filter); + + // Allow other clients (such as Empathy) to pre-empt our channels if + // needed + this.set_delegated_channels_callback( + this._delegatedChannelsCb.bind(this)); + } + + vfunc_observe_channels(account, conn, channels, + dispatchOp, requests, context) { + let len = channels.length; + for (let i = 0; i < len; i++) { + let channel = channels[i]; + let [targetHandle, targetHandleType] = channel.get_handle(); + + if (channel.get_invalidated()) + continue; + + /* Only observe contact text channels */ + if ((!(channel instanceof Tp.TextChannel)) || + targetHandleType != Tp.HandleType.CONTACT) + continue; + + this._createChatSource(account, conn, channel, channel.get_target_contact()); + } + + context.accept(); + } + + _createChatSource(account, conn, channel, contact) { + if (this._chatSources[channel.get_object_path()]) + return; + + let source = new ChatSource(account, conn, channel, contact, this); + + this._chatSources[channel.get_object_path()] = source; + source.connect('destroy', () => { + delete this._chatSources[channel.get_object_path()]; + }); + } + + vfunc_handle_channels(account, conn, channels, requests, + user_action_time, context) { + this._handlingChannels(account, conn, channels, true); + context.accept(); + } + + _handlingChannels(account, conn, channels, notify) { + let len = channels.length; + for (let i = 0; i < len; i++) { + let channel = channels[i]; + + // We can only handle text channel, so close any other channel + if (!(channel instanceof Tp.TextChannel)) { + channel.close_async(null); + continue; + } + + if (channel.get_invalidated()) + continue; + + // 'notify' will be true when coming from an actual HandleChannels + // call, and not when from a successful Claim call. The point is + // we don't want to notify for a channel we just claimed which + // has no new messages (for example, a new channel which only has + // a delivery notification). We rely on _displayPendingMessages() + // and _messageReceived() to notify for new messages. + + // But we should still notify from HandleChannels because the + // Telepathy spec states that handlers must foreground channels + // in HandleChannels calls which are already being handled. + + if (notify && this.is_handling_channel(channel)) { + // We are already handling the channel, display the source + let source = this._chatSources[channel.get_object_path()]; + if (source) + source.notify(); + } + } + } + + vfunc_add_dispatch_operation(account, conn, channels, + dispatchOp, context) { + let channel = channels[0]; + let chanType = channel.get_channel_type(); + + if (channel.get_invalidated()) { + context.fail(new Tp.Error({ code: Tp.Error.INVALID_ARGUMENT, + message: 'Channel is invalidated' })); + return; + } + + if (chanType == Tp.IFACE_CHANNEL_TYPE_TEXT) + this._approveTextChannel(account, conn, channel, dispatchOp, context); + else + context.fail(new Tp.Error({ code: Tp.Error.INVALID_ARGUMENT, + message: 'Unsupported channel type' })); + } + + _approveTextChannel(account, conn, channel, dispatchOp, context) { + let [targetHandle, targetHandleType] = channel.get_handle(); + + if (targetHandleType != Tp.HandleType.CONTACT) { + context.fail(new Tp.Error({ code: Tp.Error.INVALID_ARGUMENT, + message: 'Unsupported handle type' })); + return; + } + + // Approve private text channels right away as we are going to handle it + dispatchOp.claim_with_async(this, (dispatchOp, result) => { + try { + dispatchOp.claim_with_finish(result); + this._handlingChannels(account, conn, [channel], false); + } catch (err) { + log('Failed to Claim channel: ' + err); + } + }); + + context.accept(); + } + + _delegatedChannelsCb(client, channels) { + // Nothing to do as we don't make a distinction between observed and + // handled channels. + } +}) : null; + +var ChatSource = class extends MessageTray.Source { + constructor(account, conn, channel, contact, client) { + super(contact.get_alias()); + + this._account = account; + this._contact = contact; + this._client = client; + + this.isChat = true; + this._pendingMessages = []; + + this._conn = conn; + this._channel = channel; + this._closedId = this._channel.connect('invalidated', this._channelClosed.bind(this)); + + this._notifyTimeoutId = 0; + + this._presence = contact.get_presence_type(); + + this._sentId = this._channel.connect('message-sent', this._messageSent.bind(this)); + this._receivedId = this._channel.connect('message-received', this._messageReceived.bind(this)); + this._pendingId = this._channel.connect('pending-message-removed', this._pendingRemoved.bind(this)); + + this._notifyAliasId = this._contact.connect('notify::alias', this._updateAlias.bind(this)); + this._notifyAvatarId = this._contact.connect('notify::avatar-file', this._updateAvatarIcon.bind(this)); + this._presenceChangedId = this._contact.connect('presence-changed', this._presenceChanged.bind(this)); + + // Add ourselves as a source. + Main.messageTray.add(this); + + this._getLogMessages(); + } + + _ensureNotification() { + if (this._notification) + return; + + this._notification = new ChatNotification(this); + this._notification.connect('activated', this.open.bind(this)); + this._notification.connect('updated', () => { + if (this._banner && this._banner.expanded) + this._ackMessages(); + }); + this._notification.connect('destroy', () => { + this._notification = null; + }); + this.pushNotification(this._notification); + } + + _createPolicy() { + if (this._account.protocol_name == 'irc') + return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari'); + return new MessageTray.NotificationApplicationPolicy('empathy'); + } + + createBanner() { + this._banner = new ChatNotificationBanner(this._notification); + + // We ack messages when the user expands the new notification + let id = this._banner.connect('expanded', this._ackMessages.bind(this)); + this._banner.actor.connect('destroy', () => { + this._banner.disconnect(id); + this._banner = null; + }); + + return this._banner; + } + + _updateAlias() { + let oldAlias = this.title; + let newAlias = this._contact.get_alias(); + + if (oldAlias == newAlias) + return; + + this.setTitle(newAlias); + if (this._notification) + this._notification.appendAliasChange(oldAlias, newAlias); + } + + getIcon() { + let file = this._contact.get_avatar_file(); + if (file) { + return new Gio.FileIcon({ file: file }); + } else { + return new Gio.ThemedIcon({ name: 'avatar-default' }); + } + } + + getSecondaryIcon() { + let iconName; + let presenceType = this._contact.get_presence_type(); + + switch (presenceType) { + case Tp.ConnectionPresenceType.AVAILABLE: + iconName = 'user-available'; + break; + case Tp.ConnectionPresenceType.BUSY: + iconName = 'user-busy'; + break; + case Tp.ConnectionPresenceType.OFFLINE: + iconName = 'user-offline'; + break; + case Tp.ConnectionPresenceType.HIDDEN: + iconName = 'user-invisible'; + break; + case Tp.ConnectionPresenceType.AWAY: + iconName = 'user-away'; + break; + case Tp.ConnectionPresenceType.EXTENDED_AWAY: + iconName = 'user-idle'; + break; + default: + iconName = 'user-offline'; + } + return new Gio.ThemedIcon({ name: iconName }); + } + + _updateAvatarIcon() { + this.iconUpdated(); + if (this._notifiction) + this._notification.update(this._notification.title, + this._notification.bannerBodyText, + { gicon: this.getIcon() }); + } + + open() { + Main.overview.hide(); + Main.panel.closeCalendar(); + + if (this._client.is_handling_channel(this._channel)) { + // We are handling the channel, try to pass it to Empathy or Polari + // (depending on the channel type) + // We don't check if either app is availble - mission control will + // fallback to something else if activation fails + + let target; + if (this._channel.connection.protocol_name == 'irc') + target = 'org.freedesktop.Telepathy.Client.Polari'; + else + target = 'org.freedesktop.Telepathy.Client.Empathy.Chat'; + this._client.delegate_channels_async([this._channel], global.get_current_time(), target, null); + } else { + // We are not the handler, just ask to present the channel + let dbus = Tp.DBusDaemon.dup(); + let cd = Tp.ChannelDispatcher.new(dbus); + + cd.present_channel_async(this._channel, global.get_current_time(), null); + } + } + + _getLogMessages() { + let logManager = Tpl.LogManager.dup_singleton(); + let entity = Tpl.Entity.new_from_tp_contact(this._contact, Tpl.EntityType.CONTACT); + + logManager.get_filtered_events_async(this._account, entity, + Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES, + null, this._displayPendingMessages.bind(this)); + } + + _displayPendingMessages(logManager, result) { + let [success, events] = logManager.get_filtered_events_finish(result); + + let logMessages = events.map(makeMessageFromTplEvent); + this._ensureNotification(); + + let pendingTpMessages = this._channel.get_pending_messages(); + let pendingMessages = []; + + for (let i = 0; i < pendingTpMessages.length; i++) { + let message = pendingTpMessages[i]; + + if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT) + continue; + + pendingMessages.push(makeMessageFromTpMessage(message, NotificationDirection.RECEIVED)); + + this._pendingMessages.push(message); + } + + this.countUpdated(); + + let showTimestamp = false; + + for (let i = 0; i < logMessages.length; i++) { + let logMessage = logMessages[i]; + let isPending = false; + + // Skip any log messages that are also in pendingMessages + for (let j = 0; j < pendingMessages.length; j++) { + let pending = pendingMessages[j]; + if (logMessage.timestamp == pending.timestamp && logMessage.text == pending.text) { + isPending = true; + break; + } + } + + if (!isPending) { + showTimestamp = true; + this._notification.appendMessage(logMessage, true, ['chat-log-message']); + } + } + + if (showTimestamp) + this._notification.appendTimestamp(); + + for (let i = 0; i < pendingMessages.length; i++) + this._notification.appendMessage(pendingMessages[i], true); + + if (pendingMessages.length > 0) + this.notify(); + } + + destroy(reason) { + if (this._client.is_handling_channel(this._channel)) { + this._ackMessages(); + // The chat box has been destroyed so it can't + // handle the channel any more. + this._channel.close_async((channel, result) => { + channel.close_finish(result); + }); + } else { + // Don't indicate any unread messages when the notification + // that represents them has been destroyed. + this._pendingMessages = []; + this.countUpdated(); + } + + // Keep source alive while the channel is open + if (reason != MessageTray.NotificationDestroyedReason.SOURCE_CLOSED) + return; + + if (this._destroyed) + return; + + this._destroyed = true; + this._channel.disconnect(this._closedId); + this._channel.disconnect(this._receivedId); + this._channel.disconnect(this._pendingId); + this._channel.disconnect(this._sentId); + + this._contact.disconnect(this._notifyAliasId); + this._contact.disconnect(this._notifyAvatarId); + this._contact.disconnect(this._presenceChangedId); + + super.destroy(reason); + } + + _channelClosed() { + this.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); + } + + /* All messages are new messages for Telepathy sources */ + get count() { + return this._pendingMessages.length; + } + + get unseenCount() { + return this.count; + } + + get countVisible() { + return this.count > 0; + } + + _messageReceived(channel, message) { + if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT) + return; + + this._ensureNotification(); + this._pendingMessages.push(message); + this.countUpdated(); + + message = makeMessageFromTpMessage(message, NotificationDirection.RECEIVED); + this._notification.appendMessage(message); + + // Wait a bit before notifying for the received message, a handler + // could ack it in the meantime. + if (this._notifyTimeoutId != 0) + Mainloop.source_remove(this._notifyTimeoutId); + this._notifyTimeoutId = Mainloop.timeout_add(500, + this._notifyTimeout.bind(this)); + GLib.Source.set_name_by_id(this._notifyTimeoutId, '[gnome-shell] this._notifyTimeout'); + } + + _notifyTimeout() { + if (this._pendingMessages.length != 0) + this.notify(); + + this._notifyTimeoutId = 0; + + return GLib.SOURCE_REMOVE; + } + + // This is called for both messages we send from + // our client and other clients as well. + _messageSent(channel, message, flags, token) { + this._ensureNotification(); + message = makeMessageFromTpMessage(message, NotificationDirection.SENT); + this._notification.appendMessage(message); + } + + notify() { + super.notify(this._notification); + } + + respond(text) { + let type; + if (text.slice(0, 4) == '/me ') { + type = Tp.ChannelTextMessageType.ACTION; + text = text.slice(4); + } else { + type = Tp.ChannelTextMessageType.NORMAL; + } + + let msg = Tp.ClientMessage.new_text(type, text); + this._channel.send_message_async(msg, 0, (src, result) => { + this._channel.send_message_finish(result); + }); + } + + setChatState(state) { + // We don't want to send COMPOSING every time a letter is typed into + // the entry. We send the state only when it changes. Telepathy/Empathy + // might change it behind our back if the user is using both + // gnome-shell's entry and the Empathy conversation window. We could + // keep track of it with the ChatStateChanged signal but it is good + // enough right now. + if (state != this._chatState) { + this._chatState = state; + this._channel.set_chat_state_async(state, null); + } + } + + _presenceChanged(contact, presence, status, message) { + if (this._notification) + this._notification.update(this._notification.title, + this._notification.bannerBodyText, + { secondaryGIcon: this.getSecondaryIcon() }); + } + + _pendingRemoved(channel, message) { + let idx = this._pendingMessages.indexOf(message); + + if (idx >= 0) { + this._pendingMessages.splice(idx, 1); + this.countUpdated(); + } + + if (this._pendingMessages.length == 0 && + this._banner && !this._banner.expanded) + this._banner.hide(); + } + + _ackMessages() { + // Don't clear our messages here, tp-glib will send a + // 'pending-message-removed' for each one. + this._channel.ack_all_pending_messages_async(null); + } +}; + +var ChatNotification = class extends MessageTray.Notification { + constructor(source) { + super(source, source.title, null, + { secondaryGIcon: source.getSecondaryIcon() }); + this.setUrgency(MessageTray.Urgency.HIGH); + this.setResident(true); + + this.messages = []; + this._timestampTimeoutId = 0; + } + + destroy(reason) { + if (this._timestampTimeoutId) + Mainloop.source_remove(this._timestampTimeoutId); + this._timestampTimeoutId = 0; + super.destroy(reason); + } + + /** + * appendMessage: + * @message: An object with the properties: + * text: the body of the message, + * messageType: a #Tp.ChannelTextMessageType, + * sender: the name of the sender, + * timestamp: the time the message was sent + * direction: a #NotificationDirection + * + * @noTimestamp: Whether to add a timestamp. If %true, no timestamp + * will be added, regardless of the difference since the + * last timestamp + */ + appendMessage(message, noTimestamp) { + let messageBody = GLib.markup_escape_text(message.text, -1); + let styles = [message.direction]; + + if (message.messageType == Tp.ChannelTextMessageType.ACTION) { + let senderAlias = GLib.markup_escape_text(message.sender, -1); + messageBody = '%s %s'.format(senderAlias, messageBody); + styles.push('chat-action'); + } + + if (message.direction == NotificationDirection.RECEIVED) + this.update(this.source.title, messageBody, + { datetime: GLib.DateTime.new_from_unix_local (message.timestamp), + bannerMarkup: true }); + + let group = (message.direction == NotificationDirection.RECEIVED ? + 'received' : 'sent'); + + this._append({ body: messageBody, + group: group, + styles: styles, + timestamp: message.timestamp, + noTimestamp: noTimestamp }); + } + + _filterMessages() { + if (this.messages.length < 1) + return; + + let lastMessageTime = this.messages[0].timestamp; + let currentTime = (Date.now() / 1000); + + // Keep the scrollback from growing too long. If the most + // recent message (before the one we just added) is within + // SCROLLBACK_RECENT_TIME, we will keep + // SCROLLBACK_RECENT_LENGTH previous messages. Otherwise + // we'll keep SCROLLBACK_IDLE_LENGTH messages. + + let maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ? + SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH; + + let filteredHistory = this.messages.filter(item => item.realMessage); + if (filteredHistory.length > maxLength) { + let lastMessageToKeep = filteredHistory[maxLength]; + let expired = this.messages.splice(this.messages.indexOf(lastMessageToKeep)); + for (let i = 0; i < expired.length; i++) + this.emit('message-removed', expired[i]); + } + } + + /** + * _append: + * @props: An object with the properties: + * body: The text of the message. + * group: The group of the message, one of: + * 'received', 'sent', 'meta'. + * styles: Style class names for the message to have. + * timestamp: The timestamp of the message. + * noTimestamp: suppress timestamp signal? + */ + _append(props) { + let currentTime = (Date.now() / 1000); + props = Params.parse(props, { body: null, + group: null, + styles: [], + timestamp: currentTime, + noTimestamp: false }); + + // Reset the old message timeout + if (this._timestampTimeoutId) + Mainloop.source_remove(this._timestampTimeoutId); + this._timestampTimeoutId = 0; + + let message = { realMessage: props.group != 'meta', + showTimestamp: false }; + Lang.copyProperties(props, message); + delete message.noTimestamp; + + this.messages.unshift(message); + this.emit('message-added', message); + + if (!props.noTimestamp) { + let timestamp = props.timestamp; + if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME) { + this.appendTimestamp(); + } else { + // Schedule a new timestamp in SCROLLBACK_IMMEDIATE_TIME + // from the timestamp of the message. + this._timestampTimeoutId = Mainloop.timeout_add_seconds( + SCROLLBACK_IMMEDIATE_TIME - (currentTime - timestamp), + this.appendTimestamp.bind(this)); + GLib.Source.set_name_by_id(this._timestampTimeoutId, '[gnome-shell] this.appendTimestamp'); + } + } + + this._filterMessages(); + } + + appendTimestamp() { + this._timestampTimeoutId = 0; + + this.messages[0].showTimestamp = true; + this.emit('timestamp-changed', this.messages[0]); + + this._filterMessages(); + + return GLib.SOURCE_REMOVE; + } + + appendAliasChange(oldAlias, newAlias) { + oldAlias = GLib.markup_escape_text(oldAlias, -1); + newAlias = GLib.markup_escape_text(newAlias, -1); + + /* Translators: this is the other person changing their old IM name to their new + IM name. */ + let message = '' + _("%s is now known as %s").format(oldAlias, newAlias) + ''; + + this._append({ body: message, + group: 'meta', + styles: ['chat-meta-message'] }); + + this._filterMessages(); + } +}; + +var ChatLineBox = GObject.registerClass( +class ChatLineBox extends St.BoxLayout { + vfunc_get_preferred_height(forWidth) { + let [, natHeight] = super.vfunc_get_preferred_height(forWidth); + return [natHeight, natHeight]; + } +}); + +var ChatNotificationBanner = class extends MessageTray.NotificationBanner { + constructor(notification) { + super(notification); + + this._responseEntry = new St.Entry({ style_class: 'chat-response', + x_expand: true, + can_focus: true }); + this._responseEntry.clutter_text.connect('activate', this._onEntryActivated.bind(this)); + this._responseEntry.clutter_text.connect('text-changed', this._onEntryChanged.bind(this)); + this.setActionArea(this._responseEntry); + + this._responseEntry.clutter_text.connect('key-focus-in', () => { + this.focused = true; + }); + this._responseEntry.clutter_text.connect('key-focus-out', () => { + this.focused = false; + this.emit('unfocused'); + }); + + this._scrollArea = new St.ScrollView({ style_class: 'chat-scrollview vfade', + vscrollbar_policy: St.PolicyType.AUTOMATIC, + hscrollbar_policy: St.PolicyType.NEVER, + visible: this.expanded }); + this._contentArea = new St.BoxLayout({ style_class: 'chat-body', + vertical: true }); + this._scrollArea.add_actor(this._contentArea); + + this.setExpandedBody(this._scrollArea); + this.setExpandedLines(CHAT_EXPAND_LINES); + + this._lastGroup = null; + + // Keep track of the bottom position for the current adjustment and + // force a scroll to the bottom if things change while we were at the + // bottom + this._oldMaxScrollValue = this._scrollArea.vscroll.adjustment.value; + this._scrollArea.vscroll.adjustment.connect('changed', adjustment => { + if (adjustment.value == this._oldMaxScrollValue) + this.scrollTo(St.Side.BOTTOM); + this._oldMaxScrollValue = Math.max(adjustment.lower, adjustment.upper - adjustment.page_size); + }); + + this._inputHistory = new History.HistoryManager({ entry: this._responseEntry.clutter_text }); + + this._composingTimeoutId = 0; + + this._messageActors = new Map(); + + this._messageAddedId = this.notification.connect('message-added', + (n, message) => { + this._addMessage(message); + }); + this._messageRemovedId = this.notification.connect('message-removed', + (n, message) => { + let actor = this._messageActors.get(message); + if (this._messageActors.delete(message)) + actor.destroy(); + }); + this._timestampChangedId = this.notification.connect('timestamp-changed', + (n, message) => { + this._updateTimestamp(message); + }); + + for (let i = this.notification.messages.length - 1; i >= 0; i--) + this._addMessage(this.notification.messages[i]); + } + + _onDestroy() { + super._onDestroy(); + this.notification.disconnect(this._messageAddedId); + this.notification.disconnect(this._messageRemovedId); + this.notification.disconnect(this._timestampChangedId); + } + + scrollTo(side) { + let adjustment = this._scrollArea.vscroll.adjustment; + if (side == St.Side.TOP) + adjustment.value = adjustment.lower; + else if (side == St.Side.BOTTOM) + adjustment.value = adjustment.upper; + } + + hide() { + this.emit('done-displaying'); + } + + _addMessage(message) { + let highlighter = new MessageList.URLHighlighter(message.body, true, true); + let body = highlighter.actor; + + let styles = message.styles; + for (let i = 0; i < styles.length; i++) + body.add_style_class_name(styles[i]); + + let group = message.group; + if (group != this._lastGroup) { + this._lastGroup = group; + body.add_style_class_name('chat-new-group'); + } + + let lineBox = new ChatLineBox(); + lineBox.add(body); + this._contentArea.add_actor(lineBox); + this._messageActors.set(message, lineBox); + + this._updateTimestamp(message); + } + + _updateTimestamp(message) { + let actor = this._messageActors.get(message); + if (!actor) + return; + + while (actor.get_n_children() > 1) + actor.get_child_at_index(1).destroy(); + + if (message.showTimestamp) { + let lastMessageTime = message.timestamp; + let lastMessageDate = new Date(lastMessageTime * 1000); + + let timeLabel = Util.createTimeLabel(lastMessageDate); + timeLabel.style_class = 'chat-meta-message'; + timeLabel.x_expand = timeLabel.y_expand = true; + timeLabel.x_align = timeLabel.y_align = Clutter.ActorAlign.END; + + actor.add_actor(timeLabel); + } + } + + _onEntryActivated() { + let text = this._responseEntry.get_text(); + if (text == '') + return; + + this._inputHistory.addItem(text); + + // Telepathy sends out the Sent signal for us. + // see Source._messageSent + this._responseEntry.set_text(''); + this.notification.source.respond(text); + } + + _composingStopTimeout() { + this._composingTimeoutId = 0; + + this.notification.source.setChatState(Tp.ChannelChatState.PAUSED); + + return GLib.SOURCE_REMOVE; + } + + _onEntryChanged() { + let text = this._responseEntry.get_text(); + + // If we're typing, we want to send COMPOSING. + // If we empty the entry, we want to send ACTIVE. + // If we've stopped typing for COMPOSING_STOP_TIMEOUT + // seconds, we want to send PAUSED. + + // Remove composing timeout. + if (this._composingTimeoutId > 0) { + Mainloop.source_remove(this._composingTimeoutId); + this._composingTimeoutId = 0; + } + + if (text != '') { + this.notification.source.setChatState(Tp.ChannelChatState.COMPOSING); + + this._composingTimeoutId = Mainloop.timeout_add_seconds( + COMPOSING_STOP_TIMEOUT, + this._composingStopTimeout.bind(this)); + GLib.Source.set_name_by_id(this._composingTimeoutId, '[gnome-shell] this._composingStopTimeout'); + } else { + this.notification.source.setChatState(Tp.ChannelChatState.ACTIVE); + } + } +}; + +var Component = TelepathyComponent; diff --git a/js/ui/ctrlAltTab.js b/js/ui/ctrlAltTab.js new file mode 100644 index 0000000..338080f --- /dev/null +++ b/js/ui/ctrlAltTab.js @@ -0,0 +1,188 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, Meta, Shell, St } = imports.gi; + +const Main = imports.ui.main; +const SwitcherPopup = imports.ui.switcherPopup; +const Params = imports.misc.params; + +var POPUP_APPICON_SIZE = 96; +var POPUP_FADE_TIME = 0.1; // seconds + +var SortGroup = { + TOP: 0, + MIDDLE: 1, + BOTTOM: 2 +}; + +var CtrlAltTabManager = class CtrlAltTabManager { + constructor() { + this._items = []; + this.addGroup(global.window_group, _("Windows"), + 'focus-windows-symbolic', { sortGroup: SortGroup.TOP, + focusCallback: this._focusWindows.bind(this) }); + } + + addGroup(root, name, icon, params) { + let item = Params.parse(params, { sortGroup: SortGroup.MIDDLE, + proxy: root, + focusCallback: null }); + + item.root = root; + item.name = name; + item.iconName = icon; + + this._items.push(item); + root.connect('destroy', () => { this.removeGroup(root); }); + if (root instanceof St.Widget) + global.focus_manager.add_group(root); + } + + removeGroup(root) { + if (root instanceof St.Widget) + global.focus_manager.remove_group(root); + for (let i = 0; i < this._items.length; i++) { + if (this._items[i].root == root) { + this._items.splice(i, 1); + return; + } + } + } + + focusGroup(item, timestamp) { + if (item.focusCallback) + item.focusCallback(timestamp); + else + item.root.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + + // Sort the items into a consistent order; panel first, tray last, + // and everything else in between, sorted by X coordinate, so that + // they will have the same left-to-right ordering in the + // Ctrl-Alt-Tab dialog as they do onscreen. + _sortItems(a, b) { + if (a.sortGroup != b.sortGroup) + return a.sortGroup - b.sortGroup; + + let ax, bx, y; + [ax, y] = a.proxy.get_transformed_position(); + [bx, y] = b.proxy.get_transformed_position(); + + return ax - bx; + } + + popup(backward, binding, mask) { + // Start with the set of focus groups that are currently mapped + let items = this._items.filter(item => item.proxy.mapped); + + // And add the windows metacity would show in its Ctrl-Alt-Tab list + if (Main.sessionMode.hasWindows && !Main.overview.visible) { + let display = global.display; + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + let windows = display.get_tab_list(Meta.TabList.DOCKS, + activeWorkspace); + let windowTracker = Shell.WindowTracker.get_default(); + let textureCache = St.TextureCache.get_default(); + for (let i = 0; i < windows.length; i++) { + let icon = null; + let iconName = null; + if (windows[i].get_window_type () == Meta.WindowType.DESKTOP) { + iconName = 'video-display-symbolic'; + } else { + let app = windowTracker.get_window_app(windows[i]); + if (app) + icon = app.create_icon_texture(POPUP_APPICON_SIZE); + else + icon = textureCache.bind_cairo_surface_property(windows[i], + 'icon', + POPUP_APPICON_SIZE); + } + + items.push({ name: windows[i].title, + proxy: windows[i].get_compositor_private(), + focusCallback: function(timestamp) { + Main.activateWindow(this, timestamp); + }.bind(windows[i]), + iconActor: icon, + iconName: iconName, + sortGroup: SortGroup.MIDDLE }); + } + } + + if (!items.length) + return; + + items.sort(this._sortItems.bind(this)); + + if (!this._popup) { + this._popup = new CtrlAltTabPopup(items); + this._popup.show(backward, binding, mask); + + this._popup.connect('destroy', + () => { + this._popup = null; + }); + } + } + + _focusWindows(timestamp) { + global.display.focus_default_window(timestamp); + } +}; + +var CtrlAltTabPopup = GObject.registerClass( +class CtrlAltTabPopup extends SwitcherPopup.SwitcherPopup { + _init(items) { + super._init(items); + + this._switcherList = new CtrlAltTabSwitcher(this._items); + } + + _keyPressHandler(keysym, action) { + if (action == Meta.KeyBindingAction.SWITCH_PANELS) + this._select(this._next()); + else if (action == Meta.KeyBindingAction.SWITCH_PANELS_BACKWARD) + this._select(this._previous()); + else if (keysym == Clutter.Left) + this._select(this._previous()); + else if (keysym == Clutter.Right) + this._select(this._next()); + else + return Clutter.EVENT_PROPAGATE; + + return Clutter.EVENT_STOP; + } + + _finish(time) { + super._finish(time); + Main.ctrlAltTabManager.focusGroup(this._items[this._selectedIndex], time); + } +}); + +var CtrlAltTabSwitcher = GObject.registerClass( +class CtrlAltTabSwitcher extends SwitcherPopup.SwitcherList { + _init(items) { + super._init(true); + + for (let i = 0; i < items.length; i++) + this._addIcon(items[i]); + } + + _addIcon(item) { + let box = new St.BoxLayout({ style_class: 'alt-tab-app', + vertical: true }); + + let icon = item.iconActor; + if (!icon) { + icon = new St.Icon({ icon_name: item.iconName, + icon_size: POPUP_APPICON_SIZE }); + } + box.add(icon, { x_fill: false, y_fill: false } ); + + let text = new St.Label({ text: item.name }); + box.add(text, { x_fill: false }); + + this.addItem(box, text); + } +}); diff --git a/js/ui/dash.js b/js/ui/dash.js new file mode 100644 index 0000000..6b5aeff --- /dev/null +++ b/js/ui/dash.js @@ -0,0 +1,919 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const AppDisplay = imports.ui.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +var DASH_ANIMATION_TIME = 0.2; +var DASH_ITEM_LABEL_SHOW_TIME = 0.15; +var DASH_ITEM_LABEL_HIDE_TIME = 0.1; +var DASH_ITEM_HOVER_TIMEOUT = 300; + +function getAppFromSource(source) { + if (source instanceof AppDisplay.AppIcon) { + return source.app; + } else { + return null; + } +} + +// A container like StBin, but taking the child's scale into account +// when requesting a size +var DashItemContainer = GObject.registerClass( +class DashItemContainer extends St.Widget { + _init() { + super._init({ style_class: 'dash-item-container', + pivot_point: new Clutter.Point({ x: .5, y: .5 }), + x_expand: true, + x_align: Clutter.ActorAlign.CENTER }); + + this._labelText = ""; + this.label = new St.Label({ style_class: 'dash-label'}); + this.label.hide(); + Main.layoutManager.addChrome(this.label); + this.label_actor = this.label; + + this.child = null; + this._childScale = 0; + this._childOpacity = 0; + this.animatingOut = false; + + this.connect('destroy', () => { + if (this.child != null) + this.child.destroy(); + this.label.destroy(); + }); + } + + vfunc_get_preferred_height(forWidth) { + let themeNode = this.get_theme_node(); + forWidth = themeNode.adjust_for_width(forWidth); + let [minHeight, natHeight] = super.vfunc_get_preferred_height(forWidth); + return themeNode.adjust_preferred_height(minHeight * this.scale_y, + natHeight * this.scale_y); + } + + vfunc_get_preferred_width(forHeight) { + let themeNode = this.get_theme_node(); + forHeight = themeNode.adjust_for_height(forHeight); + let [minWidth, natWidth] = super.vfunc_get_preferred_width(forHeight); + return themeNode.adjust_preferred_width(minWidth * this.scale_x, + natWidth * this.scale_x); + } + + showLabel() { + if (!this._labelText) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.get_transformed_position(); + + let itemHeight = this.allocation.y2 - this.allocation.y1; + + let labelHeight = this.label.get_height(); + let yOffset = Math.floor((itemHeight - labelHeight) / 2) + + let y = stageY + yOffset; + + let node = this.label.get_theme_node(); + let xOffset = node.get_length('-x-offset'); + + let x; + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + x = stageX - this.label.get_width() - xOffset; + else + x = stageX + this.get_width() + xOffset; + + this.label.set_position(x, y); + Tweener.addTween(this.label, + { opacity: 255, + time: DASH_ITEM_LABEL_SHOW_TIME, + transition: 'easeOutQuad', + }); + } + + setLabelText(text) { + this._labelText = text; + this.child.accessible_name = text; + } + + hideLabel() { + Tweener.addTween(this.label, + { opacity: 0, + time: DASH_ITEM_LABEL_HIDE_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this.label.hide(); + } + }); + } + + setChild(actor) { + if (this.child == actor) + return; + + this.destroy_all_children(); + + this.child = actor; + this.add_actor(this.child); + + this.set_scale(this._childScale, this._childScale); + this.set_opacity(this._childOpacity); + } + + show(animate) { + if (this.child == null) + return; + + let time = animate ? DASH_ANIMATION_TIME : 0; + Tweener.addTween(this, + { childScale: 1.0, + childOpacity: 255, + time: time, + transition: 'easeOutQuad' + }); + } + + animateOutAndDestroy() { + this.label.hide(); + + if (this.child == null) { + this.destroy(); + return; + } + + this.animatingOut = true; + Tweener.addTween(this, + { childScale: 0.0, + childOpacity: 0, + time: DASH_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this.destroy(); + } + }); + } + + set childScale(scale) { + this._childScale = scale; + + this.set_scale(scale, scale); + this.queue_relayout(); + } + + get childScale() { + return this._childScale; + } + + set childOpacity(opacity) { + this._childOpacity = opacity; + + this.set_opacity(opacity); + this.queue_redraw(); + } + + get childOpacity() { + return this._childOpacity; + } +}); + +var ShowAppsIcon = GObject.registerClass( +class ShowAppsIcon extends DashItemContainer { + _init() { + super._init(); + + this.toggleButton = new St.Button({ style_class: 'show-apps', + track_hover: true, + can_focus: true, + toggle_mode: true }); + this._iconActor = null; + this.icon = new IconGrid.BaseIcon(_("Show Applications"), + { setSizeManually: true, + showLabel: false, + createIcon: this._createIcon.bind(this) }); + this.toggleButton.add_actor(this.icon); + this.toggleButton._delegate = this; + + this.setChild(this.toggleButton); + this.setDragApp(null); + } + + _createIcon(size) { + this._iconActor = new St.Icon({ icon_name: 'view-app-grid-symbolic', + icon_size: size, + style_class: 'show-apps-icon', + track_hover: true }); + return this._iconActor; + } + + _canRemoveApp(app) { + if (app == null) + return false; + + if (!global.settings.is_writable('favorite-apps')) + return false; + + let id = app.get_id(); + let isFavorite = AppFavorites.getAppFavorites().isFavorite(id); + return isFavorite; + } + + setDragApp(app) { + let canRemove = this._canRemoveApp(app); + + this.toggleButton.set_hover(canRemove); + if (this._iconActor) + this._iconActor.set_hover(canRemove); + + if (canRemove) + this.setLabelText(_("Remove from Favorites")); + else + this.setLabelText(_("Show Applications")); + } + + handleDragOver(source, actor, x, y, time) { + if (!this._canRemoveApp(getAppFromSource(source))) + return DND.DragMotionResult.NO_DROP; + + return DND.DragMotionResult.MOVE_DROP; + } + + acceptDrop(source, actor, x, y, time) { + let app = getAppFromSource(source); + if (!this._canRemoveApp(app)) + return false; + + let id = app.get_id(); + + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + AppFavorites.getAppFavorites().removeFavorite(id); + return false; + }); + + return true; + } +}); + +var DragPlaceholderItem = GObject.registerClass( +class DragPlaceholderItem extends DashItemContainer { + _init() { + super._init(); + this.setChild(new St.Bin({ style_class: 'placeholder' })); + } +}); + +var EmptyDropTargetItem = GObject.registerClass( +class EmptyDropTargetItem extends DashItemContainer { + _init() { + super._init(); + this.setChild(new St.Bin({ style_class: 'empty-dash-drop-target' })); + } +}); + +var DashActor = GObject.registerClass( +class DashActor extends St.Widget { + _init() { + let layout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL }); + super._init({ name: 'dash', + layout_manager: layout, + clip_to_allocation: true }); + } + + vfunc_allocate(box, flags) { + let contentBox = this.get_theme_node().get_content_box(box); + let availWidth = contentBox.x2 - contentBox.x1; + + this.set_allocation(box, flags); + + let [appIcons, showAppsButton] = this.get_children(); + let [showAppsMinHeight, showAppsNatHeight] = showAppsButton.get_preferred_height(availWidth); + + let childBox = new Clutter.ActorBox(); + childBox.x1 = contentBox.x1; + childBox.y1 = contentBox.y1; + childBox.x2 = contentBox.x2; + childBox.y2 = contentBox.y2 - showAppsNatHeight; + appIcons.allocate(childBox, flags); + + childBox.y1 = contentBox.y2 - showAppsNatHeight; + childBox.y2 = contentBox.y2; + showAppsButton.allocate(childBox, flags); + } + + vfunc_get_preferred_height(forWidth) { + // We want to request the natural height of all our children + // as our natural height, so we chain up to StWidget (which + // then calls BoxLayout), but we only request the showApps + // button as the minimum size + + let [, natHeight] = super.vfunc_get_preferred_height(forWidth); + + let themeNode = this.get_theme_node(); + let adjustedForWidth = themeNode.adjust_for_width(forWidth); + let [, showAppsButton] = this.get_children(); + let [minHeight, ] = showAppsButton.get_preferred_height(adjustedForWidth); + [minHeight, ] = themeNode.adjust_preferred_height(minHeight, natHeight); + + return [minHeight, natHeight]; + } +}); + +const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ]; + +var Dash = class Dash { + constructor() { + this._maxHeight = -1; + this.iconSize = 64; + this._shownInitially = false; + + this._dragPlaceholder = null; + this._dragPlaceholderPos = -1; + this._animatingPlaceholdersCount = 0; + this._showLabelTimeoutId = 0; + this._resetHoverTimeoutId = 0; + this._labelShowing = false; + + this._container = new DashActor(); + this._box = new St.BoxLayout({ vertical: true, + clip_to_allocation: true }); + this._box._delegate = this; + this._container.add_actor(this._box); + this._container.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this._showAppsIcon = new ShowAppsIcon(); + this._showAppsIcon.childScale = 1; + this._showAppsIcon.childOpacity = 255; + this._showAppsIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(this._showAppsIcon); + + this.showAppsButton = this._showAppsIcon.toggleButton; + + this._container.add_actor(this._showAppsIcon); + + this.actor = new St.Bin({ child: this._container }); + this.actor.connect('notify::height', () => { + if (this._maxHeight != this.actor.height) + this._queueRedisplay(); + this._maxHeight = this.actor.height; + }); + + this._workId = Main.initializeDeferredWork(this._box, this._redisplay.bind(this)); + + this._appSystem = Shell.AppSystem.get_default(); + + this._appSystem.connect('installed-changed', () => { + AppFavorites.getAppFavorites().reload(); + this._queueRedisplay(); + }); + AppFavorites.getAppFavorites().connect('changed', this._queueRedisplay.bind(this)); + this._appSystem.connect('app-state-changed', this._queueRedisplay.bind(this)); + + Main.overview.connect('item-drag-begin', + this._onDragBegin.bind(this)); + Main.overview.connect('item-drag-end', + this._onDragEnd.bind(this)); + Main.overview.connect('item-drag-cancelled', + this._onDragCancelled.bind(this)); + + // Translators: this is the name of the dock/favorites area on + // the left of the overview + Main.ctrlAltTabManager.addGroup(this.actor, _("Dash"), 'user-bookmarks-symbolic'); + } + + _onDragBegin() { + this._dragCancelled = false; + this._dragMonitor = { + dragMotion: this._onDragMotion.bind(this) + }; + DND.addDragMonitor(this._dragMonitor); + + if (this._box.get_n_children() == 0) { + this._emptyDropTarget = new EmptyDropTargetItem(); + this._box.insert_child_at_index(this._emptyDropTarget, 0); + this._emptyDropTarget.show(true); + } + } + + _onDragCancelled() { + this._dragCancelled = true; + this._endDrag(); + } + + _onDragEnd() { + if (this._dragCancelled) + return; + + this._endDrag(); + } + + _endDrag() { + this._clearDragPlaceholder(); + this._clearEmptyDropTarget(); + this._showAppsIcon.setDragApp(null); + DND.removeDragMonitor(this._dragMonitor); + } + + _onDragMotion(dragEvent) { + let app = getAppFromSource(dragEvent.source); + if (app == null) + return DND.DragMotionResult.CONTINUE; + + let showAppsHovered = + this._showAppsIcon.contains(dragEvent.targetActor); + + if (!this._box.contains(dragEvent.targetActor) || showAppsHovered) + this._clearDragPlaceholder(); + + if (showAppsHovered) + this._showAppsIcon.setDragApp(app); + else + this._showAppsIcon.setDragApp(null); + + return DND.DragMotionResult.CONTINUE; + } + + _appIdListToHash(apps) { + let ids = {}; + for (let i = 0; i < apps.length; i++) + ids[apps[i].get_id()] = apps[i]; + return ids; + } + + _queueRedisplay() { + Main.queueDeferredWork(this._workId); + } + + _hookUpLabel(item, appIcon) { + item.child.connect('notify::hover', () => { + this._syncLabel(item, appIcon); + }); + + let id = Main.overview.connect('hiding', () => { + this._labelShowing = false; + item.hideLabel(); + }); + item.child.connect('destroy', () => { + Main.overview.disconnect(id); + }); + + if (appIcon) { + appIcon.connect('sync-tooltip', () => { + this._syncLabel(item, appIcon); + }); + } + } + + _createAppItem(app) { + let appIcon = new AppDisplay.AppIcon(app, + { setSizeManually: true, + showLabel: false }); + if (appIcon._draggable) { + appIcon._draggable.connect('drag-begin', + () => { + appIcon.actor.opacity = 50; + }); + appIcon._draggable.connect('drag-end', + () => { + appIcon.actor.opacity = 255; + }); + } + + appIcon.connect('menu-state-changed', + (appIcon, opened) => { + this._itemMenuStateChanged(item, opened); + }); + + let item = new DashItemContainer(); + item.setChild(appIcon.actor); + + // Override default AppIcon label_actor, now the + // accessible_name is set at DashItemContainer.setLabelText + appIcon.actor.label_actor = null; + item.setLabelText(app.get_name()); + + appIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(item, appIcon); + + return item; + } + + _itemMenuStateChanged(item, opened) { + // When the menu closes, it calls sync_hover, which means + // that the notify::hover handler does everything we need to. + if (opened) { + if (this._showLabelTimeoutId > 0) { + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + } + + item.hideLabel(); + } + } + + _syncLabel(item, appIcon) { + let shouldShow = appIcon ? appIcon.shouldShowTooltip() : item.child.get_hover(); + + if (shouldShow) { + if (this._showLabelTimeoutId == 0) { + let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; + this._showLabelTimeoutId = Mainloop.timeout_add(timeout, + () => { + this._labelShowing = true; + item.showLabel(); + this._showLabelTimeoutId = 0; + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel'); + if (this._resetHoverTimeoutId > 0) { + Mainloop.source_remove(this._resetHoverTimeoutId); + this._resetHoverTimeoutId = 0; + } + } + } else { + if (this._showLabelTimeoutId > 0) + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + item.hideLabel(); + if (this._labelShowing) { + this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT, + () => { + this._labelShowing = false; + this._resetHoverTimeoutId = 0; + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing'); + } + } + } + + _adjustIconSize() { + // For the icon size, we only consider children which are "proper" + // icons (i.e. ignoring drag placeholders) and which are not + // animating out (which means they will be destroyed at the end of + // the animation) + let iconChildren = this._box.get_children().filter(actor => { + return actor.child && + actor.child._delegate && + actor.child._delegate.icon && + !actor.animatingOut; + }); + + iconChildren.push(this._showAppsIcon); + + if (this._maxHeight == -1) + return; + + let themeNode = this._container.get_theme_node(); + let maxAllocation = new Clutter.ActorBox({ x1: 0, y1: 0, + x2: 42 /* whatever */, + y2: this._maxHeight }); + let maxContent = themeNode.get_content_box(maxAllocation); + let availHeight = maxContent.y2 - maxContent.y1; + let spacing = themeNode.get_length('spacing'); + + let firstButton = iconChildren[0].child; + let firstIcon = firstButton._delegate.icon; + + // Enforce valid spacings during the size request + firstIcon.icon.ensure_style(); + let [, iconHeight] = firstIcon.icon.get_preferred_height(-1); + let [, buttonHeight] = firstButton.get_preferred_height(-1); + + // Subtract icon padding and box spacing from the available height + availHeight -= iconChildren.length * (buttonHeight - iconHeight) + + (iconChildren.length - 1) * spacing; + + let availSize = availHeight / iconChildren.length; + + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + let iconSizes = baseIconSizes.map(s => s * scaleFactor); + + let newIconSize = baseIconSizes[0]; + for (let i = 0; i < iconSizes.length; i++) { + if (iconSizes[i] < availSize) + newIconSize = baseIconSizes[i]; + } + + if (newIconSize == this.iconSize) + return; + + let oldIconSize = this.iconSize; + this.iconSize = newIconSize; + this.emit('icon-size-changed'); + + let scale = oldIconSize / newIconSize; + for (let i = 0; i < iconChildren.length; i++) { + let icon = iconChildren[i].child._delegate.icon; + + // Set the new size immediately, to keep the icons' sizes + // in sync with this.iconSize + icon.setIconSize(this.iconSize); + + // Don't animate the icon size change when the overview + // is transitioning, not visible or when initially filling + // the dash + if (!Main.overview.visible || Main.overview.animationInProgress || + !this._shownInitially) + continue; + + let [targetWidth, targetHeight] = icon.icon.get_size(); + + // Scale the icon's texture to the previous size and + // tween to the new size + icon.icon.set_size(icon.icon.width * scale, + icon.icon.height * scale); + + Tweener.addTween(icon.icon, + { width: targetWidth, + height: targetHeight, + time: DASH_ANIMATION_TIME, + transition: 'easeOutQuad', + }); + } + } + + _redisplay() { + let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); + + let running = this._appSystem.get_running(); + + let children = this._box.get_children().filter(actor => { + return actor.child && + actor.child._delegate && + actor.child._delegate.app; + }); + // Apps currently in the dash + let oldApps = children.map(actor => actor.child._delegate.app); + // Apps supposed to be in the dash + let newApps = []; + + for (let id in favorites) + newApps.push(favorites[id]); + + for (let i = 0; i < running.length; i++) { + let app = running[i]; + if (app.get_id() in favorites) + continue; + newApps.push(app); + } + + // Figure out the actual changes to the list of items; we iterate + // over both the list of items currently in the dash and the list + // of items expected there, and collect additions and removals. + // Moves are both an addition and a removal, where the order of + // the operations depends on whether we encounter the position + // where the item has been added first or the one from where it + // was removed. + // There is an assumption that only one item is moved at a given + // time; when moving several items at once, everything will still + // end up at the right position, but there might be additional + // additions/removals (e.g. it might remove all the launchers + // and add them back in the new order even if a smaller set of + // additions and removals is possible). + // If above assumptions turns out to be a problem, we might need + // to use a more sophisticated algorithm, e.g. Longest Common + // Subsequence as used by diff. + let addedItems = []; + let removedActors = []; + + let newIndex = 0; + let oldIndex = 0; + while (newIndex < newApps.length || oldIndex < oldApps.length) { + let oldApp = oldApps.length > oldIndex ? oldApps[oldIndex] : null; + let newApp = newApps.length > newIndex ? newApps[newIndex] : null; + + // No change at oldIndex/newIndex + if (oldApp == newApp) { + oldIndex++; + newIndex++; + continue; + } + + // App removed at oldIndex + if (oldApp && newApps.indexOf(oldApp) == -1) { + removedActors.push(children[oldIndex]); + oldIndex++; + continue; + } + + // App added at newIndex + if (newApp && oldApps.indexOf(newApp) == -1) { + addedItems.push({ app: newApp, + item: this._createAppItem(newApp), + pos: newIndex }); + newIndex++; + continue; + } + + // App moved + let nextApp = newApps.length > newIndex + 1 ? newApps[newIndex + 1] + : null; + let insertHere = nextApp && nextApp == oldApp; + let alreadyRemoved = removedActors.reduce((result, actor) => { + let removedApp = actor.child._delegate.app; + return result || removedApp == newApp; + }, false); + + if (insertHere || alreadyRemoved) { + let newItem = this._createAppItem(newApp); + addedItems.push({ app: newApp, + item: newItem, + pos: newIndex + removedActors.length }); + newIndex++; + } else { + removedActors.push(children[oldIndex]); + oldIndex++; + } + } + + for (let i = 0; i < addedItems.length; i++) + this._box.insert_child_at_index(addedItems[i].item, + addedItems[i].pos); + + for (let i = 0; i < removedActors.length; i++) { + let item = removedActors[i]; + + // Don't animate item removal when the overview is transitioning + // or hidden + if (Main.overview.visible && !Main.overview.animationInProgress) + item.animateOutAndDestroy(); + else + item.destroy(); + } + + this._adjustIconSize(); + + // Skip animations on first run when adding the initial set + // of items, to avoid all items zooming in at once + + let animate = this._shownInitially && Main.overview.visible && + !Main.overview.animationInProgress; + + if (!this._shownInitially) + this._shownInitially = true; + + for (let i = 0; i < addedItems.length; i++) { + addedItems[i].item.show(animate); + } + + // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 + // Without it, StBoxLayout may use a stale size cache + this._box.queue_relayout(); + } + + _clearDragPlaceholder() { + if (this._dragPlaceholder) { + this._animatingPlaceholdersCount++; + this._dragPlaceholder.animateOutAndDestroy(); + this._dragPlaceholder.connect('destroy', () => { + this._animatingPlaceholdersCount--; + }); + this._dragPlaceholder = null; + } + this._dragPlaceholderPos = -1; + } + + _clearEmptyDropTarget() { + if (this._emptyDropTarget) { + this._emptyDropTarget.animateOutAndDestroy(); + this._emptyDropTarget = null; + } + } + + handleDragOver(source, actor, x, y, time) { + let app = getAppFromSource(source); + + // Don't allow favoriting of transient apps + if (app == null || app.is_window_backed()) + return DND.DragMotionResult.NO_DROP; + + if (!global.settings.is_writable('favorite-apps')) + return DND.DragMotionResult.NO_DROP; + + let favorites = AppFavorites.getAppFavorites().getFavorites(); + let numFavorites = favorites.length; + + let favPos = favorites.indexOf(app); + + let children = this._box.get_children(); + let numChildren = children.length; + let boxHeight = this._box.height; + + // Keep the placeholder out of the index calculation; assuming that + // the remove target has the same size as "normal" items, we don't + // need to do the same adjustment there. + if (this._dragPlaceholder) { + boxHeight -= this._dragPlaceholder.height; + numChildren--; + } + + let pos; + if (!this._emptyDropTarget) + pos = Math.floor(y * numChildren / boxHeight); + else + pos = 0; // always insert at the top when dash is empty + + if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) { + this._dragPlaceholderPos = pos; + + // Don't allow positioning before or after self + if (favPos != -1 && (pos == favPos || pos == favPos + 1)) { + this._clearDragPlaceholder(); + return DND.DragMotionResult.CONTINUE; + } + + // If the placeholder already exists, we just move + // it, but if we are adding it, expand its size in + // an animation + let fadeIn; + if (this._dragPlaceholder) { + this._dragPlaceholder.destroy(); + fadeIn = false; + } else { + fadeIn = true; + } + + this._dragPlaceholder = new DragPlaceholderItem(); + this._dragPlaceholder.child.set_width (this.iconSize); + this._dragPlaceholder.child.set_height (this.iconSize / 2); + this._box.insert_child_at_index(this._dragPlaceholder, + this._dragPlaceholderPos); + this._dragPlaceholder.show(fadeIn); + } + + // Remove the drag placeholder if we are not in the + // "favorites zone" + if (pos > numFavorites) + this._clearDragPlaceholder(); + + if (!this._dragPlaceholder) + return DND.DragMotionResult.NO_DROP; + + let srcIsFavorite = (favPos != -1); + + if (srcIsFavorite) + return DND.DragMotionResult.MOVE_DROP; + + return DND.DragMotionResult.COPY_DROP; + } + + // Draggable target interface + acceptDrop(source, actor, x, y, time) { + let app = getAppFromSource(source); + + // Don't allow favoriting of transient apps + if (app == null || app.is_window_backed()) { + return false; + } + + if (!global.settings.is_writable('favorite-apps')) + return false; + + let id = app.get_id(); + + let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); + + let srcIsFavorite = (id in favorites); + + let favPos = 0; + let children = this._box.get_children(); + for (let i = 0; i < this._dragPlaceholderPos; i++) { + if (this._dragPlaceholder && + children[i] == this._dragPlaceholder) + continue; + + let childId = children[i].child._delegate.app.get_id(); + if (childId == id) + continue; + if (childId in favorites) + favPos++; + } + + // No drag placeholder means we don't wan't to favorite the app + // and we are dragging it to its original position + if (!this._dragPlaceholder) + return true; + + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + let appFavorites = AppFavorites.getAppFavorites(); + if (srcIsFavorite) + appFavorites.moveFavoriteToPos(id, favPos); + else + appFavorites.addFavoriteAtPos(id, favPos); + return false; + }); + + return true; + } +}; +Signals.addSignalMethods(Dash.prototype); diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js new file mode 100644 index 0000000..06ea2b5 --- /dev/null +++ b/js/ui/dateMenu.js @@ -0,0 +1,590 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, GnomeDesktop, + GObject, GWeather, Shell, St } = imports.gi; + +const Util = imports.misc.util; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const Calendar = imports.ui.calendar; +const Weather = imports.misc.weather; +const System = imports.system; + +const MAX_FORECASTS = 5; + +function _isToday(date) { + let now = new Date(); + return now.getYear() == date.getYear() && + now.getMonth() == date.getMonth() && + now.getDate() == date.getDate(); +} + +var TodayButton = class TodayButton { + constructor(calendar) { + // Having the ability to go to the current date if the user is already + // on the current date can be confusing. So don't make the button reactive + // until the selected date changes. + this.actor = new St.Button({ style_class: 'datemenu-today-button', + x_expand: true, x_align: St.Align.START, + can_focus: true, + reactive: false + }); + this.actor.connect('clicked', () => { + this._calendar.setDate(new Date(), false); + }); + + let hbox = new St.BoxLayout({ vertical: true }); + this.actor.add_actor(hbox); + + this._dayLabel = new St.Label({ style_class: 'day-label', + x_align: Clutter.ActorAlign.START }); + hbox.add_actor(this._dayLabel); + + this._dateLabel = new St.Label({ style_class: 'date-label' }); + hbox.add_actor(this._dateLabel); + + this._calendar = calendar; + this._calendar.connect('selected-date-changed', (calendar, date) => { + // Make the button reactive only if the selected date is not the + // current date. + this.actor.reactive = !_isToday(date) + }); + } + + setDate(date) { + this._dayLabel.set_text(date.toLocaleFormat('%A')); + + /* Translators: This is the date format to use when the calendar popup is + * shown - it is shown just below the time in the top bar (e.g., + * "Tue 9:29 AM"). The string itself should become a full date, e.g., + * "February 17 2015". + */ + let dateFormat = Shell.util_translate_time_string (N_("%B %-d %Y")); + this._dateLabel.set_text(date.toLocaleFormat(dateFormat)); + + /* Translators: This is the accessible name of the date button shown + * below the time in the shell; it should combine the weekday and the + * date, e.g. "Tuesday February 17 2015". + */ + dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y")); + this.actor.accessible_name = date.toLocaleFormat(dateFormat); + } +}; + +var WorldClocksSection = class WorldClocksSection { + constructor() { + this._clock = new GnomeDesktop.WallClock(); + this._clockNotifyId = 0; + + this._locations = []; + + this.actor = new St.Button({ style_class: 'world-clocks-button', + x_fill: true, + can_focus: true }); + this.actor.connect('clicked', () => { + this._clockAppMon.activateApp(); + + Main.overview.hide(); + Main.panel.closeCalendar(); + }); + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._grid = new St.Widget({ style_class: 'world-clocks-grid', + layout_manager: layout }); + layout.hookup_style(this._grid); + + this.actor.child = this._grid; + + this._clockAppMon = new Util.AppSettingsMonitor('org.gnome.clocks.desktop', + 'org.gnome.clocks'); + this._clockAppMon.connect('available-changed', + this._sync.bind(this)); + this._clockAppMon.watchSetting('world-clocks', + this._clocksChanged.bind(this)); + this._sync(); + } + + _sync() { + this.actor.visible = this._clockAppMon.available; + } + + _clocksChanged(settings) { + this._grid.destroy_all_children(); + this._locations = []; + + 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); + if (l && l.get_timezone() != null) + this._locations.push({ location: l }); + } + + this._locations.sort((a, b) => { + return a.location.get_timezone().get_offset() - + b.location.get_timezone().get_offset(); + }); + + let layout = this._grid.layout_manager; + let title = (this._locations.length == 0) ? _("Add world clocks…") + : _("World Clocks"); + let header = new St.Label({ style_class: 'world-clocks-header', + x_align: Clutter.ActorAlign.START, + text: title }); + layout.attach(header, 0, 0, 2, 1); + this.actor.label_actor = header; + + let localOffset = GLib.DateTime.new_now_local().get_utc_offset(); + + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i].location; + + let name = l.get_city_name() || l.get_name(); + let label = new St.Label({ style_class: 'world-clocks-city', + text: name, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true }); + + let time = new St.Label({ style_class: 'world-clocks-time' }); + + let otherOffset = this._getTimeAtLocation(l).get_utc_offset(); + let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR; + let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f'; + let prefix = (offset >= 0) ? '+' : '-'; + let tz = new St.Label({ style_class: 'world-clocks-timezone', + text: fmt.format(prefix, Math.abs(offset)), + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER }); + + if (this._grid.text_direction == Clutter.TextDirection.RTL) { + layout.attach(tz, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(label, 2, i + 1, 1, 1); + } else { + layout.attach(label, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(tz, 2, i + 1, 1, 1); + } + + this._locations[i].actor = time; + } + + if (this._grid.get_n_children() > 1) { + if (!this._clockNotifyId) + this._clockNotifyId = + this._clock.connect('notify::clock', this._updateLabels.bind(this)); + this._updateLabels(); + } else { + if (this._clockNotifyId) + this._clock.disconnect(this._clockNotifyId); + this._clockNotifyId = 0; + } + } + + _getTimeAtLocation(location) { + let tz = GLib.TimeZone.new(location.get_timezone().get_tzid()); + return GLib.DateTime.new_now(tz); + } + + _updateLabels() { + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i]; + let now = this._getTimeAtLocation(l.location); + l.actor.text = Util.formatTime(now, { timeOnly: true }); + } + } +}; + +var WeatherSection = class WeatherSection { + constructor() { + this._weatherClient = new Weather.WeatherClient(); + + this.actor = new St.Button({ style_class: 'weather-button', + x_fill: true, + can_focus: true }); + this.actor.connect('clicked', () => { + this._weatherClient.activateApp(); + + Main.overview.hide(); + Main.panel.closeCalendar(); + }); + this.actor.connect('notify::mapped', () => { + if (this.actor.mapped) + this._weatherClient.update(); + }); + + let box = new St.BoxLayout({ style_class: 'weather-box', + vertical: true }); + + this.actor.child = box; + + let titleBox = new St.BoxLayout(); + titleBox.add_child(new St.Label({ style_class: 'weather-header', + x_align: Clutter.ActorAlign.START, + x_expand: true, + text: _("Weather") })); + box.add_child(titleBox); + + this._titleLocation = new St.Label({ style_class: 'weather-header location', + x_align: Clutter.ActorAlign.END }); + titleBox.add_child(this._titleLocation); + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._forecastGrid = new St.Widget({ style_class: 'weather-grid', + layout_manager: layout }); + layout.hookup_style(this._forecastGrid); + box.add_child(this._forecastGrid); + + this._weatherClient.connect('changed', this._sync.bind(this)); + this._sync(); + } + + _getInfos() { + let info = this._weatherClient.info; + let forecasts = info.get_forecast_list(); + + let current = info; + let infos = [info]; + for (let i = 0; i < forecasts.length; i++) { + let [ok, timestamp] = forecasts[i].get_value_update(); + let datetime = new Date(timestamp * 1000); + if (!_isToday(datetime)) + continue; // Ignore forecasts from other days + + [ok, timestamp] = current.get_value_update(); + let currenttime = new Date(timestamp * 1000); + if (currenttime.getHours() == datetime.getHours()) + continue; // Enforce a minimum interval of 1h + + current = forecasts[i]; + if (infos.push(current) == MAX_FORECASTS) + break; // Use a maximum of five forecasts + } + return infos; + } + + _addForecasts() { + let layout = this._forecastGrid.layout_manager; + + let infos = this._getInfos(); + if (this._forecastGrid.text_direction == Clutter.TextDirection.RTL) + infos.reverse(); + + let col = 0; + infos.forEach(fc => { + let [ok, timestamp] = fc.get_value_update(); + let timeStr = Util.formatTime(new Date(timestamp * 1000), { + timeOnly: true + }); + + let icon = new St.Icon({ style_class: 'weather-forecast-icon', + icon_name: fc.get_symbolic_icon_name(), + x_align: Clutter.ActorAlign.CENTER, + x_expand: true }); + let temp = new St.Label({ style_class: 'weather-forecast-temp', + text: fc.get_temp_summary(), + x_align: Clutter.ActorAlign.CENTER }); + let time = new St.Label({ style_class: 'weather-forecast-time', + text: timeStr, + x_align: Clutter.ActorAlign.CENTER }); + + layout.attach(icon, col, 0, 1, 1); + layout.attach(temp, col, 1, 1, 1); + layout.attach(time, col, 2, 1, 1); + col++; + }); + } + + _setStatusLabel(text) { + let layout = this._forecastGrid.layout_manager; + let label = new St.Label({ text }); + layout.attach(label, 0, 0, 1, 1); + } + + _updateForecasts() { + this._forecastGrid.destroy_all_children(); + + if (!this._weatherClient.hasLocation) { + this._setStatusLabel(_("Select a location…")); + return; + } + + let info = this._weatherClient.info; + this._titleLocation.text = info.get_location().get_name(); + + if (this._weatherClient.loading) { + this._setStatusLabel(_("Loading…")); + return; + } + + if (info.is_valid()) { + this._addForecasts(); + return; + } + + if (info.network_error()) + this._setStatusLabel(_("Go online for weather information")); + else + this._setStatusLabel(_("Weather information is currently unavailable")); + } + + _sync() { + this.actor.visible = this._weatherClient.available; + + if (!this.actor.visible) + return; + + this._titleLocation.visible = this._weatherClient.hasLocation; + + this._updateForecasts(); + } +}; + +var MessagesIndicator = class MessagesIndicator { + constructor() { + this.actor = new St.Icon({ icon_name: 'message-indicator-symbolic', + icon_size: 16, + visible: false, y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + + this._sources = []; + + Main.messageTray.connect('source-added', this._onSourceAdded.bind(this)); + Main.messageTray.connect('source-removed', this._onSourceRemoved.bind(this)); + Main.messageTray.connect('queue-changed', this._updateCount.bind(this)); + + let sources = Main.messageTray.getSources(); + sources.forEach(source => { this._onSourceAdded(null, source); }); + } + + _onSourceAdded(tray, source) { + source.connect('count-updated', this._updateCount.bind(this)); + this._sources.push(source); + this._updateCount(); + } + + _onSourceRemoved(tray, source) { + this._sources.splice(this._sources.indexOf(source), 1); + this._updateCount(); + } + + _updateCount() { + let count = 0; + this._sources.forEach(source => { count += source.unseenCount; }); + count -= Main.messageTray.queueCount; + + this.actor.visible = (count > 0); + } +}; + +var IndicatorPad = GObject.registerClass( +class IndicatorPad extends St.Widget { + _init(actor) { + this._source = actor; + this._source.connect('notify::visible', () => { this.queue_relayout(); }); + this._source.connect('notify::size', () => { this.queue_relayout(); }); + super._init(); + } + + vfunc_get_preferred_width(forHeight) { + if (this._source.visible) + return this._source.get_preferred_width(forHeight); + return [0, 0]; + } + + vfunc_get_preferred_height(forWidth) { + if (this._source.visible) + return this._source.get_preferred_height(forWidth); + return [0, 0]; + } +}); + +var FreezableBinLayout = GObject.registerClass( +class FreezableBinLayout extends Clutter.BinLayout { + _init() { + super._init(); + + this._frozen = false; + this._savedWidth = [NaN, NaN]; + this._savedHeight = [NaN, NaN]; + } + + set frozen(v) { + if (this._frozen == v) + return; + + this._frozen = v; + if (!this._frozen) + this.layout_changed(); + } + + vfunc_get_preferred_width(container, forHeight) { + if (!this._frozen || this._savedWidth.some(isNaN)) + return super.vfunc_get_preferred_width(container, forHeight); + return this._savedWidth; + } + + vfunc_get_preferred_height(container, forWidth) { + if (!this._frozen || this._savedHeight.some(isNaN)) + return super.vfunc_get_preferred_height(container, forWidth); + return this._savedHeight; + } + + vfunc_allocate(container, allocation, flags) { + super.vfunc_allocate(container, allocation, flags); + + let [width, height] = allocation.get_size(); + this._savedWidth = [width, width]; + this._savedHeight = [height, height]; + } +}); + +var CalendarColumnLayout = GObject.registerClass( +class CalendarColumnLayout extends Clutter.BoxLayout { + _init(actor) { + super._init({ orientation: Clutter.Orientation.VERTICAL }); + this._calActor = actor; + } + + vfunc_get_preferred_width(container, forHeight) { + if (!this._calActor || this._calActor.get_parent() != container) + return super.vfunc_get_preferred_width(container, forHeight); + return this._calActor.get_preferred_width(forHeight); + } +}); + +var DateMenuButton = GObject.registerClass( +class DateMenuButton extends PanelMenu.Button { + _init() { + let item; + let hbox; + let vbox; + + let menuAlignment = 0.5; + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + menuAlignment = 1.0 - menuAlignment; + super._init(menuAlignment); + + this._clockDisplay = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); + this._indicator = new MessagesIndicator(); + + let box = new St.BoxLayout(); + box.add_actor(new IndicatorPad(this._indicator.actor)); + box.add_actor(this._clockDisplay); + box.add_actor(this._indicator.actor); + + this.actor.label_actor = this._clockDisplay; + this.actor.add_actor(box); + this.actor.add_style_class_name ('clock-display'); + + + let layout = new FreezableBinLayout(); + let bin = new St.Widget({ layout_manager: layout }); + // For some minimal compatibility with PopupMenuItem + bin._delegate = this; + this.menu.box.add_child(bin); + + hbox = new St.BoxLayout({ name: 'calendarArea' }); + bin.add_actor(hbox); + + this._calendar = new Calendar.Calendar(); + this._calendar.connect('selected-date-changed', + (calendar, date) => { + layout.frozen = !_isToday(date); + this._messageList.setDate(date); + }); + + this.menu.connect('open-state-changed', (menu, isOpen) => { + // Whenever the menu is opened, select today + if (isOpen) { + let now = new Date(); + this._calendar.setDate(now); + this._date.setDate(now); + this._messageList.setDate(now); + } + }); + + // Fill up the first column + this._messageList = new Calendar.CalendarMessageList(); + hbox.add(this._messageList.actor, { expand: true, y_fill: false, y_align: St.Align.START }); + + // Fill up the second column + let boxLayout = new CalendarColumnLayout(this._calendar.actor); + vbox = new St.Widget({ style_class: 'datemenu-calendar-column', + layout_manager: boxLayout }); + boxLayout.hookup_style(vbox); + hbox.add(vbox); + + this._date = new TodayButton(this._calendar); + vbox.add_actor(this._date.actor); + + vbox.add_actor(this._calendar.actor); + + this._displaysSection = new St.ScrollView({ style_class: 'datemenu-displays-section vfade', + x_expand: true, x_fill: true, + overlay_scrollbars: true }); + this._displaysSection.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + vbox.add_actor(this._displaysSection); + + let displaysBox = new St.BoxLayout({ vertical: true, + style_class: 'datemenu-displays-box' }); + this._displaysSection.add_actor(displaysBox); + + this._clocksItem = new WorldClocksSection(); + displaysBox.add(this._clocksItem.actor, { x_fill: true }); + + this._weatherItem = new WeatherSection(); + displaysBox.add(this._weatherItem.actor, { x_fill: true }); + + // Done with hbox for calendar and event list + + this._clock = new GnomeDesktop.WallClock(); + this._clock.bind_property('clock', this._clockDisplay, 'text', GObject.BindingFlags.SYNC_CREATE); + this._clock.connect('notify::timezone', this._updateTimeZone.bind(this)); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + } + + _getEventSource() { + return new Calendar.DBusEventSource(); + } + + _setEventSource(eventSource) { + if (this._eventSource) + this._eventSource.destroy(); + + this._calendar.setEventSource(eventSource); + this._messageList.setEventSource(eventSource); + + this._eventSource = eventSource; + } + + _updateTimeZone() { + // SpiderMonkey caches the time zone so we must explicitly clear it + // before we can update the calendar, see + // https://bugzilla.gnome.org/show_bug.cgi?id=678507 + System.clearDateCaches(); + + this._calendar.updateTimeZone(); + } + + _sessionUpdated() { + let eventSource; + let showEvents = Main.sessionMode.showCalendarEvents; + if (showEvents) { + eventSource = this._getEventSource(); + } else { + eventSource = new Calendar.EmptyEventSource(); + } + this._setEventSource(eventSource); + + // Displays are not actually expected to launch Settings when activated + // but the corresponding app (clocks, weather); however we can consider + // that display-specific settings, so re-use "allowSettings" here ... + this._displaysSection.visible = Main.sessionMode.allowSettings; + } +}); diff --git a/js/ui/dialog.js b/js/ui/dialog.js new file mode 100644 index 0000000..41a0763 --- /dev/null +++ b/js/ui/dialog.js @@ -0,0 +1,241 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GObject, Pango, St } = imports.gi; + +var Dialog = GObject.registerClass( +class Dialog extends St.Widget { + _init(parentActor, styleClass) { + super._init({ layout_manager: new Clutter.BinLayout() }); + this.connect('destroy', this._onDestroy.bind(this)); + + this._initialKeyFocus = null; + this._initialKeyFocusDestroyId = 0; + this._pressedKey = null; + this._buttonKeys = {}; + this._createDialog(); + this.add_child(this._dialog); + + if (styleClass != null) + this._dialog.add_style_class_name(styleClass); + + this._parentActor = parentActor; + this._eventId = this._parentActor.connect('event', this._modalEventHandler.bind(this)); + this._parentActor.add_child(this); + } + + _createDialog() { + this._dialog = new St.BoxLayout({ style_class: 'modal-dialog', + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: true }); + + // modal dialogs are fixed width and grow vertically; set the request + // mode accordingly so wrapped labels are handled correctly during + // size requests. + this._dialog.request_mode = Clutter.RequestMode.HEIGHT_FOR_WIDTH; + this._dialog.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this.contentLayout = new St.BoxLayout({ vertical: true, + style_class: "modal-dialog-content-box" }); + this._dialog.add(this.contentLayout, + { expand: true, + x_fill: true, + y_fill: true, + x_align: St.Align.MIDDLE, + y_align: St.Align.START }); + + this.buttonLayout = new St.Widget ({ layout_manager: new Clutter.BoxLayout({ homogeneous:true }) }); + this._dialog.add(this.buttonLayout, + { x_align: St.Align.MIDDLE, + y_align: St.Align.START }); + } + + _onDestroy() { + if (this._eventId != 0) + this._parentActor.disconnect(this._eventId); + this._eventId = 0; + } + + _modalEventHandler(actor, event) { + if (event.type() == Clutter.EventType.KEY_PRESS) { + this._pressedKey = event.get_key_symbol(); + } else if (event.type() == Clutter.EventType.KEY_RELEASE) { + let pressedKey = this._pressedKey; + this._pressedKey = null; + + let symbol = event.get_key_symbol(); + if (symbol != pressedKey) + return Clutter.EVENT_PROPAGATE; + + let buttonInfo = this._buttonKeys[symbol]; + if (!buttonInfo) + return Clutter.EVENT_PROPAGATE; + + let { button, action } = buttonInfo; + + if (action && button.reactive) { + action(); + return Clutter.EVENT_STOP; + } + } + + return Clutter.EVENT_PROPAGATE; + } + + _setInitialKeyFocus(actor) { + if (this._initialKeyFocus) + this._initialKeyFocus.disconnect(this._initialKeyFocusDestroyId); + + this._initialKeyFocus = actor; + + this._initialKeyFocusDestroyId = actor.connect('destroy', () => { + this._initialKeyFocus = null; + this._initialKeyFocusDestroyId = 0; + }); + } + + get initialKeyFocus() { + return this._initialKeyFocus || this; + } + + addContent(actor) { + this.contentLayout.add (actor, { expand: true }); + } + + addButton(buttonInfo) { + let { label, action, key } = buttonInfo; + let isDefault = buttonInfo['default']; + let keys; + + if (key) + keys = [key]; + else if (isDefault) + keys = [Clutter.KEY_Return, Clutter.KEY_KP_Enter, Clutter.KEY_ISO_Enter]; + else + keys = []; + + let button = new St.Button({ style_class: 'modal-dialog-linked-button', + button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, + reactive: true, + can_focus: true, + x_expand: true, + y_expand: true, + label: label }); + button.connect('clicked', action); + + buttonInfo['button'] = button; + + if (isDefault) + button.add_style_pseudo_class('default'); + + if (this._initialKeyFocus == null || isDefault) + this._setInitialKeyFocus(button); + + for (let i in keys) + this._buttonKeys[keys[i]] = buttonInfo; + + this.buttonLayout.add_actor(button); + + return button; + } + + clearButtons() { + this.buttonLayout.destroy_all_children(); + this._buttonKeys = {}; + } +}); + +var MessageDialogContent = GObject.registerClass({ + Properties: { + 'icon': GObject.ParamSpec.object('icon', 'icon', 'icon', + GObject.ParamFlags.READWRITE | + GObject.ParamFlags.CONSTRUCT, + Gio.Icon.$gtype), + 'title': GObject.ParamSpec.string('title', 'title', 'title', + GObject.ParamFlags.READWRITE | + GObject.ParamFlags.CONSTRUCT, + null), + 'subtitle': GObject.ParamSpec.string('subtitle', 'subtitle', 'subtitle', + GObject.ParamFlags.READWRITE | + GObject.ParamFlags.CONSTRUCT, + null), + 'body': GObject.ParamSpec.string('body', 'body', 'body', + GObject.ParamFlags.READWRITE | + GObject.ParamFlags.CONSTRUCT, + null) + } +}, class MessageDialogContent extends St.BoxLayout { + _init(params) { + this._icon = new St.Icon({ y_align: Clutter.ActorAlign.START }); + this._title = new St.Label({ style_class: 'headline' }); + this._subtitle = new St.Label(); + this._body = new St.Label(); + + ['icon', 'title', 'subtitle', 'body'].forEach(prop => { + this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`); + }); + + let textProps = { ellipsize: Pango.EllipsizeMode.NONE, + line_wrap: true }; + Object.assign(this._subtitle.clutter_text, textProps); + Object.assign(this._body.clutter_text, textProps); + + if (!params.hasOwnProperty('style_class')) + params.style_class = 'message-dialog-main-layout'; + + super._init(params); + + this.messageBox = new St.BoxLayout({ style_class: 'message-dialog-content', + x_expand: true, + vertical: true }); + + this.messageBox.add_actor(this._title); + this.messageBox.add_actor(this._subtitle); + this.messageBox.add_actor(this._body); + + this.add_actor(this._icon); + this.add_actor(this.messageBox); + } + + get icon() { + return this._icon.gicon; + } + + get title() { + return this._title.text; + } + + get subtitle() { + return this._subtitle.text; + } + + get body() { + return this._body.text; + } + + set icon(icon) { + Object.assign(this._icon, { gicon: icon, visible: icon != null }); + this.notify('icon'); + } + + set title(title) { + this._setLabel(this._title, 'title', title); + } + + set subtitle(subtitle) { + this._setLabel(this._subtitle, 'subtitle', subtitle); + } + + set body(body) { + this._setLabel(this._body, 'body', body); + } + + _setLabel(label, prop, value) { + Object.assign(label, { text: value || '', visible: value != null }); + this.notify(prop); + } + + insertBeforeBody(actor) { + this.messageBox.insert_child_below(actor, this._body); + } +}); diff --git a/js/ui/dnd.js b/js/ui/dnd.js new file mode 100644 index 0000000..367815d --- /dev/null +++ b/js/ui/dnd.js @@ -0,0 +1,766 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; + +// Time to scale down to maxDragActorSize +var SCALE_ANIMATION_TIME = 0.25; +// Time to animate to original position on cancel +var SNAP_BACK_ANIMATION_TIME = 0.25; +// Time to animate to original position on success +var REVERT_ANIMATION_TIME = 0.75; + +var DragMotionResult = { + NO_DROP: 0, + COPY_DROP: 1, + MOVE_DROP: 2, + CONTINUE: 3 +}; + +var DragState = { + INIT: 0, + DRAGGING: 1, + CANCELLED: 2, +}; + +var DRAG_CURSOR_MAP = { + 0: Meta.Cursor.DND_UNSUPPORTED_TARGET, + 1: Meta.Cursor.DND_COPY, + 2: Meta.Cursor.DND_MOVE +}; + +var DragDropResult = { + FAILURE: 0, + SUCCESS: 1, + CONTINUE: 2 +}; +var dragMonitors = []; + +let eventHandlerActor = null; +let currentDraggable = null; + +function _getEventHandlerActor() { + if (!eventHandlerActor) { + eventHandlerActor = new Clutter.Actor({ width: 0, height: 0 }); + Main.uiGroup.add_actor(eventHandlerActor); + // We connect to 'event' rather than 'captured-event' because the capturing phase doesn't happen + // when you've grabbed the pointer. + eventHandlerActor.connect('event', (actor, event) => { + return currentDraggable._onEvent(actor, event); + }); + } + return eventHandlerActor; +} + +function addDragMonitor(monitor) { + dragMonitors.push(monitor); +} + +function removeDragMonitor(monitor) { + for (let i = 0; i < dragMonitors.length; i++) + if (dragMonitors[i] == monitor) { + dragMonitors.splice(i, 1); + return; + } +} + +var _Draggable = class _Draggable { + constructor(actor, params) { + params = Params.parse(params, { manualMode: false, + restoreOnSuccess: false, + dragActorMaxSize: undefined, + dragActorOpacity: undefined }); + + this.actor = actor; + this._dragState = DragState.INIT; + + if (!params.manualMode) { + this.actor.connect('button-press-event', + this._onButtonPress.bind(this)); + this.actor.connect('touch-event', + this._onTouchEvent.bind(this)); + } + + this.actor.connect('destroy', () => { + this._actorDestroyed = true; + + if (this._dragState == DragState.DRAGGING && this._dragCancellable) + this._cancelDrag(global.get_current_time()); + this.disconnectAll(); + }); + this._onEventId = null; + this._touchSequence = null; + + this._restoreOnSuccess = params.restoreOnSuccess; + this._dragActorMaxSize = params.dragActorMaxSize; + this._dragActorOpacity = params.dragActorOpacity; + + this._buttonDown = false; // The mouse button has been pressed and has not yet been released. + this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting). + this._dragCancellable = true; + + this._eventsGrabbed = false; + this._capturedEventId = 0; + } + + _onButtonPress(actor, event) { + if (event.get_button() != 1) + return Clutter.EVENT_PROPAGATE; + + if (Tweener.getTweenCount(actor)) + return Clutter.EVENT_PROPAGATE; + + this._buttonDown = true; + this._grabActor(event.get_device()); + + let [stageX, stageY] = event.get_coords(); + this._dragStartX = stageX; + this._dragStartY = stageY; + + return Clutter.EVENT_PROPAGATE; + } + + _onTouchEvent(actor, event) { + // We only handle touch events here on wayland. On X11 + // we do get emulated pointer events, which already works + // for single-touch cases. Besides, the X11 passive touch grab + // set up by Mutter will make us see first the touch events + // and later the pointer events, so it will look like two + // unrelated series of events, we want to avoid double handling + // in these cases. + if (!Meta.is_wayland_compositor()) + return Clutter.EVENT_PROPAGATE; + + if (event.type() != Clutter.EventType.TOUCH_BEGIN || + !global.display.is_pointer_emulating_sequence(event.get_event_sequence())) + return Clutter.EVENT_PROPAGATE; + + if (Tweener.getTweenCount(actor)) + return Clutter.EVENT_PROPAGATE; + + this._buttonDown = true; + this._grabActor(event.get_device(), event.get_event_sequence()); + + let [stageX, stageY] = event.get_coords(); + this._dragStartX = stageX; + this._dragStartY = stageY; + + return Clutter.EVENT_PROPAGATE; + } + + _grabDevice(actor, pointer, touchSequence) { + if (touchSequence) + pointer.sequence_grab(touchSequence, actor); + else if (pointer) + pointer.grab (actor); + + this._grabbedDevice = pointer; + this._touchSequence = touchSequence; + + this._capturedEventId = global.stage.connect('captured-event', (actor, event) => { + let device = event.get_device(); + if (device != this._grabbedDevice && + device.get_device_type() != Clutter.InputDeviceType.KEYBOARD_DEVICE) + return Clutter.EVENT_STOP; + return Clutter.EVENT_PROPAGATE; + }); + } + + _ungrabDevice() { + if (this._capturedEventId != 0) { + global.stage.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + + if (this._touchSequence) + this._grabbedDevice.sequence_ungrab (this._touchSequence); + else + this._grabbedDevice.ungrab(); + + this._touchSequence = null; + this._grabbedDevice = null; + } + + _grabActor(device, touchSequence) { + this._grabDevice(this.actor, device, touchSequence); + this._onEventId = this.actor.connect('event', + this._onEvent.bind(this)); + } + + _ungrabActor() { + if (!this._onEventId) + return; + + this._ungrabDevice(); + this.actor.disconnect(this._onEventId); + this._onEventId = null; + } + + _grabEvents(device, touchSequence) { + if (!this._eventsGrabbed) { + this._eventsGrabbed = Main.pushModal(_getEventHandlerActor()); + if (this._eventsGrabbed) + this._grabDevice(_getEventHandlerActor(), device, touchSequence); + } + } + + _ungrabEvents() { + if (this._eventsGrabbed) { + this._ungrabDevice(); + Main.popModal(_getEventHandlerActor()); + this._eventsGrabbed = false; + } + } + + _eventIsRelease(event) { + if (event.type() == Clutter.EventType.BUTTON_RELEASE) { + let buttonMask = (Clutter.ModifierType.BUTTON1_MASK | + Clutter.ModifierType.BUTTON2_MASK | + Clutter.ModifierType.BUTTON3_MASK); + /* We only obey the last button release from the device, + * other buttons may get pressed/released during the DnD op. + */ + return (event.get_state() & buttonMask) == 0; + } else if (event.type() == Clutter.EventType.TOUCH_END) { + /* For touch, we only obey the pointer emulating sequence */ + return global.display.is_pointer_emulating_sequence(event.get_event_sequence()); + } + + return false; + } + + _onEvent(actor, event) { + let device = event.get_device(); + + if (this._grabbedDevice && + device != this._grabbedDevice && + device.get_device_type() != Clutter.InputDeviceType.KEYBOARD_DEVICE) + return Clutter.EVENT_PROPAGATE; + + // We intercept BUTTON_RELEASE event to know that the button was released in case we + // didn't start the drag, to drop the draggable in case the drag was in progress, and + // to complete the drag and ensure that whatever happens to be under the pointer does + // not get triggered if the drag was cancelled with Esc. + if (this._eventIsRelease(event)) { + this._buttonDown = false; + if (this._dragState == DragState.DRAGGING) { + return this._dragActorDropped(event); + } else if ((this._dragActor != null || this._dragState == DragState.CANCELLED) && + !this._animationInProgress) { + // Drag must have been cancelled with Esc. + this._dragComplete(); + return Clutter.EVENT_STOP; + } else { + // Drag has never started. + this._ungrabActor(); + return Clutter.EVENT_PROPAGATE; + } + // We intercept MOTION event to figure out if the drag has started and to draw + // this._dragActor under the pointer when dragging is in progress + } else if (event.type() == Clutter.EventType.MOTION || + (event.type() == Clutter.EventType.TOUCH_UPDATE && + global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) { + if (this._dragActor && this._dragState == DragState.DRAGGING) { + return this._updateDragPosition(event); + } else if (this._dragActor == null && this._dragState != DragState.CANCELLED) { + return this._maybeStartDrag(event); + } + // We intercept KEY_PRESS event so that we can process Esc key press to cancel + // dragging and ignore all other key presses. + } else if (event.type() == Clutter.EventType.KEY_PRESS && this._dragState == DragState.DRAGGING) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.Escape) { + this._cancelDrag(event.get_time()); + return Clutter.EVENT_STOP; + } + } + + return Clutter.EVENT_PROPAGATE; + } + + /** + * fakeRelease: + * + * Fake a release event. + * Must be called if you want to intercept release events on draggable + * actors for other purposes (for example if you're using + * PopupMenu.ignoreRelease()) + */ + fakeRelease() { + this._buttonDown = false; + this._ungrabActor(); + } + + /** + * startDrag: + * @stageX: X coordinate of event + * @stageY: Y coordinate of event + * @time: Event timestamp + * + * Directly initiate a drag and drop operation from the given actor. + * This function is useful to call if you've specified manualMode + * for the draggable. + */ + startDrag(stageX, stageY, time, sequence, device) { + if (currentDraggable) + return; + + if (device == undefined) { + let event = Clutter.get_current_event(); + + if (event) + device = event.get_device(); + + if (device == undefined) { + let manager = Clutter.DeviceManager.get_default(); + device = manager.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE); + } + } + + currentDraggable = this; + this._dragState = DragState.DRAGGING; + + // Special-case St.Button: the pointer grab messes with the internal + // state, so force a reset to a reasonable state here + if (this.actor instanceof St.Button) { + this.actor.fake_release(); + this.actor.hover = false; + } + + this.emit('drag-begin', time); + if (this._onEventId) + this._ungrabActor(); + + this._grabEvents(device, sequence); + global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); + + this._dragX = this._dragStartX = stageX; + this._dragY = this._dragStartY = stageY; + + if (this.actor._delegate && this.actor._delegate.getDragActor) { + this._dragActor = this.actor._delegate.getDragActor(); + Main.uiGroup.add_child(this._dragActor); + this._dragActor.raise_top(); + Shell.util_set_hidden_from_pick(this._dragActor, true); + + // Drag actor does not always have to be the same as actor. For example drag actor + // can be an image that's part of the actor. So to perform "snap back" correctly we need + // to know what was the drag actor source. + if (this.actor._delegate.getDragActorSource) { + this._dragActorSource = this.actor._delegate.getDragActorSource(); + // If the user dragged from the source, then position + // the dragActor over it. Otherwise, center it + // around the pointer + let [sourceX, sourceY] = this._dragActorSource.get_transformed_position(); + let x, y; + if (stageX > sourceX && stageX <= sourceX + this._dragActor.width && + stageY > sourceY && stageY <= sourceY + this._dragActor.height) { + x = sourceX; + y = sourceY; + } else { + x = stageX - this._dragActor.width / 2; + y = stageY - this._dragActor.height / 2; + } + this._dragActor.set_position(x, y); + } else { + this._dragActorSource = this.actor; + } + this._dragOrigParent = undefined; + + this._dragOffsetX = this._dragActor.x - this._dragStartX; + this._dragOffsetY = this._dragActor.y - this._dragStartY; + } else { + this._dragActor = this.actor; + + this._dragActorSource = undefined; + this._dragOrigParent = this.actor.get_parent(); + this._dragOrigX = this._dragActor.x; + this._dragOrigY = this._dragActor.y; + this._dragOrigScale = this._dragActor.scale_x; + + // Set the actor's scale such that it will keep the same + // transformed size when it's reparented to the uiGroup + let [scaledWidth, scaledHeight] = this.actor.get_transformed_size(); + this._dragActor.set_scale(scaledWidth / this.actor.width, + scaledHeight / this.actor.height); + + let [actorStageX, actorStageY] = this.actor.get_transformed_position(); + this._dragOffsetX = actorStageX - this._dragStartX; + this._dragOffsetY = actorStageY - this._dragStartY; + + this._dragOrigParent.remove_actor(this._dragActor); + Main.uiGroup.add_child(this._dragActor); + this._dragActor.raise_top(); + Shell.util_set_hidden_from_pick(this._dragActor, true); + } + + this._dragActorDestroyId = this._dragActor.connect('destroy', () => { + // Cancel ongoing animation (if any) + this._finishAnimation(); + + this._dragActor = null; + if (this._dragState == DragState.DRAGGING) + this._dragState = DragState.CANCELLED; + }); + this._dragOrigOpacity = this._dragActor.opacity; + if (this._dragActorOpacity != undefined) + this._dragActor.opacity = this._dragActorOpacity; + + this._snapBackX = this._dragStartX + this._dragOffsetX; + this._snapBackY = this._dragStartY + this._dragOffsetY; + this._snapBackScale = this._dragActor.scale_x; + + if (this._dragActorMaxSize != undefined) { + let [scaledWidth, scaledHeight] = this._dragActor.get_transformed_size(); + let currentSize = Math.max(scaledWidth, scaledHeight); + if (currentSize > this._dragActorMaxSize) { + let scale = this._dragActorMaxSize / currentSize; + let origScale = this._dragActor.scale_x; + let origDragOffsetX = this._dragOffsetX; + let origDragOffsetY = this._dragOffsetY; + + // The position of the actor changes as we scale + // around the drag position, but we can't just tween + // to the final position because that tween would + // fight with updates as the user continues dragging + // the mouse; instead we do the position computations in + // an onUpdate() function. + Tweener.addTween(this._dragActor, + { scale_x: scale * origScale, + scale_y: scale * origScale, + time: SCALE_ANIMATION_TIME, + transition: 'easeOutQuad', + onUpdate() { + let currentScale = this._dragActor.scale_x / origScale; + this._dragOffsetX = currentScale * origDragOffsetX; + this._dragOffsetY = currentScale * origDragOffsetY; + this._dragActor.set_position(this._dragX + this._dragOffsetX, + this._dragY + this._dragOffsetY); + }, + onUpdateScope: this }); + } + } + } + + _maybeStartDrag(event) { + let [stageX, stageY] = event.get_coords(); + + // See if the user has moved the mouse enough to trigger a drag + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + let threshold = St.Settings.get().drag_threshold * scaleFactor; + if (!currentDraggable && + (Math.abs(stageX - this._dragStartX) > threshold || + Math.abs(stageY - this._dragStartY) > threshold)) { + this.startDrag(stageX, stageY, event.get_time(), this._touchSequence, event.get_device()); + this._updateDragPosition(event); + } + + return true; + } + + _pickTargetActor() { + return this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, + this._dragX, this._dragY); + } + + _updateDragHover() { + this._updateHoverId = 0; + let target = this._pickTargetActor(); + + let dragEvent = { + x: this._dragX, + y: this._dragY, + dragActor: this._dragActor, + source: this.actor._delegate, + targetActor: target + }; + + let targetActorDestroyHandlerId; + let handleTargetActorDestroyClosure; + handleTargetActorDestroyClosure = () => { + target = this._pickTargetActor(); + dragEvent.targetActor = target; + targetActorDestroyHandlerId = + target.connect('destroy', handleTargetActorDestroyClosure); + }; + targetActorDestroyHandlerId = + target.connect('destroy', handleTargetActorDestroyClosure); + + for (let i = 0; i < dragMonitors.length; i++) { + let motionFunc = dragMonitors[i].dragMotion; + if (motionFunc) { + let result = motionFunc(dragEvent); + if (result != DragMotionResult.CONTINUE) { + global.display.set_cursor(DRAG_CURSOR_MAP[result]); + return GLib.SOURCE_REMOVE; + } + } + } + dragEvent.targetActor.disconnect(targetActorDestroyHandlerId); + + while (target) { + if (target._delegate && target._delegate.handleDragOver) { + let [r, targX, targY] = target.transform_stage_point(this._dragX, this._dragY); + // We currently loop through all parents on drag-over even if one of the children has handled it. + // We can check the return value of the function and break the loop if it's true if we don't want + // to continue checking the parents. + let result = target._delegate.handleDragOver(this.actor._delegate, + this._dragActor, + targX, + targY, + 0); + if (result != DragMotionResult.CONTINUE) { + global.display.set_cursor(DRAG_CURSOR_MAP[result]); + return GLib.SOURCE_REMOVE; + } + } + target = target.get_parent(); + } + global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); + return GLib.SOURCE_REMOVE; + } + + _queueUpdateDragHover() { + if (this._updateHoverId) + return; + + this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT, + this._updateDragHover.bind(this)); + GLib.Source.set_name_by_id(this._updateHoverId, '[gnome-shell] this._updateDragHover'); + } + + _updateDragPosition(event) { + let [stageX, stageY] = event.get_coords(); + this._dragX = stageX; + this._dragY = stageY; + this._dragActor.set_position(stageX + this._dragOffsetX, + stageY + this._dragOffsetY); + + this._queueUpdateDragHover(); + return true; + } + + _dragActorDropped(event) { + let [dropX, dropY] = event.get_coords(); + let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, + dropX, dropY); + + // We call observers only once per motion with the innermost + // target actor. If necessary, the observer can walk the + // parent itself. + let dropEvent = { + dropActor: this._dragActor, + targetActor: target, + clutterEvent: event + }; + for (let i = 0; i < dragMonitors.length; i++) { + let dropFunc = dragMonitors[i].dragDrop; + if (dropFunc) + switch (dropFunc(dropEvent)) { + case DragDropResult.FAILURE: + case DragDropResult.SUCCESS: + return true; + case DragDropResult.CONTINUE: + continue; + } + } + + // At this point it is too late to cancel a drag by destroying + // the actor, the fate of which is decided by acceptDrop and its + // side-effects + this._dragCancellable = false; + + while (target) { + if (target._delegate && target._delegate.acceptDrop) { + let [r, targX, targY] = target.transform_stage_point(dropX, dropY); + if (target._delegate.acceptDrop(this.actor._delegate, + this._dragActor, + targX, + targY, + event.get_time())) { + // If it accepted the drop without taking the actor, + // handle it ourselves. + if (this._dragActor && this._dragActor.get_parent() == Main.uiGroup) { + if (this._restoreOnSuccess) { + this._restoreDragActor(event.get_time()); + return true; + } else + this._dragActor.destroy(); + } + + this._dragState = DragState.INIT; + global.display.set_cursor(Meta.Cursor.DEFAULT); + this.emit('drag-end', event.get_time(), true); + this._dragComplete(); + return true; + } + } + target = target.get_parent(); + } + + this._cancelDrag(event.get_time()); + + return true; + } + + _getRestoreLocation() { + let x, y, scale; + + if (this._dragActorSource && this._dragActorSource.visible) { + // Snap the clone back to its source + [x, y] = this._dragActorSource.get_transformed_position(); + let [sourceScaledWidth, sourceScaledHeight] = this._dragActorSource.get_transformed_size(); + scale = sourceScaledWidth ? this._dragActor.width / sourceScaledWidth : 0; + } else if (this._dragOrigParent) { + // Snap the actor back to its original position within + // its parent, adjusting for the fact that the parent + // may have been moved or scaled + let [parentX, parentY] = this._dragOrigParent.get_transformed_position(); + let [parentWidth, parentHeight] = this._dragOrigParent.get_size(); + let [parentScaledWidth, parentScaledHeight] = this._dragOrigParent.get_transformed_size(); + let parentScale = 1.0; + if (parentWidth != 0) + parentScale = parentScaledWidth / parentWidth; + + x = parentX + parentScale * this._dragOrigX; + y = parentY + parentScale * this._dragOrigY; + scale = this._dragOrigScale * parentScale; + } else { + // Snap back actor to its original stage position + x = this._snapBackX; + y = this._snapBackY; + scale = this._snapBackScale; + } + + return [x, y, scale]; + } + + _cancelDrag(eventTime) { + this.emit('drag-cancelled', eventTime); + let wasCancelled = (this._dragState == DragState.CANCELLED); + this._dragState = DragState.CANCELLED; + + if (this._actorDestroyed || wasCancelled) { + global.display.set_cursor(Meta.Cursor.DEFAULT); + if (!this._buttonDown) + this._dragComplete(); + this.emit('drag-end', eventTime, false); + if (!this._dragOrigParent && this._dragActor) + this._dragActor.destroy(); + + return; + } + + let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); + + this._animateDragEnd(eventTime, + { x: snapBackX, + y: snapBackY, + scale_x: snapBackScale, + scale_y: snapBackScale, + time: SNAP_BACK_ANIMATION_TIME, + }); + } + + _restoreDragActor(eventTime) { + this._dragState = DragState.INIT; + let [restoreX, restoreY, restoreScale] = this._getRestoreLocation(); + + // fade the actor back in at its original location + this._dragActor.set_position(restoreX, restoreY); + this._dragActor.set_scale(restoreScale, restoreScale); + this._dragActor.opacity = 0; + + this._animateDragEnd(eventTime, + { time: REVERT_ANIMATION_TIME }); + } + + _animateDragEnd(eventTime, params) { + this._animationInProgress = true; + + params['opacity'] = this._dragOrigOpacity; + params['transition'] = 'easeOutQuad'; + params['onComplete'] = this._onAnimationComplete; + params['onCompleteScope'] = this; + params['onCompleteParams'] = [this._dragActor, eventTime]; + + // start the animation + Tweener.addTween(this._dragActor, params) + } + + _finishAnimation() { + if (!this._animationInProgress) + return + + this._animationInProgress = false; + if (!this._buttonDown) + this._dragComplete(); + + global.display.set_cursor(Meta.Cursor.DEFAULT); + } + + _onAnimationComplete(dragActor, eventTime) { + if (this._dragOrigParent) { + Main.uiGroup.remove_child(this._dragActor); + this._dragOrigParent.add_actor(this._dragActor); + dragActor.set_scale(this._dragOrigScale, this._dragOrigScale); + dragActor.set_position(this._dragOrigX, this._dragOrigY); + } else { + dragActor.destroy(); + } + + this.emit('drag-end', eventTime, false); + this._finishAnimation(); + } + + _dragComplete() { + if (!this._actorDestroyed && this._dragActor) + Shell.util_set_hidden_from_pick(this._dragActor, false); + + this._ungrabEvents(); + global.sync_pointer(); + + if (this._updateHoverId) { + GLib.source_remove(this._updateHoverId); + this._updateHoverId = 0; + } + + if (this._dragActor) { + this._dragActor.disconnect(this._dragActorDestroyId); + this._dragActor = null; + } + + this._dragState = DragState.INIT; + currentDraggable = null; + } +}; +Signals.addSignalMethods(_Draggable.prototype); + +/** + * makeDraggable: + * @actor: Source actor + * @params: (optional) Additional parameters + * + * Create an object which controls drag and drop for the given actor. + * + * If %manualMode is %true in @params, do not automatically start + * drag and drop on click + * + * If %dragActorMaxSize is present in @params, the drag actor will + * be scaled down to be no larger than that size in pixels. + * + * If %dragActorOpacity is present in @params, the drag actor will + * will be set to have that opacity during the drag. + * + * Note that when the drag actor is the source actor and the drop + * succeeds, the actor scale and opacity aren't reset; if the drop + * target wants to reuse the actor, it's up to the drop target to + * reset these values. + */ +function makeDraggable(actor, params) { + return new _Draggable(actor, params); +} diff --git a/js/ui/edgeDragAction.js b/js/ui/edgeDragAction.js new file mode 100644 index 0000000..e811dda --- /dev/null +++ b/js/ui/edgeDragAction.js @@ -0,0 +1,76 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, Meta, St } = imports.gi; + +const Main = imports.ui.main; + +var EDGE_THRESHOLD = 20; +var DRAG_DISTANCE = 80; + +var EdgeDragAction = GObject.registerClass({ + Signals: { 'activated': {} }, +}, class EdgeDragAction extends Clutter.GestureAction { + _init(side, allowedModes) { + super._init(); + this._side = side; + this._allowedModes = allowedModes; + this.set_n_touch_points(1); + + global.display.connect('grab-op-begin', () => { this.cancel(); }); + } + + _getMonitorRect(x, y) { + let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 }); + let monitorIndex = global.display.get_monitor_index_for_rect(rect); + + return global.display.get_monitor_geometry(monitorIndex); + } + + vfunc_gesture_prepare(actor) { + if (this.get_n_current_points() == 0) + return false; + + if (!(this._allowedModes & Main.actionMode)) + return false; + + let [x, y] = this.get_press_coords(0); + let monitorRect = this._getMonitorRect(x, y); + + return ((this._side == St.Side.LEFT && x < monitorRect.x + EDGE_THRESHOLD) || + (this._side == St.Side.RIGHT && x > monitorRect.x + monitorRect.width - EDGE_THRESHOLD) || + (this._side == St.Side.TOP && y < monitorRect.y + EDGE_THRESHOLD) || + (this._side == St.Side.BOTTOM && y > monitorRect.y + monitorRect.height - EDGE_THRESHOLD)); + } + + vfunc_gesture_progress(actor) { + let [startX, startY] = this.get_press_coords(0); + let [x, y] = this.get_motion_coords(0); + let offsetX = Math.abs (x - startX); + let offsetY = Math.abs (y - startY); + + if (offsetX < EDGE_THRESHOLD && offsetY < EDGE_THRESHOLD) + return true; + + if ((offsetX > offsetY && + (this._side == St.Side.TOP || this._side == St.Side.BOTTOM)) || + (offsetY > offsetX && + (this._side == St.Side.LEFT || this._side == St.Side.RIGHT))) { + this.cancel(); + return false; + } + + return true; + } + + vfunc_gesture_end(actor) { + let [startX, startY] = this.get_press_coords(0); + let [x, y] = this.get_motion_coords(0); + let monitorRect = this._getMonitorRect(startX, startY); + + if ((this._side == St.Side.TOP && y > monitorRect.y + DRAG_DISTANCE) || + (this._side == St.Side.BOTTOM && y < monitorRect.y + monitorRect.height - DRAG_DISTANCE) || + (this._side == St.Side.LEFT && x > monitorRect.x + DRAG_DISTANCE) || + (this._side == St.Side.RIGHT && x < monitorRect.x + monitorRect.width - DRAG_DISTANCE)) + this.emit('activated'); + } +}); diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js new file mode 100644 index 0000000..0d4aa9d --- /dev/null +++ b/js/ui/endSessionDialog.js @@ -0,0 +1,750 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +/* + * Copyright 2010-2016 Red Hat, Inc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +const Mainloop = imports.mainloop; + +const { AccountsService, Clutter, Gio, + GLib, Pango, Polkit, Shell, St } = imports.gi; + +const CheckBox = imports.ui.checkBox; +const GnomeSession = imports.misc.gnomeSession; +const LoginManager = imports.misc.loginManager; +const ModalDialog = imports.ui.modalDialog; +const UserWidget = imports.ui.userWidget; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +let _endSessionDialog = null; + +const _ITEM_ICON_SIZE = 48; +const _DIALOG_ICON_SIZE = 48; + +var GSM_SESSION_MANAGER_LOGOUT_FORCE = 2; + +const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog'); + +const logoutDialogContent = { + subjectWithUser: C_("title", "Log Out %s"), + subject: C_("title", "Log Out"), + descriptionWithUser(user, seconds) { + return ngettext("%s will be logged out automatically in %d second.", + "%s will be logged out automatically in %d seconds.", + seconds).format(user, seconds); + }, + description(seconds) { + return ngettext("You will be logged out automatically in %d second.", + "You will be logged out automatically in %d seconds.", + seconds).format(seconds); + }, + showBatteryWarning: false, + confirmButtons: [{ signal: 'ConfirmedLogout', + label: C_("button", "Log Out") }], + iconStyleClass: 'end-session-dialog-logout-icon', + showOtherSessions: false, +}; + +const shutdownDialogContent = { + subject: C_("title", "Power Off"), + subjectWithUpdates: C_("title", "Install Updates & Power Off"), + description(seconds) { + return ngettext("The system will power off automatically in %d second.", + "The system will power off automatically in %d seconds.", + seconds).format(seconds); + }, + checkBoxText: C_("checkbox", "Install pending software updates"), + showBatteryWarning: true, + confirmButtons: [{ signal: 'ConfirmedReboot', + label: C_("button", "Restart") }, + { signal: 'ConfirmedShutdown', + label: C_("button", "Power Off") }], + iconName: 'system-shutdown-symbolic', + iconStyleClass: 'end-session-dialog-shutdown-icon', + showOtherSessions: true, +}; + +const restartDialogContent = { + subject: C_("title", "Restart"), + description(seconds) { + return ngettext("The system will restart automatically in %d second.", + "The system will restart automatically in %d seconds.", + seconds).format(seconds); + }, + showBatteryWarning: false, + confirmButtons: [{ signal: 'ConfirmedReboot', + label: C_("button", "Restart") }], + iconName: 'view-refresh-symbolic', + iconStyleClass: 'end-session-dialog-shutdown-icon', + showOtherSessions: true, +}; + +const restartUpdateDialogContent = { + + subject: C_("title", "Restart & Install Updates"), + description(seconds) { + return ngettext("The system will automatically restart and install updates in %d second.", + "The system will automatically restart and install updates in %d seconds.", + seconds).format(seconds); + }, + showBatteryWarning: true, + confirmButtons: [{ signal: 'ConfirmedReboot', + label: C_("button", "Restart & Install") }], + unusedFutureButtonForTranslation: C_("button", "Install & Power Off"), + unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"), + iconName: 'view-refresh-symbolic', + iconStyleClass: 'end-session-dialog-shutdown-icon', + showOtherSessions: true, +}; + +const restartUpgradeDialogContent = { + + subject: C_("title", "Restart & Install Upgrade"), + upgradeDescription(distroName, distroVersion) { + /* Translators: This is the text displayed for system upgrades in the + shut down dialog. First %s gets replaced with the distro name and + second %s with the distro version to upgrade to */ + return _("%s %s will be installed after restart. Upgrade installation can take a long time: ensure that you have backed up and that the computer is plugged in.").format(distroName, distroVersion); + }, + disableTimer: true, + showBatteryWarning: false, + confirmButtons: [{ signal: 'ConfirmedReboot', + label: C_("button", "Restart & Install") }], + iconName: 'view-refresh-symbolic', + iconStyleClass: 'end-session-dialog-shutdown-icon', + showOtherSessions: true, +}; + +const DialogType = { + LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */, + SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */, + RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */, + UPDATE_RESTART: 3, + UPGRADE_RESTART: 4 +}; + +const DialogContent = { + 0 /* DialogType.LOGOUT */: logoutDialogContent, + 1 /* DialogType.SHUTDOWN */: shutdownDialogContent, + 2 /* DialogType.RESTART */: restartDialogContent, + 3 /* DialogType.UPDATE_RESTART */: restartUpdateDialogContent, + 4 /* DialogType.UPGRADE_RESTART */: restartUpgradeDialogContent +}; + +var MAX_USERS_IN_SESSION_DIALOG = 5; + +const LogindSessionIface = loadInterfaceXML('org.freedesktop.login1.Session'); +const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface); + +const PkOfflineIface = loadInterfaceXML('org.freedesktop.PackageKit.Offline'); +const PkOfflineProxy = Gio.DBusProxy.makeProxyWrapper(PkOfflineIface); + +const UPowerIface = loadInterfaceXML('org.freedesktop.UPower'); +const UPowerProxy = Gio.DBusProxy.makeProxyWrapper(UPowerIface); + +function findAppFromInhibitor(inhibitor) { + let desktopFile; + try { + [desktopFile] = inhibitor.GetAppIdSync(); + } catch(e) { + // XXX -- sometimes JIT inhibitors generated by gnome-session + // get removed too soon. Don't fail in this case. + log('gnome-session gave us a dead inhibitor: %s'.format(inhibitor.get_object_path())); + return null; + } + + if (!GLib.str_has_suffix(desktopFile, '.desktop')) + desktopFile += '.desktop'; + + return Shell.AppSystem.get_default().lookup_heuristic_basename(desktopFile); +} + +// The logout timer only shows updates every 10 seconds +// until the last 10 seconds, then it shows updates every +// second. This function takes a given time and returns +// what we should show to the user for that time. +function _roundSecondsToInterval(totalSeconds, secondsLeft, interval) { + let time; + + time = Math.ceil(secondsLeft); + + // Final count down is in decrements of 1 + if (time <= interval) + return time; + + // Round up higher than last displayable time interval + time += interval - 1; + + // Then round down to that time interval + if (time > totalSeconds) + time = Math.ceil(totalSeconds); + else + time -= time % interval; + + return time; +} + +function _setLabelText(label, text) { + if (text) { + label.set_text(text); + label.show(); + } else { + label.set_text(''); + label.hide(); + } +} + +function _setCheckBoxLabel(checkBox, text) { + let label = checkBox.getLabelActor(); + + if (text) { + label.set_text(text); + checkBox.actor.show(); + } else { + label.set_text(''); + checkBox.actor.hide(); + } +} + +function init() { + // This always returns the same singleton object + // By instantiating it initially, we register the + // bus object, etc. + _endSessionDialog = new EndSessionDialog(); +} + +var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog { + constructor() { + super({ styleClass: 'end-session-dialog', + destroyOnClose: false }); + + this._loginManager = LoginManager.getLoginManager(); + this._userManager = AccountsService.UserManager.get_default(); + this._user = this._userManager.get_user(GLib.get_user_name()); + + this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system, + 'org.freedesktop.PackageKit', + '/org/freedesktop/PackageKit', + (proxy, error) => { + if (error) + log(error.message); + }); + this._powerProxy = new UPowerProxy(Gio.DBus.system, + 'org.freedesktop.UPower', + '/org/freedesktop/UPower', + (proxy, error) => { + if (error) { + log(error.message); + return; + } + this._powerProxy.connect('g-properties-changed', + this._sync.bind(this)); + this._sync(); + }); + + this._secondsLeft = 0; + this._totalSecondsToStayOpen = 0; + this._applications = []; + this._sessions = []; + + this.connect('destroy', + this._onDestroy.bind(this)); + this.connect('opened', + this._onOpened.bind(this)); + + this._userLoadedId = this._user.connect('notify::is_loaded', this._sync.bind(this)); + this._userChangedId = this._user.connect('changed', this._sync.bind(this)); + + let mainContentLayout = new St.BoxLayout({ vertical: false }); + this.contentLayout.add(mainContentLayout, + { x_fill: true, + y_fill: false }); + + this._iconBin = new St.Bin(); + mainContentLayout.add(this._iconBin, + { x_fill: true, + y_fill: false, + x_align: St.Align.END, + y_align: St.Align.START }); + + let messageLayout = new St.BoxLayout({ vertical: true, + style_class: 'end-session-dialog-layout' }); + mainContentLayout.add(messageLayout, + { y_align: St.Align.START }); + + this._subjectLabel = new St.Label({ style_class: 'end-session-dialog-subject' }); + + messageLayout.add(this._subjectLabel, + { x_fill: false, + y_fill: false, + x_align: St.Align.START, + y_align: St.Align.START }); + + this._descriptionLabel = new St.Label({ style_class: 'end-session-dialog-description' }); + this._descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._descriptionLabel.clutter_text.line_wrap = true; + + messageLayout.add(this._descriptionLabel, + { y_fill: true, + y_align: St.Align.START }); + + this._checkBox = new CheckBox.CheckBox(); + this._checkBox.actor.connect('clicked', this._sync.bind(this)); + messageLayout.add(this._checkBox.actor); + + this._batteryWarning = new St.Label({ style_class: 'end-session-dialog-warning', + text: _("Running on battery power: please plug in before installing updates.") }); + this._batteryWarning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._batteryWarning.clutter_text.line_wrap = true; + messageLayout.add(this._batteryWarning); + + this._scrollView = new St.ScrollView({ style_class: 'end-session-dialog-list' }); + this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + this.contentLayout.add(this._scrollView, + { x_fill: true, + y_fill: true }); + this._scrollView.hide(); + + this._inhibitorSection = new St.BoxLayout({ vertical: true, + style_class: 'end-session-dialog-inhibitor-layout' }); + this._scrollView.add_actor(this._inhibitorSection); + + this._applicationHeader = new St.Label({ style_class: 'end-session-dialog-list-header', + text: _("Some applications are busy or have unsaved work.") }); + this._applicationList = new St.BoxLayout({ style_class: 'end-session-dialog-app-list', + vertical: true }); + this._inhibitorSection.add_actor(this._applicationHeader); + this._inhibitorSection.add_actor(this._applicationList); + + this._sessionHeader = new St.Label({ style_class: 'end-session-dialog-list-header', + text: _("Other users are logged in.") }); + this._sessionList = new St.BoxLayout({ style_class: 'end-session-dialog-session-list', + vertical: true }); + this._inhibitorSection.add_actor(this._sessionHeader); + this._inhibitorSection.add_actor(this._sessionList); + + try { + this._updatesPermission = Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null); + } catch(e) { + log('No permission to trigger offline updates: %s'.format(e.toString())); + } + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog'); + } + + _onDestroy() { + this._user.disconnect(this._userLoadedId); + this._user.disconnect(this._userChangedId); + } + + _sync() { + let open = (this.state == ModalDialog.State.OPENING || this.state == ModalDialog.State.OPENED); + if (!open) + return; + + let dialogContent = DialogContent[this._type]; + + let subject = dialogContent.subject; + + // Use different title when we are installing updates + if (dialogContent.subjectWithUpdates && this._checkBox.actor.checked) + subject = dialogContent.subjectWithUpdates; + + if (dialogContent.showBatteryWarning) { + // Warn when running on battery power + if (this._powerProxy.OnBattery && this._checkBox.actor.checked) + this._batteryWarning.opacity = 255; + else + this._batteryWarning.opacity = 0; + } + + let description; + let displayTime = _roundSecondsToInterval(this._totalSecondsToStayOpen, + this._secondsLeft, + 10); + + if (this._user.is_loaded) { + let realName = this._user.get_real_name(); + + if (realName != null) { + if (dialogContent.subjectWithUser) + subject = dialogContent.subjectWithUser.format(realName); + + if (dialogContent.descriptionWithUser) + description = dialogContent.descriptionWithUser(realName, displayTime); + } + } + + // Use a different description when we are installing a system upgrade + if (dialogContent.upgradeDescription) { + let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack(); + let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack(); + + if (name != null && version != null) + description = dialogContent.upgradeDescription(name, version); + } + + // Fall back to regular description + if (!description) + description = dialogContent.description(displayTime); + + _setLabelText(this._descriptionLabel, description); + _setLabelText(this._subjectLabel, subject); + + if (dialogContent.iconName) { + this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName, + icon_size: _DIALOG_ICON_SIZE, + style_class: dialogContent.iconStyleClass }); + } else { + let avatarWidget = new UserWidget.Avatar(this._user, + { iconSize: _DIALOG_ICON_SIZE, + styleClass: dialogContent.iconStyleClass }); + this._iconBin.child = avatarWidget.actor; + avatarWidget.update(); + } + + let hasApplications = this._applications.length > 0; + let hasSessions = this._sessions.length > 0; + this._scrollView.visible = hasApplications || hasSessions; + this._applicationHeader.visible = hasApplications; + this._sessionHeader.visible = hasSessions; + } + + _updateButtons() { + let dialogContent = DialogContent[this._type]; + let buttons = [{ action: this.cancel.bind(this), + label: _("Cancel"), + key: Clutter.Escape }]; + + for (let i = 0; i < dialogContent.confirmButtons.length; i++) { + let signal = dialogContent.confirmButtons[i].signal; + let label = dialogContent.confirmButtons[i].label; + buttons.push({ action: () => { + this.close(true); + let signalId = this.connect('closed', () => { + this.disconnect(signalId); + this._confirm(signal); + }); + }, + label: label }); + } + + this.setButtons(buttons); + } + + close(skipSignal) { + super.close(); + + if (!skipSignal) + this._dbusImpl.emit_signal('Closed', null); + } + + cancel() { + this._stopTimer(); + this._dbusImpl.emit_signal('Canceled', null); + this.close(); + } + + _confirm(signal) { + let callback = () => { + this._fadeOutDialog(); + this._stopTimer(); + this._dbusImpl.emit_signal(signal, null); + }; + + // Offline update not available; just emit the signal + if (!this._checkBox.actor.visible) { + callback(); + return; + } + + // Trigger the offline update as requested + if (this._checkBox.actor.checked) { + switch (signal) { + case "ConfirmedReboot": + this._triggerOfflineUpdateReboot(callback); + break; + case "ConfirmedShutdown": + // To actually trigger the offline update, we need to + // reboot to do the upgrade. When the upgrade is complete, + // the computer will shut down automatically. + signal = "ConfirmedReboot"; + this._triggerOfflineUpdateShutdown(callback); + break; + default: + callback(); + break; + } + } else { + this._triggerOfflineUpdateCancel(callback); + } + } + + _onOpened() { + this._sync(); + } + + _triggerOfflineUpdateReboot(callback) { + this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => { + if (error) + log(error.message); + + callback(); + }); + } + + _triggerOfflineUpdateShutdown(callback) { + this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => { + if (error) + log(error.message); + + callback(); + }); + } + + _triggerOfflineUpdateCancel(callback) { + this._pkOfflineProxy.CancelRemote((result, error) => { + if (error) + log(error.message); + + callback(); + }); + } + + _startTimer() { + let startTime = GLib.get_monotonic_time(); + this._secondsLeft = this._totalSecondsToStayOpen; + + this._timerId = Mainloop.timeout_add_seconds(1, () => { + let currentTime = GLib.get_monotonic_time(); + let secondsElapsed = ((currentTime - startTime) / 1000000); + + this._secondsLeft = this._totalSecondsToStayOpen - secondsElapsed; + if (this._secondsLeft > 0) { + this._sync(); + return GLib.SOURCE_CONTINUE; + } + + let dialogContent = DialogContent[this._type]; + let button = dialogContent.confirmButtons[dialogContent.confirmButtons.length - 1]; + this._confirm(button.signal); + this._timerId = 0; + + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._timerId, '[gnome-shell] this._confirm'); + } + + _stopTimer() { + if (this._timerId > 0) { + Mainloop.source_remove(this._timerId); + this._timerId = 0; + } + + this._secondsLeft = 0; + } + + _constructListItemForApp(inhibitor, app) { + let actor = new St.BoxLayout({ style_class: 'end-session-dialog-app-list-item', + can_focus: true }); + actor.add(app.create_icon_texture(_ITEM_ICON_SIZE)); + + let textLayout = new St.BoxLayout({ vertical: true, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + actor.add(textLayout); + + let nameLabel = new St.Label({ text: app.get_name(), + style_class: 'end-session-dialog-app-list-item-name' }); + textLayout.add(nameLabel); + actor.label_actor = nameLabel; + + let [reason] = inhibitor.GetReasonSync(); + if (reason) { + let reasonLabel = new St.Label({ text: reason, + style_class: 'end-session-dialog-app-list-item-description' }); + textLayout.add(reasonLabel); + } + + return actor; + } + + _onInhibitorLoaded(inhibitor) { + if (this._applications.indexOf(inhibitor) < 0) { + // Stale inhibitor + return; + } + + let app = findAppFromInhibitor(inhibitor); + + if (app) { + let actor = this._constructListItemForApp(inhibitor, app); + this._applicationList.add(actor); + } else { + // inhibiting app is a service, not an application + this._applications.splice(this._applications.indexOf(inhibitor), 1); + } + + this._sync(); + } + + _constructListItemForSession(session) { + let avatar = new UserWidget.Avatar(session.user, { iconSize: _ITEM_ICON_SIZE }); + avatar.update(); + + let userName = session.user.get_real_name() ? session.user.get_real_name() : session.username; + let userLabelText; + + if (session.remote) + /* Translators: Remote here refers to a remote session, like a ssh login */ + userLabelText = _("%s (remote)").format(userName); + else if (session.type == "tty") + /* Translators: Console here refers to a tty like a VT console */ + userLabelText = _("%s (console)").format(userName); + else + userLabelText = userName; + + let actor = new St.BoxLayout({ style_class: 'end-session-dialog-session-list-item', + can_focus: true }); + actor.add(avatar.actor); + + let nameLabel = new St.Label({ text: userLabelText, + style_class: 'end-session-dialog-session-list-item-name', + y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + actor.add(nameLabel); + actor.label_actor = nameLabel; + + return actor; + } + + _loadSessions() { + this._loginManager.listSessions(result => { + let n = 0; + for (let i = 0; i < result.length; i++) { + let[id, uid, userName, seat, sessionPath] = result[i]; + let proxy = new LogindSession(Gio.DBus.system, 'org.freedesktop.login1', sessionPath); + + if (proxy.Class != 'user') + continue; + + if (proxy.State == 'closing') + continue; + + let sessionId = GLib.getenv('XDG_SESSION_ID'); + if (!sessionId) + this._loginManager.getCurrentSessionProxy(currentSessionProxy => { + sessionId = currentSessionProxy.Id; + log(`endSessionDialog: No XDG_SESSION_ID, fetched from logind: ${sessionId}`); + }); + + if (proxy.Id == sessionId) + continue; + + let session = { user: this._userManager.get_user(userName), + username: userName, + type: proxy.Type, + remote: proxy.Remote }; + this._sessions.push(session); + + let actor = this._constructListItemForSession(session); + this._sessionList.add(actor); + + // limit the number of entries + n++; + if (n == MAX_USERS_IN_SESSION_DIALOG) + break; + } + + this._sync(); + }); + } + + OpenAsync(parameters, invocation) { + let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters; + this._totalSecondsToStayOpen = totalSecondsToStayOpen; + this._type = type; + + if (this._type == DialogType.RESTART) { + if (this._pkOfflineProxy.UpdateTriggered) + this._type = DialogType.UPDATE_RESTART; + else if (this._pkOfflineProxy.UpgradeTriggered) + this._type = DialogType.UPGRADE_RESTART; + } + + this._applications = []; + this._applicationList.destroy_all_children(); + + this._sessions = []; + this._sessionList.destroy_all_children(); + + if (!(this._type in DialogContent)) { + invocation.return_dbus_error('org.gnome.Shell.ModalDialog.TypeError', + "Unknown dialog type requested"); + return; + } + + let dialogContent = DialogContent[this._type]; + + for (let i = 0; i < inhibitorObjectPaths.length; i++) { + let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i], (proxy, error) => { + this._onInhibitorLoaded(proxy); + }); + + this._applications.push(inhibitor); + } + + if (dialogContent.showOtherSessions) + this._loadSessions(); + + let updateTriggered = this._pkOfflineProxy.UpdateTriggered; + let updatePrepared = this._pkOfflineProxy.UpdatePrepared; + let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed; + + _setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || ''); + this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed); + this._checkBox.actor.checked = (updatePrepared && updateTriggered); + + // We show the warning either together with the checkbox, or when + // updates have already been triggered, but the user doesn't have + // enough permissions to cancel them. + this._batteryWarning.visible = (dialogContent.showBatteryWarning && + (this._checkBox.actor.visible || updatePrepared && updateTriggered && !updatesAllowed)); + + this._updateButtons(); + + if (!this.open(timestamp)) { + invocation.return_dbus_error('org.gnome.Shell.ModalDialog.GrabError', + "Cannot grab pointer and keyboard"); + return; + } + + if (!dialogContent.disableTimer) + this._startTimer(); + + this._sync(); + + let signalId = this.connect('opened', () => { + invocation.return_value(null); + this.disconnect(signalId); + }); + } + + Close(parameters, invocation) { + this.close(); + } +}; diff --git a/js/ui/environment.js b/js/ui/environment.js new file mode 100644 index 0000000..e22ec74 --- /dev/null +++ b/js/ui/environment.js @@ -0,0 +1,131 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Config = imports.misc.config; + +imports.gi.versions.Clutter = Config.LIBMUTTER_API_VERSION; +imports.gi.versions.Gio = '2.0'; +imports.gi.versions.GdkPixbuf = '2.0'; +imports.gi.versions.Gtk = '3.0'; +imports.gi.versions.TelepathyGLib = '0.12'; +imports.gi.versions.TelepathyLogger = '0.2'; + +const { Clutter, GLib, Shell, St } = imports.gi; +const Gettext = imports.gettext; + +// We can't import shell JS modules yet, because they may have +// variable initializations, etc, that depend on init() already having +// been run. + + +// "monkey patch" in some varargs ClutterContainer methods; we need +// to do this per-container class since there is no representation +// of interfaces in Javascript +function _patchContainerClass(containerClass) { + // This one is a straightforward mapping of the C method + containerClass.prototype.child_set = function(actor, props) { + let meta = this.get_child_meta(actor); + for (let prop in props) + meta[prop] = props[prop]; + }; + + // clutter_container_add() actually is a an add-many-actors + // method. We conveniently, but somewhat dubiously, take the + // this opportunity to make it do something more useful. + containerClass.prototype.add = function(actor, props) { + this.add_actor(actor); + if (props) + this.child_set(actor, props); + }; +} + +function _patchLayoutClass(layoutClass, styleProps) { + if (styleProps) + layoutClass.prototype.hookup_style = function(container) { + container.connect('style-changed', () => { + let node = container.get_theme_node(); + for (let prop in styleProps) { + let [found, length] = node.lookup_length(styleProps[prop], false); + if (found) + this[prop] = length; + } + }); + }; + layoutClass.prototype.child_set = function(actor, props) { + let meta = this.get_child_meta(actor.get_parent(), actor); + for (let prop in props) + meta[prop] = props[prop]; + }; +} + +function _loggingFunc() { + let fields = {'MESSAGE': [].join.call(arguments, ', ')}; + let domain = "GNOME Shell"; + + // If the caller is an extension, add it as metadata + let extension = imports.misc.extensionUtils.getCurrentExtension(); + if (extension != null) { + domain = extension.metadata.name; + fields['GNOME_SHELL_EXTENSION_UUID'] = extension.uuid; + fields['GNOME_SHELL_EXTENSION_NAME'] = extension.metadata.name; + } + + GLib.log_structured(domain, GLib.LogLevelFlags.LEVEL_MESSAGE, fields); +} + +function init() { + // Add some bindings to the global JS namespace; (gjs keeps the web + // browser convention of having that namespace be called 'window'.) + window.global = Shell.Global.get(); + + window.log = _loggingFunc; + + window._ = Gettext.gettext; + window.C_ = Gettext.pgettext; + window.ngettext = Gettext.ngettext; + window.N_ = s => s; + + // Miscellaneous monkeypatching + _patchContainerClass(St.BoxLayout); + + _patchLayoutClass(Clutter.TableLayout, { row_spacing: 'spacing-rows', + column_spacing: 'spacing-columns' }); + _patchLayoutClass(Clutter.GridLayout, { row_spacing: 'spacing-rows', + column_spacing: 'spacing-columns' }); + _patchLayoutClass(Clutter.BoxLayout, { spacing: 'spacing' }); + + Clutter.Actor.prototype.toString = function() { + return St.describe_actor(this); + }; + + let origToString = Object.prototype.toString; + Object.prototype.toString = function() { + let base = origToString.call(this); + try { + if ('actor' in this && this.actor instanceof Clutter.Actor) + return base.replace(/\]$/, ' delegate for ' + this.actor.toString().substring(1)); + else + return base; + } catch(e) { + return base; + } + }; + + // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=508783 + Date.prototype.toLocaleFormat = function(format) { + return Shell.util_format_date(format, this.getTime()); + }; + + let slowdownEnv = GLib.getenv('GNOME_SHELL_SLOWDOWN_FACTOR'); + if (slowdownEnv) { + let factor = parseFloat(slowdownEnv); + if (!isNaN(factor) && factor > 0.0) + St.set_slow_down_factor(factor); + } + + // OK, now things are initialized enough that we can import shell JS + const Format = imports.format; + const Tweener = imports.ui.tweener; + + Tweener.init(); + String.prototype.format = Format.format; +} diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js new file mode 100644 index 0000000..9aed29c --- /dev/null +++ b/js/ui/extensionDownloader.js @@ -0,0 +1,266 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, Soup, St } = imports.gi; + +const Config = imports.misc.config; +const ExtensionUtils = imports.misc.extensionUtils; +const ExtensionSystem = imports.ui.extensionSystem; +const FileUtils = imports.misc.fileUtils; +const ModalDialog = imports.ui.modalDialog; + +const _signals = ExtensionSystem._signals; + +var REPOSITORY_URL_BASE = 'https://extensions.gnome.org'; +var REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip'; +var REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/'; +var REPOSITORY_URL_UPDATE = REPOSITORY_URL_BASE + '/update-info/'; + +let _httpSession; + +function installExtension(uuid, invocation) { + let params = { uuid: uuid, + shell_version: Config.PACKAGE_VERSION }; + + let message = Soup.form_request_new_from_hash('GET', REPOSITORY_URL_INFO, params); + + _httpSession.queue_message(message, (session, message) => { + if (message.status_code != Soup.KnownStatusCode.OK) { + ExtensionSystem.logExtensionError(uuid, 'downloading info: ' + message.status_code); + invocation.return_dbus_error('org.gnome.Shell.DownloadInfoError', message.status_code.toString()); + return; + } + + let info; + try { + info = JSON.parse(message.response_body.data); + } catch (e) { + ExtensionSystem.logExtensionError(uuid, 'parsing info: ' + e); + invocation.return_dbus_error('org.gnome.Shell.ParseInfoError', e.toString()); + return; + } + + let dialog = new InstallExtensionDialog(uuid, info, invocation); + dialog.open(global.get_current_time()); + }); +} + +function uninstallExtension(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + if (!extension) + return false; + + // Don't try to uninstall system extensions + if (extension.type != ExtensionUtils.ExtensionType.PER_USER) + return false; + + if (!ExtensionSystem.unloadExtension(extension)) + return false; + + FileUtils.recursivelyDeleteDir(extension.dir, true); + return true; +} + +function gotExtensionZipFile(session, message, uuid, dir, callback, errback) { + if (message.status_code != Soup.KnownStatusCode.OK) { + errback('DownloadExtensionError', message.status_code); + return; + } + + try { + if (!dir.query_exists(null)) + dir.make_directory_with_parents(null); + } catch (e) { + errback('CreateExtensionDirectoryError', e); + return; + } + + let [file, stream] = Gio.File.new_tmp('XXXXXX.shell-extension.zip'); + let contents = message.response_body.flatten().get_as_bytes(); + stream.output_stream.write_bytes(contents, null); + stream.close(null); + let [success, pid] = GLib.spawn_async(null, + ['unzip', '-uod', dir.get_path(), '--', file.get_path()], + null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null); + + if (!success) { + errback('ExtractExtensionError'); + return; + } + + GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status) => { + GLib.spawn_close_pid(pid); + + if (status != 0) + errback('ExtractExtensionError'); + else + callback(); + }); +} + +function updateExtension(uuid) { + // This gets a bit tricky. We want the update to be seamless - + // if we have any error during downloading or extracting, we + // want to not unload the current version. + + let oldExtensionTmpDir = GLib.Dir.make_tmp('XXXXXX-shell-extension'); + let newExtensionTmpDir = GLib.Dir.make_tmp('XXXXXX-shell-extension'); + + let params = { shell_version: Config.PACKAGE_VERSION }; + + let url = REPOSITORY_URL_DOWNLOAD.format(uuid); + let message = Soup.form_request_new_from_hash('GET', url, params); + + _httpSession.queue_message(message, (session, message) => { + gotExtensionZipFile(session, message, uuid, newExtensionTmpDir, () => { + let oldExtension = ExtensionUtils.extensions[uuid]; + let extensionDir = oldExtension.dir; + + if (!ExtensionSystem.unloadExtension(oldExtension)) + return; + + FileUtils.recursivelyMoveDir(extensionDir, oldExtensionTmpDir); + FileUtils.recursivelyMoveDir(newExtensionTmpDir, extensionDir); + + let extension = null; + + try { + extension = ExtensionUtils.createExtensionObject(uuid, extensionDir, ExtensionUtils.ExtensionType.PER_USER); + ExtensionSystem.loadExtension(extension); + } catch(e) { + if (extension) + ExtensionSystem.unloadExtension(extension); + + logError(e, 'Error loading extension %s'.format(uuid)); + + FileUtils.recursivelyDeleteDir(extensionDir, false); + FileUtils.recursivelyMoveDir(oldExtensionTmpDir, extensionDir); + + // Restore what was there before. We can't do much if we + // fail here. + ExtensionSystem.loadExtension(oldExtension); + return; + } + + FileUtils.recursivelyDeleteDir(oldExtensionTmpDir, true); + }, (code, message) => { + log('Error while updating extension %s: %s (%s)'.format(uuid, code, message ? message : '')); + }); + }); +} + +function checkForUpdates() { + let metadatas = {}; + for (let uuid in ExtensionUtils.extensions) { + metadatas[uuid] = ExtensionUtils.extensions[uuid].metadata; + } + + let params = { shell_version: Config.PACKAGE_VERSION, + installed: JSON.stringify(metadatas) }; + + let url = REPOSITORY_URL_UPDATE; + let message = Soup.form_request_new_from_hash('GET', url, params); + _httpSession.queue_message(message, (session, message) => { + if (message.status_code != Soup.KnownStatusCode.OK) + return; + + let operations = JSON.parse(message.response_body.data); + for (let uuid in operations) { + let operation = operations[uuid]; + if (operation == 'blacklist') + uninstallExtension(uuid); + else if (operation == 'upgrade' || operation == 'downgrade') + updateExtension(uuid); + } + }); +} + +var InstallExtensionDialog = +class InstallExtensionDialog extends ModalDialog.ModalDialog { + constructor(uuid, info, invocation) { + super({ styleClass: 'extension-dialog' }); + + this._uuid = uuid; + this._info = info; + this._invocation = invocation; + + this.setButtons([{ label: _("Cancel"), + action: this._onCancelButtonPressed.bind(this), + key: Clutter.Escape + }, + { label: _("Install"), + action: this._onInstallButtonPressed.bind(this), + default: true + }]); + + let message = _("Download and install “%s” from extensions.gnome.org?").format(info.name); + + let box = new St.BoxLayout({ style_class: 'message-dialog-main-layout', + vertical: false }); + this.contentLayout.add(box); + + let gicon = new Gio.FileIcon({ file: Gio.File.new_for_uri(REPOSITORY_URL_BASE + info.icon) }) + let icon = new St.Icon({ gicon: gicon }); + box.add(icon); + + let label = new St.Label({ style_class: 'message-dialog-title headline', + text: message }); + box.add(label); + } + + _onCancelButtonPressed(button, event) { + this.close(); + this._invocation.return_value(GLib.Variant.new('(s)', ['cancelled'])); + } + + _onInstallButtonPressed(button, event) { + let params = { shell_version: Config.PACKAGE_VERSION }; + + let url = REPOSITORY_URL_DOWNLOAD.format(this._uuid); + let message = Soup.form_request_new_from_hash('GET', url, params); + + let uuid = this._uuid; + let dir = Gio.File.new_for_path(GLib.build_filenamev([global.userdatadir, 'extensions', uuid])); + let invocation = this._invocation; + function errback(code, message) { + let msg = message ? message.toString() : ''; + log('Error while installing %s: %s (%s)'.format(uuid, code, msg)); + invocation.return_dbus_error('org.gnome.Shell.' + code, msg); + } + + function callback() { + // Add extension to 'enabled-extensions' for the user, always... + let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY); + if (enabledExtensions.indexOf(uuid) == -1) { + enabledExtensions.push(uuid); + global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions); + } + + try { + let extension = ExtensionUtils.createExtensionObject(uuid, dir, ExtensionUtils.ExtensionType.PER_USER); + ExtensionSystem.loadExtension(extension); + } catch(e) { + uninstallExtension(uuid); + errback('LoadExtensionError', e); + return; + } + + invocation.return_value(GLib.Variant.new('(s)', ['successful'])); + } + + _httpSession.queue_message(message, (session, message) => { + gotExtensionZipFile(session, message, uuid, dir, callback, errback); + }); + + this.close(); + } +}; + +function init() { + _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true }); + + // See: https://bugzilla.gnome.org/show_bug.cgi?id=655189 for context. + // _httpSession.add_feature(new Soup.ProxyResolverDefault()); + Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault()); +} diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js new file mode 100644 index 0000000..6244c39 --- /dev/null +++ b/js/ui/extensionSystem.js @@ -0,0 +1,374 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, St } = imports.gi; +const Signals = imports.signals; + +const ExtensionUtils = imports.misc.extensionUtils; +const Main = imports.ui.main; + +var ExtensionState = { + ENABLED: 1, + DISABLED: 2, + ERROR: 3, + OUT_OF_DATE: 4, + DOWNLOADING: 5, + INITIALIZED: 6, + + // Used as an error state for operations on unknown extensions, + // should never be in a real extensionMeta object. + UNINSTALLED: 99 +}; + +// Arrays of uuids +var enabledExtensions; +// Contains the order that extensions were enabled in. +var extensionOrder = []; + +// We don't really have a class to add signals on. So, create +// a simple dummy object, add the signal methods, and export those +// publically. +var _signals = {}; +Signals.addSignalMethods(_signals); + +var connect = _signals.connect.bind(_signals); +var disconnect = _signals.disconnect.bind(_signals); + +const ENABLED_EXTENSIONS_KEY = 'enabled-extensions'; +const DISABLE_USER_EXTENSIONS_KEY = 'disable-user-extensions'; +const EXTENSION_DISABLE_VERSION_CHECK_KEY = 'disable-extension-version-validation'; + +var initted = false; +var enabled; + +function disableExtension(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + if (!extension) + return; + + if (extension.state != ExtensionState.ENABLED) + return; + + // "Rebase" the extension order by disabling and then enabling extensions + // in order to help prevent conflicts. + + // Example: + // order = [A, B, C, D, E] + // user disables C + // this should: disable E, disable D, disable C, enable D, enable E + + let orderIdx = extensionOrder.indexOf(uuid); + let order = extensionOrder.slice(orderIdx + 1); + let orderReversed = order.slice().reverse(); + + for (let i = 0; i < orderReversed.length; i++) { + let uuid = orderReversed[i]; + try { + ExtensionUtils.extensions[uuid].stateObj.disable(); + } catch(e) { + logExtensionError(uuid, e); + } + } + + if (extension.stylesheet) { + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + theme.unload_stylesheet(extension.stylesheet); + delete extension.stylesheet; + } + + try { + extension.stateObj.disable(); + } catch(e) { + logExtensionError(uuid, e); + } + + for (let i = 0; i < order.length; i++) { + let uuid = order[i]; + try { + ExtensionUtils.extensions[uuid].stateObj.enable(); + } catch(e) { + logExtensionError(uuid, e); + } + } + + extensionOrder.splice(orderIdx, 1); + + if ( extension.state != ExtensionState.ERROR ) { + extension.state = ExtensionState.DISABLED; + _signals.emit('extension-state-changed', extension); + } +} + +function enableExtension(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + if (!extension) + return; + + if (extension.state == ExtensionState.INITIALIZED) + initExtension(uuid); + + if (extension.state != ExtensionState.DISABLED) + return; + + extensionOrder.push(uuid); + + let stylesheetNames = [global.session_mode + '.css', 'stylesheet.css']; + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + for (let i = 0; i < stylesheetNames.length; i++) { + try { + let stylesheetFile = extension.dir.get_child(stylesheetNames[i]); + theme.load_stylesheet(stylesheetFile); + extension.stylesheet = stylesheetFile; + break; + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + continue; // not an error + log(`Failed to load stylesheet for extension ${uuid}: ${e.message}`); + return; + } + } + + try { + extension.stateObj.enable(); + extension.state = ExtensionState.ENABLED; + _signals.emit('extension-state-changed', extension); + return; + } catch(e) { + if (extension.stylesheet) { + theme.unload_stylesheet(extension.stylesheet); + delete extension.stylesheet; + } + logExtensionError(uuid, e); + return; + } +} + +function logExtensionError(uuid, error) { + let extension = ExtensionUtils.extensions[uuid]; + if (!extension) + return; + + let message = '' + error; + + extension.state = ExtensionState.ERROR; + if (!extension.errors) + extension.errors = []; + extension.errors.push(message); + + log('Extension "%s" had error: %s'.format(uuid, message)); + _signals.emit('extension-state-changed', { uuid: uuid, + error: message, + state: extension.state }); +} + +function loadExtension(extension) { + // Default to error, we set success as the last step + extension.state = ExtensionState.ERROR; + + let checkVersion = !global.settings.get_boolean(EXTENSION_DISABLE_VERSION_CHECK_KEY); + + if (checkVersion && ExtensionUtils.isOutOfDate(extension)) { + extension.state = ExtensionState.OUT_OF_DATE; + } else { + let enabled = enabledExtensions.indexOf(extension.uuid) != -1; + if (enabled) { + if (!initExtension(extension.uuid)) + return; + if (extension.state == ExtensionState.DISABLED) + enableExtension(extension.uuid); + } else { + extension.state = ExtensionState.INITIALIZED; + } + } + + _signals.emit('extension-state-changed', extension); +} + +function unloadExtension(extension) { + // Try to disable it -- if it's ERROR'd, we can't guarantee that, + // but it will be removed on next reboot, and hopefully nothing + // broke too much. + disableExtension(extension.uuid); + + extension.state = ExtensionState.UNINSTALLED; + _signals.emit('extension-state-changed', extension); + + delete ExtensionUtils.extensions[extension.uuid]; + return true; +} + +function reloadExtension(oldExtension) { + // Grab the things we'll need to pass to createExtensionObject + // to reload it. + let { uuid: uuid, dir: dir, type: type } = oldExtension; + + // Then unload the old extension. + unloadExtension(oldExtension); + + // Now, recreate the extension and load it. + let newExtension; + try { + newExtension = ExtensionUtils.createExtensionObject(uuid, dir, type); + } catch(e) { + logExtensionError(uuid, e); + return; + } + + loadExtension(newExtension); +} + +function initExtension(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + let dir = extension.dir; + + if (!extension) + throw new Error("Extension was not properly created. Call loadExtension first"); + + let extensionJs = dir.get_child('extension.js'); + if (!extensionJs.query_exists(null)) { + logExtensionError(uuid, new Error('Missing extension.js')); + return false; + } + + let extensionModule; + let extensionState = null; + + ExtensionUtils.installImporter(extension); + try { + extensionModule = extension.imports.extension; + } catch(e) { + logExtensionError(uuid, e); + return false; + } + + if (extensionModule.init) { + try { + extensionState = extensionModule.init(extension); + } catch(e) { + logExtensionError(uuid, e); + return false; + } + } + + if (!extensionState) + extensionState = extensionModule; + extension.stateObj = extensionState; + + extension.state = ExtensionState.DISABLED; + _signals.emit('extension-loaded', uuid); + return true; +} + +function getEnabledExtensions() { + let extensions; + if (Array.isArray(Main.sessionMode.enabledExtensions)) + extensions = Main.sessionMode.enabledExtensions; + else + extensions = []; + + if (global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY)) + return extensions; + + return extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY)); +} + +function onEnabledExtensionsChanged() { + let newEnabledExtensions = getEnabledExtensions(); + + if (!enabled) + return; + + // Find and enable all the newly enabled extensions: UUIDs found in the + // new setting, but not in the old one. + newEnabledExtensions.filter( + uuid => !enabledExtensions.includes(uuid) + ).forEach(uuid => { + enableExtension(uuid); + }); + + // Find and disable all the newly disabled extensions: UUIDs found in the + // old setting, but not in the new one. + enabledExtensions.filter( + item => !newEnabledExtensions.includes(item) + ).forEach(uuid => { + disableExtension(uuid); + }); + + enabledExtensions = newEnabledExtensions; +} + +function _onVersionValidationChanged() { + // we want to reload all extensions, but only enable + // extensions when allowed by the sessionMode, so + // temporarily disable them all + enabledExtensions = []; + for (let uuid in ExtensionUtils.extensions) + reloadExtension(ExtensionUtils.extensions[uuid]); + enabledExtensions = getEnabledExtensions(); + + if (Main.sessionMode.allowExtensions) { + enabledExtensions.forEach(uuid => { + enableExtension(uuid); + }); + } +} + +function _loadExtensions() { + global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged); + global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged); + global.settings.connect('changed::' + EXTENSION_DISABLE_VERSION_CHECK_KEY, _onVersionValidationChanged); + + enabledExtensions = getEnabledExtensions(); + + let finder = new ExtensionUtils.ExtensionFinder(); + finder.connect('extension-found', (finder, extension) => { + loadExtension(extension); + }); + finder.scanExtensions(); +} + +function enableAllExtensions() { + if (enabled) + return; + + if (!initted) { + _loadExtensions(); + initted = true; + } else { + enabledExtensions.forEach(uuid => { + enableExtension(uuid); + }); + } + enabled = true; +} + +function disableAllExtensions() { + if (!enabled) + return; + + if (initted) { + extensionOrder.slice().reverse().forEach(uuid => { + disableExtension(uuid); + }); + } + + enabled = false; +} + +function _sessionUpdated() { + // For now sessionMode.allowExtensions controls extensions from both the + // 'enabled-extensions' preference and the sessionMode.enabledExtensions + // property; it might make sense to make enabledExtensions independent + // from allowExtensions in the future + if (Main.sessionMode.allowExtensions) { + if (initted) + enabledExtensions = getEnabledExtensions(); + enableAllExtensions(); + } else { + disableAllExtensions(); + } +} + +function init() { + Main.sessionMode.connect('updated', _sessionUpdated); + _sessionUpdated(); +} diff --git a/js/ui/focusCaretTracker.js b/js/ui/focusCaretTracker.js new file mode 100644 index 0000000..473ae3e --- /dev/null +++ b/js/ui/focusCaretTracker.js @@ -0,0 +1,89 @@ +/** -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + * Copyright 2012 Inclusive Design Research Centre, OCAD University. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: + * Joseph Scheuhammer + * Contributor: + * Magdalen Berns + */ + +const Atspi = imports.gi.Atspi; +const Signals = imports.signals; + +const CARETMOVED = 'object:text-caret-moved'; +const STATECHANGED = 'object:state-changed'; + +var FocusCaretTracker = class FocusCaretTracker { + constructor() { + this._atspiListener = Atspi.EventListener.new(this._onChanged.bind(this)); + + this._atspiInited = false; + this._focusListenerRegistered = false; + this._caretListenerRegistered = false; + } + + _onChanged(event) { + if (event.type.indexOf(STATECHANGED) == 0) + this.emit('focus-changed', event); + else if (event.type == CARETMOVED) + this.emit('caret-moved', event); + } + + _initAtspi() { + if (!this._atspiInited && Atspi.init() == 0) { + Atspi.set_timeout(250, 250); + this._atspiInited = true; + } + + return this._atspiInited; + } + + registerFocusListener() { + if (!this._initAtspi() || this._focusListenerRegistered) + return; + + this._atspiListener.register(STATECHANGED + ':focused'); + this._atspiListener.register(STATECHANGED + ':selected'); + this._focusListenerRegistered = true; + } + + registerCaretListener() { + if (!this._initAtspi() || this._caretListenerRegistered) + return; + + this._atspiListener.register(CARETMOVED); + this._caretListenerRegistered = true; + } + + deregisterFocusListener() { + if (!this._focusListenerRegistered) + return; + + this._atspiListener.deregister(STATECHANGED + ':focused'); + this._atspiListener.deregister(STATECHANGED + ':selected'); + this._focusListenerRegistered = false; + } + + deregisterCaretListener() { + if (!this._caretListenerRegistered) + return; + + this._atspiListener.deregister(CARETMOVED); + this._caretListenerRegistered = false; + } +}; +Signals.addSignalMethods(FocusCaretTracker.prototype); diff --git a/js/ui/grabHelper.js b/js/ui/grabHelper.js new file mode 100644 index 0000000..4ba0b1b --- /dev/null +++ b/js/ui/grabHelper.js @@ -0,0 +1,319 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, St } = imports.gi; + +const Main = imports.ui.main; +const Params = imports.misc.params; + +let _capturedEventId = 0; +let _grabHelperStack = []; +function _onCapturedEvent(actor, event) { + let grabHelper = _grabHelperStack[_grabHelperStack.length - 1]; + return grabHelper.onCapturedEvent(event); +} + +function _pushGrabHelper(grabHelper) { + _grabHelperStack.push(grabHelper); + + if (_capturedEventId == 0) + _capturedEventId = global.stage.connect('captured-event', _onCapturedEvent); +} + +function _popGrabHelper(grabHelper) { + let poppedHelper = _grabHelperStack.pop(); + if (poppedHelper != grabHelper) + throw new Error("incorrect grab helper pop"); + + if (_grabHelperStack.length == 0) { + global.stage.disconnect(_capturedEventId); + _capturedEventId = 0; + } +} + +// GrabHelper: +// @owner: the actor that owns the GrabHelper +// @params: optional parameters to pass to Main.pushModal() +// +// Creates a new GrabHelper object, for dealing with keyboard and pointer grabs +// associated with a set of actors. +// +// Note that the grab can be automatically dropped at any time by the user, and +// your code just needs to deal with it; you shouldn't adjust behavior directly +// after you call ungrab(), but instead pass an 'onUngrab' callback when you +// call grab(). +var GrabHelper = class GrabHelper { + constructor(owner, params) { + this._owner = owner; + this._modalParams = params; + + this._grabStack = []; + + this._actors = []; + this._ignoreUntilRelease = false; + + this._modalCount = 0; + } + + // addActor: + // @actor: an actor + // + // Adds @actor to the set of actors that are allowed to process events + // during a grab. + addActor(actor) { + actor.__grabHelperDestroyId = actor.connect('destroy', () => { + this.removeActor(actor); + }); + this._actors.push(actor); + } + + // removeActor: + // @actor: an actor + // + // Removes @actor from the set of actors that are allowed to + // process events during a grab. + removeActor(actor) { + let index = this._actors.indexOf(actor); + if (index != -1) + this._actors.splice(index, 1); + if (actor.__grabHelperDestroyId) { + actor.disconnect(actor.__grabHelperDestroyId); + delete actor.__grabHelperDestroyId; + } + } + + _isWithinGrabbedActor(actor) { + let currentActor = this.currentGrab.actor; + while (actor) { + if (this._actors.indexOf(actor) != -1) + return true; + if (actor == currentActor) + return true; + actor = actor.get_parent(); + } + return false; + } + + get currentGrab() { + return this._grabStack[this._grabStack.length - 1] || {}; + } + + get grabbed() { + return this._grabStack.length > 0; + } + + get grabStack() { + return this._grabStack; + } + + _findStackIndex(actor) { + if (!actor) + return -1; + + for (let i = 0; i < this._grabStack.length; i++) { + if (this._grabStack[i].actor === actor) + return i; + } + return -1; + } + + _actorInGrabStack(actor) { + while (actor) { + let idx = this._findStackIndex(actor); + if (idx >= 0) + return idx; + actor = actor.get_parent(); + } + return -1; + } + + isActorGrabbed(actor) { + return this._findStackIndex(actor) >= 0; + } + + // grab: + // @params: A bunch of parameters, see below + // + // The general effect of a "grab" is to ensure that the passed in actor + // and all actors inside the grab get exclusive control of the mouse and + // keyboard, with the grab automatically being dropped if the user tries + // to dismiss it. The actor is passed in through @params.actor. + // + // grab() can be called multiple times, with the scope of the grab being + // changed to a different actor every time. A nested grab does not have + // to have its grabbed actor inside the parent grab actors. + // + // Grabs can be automatically dropped if the user tries to dismiss it + // in one of two ways: the user clicking outside the currently grabbed + // actor, or the user typing the Escape key. + // + // If the user clicks outside the grabbed actors, and the clicked on + // actor is part of a previous grab in the stack, grabs will be popped + // until that grab is active. However, the click event will not be + // replayed to the actor. + // + // If the user types the Escape key, one grab from the grab stack will + // be popped. + // + // When a grab is popped by user interacting as described above, if you + // pass a callback as @params.onUngrab, it will be called with %true. + // + // If @params.focus is not null, we'll set the key focus directly + // to that actor instead of navigating in @params.actor. This is for + // use cases like menus, where we want to grab the menu actor, but keep + // focus on the clicked on menu item. + grab(params) { + params = Params.parse(params, { actor: null, + focus: null, + onUngrab: null }); + + let focus = global.stage.key_focus; + let hadFocus = focus && this._isWithinGrabbedActor(focus); + let newFocus = params.actor; + + if (this.isActorGrabbed(params.actor)) + return true; + + params.savedFocus = focus; + + if (!this._takeModalGrab()) + return false; + + this._grabStack.push(params); + + if (params.focus) { + params.focus.grab_key_focus(); + } else if (newFocus && hadFocus) { + if (!newFocus.navigate_focus(null, St.DirectionType.TAB_FORWARD, false)) + newFocus.grab_key_focus(); + } + + return true; + } + + _takeModalGrab() { + let firstGrab = (this._modalCount == 0); + if (firstGrab) { + if (!Main.pushModal(this._owner, this._modalParams)) + return false; + + _pushGrabHelper(this); + } + + this._modalCount++; + return true; + } + + _releaseModalGrab() { + this._modalCount--; + if (this._modalCount > 0) + return; + + _popGrabHelper(this); + + this._ignoreUntilRelease = false; + + Main.popModal(this._owner); + global.sync_pointer(); + } + + // ignoreRelease: + // + // Make sure that the next button release event evaluated by the + // capture event handler returns false. This is designed for things + // like the ComboBoxMenu that go away on press, but need to eat + // the next release event. + ignoreRelease() { + this._ignoreUntilRelease = true; + } + + // ungrab: + // @params: The parameters for the grab; see below. + // + // Pops @params.actor from the grab stack, potentially dropping + // the grab. If the actor is not on the grab stack, this call is + // ignored with no ill effects. + // + // If the actor is not at the top of the grab stack, grabs are + // popped until the grabbed actor is at the top of the grab stack. + // The onUngrab callback for every grab is called for every popped + // grab with the parameter %false. + ungrab(params) { + params = Params.parse(params, { actor: this.currentGrab.actor, + isUser: false }); + + let grabStackIndex = this._findStackIndex(params.actor); + if (grabStackIndex < 0) + return; + + let focus = global.stage.key_focus; + let hadFocus = focus && this._isWithinGrabbedActor(focus); + + let poppedGrabs = this._grabStack.slice(grabStackIndex); + // "Pop" all newly ungrabbed actors off the grab stack + // by truncating the array. + this._grabStack.length = grabStackIndex; + + for (let i = poppedGrabs.length - 1; i >= 0; i--) { + let poppedGrab = poppedGrabs[i]; + + if (poppedGrab.onUngrab) + poppedGrab.onUngrab(params.isUser); + + this._releaseModalGrab(); + } + + if (hadFocus) { + let poppedGrab = poppedGrabs[0]; + if (poppedGrab.savedFocus) + poppedGrab.savedFocus.grab_key_focus(); + } + } + + onCapturedEvent(event) { + let type = event.type(); + + if (type == Clutter.EventType.KEY_PRESS && + event.get_key_symbol() == Clutter.KEY_Escape) { + this.ungrab({ isUser: true }); + return Clutter.EVENT_STOP; + } + + let motion = type == Clutter.EventType.MOTION; + let press = type == Clutter.EventType.BUTTON_PRESS; + let release = type == Clutter.EventType.BUTTON_RELEASE; + let button = press || release; + + let touchUpdate = type == Clutter.EventType.TOUCH_UPDATE; + let touchBegin = type == Clutter.EventType.TOUCH_BEGIN; + let touchEnd = type == Clutter.EventType.TOUCH_END; + let touch = touchUpdate || touchBegin || touchEnd; + + if (touch && !global.display.is_pointer_emulating_sequence (event.get_event_sequence())) + return Clutter.EVENT_PROPAGATE; + + if (this._ignoreUntilRelease && (motion || release || touch)) { + if (release || touchEnd) + this._ignoreUntilRelease = false; + return Clutter.EVENT_STOP; + } + + if (this._isWithinGrabbedActor(event.get_source())) + return Clutter.EVENT_PROPAGATE; + + if (Main.keyboard.shouldTakeEvent(event)) + return Clutter.EVENT_PROPAGATE; + + if (button || touchBegin) { + // If we have a press event, ignore the next + // motion/release events. + if (press || touchBegin) + this._ignoreUntilRelease = true; + + let i = this._actorInGrabStack(event.get_source()) + 1; + this.ungrab({ actor: this._grabStack[i].actor, isUser: true }); + return Clutter.EVENT_STOP; + } + + return Clutter.EVENT_STOP; + } +}; diff --git a/js/ui/ibusCandidatePopup.js b/js/ui/ibusCandidatePopup.js new file mode 100644 index 0000000..20d76fd --- /dev/null +++ b/js/ui/ibusCandidatePopup.js @@ -0,0 +1,300 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, IBus, St } = imports.gi; +const Signals = imports.signals; + +const BoxPointer = imports.ui.boxpointer; +const Main = imports.ui.main; + +var MAX_CANDIDATES_PER_PAGE = 16; + +var DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8', + '9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ]; + +var CandidateArea = class CandidateArea { + constructor() { + this.actor = new St.BoxLayout({ vertical: true, + reactive: true, + visible: false }); + this._candidateBoxes = []; + for (let i = 0; i < MAX_CANDIDATES_PER_PAGE; ++i) { + let box = new St.BoxLayout({ style_class: 'candidate-box', + reactive: true, + track_hover: true }); + box._indexLabel = new St.Label({ style_class: 'candidate-index' }); + box._candidateLabel = new St.Label({ style_class: 'candidate-label' }); + box.add(box._indexLabel, { y_fill: false }); + box.add(box._candidateLabel, { y_fill: false }); + this._candidateBoxes.push(box); + this.actor.add(box); + + let j = i; + box.connect('button-release-event', (actor, event) => { + this.emit('candidate-clicked', j, event.get_button(), event.get_state()); + return Clutter.EVENT_PROPAGATE; + }); + } + + this.actor.connect('scroll-event', (actor, event) => { + let direction = event.get_scroll_direction(); + switch(direction) { + case Clutter.ScrollDirection.UP: + this.emit('cursor-up'); + break; + case Clutter.ScrollDirection.DOWN: + this.emit('cursor-down'); + break; + }; + return Clutter.EVENT_PROPAGATE; + }); + + this._buttonBox = new St.BoxLayout({ style_class: 'candidate-page-button-box' }); + + this._previousButton = new St.Button({ style_class: 'candidate-page-button candidate-page-button-previous button' }); + this._previousButton.child = new St.Icon({ style_class: 'candidate-page-button-icon' }); + this._buttonBox.add(this._previousButton, { expand: true }); + + this._nextButton = new St.Button({ style_class: 'candidate-page-button candidate-page-button-next button' }); + this._nextButton.child = new St.Icon({ style_class: 'candidate-page-button-icon' }); + this._buttonBox.add(this._nextButton, { expand: true }); + + this.actor.add(this._buttonBox); + + this._previousButton.connect('clicked', () => { + this.emit('previous-page'); + }); + this._nextButton.connect('clicked', () => { + this.emit('next-page'); + }); + + this._orientation = -1; + this._cursorPosition = 0; + } + + setOrientation(orientation) { + if (this._orientation == orientation) + return; + + this._orientation = orientation; + + if (this._orientation == IBus.Orientation.HORIZONTAL) { + this.actor.vertical = false; + this.actor.remove_style_class_name('vertical'); + this.actor.add_style_class_name('horizontal'); + this._previousButton.child.icon_name = 'go-previous-symbolic'; + this._nextButton.child.icon_name = 'go-next-symbolic'; + } else { // VERTICAL || SYSTEM + this.actor.vertical = true; + this.actor.add_style_class_name('vertical'); + this.actor.remove_style_class_name('horizontal'); + this._previousButton.child.icon_name = 'go-up-symbolic'; + this._nextButton.child.icon_name = 'go-down-symbolic'; + } + } + + setCandidates(indexes, candidates, cursorPosition, cursorVisible) { + for (let i = 0; i < MAX_CANDIDATES_PER_PAGE; ++i) { + let visible = i < candidates.length; + let box = this._candidateBoxes[i]; + box.visible = visible; + + if (!visible) + continue; + + box._indexLabel.text = ((indexes && indexes[i]) ? indexes[i] : DEFAULT_INDEX_LABELS[i]); + box._candidateLabel.text = candidates[i]; + } + + this._candidateBoxes[this._cursorPosition].remove_style_pseudo_class('selected'); + this._cursorPosition = cursorPosition; + if (cursorVisible) + this._candidateBoxes[cursorPosition].add_style_pseudo_class('selected'); + } + + updateButtons(wrapsAround, page, nPages) { + if (nPages < 2) { + this._buttonBox.hide(); + return; + } + this._buttonBox.show(); + this._previousButton.reactive = wrapsAround || page > 0; + this._nextButton.reactive = wrapsAround || page < nPages - 1; + } +}; +Signals.addSignalMethods(CandidateArea.prototype); + +var CandidatePopup = class CandidatePopup { + constructor() { + this._boxPointer = new BoxPointer.BoxPointer(St.Side.TOP); + this._boxPointer.visible = false; + this._boxPointer.style_class = 'candidate-popup-boxpointer'; + Main.layoutManager.addChrome(this._boxPointer); + + let box = new St.BoxLayout({ style_class: 'candidate-popup-content', + vertical: true }); + this._boxPointer.bin.set_child(box); + + this._preeditText = new St.Label({ style_class: 'candidate-popup-text', + visible: false }); + box.add(this._preeditText); + + this._auxText = new St.Label({ style_class: 'candidate-popup-text', + visible: false }); + box.add(this._auxText); + + this._candidateArea = new CandidateArea(); + box.add(this._candidateArea.actor); + + this._candidateArea.connect('previous-page', () => { + this._panelService.page_up(); + }); + this._candidateArea.connect('next-page', () => { + this._panelService.page_down(); + }); + + this._candidateArea.connect('cursor-up', () => { + this._panelService.cursor_up(); + }); + this._candidateArea.connect('cursor-down', () => { + this._panelService.cursor_down(); + }); + + this._candidateArea.connect('candidate-clicked', (area, index, button, state) => { + this._panelService.candidate_clicked(index, button, state); + }); + + this._panelService = null; + } + + setPanelService(panelService) { + this._panelService = panelService; + if (!panelService) + return; + + panelService.connect('set-cursor-location', (ps, x, y, w, h) => { + this._setDummyCursorGeometry(x, y, w, h); + }); + try { + panelService.connect('set-cursor-location-relative', (ps, x, y, w, h) => { + if (!global.display.focus_window) + return; + let window = global.display.focus_window.get_compositor_private(); + this._setDummyCursorGeometry(window.x + x, window.y + y, w, h); + }); + } catch(e) { + // Only recent IBus versions have support for this signal + // which is used for wayland clients. In order to work + // with older IBus versions we can silently ignore the + // signal's absence. + } + panelService.connect('update-preedit-text', (ps, text, cursorPosition, visible) => { + this._preeditText.visible = visible; + this._updateVisibility(); + + this._preeditText.text = text.get_text(); + + let attrs = text.get_attributes(); + if (attrs) + this._setTextAttributes(this._preeditText.clutter_text, + attrs); + }); + panelService.connect('show-preedit-text', ps => { + this._preeditText.show(); + this._updateVisibility(); + }); + panelService.connect('hide-preedit-text', ps => { + this._preeditText.hide(); + this._updateVisibility(); + }); + panelService.connect('update-auxiliary-text', (ps, text, visible) => { + this._auxText.visible = visible; + this._updateVisibility(); + + this._auxText.text = text.get_text(); + }); + panelService.connect('show-auxiliary-text', ps => { + this._auxText.show(); + this._updateVisibility(); + }); + panelService.connect('hide-auxiliary-text', ps => { + this._auxText.hide(); + this._updateVisibility(); + }); + panelService.connect('update-lookup-table', (ps, lookupTable, visible) => { + this._candidateArea.actor.visible = visible; + this._updateVisibility(); + + let nCandidates = lookupTable.get_number_of_candidates(); + let cursorPos = lookupTable.get_cursor_pos(); + let pageSize = lookupTable.get_page_size(); + let nPages = Math.ceil(nCandidates / pageSize); + let page = ((cursorPos == 0) ? 0 : Math.floor(cursorPos / pageSize)); + let startIndex = page * pageSize; + let endIndex = Math.min((page + 1) * pageSize, nCandidates); + + let indexes = []; + let indexLabel; + 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) { + candidates.push(lookupTable.get_candidate(i).get_text()); + + Main.keyboard.addSuggestion(lookupTable.get_candidate(i).get_text(), () => { + let index = i; + this._panelService.candidate_clicked(index, 1, 0); + }); + } + + this._candidateArea.setCandidates(indexes, + candidates, + cursorPos % pageSize, + lookupTable.is_cursor_visible()); + this._candidateArea.setOrientation(lookupTable.get_orientation()); + this._candidateArea.updateButtons(lookupTable.is_round(), page, nPages); + }); + panelService.connect('show-lookup-table', ps => { + this._candidateArea.actor.show(); + this._updateVisibility(); + }); + panelService.connect('hide-lookup-table', ps => { + this._candidateArea.actor.hide(); + this._updateVisibility(); + }); + panelService.connect('focus-out', ps => { + this._boxPointer.close(BoxPointer.PopupAnimation.NONE); + Main.keyboard.resetSuggestions(); + }); + } + + _setDummyCursorGeometry(x, y, w, h) { + Main.layoutManager.setDummyCursorGeometry(x, y, w, h); + if (this._boxPointer.actor.visible) + this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); + } + + _updateVisibility() { + let isVisible = (!Main.keyboard.visible && + (this._preeditText.visible || + this._auxText.visible || + this._candidateArea.actor.visible)); + + if (isVisible) { + this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); + this._boxPointer.open(BoxPointer.PopupAnimation.NONE); + this._boxPointer.actor.raise_top(); + } else { + this._boxPointer.close(BoxPointer.PopupAnimation.NONE); + } + } + + _setTextAttributes(clutterText, ibusAttrList) { + let attr; + for (let i = 0; (attr = ibusAttrList.get(i)); ++i) + if (attr.get_attr_type() == IBus.AttrType.BACKGROUND) + clutterText.set_selection(attr.get_start_index(), attr.get_end_index()); + } +}; diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js new file mode 100644 index 0000000..d51a443 --- /dev/null +++ b/js/ui/iconGrid.js @@ -0,0 +1,997 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, Meta, St } = imports.gi; + +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; +const Main = imports.ui.main; + +var ICON_SIZE = 96; +var MIN_ICON_SIZE = 16; + +var EXTRA_SPACE_ANIMATION_TIME = 0.25; + +var ANIMATION_TIME_IN = 0.350; +var ANIMATION_TIME_OUT = 1/2 * ANIMATION_TIME_IN; +var ANIMATION_MAX_DELAY_FOR_ITEM = 2/3 * ANIMATION_TIME_IN; +var ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 * ANIMATION_MAX_DELAY_FOR_ITEM; +var ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2/3 * ANIMATION_TIME_OUT; +var ANIMATION_FADE_IN_TIME_FOR_ITEM = 1/4 * ANIMATION_TIME_IN; + +var ANIMATION_BOUNCE_ICON_SCALE = 1.1; + +var AnimationDirection = { + IN: 0, + OUT: 1 +}; + +var APPICON_ANIMATION_OUT_SCALE = 3; +var APPICON_ANIMATION_OUT_TIME = 0.25; + +var BaseIcon = GObject.registerClass( +class BaseIcon extends St.Bin { + _init(label, params) { + params = Params.parse(params, { createIcon: null, + setSizeManually: false, + showLabel: true }); + + let styleClass = 'overview-icon'; + if (params.showLabel) + styleClass += ' overview-icon-with-label'; + + super._init({ style_class: styleClass, + x_fill: true, + y_fill: true }); + + this.actor = this; + + this.connect('destroy', this._onDestroy.bind(this)); + + this._box = new St.BoxLayout({ vertical: true }); + this.set_child(this._box); + + this.iconSize = ICON_SIZE; + this._iconBin = new St.Bin({ x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE }); + + this._box.add_actor(this._iconBin); + + if (params.showLabel) { + this.label = new St.Label({ text: label }); + this._box.add_actor(this.label); + } else { + this.label = null; + } + + if (params.createIcon) + this.createIcon = params.createIcon; + this._setSizeManually = params.setSizeManually; + + this.icon = null; + + let cache = St.TextureCache.get_default(); + this._iconThemeChangedId = cache.connect('icon-theme-changed', this._onIconThemeChanged.bind(this)); + } + + vfunc_get_preferred_width(forHeight) { + // Return the actual height to keep the squared aspect + return this.get_preferred_height(-1); + } + + // This can be overridden by a subclass, or by the createIcon + // parameter to _init() + createIcon(size) { + throw new Error('no implementation of createIcon in ' + this); + } + + setIconSize(size) { + if (!this._setSizeManually) + throw new Error('setSizeManually has to be set to use setIconsize'); + + if (size == this.iconSize) + return; + + this._createIconTexture(size); + } + + _createIconTexture(size) { + if (this.icon) + this.icon.destroy(); + this.iconSize = size; + this.icon = this.createIcon(this.iconSize); + + this._iconBin.child = this.icon; + } + + vfunc_style_changed() { + super.vfunc_style_changed(); + let node = this.get_theme_node(); + + let size; + if (this._setSizeManually) { + size = this.iconSize; + } else { + let [found, len] = node.lookup_length('icon-size', false); + size = found ? len : ICON_SIZE; + } + + if (this.iconSize == size && this._iconBin.child) + return; + + this._createIconTexture(size); + } + + _onDestroy() { + if (this._iconThemeChangedId > 0) { + let cache = St.TextureCache.get_default(); + cache.disconnect(this._iconThemeChangedId); + this._iconThemeChangedId = 0; + } + } + + _onIconThemeChanged() { + this._createIconTexture(this.iconSize); + } + + animateZoomOut() { + // Animate only the child instead of the entire actor, so the + // styles like hover and running are not applied while + // animating. + zoomOutActor(this.child); + } +}); + +function clamp(value, min, max) { + return Math.max(Math.min(value, max), min); +}; + +function zoomOutActor(actor) { + let actorClone = new Clutter.Clone({ source: actor, + reactive: false }); + let [width, height] = actor.get_transformed_size(); + let [x, y] = actor.get_transformed_position(); + actorClone.set_size(width, height); + actorClone.set_position(x, y); + actorClone.opacity = 255; + actorClone.set_pivot_point(0.5, 0.5); + + Main.uiGroup.add_actor(actorClone); + + // Avoid monitor edges to not zoom outside the current monitor + let monitor = Main.layoutManager.findMonitorForActor(actor); + let scaledWidth = width * APPICON_ANIMATION_OUT_SCALE; + let scaledHeight = height * APPICON_ANIMATION_OUT_SCALE; + let scaledX = x - (scaledWidth - width) / 2; + let scaledY = y - (scaledHeight - height) / 2; + let containedX = clamp(scaledX, monitor.x, monitor.x + monitor.width - scaledWidth); + let containedY = clamp(scaledY, monitor.y, monitor.y + monitor.height - scaledHeight); + + Tweener.addTween(actorClone, + { time: APPICON_ANIMATION_OUT_TIME, + scale_x: APPICON_ANIMATION_OUT_SCALE, + scale_y: APPICON_ANIMATION_OUT_SCALE, + translation_x: containedX - scaledX, + translation_y: containedY - scaledY, + opacity: 0, + transition: 'easeOutQuad', + onComplete() { + actorClone.destroy(); + } + }); +} + +var IconGrid = GObject.registerClass({ + Signals: {'animation-done': {}, + 'child-focused': { param_types: [Clutter.Actor.$gtype]} }, +}, class IconGrid extends St.Widget { + _init(params) { + super._init({ style_class: 'icon-grid', + y_align: Clutter.ActorAlign.START }); + + this.actor = this; + + params = Params.parse(params, { rowLimit: null, + columnLimit: null, + minRows: 1, + minColumns: 1, + fillParent: false, + xAlign: St.Align.MIDDLE, + padWithSpacing: false }); + this._rowLimit = params.rowLimit; + this._colLimit = params.columnLimit; + this._minRows = params.minRows; + this._minColumns = params.minColumns; + this._xAlign = params.xAlign; + this._fillParent = params.fillParent; + this._padWithSpacing = params.padWithSpacing; + + this.topPadding = 0; + this.bottomPadding = 0; + this.rightPadding = 0; + this.leftPadding = 0; + + this._items = []; + this._clonesAnimating = []; + // Pulled from CSS, but hardcode some defaults here + this._spacing = 0; + this._hItemSize = this._vItemSize = ICON_SIZE; + this._fixedHItemSize = this._fixedVItemSize = undefined; + this.connect('style-changed', this._onStyleChanged.bind(this)); + + // Cancel animations when hiding the overview, to avoid icons + // swarming into the void ... + this.connect('notify::mapped', () => { + if (!this.mapped) + this._cancelAnimation(); + }); + + this.connect('actor-added', this._childAdded.bind(this)); + this.connect('actor-removed', this._childRemoved.bind(this)); + } + + _keyFocusIn(actor) { + this.emit('child-focused', actor); + } + + _childAdded(grid, child) { + child._iconGridKeyFocusInId = child.connect('key-focus-in', this._keyFocusIn.bind(this)); + } + + _childRemoved(grid, child) { + child.disconnect(child._iconGridKeyFocusInId); + } + + vfunc_get_preferred_width(forHeight) { + if (this._fillParent) + // Ignore all size requests of children and request a size of 0; + // later we'll allocate as many children as fit the parent + return [0, 0]; + + let nChildren = this.get_n_children(); + let nColumns = this._colLimit ? Math.min(this._colLimit, + nChildren) + : nChildren; + let totalSpacing = Math.max(0, nColumns - 1) * this._getSpacing(); + // Kind of a lie, but not really an issue right now. If + // we wanted to support some sort of hidden/overflow that would + // need higher level design + let minSize = this._getHItemSize() + this.leftPadding + this.rightPadding; + let natSize = nColumns * this._getHItemSize() + totalSpacing + this.leftPadding + this.rightPadding; + + return this.get_theme_node().adjust_preferred_width(minSize, natSize); + } + + _getVisibleChildren() { + return this.get_children().filter(actor => actor.visible); + } + + vfunc_get_preferred_height(forWidth) { + if (this._fillParent) + // Ignore all size requests of children and request a size of 0; + // later we'll allocate as many children as fit the parent + return [0, 0]; + + let themeNode = this.get_theme_node(); + let children = this._getVisibleChildren(); + let nColumns; + + forWidth = themeNode.adjust_for_width(forWidth); + + if (forWidth < 0) + nColumns = children.length; + else + [nColumns, ] = this._computeLayout(forWidth); + + let nRows; + if (nColumns > 0) + nRows = Math.ceil(children.length / nColumns); + else + nRows = 0; + if (this._rowLimit) + nRows = Math.min(nRows, this._rowLimit); + let totalSpacing = Math.max(0, nRows - 1) * this._getSpacing(); + let height = nRows * this._getVItemSize() + totalSpacing + this.topPadding + this.bottomPadding; + + return themeNode.adjust_preferred_height(height, height); + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let themeNode = this.get_theme_node(); + box = themeNode.get_content_box(box); + + if (this._fillParent) { + // Reset the passed in box to fill the parent + let parentBox = this.get_parent().allocation; + let gridBox = themeNode.get_content_box(parentBox); + box = themeNode.get_content_box(gridBox); + } + + let children = this._getVisibleChildren(); + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let spacing = this._getSpacing(); + let [nColumns, usedWidth] = this._computeLayout(availWidth); + + let leftEmptySpace; + switch(this._xAlign) { + case St.Align.START: + leftEmptySpace = 0; + break; + case St.Align.MIDDLE: + leftEmptySpace = Math.floor((availWidth - usedWidth) / 2); + break; + case St.Align.END: + leftEmptySpace = availWidth - usedWidth; + } + + let x = box.x1 + leftEmptySpace + this.leftPadding; + let y = box.y1 + this.topPadding; + let columnIndex = 0; + let rowIndex = 0; + for (let i = 0; i < children.length; i++) { + let childBox = this._calculateChildBox(children[i], x, y, box); + + if (this._rowLimit && rowIndex >= this._rowLimit || + this._fillParent && childBox.y2 > availHeight - this.bottomPadding) { + children[i].hide(); + } else { + children[i].allocate(childBox, flags); + children[i].show(); + } + + columnIndex++; + if (columnIndex == nColumns) { + columnIndex = 0; + rowIndex++; + } + + if (columnIndex == 0) { + y += this._getVItemSize() + spacing; + x = box.x1 + leftEmptySpace + this.leftPadding; + } else { + x += this._getHItemSize() + spacing; + } + } + } + + vfunc_get_paint_volume(paintVolume) { + // Setting the paint volume does not make sense when we don't have + // any allocation + if (!this.has_allocation()) + return false; + + let themeNode = this.get_theme_node(); + let allocationBox = this.get_allocation_box(); + let paintBox = themeNode.get_paint_box(allocationBox); + + let origin = new Clutter.Vertex(); + origin.x = paintBox.x1 - allocationBox.x1; + origin.y = paintBox.y1 - allocationBox.y1; + origin.z = 0.0; + + paintVolume.set_origin(origin); + paintVolume.set_width(paintBox.x2 - paintBox.x1); + paintVolume.set_height(paintBox.y2 - paintBox.y1); + + if (this.get_clip_to_allocation()) + return true; + + for (let child = this.get_first_child(); + child != null; + child = child.get_next_sibling()) { + + if (!child.visible) + continue; + + let childVolume = child.get_transformed_paint_volume(this); + if (!childVolume) + return false + + paintVolume.union(childVolume); + } + + return true; + } + + /** + * Intended to be override by subclasses if they need a different + * set of items to be animated. + */ + _getChildrenToAnimate() { + return this._getVisibleChildren(); + } + + _cancelAnimation() { + this._clonesAnimating.forEach(clone => { clone.destroy(); }); + this._clonesAnimating = []; + } + + _animationDone() { + this._clonesAnimating.forEach(clone => { + clone.source.reactive = true; + clone.source.opacity = 255; + clone.destroy(); + }); + this._clonesAnimating = []; + this.emit('animation-done'); + } + + animatePulse(animationDirection) { + if (animationDirection != AnimationDirection.IN) + throw new Error("Pulse animation only implements 'in' animation direction"); + + this._cancelAnimation(); + + let actors = this._getChildrenToAnimate(); + if (actors.length == 0) { + this._animationDone(); + return; + } + + // For few items the animation can be slow, so use a smaller + // delay when there are less than 4 items + // (ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 * + // ANIMATION_MAX_DELAY_FOR_ITEM) + let maxDelay = Math.min(ANIMATION_BASE_DELAY_FOR_ITEM * actors.length, + ANIMATION_MAX_DELAY_FOR_ITEM); + + for (let index = 0; index < actors.length; index++) { + let actor = actors[index]; + actor.set_scale(0, 0); + actor.set_pivot_point(0.5, 0.5); + + let delay = index / actors.length * maxDelay; + let bounceUpTime = ANIMATION_TIME_IN / 4; + let isLastItem = index == actors.length - 1; + Tweener.addTween(actor, + { time: bounceUpTime, + transition: 'easeInOutQuad', + delay: delay, + scale_x: ANIMATION_BOUNCE_ICON_SCALE, + scale_y: ANIMATION_BOUNCE_ICON_SCALE, + onComplete: () => { + Tweener.addTween(actor, + { time: ANIMATION_TIME_IN - bounceUpTime, + transition: 'easeInOutQuad', + scale_x: 1, + scale_y: 1, + onComplete: () => { + if (isLastItem) + this._animationDone(); + } + }); + } + }); + } + } + + animateSpring(animationDirection, sourceActor) { + this._cancelAnimation(); + + let actors = this._getChildrenToAnimate(); + if (actors.length == 0) { + this._animationDone(); + return; + } + + let [sourceX, sourceY] = sourceActor.get_transformed_position(); + let [sourceWidth, sourceHeight] = sourceActor.get_size(); + // Get the center + let [sourceCenterX, sourceCenterY] = [sourceX + sourceWidth / 2, sourceY + sourceHeight / 2]; + // Design decision, 1/2 of the source actor size. + let [sourceScaledWidth, sourceScaledHeight] = [sourceWidth / 2, sourceHeight / 2]; + + actors.forEach(actor => { + let [actorX, actorY] = actor._transformedPosition = actor.get_transformed_position(); + let [x, y] = [actorX - sourceX, actorY - sourceY]; + actor._distance = Math.sqrt(x * x + y * y); + }); + let maxDist = actors.reduce((prev, cur) => { + return Math.max(prev, cur._distance); + }, 0); + let minDist = actors.reduce((prev, cur) => { + return Math.min(prev, cur._distance); + }, Infinity); + let normalization = maxDist - minDist; + + for (let index = 0; index < actors.length; index++) { + let actor = actors[index]; + actor.opacity = 0; + actor.reactive = false; + + let actorClone = new Clutter.Clone({ source: actor }); + this._clonesAnimating.push(actorClone); + Main.uiGroup.add_actor(actorClone); + + let [width, height,,] = this._getAllocatedChildSizeAndSpacing(actor); + actorClone.set_size(width, height); + let scaleX = sourceScaledWidth / width; + let scaleY = sourceScaledHeight / height; + let [adjustedSourcePositionX, adjustedSourcePositionY] = [sourceCenterX - sourceScaledWidth / 2, sourceCenterY - sourceScaledHeight / 2]; + + let movementParams, fadeParams; + if (animationDirection == AnimationDirection.IN) { + let isLastItem = actor._distance == minDist; + + actorClone.opacity = 0; + actorClone.set_scale(scaleX, scaleY); + + actorClone.set_position(adjustedSourcePositionX, adjustedSourcePositionY); + + let delay = (1 - (actor._distance - minDist) / normalization) * ANIMATION_MAX_DELAY_FOR_ITEM; + let [finalX, finalY] = actor._transformedPosition; + movementParams = { time: ANIMATION_TIME_IN, + transition: 'easeInOutQuad', + delay: delay, + x: finalX, + y: finalY, + scale_x: 1, + scale_y: 1, + onComplete: () => { + if (isLastItem) + this._animationDone(); + }}; + fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, + transition: 'easeInOutQuad', + delay: delay, + opacity: 255 }; + } else { + let isLastItem = actor._distance == maxDist; + + let [startX, startY] = actor._transformedPosition; + actorClone.set_position(startX, startY); + + let delay = (actor._distance - minDist) / normalization * ANIMATION_MAX_DELAY_OUT_FOR_ITEM; + movementParams = { time: ANIMATION_TIME_OUT, + transition: 'easeInOutQuad', + delay: delay, + x: adjustedSourcePositionX, + y: adjustedSourcePositionY, + scale_x: scaleX, + scale_y: scaleY, + onComplete: () => { + if (isLastItem) + this._animationDone(); + }}; + fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, + transition: 'easeInOutQuad', + delay: ANIMATION_TIME_OUT + delay - ANIMATION_FADE_IN_TIME_FOR_ITEM, + opacity: 0 }; + } + + + Tweener.addTween(actorClone, movementParams); + Tweener.addTween(actorClone, fadeParams); + } + } + + _getAllocatedChildSizeAndSpacing(child) { + let [,, natWidth, natHeight] = child.get_preferred_size(); + let width = Math.min(this._getHItemSize(), natWidth); + let xSpacing = Math.max(0, width - natWidth) / 2; + let height = Math.min(this._getVItemSize(), natHeight); + let ySpacing = Math.max(0, height - natHeight) / 2; + return [width, height, xSpacing, ySpacing]; + } + + _calculateChildBox(child, x, y, box) { + /* Center the item in its allocation horizontally */ + let [width, height, childXSpacing, childYSpacing] = + this._getAllocatedChildSizeAndSpacing(child); + + let childBox = new Clutter.ActorBox(); + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { + let _x = box.x2 - (x + width); + childBox.x1 = Math.floor(_x - childXSpacing); + } else { + childBox.x1 = Math.floor(x + childXSpacing); + } + childBox.y1 = Math.floor(y + childYSpacing); + childBox.x2 = childBox.x1 + width; + childBox.y2 = childBox.y1 + height; + return childBox; + } + + columnsForWidth(rowWidth) { + return this._computeLayout(rowWidth)[0]; + } + + getRowLimit() { + return this._rowLimit; + } + + _computeLayout(forWidth) { + let nColumns = 0; + let usedWidth = this.leftPadding + this.rightPadding; + let spacing = this._getSpacing(); + + while ((this._colLimit == null || nColumns < this._colLimit) && + (usedWidth + this._getHItemSize() <= forWidth)) { + usedWidth += this._getHItemSize() + spacing; + nColumns += 1; + } + + if (nColumns > 0) + usedWidth -= spacing; + + return [nColumns, usedWidth]; + } + + _onStyleChanged() { + let themeNode = this.get_theme_node(); + this._spacing = themeNode.get_length('spacing'); + this._hItemSize = themeNode.get_length('-shell-grid-horizontal-item-size') || ICON_SIZE; + this._vItemSize = themeNode.get_length('-shell-grid-vertical-item-size') || ICON_SIZE; + this.queue_relayout(); + } + + nRows(forWidth) { + let children = this._getVisibleChildren(); + let nColumns = (forWidth < 0) ? children.length : this._computeLayout(forWidth)[0]; + let nRows = (nColumns > 0) ? Math.ceil(children.length / nColumns) : 0; + if (this._rowLimit) + nRows = Math.min(nRows, this._rowLimit); + return nRows; + } + + rowsForHeight(forHeight) { + return Math.floor((forHeight - (this.topPadding + this.bottomPadding) + this._getSpacing()) / (this._getVItemSize() + this._getSpacing())); + } + + usedHeightForNRows(nRows) { + return (this._getVItemSize() + this._getSpacing()) * nRows - this._getSpacing() + this.topPadding + this.bottomPadding; + } + + usedWidth(forWidth) { + return this.usedWidthForNColumns(this.columnsForWidth(forWidth)); + } + + usedWidthForNColumns(columns) { + let usedWidth = columns * (this._getHItemSize() + this._getSpacing()); + usedWidth -= this._getSpacing(); + return usedWidth + this.leftPadding + this.rightPadding; + } + + removeAll() { + this._items = []; + this.remove_all_children(); + } + + destroyAll() { + this._items = []; + this.destroy_all_children(); + } + + addItem(item, index) { + if (!(item.icon instanceof BaseIcon)) + throw new Error('Only items with a BaseIcon icon property can be added to IconGrid'); + + this._items.push(item); + if (index !== undefined) + this.insert_child_at_index(item.actor, index); + else + this.add_actor(item.actor); + } + + removeItem(item) { + this.remove_child(item.actor); + } + + getItemAtIndex(index) { + return this.get_child_at_index(index); + } + + visibleItemsCount() { + return this.get_children().filter(c => c.is_visible()).length; + } + + setSpacing(spacing) { + this._fixedSpacing = spacing; + } + + _getSpacing() { + return this._fixedSpacing ? this._fixedSpacing : this._spacing; + } + + _getHItemSize() { + return this._fixedHItemSize ? this._fixedHItemSize : this._hItemSize; + } + + _getVItemSize() { + return this._fixedVItemSize ? this._fixedVItemSize : this._vItemSize; + } + + _updateSpacingForSize(availWidth, availHeight) { + let maxEmptyVArea = availHeight - this._minRows * this._getVItemSize(); + let maxEmptyHArea = availWidth - this._minColumns * this._getHItemSize(); + let maxHSpacing, maxVSpacing; + + if (this._padWithSpacing) { + // minRows + 1 because we want to put spacing before the first row, so it is like we have one more row + // to divide the empty space + maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows +1)); + maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns +1)); + } else { + if (this._minRows <= 1) + maxVSpacing = maxEmptyVArea; + else + maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows - 1)); + + if (this._minColumns <= 1) + maxHSpacing = maxEmptyHArea; + else + maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns - 1)); + } + + let maxSpacing = Math.min(maxHSpacing, maxVSpacing); + // Limit spacing to the item size + maxSpacing = Math.min(maxSpacing, Math.min(this._getVItemSize(), this._getHItemSize())); + // The minimum spacing, regardless of whether it satisfies the row/columng minima, + // is the spacing we get from CSS. + let spacing = Math.max(this._spacing, maxSpacing); + this.setSpacing(spacing); + if (this._padWithSpacing) + this.topPadding = this.rightPadding = this.bottomPadding = this.leftPadding = spacing; + } + + /** + * This function must to be called before iconGrid allocation, + * to know how much spacing can the grid has + */ + adaptToSize(availWidth, availHeight) { + this._fixedHItemSize = this._hItemSize; + this._fixedVItemSize = this._vItemSize; + this._updateSpacingForSize(availWidth, availHeight); + let spacing = this._getSpacing(); + + if (this.columnsForWidth(availWidth) < this._minColumns || this.rowsForHeight(availHeight) < this._minRows) { + let neededWidth = this.usedWidthForNColumns(this._minColumns) - availWidth ; + let neededHeight = this.usedHeightForNRows(this._minRows) - availHeight ; + + let neededSpacePerItem = (neededWidth > neededHeight) ? Math.ceil(neededWidth / this._minColumns) + : Math.ceil(neededHeight / this._minRows); + this._fixedHItemSize = Math.max(this._hItemSize - neededSpacePerItem, MIN_ICON_SIZE); + this._fixedVItemSize = Math.max(this._vItemSize - neededSpacePerItem, MIN_ICON_SIZE); + + this._updateSpacingForSize(availWidth, availHeight); + } + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, + this._updateIconSizes.bind(this)); + } + + // Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up + _updateIconSizes() { + let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize); + let newIconSize = Math.floor(ICON_SIZE * scale); + for (let i in this._items) { + this._items[i].icon.setIconSize(newIconSize); + } + } +}); + +var PaginatedIconGrid = GObject.registerClass({ + Signals: {'space-opened': {}, + 'space-closed': {} }, +}, class PaginatedIconGrid extends IconGrid { + _init(params) { + super._init(params); + this._nPages = 0; + this.currentPage = 0; + this._rowsPerPage = 0; + this._spaceBetweenPages = 0; + this._childrenPerPage = 0; + } + + vfunc_get_preferred_height(forWidth) { + let height = (this._availableHeightPerPageForItems() + this.bottomPadding + this.topPadding) * this._nPages + this._spaceBetweenPages * this._nPages; + return [height, height]; + } + + vfunc_allocate(box, flags) { + if (this._childrenPerPage == 0) + log('computePages() must be called before allocate(); pagination will not work.'); + + this.set_allocation(box, flags); + + if (this._fillParent) { + // Reset the passed in box to fill the parent + let parentBox = this.get_parent().allocation; + let gridBox = this.get_theme_node().get_content_box(parentBox); + box = this.get_theme_node().get_content_box(gridBox); + } + let children = this._getVisibleChildren(); + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let spacing = this._getSpacing(); + let [nColumns, usedWidth] = this._computeLayout(availWidth); + + let leftEmptySpace; + switch(this._xAlign) { + case St.Align.START: + leftEmptySpace = 0; + break; + case St.Align.MIDDLE: + leftEmptySpace = Math.floor((availWidth - usedWidth) / 2); + break; + case St.Align.END: + leftEmptySpace = availWidth - usedWidth; + } + + let x = box.x1 + leftEmptySpace + this.leftPadding; + let y = box.y1 + this.topPadding; + let columnIndex = 0; + let rowIndex = 0; + + for (let i = 0; i < children.length; i++) { + let childBox = this._calculateChildBox(children[i], x, y, box); + children[i].allocate(childBox, flags); + children[i].show(); + + columnIndex++; + if (columnIndex == nColumns) { + columnIndex = 0; + rowIndex++; + } + if (columnIndex == 0) { + y += this._getVItemSize() + spacing; + if ((i + 1) % this._childrenPerPage == 0) + y += this._spaceBetweenPages - spacing + this.bottomPadding + this.topPadding; + x = box.x1 + leftEmptySpace + this.leftPadding; + } else + x += this._getHItemSize() + spacing; + } + } + + // Overriden from IconGrid + _getChildrenToAnimate() { + let children = this._getVisibleChildren(); + let firstIndex = this._childrenPerPage * this.currentPage; + let lastIndex = firstIndex + this._childrenPerPage; + + return children.slice(firstIndex, lastIndex); + } + + _computePages(availWidthPerPage, availHeightPerPage) { + let [nColumns, usedWidth] = this._computeLayout(availWidthPerPage); + let nRows; + let children = this._getVisibleChildren(); + if (nColumns > 0) + nRows = Math.ceil(children.length / nColumns); + else + nRows = 0; + if (this._rowLimit) + nRows = Math.min(nRows, this._rowLimit); + + let spacing = this._getSpacing(); + // We want to contain the grid inside the parent box with padding + this._rowsPerPage = this.rowsForHeight(availHeightPerPage); + this._nPages = Math.ceil(nRows / this._rowsPerPage); + this._spaceBetweenPages = availHeightPerPage - (this.topPadding + this.bottomPadding) - this._availableHeightPerPageForItems(); + this._childrenPerPage = nColumns * this._rowsPerPage; + } + + adaptToSize(availWidth, availHeight) { + super.adaptToSize(availWidth, availHeight); + this._computePages(availWidth, availHeight); + } + + _availableHeightPerPageForItems() { + return this.usedHeightForNRows(this._rowsPerPage) - (this.topPadding + this.bottomPadding); + } + + nPages() { + return this._nPages; + } + + getPageHeight() { + return this._availableHeightPerPageForItems(); + } + + getPageY(pageNumber) { + if (!this._nPages) + return 0; + + let firstPageItem = pageNumber * this._childrenPerPage + let childBox = this._getVisibleChildren()[firstPageItem].get_allocation_box(); + return childBox.y1 - this.topPadding; + } + + getItemPage(item) { + let children = this._getVisibleChildren(); + let index = children.indexOf(item); + if (index == -1) + throw new Error('Item not found.'); + return Math.floor(index / this._childrenPerPage); + } + + /** + * openExtraSpace: + * @sourceItem: the item for which to create extra space + * @side: where @sourceItem should be located relative to the created space + * @nRows: the amount of space to create + * + * Pan view to create extra space for @nRows above or below @sourceItem. + */ + openExtraSpace(sourceItem, side, nRows) { + let children = this._getVisibleChildren(); + let index = children.indexOf(sourceItem.actor); + if (index == -1) + throw new Error('Item not found.'); + + let pageIndex = Math.floor(index / this._childrenPerPage); + let pageOffset = pageIndex * this._childrenPerPage; + + let childrenPerRow = this._childrenPerPage / this._rowsPerPage; + let sourceRow = Math.floor((index - pageOffset) / childrenPerRow); + + let nRowsAbove = (side == St.Side.TOP) ? sourceRow + 1 + : sourceRow; + let nRowsBelow = this._rowsPerPage - nRowsAbove; + + let nRowsUp, nRowsDown; + if (side == St.Side.TOP) { + nRowsDown = Math.min(nRowsBelow, nRows); + nRowsUp = nRows - nRowsDown; + } else { + nRowsUp = Math.min(nRowsAbove, nRows); + nRowsDown = nRows - nRowsUp; + } + + let childrenDown = children.splice(pageOffset + + nRowsAbove * childrenPerRow, + nRowsBelow * childrenPerRow); + let childrenUp = children.splice(pageOffset, + nRowsAbove * childrenPerRow); + + // Special case: On the last row with no rows below the icon, + // there's no need to move any rows either up or down + if (childrenDown.length == 0 && nRowsUp == 0) { + this._translatedChildren = []; + this.emit('space-opened'); + } else { + this._translateChildren(childrenUp, St.DirectionType.UP, nRowsUp); + this._translateChildren(childrenDown, St.DirectionType.DOWN, nRowsDown); + this._translatedChildren = childrenUp.concat(childrenDown); + } + } + + _translateChildren(children, direction, nRows) { + let translationY = nRows * (this._getVItemSize() + this._getSpacing()); + if (translationY == 0) + return; + + if (direction == St.DirectionType.UP) + translationY *= -1; + + for (let i = 0; i < children.length; i++) { + children[i].translation_y = 0; + let params = { translation_y: translationY, + time: EXTRA_SPACE_ANIMATION_TIME, + transition: 'easeInOutQuad' + }; + if (i == (children.length - 1)) + params.onComplete = () => { this.emit('space-opened'); }; + Tweener.addTween(children[i], params); + } + } + + closeExtraSpace() { + if (!this._translatedChildren || !this._translatedChildren.length) { + this.emit('space-closed'); + return; + } + + for (let i = 0; i < this._translatedChildren.length; i++) { + if (!this._translatedChildren[i].translation_y) + continue; + Tweener.addTween(this._translatedChildren[i], + { translation_y: 0, + time: EXTRA_SPACE_ANIMATION_TIME, + transition: 'easeInOutQuad', + onComplete: () => { this.emit('space-closed'); } + }); + } + } +}); diff --git a/js/ui/inhibitShortcutsDialog.js b/js/ui/inhibitShortcutsDialog.js new file mode 100644 index 0000000..170cd1a --- /dev/null +++ b/js/ui/inhibitShortcutsDialog.js @@ -0,0 +1,156 @@ +const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell } = imports.gi; + +const Dialog = imports.ui.dialog; +const ModalDialog = imports.ui.modalDialog; +const PermissionStore = imports.misc.permissionStore; + +const WAYLAND_KEYBINDINGS_SCHEMA = 'org.gnome.mutter.wayland.keybindings'; + +const APP_WHITELIST = ['gnome-control-center.desktop']; +const APP_PERMISSIONS_TABLE = 'gnome'; +const APP_PERMISSIONS_ID = 'shortcuts-inhibitor'; +const GRANTED = 'GRANTED'; +const DENIED = 'DENIED'; + +var DialogResponse = Meta.InhibitShortcutsDialogResponse; + +var InhibitShortcutsDialog = GObject.registerClass({ + Implements: [Meta.InhibitShortcutsDialog], + Properties: { + 'window': GObject.ParamSpec.override('window', Meta.InhibitShortcutsDialog) + } +}, class InhibitShortcutsDialog extends GObject.Object { + _init(window) { + super._init(); + this._window = window; + + this._dialog = new ModalDialog.ModalDialog(); + this._buildLayout(); + } + + get window() { + return this._window; + } + + set window(window) { + this._window = window; + } + + get _app() { + let windowTracker = Shell.WindowTracker.get_default(); + return windowTracker.get_window_app(this._window); + } + + _getRestoreAccel() { + let settings = new Gio.Settings({ schema_id: WAYLAND_KEYBINDINGS_SCHEMA }); + let accel = settings.get_strv('restore-shortcuts')[0] || ''; + return Gtk.accelerator_get_label.apply(null, + Gtk.accelerator_parse(accel)); + } + + _shouldUsePermStore() { + return this._app && !this._app.is_window_backed(); + } + + _saveToPermissionStore(grant) { + if (!this._shouldUsePermStore() || this._permStore == null) + return; + + let permissions = {}; + permissions[this._app.get_id()] = [grant]; + let data = GLib.Variant.new('av', {}); + + this._permStore.SetRemote(APP_PERMISSIONS_TABLE, + true, + APP_PERMISSIONS_ID, + permissions, + data, + (result, error) => { + if (error != null) + log(error.message); + }); + } + + _buildLayout() { + let name = this._app ? this._app.get_name() : this._window.title; + + /* Translators: %s is an application name like "Settings" */ + let title = name ? _("%s wants to inhibit shortcuts").format(name) + : _("Application wants to inhibit shortcuts"); + let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' }); + + let contentParams = { icon, title }; + + let restoreAccel = this._getRestoreAccel(); + if (restoreAccel) + contentParams.subtitle = + /* Translators: %s is a keyboard shortcut like "Super+x" */ + _("You can restore shortcuts by pressing %s.").format(restoreAccel); + + let content = new Dialog.MessageDialogContent(contentParams); + this._dialog.contentLayout.add_actor(content); + + this._dialog.addButton({ label: _("Deny"), + action: () => { + this._saveToPermissionStore(DENIED); + this._emitResponse(DialogResponse.DENY); + }, + key: Clutter.KEY_Escape }); + + this._dialog.addButton({ label: _("Allow"), + action: () => { + this._saveToPermissionStore(GRANTED); + this._emitResponse(DialogResponse.ALLOW); + }, + default: true }); + } + + _emitResponse(response) { + this.emit('response', response); + this._dialog.close(); + } + + vfunc_show() { + if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) { + this._emitResponse(DialogResponse.ALLOW); + return; + } + + if (!this._shouldUsePermStore()) { + this._dialog.open(); + return; + } + + /* Check with the permission store */ + let appId = this._app.get_id(); + this._permStore = new PermissionStore.PermissionStore((proxy, error) => { + if (error) { + log(error.message); + this._dialog.open(); + return; + } + + this._permStore.LookupRemote(APP_PERMISSIONS_TABLE, + APP_PERMISSIONS_ID, + (res, error) => { + if (error) { + this._dialog.open(); + log(error.message); + return; + } + + let [permissions, data] = res; + if (permissions[appId] === undefined) // Not found + this._dialog.open(); + else if (permissions[appId] == GRANTED) + this._emitResponse(DialogResponse.ALLOW); + else + this._emitResponse(DialogResponse.DENY); + }); + }); + } + + vfunc_hide() { + this._dialog.close(); + } +}); diff --git a/js/ui/kbdA11yDialog.js b/js/ui/kbdA11yDialog.js new file mode 100644 index 0000000..b9d005f --- /dev/null +++ b/js/ui/kbdA11yDialog.js @@ -0,0 +1,75 @@ +const { Clutter, Gio, GObject } = imports.gi; + +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 = GObject.registerClass( +class KbdA11yDialog extends GObject.Object { + _init() { + super._init(); + + this._a11ySettings = new Gio.Settings({ schema_id: KEYBOARD_A11Y_SCHEMA }); + + let deviceManager = Clutter.DeviceManager.get_default(); + deviceManager.connect('kbd-a11y-flags-changed', + this._showKbdA11yDialog.bind(this)); + } + + _showKbdA11yDialog(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(); + } +}); diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js new file mode 100644 index 0000000..c4ac72d --- /dev/null +++ b/js/ui/keyboard.js @@ -0,0 +1,1800 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Meta, St } = imports.gi; +const Signals = imports.signals; + +const InputSourceManager = imports.ui.status.keyboard; +const IBusManager = imports.misc.ibusManager; +const BoxPointer = imports.ui.boxpointer; +const Layout = imports.ui.layout; +const Main = imports.ui.main; +const PageIndicators = imports.ui.pageIndicators; +const PopupMenu = imports.ui.popupMenu; +const Tweener = imports.ui.tweener; + +var KEYBOARD_REST_TIME = Layout.KEYBOARD_ANIMATION_TIME * 2 * 1000; +var KEY_LONG_PRESS_TIME = 250; +var PANEL_SWITCH_ANIMATION_TIME = 0.5; +var PANEL_SWITCH_RELATIVE_DISTANCE = 1 / 3; /* A third of the actor width */ + +const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications'; +const SHOW_KEYBOARD = 'screen-keyboard-enabled'; + +/* KeyContainer puts keys in a grid where a 1:1 key takes this size */ +const KEY_SIZE = 2; + +const defaultKeysPre = [ + [ [], [], [{ width: 1.5, level: 1, extraClassName: 'shift-key-lowercase' }], [{ label: '?123', width: 1.5, level: 2 }] ], + [ [], [], [{ width: 1.5, level: 0, extraClassName: 'shift-key-uppercase' }], [{ label: '?123', width: 1.5, level: 2 }] ], + [ [], [], [{ label: '=/<', width: 1.5, level: 3 }], [{ label: 'ABC', width: 1.5, level: 0 }] ], + [ [], [], [{ label: '?123', width: 1.5, level: 2 }], [{ label: 'ABC', width: 1.5, level: 0 }] ], +]; + +const defaultKeysPost = [ + [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], + [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], + [{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }], + [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ], + [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], + [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], + [{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }], + [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ], + [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], + [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], + [{ label: '=/<', width: 3, level: 3, right: true }], + [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ], + [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], + [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], + [{ label: '?123', width: 3, level: 2, right: true }], + [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ], +]; + +var AspectContainer = GObject.registerClass( +class AspectContainer extends St.Widget { + _init(params) { + super._init(params); + this._ratio = 1; + } + + setRatio(relWidth, relHeight) { + this._ratio = relWidth / relHeight; + this.queue_relayout(); + } + + vfunc_allocate(box, flags) { + if (box.get_width() > 0 && box.get_height() > 0) { + let sizeRatio = box.get_width() / box.get_height(); + + if (sizeRatio >= this._ratio) { + /* Restrict horizontally */ + let width = box.get_height() * this._ratio; + let diff = box.get_width() - width; + + box.x1 += Math.floor(diff / 2); + box.x2 -= Math.ceil(diff / 2); + } else { + /* Restrict vertically, align to bottom */ + let height = box.get_width() / this._ratio; + box.y1 = box.y2 - Math.floor(height); + } + } + + super.vfunc_allocate(box, flags); + } +}); + +var KeyContainer = GObject.registerClass( +class KeyContainer extends St.Widget { + _init() { + let gridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.HORIZONTAL, + column_homogeneous: true, + row_homogeneous: true }); + super._init({ layout_manager: gridLayout, + x_expand: true, y_expand: true }); + this._gridLayout = gridLayout; + this._currentRow = 0; + this._currentCol = 0; + this._maxCols = 0; + + this._currentRow = null; + this._rows = []; + } + + appendRow(length) { + this._currentRow++; + this._currentCol = 0; + + let row = new Object(); + row.keys = []; + row.width = 0; + this._rows.push(row); + } + + appendKey(key, width = 1, height = 1) { + let keyInfo = { + key, + left: this._currentCol, + top: this._currentRow, + width, + height + }; + + let row = this._rows[this._rows.length - 1]; + row.keys.push(keyInfo); + row.width += width; + + this._currentCol += width; + this._maxCols = Math.max(this._currentCol, this._maxCols); + } + + layoutButtons(container) { + let nCol = 0, nRow = 0; + + for (let i = 0; i < this._rows.length; i++) { + let row = this._rows[i]; + + /* When starting a new row, see if we need some padding */ + if (nCol == 0) { + let diff = this._maxCols - row.width; + if (diff >= 1) + nCol = diff * KEY_SIZE / 2; + else + nCol = diff * KEY_SIZE; + } + + for (let j = 0; j < row.keys.length; j++) { + let keyInfo = row.keys[j]; + let width = keyInfo.width * KEY_SIZE; + let height = keyInfo.height * KEY_SIZE; + + this._gridLayout.attach(keyInfo.key, nCol, nRow, width, height); + nCol += width; + } + + nRow += KEY_SIZE; + nCol = 0; + } + + if (container) + container.setRatio(this._maxCols, this._rows.length); + } +}); + +var Suggestions = class { + constructor() { + this.actor = new St.BoxLayout({ style_class: 'word-suggestions', + vertical: false }); + this.actor.show(); + } + + add(word, callback) { + let button = new St.Button({ label: word }); + button.connect('clicked', callback); + this.actor.add(button); + } + + clear() { + this.actor.remove_all_children(); + } +}; +Signals.addSignalMethods(Suggestions.prototype); + +var LanguageSelectionPopup = class extends PopupMenu.PopupMenu { + constructor(actor) { + super(actor, 0.5, St.Side.BOTTOM); + + let inputSourceManager = InputSourceManager.getInputSourceManager(); + let inputSources = inputSourceManager.inputSources; + + let item; + for (let i in inputSources) { + let is = inputSources[i]; + + item = this.addAction(is.displayName, () => { + inputSourceManager.activateInputSource(is, true); + }); + item.actor.can_focus = false; + } + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + item = this.addSettingsAction(_("Region & Language Settings"), 'gnome-region-panel.desktop'); + item.actor.can_focus = false; + + this._capturedEventId = 0; + + this._unmapId = actor.connect('notify::mapped', () => { + if (!actor.is_mapped()) + this.close(true); + }); + } + + _onCapturedEvent(actor, event) { + if (event.get_source() == this.actor || + this.actor.contains(event.get_source())) + return Clutter.EVENT_PROPAGATE; + + if (event.type() == Clutter.EventType.BUTTON_RELEASE || event.type() == Clutter.EventType.TOUCH_END) + this.close(true); + + return Clutter.EVENT_STOP; + } + + open(animate) { + super.open(animate); + this._capturedEventId = global.stage.connect('captured-event', + this._onCapturedEvent.bind(this)); + } + + close(animate) { + super.close(animate); + if (this._capturedEventId != 0) { + global.stage.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + } + + destroy() { + if (this._capturedEventId != 0) + global.stage.disconnect(this._capturedEventId); + if (this._unmapId != 0) + this.sourceActor.disconnect(this._unmapId); + super.destroy(); + } +}; + +var Key = class Key { + constructor(key, extendedKeys) { + this.key = key || ""; + this.keyButton = this._makeKey(this.key); + + /* Add the key in a container, so keys can be padded without losing + * logical proportions between those. + */ + this.actor = new St.BoxLayout ({ style_class: 'key-container' }); + this.actor.add(this.keyButton, { expand: true, x_fill: true }); + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._extended_keys = extendedKeys; + this._extended_keyboard = null; + this._pressTimeoutId = 0; + this._capturedPress = false; + + this._capturedEventId = 0; + this._unmapId = 0; + this._longPress = false; + } + + _onDestroy() { + if (this._boxPointer) { + this._boxPointer.destroy(); + this._boxPointer = null; + } + + this.cancel(); + } + + _ensureExtendedKeysPopup() { + if (this._extended_keys.length == 0) + return; + + this._boxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM, + { x_fill: true, + y_fill: true, + x_align: St.Align.START }); + this._boxPointer.hide(); + Main.layoutManager.addChrome(this._boxPointer.actor); + this._boxPointer.setPosition(this.keyButton, 0.5); + + // Adds style to existing keyboard style to avoid repetition + this._boxPointer.actor.add_style_class_name('keyboard-subkeys'); + this._getExtendedKeys(); + this.keyButton._extended_keys = this._extended_keyboard; + } + + _getKeyval(key) { + let unicode = key.charCodeAt(0); + return Clutter.unicode_to_keysym(unicode); + } + + _press(key) { + this.emit('activated') + + if (key != this.key || this._extended_keys.length == 0) { + this.emit('pressed', this._getKeyval(key), key); + } + + if (key == this.key) { + this._pressTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, + KEY_LONG_PRESS_TIME, + () => { + this._longPress = true; + this._pressTimeoutId = 0; + + this.emit('long-press'); + + if (this._extended_keys.length > 0) { + this._touchPressed = false; + this.keyButton.set_hover(false); + this.keyButton.fake_release(); + this._ensureExtendedKeysPopup(); + this._showSubkeys(); + } + + return GLib.SOURCE_REMOVE; + }); + } + } + + _release(key) { + if (this._pressTimeoutId != 0) { + GLib.source_remove(this._pressTimeoutId); + this._pressTimeoutId = 0; + } + + if (!this._longPress && key == this.key && this._extended_keys.length > 0) + this.emit('pressed', this._getKeyval(key), key); + + this.emit('released', this._getKeyval(key), key); + this._hideSubkeys(); + this._longPress = false; + } + + cancel() { + if (this._pressTimeoutId != 0) { + GLib.source_remove(this._pressTimeoutId); + this._pressTimeoutId = 0; + } + this._touchPressed = false; + this.keyButton.set_hover(false); + this.keyButton.fake_release(); + } + + _onCapturedEvent(actor, event) { + let type = event.type(); + let press = (type == Clutter.EventType.BUTTON_PRESS || type == Clutter.EventType.TOUCH_BEGIN); + let release = (type == Clutter.EventType.BUTTON_RELEASE || type == Clutter.EventType.TOUCH_END); + + if (event.get_source() == this._boxPointer.bin || + this._boxPointer.bin.contains(event.get_source())) + return Clutter.EVENT_PROPAGATE; + + if (press) + this._capturedPress = true; + else if (release && this._capturedPress) + this._hideSubkeys(); + + return Clutter.EVENT_STOP; + } + + _showSubkeys() { + this._boxPointer.open(BoxPointer.PopupAnimation.FULL); + this._capturedEventId = global.stage.connect('captured-event', + this._onCapturedEvent.bind(this)); + this._unmapId = this.keyButton.connect('notify::mapped', () => { + if (!this.keyButton.is_mapped()) + this._hideSubkeys(); + }); + } + + _hideSubkeys() { + if (this._boxPointer) + this._boxPointer.close(BoxPointer.PopupAnimation.FULL); + if (this._capturedEventId) { + global.stage.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + if (this._unmapId) { + this.keyButton.disconnect(this._unmapId); + this._unmapId = 0; + } + this._capturedPress = false; + } + + _makeKey(key) { + let label = GLib.markup_escape_text(key, -1); + let button = new St.Button ({ label: label, + style_class: 'keyboard-key' }); + + button.keyWidth = 1; + button.connect('button-press-event', () => { + this._press(key); + return Clutter.EVENT_PROPAGATE; + }); + button.connect('button-release-event', () => { + this._release(key); + return Clutter.EVENT_PROPAGATE; + }); + button.connect('touch-event', (actor, event) => { + let device = event.get_device(); + let sequence = event.get_event_sequence(); + + // We only handle touch events here on wayland. On X11 + // we do get emulated pointer events, which already works + // for single-touch cases. Besides, the X11 passive touch grab + // set up by Mutter will make us see first the touch events + // and later the pointer events, so it will look like two + // unrelated series of events, we want to avoid double handling + // in these cases. + if (!Meta.is_wayland_compositor()) + return Clutter.EVENT_PROPAGATE; + + if (!this._touchPressed && + event.type() == Clutter.EventType.TOUCH_BEGIN) { + this._touchPressed = true; + this._press(key); + } else if (this._touchPressed && + event.type() == Clutter.EventType.TOUCH_END) { + this._touchPressed = false; + this._release(key); + } + return Clutter.EVENT_PROPAGATE; + }); + + return button; + } + + _getExtendedKeys() { + this._extended_keyboard = new St.BoxLayout({ style_class: 'key-container', + vertical: false }); + for (let i = 0; i < this._extended_keys.length; ++i) { + let extendedKey = this._extended_keys[i]; + let key = this._makeKey(extendedKey); + + key.extended_key = extendedKey; + this._extended_keyboard.add(key); + + key.width = this.keyButton.width; + key.height = this.keyButton.height; + } + this._boxPointer.bin.add_actor(this._extended_keyboard); + } + + get subkeys() { + return this._boxPointer; + } + + setWidth(width) { + this.keyButton.keyWidth = width; + } + + setLatched(latched) { + if (latched) + this.keyButton.add_style_pseudo_class('latched'); + else + this.keyButton.remove_style_pseudo_class('latched'); + } +}; +Signals.addSignalMethods(Key.prototype); + +var KeyboardModel = class { + constructor(groupName) { + try { + this._model = this._loadModel(groupName); + } catch (e) { + this._model = this._loadModel('us'); + } + } + + _loadModel(groupName) { + let file = Gio.File.new_for_uri('resource:///org/gnome/shell/osk-layouts/%s.json'.format(groupName)); + let [success, contents] = file.load_contents(null); + if (contents instanceof Uint8Array) + contents = imports.byteArray.toString(contents); + + return JSON.parse(contents); + } + + getLevels() { + return this._model.levels; + } + + getKeysForLevel(levelName) { + return this._model.levels.find(level => level == levelName); + } +}; + +var FocusTracker = class { + constructor() { + this._currentWindow = null; + this._rect = null; + + global.display.connect('notify::focus-window', () => { + this._setCurrentWindow(global.display.focus_window); + this.emit('window-changed', this._currentWindow); + }); + + global.display.connect('grab-op-begin', (display, window, op) => { + if (window == this._currentWindow && + (op == Meta.GrabOp.MOVING || op == Meta.GrabOp.KEYBOARD_MOVING)) + this.emit('reset'); + }); + + /* Valid for wayland clients */ + Main.inputMethod.connect('cursor-location-changed', (o, rect) => { + let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() }; + this._setCurrentRect(newRect); + }); + + this._ibusManager = IBusManager.getIBusManager(); + this._ibusManager.connect('set-cursor-location', (manager, rect) => { + /* Valid for X11 clients only */ + if (Main.inputMethod.currentFocus) + return; + + this._setCurrentRect(rect); + }); + this._ibusManager.connect('focus-in', () => { + this.emit('focus-changed', true); + }); + this._ibusManager.connect('focus-out', () => { + this.emit('focus-changed', false); + }); + } + + get currentWindow() { + return this._currentWindow; + } + + _setCurrentWindow(window) { + this._currentWindow = window; + } + + _setCurrentRect(rect) { + if (this._currentWindow) { + let frameRect = this._currentWindow.get_frame_rect(); + rect.x -= frameRect.x; + rect.y -= frameRect.y; + } + + if (this._rect && + this._rect.x == rect.x && + this._rect.y == rect.y && + this._rect.width == rect.width && + this._rect.height == rect.height) + return; + + this._rect = rect; + this.emit('position-changed'); + } + + getCurrentRect() { + let rect = { x: this._rect.x, y: this._rect.y, + width: this._rect.width, height: this._rect.height }; + + if (this._currentWindow) { + let frameRect = this._currentWindow.get_frame_rect(); + rect.x += frameRect.x; + rect.y += frameRect.y; + } + + return rect; + } +}; +Signals.addSignalMethods(FocusTracker.prototype); + +var EmojiPager = class EmojiPager { + constructor(sections, nCols, nRows) { + this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(), + reactive: true, + clip_to_allocation: true }); + this._sections = sections; + this._nCols = nCols; + this._nRows = nRows; + + this._pages = []; + this._panel = null; + this._curPage = null; + this._followingPage = null; + this._followingPanel = null; + this._currentKey = null; + this._delta = 0; + this._width = null; + + this._initPagingInfo(); + + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', this._onPan.bind(this)); + panAction.connect('gesture-begin', this._onPanBegin.bind(this)); + panAction.connect('gesture-cancel', this._onPanCancel.bind(this)); + panAction.connect('gesture-end', this._onPanEnd.bind(this)); + this._panAction = panAction; + this.actor.add_action(panAction); + } + + get delta() { + return this._delta; + } + + set delta(value) { + if (value > this._width) + value = this._width; + else if (value < -this._width) + value = -this._width; + + this._delta = value; + + if (value == 0) + return; + + let relValue = Math.abs(value / this._width); + let followingPage = this.getFollowingPage(); + + if (this._followingPage != followingPage) { + if (this._followingPanel) { + this._followingPanel.destroy(); + this._followingPanel = null; + } + + if (followingPage != null) { + this._followingPanel = this._generatePanel(followingPage); + this._followingPanel.set_pivot_point(0.5, 0.5); + this.actor.add_child(this._followingPanel); + this.actor.set_child_below_sibling(this._followingPanel, this._panel); + } + + this._followingPage = followingPage; + } + + this._panel.translation_x = value; + this._panel.opacity = 255 * (1 - Math.pow(relValue, 3)); + + if (this._followingPanel) { + this._followingPanel.scale_x = 0.8 + (0.2 * relValue); + this._followingPanel.scale_y = 0.8 + (0.2 * relValue); + this._followingPanel.opacity = 255 * relValue; + } + } + + _prevPage(nPage) { + return (nPage + this._pages.length - 1) % this._pages.length; + } + + _nextPage(nPage) { + return (nPage + 1) % this._pages.length; + } + + getFollowingPage() { + if (this.delta == 0) + return null; + + if ((this.delta < 0 && global.stage.text_direction == Clutter.TextDirection.LTR) || + (this.delta > 0 && global.stage.text_direction == Clutter.TextDirection.RTL)) + return this._nextPage(this._curPage); + else + return this._prevPage(this._curPage); + } + + _onPan(action) { + let [dist, dx, dy] = action.get_motion_delta(0); + this.delta = this.delta + dx; + + if (this._currentKey != null) { + this._currentKey.cancel(); + this._currentKey = null; + } + + return false; + } + + _onPanBegin() { + this._width = this.actor.width; + return true; + } + + _onPanEnd() { + if (Math.abs(this._delta) < this.actor.width * PANEL_SWITCH_RELATIVE_DISTANCE) { + this._onPanCancel() + } else { + let value; + if (this._delta > 0) + value = this._width; + else if (this._delta < 0) + value = -this._width; + + let relDelta = Math.abs(this._delta - value) / this._width; + let time = PANEL_SWITCH_ANIMATION_TIME * Math.abs(relDelta); + + Tweener.removeTweens(this); + Tweener.addTween(this, + { delta: value, + time: time, + transition: 'easeInOutQuad', + onComplete() { + this.setCurrentPage(this.getFollowingPage()); + } + }); + } + } + + _onPanCancel() { + let relDelta = Math.abs(this._delta) / this.actor.width; + let time = PANEL_SWITCH_ANIMATION_TIME * Math.abs(relDelta); + + Tweener.removeTweens(this); + Tweener.addTween(this, + { delta: 0, + time: time, + transition: 'easeInOutQuad', + }); + } + + _initPagingInfo() { + for (let i = 0; i < this._sections.length; i++) { + let section = this._sections[i]; + let itemsPerPage = this._nCols * this._nRows; + let nPages = Math.ceil(section.keys.length / itemsPerPage); + let page = -1; + let pageKeys; + + for (let j = 0; j < section.keys.length; j++) { + if (j % itemsPerPage == 0) { + page++; + pageKeys = []; + this._pages.push({ pageKeys, nPages, page, section: this._sections[i] }); + } + + pageKeys.push(section.keys[j]); + } + } + } + + _lookupSection(section, nPage) { + for (let i = 0; i < this._pages.length; i++) { + let page = this._pages[i]; + + if (page.section == section && page.page == nPage) + return i; + } + + return -1; + } + + _generatePanel(nPage) { + let gridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.HORIZONTAL, + column_homogeneous: true, + row_homogeneous: true }); + let panel = new St.Widget({ layout_manager: gridLayout, + style_class: 'emoji-page', + x_expand: true, + y_expand: true }); + + /* Set an expander actor so all proportions are right despite the panel + * not having all rows/cols filled in. + */ + let expander = new Clutter.Actor(); + gridLayout.attach(expander, 0, 0, this._nCols, this._nRows); + + let page = this._pages[nPage]; + let col = 0; + let row = 0; + + for (let i = 0; i < page.pageKeys.length; i++) { + let modelKey = page.pageKeys[i]; + let key = new Key(modelKey.label, modelKey.variants); + + key.keyButton.set_button_mask(0); + + key.connect('activated', () => { + this._currentKey = key; + }); + key.connect('long-press', () => { + this._panAction.cancel(); + }); + key.connect('released', (actor, keyval, str) => { + if (this._currentKey != key) + return; + this._currentKey = null; + this.emit('emoji', str); + }); + + gridLayout.attach(key.actor, col, row, 1, 1); + + col++; + if (col >= this._nCols) { + col = 0; + row++; + } + } + + return panel; + } + + setCurrentPage(nPage) { + if (this._curPage == nPage) + return; + + this._curPage = nPage; + + if (this._panel) { + this._panel.destroy(); + this._panel = null; + } + + /* Reuse followingPage if possible */ + if (nPage == this._followingPage) { + this._panel = this._followingPanel; + this._followingPanel = null; + } + + if (this._followingPanel) + this._followingPanel.destroy(); + + this._followingPanel = null; + this._followingPage = null; + this._delta = 0; + + if (!this._panel) { + this._panel = this._generatePanel(nPage); + this.actor.add_child(this._panel); + } + + let page = this._pages[nPage]; + this.emit('page-changed', page.section, page.page, page.nPages); + } + + setCurrentSection(section, nPage) { + for (let i = 0; i < this._pages.length; i++) { + let page = this._pages[i]; + + if (page.section == section && page.page == nPage) { + this.setCurrentPage(i); + break; + } + } + } +}; +Signals.addSignalMethods(EmojiPager.prototype); + +var EmojiSelection = class EmojiSelection { + constructor() { + this._sections = [ + { first: 'grinning face', label: '🙂️' }, + { first: 'selfie', label: '👍️' }, + { first: 'monkey face', label: '🌷️' }, + { first: 'grapes', label: '🍴️' }, + { first: 'globe showing Europe-Africa', label: '✈️' }, + { first: 'jack-o-lantern', label: '🏃️' }, + { first: 'muted speaker', label: '🔔️' }, + { first: 'ATM sign', label: '❤️' }, + { first: 'chequered flag', label: '🚩️' }, + ]; + + this._populateSections(); + + this.actor = new St.BoxLayout({ style_class: 'emoji-panel', + x_expand: true, + y_expand: true, + vertical: true }); + this.actor.connect('notify::mapped', () => { this._emojiPager.setCurrentPage(0); }); + + this._emojiPager = new EmojiPager(this._sections, 11, 3); + this._emojiPager.connect('page-changed', (pager, section, page, nPages) => { + this._onPageChanged(section, page, nPages); + }); + this._emojiPager.connect('emoji', (pager, str) => { + this.emit('emoji-selected', str); + }); + this.actor.add(this._emojiPager.actor, { expand: true }); + + this._pageIndicator = new PageIndicators.PageIndicators(false); + this.actor.add(this._pageIndicator, { expand: true, x_fill: false, y_fill: false }); + this._pageIndicator.setReactive(false); + + let bottomRow = this._createBottomRow(); + this.actor.add(bottomRow, { expand: true, x_fill: false, y_fill: false }); + + this._emojiPager.setCurrentPage(0); + } + + _onPageChanged(section, page, nPages) { + this._pageIndicator.setNPages(nPages); + this._pageIndicator.setCurrentPage(page); + + for (let i = 0; i < this._sections.length; i++) { + let sect = this._sections[i]; + sect.button.setLatched(section == sect); + } + } + + _findSection(emoji) { + for (let i = 0; i < this._sections.length; i++) { + if (this._sections[i].first == emoji) + return this._sections[i]; + } + + return null; + } + + _populateSections() { + let file = Gio.File.new_for_uri('resource:///org/gnome/shell/osk-layouts/emoji.json'); + let [success, contents] = file.load_contents(null); + + if (contents instanceof Uint8Array) + contents = imports.byteArray.toString(contents); + let emoji = JSON.parse(contents); + + let pages = []; + let variants = []; + let currentKey = 0; + let currentSection = null; + + for (let i = 0; i < emoji.length; i++) { + /* Group variants of a same emoji so they appear on the key popover */ + if (emoji[i].name.startsWith(emoji[currentKey].name)) { + variants.push(emoji[i].char); + if (i < emoji.length - 1) + continue; + } + + let newSection = this._findSection(emoji[currentKey].name); + if (newSection != null) { + currentSection = newSection; + currentSection.keys = []; + } + + /* Create the key */ + let label = emoji[currentKey].char + String.fromCharCode(0xFE0F); + currentSection.keys.push({ label, variants }); + currentKey = i; + variants = []; + } + } + + _createBottomRow() { + let row = new KeyContainer(); + let key; + + row.appendRow(); + + key = new Key('ABC', []); + key.keyButton.add_style_class_name('default-key'); + key.connect('released', () => { this.emit('toggle'); }); + row.appendKey(key.actor, 1.5); + + for (let i = 0; i < this._sections.length; i++) { + let section = this._sections[i]; + + key = new Key(section.label, []); + key.connect('released', () => { this._emojiPager.setCurrentSection(section, 0) }); + row.appendKey(key.actor); + + section.button = key; + } + + key = new Key(null, []); + key.keyButton.add_style_class_name('default-key'); + key.keyButton.add_style_class_name('hide-key'); + key.connect('released', () => { + this.emit('hide'); + }); + row.appendKey(key.actor); + row.layoutButtons(); + + let actor = new AspectContainer({ layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true }); + actor.add_child(row); + /* Regular keyboard layouts are 11.5×4 grids, optimize for that + * at the moment. Ideally this should be as wide as the current + * keymap. + */ + actor.setRatio(11.5, 1); + + return actor; + } +}; +Signals.addSignalMethods(EmojiSelection.prototype); + +var Keypad = class Keypad { + constructor() { + let keys = [ + { label: '1', keyval: Clutter.KEY_1, left: 0, top: 0 }, + { label: '2', keyval: Clutter.KEY_2, left: 1, top: 0 }, + { label: '3', keyval: Clutter.KEY_3, left: 2, top: 0 }, + { label: '4', keyval: Clutter.KEY_4, left: 0, top: 1 }, + { label: '5', keyval: Clutter.KEY_5, left: 1, top: 1 }, + { label: '6', keyval: Clutter.KEY_6, left: 2, top: 1 }, + { label: '7', keyval: Clutter.KEY_7, left: 0, top: 2 }, + { label: '8', keyval: Clutter.KEY_8, left: 1, top: 2 }, + { label: '9', keyval: Clutter.KEY_9, left: 2, top: 2 }, + { label: '0', keyval: Clutter.KEY_0, left: 1, top: 3 }, + { label: '⌫', keyval: Clutter.KEY_BackSpace, left: 3, top: 0 }, + { keyval: Clutter.KEY_Return, extraClassName: 'enter-key', left: 3, top: 1, height: 2 }, + ]; + + this.actor = new AspectContainer({ layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true }); + + let gridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.HORIZONTAL, + column_homogeneous: true, + row_homogeneous: true }); + this._box = new St.Widget({ layout_manager: gridLayout, x_expand: true, y_expand: true }); + this.actor.add_child(this._box); + + for (let i = 0; i < keys.length; i++) { + let cur = keys[i]; + let key = new Key(cur.label || "", []); + + if (keys[i].extraClassName) + key.keyButton.add_style_class_name(cur.extraClassName); + + let w, h; + w = cur.width || 1; + h = cur.height || 1; + gridLayout.attach(key.actor, cur.left, cur.top, w, h); + + key.connect('released', () => { + this.emit('keyval', cur.keyval); + }); + } + } +}; +Signals.addSignalMethods(Keypad.prototype); + +var Keyboard = class Keyboard { + constructor() { + this.actor = null; + this._focusInExtendedKeys = false; + this._emojiActive = false; + + this._languagePopup = null; + this._currentFocusWindow = null; + this._animFocusedWindow = null; + this._delayedAnimFocusWindow = null; + + this._enableKeyboard = false; // a11y settings value + this._enabled = false; // enabled state (by setting or device type) + this._latched = false; // current level is latched + + this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA }); + this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this)); + this._lastDeviceId = null; + this._suggestions = null; + this._emojiKeyVisible = true; + + this._focusTracker = new FocusTracker(); + this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this)); + this._focusTracker.connect('reset', () => { + this._delayedAnimFocusWindow = null; + this._animFocusedWindow = null; + this._oskFocusWindow = null; + }); + this._focusTracker.connect('focus-changed', (tracker, focused) => { + // Valid only for X11 + if (Meta.is_wayland_compositor()) + return; + + if (focused) + this.show(Main.layoutManager.focusIndex); + else + this.hide(); + }); + + Meta.get_backend().connect('last-device-changed', + (backend, deviceId) => { + let manager = Clutter.DeviceManager.get_default(); + let device = manager.get_device(deviceId); + + if (device.get_device_name().indexOf('XTEST') < 0) { + this._lastDeviceId = deviceId; + this._syncEnabled(); + } + }); + this._syncEnabled(); + + this._showIdleId = 0; + + this._keyboardVisible = false; + Main.layoutManager.connect('keyboard-visible-changed', (o, visible) => { + this._keyboardVisible = visible; + }); + this._keyboardRequested = false; + this._keyboardRestingId = 0; + + Main.layoutManager.connect('monitors-changed', this._relayout.bind(this)); + } + + get visible() { + return this._keyboardVisible; + } + + _onFocusPositionChanged(focusTracker) { + let rect = focusTracker.getCurrentRect(); + this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height); + } + + _lastDeviceIsTouchscreen() { + if (!this._lastDeviceId) + return false; + + let manager = Clutter.DeviceManager.get_default(); + let device = manager.get_device(this._lastDeviceId); + + if (!device) + return false; + + return device.get_device_type() == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE; + } + + _syncEnabled() { + let wasEnabled = this._enabled; + this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD); + this._enabled = this._enableKeyboard || this._lastDeviceIsTouchscreen(); + if (!this._enabled && !this._keyboardController) + return; + + if (this._enabled && !this._keyboardController) + this._setupKeyboard(); + else if (!this._enabled) + this.setCursorLocation(null); + + if (!this._enabled && wasEnabled) + Main.layoutManager.hideKeyboard(true); + } + + _destroyKeyboard() { + if (this._keyboardNotifyId) + this._keyboardController.disconnect(this._keyboardNotifyId); + if (this._keyboardGroupsChangedId) + this._keyboardController.disconnect(this._keyboardGroupsChangedId); + if (this._keyboardStateId) + this._keyboardController.disconnect(this._keyboardStateId); + if (this._emojiKeyVisibleId) + this._keyboardController.disconnect(this._emojiKeyVisibleId); + if (this._keypadVisibleId) + this._keyboardController.disconnect(this._keypadVisibleId); + if (this._focusNotifyId) + global.stage.disconnect(this._focusNotifyId); + this._keyboard = null; + this.actor.destroy(); + this.actor = null; + + if (this._languagePopup) { + this._languagePopup.destroy(); + this._languagePopup = null; + } + } + + _setupKeyboard() { + this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true }); + Main.layoutManager.keyboardBox.add_actor(this.actor); + Main.layoutManager.trackChrome(this.actor); + + this._keyboardController = new KeyboardController(); + + this._groups = {}; + this._current_page = null; + + this._suggestions = new Suggestions(); + this.actor.add(this._suggestions.actor, + { x_align: St.Align.MIDDLE, + x_fill: false }); + + this._aspectContainer = new AspectContainer({ layout_manager: new Clutter.BinLayout() }); + this.actor.add(this._aspectContainer, { expand: true }); + + this._emojiSelection = new EmojiSelection(); + this._emojiSelection.connect('toggle', this._toggleEmoji.bind(this)); + this._emojiSelection.connect('hide', (selection) => { this.hide(); }); + this._emojiSelection.connect('emoji-selected', (selection, emoji) => { + this._keyboardController.commitString(emoji); + }); + + this._aspectContainer.add_child(this._emojiSelection.actor); + this._emojiSelection.actor.hide(); + + this._keypad = new Keypad(); + this._keypad.connect('keyval', (keypad, keyval) => { + this._keyboardController.keyvalPress(keyval); + this._keyboardController.keyvalRelease(keyval); + }); + this._aspectContainer.add_child(this._keypad.actor); + this._keypad.actor.hide(); + this._keypadVisible = false; + + this._ensureKeysForGroup(this._keyboardController.getCurrentGroup()); + this._setActiveLayer(0); + + // Keyboard models are defined in LTR, we must override + // the locale setting in order to avoid flipping the + // keyboard on RTL locales. + this.actor.text_direction = Clutter.TextDirection.LTR; + + this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this)); + this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this)); + this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this)); + this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this)); + this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this)); + this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this)); + + this._relayout(); + } + + _onKeyFocusChanged() { + let focus = global.stage.key_focus; + + // Showing an extended key popup and clicking a key from the extended keys + // will grab focus, but ignore that + let extendedKeysWereFocused = this._focusInExtendedKeys; + this._focusInExtendedKeys = focus && (focus._extended_keys || focus.extended_key); + if (this._focusInExtendedKeys || extendedKeysWereFocused) + return; + + if (!(focus instanceof Clutter.Text)) { + this.hide(); + return; + } + + if (!this._showIdleId) { + this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { + this.show(Main.layoutManager.focusIndex); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show'); + } + } + + _createLayersForGroup(groupName) { + let keyboardModel = new KeyboardModel(groupName); + let layers = {}; + let levels = keyboardModel.getLevels(); + for (let i = 0; i < levels.length; i++) { + let currentLevel = levels[i]; + /* There are keyboard maps which consist of 3 levels (no uppercase, + * basically). We however make things consistent by skipping that + * second level. + */ + let level = (i >= 1 && levels.length == 3) ? i + 1 : i; + + let layout = new KeyContainer(); + layout.shiftKeys = []; + + this._loadRows(currentLevel, level, levels.length, layout); + layers[level] = layout; + this._aspectContainer.add_child(layout); + layout.layoutButtons(this._aspectContainer); + + layout.hide(); + } + + return layers; + } + + _ensureKeysForGroup(group) { + if (!this._groups[group]) + this._groups[group] = this._createLayersForGroup(group); + } + + _addRowKeys(keys, layout) { + for (let i = 0; i < keys.length; ++i) { + let key = keys[i]; + let button = new Key(key.shift(), key); + + /* Space key gets special width, dependent on the number of surrounding keys */ + if (button.key == ' ') + button.setWidth(keys.length <= 3 ? 5 : 3); + + button.connect('pressed', (actor, keyval, str) => { + if (!Main.inputMethod.currentFocus || + !this._keyboardController.commitString(str, true)) { + if (keyval != 0) { + this._keyboardController.keyvalPress(keyval); + button._keyvalPress = true; + } + } + }); + button.connect('released', (actor, keyval, str) => { + if (keyval != 0) { + if (button._keyvalPress) + this._keyboardController.keyvalRelease(keyval); + button._keyvalPress = false; + } + + if (!this._latched) + this._setActiveLayer(0); + }); + + layout.appendKey(button.actor, button.keyButton.keyWidth); + } + } + + _popupLanguageMenu(keyActor) { + if (this._languagePopup) + this._languagePopup.destroy(); + + this._languagePopup = new LanguageSelectionPopup(keyActor); + Main.layoutManager.addChrome(this._languagePopup.actor); + this._languagePopup.open(true); + } + + _loadDefaultKeys(keys, layout, numLevels, numKeys) { + let extraButton; + for (let i = 0; i < keys.length; i++) { + let key = keys[i]; + let keyval = key.keyval; + let switchToLevel = key.level; + let action = key.action; + + /* Skip emoji button if necessary */ + if (!this._emojiKeyVisible && action == 'emoji') + continue; + + extraButton = new Key(key.label || '', []); + + extraButton.keyButton.add_style_class_name('default-key'); + if (key.extraClassName != null) + extraButton.keyButton.add_style_class_name(key.extraClassName); + if (key.width != null) + extraButton.setWidth(key.width); + + let actor = extraButton.keyButton; + + extraButton.connect('pressed', () => { + if (switchToLevel != null) { + this._setActiveLayer(switchToLevel); + // Shift only gets latched on long press + this._latched = (switchToLevel != 1); + } else if (keyval != null) { + this._keyboardController.keyvalPress(keyval); + } + }); + extraButton.connect('released', () => { + if (keyval != null) + this._keyboardController.keyvalRelease(keyval); + else if (action == 'hide') + this.hide(); + else if (action == 'languageMenu') + this._popupLanguageMenu(actor); + else if (action == 'emoji') + this._toggleEmoji(); + }); + + if (switchToLevel == 0) { + layout.shiftKeys.push(extraButton); + } else if (switchToLevel == 1) { + extraButton.connect('long-press', () => { + this._latched = true; + this._setCurrentLevelLatched(this._current_page, this._latched); + }); + } + + /* Fixup default keys based on the number of levels/keys */ + if (switchToLevel == 1 && numLevels == 3) { + // Hide shift key if the keymap has no uppercase level + if (key.right) { + /* Only hide the key actor, so the container still takes space */ + extraButton.keyButton.hide(); + } else { + extraButton.actor.hide(); + } + extraButton.setWidth(1.5); + } else if (key.right && numKeys > 8) { + extraButton.setWidth(2); + } else if (keyval == Clutter.KEY_Return && numKeys > 9) { + extraButton.setWidth(1.5); + } else if (!this._emojiKeyVisible && (action == 'hide' || action == 'languageMenu')) { + extraButton.setWidth(1.5); + } + + layout.appendKey(extraButton.actor, extraButton.keyButton.keyWidth); + } + } + + _updateCurrentPageVisible() { + if (this._current_page) + this._current_page.visible = !this._emojiActive && !this._keypadVisible; + } + + _setEmojiActive(active) { + this._emojiActive = active; + this._emojiSelection.actor.visible = this._emojiActive; + this._updateCurrentPageVisible(); + } + + _toggleEmoji() { + this._setEmojiActive(!this._emojiActive); + } + + _setCurrentLevelLatched(layout, latched) { + for (let i = 0; i < layout.shiftKeys.length; i++) { + let key = layout.shiftKeys[i]; + key.setLatched(latched); + } + } + + _getDefaultKeysForRow(row, numRows, level) { + let pre, post; + + /* The first 2 rows in defaultKeysPre/Post belong together with + * the first 2 rows on each keymap. On keymaps that have more than + * 4 rows, the last 2 default key rows must be respectively + * assigned to the 2 last keymap ones. + */ + if (row < 2) { + return [defaultKeysPre[level][row], defaultKeysPost[level][row]]; + } else if (row >= numRows - 2) { + let defaultRow = row - (numRows - 2) + 2; + return [defaultKeysPre[level][defaultRow], defaultKeysPost[level][defaultRow]]; + } else { + return [null, null]; + } + } + + _mergeRowKeys(layout, pre, row, post, numLevels) { + if (pre != null) + this._loadDefaultKeys(pre, layout, numLevels, row.length); + + this._addRowKeys(row, layout); + + if (post != null) + this._loadDefaultKeys(post, layout, numLevels, row.length); + } + + _loadRows(model, level, numLevels, layout) { + let rows = model.rows; + for (let i = 0; i < rows.length; ++i) { + layout.appendRow(); + let [pre, post] = this._getDefaultKeysForRow(i, rows.length, level); + this._mergeRowKeys (layout, pre, rows[i], post, numLevels); + } + } + + _getGridSlots() { + let numOfHorizSlots = 0, numOfVertSlots; + let rows = this._current_page.get_children(); + numOfVertSlots = rows.length; + + for (let i = 0; i < rows.length; ++i) { + let keyboard_row = rows[i]; + let keys = keyboard_row.get_children(); + + numOfHorizSlots = Math.max(numOfHorizSlots, keys.length); + } + + return [numOfHorizSlots, numOfVertSlots]; + } + + _relayout() { + let monitor = Main.layoutManager.keyboardMonitor; + + if (this.actor == null || monitor == null) + return; + + let maxHeight = monitor.height / 3; + this.actor.width = monitor.width; + this.actor.height = maxHeight; + } + + _onGroupChanged() { + this._ensureKeysForGroup(this._keyboardController.getCurrentGroup()); + this._setActiveLayer(0); + } + + _onKeyboardGroupsChanged(keyboard) { + let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor]; + this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => { + c.destroy(); + }); + + this._groups = {}; + this._onGroupChanged(); + } + + _onKeypadVisible(controller, visible) { + if (visible == this._keypadVisible) + return; + + this._keypadVisible = visible; + this._keypad.actor.visible = this._keypadVisible; + this._updateCurrentPageVisible(); + } + + _onEmojiKeyVisible(controller, visible) { + if (visible == this._emojiKeyVisible) + return; + + this._emojiKeyVisible = visible; + /* Rebuild keyboard widgetry to include emoji button */ + this._onKeyboardGroupsChanged(); + } + + _onKeyboardStateChanged(controller, state) { + let enabled; + if (state == Clutter.InputPanelState.OFF) + enabled = false; + else if (state == Clutter.InputPanelState.ON) + enabled = true; + else if (state == Clutter.InputPanelState.TOGGLE) + enabled = (this._keyboardVisible == false); + else + return; + + if (enabled) + this.show(Main.layoutManager.focusIndex); + else + this.hide(); + } + + _setActiveLayer(activeLevel) { + let activeGroupName = this._keyboardController.getCurrentGroup(); + let layers = this._groups[activeGroupName]; + + if (this._current_page != null) { + this._setCurrentLevelLatched(this._current_page, false); + this._current_page.hide(); + } + + this._current_page = layers[activeLevel]; + this._updateCurrentPageVisible(); + } + + shouldTakeEvent(event) { + let actor = event.get_source(); + return Main.layoutManager.keyboardBox.contains(actor) || + !!actor._extended_keys || !!actor.extended_key; + } + + _clearKeyboardRestTimer() { + if (!this._keyboardRestingId) + return; + GLib.source_remove(this._keyboardRestingId); + this._keyboardRestingId = 0; + } + + show(monitor) { + if (!this._enabled) + return; + + this._clearShowIdle(); + this._keyboardRequested = true; + + if (this._keyboardVisible) { + if (monitor != Main.layoutManager.keyboardIndex) { + Main.layoutManager.keyboardIndex = monitor; + this._relayout(); + } + return; + } + + this._clearKeyboardRestTimer(); + this._keyboardRestingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, + KEYBOARD_REST_TIME, + () => { + this._clearKeyboardRestTimer(); + this._show(monitor); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer'); + } + + _show(monitor) { + if (!this._keyboardRequested) + return; + + Main.layoutManager.keyboardIndex = monitor; + this._relayout(); + Main.layoutManager.showKeyboard(); + + this._setEmojiActive(false); + + if (this._delayedAnimFocusWindow) { + this._setAnimationWindow(this._delayedAnimFocusWindow); + this._delayedAnimFocusWindow = null; + } + } + + hide() { + if (!this._enabled) + return; + + this._clearShowIdle(); + this._keyboardRequested = false; + + if (!this._keyboardVisible) + return; + + this._clearKeyboardRestTimer(); + this._keyboardRestingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, + KEYBOARD_REST_TIME, + () => { + this._clearKeyboardRestTimer(); + this._hide(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer'); + } + + _hide() { + if (this._keyboardRequested) + return; + + Main.layoutManager.hideKeyboard(); + this.setCursorLocation(null); + } + + _hideSubkeys() { + if (this._subkeysBoxPointer) { + this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL); + this._subkeysBoxPointer = null; + } + if (this._capturedEventId) { + this.actor.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + this._capturedPress = false; + } + + resetSuggestions() { + if (this._suggestions) + this._suggestions.clear(); + } + + addSuggestion(text, callback) { + if (!this._suggestions) + return; + this._suggestions.add(text, callback); + this._suggestions.actor.show(); + } + + _clearShowIdle() { + if (!this._showIdleId) + return; + GLib.source_remove(this._showIdleId); + this._showIdleId = 0; + } + + _windowSlideAnimationComplete(window, delta) { + // Synchronize window and actor positions again. + let windowActor = window.get_compositor_private(); + let frameRect = window.get_frame_rect(); + frameRect.y += delta; + window.move_frame(true, frameRect.x, frameRect.y); + } + + _animateWindow(window, show) { + let windowActor = window.get_compositor_private(); + let deltaY = Main.layoutManager.keyboardBox.height; + if (!windowActor) + return; + + if (show) { + Tweener.addTween(windowActor, + { y: windowActor.y - deltaY, + time: Layout.KEYBOARD_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._windowSlideAnimationComplete, + onCompleteParams: [window, -deltaY] }); + } else { + Tweener.addTween(windowActor, + { y: windowActor.y + deltaY, + time: Layout.KEYBOARD_ANIMATION_TIME, + transition: 'easeInQuad', + onComplete: this._windowSlideAnimationComplete, + onCompleteParams: [window, deltaY] }); + } + } + + _setAnimationWindow(window) { + if (this._animFocusedWindow == window) + return; + + if (this._animFocusedWindow) + this._animateWindow(this._animFocusedWindow, false); + if (window) + this._animateWindow(window, true); + + this._animFocusedWindow = window; + } + + setCursorLocation(window, x, y , w, h) { + let monitor = Main.layoutManager.keyboardMonitor; + + if (window && monitor) { + let keyboardHeight = Main.layoutManager.keyboardBox.height; + let focusObscured = false; + + if (y + h >= monitor.y + monitor.height - keyboardHeight) { + if (this._keyboardVisible) + this._setAnimationWindow(window); + else + this._delayedAnimFocusWindow = window; + } else if (y < keyboardHeight) { + this._delayedAnimFocusWindow = null; + this._setAnimationWindow(null); + } + } else { + this._setAnimationWindow(null); + } + + this._oskFocusWindow = window; + } +}; + +var KeyboardController = class { + constructor() { + let deviceManager = Clutter.DeviceManager.get_default(); + this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); + + this._inputSourceManager = InputSourceManager.getInputSourceManager(); + this._sourceChangedId = this._inputSourceManager.connect('current-source-changed', + this._onSourceChanged.bind(this)); + this._sourcesModifiedId = this._inputSourceManager.connect ('sources-changed', + this._onSourcesModified.bind(this)); + this._currentSource = this._inputSourceManager.currentSource; + + Main.inputMethod.connect('notify::content-purpose', + this._onContentPurposeHintsChanged.bind(this)); + Main.inputMethod.connect('notify::content-hints', + this._onContentPurposeHintsChanged.bind(this)); + Main.inputMethod.connect('input-panel-state', (o, state) => { + this.emit('panel-state', state); + }); + } + + _onSourcesModified() { + this.emit('groups-changed'); + } + + _onSourceChanged(inputSourceManager, oldSource) { + let source = inputSourceManager.currentSource; + this._currentSource = source; + this.emit('active-group', source.id); + } + + _onContentPurposeHintsChanged(method) { + let hints = method.content_hints; + let purpose = method.content_purpose; + let emojiVisible = false; + let keypadVisible = false; + + if (purpose == Clutter.InputContentPurpose.NORMAL || + purpose == Clutter.InputContentPurpose.ALPHA || + purpose == Clutter.InputContentPurpose.PASSWORD || + purpose == Clutter.InputContentPurpose.TERMINAL) + emojiVisible = true; + if (purpose == Clutter.InputContentPurpose.DIGITS || + purpose == Clutter.InputContentPurpose.NUMBER || + purpose == Clutter.InputContentPurpose.PHONE) + keypadVisible = true; + + this.emit('emoji-visible', emojiVisible) + this.emit('keypad-visible', keypadVisible); + } + + getGroups() { + let inputSources = this._inputSourceManager.inputSources; + let groups = [] + + for (let i in inputSources) { + let is = inputSources[i]; + groups[is.index] = is.xkbId; + } + + return groups; + } + + getCurrentGroup() { + return this._currentSource.xkbId; + } + + commitString(string, fromKey) { + if (string == null) + return false; + /* Let ibus methods fall through keyval emission */ + if (fromKey && this._currentSource.type == InputSourceManager.INPUT_SOURCE_TYPE_IBUS) + return false; + + Main.inputMethod.commit(string); + return true; + } + + keyvalPress(keyval) { + this._virtualDevice.notify_keyval(Clutter.get_current_event_time(), + keyval, Clutter.KeyState.PRESSED); + } + + keyvalRelease(keyval) { + this._virtualDevice.notify_keyval(Clutter.get_current_event_time(), + keyval, Clutter.KeyState.RELEASED); + } +}; +Signals.addSignalMethods(KeyboardController.prototype); diff --git a/js/ui/layout.js b/js/ui/layout.js new file mode 100644 index 0000000..30e750d --- /dev/null +++ b/js/ui/layout.js @@ -0,0 +1,1419 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Background = imports.ui.background; +const BackgroundMenu = imports.ui.backgroundMenu; +const LoginManager = imports.misc.loginManager; + +const DND = imports.ui.dnd; +const Main = imports.ui.main; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; + +var STARTUP_ANIMATION_TIME = 0.5; +var KEYBOARD_ANIMATION_TIME = 0.15; +var BACKGROUND_FADE_ANIMATION_TIME = 1.0; + +var HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels +var HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms + +function isPopupMetaWindow(actor) { + switch(actor.meta_window.get_window_type()) { + case Meta.WindowType.DROPDOWN_MENU: + case Meta.WindowType.POPUP_MENU: + case Meta.WindowType.COMBO: + return true; + default: + return false; + } +} + +var MonitorConstraint = GObject.registerClass({ + Properties: {'primary': GObject.ParamSpec.boolean('primary', + 'Primary', 'Track primary monitor', + GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, + false), + 'index': GObject.ParamSpec.int('index', + 'Monitor index', 'Track specific monitor', + GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, + -1, 64, -1), + 'work-area': GObject.ParamSpec.boolean('work-area', + 'Work-area', 'Track monitor\'s work-area', + GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, + false)}, +}, class MonitorConstraint extends Clutter.Constraint { + _init(props) { + this._primary = false; + this._index = -1; + this._workArea = false; + + super._init(props); + } + + get primary() { + return this._primary; + } + + set primary(v) { + if (v) + this._index = -1; + this._primary = v; + if (this.actor) + this.actor.queue_relayout(); + this.notify('primary'); + } + + get index() { + return this._index; + } + + set index(v) { + this._primary = false; + this._index = v; + if (this.actor) + this.actor.queue_relayout(); + this.notify('index'); + } + + get work_area() { + return this._workArea; + } + + set work_area(v) { + if (v == this._workArea) + return; + this._workArea = v; + if (this.actor) + this.actor.queue_relayout(); + this.notify('work-area'); + } + + vfunc_set_actor(actor) { + if (actor) { + if (!this._monitorsChangedId) { + this._monitorsChangedId = + Main.layoutManager.connect('monitors-changed', () => { + this.actor.queue_relayout(); + }); + } + + if (!this._workareasChangedId) { + this._workareasChangedId = + global.display.connect('workareas-changed', () => { + if (this._workArea) + this.actor.queue_relayout(); + }); + } + } else { + if (this._monitorsChangedId) + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = 0; + + if (this._workareasChangedId) + global.display.disconnect(this._workareasChangedId); + this._workareasChangedId = 0; + } + + super.vfunc_set_actor(actor); + } + + vfunc_update_allocation(actor, actorBox) { + if (!this._primary && this._index < 0) + return; + + if (!Main.layoutManager.primaryMonitor) + return; + + let index; + if (this._primary) + index = Main.layoutManager.primaryIndex; + else + index = Math.min(this._index, Main.layoutManager.monitors.length - 1); + + let rect; + if (this._workArea) { + let workspaceManager = global.workspace_manager; + let ws = workspaceManager.get_workspace_by_index(0); + rect = ws.get_work_area_for_monitor(index); + } else { + rect = Main.layoutManager.monitors[index]; + } + + actorBox.init_rect(rect.x, rect.y, rect.width, rect.height); + } +}); + +var Monitor = class Monitor { + constructor(index, geometry, geometry_scale) { + this.index = index; + this.x = geometry.x; + this.y = geometry.y; + this.width = geometry.width; + this.height = geometry.height; + this.geometry_scale = geometry_scale; + } + + get inFullscreen() { + return global.display.get_monitor_in_fullscreen(this.index); + } +}; + +const UiActor = GObject.registerClass( +class UiActor extends St.Widget { + vfunc_get_preferred_width (forHeight) { + let width = global.stage.width; + return [width, width]; + } + + vfunc_get_preferred_height (forWidth) { + let height = global.stage.height; + return [height, height]; + } +}); + +const defaultParams = { + trackFullscreen: false, + affectsStruts: false, + affectsInputRegion: true +}; + +var LayoutManager = GObject.registerClass({ + Signals: { 'hot-corners-changed': {}, + 'startup-complete': {}, + 'startup-prepared': {}, + 'monitors-changed': {}, + 'keyboard-visible-changed': { param_types: [GObject.TYPE_BOOLEAN] } }, +}, class LayoutManager extends GObject.Object { + _init() { + super._init(); + + this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL); + this.monitors = []; + this.primaryMonitor = null; + this.primaryIndex = -1; + this.hotCorners = []; + + this._keyboardIndex = -1; + this._rightPanelBarrier = null; + + this._inOverview = false; + this._updateRegionIdle = 0; + + this._trackedActors = []; + this._topActors = []; + this._isPopupWindowVisible = false; + this._startingUp = true; + this._pendingLoadBackground = false; + + // We don't want to paint the stage background color because either + // the SystemBackground we create or the MetaBackgroundActor inside + // global.window_group covers the entirety of the screen. + global.stage.no_clear_hint = true; + + // Set up stage hierarchy to group all UI actors under one container. + this.uiGroup = new UiActor({ name: 'uiGroup' }); + this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT); + + global.stage.remove_actor(global.window_group); + this.uiGroup.add_actor(global.window_group); + + global.stage.add_child(this.uiGroup); + + this.overviewGroup = new St.Widget({ name: 'overviewGroup', + visible: false, + reactive: true }); + this.addChrome(this.overviewGroup); + + this.screenShieldGroup = new St.Widget({ name: 'screenShieldGroup', + visible: false, + clip_to_allocation: true, + layout_manager: new Clutter.BinLayout(), + }); + this.addChrome(this.screenShieldGroup); + + this.panelBox = new St.BoxLayout({ name: 'panelBox', + vertical: true }); + this.addChrome(this.panelBox, { affectsStruts: true, + trackFullscreen: true }); + this.panelBox.connect('allocation-changed', + this._panelBoxChanged.bind(this)); + + this.modalDialogGroup = new St.Widget({ name: 'modalDialogGroup', + layout_manager: new Clutter.BinLayout() }); + this.uiGroup.add_actor(this.modalDialogGroup); + + this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox', + reactive: true, + track_hover: true }); + this.addChrome(this.keyboardBox); + this._keyboardHeightNotifyId = 0; + + // A dummy actor that tracks the mouse or text cursor, based on the + // position and size set in setDummyCursorGeometry. + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + this.uiGroup.add_actor(this.dummyCursor); + + global.stage.remove_actor(global.top_window_group); + this.uiGroup.add_actor(global.top_window_group); + + let feedbackGroup = Meta.get_feedback_group_for_display(global.display); + global.stage.remove_actor(feedbackGroup); + this.uiGroup.add_actor(feedbackGroup); + + this._backgroundGroup = new Meta.BackgroundGroup(); + global.window_group.add_child(this._backgroundGroup); + this._backgroundGroup.lower_bottom(); + this._bgManagers = []; + + // Need to update struts on new workspaces when they are added + let workspaceManager = global.workspace_manager; + workspaceManager.connect('notify::n-workspaces', + this._queueUpdateRegions.bind(this)); + + let display = global.display; + display.connect('restacked', + this._windowsRestacked.bind(this)); + display.connect('in-fullscreen-changed', + this._updateFullscreen.bind(this)); + + let monitorManager = Meta.MonitorManager.get(); + monitorManager.connect('monitors-changed', + this._monitorsChanged.bind(this)); + this._monitorsChanged(); + + // NVIDIA drivers don't preserve FBO contents across + // suspend/resume, see + // https://bugzilla.gnome.org/show_bug.cgi?id=739178 + if (Shell.util_need_background_refresh()) { + LoginManager.getLoginManager().connect('prepare-for-sleep', + (lm, suspending) => { + if (suspending) + return; + Meta.Background.refresh_all(); + }); + } + } + + // This is called by Main after everything else is constructed + init() { + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + + this._loadBackground(); + } + + showOverview() { + this.overviewGroup.show(); + + this._inOverview = true; + this._updateVisibility(); + } + + hideOverview() { + this.overviewGroup.hide(); + + this._inOverview = false; + this._updateVisibility(); + } + + _sessionUpdated() { + this._updateVisibility(); + this._queueUpdateRegions(); + } + + _updateMonitors() { + let display = global.display; + + this.monitors = []; + let nMonitors = display.get_n_monitors(); + for (let i = 0; i < nMonitors; i++) + this.monitors.push(new Monitor(i, + display.get_monitor_geometry(i), + display.get_monitor_scale(i))); + + if (nMonitors == 0) { + this.primaryIndex = this.bottomIndex = -1; + } else if (nMonitors == 1) { + this.primaryIndex = this.bottomIndex = 0; + } else { + // If there are monitors below the primary, then we need + // to split primary from bottom. + this.primaryIndex = this.bottomIndex = display.get_primary_monitor(); + for (let i = 0; i < this.monitors.length; i++) { + let monitor = this.monitors[i]; + if (this._isAboveOrBelowPrimary(monitor)) { + if (monitor.y > this.monitors[this.bottomIndex].y) + this.bottomIndex = i; + } + } + } + if (this.primaryIndex != -1) { + this.primaryMonitor = this.monitors[this.primaryIndex]; + this.bottomMonitor = this.monitors[this.bottomIndex]; + + if (this._pendingLoadBackground) { + this._loadBackground(); + this._pendingLoadBackground = false; + } + } else { + this.primaryMonitor = null; + this.bottomMonitor = null; + } + } + + _updateHotCorners() { + // destroy old hot corners + this.hotCorners.forEach(corner => { + if (corner) + corner.destroy(); + }); + this.hotCorners = []; + + let size = this.panelBox.height; + + // build new hot corners + for (let i = 0; i < this.monitors.length; i++) { + let monitor = this.monitors[i]; + let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x; + let cornerY = monitor.y; + + let haveTopLeftCorner = true; + + if (i != this.primaryIndex) { + // Check if we have a top left (right for RTL) corner. + // I.e. if there is no monitor directly above or to the left(right) + let besideX = this._rtl ? monitor.x + 1 : cornerX - 1; + let besideY = cornerY; + let aboveX = cornerX; + let aboveY = cornerY - 1; + + for (let j = 0; j < this.monitors.length; j++) { + if (i == j) + continue; + let otherMonitor = this.monitors[j]; + if (besideX >= otherMonitor.x && + besideX < otherMonitor.x + otherMonitor.width && + besideY >= otherMonitor.y && + besideY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + if (aboveX >= otherMonitor.x && + aboveX < otherMonitor.x + otherMonitor.width && + aboveY >= otherMonitor.y && + aboveY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + } + } + + if (haveTopLeftCorner) { + let corner = new HotCorner(this, monitor, cornerX, cornerY); + corner.setBarrierSize(size); + this.hotCorners.push(corner); + } else { + this.hotCorners.push(null); + } + } + + this.emit('hot-corners-changed'); + } + + _addBackgroundMenu(bgManager) { + BackgroundMenu.addBackgroundMenu(bgManager.backgroundActor, this); + } + + _createBackgroundManager(monitorIndex) { + let bgManager = new Background.BackgroundManager({ container: this._backgroundGroup, + layoutManager: this, + monitorIndex: monitorIndex }); + + bgManager.connect('changed', this._addBackgroundMenu.bind(this)); + this._addBackgroundMenu(bgManager); + + return bgManager; + } + + _showSecondaryBackgrounds() { + for (let i = 0; i < this.monitors.length; i++) { + if (i != this.primaryIndex) { + let backgroundActor = this._bgManagers[i].backgroundActor; + backgroundActor.show(); + backgroundActor.opacity = 0; + Tweener.addTween(backgroundActor, + { opacity: 255, + time: BACKGROUND_FADE_ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + } + } + + _updateBackgrounds() { + let i; + for (i = 0; i < this._bgManagers.length; i++) + this._bgManagers[i].destroy(); + + this._bgManagers = []; + + if (Main.sessionMode.isGreeter) + return; + + for (let i = 0; i < this.monitors.length; i++) { + let bgManager = this._createBackgroundManager(i); + this._bgManagers.push(bgManager); + + if (i != this.primaryIndex && this._startingUp) + bgManager.backgroundActor.hide(); + } + } + + _updateKeyboardBox() { + this.keyboardBox.set_position(this.keyboardMonitor.x, + this.keyboardMonitor.y + this.keyboardMonitor.height); + this.keyboardBox.set_size(this.keyboardMonitor.width, -1); + } + + _updateBoxes() { + this.screenShieldGroup.set_position(0, 0); + this.screenShieldGroup.set_size(global.screen_width, global.screen_height); + + if (!this.primaryMonitor) + return; + + this.panelBox.set_position(this.primaryMonitor.x, this.primaryMonitor.y); + this.panelBox.set_size(this.primaryMonitor.width, -1); + + this.keyboardIndex = this.primaryIndex; + } + + _panelBoxChanged() { + this._updatePanelBarrier(); + + let size = this.panelBox.height; + this.hotCorners.forEach(corner => { + if (corner) + corner.setBarrierSize(size); + }); + } + + _updatePanelBarrier() { + if (this._rightPanelBarrier) { + this._rightPanelBarrier.destroy(); + this._rightPanelBarrier = null; + } + + if (!this.primaryMonitor) + return; + + if (this.panelBox.height) { + let primary = this.primaryMonitor; + + this._rightPanelBarrier = new Meta.Barrier({ display: global.display, + x1: primary.x + primary.width, y1: primary.y, + x2: primary.x + primary.width, y2: primary.y + this.panelBox.height, + directions: Meta.BarrierDirection.NEGATIVE_X }); + } + } + + _monitorsChanged() { + this._updateMonitors(); + this._updateBoxes(); + this._updateHotCorners(); + this._updateBackgrounds(); + this._updateFullscreen(); + this._updateVisibility(); + this._queueUpdateRegions(); + + this.emit('monitors-changed'); + } + + _isAboveOrBelowPrimary(monitor) { + let primary = this.monitors[this.primaryIndex]; + let monitorLeft = monitor.x, monitorRight = monitor.x + monitor.width; + let primaryLeft = primary.x, primaryRight = primary.x + primary.width; + + if ((monitorLeft >= primaryLeft && monitorLeft < primaryRight) || + (monitorRight > primaryLeft && monitorRight <= primaryRight) || + (primaryLeft >= monitorLeft && primaryLeft < monitorRight) || + (primaryRight > monitorLeft && primaryRight <= monitorRight)) + return true; + + return false; + } + + get currentMonitor() { + let index = global.display.get_current_monitor(); + return this.monitors[index]; + } + + get keyboardMonitor() { + return this.monitors[this.keyboardIndex]; + } + + get focusIndex() { + let i = Main.layoutManager.primaryIndex; + + if (global.stage.key_focus != null) + i = this.findIndexForActor(global.stage.key_focus); + else if (global.display.focus_window != null) + i = global.display.focus_window.get_monitor(); + return i; + } + + get focusMonitor() { + if (this.focusIndex < 0) + return null; + return this.monitors[this.focusIndex]; + } + + set keyboardIndex(v) { + this._keyboardIndex = v; + this._updateKeyboardBox(); + } + + get keyboardIndex() { + return this._keyboardIndex; + } + + _loadBackground() { + if (!this.primaryMonitor) { + this._pendingLoadBackground = true; + return; + } + this._systemBackground = new Background.SystemBackground(); + this._systemBackground.actor.hide(); + + global.stage.insert_child_below(this._systemBackground.actor, null); + + let constraint = new Clutter.BindConstraint({ source: global.stage, + coordinate: Clutter.BindCoordinate.ALL }); + this._systemBackground.actor.add_constraint(constraint); + + let signalId = this._systemBackground.connect('loaded', () => { + this._systemBackground.disconnect(signalId); + this._systemBackground.actor.show(); + global.stage.show(); + + this._prepareStartupAnimation(); + }); + } + + // Startup Animations + // + // We have two different animations, depending on whether we're a greeter + // or a normal session. + // + // In the greeter, we want to animate the panel from the top, and smoothly + // fade the login dialog on top of whatever plymouth left on screen which + // we get as a still frame background before drawing anything else. + // + // Here we just have the code to animate the panel, and fade up the background. + // The login dialog animation is handled by modalDialog.js + // + // When starting a normal user session, we want to grow it out of the middle + // of the screen. + + _prepareStartupAnimation() { + // During the initial transition, add a simple actor to block all events, + // so they don't get delivered to X11 windows that have been transformed. + this._coverPane = new Clutter.Actor({ opacity: 0, + width: global.screen_width, + height: global.screen_height, + reactive: true }); + this.addChrome(this._coverPane); + + if (Meta.is_restart()) { + // On restart, we don't do an animation. Force an update of the + // regions immediately so that maximized windows restore to the + // right size taking struts into account. + this._updateRegions(); + } else if (Main.sessionMode.isGreeter) { + this.panelBox.translation_y = -this.panelBox.height; + } else { + this._updateBackgrounds(); + + // We need to force an update of the regions now before we scale + // the UI group to get the correct allocation for the struts. + this._updateRegions(); + + this.keyboardBox.hide(); + + let monitor = this.primaryMonitor; + let x = monitor.x + monitor.width / 2.0; + let y = monitor.y + monitor.height / 2.0; + + this.uiGroup.set_pivot_point(x / global.screen_width, + y / global.screen_height); + this.uiGroup.scale_x = this.uiGroup.scale_y = 0.75; + this.uiGroup.opacity = 0; + global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height); + } + + this.emit('startup-prepared'); + + // We're mostly prepared for the startup animation + // now, but since a lot is going on asynchronously + // during startup, let's defer the startup animation + // until the event loop is uncontended and idle. + // This helps to prevent us from running the animation + // when the system is bogged down + let id = GLib.idle_add(GLib.PRIORITY_LOW, () => { + this._startupAnimation(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] this._startupAnimation'); + } + + _startupAnimation() { + if (Meta.is_restart()) + this._startupAnimationComplete(); + else if (Main.sessionMode.isGreeter) + this._startupAnimationGreeter(); + else + this._startupAnimationSession(); + } + + _startupAnimationGreeter() { + Tweener.addTween(this.panelBox, + { translation_y: 0, + time: STARTUP_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._startupAnimationComplete, + onCompleteScope: this }); + } + + _startupAnimationSession() { + Tweener.addTween(this.uiGroup, + { scale_x: 1, + scale_y: 1, + opacity: 255, + time: STARTUP_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._startupAnimationComplete, + onCompleteScope: this }); + } + + _startupAnimationComplete() { + this._coverPane.destroy(); + this._coverPane = null; + + this._systemBackground.actor.destroy(); + this._systemBackground = null; + + this._startingUp = false; + + this.keyboardBox.show(); + + if (!Main.sessionMode.isGreeter) { + this._showSecondaryBackgrounds(); + global.window_group.remove_clip(); + } + + this._queueUpdateRegions(); + + this.emit('startup-complete'); + } + + showKeyboard() { + this.keyboardBox.show(); + Tweener.addTween(this.keyboardBox, + { anchor_y: this.keyboardBox.height, + opacity: 255, + time: KEYBOARD_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._showKeyboardComplete, + onCompleteScope: this + }); + this.emit('keyboard-visible-changed', true); + } + + _showKeyboardComplete() { + // Poke Chrome to update the input shape; it doesn't notice + // anchor point changes + this._updateRegions(); + + this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', () => { + this.keyboardBox.anchor_y = this.keyboardBox.height; + }); + } + + hideKeyboard(immediate) { + if (this._keyboardHeightNotifyId) { + this.keyboardBox.disconnect(this._keyboardHeightNotifyId); + this._keyboardHeightNotifyId = 0; + } + Tweener.addTween(this.keyboardBox, + { anchor_y: 0, + opacity: 0, + time: immediate ? 0 : KEYBOARD_ANIMATION_TIME, + transition: 'easeInQuad', + onComplete: this._hideKeyboardComplete, + onCompleteScope: this + }); + + this.emit('keyboard-visible-changed', false); + } + + _hideKeyboardComplete() { + this.keyboardBox.hide(); + this._updateRegions(); + } + + // setDummyCursorGeometry: + // + // The cursor dummy is a standard widget commonly used for popup + // menus and box pointers to track, as the box pointer API only + // tracks actors. If you want to pop up a menu based on where the + // user clicked, or where the text cursor is, the cursor dummy + // is what you should use. Given that the menu should not track + // the actual mouse pointer as it moves, you need to call this + // function before you show the menu to ensure it is at the right + // position and has the right size. + setDummyCursorGeometry(x, y, w, h) { + this.dummyCursor.set_position(Math.round(x), Math.round(y)); + this.dummyCursor.set_size(Math.round(w), Math.round(h)); + } + + // addChrome: + // @actor: an actor to add to the chrome + // @params: (optional) additional params + // + // Adds @actor to the chrome, and (unless %affectsInputRegion in + // @params is %false) extends the input region to include it. + // Changes in @actor's size, position, and visibility will + // automatically result in appropriate changes to the input + // region. + // + // If %affectsStruts in @params is %true (and @actor is along a + // screen edge), then @actor's size and position will also affect + // the window manager struts. Changes to @actor's visibility will + // NOT affect whether or not the strut is present, however. + // + // If %trackFullscreen in @params is %true, the actor's visibility + // will be bound to the presence of fullscreen windows on the same + // monitor (it will be hidden whenever a fullscreen window is visible, + // and shown otherwise) + addChrome(actor, params) { + this.uiGroup.add_actor(actor); + if (this.uiGroup.contains(global.top_window_group)) + this.uiGroup.set_child_below_sibling(actor, global.top_window_group); + this._trackActor(actor, params); + } + + // trackChrome: + // @actor: a descendant of the chrome to begin tracking + // @params: parameters describing how to track @actor + // + // Tells the chrome to track @actor. This can be used to extend the + // struts or input region to cover specific children. + // + // @params can have any of the same values as in addChrome(), + // though some possibilities don't make sense. By default, @actor has + // the same params as its chrome ancestor. + trackChrome(actor, params) { + let ancestor = actor.get_parent(); + let index = this._findActor(ancestor); + while (ancestor && index == -1) { + ancestor = ancestor.get_parent(); + index = this._findActor(ancestor); + } + + let ancestorData = ancestor ? this._trackedActors[index] + : defaultParams; + if (!params) + params = {}; + // We can't use Params.parse here because we want to drop + // the extra values like ancestorData.actor + for (let prop in defaultParams) { + if (!params.hasOwnProperty(prop)) + params[prop] = ancestorData[prop]; + } + + this._trackActor(actor, params); + } + + // untrackChrome: + // @actor: an actor previously tracked via trackChrome() + // + // Undoes the effect of trackChrome() + untrackChrome(actor) { + this._untrackActor(actor); + } + + // removeChrome: + // @actor: a chrome actor + // + // Removes @actor from the chrome + removeChrome(actor) { + this.uiGroup.remove_actor(actor); + this._untrackActor(actor); + } + + _findActor(actor) { + for (let i = 0; i < this._trackedActors.length; i++) { + let actorData = this._trackedActors[i]; + if (actorData.actor == actor) + return i; + } + return -1; + } + + _trackActor(actor, params) { + if (this._findActor(actor) != -1) + throw new Error('trying to re-track existing chrome actor'); + + let actorData = Params.parse(params, defaultParams); + actorData.actor = actor; + actorData.visibleId = actor.connect('notify::visible', + this._queueUpdateRegions.bind(this)); + actorData.allocationId = actor.connect('notify::allocation', + this._queueUpdateRegions.bind(this)); + actorData.destroyId = actor.connect('destroy', + this._untrackActor.bind(this)); + // Note that destroying actor will unset its parent, so we don't + // need to connect to 'destroy' too. + + this._trackedActors.push(actorData); + this._updateActorVisibility(actorData); + this._queueUpdateRegions(); + } + + _untrackActor(actor) { + let i = this._findActor(actor); + + if (i == -1) + return; + let actorData = this._trackedActors[i]; + + this._trackedActors.splice(i, 1); + actor.disconnect(actorData.visibleId); + actor.disconnect(actorData.allocationId); + actor.disconnect(actorData.destroyId); + + this._queueUpdateRegions(); + } + + _updateActorVisibility(actorData) { + if (!actorData.trackFullscreen) + return; + + let monitor = this.findMonitorForActor(actorData.actor); + actorData.actor.visible = !(global.window_group.visible && + monitor && + monitor.inFullscreen); + } + + _updateVisibility() { + let windowsVisible = Main.sessionMode.hasWindows && !this._inOverview; + + global.window_group.visible = windowsVisible; + global.top_window_group.visible = windowsVisible; + + this._trackedActors.forEach(this._updateActorVisibility.bind(this)); + } + + getWorkAreaForMonitor(monitorIndex) { + // Assume that all workspaces will have the same + // struts and pick the first one. + let workspaceManager = global.workspace_manager; + let ws = workspaceManager.get_workspace_by_index(0); + return ws.get_work_area_for_monitor(monitorIndex); + } + + // This call guarantees that we return some monitor to simplify usage of it + // In practice all tracked actors should be visible on some monitor anyway + findIndexForActor(actor) { + let [x, y] = actor.get_transformed_position(); + let [w, h] = actor.get_transformed_size(); + let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h }); + return global.display.get_monitor_index_for_rect(rect); + } + + findMonitorForActor(actor) { + let index = this.findIndexForActor(actor); + if (index >= 0 && index < this.monitors.length) + return this.monitors[index]; + return null; + } + + _queueUpdateRegions() { + if (this._startingUp) + return; + + if (!this._updateRegionIdle) + this._updateRegionIdle = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, + this._updateRegions.bind(this)); + } + + _getWindowActorsForWorkspace(workspace) { + return global.get_window_actors().filter(actor => { + let win = actor.meta_window; + return win.located_on_workspace(workspace); + }); + } + + _updateFullscreen() { + this._updateVisibility(); + this._queueUpdateRegions(); + } + + _windowsRestacked() { + let changed = false; + + if (this._isPopupWindowVisible != global.top_window_group.get_children().some(isPopupMetaWindow)) + changed = true; + + if (changed) { + this._updateVisibility(); + this._queueUpdateRegions(); + } + } + + _updateRegions() { + if (this._updateRegionIdle) { + Meta.later_remove(this._updateRegionIdle); + delete this._updateRegionIdle; + } + + // No need to update when we have a modal. + if (Main.modalCount > 0) + return GLib.SOURCE_REMOVE; + + // Bug workaround - get_transformed_position()/get_transformed_size() don't work after + // a change in stage size until the first pick or paint. + // https://bugzilla.gnome.org/show_bug.cgi?id=761565 + global.stage.get_actor_at_pos(Clutter.PickMode.ALL, 0, 0); + + let rects = [], struts = [], i; + let isPopupMenuVisible = global.top_window_group.get_children().some(isPopupMetaWindow); + let wantsInputRegion = !isPopupMenuVisible; + + for (i = 0; i < this._trackedActors.length; i++) { + let actorData = this._trackedActors[i]; + if (!(actorData.affectsInputRegion && wantsInputRegion) && !actorData.affectsStruts) + continue; + + let [x, y] = actorData.actor.get_transformed_position(); + let [w, h] = actorData.actor.get_transformed_size(); + x = Math.round(x); + y = Math.round(y); + w = Math.round(w); + h = Math.round(h); + + if (actorData.affectsInputRegion && wantsInputRegion && actorData.actor.get_paint_visibility()) + rects.push(new Meta.Rectangle({ x: x, y: y, width: w, height: h })); + + let monitor = null; + if (actorData.affectsStruts) + monitor = this.findMonitorForActor(actorData.actor); + + if (monitor) { + // Limit struts to the size of the screen + let x1 = Math.max(x, 0); + let x2 = Math.min(x + w, global.screen_width); + let y1 = Math.max(y, 0); + let y2 = Math.min(y + h, global.screen_height); + + // Metacity wants to know what side of the monitor the + // strut is considered to be attached to. First, we find + // the monitor that contains the strut. If the actor is + // only touching one edge, or is touching the entire + // border of that monitor, then it's obvious which side + // to call it. If it's in a corner, we pick a side + // arbitrarily. If it doesn't touch any edges, or it + // spans the width/height across the middle of the + // screen, then we don't create a strut for it at all. + + let side; + if (x1 <= monitor.x && x2 >= monitor.x + monitor.width) { + if (y1 <= monitor.y) + side = Meta.Side.TOP; + else if (y2 >= monitor.y + monitor.height) + side = Meta.Side.BOTTOM; + else + continue; + } else if (y1 <= monitor.y && y2 >= monitor.y + monitor.height) { + if (x1 <= monitor.x) + side = Meta.Side.LEFT; + else if (x2 >= monitor.x + monitor.width) + side = Meta.Side.RIGHT; + else + continue; + } else if (x1 <= monitor.x) + side = Meta.Side.LEFT; + else if (y1 <= monitor.y) + side = Meta.Side.TOP; + else if (x2 >= monitor.x + monitor.width) + side = Meta.Side.RIGHT; + else if (y2 >= monitor.y + monitor.height) + side = Meta.Side.BOTTOM; + else + continue; + + let strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1}); + let strut = new Meta.Strut({ rect: strutRect, side: side }); + struts.push(strut); + } + } + + if (!Meta.is_wayland_compositor()) + global.set_stage_input_region(rects); + this._isPopupWindowVisible = isPopupMenuVisible; + + let workspaceManager = global.workspace_manager; + for (let w = 0; w < workspaceManager.n_workspaces; w++) { + let workspace = workspaceManager.get_workspace_by_index(w); + workspace.set_builtin_struts(struts); + } + + return GLib.SOURCE_REMOVE; + } + + modalEnded() { + // We don't update the stage input region while in a modal, + // so queue an update now. + this._queueUpdateRegions(); + } +}); + + +// HotCorner: +// +// This class manages a "hot corner" that can toggle switching to +// overview. +var HotCorner = class HotCorner { + constructor(layoutManager, monitor, x, y) { + // We use this flag to mark the case where the user has entered the + // hot corner and has not left both the hot corner and a surrounding + // guard area (the "environs"). This avoids triggering the hot corner + // multiple times due to an accidental jitter. + this._entered = false; + + this._monitor = monitor; + + this._x = x; + this._y = y; + + this._setupFallbackCornerIfNeeded(layoutManager); + + this._pressureBarrier = new PressureBarrier(HOT_CORNER_PRESSURE_THRESHOLD, + HOT_CORNER_PRESSURE_TIMEOUT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW); + this._pressureBarrier.connect('trigger', this._toggleOverview.bind(this)); + + // Cache the three ripples instead of dynamically creating and destroying them. + this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false }); + this._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false }); + this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false }); + + layoutManager.uiGroup.add_actor(this._ripple1); + layoutManager.uiGroup.add_actor(this._ripple2); + layoutManager.uiGroup.add_actor(this._ripple3); + } + + setBarrierSize(size) { + if (this._verticalBarrier) { + this._pressureBarrier.removeBarrier(this._verticalBarrier); + this._verticalBarrier.destroy(); + this._verticalBarrier = null; + } + + if (this._horizontalBarrier) { + this._pressureBarrier.removeBarrier(this._horizontalBarrier); + this._horizontalBarrier.destroy(); + this._horizontalBarrier = null; + } + + if (size > 0) { + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { + this._verticalBarrier = new Meta.Barrier({ display: global.display, + x1: this._x, x2: this._x, y1: this._y, y2: this._y + size, + directions: Meta.BarrierDirection.NEGATIVE_X }); + this._horizontalBarrier = new Meta.Barrier({ display: global.display, + x1: this._x - size, x2: this._x, y1: this._y, y2: this._y, + directions: Meta.BarrierDirection.POSITIVE_Y }); + } else { + this._verticalBarrier = new Meta.Barrier({ display: global.display, + x1: this._x, x2: this._x, y1: this._y, y2: this._y + size, + directions: Meta.BarrierDirection.POSITIVE_X }); + this._horizontalBarrier = new Meta.Barrier({ display: global.display, + x1: this._x, x2: this._x + size, y1: this._y, y2: this._y, + directions: Meta.BarrierDirection.POSITIVE_Y }); + } + + this._pressureBarrier.addBarrier(this._verticalBarrier); + this._pressureBarrier.addBarrier(this._horizontalBarrier); + } + } + + _setupFallbackCornerIfNeeded(layoutManager) { + if (!global.display.supports_extended_barriers()) { + this.actor = new Clutter.Actor({ name: 'hot-corner-environs', + x: this._x, y: this._y, + width: 3, + height: 3, + reactive: true }); + + this._corner = new Clutter.Actor({ name: 'hot-corner', + width: 1, + height: 1, + opacity: 0, + reactive: true }); + this._corner._delegate = this; + + this.actor.add_child(this._corner); + layoutManager.addChrome(this.actor); + + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { + this._corner.set_position(this.actor.width - this._corner.width, 0); + this.actor.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST); + } else { + this._corner.set_position(0, 0); + } + + this.actor.connect('leave-event', + this._onEnvironsLeft.bind(this)); + + this._corner.connect('enter-event', + this._onCornerEntered.bind(this)); + this._corner.connect('leave-event', + this._onCornerLeft.bind(this)); + } + } + + destroy() { + this.setBarrierSize(0); + this._pressureBarrier.destroy(); + this._pressureBarrier = null; + + if (this.actor) + this.actor.destroy(); + } + + _animRipple(ripple, delay, time, startScale, startOpacity, finalScale) { + // We draw a ripple by using a source image and animating it scaling + // outwards and fading away. We want the ripples to move linearly + // or it looks unrealistic, but if the opacity of the ripple goes + // linearly to zero it fades away too quickly, so we use Tweener's + // 'onUpdate' to give a non-linear curve to the fade-away and make + // it more visible in the middle section. + + ripple._opacity = startOpacity; + + if (ripple.get_text_direction() == Clutter.TextDirection.RTL) + ripple.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST); + + ripple.visible = true; + ripple.opacity = 255 * Math.sqrt(startOpacity); + ripple.scale_x = ripple.scale_y = startScale; + + ripple.x = this._x; + ripple.y = this._y; + + Tweener.addTween(ripple, { _opacity: 0, + scale_x: finalScale, + scale_y: finalScale, + delay: delay, + time: time, + transition: 'linear', + onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); }, + onComplete() { ripple.visible = false; } }); + } + + _rippleAnimation() { + // Show three concentric ripples expanding outwards; the exact + // parameters were found by trial and error, so don't look + // for them to make perfect sense mathematically + + // delay time scale opacity => scale + this._animRipple(this._ripple1, 0.0, 0.83, 0.25, 1.0, 1.5); + this._animRipple(this._ripple2, 0.05, 1.0, 0.0, 0.7, 1.25); + this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1); + } + + _toggleOverview() { + if (this._monitor.inFullscreen && !Main.overview.visible) + return; + + if (Main.overview.shouldToggleByCornerOrButton()) { + this._rippleAnimation(); + Main.overview.toggle(); + } + } + + handleDragOver(source, actor, x, y, time) { + if (source != Main.xdndHandler) + return DND.DragMotionResult.CONTINUE; + + this._toggleOverview(); + + return DND.DragMotionResult.CONTINUE; + } + + _onCornerEntered() { + if (!this._entered) { + this._entered = true; + this._toggleOverview(); + } + return Clutter.EVENT_PROPAGATE; + } + + _onCornerLeft(actor, event) { + if (event.get_related() != this.actor) + this._entered = false; + // Consume event, otherwise this will confuse onEnvironsLeft + return Clutter.EVENT_STOP; + } + + _onEnvironsLeft(actor, event) { + if (event.get_related() != this._corner) + this._entered = false; + return Clutter.EVENT_PROPAGATE; + } +}; + +var PressureBarrier = class PressureBarrier { + constructor(threshold, timeout, actionMode) { + this._threshold = threshold; + this._timeout = timeout; + this._actionMode = actionMode; + this._barriers = []; + this._eventFilter = null; + + this._isTriggered = false; + this._reset(); + } + + addBarrier(barrier) { + barrier._pressureHitId = barrier.connect('hit', this._onBarrierHit.bind(this)); + barrier._pressureLeftId = barrier.connect('left', this._onBarrierLeft.bind(this)); + + this._barriers.push(barrier); + } + + _disconnectBarrier(barrier) { + barrier.disconnect(barrier._pressureHitId); + barrier.disconnect(barrier._pressureLeftId); + } + + removeBarrier(barrier) { + this._disconnectBarrier(barrier); + this._barriers.splice(this._barriers.indexOf(barrier), 1); + } + + destroy() { + this._barriers.forEach(this._disconnectBarrier.bind(this)); + this._barriers = []; + } + + setEventFilter(filter) { + this._eventFilter = filter; + } + + _reset() { + this._barrierEvents = []; + this._currentPressure = 0; + this._lastTime = 0; + } + + _isHorizontal(barrier) { + return barrier.y1 == barrier.y2; + } + + _getDistanceAcrossBarrier(barrier, event) { + if (this._isHorizontal(barrier)) + return Math.abs(event.dy); + else + return Math.abs(event.dx); + } + + _getDistanceAlongBarrier(barrier, event) { + if (this._isHorizontal(barrier)) + return Math.abs(event.dx); + else + return Math.abs(event.dy); + } + + _trimBarrierEvents() { + // Events are guaranteed to be sorted in time order from + // oldest to newest, so just look for the first old event, + // and then chop events after that off. + let i = 0; + let threshold = this._lastTime - this._timeout; + + while (i < this._barrierEvents.length) { + let [time, distance] = this._barrierEvents[i]; + if (time >= threshold) + break; + i++; + } + + let firstNewEvent = i; + + for (i = 0; i < firstNewEvent; i++) { + let [time, distance] = this._barrierEvents[i]; + this._currentPressure -= distance; + } + + this._barrierEvents = this._barrierEvents.slice(firstNewEvent); + } + + _onBarrierLeft(barrier, event) { + barrier._isHit = false; + if (this._barriers.every(b => !b._isHit)) { + this._reset(); + this._isTriggered = false; + } + } + + _trigger() { + this._isTriggered = true; + this.emit('trigger'); + this._reset(); + } + + _onBarrierHit(barrier, event) { + barrier._isHit = true; + + // If we've triggered the barrier, wait until the pointer has the + // left the barrier hitbox until we trigger it again. + if (this._isTriggered) + return; + + if (this._eventFilter && this._eventFilter(event)) + return; + + // Throw out all events not in the proper keybinding mode + if (!(this._actionMode & Main.actionMode)) + return; + + let slide = this._getDistanceAlongBarrier(barrier, event); + let distance = this._getDistanceAcrossBarrier(barrier, event); + + if (distance >= this._threshold) { + this._trigger(); + return; + } + + // Throw out events where the cursor is move more + // along the axis of the barrier than moving with + // the barrier. + if (slide > distance) + return; + + this._lastTime = event.time; + + this._trimBarrierEvents(); + distance = Math.min(15, distance); + + this._barrierEvents.push([event.time, distance]); + this._currentPressure += distance; + + if (this._currentPressure >= this._threshold) + this._trigger(); + } +}; +Signals.addSignalMethods(PressureBarrier.prototype); diff --git a/js/ui/lightbox.js b/js/ui/lightbox.js new file mode 100644 index 0000000..c7e4d51 --- /dev/null +++ b/js/ui/lightbox.js @@ -0,0 +1,276 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; + +var DEFAULT_FADE_FACTOR = 0.4; +var VIGNETTE_BRIGHTNESS = 0.8; +var VIGNETTE_SHARPNESS = 0.7; + +const VIGNETTE_DECLARATIONS = '\ +uniform float brightness;\n\ +uniform float vignette_sharpness;\n'; + +const VIGNETTE_CODE = '\ +cogl_color_out.a = cogl_color_in.a;\n\ +cogl_color_out.rgb = vec3(0.0, 0.0, 0.0);\n\ +vec2 position = cogl_tex_coord_in[0].xy - 0.5;\n\ +float t = length(2.0 * position);\n\ +t = clamp(t, 0.0, 1.0);\n\ +float pixel_brightness = mix(1.0, 1.0 - vignette_sharpness, t);\n\ +cogl_color_out.a = cogl_color_out.a * (1 - pixel_brightness * brightness);'; + +var RadialShaderQuad = GObject.registerClass( +class RadialShaderQuad extends Shell.GLSLQuad { + _init(params) { + super._init(params); + + this._brightnessLocation = this.get_uniform_location('brightness'); + this._sharpnessLocation = this.get_uniform_location('vignette_sharpness'); + + this.brightness = 1.0; + this.vignetteSharpness = 0.0; + } + + vfunc_build_pipeline() { + this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, + VIGNETTE_DECLARATIONS, VIGNETTE_CODE, true); + } + + get brightness() { + return this._brightness; + } + + set brightness(v) { + this._brightness = v; + this.set_uniform_float(this._brightnessLocation, + 1, [this._brightness]); + } + + get vignetteSharpness() { + return this._sharpness; + } + + set vignetteSharpness(v) { + this._sharpness = v; + this.set_uniform_float(this._sharpnessLocation, + 1, [this._sharpness]); + } +}); + +/** + * Lightbox: + * @container: parent Clutter.Container + * @params: (optional) additional parameters: + * - inhibitEvents: whether to inhibit events for @container + * - width: shade actor width + * - height: shade actor height + * - fadeInTime: seconds used to fade in + * - fadeOutTime: seconds used to fade out + * + * Lightbox creates a dark translucent "shade" actor to hide the + * contents of @container, and allows you to specify particular actors + * in @container to highlight by bringing them above the shade. It + * tracks added and removed actors in @container while the lightboxing + * is active, and ensures that all actors are returned to their + * original stacking order when the lightboxing is removed. (However, + * if actors are restacked by outside code while the lightboxing is + * active, the lightbox may later revert them back to their original + * order.) + * + * By default, the shade window will have the height and width of + * @container and will track any changes in its size. You can override + * this by passing an explicit width and height in @params. + */ +var Lightbox = class Lightbox { + constructor(container, params) { + params = Params.parse(params, { inhibitEvents: false, + width: null, + height: null, + fadeFactor: DEFAULT_FADE_FACTOR, + radialEffect: false, + }); + + this._container = container; + this._children = container.get_children(); + this._fadeFactor = params.fadeFactor; + this._radialEffect = Clutter.feature_available(Clutter.FeatureFlags.SHADERS_GLSL) && params.radialEffect; + if (this._radialEffect) + this.actor = new RadialShaderQuad({ x: 0, + y: 0, + reactive: params.inhibitEvents }); + else + this.actor = new St.Bin({ x: 0, + y: 0, + opacity: 0, + style_class: 'lightbox', + reactive: params.inhibitEvents }); + + container.add_actor(this.actor); + this.actor.raise_top(); + this.actor.hide(); + this.shown = false; + + this.actor.connect('destroy', this._onDestroy.bind(this)); + + if (params.width && params.height) { + this.actor.width = params.width; + this.actor.height = params.height; + } else { + let constraint = new Clutter.BindConstraint({ source: container, + coordinate: Clutter.BindCoordinate.ALL }); + this.actor.add_constraint(constraint); + } + + this._actorAddedSignalId = container.connect('actor-added', this._actorAdded.bind(this)); + this._actorRemovedSignalId = container.connect('actor-removed', this._actorRemoved.bind(this)); + + this._highlighted = null; + } + + _actorAdded(container, newChild) { + let children = this._container.get_children(); + let myIndex = children.indexOf(this.actor); + let newChildIndex = children.indexOf(newChild); + + if (newChildIndex > myIndex) { + // The child was added above the shade (presumably it was + // made the new top-most child). Move it below the shade, + // and add it to this._children as the new topmost actor. + newChild.lower(this.actor); + this._children.push(newChild); + } else if (newChildIndex == 0) { + // Bottom of stack + this._children.unshift(newChild); + } else { + // Somewhere else; insert it into the correct spot + let prevChild = this._children.indexOf(children[newChildIndex - 1]); + if (prevChild != -1) // paranoia + this._children.splice(prevChild + 1, 0, newChild); + } + } + + show(fadeInTime) { + fadeInTime = fadeInTime || 0; + + Tweener.removeTweens(this.actor); + if (this._radialEffect) { + Tweener.addTween(this.actor, + { brightness: VIGNETTE_BRIGHTNESS, + vignetteSharpness: VIGNETTE_SHARPNESS, + time: fadeInTime, + transition: 'easeOutQuad', + onComplete: () => { + this.shown = true; + this.emit('shown'); + } + }); + } else { + Tweener.addTween(this.actor, + { opacity: 255 * this._fadeFactor, + time: fadeInTime, + transition: 'easeOutQuad', + onComplete: () => { + this.shown = true; + this.emit('shown'); + } + }); + } + + this.actor.show(); + } + + hide(fadeOutTime) { + fadeOutTime = fadeOutTime || 0; + + this.shown = false; + Tweener.removeTweens(this.actor); + if (this._radialEffect) { + Tweener.addTween(this.actor, + { brightness: 1.0, + vignetteSharpness: 0.0, + opacity: 0, + time: fadeOutTime, + transition: 'easeOutQuad', + onComplete: () => { + this.actor.hide(); + } + }); + } else { + Tweener.addTween(this.actor, + { opacity: 0, + time: fadeOutTime, + transition: 'easeOutQuad', + onComplete: () => { + this.actor.hide(); + } + }); + } + } + + _actorRemoved(container, child) { + let index = this._children.indexOf(child); + if (index != -1) // paranoia + this._children.splice(index, 1); + + if (child == this._highlighted) + this._highlighted = null; + } + + /** + * highlight: + * @window: actor to highlight + * + * Highlights the indicated actor and unhighlights any other + * currently-highlighted actor. With no arguments or a false/null + * argument, all actors will be unhighlighted. + */ + highlight(window) { + if (this._highlighted == window) + return; + + // Walk this._children raising and lowering actors as needed. + // Things get a little tricky if the to-be-raised and + // to-be-lowered actors were originally adjacent, in which + // case we may need to indicate some *other* actor as the new + // sibling of the to-be-lowered one. + + let below = this.actor; + for (let i = this._children.length - 1; i >= 0; i--) { + if (this._children[i] == window) + this._children[i].raise_top(); + else if (this._children[i] == this._highlighted) + this._children[i].lower(below); + else + below = this._children[i]; + } + + this._highlighted = window; + } + + /** + * destroy: + * + * Destroys the lightbox. + */ + destroy() { + this.actor.destroy(); + } + + /** + * _onDestroy: + * + * This is called when the lightbox' actor is destroyed, either + * by destroying its container or by explicitly calling this.destroy(). + */ + _onDestroy() { + this._container.disconnect(this._actorAddedSignalId); + this._container.disconnect(this._actorRemovedSignalId); + + this.highlight(null); + } +}; +Signals.addSignalMethods(Lightbox.prototype); diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js new file mode 100644 index 0000000..958211d --- /dev/null +++ b/js/ui/lookingGlass.js @@ -0,0 +1,1102 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Cogl, Gio, GLib, + GObject, Meta, Pango, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; +const System = imports.system; + +const History = imports.misc.history; +const ExtensionSystem = imports.ui.extensionSystem; +const ExtensionUtils = imports.misc.extensionUtils; +const ShellEntry = imports.ui.shellEntry; +const Tweener = imports.ui.tweener; +const Main = imports.ui.main; +const JsParse = imports.misc.jsParse; + +const CHEVRON = '>>> '; + +/* Imports...feel free to add here as needed */ +var commandHeader = 'const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; ' + + 'const Main = imports.ui.main; ' + + 'const Mainloop = imports.mainloop; ' + + 'const Tweener = imports.ui.tweener; ' + + /* Utility functions...we should probably be able to use these + * in the shell core code too. */ + 'const stage = global.stage; ' + + /* Special lookingGlass functions */ + 'const inspect = Main.lookingGlass.inspect.bind(Main.lookingGlass); ' + + 'const it = Main.lookingGlass.getIt(); ' + + 'const r = Main.lookingGlass.getResult.bind(Main.lookingGlass); '; + +const HISTORY_KEY = 'looking-glass-history'; +// Time between tabs for them to count as a double-tab event +var AUTO_COMPLETE_DOUBLE_TAB_DELAY = 500; +var AUTO_COMPLETE_SHOW_COMPLETION_ANIMATION_DURATION = 0.2; +var AUTO_COMPLETE_GLOBAL_KEYWORDS = _getAutoCompleteGlobalKeywords(); + +function _getAutoCompleteGlobalKeywords() { + const keywords = ['true', 'false', 'null', 'new']; + // Don't add the private properties of window (i.e., ones starting with '_') + const windowProperties = Object.getOwnPropertyNames(window).filter( + a => a.charAt(0) != '_' + ); + const headerProperties = JsParse.getDeclaredConstants(commandHeader); + + return keywords.concat(windowProperties).concat(headerProperties); +} + +var AutoComplete = class AutoComplete { + constructor(entry) { + this._entry = entry; + this._entry.connect('key-press-event', this._entryKeyPressEvent.bind(this)); + this._lastTabTime = global.get_current_time(); + } + + _processCompletionRequest(event) { + if (event.completions.length == 0) { + return; + } + // Unique match = go ahead and complete; multiple matches + single tab = complete the common starting string; + // multiple matches + double tab = emit a suggest event with all possible options + if (event.completions.length == 1) { + this.additionalCompletionText(event.completions[0], event.attrHead); + this.emit('completion', { completion: event.completions[0], type: 'whole-word' }); + } else if (event.completions.length > 1 && event.tabType === 'single') { + let commonPrefix = JsParse.getCommonPrefix(event.completions); + + if (commonPrefix.length > 0) { + this.additionalCompletionText(commonPrefix, event.attrHead); + this.emit('completion', { completion: commonPrefix, type: 'prefix' }); + this.emit('suggest', { completions: event.completions}); + } + } else if (event.completions.length > 1 && event.tabType === 'double') { + this.emit('suggest', { completions: event.completions}); + } + } + + _entryKeyPressEvent(actor, event) { + let cursorPos = this._entry.clutter_text.get_cursor_position(); + let text = this._entry.get_text(); + if (cursorPos != -1) { + text = text.slice(0, cursorPos); + } + if (event.get_key_symbol() == Clutter.Tab) { + let [completions, attrHead] = JsParse.getCompletions(text, commandHeader, AUTO_COMPLETE_GLOBAL_KEYWORDS); + let currTime = global.get_current_time(); + if ((currTime - this._lastTabTime) < AUTO_COMPLETE_DOUBLE_TAB_DELAY) { + this._processCompletionRequest({ tabType: 'double', + completions: completions, + attrHead: attrHead }); + } else { + this._processCompletionRequest({ tabType: 'single', + completions: completions, + attrHead: attrHead }); + } + this._lastTabTime = currTime; + } + return Clutter.EVENT_PROPAGATE; + } + + // Insert characters of text not already included in head at cursor position. i.e., if text="abc" and head="a", + // the string "bc" will be appended to this._entry + additionalCompletionText(text, head) { + let additionalCompletionText = text.slice(head.length); + let cursorPos = this._entry.clutter_text.get_cursor_position(); + + this._entry.clutter_text.insert_text(additionalCompletionText, cursorPos); + } +}; +Signals.addSignalMethods(AutoComplete.prototype); + + +var Notebook = class Notebook { + constructor() { + this.actor = new St.BoxLayout({ vertical: true }); + + this.tabControls = new St.BoxLayout({ style_class: 'labels' }); + + this._selectedIndex = -1; + this._tabs = []; + } + + appendPage(name, child) { + let labelBox = new St.BoxLayout({ style_class: 'notebook-tab', + reactive: true, + track_hover: true }); + let label = new St.Button({ label: name }); + label.connect('clicked', () => { + this.selectChild(child); + return true; + }); + labelBox.add(label, { expand: true }); + this.tabControls.add(labelBox); + + let scrollview = new St.ScrollView({ x_fill: true, y_fill: true }); + scrollview.get_hscroll_bar().hide(); + scrollview.add_actor(child); + + let tabData = { child: child, + labelBox: labelBox, + label: label, + scrollView: scrollview, + _scrollToBottom: false }; + this._tabs.push(tabData); + scrollview.hide(); + this.actor.add(scrollview, { expand: true }); + + let vAdjust = scrollview.vscroll.adjustment; + vAdjust.connect('changed', () => { this._onAdjustScopeChanged(tabData); }); + vAdjust.connect('notify::value', () => { this._onAdjustValueChanged(tabData); }); + + if (this._selectedIndex == -1) + this.selectIndex(0); + } + + _unselect() { + if (this._selectedIndex < 0) + return; + let tabData = this._tabs[this._selectedIndex]; + tabData.labelBox.remove_style_pseudo_class('selected'); + tabData.scrollView.hide(); + this._selectedIndex = -1; + } + + selectIndex(index) { + if (index == this._selectedIndex) + return; + if (index < 0) { + this._unselect(); + this.emit('selection', null); + return; + } + + // Focus the new tab before unmapping the old one + let tabData = this._tabs[index]; + if (!tabData.scrollView.navigate_focus(null, St.DirectionType.TAB_FORWARD, false)) + this.actor.grab_key_focus(); + + this._unselect(); + + tabData.labelBox.add_style_pseudo_class('selected'); + tabData.scrollView.show(); + this._selectedIndex = index; + this.emit('selection', tabData.child); + } + + selectChild(child) { + if (child == null) + this.selectIndex(-1); + else { + for (let i = 0; i < this._tabs.length; i++) { + let tabData = this._tabs[i]; + if (tabData.child == child) { + this.selectIndex(i); + return; + } + } + } + } + + scrollToBottom(index) { + let tabData = this._tabs[index]; + tabData._scrollToBottom = true; + + } + + _onAdjustValueChanged(tabData) { + let vAdjust = tabData.scrollView.vscroll.adjustment; + if (vAdjust.value < (vAdjust.upper - vAdjust.lower - 0.5)) + tabData._scrolltoBottom = false; + } + + _onAdjustScopeChanged(tabData) { + if (!tabData._scrollToBottom) + return; + let vAdjust = tabData.scrollView.vscroll.adjustment; + vAdjust.value = vAdjust.upper - vAdjust.page_size; + } + + nextTab() { + let nextIndex = this._selectedIndex; + if (nextIndex < this._tabs.length - 1) { + ++nextIndex; + } + + this.selectIndex(nextIndex); + } + + prevTab() { + let prevIndex = this._selectedIndex; + if (prevIndex > 0) { + --prevIndex; + } + + this.selectIndex(prevIndex); + } +}; +Signals.addSignalMethods(Notebook.prototype); + +function objectToString(o) { + if (typeof(o) == typeof(objectToString)) { + // special case this since the default is way, way too verbose + return ''; + } else { + return '' + o; + } +} + +var ObjLink = class ObjLink { + constructor(lookingGlass, o, title) { + let text; + if (title) + text = title; + else + text = objectToString(o); + text = GLib.markup_escape_text(text, -1); + this._obj = o; + + this.actor = new St.Button({ reactive: true, + track_hover: true, + style_class: 'shell-link', + label: text }); + this.actor.get_child().single_line_mode = true; + this.actor.connect('clicked', this._onClicked.bind(this)); + + this._lookingGlass = lookingGlass; + } + + _onClicked(link) { + this._lookingGlass.inspectObject(this._obj, this.actor); + } +}; + +var Result = class Result { + constructor(lookingGlass, command, o, index) { + this.index = index; + this.o = o; + + this.actor = new St.BoxLayout({ vertical: true }); + this._lookingGlass = lookingGlass; + + let cmdTxt = new St.Label({ text: command }); + cmdTxt.clutter_text.ellipsize = Pango.EllipsizeMode.END; + this.actor.add(cmdTxt); + let box = new St.BoxLayout({}); + this.actor.add(box); + let resultTxt = new St.Label({ text: 'r(' + index + ') = ' }); + resultTxt.clutter_text.ellipsize = Pango.EllipsizeMode.END; + box.add(resultTxt); + let objLink = new ObjLink(this._lookingGlass, o); + box.add(objLink.actor); + } +}; + +var WindowList = class WindowList { + constructor(lookingGlass) { + this.actor = new St.BoxLayout({ name: 'Windows', vertical: true, style: 'spacing: 8px' }); + let tracker = Shell.WindowTracker.get_default(); + this._updateId = Main.initializeDeferredWork(this.actor, this._updateWindowList.bind(this)); + global.display.connect('window-created', this._updateWindowList.bind(this)); + tracker.connect('tracked-windows-changed', this._updateWindowList.bind(this)); + + this._lookingGlass = lookingGlass; + } + + _updateWindowList() { + this.actor.destroy_all_children(); + let windows = global.get_window_actors(); + let tracker = Shell.WindowTracker.get_default(); + for (let i = 0; i < windows.length; i++) { + let metaWindow = windows[i].metaWindow; + // Avoid multiple connections + if (!metaWindow._lookingGlassManaged) { + metaWindow.connect('unmanaged', this._updateWindowList.bind(this)); + metaWindow._lookingGlassManaged = true; + } + let box = new St.BoxLayout({ vertical: true }); + this.actor.add(box); + let windowLink = new ObjLink(this._lookingGlass, metaWindow, metaWindow.title); + box.add(windowLink.actor, { x_align: St.Align.START, x_fill: false }); + let propsBox = new St.BoxLayout({ vertical: true, style: 'padding-left: 6px;' }); + box.add(propsBox); + propsBox.add(new St.Label({ text: 'wmclass: ' + metaWindow.get_wm_class() })); + let app = tracker.get_window_app(metaWindow); + if (app != null && !app.is_window_backed()) { + let icon = app.create_icon_texture(22); + let propBox = new St.BoxLayout({ style: 'spacing: 6px; ' }); + propsBox.add(propBox); + propBox.add(new St.Label({ text: 'app: ' }), { y_fill: false }); + let appLink = new ObjLink(this._lookingGlass, app, app.get_id()); + propBox.add(appLink.actor, { y_fill: false }); + propBox.add(icon, { y_fill: false }); + } else { + propsBox.add(new St.Label({ text: '' })); + } + } + } +}; +Signals.addSignalMethods(WindowList.prototype); + +var ObjInspector = class ObjInspector { + constructor(lookingGlass) { + this._obj = null; + this._previousObj = null; + + this._parentList = []; + + this.actor = new St.ScrollView({ pivot_point: new Clutter.Point({ x: 0.5, y: 0.5 }), + x_fill: true, y_fill: true }); + this.actor.get_hscroll_bar().hide(); + this._container = new St.BoxLayout({ name: 'LookingGlassPropertyInspector', + style_class: 'lg-dialog', + vertical: true }); + this.actor.add_actor(this._container); + + this._lookingGlass = lookingGlass; + } + + selectObject(obj, skipPrevious) { + if (!skipPrevious) + this._previousObj = this._obj; + else + this._previousObj = null; + this._obj = obj; + + this._container.destroy_all_children(); + + let hbox = new St.BoxLayout({ style_class: 'lg-obj-inspector-title' }); + this._container.add_actor(hbox); + let label = new St.Label({ text: 'Inspecting: %s: %s'.format(typeof(obj), + objectToString(obj)) }); + label.single_line_mode = true; + hbox.add(label, { expand: true, y_fill: false }); + let button = new St.Button({ label: 'Insert', style_class: 'lg-obj-inspector-button' }); + button.connect('clicked', this._onInsert.bind(this)); + hbox.add(button); + + if (this._previousObj != null) { + button = new St.Button({ label: 'Back', style_class: 'lg-obj-inspector-button' }); + button.connect('clicked', this._onBack.bind(this)); + hbox.add(button); + } + + button = new St.Button({ style_class: 'window-close' }); + button.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); + button.connect('clicked', this.close.bind(this)); + hbox.add(button); + if (typeof(obj) == typeof({})) { + let properties = []; + for (let propName in obj) { + properties.push(propName); + } + properties.sort(); + + for (let i = 0; i < properties.length; i++) { + let propName = properties[i]; + let valueStr; + let link; + try { + let prop = obj[propName]; + link = new ObjLink(this._lookingGlass, prop).actor; + } catch (e) { + link = new St.Label({ text: '' }); + } + let hbox = new St.BoxLayout(); + let propText = propName + ': ' + valueStr; + hbox.add(new St.Label({ text: propName + ': ' })); + hbox.add(link); + this._container.add_actor(hbox); + } + } + } + + open(sourceActor) { + if (this._open) + return; + this._previousObj = null; + this._open = true; + this.actor.show(); + if (sourceActor) { + this.actor.set_scale(0, 0); + Tweener.addTween(this.actor, { scale_x: 1, scale_y: 1, + transition: 'easeOutQuad', + time: 0.2 }); + } else { + this.actor.set_scale(1, 1); + } + } + + close() { + if (!this._open) + return; + this._open = false; + this.actor.hide(); + this._previousObj = null; + this._obj = null; + } + + _onInsert() { + let obj = this._obj; + this.close(); + this._lookingGlass.insertObject(obj); + } + + _onBack() { + this.selectObject(this._previousObj, true); + } +}; + +var RedBorderEffect = GObject.registerClass( +class RedBorderEffect extends Clutter.Effect { + vfunc_paint() { + let actor = this.get_actor(); + actor.continue_paint(); + + let color = new Cogl.Color(); + color.init_from_4ub(0xff, 0, 0, 0xc4); + Cogl.set_source_color(color); + + let geom = actor.get_allocation_geometry(); + let width = 2; + + // clockwise order + Cogl.rectangle(0, 0, geom.width, width); + Cogl.rectangle(geom.width - width, width, + geom.width, geom.height); + Cogl.rectangle(0, geom.height, + geom.width - width, geom.height - width); + Cogl.rectangle(0, geom.height - width, + width, width); + } +}); + +var Inspector = GObject.registerClass({ + Signals: { 'closed': {}, + 'target': { param_types: [Clutter.Actor.$gtype, GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] } }, +}, class Inspector extends Clutter.Actor { + _init(lookingGlass) { + super._init({ width: 0, + height: 0 }); + + Main.uiGroup.add_actor(this); + + let eventHandler = new St.BoxLayout({ name: 'LookingGlassDialog', + vertical: false, + reactive: true }); + this._eventHandler = eventHandler; + this.add_actor(eventHandler); + this._displayText = new St.Label(); + eventHandler.add(this._displayText, { expand: true }); + + eventHandler.connect('key-press-event', this._onKeyPressEvent.bind(this)); + eventHandler.connect('button-press-event', this._onButtonPressEvent.bind(this)); + eventHandler.connect('scroll-event', this._onScrollEvent.bind(this)); + eventHandler.connect('motion-event', this._onMotionEvent.bind(this)); + Clutter.grab_pointer(eventHandler); + Clutter.grab_keyboard(eventHandler); + + // this._target is the actor currently shown by the inspector. + // this._pointerTarget is the actor directly under the pointer. + // Normally these are the same, but if you use the scroll wheel + // to drill down, they'll diverge until you either scroll back + // out, or move the pointer outside of _pointerTarget. + this._target = null; + this._pointerTarget = null; + + this._lookingGlass = lookingGlass; + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + if (!this._eventHandler) + return; + + let primary = Main.layoutManager.primaryMonitor; + + let [minWidth, minHeight, natWidth, natHeight] = + this._eventHandler.get_preferred_size(); + + let childBox = new Clutter.ActorBox(); + childBox.x1 = primary.x + Math.floor((primary.width - natWidth) / 2); + childBox.x2 = childBox.x1 + natWidth; + childBox.y1 = primary.y + Math.floor((primary.height - natHeight) / 2); + childBox.y2 = childBox.y1 + natHeight; + this._eventHandler.allocate(childBox, flags); + } + + _close() { + Clutter.ungrab_pointer(); + Clutter.ungrab_keyboard(); + this._eventHandler.destroy(); + this._eventHandler = null; + this.emit('closed'); + } + + _onKeyPressEvent(actor, event) { + if (event.get_key_symbol() == Clutter.Escape) + this._close(); + return Clutter.EVENT_STOP; + } + + _onButtonPressEvent(actor, event) { + if (this._target) { + let [stageX, stageY] = event.get_coords(); + this.emit('target', this._target, stageX, stageY); + } + this._close(); + return Clutter.EVENT_STOP; + } + + _onScrollEvent(actor, event) { + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + // select parent + let parent = this._target.get_parent(); + if (parent != null) { + this._target = parent; + this._update(event); + } + break; + + case Clutter.ScrollDirection.DOWN: + // select child + if (this._target != this._pointerTarget) { + let child = this._pointerTarget; + while (child) { + let parent = child.get_parent(); + if (parent == this._target) + break; + child = parent; + } + if (child) { + this._target = child; + this._update(event); + } + } + break; + + default: + break; + } + return Clutter.EVENT_STOP; + } + + _onMotionEvent(actor, event) { + this._update(event); + return Clutter.EVENT_STOP; + } + + _update(event) { + let [stageX, stageY] = event.get_coords(); + let target = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, + stageX, + stageY); + + if (target != this._pointerTarget) + this._target = target; + this._pointerTarget = target; + + let position = '[inspect x: ' + stageX + ' y: ' + stageY + ']'; + this._displayText.text = ''; + this._displayText.text = position + ' ' + this._target; + + this._lookingGlass.setBorderPaintTarget(this._target); + } +}); + +var Extensions = class Extensions { + constructor(lookingGlass) { + this._lookingGlass = lookingGlass; + this.actor = new St.BoxLayout({ vertical: true, + name: 'lookingGlassExtensions' }); + this._noExtensions = new St.Label({ style_class: 'lg-extensions-none', + text: _("No extensions installed") }); + this._numExtensions = 0; + this._extensionsList = new St.BoxLayout({ vertical: true, + style_class: 'lg-extensions-list' }); + this._extensionsList.add(this._noExtensions); + this.actor.add(this._extensionsList); + + for (let uuid in ExtensionUtils.extensions) + this._loadExtension(null, uuid); + + ExtensionSystem.connect('extension-loaded', + this._loadExtension.bind(this)); + } + + _loadExtension(o, uuid) { + let extension = ExtensionUtils.extensions[uuid]; + // There can be cases where we create dummy extension metadata + // that's not really a proper extension. Don't bother with these. + if (!extension.metadata.name) + return; + + let extensionDisplay = this._createExtensionDisplay(extension); + if (this._numExtensions == 0) + this._extensionsList.remove_actor(this._noExtensions); + + this._numExtensions ++; + this._extensionsList.add(extensionDisplay); + } + + _onViewSource(actor) { + let extension = actor._extension; + let uri = extension.dir.get_uri(); + Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context(0, -1)); + this._lookingGlass.close(); + } + + _onWebPage(actor) { + let extension = actor._extension; + Gio.app_info_launch_default_for_uri(extension.metadata.url, global.create_app_launch_context(0, -1)); + this._lookingGlass.close(); + } + + _onViewErrors(actor) { + let extension = actor._extension; + let shouldShow = !actor._isShowing; + + if (shouldShow) { + let errors = extension.errors; + let errorDisplay = new St.BoxLayout({ vertical: true }); + if (errors && errors.length) { + for (let i = 0; i < errors.length; i ++) + errorDisplay.add(new St.Label({ text: errors[i] })); + } else { + /* Translators: argument is an extension UUID. */ + let message = _("%s has not emitted any errors.").format(extension.uuid); + errorDisplay.add(new St.Label({ text: message })); + } + + actor._errorDisplay = errorDisplay; + actor._parentBox.add(errorDisplay); + actor.label = _("Hide Errors"); + } else { + actor._errorDisplay.destroy(); + actor._errorDisplay = null; + actor.label = _("Show Errors"); + } + + actor._isShowing = shouldShow; + } + + _stateToString(extensionState) { + switch (extensionState) { + case ExtensionSystem.ExtensionState.ENABLED: + return _("Enabled"); + case ExtensionSystem.ExtensionState.DISABLED: + case ExtensionSystem.ExtensionState.INITIALIZED: + return _("Disabled"); + case ExtensionSystem.ExtensionState.ERROR: + return _("Error"); + case ExtensionSystem.ExtensionState.OUT_OF_DATE: + return _("Out of date"); + case ExtensionSystem.ExtensionState.DOWNLOADING: + return _("Downloading"); + } + return 'Unknown'; // Not translated, shouldn't appear + } + + _createExtensionDisplay(extension) { + let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true }); + let name = new St.Label({ style_class: 'lg-extension-name', + text: extension.metadata.name }); + box.add(name, { expand: true }); + let description = new St.Label({ style_class: 'lg-extension-description', + text: extension.metadata.description || 'No description' }); + box.add(description, { expand: true }); + + let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' }); + box.add(metaBox); + let stateString = this._stateToString(extension.state); + let state = new St.Label({ style_class: 'lg-extension-state', + text: this._stateToString(extension.state) }); + metaBox.add(state); + + let viewsource = new St.Button({ reactive: true, + track_hover: true, + style_class: 'shell-link', + label: _("View Source") }); + viewsource._extension = extension; + viewsource.connect('clicked', this._onViewSource.bind(this)); + metaBox.add(viewsource); + + if (extension.metadata.url) { + let webpage = new St.Button({ reactive: true, + track_hover: true, + style_class: 'shell-link', + label: _("Web Page") }); + webpage._extension = extension; + webpage.connect('clicked', this._onWebPage.bind(this)); + metaBox.add(webpage); + } + + let viewerrors = new St.Button({ reactive: true, + track_hover: true, + style_class: 'shell-link', + label: _("Show Errors") }); + viewerrors._extension = extension; + viewerrors._parentBox = box; + viewerrors._isShowing = false; + viewerrors.connect('clicked', this._onViewErrors.bind(this)); + metaBox.add(viewerrors); + + return box; + } +}; + +var LookingGlass = class LookingGlass { + constructor() { + this._borderPaintTarget = null; + this._redBorderEffect = new RedBorderEffect(); + + this._open = false; + + this._it = null; + this._offset = 0; + this._results = []; + + // Sort of magic, but...eh. + this._maxItems = 150; + + this.actor = new St.BoxLayout({ name: 'LookingGlassDialog', + style_class: 'lg-dialog', + vertical: true, + visible: false, + reactive: true }); + this.actor.connect('key-press-event', this._globalKeyPressEvent.bind(this)); + + this._interfaceSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); + this._interfaceSettings.connect('changed::monospace-font-name', + this._updateFont.bind(this)); + this._updateFont(); + + // We want it to appear to slide out from underneath the panel + Main.uiGroup.add_actor(this.actor); + Main.uiGroup.set_child_below_sibling(this.actor, + Main.layoutManager.panelBox); + Main.layoutManager.panelBox.connect('allocation-changed', + this._queueResize.bind(this)); + Main.layoutManager.keyboardBox.connect('allocation-changed', + this._queueResize.bind(this)); + + this._objInspector = new ObjInspector(this); + Main.uiGroup.add_actor(this._objInspector.actor); + this._objInspector.actor.hide(); + + let toolbar = new St.BoxLayout({ name: 'Toolbar' }); + this.actor.add_actor(toolbar); + let inspectIcon = new St.Icon({ icon_name: 'gtk-color-picker', + icon_size: 24 }); + toolbar.add_actor(inspectIcon); + inspectIcon.reactive = true; + inspectIcon.connect('button-press-event', () => { + let inspector = new Inspector(this); + inspector.connect('target', (i, target, stageX, stageY) => { + this._pushResult('inspect(' + Math.round(stageX) + ', ' + Math.round(stageY) + ')', target); + }); + inspector.connect('closed', () => { + this.actor.show(); + global.stage.set_key_focus(this._entry); + }); + this.actor.hide(); + return Clutter.EVENT_STOP; + }); + + let gcIcon = new St.Icon({ icon_name: 'user-trash-full', + icon_size: 24 }); + toolbar.add_actor(gcIcon); + gcIcon.reactive = true; + gcIcon.connect('button-press-event', () => { + gcIcon.icon_name = 'user-trash'; + System.gc(); + this._timeoutId = Mainloop.timeout_add(500, () => { + gcIcon.icon_name = 'user-trash-full'; + this._timeoutId = 0; + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\''); + return Clutter.EVENT_PROPAGATE; + }); + + let notebook = new Notebook(); + this._notebook = notebook; + this.actor.add(notebook.actor, { expand: true }); + + let emptyBox = new St.Bin(); + toolbar.add(emptyBox, { expand: true }); + toolbar.add_actor(notebook.tabControls); + + this._evalBox = new St.BoxLayout({ name: 'EvalBox', vertical: true }); + notebook.appendPage('Evaluator', this._evalBox); + + this._resultsArea = new St.BoxLayout({ name: 'ResultsArea', vertical: true }); + this._evalBox.add(this._resultsArea, { expand: true }); + + this._entryArea = new St.BoxLayout({ name: 'EntryArea' }); + this._evalBox.add_actor(this._entryArea); + + let label = new St.Label({ text: CHEVRON }); + this._entryArea.add(label); + + this._entry = new St.Entry({ can_focus: true }); + ShellEntry.addContextMenu(this._entry); + this._entryArea.add(this._entry, { expand: true }); + + this._windowList = new WindowList(this); + notebook.appendPage('Windows', this._windowList.actor); + + this._extensions = new Extensions(this); + notebook.appendPage('Extensions', this._extensions.actor); + + this._entry.clutter_text.connect('activate', (o, e) => { + // Hide any completions we are currently showing + this._hideCompletions(); + + let text = o.get_text(); + // Ensure we don't get newlines in the command; the history file is + // newline-separated. + text = text.replace('\n', ' '); + // Strip leading and trailing whitespace + text = text.replace(/^\s+/g, '').replace(/\s+$/g, ''); + if (text == '') + return true; + this._evaluate(text); + return true; + }); + + this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY, + entry: this._entry.clutter_text }); + + this._autoComplete = new AutoComplete(this._entry); + this._autoComplete.connect('suggest', (a, e) => { + this._showCompletions(e.completions); + }); + // If a completion is completed unambiguously, the currently-displayed completion + // suggestions become irrelevant. + this._autoComplete.connect('completion', (a, e) => { + if (e.type == 'whole-word') + this._hideCompletions(); + }); + + this._resize(); + } + + _updateFont() { + let fontName = this._interfaceSettings.get_string('monospace-font-name'); + let fontDesc = Pango.FontDescription.from_string(fontName); + // We ignore everything but size and style; you'd be crazy to set your system-wide + // monospace font to be bold/oblique/etc. Could easily be added here. + this.actor.style = + 'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + ';' + + 'font-family: "' + fontDesc.get_family() + '";'; + } + + setBorderPaintTarget(obj) { + if (this._borderPaintTarget != null) + this._borderPaintTarget.remove_effect(this._redBorderEffect); + this._borderPaintTarget = obj; + if (this._borderPaintTarget != null) + this._borderPaintTarget.add_effect(this._redBorderEffect); + } + + _pushResult(command, obj) { + let index = this._results.length + this._offset; + let result = new Result(this, CHEVRON + command, obj, index); + this._results.push(result); + this._resultsArea.add(result.actor); + if (obj instanceof Clutter.Actor) + this.setBorderPaintTarget(obj); + + let children = this._resultsArea.get_children(); + if (children.length > this._maxItems) { + this._results.shift(); + children[0].destroy(); + this._offset++; + } + this._it = obj; + + // Scroll to bottom + this._notebook.scrollToBottom(0); + } + + _showCompletions(completions) { + if (!this._completionActor) { + this._completionActor = new St.Label({ name: 'LookingGlassAutoCompletionText', style_class: 'lg-completions-text' }); + this._completionActor.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._completionActor.clutter_text.line_wrap = true; + this._evalBox.insert_child_below(this._completionActor, this._entryArea); + } + + this._completionActor.set_text(completions.join(', ')); + + // Setting the height to -1 allows us to get its actual preferred height rather than + // whatever was last given in set_height by Tweener. + this._completionActor.set_height(-1); + let [minHeight, naturalHeight] = this._completionActor.get_preferred_height(this._resultsArea.get_width()); + + // Don't reanimate if we are already visible + if (this._completionActor.visible) { + this._completionActor.height = naturalHeight; + } else { + this._completionActor.show(); + Tweener.removeTweens(this._completionActor); + Tweener.addTween(this._completionActor, { time: AUTO_COMPLETE_SHOW_COMPLETION_ANIMATION_DURATION / St.get_slow_down_factor(), + transition: 'easeOutQuad', + height: naturalHeight, + opacity: 255 + }); + } + } + + _hideCompletions() { + if (this._completionActor) { + Tweener.removeTweens(this._completionActor); + Tweener.addTween(this._completionActor, { time: AUTO_COMPLETE_SHOW_COMPLETION_ANIMATION_DURATION / St.get_slow_down_factor(), + transition: 'easeOutQuad', + height: 0, + opacity: 0, + onComplete: () => { + this._completionActor.hide(); + } + }); + } + } + + _evaluate(command) { + this._history.addItem(command); + + let lines = command.split(';'); + lines.push(`return ${lines.pop()}`); + + let fullCmd = commandHeader + lines.join(';'); + + let resultObj; + try { + resultObj = Function(fullCmd)(); + } catch (e) { + resultObj = ''; + } + + this._pushResult(command, resultObj); + this._entry.text = ''; + } + + inspect(x, y) { + return global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); + } + + getIt() { + return this._it; + } + + getResult(idx) { + return this._results[idx - this._offset].o; + } + + toggle() { + if (this._open) + this.close(); + else + this.open(); + } + + _queueResize() { + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { this._resize(); }); + } + + _resize() { + let primary = Main.layoutManager.primaryMonitor; + let myWidth = primary.width * 0.7; + let availableHeight = primary.height - Main.layoutManager.keyboardBox.height; + let myHeight = Math.min(primary.height * 0.7, availableHeight * 0.9); + this.actor.x = primary.x + (primary.width - myWidth) / 2; + this._hiddenY = primary.y + Main.layoutManager.panelBox.height - myHeight; + this._targetY = this._hiddenY + myHeight; + this.actor.y = this._hiddenY; + this.actor.width = myWidth; + this.actor.height = myHeight; + this._objInspector.actor.set_size(Math.floor(myWidth * 0.8), Math.floor(myHeight * 0.8)); + this._objInspector.actor.set_position(this.actor.x + Math.floor(myWidth * 0.1), + this._targetY + Math.floor(myHeight * 0.1)); + } + + insertObject(obj) { + this._pushResult('', obj); + } + + inspectObject(obj, sourceActor) { + this._objInspector.open(sourceActor); + this._objInspector.selectObject(obj); + } + + // Handle key events which are relevant for all tabs of the LookingGlass + _globalKeyPressEvent(actor, event) { + let symbol = event.get_key_symbol(); + let modifierState = event.get_state(); + if (symbol == Clutter.Escape) { + if (this._objInspector.actor.visible) { + this._objInspector.close(); + } else { + this.close(); + } + return Clutter.EVENT_STOP; + } + // Ctrl+PgUp and Ctrl+PgDown switches tabs in the notebook view + if (modifierState & Clutter.ModifierType.CONTROL_MASK) { + if (symbol == Clutter.KEY_Page_Up) { + this._notebook.prevTab(); + } else if (symbol == Clutter.KEY_Page_Down) { + this._notebook.nextTab(); + } + } + return Clutter.EVENT_PROPAGATE; + } + + open() { + if (this._open) + return; + + if (!Main.pushModal(this._entry, { actionMode: Shell.ActionMode.LOOKING_GLASS })) + return; + + this._notebook.selectIndex(0); + this.actor.show(); + this._open = true; + this._history.lastItem(); + + Tweener.removeTweens(this.actor); + + // We inverse compensate for the slow-down so you can change the factor + // through LookingGlass without long waits. + Tweener.addTween(this.actor, { time: 0.5 / St.get_slow_down_factor(), + transition: 'easeOutQuad', + y: this._targetY + }); + } + + close() { + if (!this._open) + return; + + this._objInspector.actor.hide(); + + this._open = false; + Tweener.removeTweens(this.actor); + + this.setBorderPaintTarget(null); + + Main.popModal(this._entry); + + Tweener.addTween(this.actor, { time: Math.min(0.5 / St.get_slow_down_factor(), 0.5), + transition: 'easeOutQuad', + y: this._hiddenY, + onComplete: () => { + this.actor.hide(); + } + }); + } +}; +Signals.addSignalMethods(LookingGlass.prototype); diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js new file mode 100644 index 0000000..021dbd8 --- /dev/null +++ b/js/ui/magnifier.js @@ -0,0 +1,1934 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atspi, Clutter, GDesktopEnums, + Gio, GLib, GObject, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Background = imports.ui.background; +const FocusCaretTracker = imports.ui.focusCaretTracker; +const Main = imports.ui.main; +const MagnifierDBus = imports.ui.magnifierDBus; +const Params = imports.misc.params; +const PointerWatcher = imports.ui.pointerWatcher; + +var CROSSHAIRS_CLIP_SIZE = [100, 100]; +var NO_CHANGE = 0.0; + +var POINTER_REST_TIME = 1000; // milliseconds + +// Settings +const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier'; +const SCREEN_POSITION_KEY = 'screen-position'; +const MAG_FACTOR_KEY = 'mag-factor'; +const INVERT_LIGHTNESS_KEY = 'invert-lightness'; +const COLOR_SATURATION_KEY = 'color-saturation'; +const BRIGHT_RED_KEY = 'brightness-red'; +const BRIGHT_GREEN_KEY = 'brightness-green'; +const BRIGHT_BLUE_KEY = 'brightness-blue'; +const CONTRAST_RED_KEY = 'contrast-red'; +const CONTRAST_GREEN_KEY = 'contrast-green'; +const CONTRAST_BLUE_KEY = 'contrast-blue'; +const LENS_MODE_KEY = 'lens-mode'; +const CLAMP_MODE_KEY = 'scroll-at-edges'; +const MOUSE_TRACKING_KEY = 'mouse-tracking'; +const FOCUS_TRACKING_KEY = 'focus-tracking'; +const CARET_TRACKING_KEY = 'caret-tracking'; +const SHOW_CROSS_HAIRS_KEY = 'show-cross-hairs'; +const CROSS_HAIRS_THICKNESS_KEY = 'cross-hairs-thickness'; +const CROSS_HAIRS_COLOR_KEY = 'cross-hairs-color'; +const CROSS_HAIRS_OPACITY_KEY = 'cross-hairs-opacity'; +const CROSS_HAIRS_LENGTH_KEY = 'cross-hairs-length'; +const CROSS_HAIRS_CLIP_KEY = 'cross-hairs-clip'; + +let magDBusService = null; + +var MouseSpriteContent = GObject.registerClass({ + Implements: [ Clutter.Content ], +}, class MouseSpriteContent extends GObject.Object { + _init() { + super._init(); + this._texture = null; + } + + vfunc_get_preferred_size() { + if (!this._texture) + return [false, 0, 0]; + + return [true, this._texture.get_width(), this._texture.get_height()]; + } + + vfunc_paint_content(actor, node) { + if (!this._texture) + return; + + let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE); + let [minFilter, magFilter] = actor.get_content_scaling_filters(); + let textureNode = new Clutter.TextureNode(this._texture, + color, minFilter, magFilter); + textureNode.set_name('MouseSpriteContent'); + node.add_child(textureNode); + + textureNode.add_rectangle(actor.get_content_box()); + } + + get texture() { + return this._texture; + } + + set texture(coglTexture) { + if (this._texture == coglTexture) + return; + + let oldTexture = this._texture; + this._texture = coglTexture; + this.invalidate(); + + if (!oldTexture || !coglTexture || + oldTexture.get_width() != coglTexture.get_width() || + oldTexture.get_height() != coglTexture.get_height()) + this.invalidate_size(); + } +}); + +var Magnifier = class Magnifier { + constructor() { + // Magnifier is a manager of ZoomRegions. + this._zoomRegions = []; + + // Create small clutter tree for the magnified mouse. + let cursorTracker = Meta.CursorTracker.get_for_display(global.display); + this._cursorTracker = cursorTracker; + + this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE }); + this._mouseSprite.content = new MouseSpriteContent(); + + this._cursorRoot = new Clutter.Actor(); + this._cursorRoot.add_actor(this._mouseSprite); + + // Create the first ZoomRegion and initialize it according to the + // magnification settings. + + let mask; + [this.xMouse, this.yMouse, mask] = global.get_pointer(); + + let aZoomRegion = new ZoomRegion(this, this._cursorRoot); + this._zoomRegions.push(aZoomRegion); + this._settingsInit(aZoomRegion); + aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse); + + St.Settings.get().connect('notify::magnifier-active', () => { + this.setActive(St.Settings.get().magnifier_active); + }); + + // Export to dbus. + magDBusService = new MagnifierDBus.ShellMagnifier(); + this.setActive(St.Settings.get().magnifier_active); + } + + /** + * showSystemCursor: + * Show the system mouse pointer. + */ + showSystemCursor() { + this._cursorTracker.set_pointer_visible(true); + } + + /** + * hideSystemCursor: + * Hide the system mouse pointer. + */ + hideSystemCursor() { + this._cursorTracker.set_pointer_visible(false); + } + + /** + * setActive: + * Show/hide all the zoom regions. + * @activate: Boolean to activate or de-activate the magnifier. + */ + setActive(activate) { + let isActive = this.isActive(); + + this._zoomRegions.forEach ((zoomRegion, index, array) => { + zoomRegion.setActive(activate); + }); + + if (isActive != activate) { + if (activate) { + this._updateMouseSprite(); + this._cursorSpriteChangedId = + this._cursorTracker.connect('cursor-changed', + this._updateMouseSprite.bind(this)); + Meta.disable_unredirect_for_display(global.display); + this.startTrackingMouse(); + } else { + this._cursorTracker.disconnect(this._cursorSpriteChangedId); + this._mouseSprite.content.texture = null; + Meta.enable_unredirect_for_display(global.display); + this.stopTrackingMouse(); + } + } + + // Make sure system mouse pointer is shown when all zoom regions are + // invisible. + if (!activate) + this._cursorTracker.set_pointer_visible(true); + + // Notify interested parties of this change + this.emit('active-changed', activate); + } + + /** + * isActive: + * @return Whether the magnifier is active (boolean). + */ + isActive() { + // Sufficient to check one ZoomRegion since Magnifier's active + // state applies to all of them. + if (this._zoomRegions.length == 0) + return false; + else + return this._zoomRegions[0].isActive(); + } + + /** + * startTrackingMouse: + * Turn on mouse tracking, if not already doing so. + */ + startTrackingMouse() { + if (!this._pointerWatch) { + let interval = 1000 / Clutter.get_default_frame_rate(); + this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, this.scrollToMousePos.bind(this)); + } + } + + /** + * stopTrackingMouse: + * Turn off mouse tracking, if not already doing so. + */ + stopTrackingMouse() { + if (this._pointerWatch) + this._pointerWatch.remove(); + + this._pointerWatch = null; + } + + /** + * isTrackingMouse: + * Is the magnifier tracking the mouse currently? + */ + isTrackingMouse() { + return !!this._mouseTrackingId; + } + + /** + * scrollToMousePos: + * Position all zoom regions' ROI relative to the current location of the + * system pointer. + * @return true. + */ + scrollToMousePos() { + let [xMouse, yMouse, mask] = global.get_pointer(); + + if (xMouse != this.xMouse || yMouse != this.yMouse) { + this.xMouse = xMouse; + this.yMouse = yMouse; + + let sysMouseOverAny = false; + this._zoomRegions.forEach((zoomRegion, index, array) => { + if (zoomRegion.scrollToMousePos()) + sysMouseOverAny = true; + }); + if (sysMouseOverAny) + this.hideSystemCursor(); + else + this.showSystemCursor(); + } + return true; + } + + /** + * createZoomRegion: + * Create a ZoomRegion instance with the given properties. + * @xMagFactor: The power to set horizontal magnification of the + * ZoomRegion. A value of 1.0 means no magnification. A + * value of 2.0 doubles the size. + * @yMagFactor: The power to set the vertical magnification of the + * ZoomRegion. + * @roi Object in the form { x, y, width, height } that + * defines the region to magnify. Given in unmagnified + * coordinates. + * @viewPort Object in the form { x, y, width, height } that defines + * the position of the ZoomRegion on screen. + * @return The newly created ZoomRegion. + */ + createZoomRegion(xMagFactor, yMagFactor, roi, viewPort) { + let zoomRegion = new ZoomRegion(this, this._cursorRoot); + zoomRegion.setViewPort(viewPort); + + // We ignore the redundant width/height on the ROI + let fixedROI = new Object(roi); + fixedROI.width = viewPort.width / xMagFactor; + fixedROI.height = viewPort.height / yMagFactor; + zoomRegion.setROI(fixedROI); + + zoomRegion.addCrosshairs(this._crossHairs); + return zoomRegion; + } + + /** + * addZoomRegion: + * Append the given ZoomRegion to the list of currently defined ZoomRegions + * for this Magnifier instance. + * @zoomRegion: The zoomRegion to add. + */ + addZoomRegion(zoomRegion) { + if(zoomRegion) { + this._zoomRegions.push(zoomRegion); + if (!this.isTrackingMouse()) + this.startTrackingMouse(); + } + } + + /** + * getZoomRegions: + * Return a list of ZoomRegion's for this Magnifier. + * @return: The Magnifier's zoom region list (array). + */ + getZoomRegions() { + return this._zoomRegions; + } + + /** + * clearAllZoomRegions: + * Remove all the zoom regions from this Magnfier's ZoomRegion list. + */ + clearAllZoomRegions() { + for (let i = 0; i < this._zoomRegions.length; i++) + this._zoomRegions[i].setActive(false); + + this._zoomRegions.length = 0; + this.stopTrackingMouse(); + this.showSystemCursor(); + } + + /** + * addCrosshairs: + * Add and show a cross hair centered on the magnified mouse. + */ + addCrosshairs() { + if (!this._crossHairs) + this._crossHairs = new Crosshairs(); + + let thickness = this._settings.get_int(CROSS_HAIRS_THICKNESS_KEY); + let color = this._settings.get_string(CROSS_HAIRS_COLOR_KEY); + let opacity = this._settings.get_double(CROSS_HAIRS_OPACITY_KEY); + let length = this._settings.get_int(CROSS_HAIRS_LENGTH_KEY); + let clip = this._settings.get_boolean(CROSS_HAIRS_CLIP_KEY); + + this.setCrosshairsThickness(thickness); + this.setCrosshairsColor(color); + this.setCrosshairsOpacity(opacity); + this.setCrosshairsLength(length); + this.setCrosshairsClip(clip); + + let theCrossHairs = this._crossHairs; + this._zoomRegions.forEach ((zoomRegion, index, array) => { + zoomRegion.addCrosshairs(theCrossHairs); + }); + } + + /** + * setCrosshairsVisible: + * Show or hide the cross hair. + * @visible Flag that indicates show (true) or hide (false). + */ + setCrosshairsVisible(visible) { + if (visible) { + if (!this._crossHairs) + this.addCrosshairs(); + this._crossHairs.show(); + } + else { + if (this._crossHairs) + this._crossHairs.hide(); + } + } + + /** + * setCrosshairsColor: + * Set the color of the crosshairs for all ZoomRegions. + * @color: The color as a string, e.g. '#ff0000ff' or 'red'. + */ + setCrosshairsColor(color) { + if (this._crossHairs) { + let [res, clutterColor] = Clutter.Color.from_string(color); + this._crossHairs.setColor(clutterColor); + } + } + + /** + * getCrosshairsColor: + * Get the color of the crosshairs. + * @return: The color as a string, e.g. '#0000ffff' or 'blue'. + */ + getCrosshairsColor() { + if (this._crossHairs) { + let clutterColor = this._crossHairs.getColor(); + return clutterColor.to_string(); + } + else + return '#00000000'; + } + + /** + * setCrosshairsThickness: + * Set the crosshairs thickness for all ZoomRegions. + * @thickness: The width of the vertical and horizontal lines of the + * crosshairs. + */ + setCrosshairsThickness(thickness) { + if (this._crossHairs) + this._crossHairs.setThickness(thickness); + } + + /** + * getCrosshairsThickness: + * Get the crosshairs thickness. + * @return: The width of the vertical and horizontal lines of the + * crosshairs. + */ + getCrosshairsThickness() { + if (this._crossHairs) + return this._crossHairs.getThickness(); + else + return 0; + } + + /** + * setCrosshairsOpacity: + * @opacity: Value between 0.0 (transparent) and 1.0 (fully opaque). + */ + setCrosshairsOpacity(opacity) { + if (this._crossHairs) + this._crossHairs.setOpacity(opacity * 255); + } + + /** + * getCrosshairsOpacity: + * @return: Value between 0.0 (transparent) and 1.0 (fully opaque). + */ + getCrosshairsOpacity() { + if (this._crossHairs) + return this._crossHairs.getOpacity() / 255.0; + else + return 0.0; + } + + /** + * setCrosshairsLength: + * Set the crosshairs length for all ZoomRegions. + * @length: The length of the vertical and horizontal lines making up the + * crosshairs. + */ + setCrosshairsLength(length) { + if (this._crossHairs) + this._crossHairs.setLength(length); + } + + /** + * getCrosshairsLength: + * Get the crosshairs length. + * @return: The length of the vertical and horizontal lines making up the + * crosshairs. + */ + getCrosshairsLength() { + if (this._crossHairs) + return this._crossHairs.getLength(); + else + return 0; + } + + /** + * setCrosshairsClip: + * Set whether the crosshairs are clipped at their intersection. + * @clip: Flag to indicate whether to clip the crosshairs. + */ + setCrosshairsClip(clip) { + if (clip) { + if (this._crossHairs) + this._crossHairs.setClip(CROSSHAIRS_CLIP_SIZE); + } + else { + // Setting no clipping on crosshairs means a zero sized clip + // rectangle. + if (this._crossHairs) + this._crossHairs.setClip([0, 0]); + } + } + + /** + * getCrosshairsClip: + * Get whether the crosshairs are clipped by the mouse image. + * @return: Whether the crosshairs are clipped. + */ + getCrosshairsClip() { + if (this._crossHairs) { + let [clipWidth, clipHeight] = this._crossHairs.getClip(); + return (clipWidth > 0 && clipHeight > 0); + } + else + return false; + } + + //// Private methods //// + + _updateMouseSprite() { + this._updateSpriteTexture(); + let [xHot, yHot] = this._cursorTracker.get_hot(); + this._mouseSprite.set_anchor_point(xHot, yHot); + } + + _updateSpriteTexture() { + let sprite = this._cursorTracker.get_sprite(); + + if (sprite) { + this._mouseSprite.content.texture = sprite; + this._mouseSprite.show(); + } else { + this._mouseSprite.hide(); + } + } + + _settingsInit(zoomRegion) { + this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA }); + + this._settings.connect('changed::' + SCREEN_POSITION_KEY, + this._updateScreenPosition.bind(this)); + this._settings.connect('changed::' + MAG_FACTOR_KEY, + this._updateMagFactor.bind(this)); + this._settings.connect('changed::' + LENS_MODE_KEY, + this._updateLensMode.bind(this)); + this._settings.connect('changed::' + CLAMP_MODE_KEY, + this._updateClampMode.bind(this)); + this._settings.connect('changed::' + MOUSE_TRACKING_KEY, + this._updateMouseTrackingMode.bind(this)); + this._settings.connect('changed::' + FOCUS_TRACKING_KEY, + this._updateFocusTrackingMode.bind(this)); + this._settings.connect('changed::' + CARET_TRACKING_KEY, + this._updateCaretTrackingMode.bind(this)); + + this._settings.connect('changed::' + INVERT_LIGHTNESS_KEY, + this._updateInvertLightness.bind(this)); + this._settings.connect('changed::' + COLOR_SATURATION_KEY, + this._updateColorSaturation.bind(this)); + + this._settings.connect('changed::' + BRIGHT_RED_KEY, + this._updateBrightness.bind(this)); + this._settings.connect('changed::' + BRIGHT_GREEN_KEY, + this._updateBrightness.bind(this)); + this._settings.connect('changed::' + BRIGHT_BLUE_KEY, + this._updateBrightness.bind(this)); + + this._settings.connect('changed::' + CONTRAST_RED_KEY, + this._updateContrast.bind(this)); + this._settings.connect('changed::' + CONTRAST_GREEN_KEY, + this._updateContrast.bind(this)); + this._settings.connect('changed::' + CONTRAST_BLUE_KEY, + this._updateContrast.bind(this)); + + this._settings.connect('changed::' + SHOW_CROSS_HAIRS_KEY, () => { + this.setCrosshairsVisible(this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY)); + }); + + this._settings.connect('changed::' + CROSS_HAIRS_THICKNESS_KEY, () => { + this.setCrosshairsThickness(this._settings.get_int(CROSS_HAIRS_THICKNESS_KEY)); + }); + + this._settings.connect('changed::' + CROSS_HAIRS_COLOR_KEY, () => { + this.setCrosshairsColor(this._settings.get_string(CROSS_HAIRS_COLOR_KEY)); + }); + + this._settings.connect('changed::' + CROSS_HAIRS_OPACITY_KEY, () => { + this.setCrosshairsOpacity(this._settings.get_double(CROSS_HAIRS_OPACITY_KEY)); + }); + + this._settings.connect('changed::' + CROSS_HAIRS_LENGTH_KEY, () => { + this.setCrosshairsLength(this._settings.get_int(CROSS_HAIRS_LENGTH_KEY)); + }); + + this._settings.connect('changed::' + CROSS_HAIRS_CLIP_KEY, () => { + this.setCrosshairsClip(this._settings.get_boolean(CROSS_HAIRS_CLIP_KEY)); + }); + + if (zoomRegion) { + // Mag factor is accurate to two decimal places. + let aPref = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2)); + if (aPref != 0.0) + zoomRegion.setMagFactor(aPref, aPref); + + aPref = this._settings.get_enum(SCREEN_POSITION_KEY); + if (aPref) + zoomRegion.setScreenPosition(aPref); + + zoomRegion.setLensMode(this._settings.get_boolean(LENS_MODE_KEY)); + zoomRegion.setClampScrollingAtEdges(!this._settings.get_boolean(CLAMP_MODE_KEY)); + + aPref = this._settings.get_enum(MOUSE_TRACKING_KEY); + if (aPref) + zoomRegion.setMouseTrackingMode(aPref); + + aPref = this._settings.get_enum(FOCUS_TRACKING_KEY); + if (aPref) + zoomRegion.setFocusTrackingMode(aPref); + + aPref = this._settings.get_enum(CARET_TRACKING_KEY); + if (aPref) + zoomRegion.setCaretTrackingMode(aPref); + + aPref = this._settings.get_boolean(INVERT_LIGHTNESS_KEY); + if (aPref) + zoomRegion.setInvertLightness(aPref); + + aPref = this._settings.get_double(COLOR_SATURATION_KEY); + if (aPref) + zoomRegion.setColorSaturation(aPref); + + let bc = {}; + bc.r = this._settings.get_double(BRIGHT_RED_KEY); + bc.g = this._settings.get_double(BRIGHT_GREEN_KEY); + bc.b = this._settings.get_double(BRIGHT_BLUE_KEY); + zoomRegion.setBrightness(bc); + + bc.r = this._settings.get_double(CONTRAST_RED_KEY); + bc.g = this._settings.get_double(CONTRAST_GREEN_KEY); + bc.b = this._settings.get_double(CONTRAST_BLUE_KEY); + zoomRegion.setContrast(bc); + } + + let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY); + this.addCrosshairs(); + this.setCrosshairsVisible(showCrosshairs); + } + + _updateScreenPosition() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + let position = this._settings.get_enum(SCREEN_POSITION_KEY); + this._zoomRegions[0].setScreenPosition(position); + if (position != GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN) + this._updateLensMode(); + } + } + + _updateMagFactor() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + // Mag factor is accurate to two decimal places. + let magFactor = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2)); + this._zoomRegions[0].setMagFactor(magFactor, magFactor); + } + } + + _updateLensMode() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + this._zoomRegions[0].setLensMode(this._settings.get_boolean(LENS_MODE_KEY)); + } + } + + _updateClampMode() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + this._zoomRegions[0].setClampScrollingAtEdges( + !this._settings.get_boolean(CLAMP_MODE_KEY) + ); + } + } + + _updateMouseTrackingMode() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + this._zoomRegions[0].setMouseTrackingMode( + this._settings.get_enum(MOUSE_TRACKING_KEY) + ); + } + } + + _updateFocusTrackingMode() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + this._zoomRegions[0].setFocusTrackingMode( + this._settings.get_enum(FOCUS_TRACKING_KEY) + ); + } + } + + _updateCaretTrackingMode() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + this._zoomRegions[0].setCaretTrackingMode( + this._settings.get_enum(CARET_TRACKING_KEY) + ); + } + } + + _updateInvertLightness() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + this._zoomRegions[0].setInvertLightness( + this._settings.get_boolean(INVERT_LIGHTNESS_KEY) + ); + } + } + + _updateColorSaturation() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + this._zoomRegions[0].setColorSaturation( + this._settings.get_double(COLOR_SATURATION_KEY) + ); + } + } + + _updateBrightness() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + let brightness = {}; + brightness.r = this._settings.get_double(BRIGHT_RED_KEY); + brightness.g = this._settings.get_double(BRIGHT_GREEN_KEY); + brightness.b = this._settings.get_double(BRIGHT_BLUE_KEY); + this._zoomRegions[0].setBrightness(brightness); + } + } + + _updateContrast() { + // Applies only to the first zoom region. + if (this._zoomRegions.length) { + let contrast = {}; + contrast.r = this._settings.get_double(CONTRAST_RED_KEY); + contrast.g = this._settings.get_double(CONTRAST_GREEN_KEY); + contrast.b = this._settings.get_double(CONTRAST_BLUE_KEY); + this._zoomRegions[0].setContrast(contrast); + } + } +}; +Signals.addSignalMethods(Magnifier.prototype); + +var ZoomRegion = class ZoomRegion { + constructor(magnifier, mouseSourceActor) { + this._magnifier = magnifier; + this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker(); + + this._mouseTrackingMode = GDesktopEnums.MagnifierMouseTrackingMode.NONE; + this._focusTrackingMode = GDesktopEnums.MagnifierFocusTrackingMode.NONE; + this._caretTrackingMode = GDesktopEnums.MagnifierCaretTrackingMode.NONE; + this._clampScrollingAtEdges = false; + this._lensMode = false; + this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN; + this._invertLightness = false; + this._colorSaturation = 1.0; + this._brightness = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE }; + this._contrast = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE }; + + this._magView = null; + this._background = null; + this._uiGroupClone = null; + this._mouseSourceActor = mouseSourceActor; + this._mouseActor = null; + this._crossHairs = null; + this._crossHairsActor = null; + + this._viewPortX = 0; + this._viewPortY = 0; + this._viewPortWidth = global.screen_width; + this._viewPortHeight = global.screen_height; + this._xCenter = this._viewPortWidth / 2; + this._yCenter = this._viewPortHeight / 2; + this._xMagFactor = 1; + this._yMagFactor = 1; + this._followingCursor = false; + this._xFocus = 0; + this._yFocus = 0; + this._xCaret = 0; + this._yCaret = 0; + + this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID); + this._scrollContentsTimerId = 0; + } + + _connectSignals() { + if (this._signalConnections) + return; + + this._signalConnections = []; + let id = Main.layoutManager.connect('monitors-changed', + this._monitorsChanged.bind(this)); + this._signalConnections.push([Main.layoutManager, id]); + + id = this._focusCaretTracker.connect('caret-moved', this._updateCaret.bind(this)); + this._signalConnections.push([this._focusCaretTracker, id]); + + id = this._focusCaretTracker.connect('focus-changed', this._updateFocus.bind(this)); + this._signalConnections.push([this._focusCaretTracker, id]); + } + + _disconnectSignals() { + for (let [obj, id] of this._signalConnections) + obj.disconnect(id); + + delete this._signalConnections; + } + + _updateScreenPosition() { + if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE) + this._setViewPort({ + x: this._viewPortX, + y: this._viewPortY, + width: this._viewPortWidth, + height: this._viewPortHeight + }); + else + this.setScreenPosition(this._screenPosition); + } + + _updateFocus(caller, event) { + let component = event.source.get_component_iface(); + if (!component || event.detail1 != 1) + return; + let extents; + try { + extents = component.get_extents(Atspi.CoordType.SCREEN); + } catch(e) { + log('Failed to read extents of focused component: ' + e.message); + return; + } + + [this._xFocus, this._yFocus] = [extents.x + (extents.width / 2), + extents.y + (extents.height / 2)]; + this._centerFromFocusPosition(); + } + + _updateCaret(caller, event) { + let text = event.source.get_text_iface(); + if (!text) + return; + let extents; + try { + extents = text.get_character_extents(text.get_caret_offset(), 0); + } catch(e) { + log('Failed to read extents of text caret: ' + e.message); + return; + } + + [this._xCaret, this._yCaret] = [extents.x, extents.y]; + this._centerFromCaretPosition(); + } + + /** + * setActive: + * @activate: Boolean to show/hide the ZoomRegion. + */ + setActive(activate) { + if (activate == this.isActive()) + return; + + if (activate) { + this._createActors(); + if (this._isMouseOverRegion()) + this._magnifier.hideSystemCursor(); + this._updateScreenPosition(); + this._updateMagViewGeometry(); + this._updateCloneGeometry(); + this._updateMousePosition(); + this._connectSignals(); + } else { + this._disconnectSignals(); + this._destroyActors(); + } + + this._syncCaretTracking(); + this._syncFocusTracking(); + } + + /** + * isActive: + * @return Whether this ZoomRegion is active (boolean). + */ + isActive() { + return this._magView != null; + } + + /** + * setMagFactor: + * @xMagFactor: The power to set the horizontal magnification factor to + * of the magnified view. A value of 1.0 means no + * magnification. A value of 2.0 doubles the size. + * @yMagFactor: The power to set the vertical magnification factor to + * of the magnified view. + */ + setMagFactor(xMagFactor, yMagFactor) { + this._changeROI({ xMagFactor: xMagFactor, + yMagFactor: yMagFactor, + redoCursorTracking: this._followingCursor }); + } + + /** + * getMagFactor: + * @return an array, [xMagFactor, yMagFactor], containing the horizontal + * and vertical magnification powers. A value of 1.0 means no + * magnification. A value of 2.0 means the contents are doubled + * in size, and so on. + */ + getMagFactor() { + return [this._xMagFactor, this._yMagFactor]; + } + + /** + * setMouseTrackingMode + * @mode: One of the enum MouseTrackingMode values. + */ + setMouseTrackingMode(mode) { + if (mode >= GDesktopEnums.MagnifierMouseTrackingMode.NONE && + mode <= GDesktopEnums.MagnifierMouseTrackingMode.PUSH) + this._mouseTrackingMode = mode; + } + + /** + * getMouseTrackingMode + * @return: One of the enum MouseTrackingMode values. + */ + getMouseTrackingMode() { + return this._mouseTrackingMode; + } + + /** + * setFocusTrackingMode + * @mode: One of the enum FocusTrackingMode values. + */ + setFocusTrackingMode(mode) { + this._focusTrackingMode = mode; + this._syncFocusTracking(); + } + + /** + * setCaretTrackingMode + * @mode: One of the enum CaretTrackingMode values. + */ + setCaretTrackingMode(mode) { + this._caretTrackingMode = mode; + this._syncCaretTracking(); + } + + _syncFocusTracking() { + let enabled = this._focusTrackingMode != GDesktopEnums.MagnifierFocusTrackingMode.NONE && + this.isActive(); + + if (enabled) + this._focusCaretTracker.registerFocusListener(); + else + this._focusCaretTracker.deregisterFocusListener(); + } + + _syncCaretTracking() { + let enabled = this._caretTrackingMode != GDesktopEnums.MagnifierCaretTrackingMode.NONE && + this.isActive(); + + if (enabled) + this._focusCaretTracker.registerCaretListener(); + else + this._focusCaretTracker.deregisterCaretListener(); + } + + /** + * setViewPort + * Sets the position and size of the ZoomRegion on screen. + * @viewPort: Object defining the position and size of the view port. + * It has members x, y, width, height. The values are in + * stage coordinate space. + */ + setViewPort(viewPort) { + this._setViewPort(viewPort); + this._screenPosition = GDesktopEnums.MagnifierScreenPosition.NONE; + } + + /** + * setROI + * Sets the "region of interest" that the ZoomRegion is magnifying. + * @roi: Object that defines the region of the screen to magnify. It + * has members x, y, width, height. The values are in + * screen (unmagnified) coordinate space. + */ + setROI(roi) { + if (roi.width <= 0 || roi.height <= 0) + return; + + this._followingCursor = false; + this._changeROI({ xMagFactor: this._viewPortWidth / roi.width, + yMagFactor: this._viewPortHeight / roi.height, + xCenter: roi.x + roi.width / 2, + yCenter: roi.y + roi.height / 2 }); + } + + /** + * getROI: + * Retrieves the "region of interest" -- the rectangular bounds of that part + * of the desktop that the magnified view is showing (x, y, width, height). + * The bounds are given in non-magnified coordinates. + * @return an array, [x, y, width, height], representing the bounding + * rectangle of what is shown in the magnified view. + */ + getROI() { + let roiWidth = this._viewPortWidth / this._xMagFactor; + let roiHeight = this._viewPortHeight / this._yMagFactor; + + return [this._xCenter - roiWidth / 2, + this._yCenter - roiHeight / 2, + roiWidth, roiHeight]; + } + + /** + * setLensMode: + * Turn lens mode on/off. In full screen mode, lens mode does nothing since + * a lens the size of the screen is pointless. + * @lensMode: A boolean to set the sense of lens mode. + */ + setLensMode(lensMode) { + this._lensMode = lensMode; + if (!this._lensMode) + this.setScreenPosition (this._screenPosition); + } + + /** + * isLensMode: + * Is lens mode on or off? + * @return The lens mode state as a boolean. + */ + isLensMode() { + return this._lensMode; + } + + /** + * setClampScrollingAtEdges: + * Stop vs. allow scrolling of the magnified contents when it scroll beyond + * the edges of the screen. + * @clamp: Boolean to turn on/off clamping. + */ + setClampScrollingAtEdges(clamp) { + this._clampScrollingAtEdges = clamp; + if (clamp) + this._changeROI(); + } + + /** + * setTopHalf: + * Magnifier view occupies the top half of the screen. + */ + setTopHalf() { + let viewPort = {}; + viewPort.x = 0; + viewPort.y = 0; + viewPort.width = global.screen_width; + viewPort.height = global.screen_height/2; + this._setViewPort(viewPort); + this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF; + } + + /** + * setBottomHalf: + * Magnifier view occupies the bottom half of the screen. + */ + setBottomHalf() { + let viewPort = {}; + viewPort.x = 0; + viewPort.y = global.screen_height/2; + viewPort.width = global.screen_width; + viewPort.height = global.screen_height/2; + this._setViewPort(viewPort); + this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF; + } + + /** + * setLeftHalf: + * Magnifier view occupies the left half of the screen. + */ + setLeftHalf() { + let viewPort = {}; + viewPort.x = 0; + viewPort.y = 0; + viewPort.width = global.screen_width/2; + viewPort.height = global.screen_height; + this._setViewPort(viewPort); + this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF; + } + + /** + * setRightHalf: + * Magnifier view occupies the right half of the screen. + */ + setRightHalf() { + let viewPort = {}; + viewPort.x = global.screen_width/2; + viewPort.y = 0; + viewPort.width = global.screen_width/2; + viewPort.height = global.screen_height; + this._setViewPort(viewPort); + this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF; + } + + /** + * setFullScreenMode: + * Set the ZoomRegion to full-screen mode. + * Note: disallows lens mode. + */ + setFullScreenMode() { + let viewPort = {}; + viewPort.x = 0; + viewPort.y = 0; + viewPort.width = global.screen_width; + viewPort.height = global.screen_height; + this.setViewPort(viewPort); + + this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN; + } + + /** + * setScreenPosition: + * Positions the zoom region to one of the enumerated positions on the + * screen. + * @position: one of Magnifier.FULL_SCREEN, Magnifier.TOP_HALF, + * Magnifier.BOTTOM_HALF,Magnifier.LEFT_HALF, or + * Magnifier.RIGHT_HALF. + */ + setScreenPosition(inPosition) { + switch (inPosition) { + case GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN: + this.setFullScreenMode(); + break; + case GDesktopEnums.MagnifierScreenPosition.TOP_HALF: + this.setTopHalf(); + break; + case GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF: + this.setBottomHalf(); + break; + case GDesktopEnums.MagnifierScreenPosition.LEFT_HALF: + this.setLeftHalf(); + break; + case GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF: + this.setRightHalf(); + break; + } + } + + /** + * getScreenPosition: + * Tell the outside world what the current mode is -- magnifiying the + * top half, bottom half, etc. + * @return: the current mode. + */ + getScreenPosition() { + return this._screenPosition; + } + + /** + * scrollToMousePos: + * Set the region of interest based on the position of the system pointer. + * @return: Whether the system mouse pointer is over the magnified view. + */ + scrollToMousePos() { + this._followingCursor = true; + if (this._mouseTrackingMode != GDesktopEnums.MagnifierMouseTrackingMode.NONE) + this._changeROI({ redoCursorTracking: true }); + else + this._updateMousePosition(); + + // Determine whether the system mouse pointer is over this zoom region. + return this._isMouseOverRegion(); + } + + _clearScrollContentsTimer() { + if (this._scrollContentsTimerId != 0) { + Mainloop.source_remove(this._scrollContentsTimerId); + this._scrollContentsTimerId = 0; + } + } + + _scrollContentsToDelayed(x, y) { + if (this._pointerIdleMonitor.get_idletime() >= POINTER_REST_TIME) { + this.scrollContentsTo(x, y); + return; + } + + this._clearScrollContentsTimer(); + this._scrollContentsTimerId = Mainloop.timeout_add(POINTER_REST_TIME, () => { + this._scrollContentsToDelayed(x, y); + return GLib.SOURCE_REMOVE; + }); + } + + /** + * scrollContentsTo: + * Shift the contents of the magnified view such it is centered on the given + * coordinate. + * @x: The x-coord of the point to center on. + * @y: The y-coord of the point to center on. + */ + scrollContentsTo(x, y) { + this._clearScrollContentsTimer(); + + this._followingCursor = false; + this._changeROI({ xCenter: x, + yCenter: y }); + } + + /** + * addCrosshairs: + * Add crosshairs centered on the magnified mouse. + * @crossHairs: Crosshairs instance + */ + addCrosshairs(crossHairs) { + this._crossHairs = crossHairs; + + // If the crossHairs is not already within a larger container, add it + // to this zoom region. Otherwise, add a clone. + if (crossHairs && this.isActive()) { + this._crossHairsActor = crossHairs.addToZoomRegion(this, this._mouseActor); + } + } + + /** + * setInvertLightness: + * Set whether to invert the lightness of the magnified view. + * @flag Boolean to either invert brightness (true), or not (false). + */ + setInvertLightness(flag) { + this._invertLightness = flag; + if (this._magShaderEffects) + this._magShaderEffects.setInvertLightness(this._invertLightness); + } + + /** + * getInvertLightness: + * Retrieve whether the lightness is inverted. + * @return Boolean indicating inversion (true), or not (false). + */ + getInvertLightness() { + return this._invertLightness; + } + + /** + * setColorSaturation: + * Set the color saturation of the magnified view. + * @sauration A value from 0.0 to 1.0 that defines the color + * saturation, with 0.0 defining no color (grayscale), + * and 1.0 defining full color. + */ + setColorSaturation(saturation) { + this._colorSaturation = saturation; + if (this._magShaderEffects) + this._magShaderEffects.setColorSaturation(this._colorSaturation); + } + + /** + * getColorSaturation: + * Retrieve the color saturation of the magnified view. + */ + getColorSaturation() { + return this._colorSaturation; + } + + /** + * setBrightness: + * Alter the brightness of the magnified view. + * @brightness Object containing the contrast for the red, green, + * and blue channels. Values of 0.0 represent "standard" + * brightness (no change), whereas values less or greater than + * 0.0 indicate decreased or incresaed brightness, respectively. + */ + setBrightness(brightness) { + this._brightness.r = brightness.r; + this._brightness.g = brightness.g; + this._brightness.b = brightness.b; + if (this._magShaderEffects) + this._magShaderEffects.setBrightness(this._brightness); + } + + /** + * setContrast: + * Alter the contrast of the magnified view. + * @contrast Object containing the contrast for the red, green, + * and blue channels. Values of 0.0 represent "standard" + * contrast (no change), whereas values less or greater than + * 0.0 indicate decreased or incresaed contrast, respectively. + */ + setContrast(contrast) { + this._contrast.r = contrast.r; + this._contrast.g = contrast.g; + this._contrast.b = contrast.b; + if (this._magShaderEffects) + this._magShaderEffects.setContrast(this._contrast); + } + + /** + * getContrast: + * Retreive the contrast of the magnified view. + * @return Object containing the contrast for the red, green, + * and blue channels. + */ + getContrast() { + let contrast = {}; + contrast.r = this._contrast.r; + contrast.g = this._contrast.g; + contrast.b = this._contrast.b; + return contrast; + } + + //// Private methods //// + + _createActors() { + // The root actor for the zoom region + this._magView = new St.Bin({ style_class: 'magnifier-zoom-region', x_fill: true, y_fill: true }); + global.stage.add_actor(this._magView); + + // hide the magnified region from CLUTTER_PICK_ALL + Shell.util_set_hidden_from_pick (this._magView, true); + + // Add a group to clip the contents of the magnified view. + let mainGroup = new Clutter.Actor({ clip_to_allocation: true }); + this._magView.set_child(mainGroup); + + // Add a background for when the magnified uiGroup is scrolled + // out of view (don't want to see desktop showing through). + this._background = (new Background.SystemBackground()).actor; + mainGroup.add_actor(this._background); + + // Clone the group that contains all of UI on the screen. This is the + // chrome, the windows, etc. + this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup, + clip_to_allocation: true }); + mainGroup.add_actor(this._uiGroupClone); + + // Add either the given mouseSourceActor to the ZoomRegion, or a clone of + // it. + if (this._mouseSourceActor.get_parent() != null) + this._mouseActor = new Clutter.Clone({ source: this._mouseSourceActor }); + else + this._mouseActor = this._mouseSourceActor; + mainGroup.add_actor(this._mouseActor); + + if (this._crossHairs) + this._crossHairsActor = this._crossHairs.addToZoomRegion(this, this._mouseActor); + else + this._crossHairsActor = null; + + // Contrast and brightness effects. + this._magShaderEffects = new MagShaderEffects(this._uiGroupClone); + this._magShaderEffects.setColorSaturation(this._colorSaturation); + this._magShaderEffects.setInvertLightness(this._invertLightness); + this._magShaderEffects.setBrightness(this._brightness); + this._magShaderEffects.setContrast(this._contrast); + } + + _destroyActors() { + if (this._mouseActor == this._mouseSourceActor) + this._mouseActor.get_parent().remove_actor (this._mouseActor); + if (this._crossHairs) + this._crossHairs.removeFromParent(this._crossHairsActor); + + this._magShaderEffects.destroyEffects(); + this._magShaderEffects = null; + this._magView.destroy(); + this._magView = null; + this._background = null; + this._uiGroupClone = null; + this._mouseActor = null; + this._crossHairsActor = null; + } + + _setViewPort(viewPort, fromROIUpdate) { + // Sets the position of the zoom region on the screen + + let width = Math.round(Math.min(viewPort.width, global.screen_width)); + let height = Math.round(Math.min(viewPort.height, global.screen_height)); + let x = Math.max(viewPort.x, 0); + let y = Math.max(viewPort.y, 0); + + x = Math.round(Math.min(x, global.screen_width - width)); + y = Math.round(Math.min(y, global.screen_height - height)); + + this._viewPortX = x; + this._viewPortY = y; + this._viewPortWidth = width; + this._viewPortHeight = height; + + this._updateMagViewGeometry(); + + if (!fromROIUpdate) + this._changeROI({ redoCursorTracking: this._followingCursor }); // will update mouse + + if (this.isActive() && this._isMouseOverRegion()) + this._magnifier.hideSystemCursor(); + } + + _changeROI(params) { + // Updates the area we are viewing; the magnification factors + // and center can be set explicitly, or we can recompute + // the position based on the mouse cursor position + + params = Params.parse(params, { xMagFactor: this._xMagFactor, + yMagFactor: this._yMagFactor, + xCenter: this._xCenter, + yCenter: this._yCenter, + redoCursorTracking: false }); + + if (params.xMagFactor <= 0) + params.xMagFactor = this._xMagFactor; + if (params.yMagFactor <= 0) + params.yMagFactor = this._yMagFactor; + + this._xMagFactor = params.xMagFactor; + this._yMagFactor = params.yMagFactor; + + if (params.redoCursorTracking && + this._mouseTrackingMode != GDesktopEnums.MagnifierMouseTrackingMode.NONE) { + // This depends on this.xMagFactor/yMagFactor already being updated + [params.xCenter, params.yCenter] = this._centerFromMousePosition(); + } + + if (this._clampScrollingAtEdges) { + let roiWidth = this._viewPortWidth / this._xMagFactor; + let roiHeight = this._viewPortHeight / this._yMagFactor; + + params.xCenter = Math.min(params.xCenter, global.screen_width - roiWidth / 2); + params.xCenter = Math.max(params.xCenter, roiWidth / 2); + params.yCenter = Math.min(params.yCenter, global.screen_height - roiHeight / 2); + params.yCenter = Math.max(params.yCenter, roiHeight / 2); + } + + this._xCenter = params.xCenter; + this._yCenter = params.yCenter; + + // If in lens mode, move the magnified view such that it is centered + // over the actual mouse. However, in full screen mode, the "lens" is + // the size of the screen -- pointless to move such a large lens around. + if (this._lensMode && !this._isFullScreen()) + this._setViewPort({ x: this._xCenter - this._viewPortWidth / 2, + y: this._yCenter - this._viewPortHeight / 2, + width: this._viewPortWidth, + height: this._viewPortHeight }, true); + + this._updateCloneGeometry(); + this._updateMousePosition(); + } + + _isMouseOverRegion() { + // Return whether the system mouse sprite is over this ZoomRegion. If the + // mouse's position is not given, then it is fetched. + let mouseIsOver = false; + if (this.isActive()) { + let xMouse = this._magnifier.xMouse; + let yMouse = this._magnifier.yMouse; + + mouseIsOver = ( + xMouse >= this._viewPortX && xMouse < (this._viewPortX + this._viewPortWidth) && + yMouse >= this._viewPortY && yMouse < (this._viewPortY + this._viewPortHeight) + ); + } + return mouseIsOver; + } + + _isFullScreen() { + // Does the magnified view occupy the whole screen? Note that this + // doesn't necessarily imply + // this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN; + + if (this._viewPortX != 0 || this._viewPortY != 0) + return false; + if (this._viewPortWidth != global.screen_width || + this._viewPortHeight != global.screen_height) + return false; + return true; + } + + _centerFromMousePosition() { + // Determines where the center should be given the current cursor + // position and mouse tracking mode + + let xMouse = this._magnifier.xMouse; + let yMouse = this._magnifier.yMouse; + + if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PROPORTIONAL) { + return this._centerFromPointProportional(xMouse, yMouse); + } + else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PUSH) { + return this._centerFromPointPush(xMouse, yMouse); + } + else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.CENTERED) { + return this._centerFromPointCentered(xMouse, yMouse); + } + + return null; // Should never be hit + } + + _centerFromCaretPosition() { + let xCaret = this._xCaret; + let yCaret = this._yCaret; + + if (this._caretTrackingMode == GDesktopEnums.MagnifierCaretTrackingMode.PROPORTIONAL) + [xCaret, yCaret] = this._centerFromPointProportional(xCaret, yCaret); + else if (this._caretTrackingMode == GDesktopEnums.MagnifierCaretTrackingMode.PUSH) + [xCaret, yCaret] = this._centerFromPointPush(xCaret, yCaret); + else if (this._caretTrackingMode == GDesktopEnums.MagnifierCaretTrackingMode.CENTERED) + [xCaret, yCaret] = this._centerFromPointCentered(xCaret, yCaret); + + this._scrollContentsToDelayed(xCaret, yCaret); + } + + _centerFromFocusPosition() { + let xFocus = this._xFocus; + let yFocus = this._yFocus; + + if (this._focusTrackingMode == GDesktopEnums.MagnifierFocusTrackingMode.PROPORTIONAL) + [xFocus, yFocus] = this._centerFromPointProportional(xFocus, yFocus); + else if (this._focusTrackingMode == GDesktopEnums.MagnifierFocusTrackingMode.PUSH) + [xFocus, yFocus] = this._centerFromPointPush(xFocus, yFocus); + else if (this._focusTrackingMode == GDesktopEnums.MagnifierFocusTrackingMode.CENTERED) + [xFocus, yFocus] = this._centerFromPointCentered(xFocus, yFocus); + + this._scrollContentsToDelayed(xFocus, yFocus); + } + + _centerFromPointPush(xPoint, yPoint) { + let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI(); + let [cursorWidth, cursorHeight] = this._mouseSourceActor.get_size(); + let xPos = xRoi + widthRoi / 2; + let yPos = yRoi + heightRoi / 2; + let xRoiRight = xRoi + widthRoi - cursorWidth; + let yRoiBottom = yRoi + heightRoi - cursorHeight; + + if (xPoint < xRoi) + xPos -= (xRoi - xPoint); + else if (xPoint > xRoiRight) + xPos += (xPoint - xRoiRight); + + if (yPoint < yRoi) + yPos -= (yRoi - yPoint); + else if (yPoint > yRoiBottom) + yPos += (yPoint - yRoiBottom); + + return [xPos, yPos]; + } + + _centerFromPointProportional(xPoint, yPoint) { + let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI(); + let halfScreenWidth = global.screen_width / 2; + let halfScreenHeight = global.screen_height / 2; + // We want to pad with a constant distance after zooming, so divide + // by the magnification factor. + let unscaledPadding = Math.min(this._viewPortWidth, this._viewPortHeight) / 5; + let xPadding = unscaledPadding / this._xMagFactor; + let yPadding = unscaledPadding / this._yMagFactor; + let xProportion = (xPoint - halfScreenWidth) / halfScreenWidth; // -1 ... 1 + let yProportion = (yPoint - halfScreenHeight) / halfScreenHeight; // -1 ... 1 + let xPos = xPoint - xProportion * (widthRoi / 2 - xPadding); + let yPos = yPoint - yProportion * (heightRoi /2 - yPadding); + + return [xPos, yPos]; + } + + _centerFromPointCentered(xPoint, yPoint) { + return [xPoint, yPoint]; + } + + _screenToViewPort(screenX, screenY) { + // Converts coordinates relative to the (unmagnified) screen to coordinates + // relative to the origin of this._magView + return [this._viewPortWidth / 2 + (screenX - this._xCenter) * this._xMagFactor, + this._viewPortHeight / 2 + (screenY - this._yCenter) * this._yMagFactor]; + } + + _updateMagViewGeometry() { + if (!this.isActive()) + return; + + if (this._isFullScreen()) + this._magView.add_style_class_name('full-screen'); + else + this._magView.remove_style_class_name('full-screen'); + + this._magView.set_size(this._viewPortWidth, this._viewPortHeight); + this._magView.set_position(this._viewPortX, this._viewPortY); + } + + _updateCloneGeometry() { + if (!this.isActive()) + return; + + this._uiGroupClone.set_scale(this._xMagFactor, this._yMagFactor); + this._mouseActor.set_scale(this._xMagFactor, this._yMagFactor); + + let [x, y] = this._screenToViewPort(0, 0); + this._uiGroupClone.set_position(Math.round(x), Math.round(y)); + + this._updateMousePosition(); + } + + _updateMousePosition() { + if (!this.isActive()) + return; + + let [xMagMouse, yMagMouse] = this._screenToViewPort(this._magnifier.xMouse, + this._magnifier.yMouse); + + xMagMouse = Math.round(xMagMouse); + yMagMouse = Math.round(yMagMouse); + + this._mouseActor.set_position(xMagMouse, yMagMouse); + + if (this._crossHairsActor) { + let [groupWidth, groupHeight] = this._crossHairsActor.get_size(); + this._crossHairsActor.set_position(xMagMouse - groupWidth / 2, + yMagMouse - groupHeight / 2); + } + } + + _monitorsChanged() { + this._background.set_size(global.screen_width, global.screen_height); + this._updateScreenPosition(); + } +}; + +var Crosshairs = class Crosshairs { + constructor() { + + // Set the group containing the crosshairs to three times the desktop + // size in case the crosshairs need to appear to be infinite in + // length (i.e., extend beyond the edges of the view they appear in). + let groupWidth = global.screen_width * 3; + let groupHeight = global.screen_height * 3; + + this._actor = new Clutter.Actor({ + clip_to_allocation: false, + width: groupWidth, + height: groupHeight + }); + this._horizLeftHair = new Clutter.Actor(); + this._horizRightHair = new Clutter.Actor(); + this._vertTopHair = new Clutter.Actor(); + this._vertBottomHair = new Clutter.Actor(); + this._actor.add_actor(this._horizLeftHair); + this._actor.add_actor(this._horizRightHair); + this._actor.add_actor(this._vertTopHair); + this._actor.add_actor(this._vertBottomHair); + this._clipSize = [0, 0]; + this._clones = []; + this.reCenter(); + + Main.layoutManager.connect('monitors-changed', + this._monitorsChanged.bind(this)); + } + + _monitorsChanged() { + this._actor.set_size(global.screen_width * 3, global.screen_height * 3); + this.reCenter(); + } + + /** + * addToZoomRegion + * Either add the crosshairs actor to the given ZoomRegion, or, if it is + * already part of some other ZoomRegion, create a clone of the crosshairs + * actor, and add the clone instead. Returns either the original or the + * clone. + * @zoomRegion: The container to add the crosshairs group to. + * @magnifiedMouse: The mouse actor for the zoom region -- used to + * position the crosshairs and properly layer them below + * the mouse. + * @return The crosshairs actor, or its clone. + */ + addToZoomRegion(zoomRegion, magnifiedMouse) { + let crosshairsActor = null; + if (zoomRegion && magnifiedMouse) { + let container = magnifiedMouse.get_parent(); + if (container) { + crosshairsActor = this._actor; + if (this._actor.get_parent() != null) { + crosshairsActor = new Clutter.Clone({ source: this._actor }); + this._clones.push(crosshairsActor); + } + crosshairsActor.visible = this._actor.visible; + + container.add_actor(crosshairsActor); + container.raise_child(magnifiedMouse, crosshairsActor); + let [xMouse, yMouse] = magnifiedMouse.get_position(); + let [crosshairsWidth, crosshairsHeight] = crosshairsActor.get_size(); + crosshairsActor.set_position(xMouse - crosshairsWidth / 2 , yMouse - crosshairsHeight / 2); + } + } + return crosshairsActor; + } + + /** + * removeFromParent: + * @childActor: the actor returned from addToZoomRegion + * Remove the crosshairs actor from its parent container, or destroy the + * child actor if it was just a clone of the crosshairs actor. + */ + removeFromParent(childActor) { + if (childActor == this._actor) + childActor.get_parent().remove_actor(childActor); + else + childActor.destroy(); + } + + /** + * setColor: + * Set the color of the crosshairs. + * @clutterColor: The color as a Clutter.Color. + */ + setColor(clutterColor) { + this._horizLeftHair.background_color = clutterColor; + this._horizRightHair.background_color = clutterColor; + this._vertTopHair.background_color = clutterColor; + this._vertBottomHair.background_color = clutterColor; + } + + /** + * getColor: + * Get the color of the crosshairs. + * @color: The color as a Clutter.Color. + */ + getColor() { + return this._horizLeftHair.get_color(); + } + + /** + * setThickness: + * Set the width of the vertical and horizontal lines of the crosshairs. + * @thickness + */ + setThickness(thickness) { + this._horizLeftHair.set_height(thickness); + this._horizRightHair.set_height(thickness); + this._vertTopHair.set_width(thickness); + this._vertBottomHair.set_width(thickness); + this.reCenter(); + } + + /** + * getThickness: + * Get the width of the vertical and horizontal lines of the crosshairs. + * @return: The thickness of the crosshairs. + */ + getThickness() { + return this._horizLeftHair.get_height(); + } + + /** + * setOpacity: + * Set how opaque the crosshairs are. + * @opacity: Value between 0 (fully transparent) and 255 (full opaque). + */ + setOpacity(opacity) { + // set_opacity() throws an exception for values outside the range + // [0, 255]. + if (opacity < 0) + opacity = 0; + else if (opacity > 255) + opacity = 255; + + this._horizLeftHair.set_opacity(opacity); + this._horizRightHair.set_opacity(opacity); + this._vertTopHair.set_opacity(opacity); + this._vertBottomHair.set_opacity(opacity); + } + + /** + * setLength: + * Set the length of the vertical and horizontal lines in the crosshairs. + * @length: The length of the crosshairs. + */ + setLength(length) { + this._horizLeftHair.set_width(length); + this._horizRightHair.set_width(length); + this._vertTopHair.set_height(length); + this._vertBottomHair.set_height(length); + this.reCenter(); + } + + /** + * getLength: + * Get the length of the vertical and horizontal lines in the crosshairs. + * @return: The length of the crosshairs. + */ + getLength() { + return this._horizLeftHair.get_width(); + } + + /** + * setClip: + * Set the width and height of the rectangle that clips the crosshairs at + * their intersection + * @size: Array of [width, height] defining the size of the clip + * rectangle. + */ + setClip(size) { + if (size) { + // Take a chunk out of the crosshairs where it intersects the + // mouse. + this._clipSize = size; + this.reCenter(); + } + else { + // Restore the missing chunk. + this._clipSize = [0, 0]; + this.reCenter(); + } + } + + /** + * show: + * Show the crosshairs. + */ + show() { + this._actor.show(); + // Clones don't share visibility. + for (let i = 0; i < this._clones.length; i++) + this._clones[i].show(); + } + + /** + * hide: + * Hide the crosshairs. + */ + hide() { + this._actor.hide(); + // Clones don't share visibility. + for (let i = 0; i < this._clones.length; i++) + this._clones[i].hide(); + } + + /** + * reCenter: + * Reposition the horizontal and vertical hairs such that they cross at + * the center of crosshairs group. If called with the dimensions of + * the clip rectangle, these are used to update the size of the clip. + * @clipSize: Optional. If present, an array of the form [width, height]. + */ + reCenter(clipSize) { + let [groupWidth, groupHeight] = this._actor.get_size(); + let leftLength = this._horizLeftHair.get_width(); + let rightLength = this._horizRightHair.get_width(); + let topLength = this._vertTopHair.get_height(); + let bottomLength = this._vertBottomHair.get_height(); + let thickness = this._horizLeftHair.get_height(); + + // Deal with clip rectangle. + if (clipSize) + this._clipSize = clipSize; + let clipWidth = this._clipSize[0]; + let clipHeight = this._clipSize[1]; + + // Note that clip, if present, is not centred on the cross hair + // intersection, but biased towards the top left. + let left = groupWidth / 2 - clipWidth * 0.25 - leftLength; + let right = groupWidth / 2 + clipWidth * 0.75; + let top = groupHeight / 2 - clipHeight * 0.25 - topLength - thickness / 2; + let bottom = groupHeight / 2 + clipHeight * 0.75 + thickness / 2; + this._horizLeftHair.set_position(left, (groupHeight - thickness) / 2); + this._horizRightHair.set_position(right, (groupHeight - thickness) / 2); + this._vertTopHair.set_position((groupWidth - thickness) / 2, top); + this._vertBottomHair.set_position((groupWidth - thickness) / 2, bottom); + } +}; + +var MagShaderEffects = class MagShaderEffects { + constructor(uiGroupClone) { + this._inverse = new Shell.InvertLightnessEffect(); + this._brightnessContrast = new Clutter.BrightnessContrastEffect(); + this._colorDesaturation = new Clutter.DesaturateEffect(); + this._inverse.set_enabled(false); + this._brightnessContrast.set_enabled(false); + + this._magView = uiGroupClone; + this._magView.add_effect(this._inverse); + this._magView.add_effect(this._brightnessContrast); + this._magView.add_effect(this._colorDesaturation); + } + + /** + * destroyEffects: + * Remove contrast and brightness effects from the magnified view, and + * lose the reference to the actor they were applied to. Don't use this + * object after calling this. + */ + destroyEffects() { + this._magView.clear_effects(); + this._colorDesaturation = null; + this._brightnessContrast = null; + this._inverse = null; + this._magView = null; + } + + /** + * setInvertLightness: + * Enable/disable invert lightness effect. + * @invertFlag: Enabled flag. + */ + setInvertLightness(invertFlag) { + this._inverse.set_enabled(invertFlag); + } + + setColorSaturation(factor) { + this._colorDesaturation.set_factor(1.0 - factor); + } + + /** + * setBrightness: + * Set the brightness of the magnified view. + * @brightness: Object containing the brightness for the red, green, + * and blue channels. Values of 0.0 represent "standard" + * brightness (no change), whereas values less or greater than + * 0.0 indicate decreased or incresaed brightness, + * respectively. + */ + setBrightness(brightness) { + let bRed = brightness.r; + let bGreen = brightness.g; + let bBlue = brightness.b; + this._brightnessContrast.set_brightness_full(bRed, bGreen, bBlue); + + // Enable the effect if the brightness OR contrast change are such that + // it modifies the brightness and/or contrast. + let [cRed, cGreen, cBlue] = this._brightnessContrast.get_contrast(); + this._brightnessContrast.set_enabled( + (bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE || + cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE) + ); + } + + /** + * Set the contrast of the magnified view. + * @contrast: Object containing the contrast for the red, green, + * and blue channels. Values of 0.0 represent "standard" + * contrast (no change), whereas values less or greater than + * 0.0 indicate decreased or incresaed contrast, respectively. + */ + setContrast(contrast) { + let cRed = contrast.r; + let cGreen = contrast.g; + let cBlue = contrast.b; + + this._brightnessContrast.set_contrast_full(cRed, cGreen, cBlue); + + // Enable the effect if the contrast OR brightness change are such that + // it modifies the brightness and/or contrast. + // should be able to use Clutter.color_equal(), but that complains of + // a null first argument. + let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness(); + this._brightnessContrast.set_enabled( + cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE || + bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE + ); + } +}; diff --git a/js/ui/magnifierDBus.js b/js/ui/magnifierDBus.js new file mode 100644 index 0000000..e267245 --- /dev/null +++ b/js/ui/magnifierDBus.js @@ -0,0 +1,343 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; +const Main = imports.ui.main; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const MAG_SERVICE_PATH = '/org/gnome/Magnifier'; +const ZOOM_SERVICE_PATH = '/org/gnome/Magnifier/ZoomRegion'; + +// Subset of gnome-mag's Magnifier dbus interface -- to be expanded. See: +// http://git.gnome.org/browse/gnome-mag/tree/xml/...Magnifier.xml +const MagnifierIface = loadInterfaceXML('org.gnome.Magnifier'); + +// Subset of gnome-mag's ZoomRegion dbus interface -- to be expanded. See: +// http://git.gnome.org/browse/gnome-mag/tree/xml/...ZoomRegion.xml +const ZoomRegionIface = loadInterfaceXML('org.gnome.Magnifier.ZoomRegion'); + +// For making unique ZoomRegion DBus proxy object paths of the form: +// '/org/gnome/Magnifier/ZoomRegion/zoomer0', +// '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc. +let _zoomRegionInstanceCount = 0; + +var ShellMagnifier = class ShellMagnifier { + constructor() { + this._zoomers = {}; + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this); + this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH); + } + + /** + * setActive: + * @activate: Boolean to activate or de-activate the magnifier. + */ + setActive(activate) { + Main.magnifier.setActive(activate); + } + + /** + * isActive: + * @return Whether the magnifier is active (boolean). + */ + isActive() { + return Main.magnifier.isActive(); + } + + /** + * showCursor: + * Show the system mouse pointer. + */ + showCursor() { + Main.magnifier.showSystemCursor(); + } + + /** + * hideCursor: + * Hide the system mouse pointer. + */ + hideCursor() { + Main.magnifier.hideSystemCursor(); + } + + /** + * createZoomRegion: + * Create a new ZoomRegion and return its object path. + * @xMagFactor: The power to set horizontal magnification of the + * ZoomRegion. A value of 1.0 means no magnification. A + * value of 2.0 doubles the size. + * @yMagFactor: The power to set the vertical magnification of the + * ZoomRegion. + * @roi Array of integers defining the region of the + * screen/desktop to magnify. The array has the form + * [left, top, right, bottom]. + * @viewPort Array of integers, [left, top, right, bottom] that defines + * the position of the ZoomRegion on screen. + * + * FIXME: The arguments here are redundant, since the width and height of + * the ROI are determined by the viewport and magnification factors. + * We ignore the passed in width and height. + * + * @return The newly created ZoomRegion. + */ + createZoomRegion(xMagFactor, yMagFactor, roi, viewPort) { + let ROI = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] }; + let viewBox = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] }; + let realZoomRegion = Main.magnifier.createZoomRegion(xMagFactor, yMagFactor, ROI, viewBox); + let objectPath = ZOOM_SERVICE_PATH + '/zoomer' + _zoomRegionInstanceCount; + _zoomRegionInstanceCount++; + + let zoomRegionProxy = new ShellMagnifierZoomRegion(objectPath, realZoomRegion); + let proxyAndZoomRegion = {}; + proxyAndZoomRegion.proxy = zoomRegionProxy; + proxyAndZoomRegion.zoomRegion = realZoomRegion; + this._zoomers[objectPath] = proxyAndZoomRegion; + return objectPath; + } + + /** + * addZoomRegion: + * Append the given ZoomRegion to the magnifier's list of ZoomRegions. + * @zoomerObjectPath: The object path for the zoom region proxy. + */ + addZoomRegion(zoomerObjectPath) { + let proxyAndZoomRegion = this._zoomers[zoomerObjectPath]; + if (proxyAndZoomRegion && proxyAndZoomRegion.zoomRegion) { + Main.magnifier.addZoomRegion(proxyAndZoomRegion.zoomRegion); + return true; + } + else + return false; + } + + /** + * getZoomRegions: + * Return a list of ZoomRegion object paths for this Magnifier. + * @return: The Magnifier's zoom region list as an array of DBus object + * paths. + */ + getZoomRegions() { + // There may be more ZoomRegions in the magnifier itself than have + // been added through dbus. Make sure all of them are associated with + // an object path and proxy. + let zoomRegions = Main.magnifier.getZoomRegions(); + let objectPaths = []; + let thoseZoomers = this._zoomers; + zoomRegions.forEach ((aZoomRegion, index, array) => { + let found = false; + for (let objectPath in thoseZoomers) { + let proxyAndZoomRegion = thoseZoomers[objectPath]; + if (proxyAndZoomRegion.zoomRegion === aZoomRegion) { + objectPaths.push(objectPath); + found = true; + break; + } + } + if (!found) { + // Got a ZoomRegion with no DBus proxy, make one. + let newPath = ZOOM_SERVICE_PATH + '/zoomer' + _zoomRegionInstanceCount; + _zoomRegionInstanceCount++; + let zoomRegionProxy = new ShellMagnifierZoomRegion(newPath, aZoomRegion); + let proxyAndZoomer = {}; + proxyAndZoomer.proxy = zoomRegionProxy; + proxyAndZoomer.zoomRegion = aZoomRegion; + thoseZoomers[newPath] = proxyAndZoomer; + objectPaths.push(newPath); + } + }); + return objectPaths; + } + + /** + * clearAllZoomRegions: + * Remove all the zoom regions from this Magnfier's ZoomRegion list. + */ + clearAllZoomRegions() { + Main.magnifier.clearAllZoomRegions(); + for (let objectPath in this._zoomers) { + let proxyAndZoomer = this._zoomers[objectPath]; + proxyAndZoomer.proxy.destroy(); + proxyAndZoomer.proxy = null; + proxyAndZoomer.zoomRegion = null; + delete this._zoomers[objectPath]; + } + this._zoomers = {}; + } + + /** + * fullScreenCapable: + * Consult if the Magnifier can magnify in full-screen mode. + * @return Always return true. + */ + fullScreenCapable() { + return true; + } + + /** + * setCrosswireSize: + * Set the crosswire size of all ZoomRegions. + * @size: The thickness of each line in the cross wire. + */ + setCrosswireSize(size) { + Main.magnifier.setCrosshairsThickness(size); + } + + /** + * getCrosswireSize: + * Get the crosswire size of all ZoomRegions. + * @return: The thickness of each line in the cross wire. + */ + getCrosswireSize() { + return Main.magnifier.getCrosshairsThickness(); + } + + /** + * setCrosswireLength: + * Set the crosswire length of all zoom-regions.. + * @size: The length of each line in the cross wire. + */ + setCrosswireLength(length) { + Main.magnifier.setCrosshairsLength(length); + } + + /** + * setCrosswireSize: + * Set the crosswire size of all zoom-regions. + * @size: The thickness of each line in the cross wire. + */ + getCrosswireLength() { + return Main.magnifier.getCrosshairsLength(); + } + + /** + * setCrosswireClip: + * Set if the crosswire will be clipped by the cursor image.. + * @clip: Flag to indicate whether to clip the crosswire. + */ + setCrosswireClip(clip) { + Main.magnifier.setCrosshairsClip(clip); + } + + /** + * getCrosswireClip: + * Get the crosswire clip value. + * @return: Whether the crosswire is clipped by the cursor image. + */ + getCrosswireClip() { + return Main.magnifier.getCrosshairsClip(); + } + + /** + * setCrosswireColor: + * Set the crosswire color of all ZoomRegions. + * @color: Unsigned int of the form rrggbbaa. + */ + setCrosswireColor(color) { + Main.magnifier.setCrosshairsColor('#%08x'.format(color)); + } + + /** + * getCrosswireClip: + * Get the crosswire color of all ZoomRegions. + * @return: The crosswire color as an unsigned int in the form rrggbbaa. + */ + getCrosswireColor() { + let colorString = Main.magnifier.getCrosshairsColor(); + // Drop the leading '#'. + return parseInt(colorString.slice(1), 16); + } +}; + +/** + * ShellMagnifierZoomRegion: + * Object that implements the DBus ZoomRegion interface. + * @zoomerObjectPath: String that is the path to a DBus ZoomRegion. + * @zoomRegion: The actual zoom region associated with the object path. + */ +var ShellMagnifierZoomRegion = class ShellMagnifierZoomRegion { + constructor(zoomerObjectPath, zoomRegion) { + this._zoomRegion = zoomRegion; + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this); + this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath); + } + + /** + * setMagFactor: + * @xMagFactor: The power to set the horizontal magnification factor to + * of the magnified view. A value of 1.0 means no + * magnification. A value of 2.0 doubles the size. + * @yMagFactor: The power to set the vertical magnification factor to + * of the magnified view. + */ + setMagFactor(xMagFactor, yMagFactor) { + this._zoomRegion.setMagFactor(xMagFactor, yMagFactor); + } + + /** + * getMagFactor: + * @return an array, [xMagFactor, yMagFactor], containing the horizontal + * and vertical magnification powers. A value of 1.0 means no + * magnification. A value of 2.0 means the contents are doubled + * in size, and so on. + */ + getMagFactor() { + return this._zoomRegion.getMagFactor(); + } + + /** + * setRoi: + * Sets the "region of interest" that the ZoomRegion is magnifying. + * @roi Array, [left, top, right, bottom], defining the region of the + * screen to magnify. The values are in screen (unmagnified) + * coordinate space. + */ + setRoi(roi) { + let roiObject = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] }; + this._zoomRegion.setROI(roiObject); + } + + /** + * getRoi: + * Retrieves the "region of interest" -- the rectangular bounds of that part + * of the desktop that the magnified view is showing (x, y, width, height). + * The bounds are given in non-magnified coordinates. + * @return an array, [left, top, right, bottom], representing the bounding + * rectangle of what is shown in the magnified view. + */ + getRoi() { + let roi = this._zoomRegion.getROI(); + roi[2] += roi[0]; + roi[3] += roi[1]; + return roi; + } + + /** + * Set the "region of interest" by centering the given screen coordinate + * within the zoom region. + * @x The x-coord of the point to place at the center of the zoom region. + * @y The y-coord. + * @return Whether the shift was successful (for GS-mag, this is always + * true). + */ + shiftContentsTo(x, y) { + this._zoomRegion.scrollContentsTo(x, y); + return true; + } + + /** + * moveResize + * Sets the position and size of the ZoomRegion on screen. + * @viewPort Array, [left, top, right, bottom], defining the position and + * size on screen to place the zoom region. + */ + moveResize(viewPort) { + let viewRect = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] }; + this._zoomRegion.setViewPort(viewRect); + } + + destroy() { + this._dbusImpl.unexport(); + } +}; diff --git a/js/ui/main.js b/js/ui/main.js new file mode 100644 index 0000000..061303c --- /dev/null +++ b/js/ui/main.js @@ -0,0 +1,712 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; + +const AccessDialog = imports.ui.accessDialog; +const AudioDeviceSelection = imports.ui.audioDeviceSelection; +const Components = imports.ui.components; +const CtrlAltTab = imports.ui.ctrlAltTab; +const EndSessionDialog = imports.ui.endSessionDialog; +const ExtensionSystem = imports.ui.extensionSystem; +const ExtensionDownloader = imports.ui.extensionDownloader; +const InputMethod = imports.misc.inputMethod; +const Introspect = imports.misc.introspect; +const Keyboard = imports.ui.keyboard; +const MessageTray = imports.ui.messageTray; +const ModalDialog = imports.ui.modalDialog; +const OsdWindow = imports.ui.osdWindow; +const OsdMonitorLabeler = imports.ui.osdMonitorLabeler; +const Overview = imports.ui.overview; +const PadOsd = imports.ui.padOsd; +const Panel = imports.ui.panel; +const Params = imports.misc.params; +const RunDialog = imports.ui.runDialog; +const Layout = imports.ui.layout; +const LoginManager = imports.misc.loginManager; +const LookingGlass = imports.ui.lookingGlass; +const NotificationDaemon = imports.ui.notificationDaemon; +const WindowAttentionHandler = imports.ui.windowAttentionHandler; +const Screencast = imports.ui.screencast; +const ScreenShield = imports.ui.screenShield; +const Scripting = imports.ui.scripting; +const SessionMode = imports.ui.sessionMode; +const ShellDBus = imports.ui.shellDBus; +const ShellMountOperation = imports.ui.shellMountOperation; +const WindowManager = imports.ui.windowManager; +const Magnifier = imports.ui.magnifier; +const XdndHandler = imports.ui.xdndHandler; +const KbdA11yDialog = imports.ui.kbdA11yDialog; + +const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard'; +const STICKY_KEYS_ENABLE = 'stickykeys-enable'; +const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a'; + +var componentManager = null; +var panel = null; +var overview = null; +var runDialog = null; +var lookingGlass = null; +var wm = null; +var messageTray = null; +var screenShield = null; +var notificationDaemon = null; +var windowAttentionHandler = null; +var ctrlAltTabManager = null; +var padOsdService = null; +var osdWindowManager = null; +var osdMonitorLabeler = null; +var sessionMode = null; +var shellAccessDialogDBusService = null; +var shellAudioSelectionDBusService = null; +var shellDBusService = null; +var shellMountOpDBusService = null; +var screenSaverDBus = null; +var screencastService = null; +var modalCount = 0; +var actionMode = Shell.ActionMode.NONE; +var modalActorFocusStack = []; +var uiGroup = null; +var magnifier = null; +var xdndHandler = null; +var keyboard = null; +var layoutManager = null; +var kbdA11yDialog = null; +var inputMethod = null; +var introspectService = null; +let _startDate; +let _defaultCssStylesheet = null; +let _cssStylesheet = null; +let _a11ySettings = null; +let _themeResource = null; +let _oskResource = null; + +function _sessionUpdated() { + if (sessionMode.isPrimary) + _loadDefaultStylesheet(); + + wm.setCustomKeybindingHandler('panel-main-menu', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + sessionMode.hasOverview ? overview.toggle.bind(overview) : null); + wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW); + + wm.setCustomKeybindingHandler('panel-run-dialog', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + sessionMode.hasRunDialog ? openRunDialog : null); + + if (!sessionMode.hasRunDialog) { + if (runDialog) + runDialog.close(); + if (lookingGlass) + lookingGlass.close(); + } +} + +function start() { + // These are here so we don't break compatibility. + global.logError = window.log; + global.log = window.log; + + // Chain up async errors reported from C + global.connect('notify-error', (global, msg, detail) => { + notifyError(msg, detail); + }); + + Gio.DesktopAppInfo.set_desktop_env('GNOME'); + + sessionMode = new SessionMode.SessionMode(); + sessionMode.connect('updated', _sessionUpdated); + + St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet); + _initializeUI(); + + shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus(); + shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus(); + shellDBusService = new ShellDBus.GnomeShell(); + shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler(); + + _sessionUpdated(); +} + +function _initializeUI() { + // Ensure ShellWindowTracker and ShellAppUsage are initialized; this will + // also initialize ShellAppSystem first. ShellAppSystem + // needs to load all the .desktop files, and ShellWindowTracker + // will use those to associate with windows. Right now + // the Monitor doesn't listen for installed app changes + // and recalculate application associations, so to avoid + // races for now we initialize it here. It's better to + // be predictable anyways. + Shell.WindowTracker.get_default(); + Shell.AppUsage.get_default(); + + reloadThemeResource(); + _loadOskLayouts(); + _loadDefaultStylesheet(); + + // Setup the stage hierarchy early + layoutManager = new Layout.LayoutManager(); + + // Various parts of the codebase still refers to Main.uiGroup + // instead using the layoutManager. This keeps that code + // working until it's updated. + uiGroup = layoutManager.uiGroup; + + padOsdService = new PadOsd.PadOsdService(); + screencastService = new Screencast.ScreencastService(); + xdndHandler = new XdndHandler.XdndHandler(); + ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager(); + 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(); + notificationDaemon = new NotificationDaemon.NotificationDaemon(); + windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler(); + componentManager = new Components.ComponentManager(); + + introspectService = new Introspect.IntrospectService(); + + layoutManager.init(); + overview.init(); + + _a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); + + global.display.connect('overlay-key', () => { + if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE)) + overview.toggle(); + }); + + global.display.connect('show-restart-message', (display, message) => { + showRestartMessage(message); + return true; + }); + + global.display.connect('restart', () => { + global.reexec_self(); + return true; + }); + + global.display.connect('gl-video-memory-purged', loadTheme); + + // Provide the bus object for gnome-session to + // initiate logouts. + EndSessionDialog.init(); + + // We're ready for the session manager to move to the next phase + Meta.register_with_session(); + + _startDate = new Date(); + + ExtensionDownloader.init(); + ExtensionSystem.init(); + + if (sessionMode.isGreeter && screenShield) { + layoutManager.connect('startup-prepared', () => { + screenShield.showDialog(); + }); + } + + layoutManager.connect('startup-complete', () => { + if (actionMode == Shell.ActionMode.NONE) { + actionMode = Shell.ActionMode.NORMAL; + } + if (screenShield) { + screenShield.lockIfWasLocked(); + } + if (sessionMode.currentMode != 'gdm' && + sessionMode.currentMode != 'initial-setup') { + Shell.Global.log_structured('GNOME Shell started at ' + _startDate, + ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]); + } + + let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); + if (perfModuleName) { + let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); + let module = eval('imports.perf.' + perfModuleName + ';'); + Scripting.runPerfScript(module, perfOutput); + } + }); +} + +function _getStylesheet(name) { + let stylesheet; + + stylesheet = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/' + name); + if (stylesheet.query_exists(null)) + return stylesheet; + + let dataDirs = GLib.get_system_data_dirs(); + for (let i = 0; i < dataDirs.length; i++) { + let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]); + let stylesheet = Gio.file_new_for_path(path); + if (stylesheet.query_exists(null)) + return stylesheet; + } + + stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name); + if (stylesheet.query_exists(null)) + return stylesheet; + + return null; +} + +function _getDefaultStylesheet() { + let stylesheet = null; + let name = sessionMode.stylesheetName; + + // Look for a high-contrast variant first when using GTK+'s HighContrast + // theme + if (St.Settings.get().gtk_theme == 'HighContrast') + stylesheet = _getStylesheet(name.replace('.css', '-high-contrast.css')); + + if (stylesheet == null) + stylesheet = _getStylesheet(sessionMode.stylesheetName); + + return stylesheet; +} + +function _loadDefaultStylesheet() { + let stylesheet = _getDefaultStylesheet(); + if (_defaultCssStylesheet && _defaultCssStylesheet.equal(stylesheet)) + return; + + _defaultCssStylesheet = stylesheet; + loadTheme(); +} + +/** + * getThemeStylesheet: + * + * Get the theme CSS file that the shell will load + * + * Returns: A #GFile that contains the theme CSS, + * null if using the default + */ +function getThemeStylesheet() { + return _cssStylesheet; +} + +/** + * setThemeStylesheet: + * @cssStylesheet: A file path that contains the theme CSS, + * set it to null to use the default + * + * Set the theme CSS file that the shell will load + */ +function setThemeStylesheet(cssStylesheet) { + _cssStylesheet = cssStylesheet ? Gio.File.new_for_path(cssStylesheet) : null; +} + +function reloadThemeResource() { + if (_themeResource) + _themeResource._unregister(); + + _themeResource = Gio.Resource.load(global.datadir + '/gnome-shell-theme.gresource'); + _themeResource._register(); +} + +function _loadOskLayouts() { + _oskResource = Gio.Resource.load(global.datadir + '/gnome-shell-osk-layouts.gresource'); + _oskResource._register(); +} + +/** + * loadTheme: + * + * Reloads the theme CSS file + */ +function loadTheme() { + let themeContext = St.ThemeContext.get_for_stage (global.stage); + let previousTheme = themeContext.get_theme(); + + let theme = new St.Theme ({ application_stylesheet: _cssStylesheet, + default_stylesheet: _defaultCssStylesheet }); + + if (theme.default_stylesheet == null) + throw new Error("No valid stylesheet found for '%s'".format(sessionMode.stylesheetName)); + + if (previousTheme) { + let customStylesheets = previousTheme.get_custom_stylesheets(); + + for (let i = 0; i < customStylesheets.length; i++) + theme.load_stylesheet(customStylesheets[i]); + } + + themeContext.set_theme (theme); +} + +/** + * notify: + * @msg: A message + * @details: Additional information + */ +function notify(msg, details) { + let source = new MessageTray.SystemNotificationSource(); + messageTray.add(source); + let notification = new MessageTray.Notification(source, msg, details); + notification.setTransient(true); + source.notify(notification); +} + +/** + * notifyError: + * @msg: An error message + * @details: Additional information + * + * See shell_global_notify_problem(). + */ +function notifyError(msg, details) { + // Also print to stderr so it's logged somewhere + if (details) + log('error: ' + msg + ': ' + details); + else + log('error: ' + msg); + + notify(msg, details); +} + +function _findModal(actor) { + for (let i = 0; i < modalActorFocusStack.length; i++) { + if (modalActorFocusStack[i].actor == actor) + return i; + } + return -1; +} + +/** + * pushModal: + * @actor: #ClutterActor which will be given keyboard focus + * @params: optional parameters + * + * Ensure we are in a mode where all keyboard and mouse input goes to + * the stage, and focus @actor. Multiple calls to this function act in + * a stacking fashion; the effect will be undone when an equal number + * of popModal() invocations have been made. + * + * Next, record the current Clutter keyboard focus on a stack. If the + * modal stack returns to this actor, reset the focus to the actor + * which was focused at the time pushModal() was invoked. + * + * @params may be used to provide the following parameters: + * - timestamp: used to associate the call with a specific user initiated + * event. If not provided then the value of + * global.get_current_time() is assumed. + * + * - options: Meta.ModalOptions flags to indicate that the pointer is + * already grabbed + * + * - actionMode: used to set the current Shell.ActionMode to filter + * global keybindings; the default of NONE will filter + * out all keybindings + * + * Returns: true iff we successfully acquired a grab or already had one + */ +function pushModal(actor, params) { + params = Params.parse(params, { timestamp: global.get_current_time(), + options: 0, + actionMode: Shell.ActionMode.NONE }); + + if (modalCount == 0) { + if (!global.begin_modal(params.timestamp, params.options)) { + log('pushModal: invocation of begin_modal failed'); + return false; + } + Meta.disable_unredirect_for_display(global.display); + } + + modalCount += 1; + let actorDestroyId = actor.connect('destroy', () => { + let index = _findModal(actor); + if (index >= 0) + popModal(actor); + }); + + let prevFocus = global.stage.get_key_focus(); + let prevFocusDestroyId; + if (prevFocus != null) { + prevFocusDestroyId = prevFocus.connect('destroy', () => { + let index = _findModal(actor); + if (index >= 0) + modalActorFocusStack[index].prevFocus = null; + }); + } + modalActorFocusStack.push({ actor: actor, + destroyId: actorDestroyId, + prevFocus: prevFocus, + prevFocusDestroyId: prevFocusDestroyId, + actionMode: actionMode }); + + actionMode = params.actionMode; + global.stage.set_key_focus(actor); + return true; +} + +/** + * popModal: + * @actor: #ClutterActor passed to original invocation of pushModal(). + * @timestamp: optional timestamp + * + * Reverse the effect of pushModal(). If this invocation is undoing + * the topmost invocation, then the focus will be restored to the + * previous focus at the time when pushModal() was invoked. + * + * @timestamp is optionally used to associate the call with a specific user + * initiated event. If not provided then the value of + * global.get_current_time() is assumed. + */ +function popModal(actor, timestamp) { + if (timestamp == undefined) + timestamp = global.get_current_time(); + + let focusIndex = _findModal(actor); + if (focusIndex < 0) { + global.stage.set_key_focus(null); + global.end_modal(timestamp); + actionMode = Shell.ActionMode.NORMAL; + + throw new Error('incorrect pop'); + } + + modalCount -= 1; + + let record = modalActorFocusStack[focusIndex]; + record.actor.disconnect(record.destroyId); + + if (focusIndex == modalActorFocusStack.length - 1) { + if (record.prevFocus) + record.prevFocus.disconnect(record.prevFocusDestroyId); + actionMode = record.actionMode; + global.stage.set_key_focus(record.prevFocus); + } else { + // If we have: + // global.stage.set_focus(a); + // Main.pushModal(b); + // Main.pushModal(c); + // Main.pushModal(d); + // + // then we have the stack: + // [{ prevFocus: a, actor: b }, + // { prevFocus: b, actor: c }, + // { prevFocus: c, actor: d }] + // + // When actor c is destroyed/popped, if we only simply remove the + // record, then the focus stack will be [a, c], rather than the correct + // [a, b]. Shift the focus stack up before removing the record to ensure + // that we get the correct result. + let t = modalActorFocusStack[modalActorFocusStack.length - 1]; + if (t.prevFocus) + t.prevFocus.disconnect(t.prevFocusDestroyId); + // Remove from the middle, shift the focus chain up + for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) { + modalActorFocusStack[i].prevFocus = modalActorFocusStack[i - 1].prevFocus; + modalActorFocusStack[i].prevFocusDestroyId = modalActorFocusStack[i - 1].prevFocusDestroyId; + modalActorFocusStack[i].actionMode = modalActorFocusStack[i - 1].actionMode; + } + } + modalActorFocusStack.splice(focusIndex, 1); + + if (modalCount > 0) + return; + + layoutManager.modalEnded(); + global.end_modal(timestamp); + Meta.enable_unredirect_for_display(global.display); + actionMode = Shell.ActionMode.NORMAL; +} + +function createLookingGlass() { + if (lookingGlass == null) { + lookingGlass = new LookingGlass.LookingGlass(); + } + return lookingGlass; +} + +function openRunDialog() { + if (runDialog == null) { + runDialog = new RunDialog.RunDialog(); + } + runDialog.open(); +} + +/** + * activateWindow: + * @window: the Meta.Window to activate + * @time: (optional) current event time + * @workspaceNum: (optional) window's workspace number + * + * Activates @window, switching to its workspace first if necessary, + * and switching out of the overview if it's currently active + */ +function activateWindow(window, time, workspaceNum) { + let workspaceManager = global.workspace_manager; + let activeWorkspaceNum = workspaceManager.get_active_workspace_index(); + let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index(); + + if (!time) + time = global.get_current_time(); + + if (windowWorkspaceNum != activeWorkspaceNum) { + let workspace = workspaceManager.get_workspace_by_index(windowWorkspaceNum); + workspace.activate_with_focus(window, time); + } else { + window.activate(time); + } + + overview.hide(); + panel.closeCalendar(); +} + +// TODO - replace this timeout with some system to guess when the user might +// be e.g. just reading the screen and not likely to interact. +var DEFERRED_TIMEOUT_SECONDS = 20; +var _deferredWorkData = {}; +// Work scheduled for some point in the future +var _deferredWorkQueue = []; +// Work we need to process before the next redraw +var _beforeRedrawQueue = []; +// Counter to assign work ids +var _deferredWorkSequence = 0; +var _deferredTimeoutId = 0; + +function _runDeferredWork(workId) { + if (!_deferredWorkData[workId]) + return; + let index = _deferredWorkQueue.indexOf(workId); + if (index < 0) + return; + + _deferredWorkQueue.splice(index, 1); + _deferredWorkData[workId].callback(); + if (_deferredWorkQueue.length == 0 && _deferredTimeoutId > 0) { + Mainloop.source_remove(_deferredTimeoutId); + _deferredTimeoutId = 0; + } +} + +function _runAllDeferredWork() { + while (_deferredWorkQueue.length > 0) + _runDeferredWork(_deferredWorkQueue[0]); +} + +function _runBeforeRedrawQueue() { + for (let i = 0; i < _beforeRedrawQueue.length; i++) { + let workId = _beforeRedrawQueue[i]; + _runDeferredWork(workId); + } + _beforeRedrawQueue = []; +} + +function _queueBeforeRedraw(workId) { + _beforeRedrawQueue.push(workId); + if (_beforeRedrawQueue.length == 1) { + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + _runBeforeRedrawQueue(); + return false; + }); + } +} + +/** + * initializeDeferredWork: + * @actor: A #ClutterActor + * @callback: Function to invoke to perform work + * + * This function sets up a callback to be invoked when either the + * given actor is mapped, or after some period of time when the machine + * is idle. This is useful if your actor isn't always visible on the + * screen (for example, all actors in the overview), and you don't want + * to consume resources updating if the actor isn't actually going to be + * displaying to the user. + * + * Note that queueDeferredWork is called by default immediately on + * initialization as well, under the assumption that new actors + * will need it. + * + * Returns: A string work identifer + */ +function initializeDeferredWork(actor, callback, props) { + // Turn into a string so we can use as an object property + let workId = '' + (++_deferredWorkSequence); + _deferredWorkData[workId] = { 'actor': actor, + 'callback': callback }; + actor.connect('notify::mapped', () => { + if (!(actor.mapped && _deferredWorkQueue.indexOf(workId) >= 0)) + return; + _queueBeforeRedraw(workId); + }); + actor.connect('destroy', () => { + let index = _deferredWorkQueue.indexOf(workId); + if (index >= 0) + _deferredWorkQueue.splice(index, 1); + delete _deferredWorkData[workId]; + }); + queueDeferredWork(workId); + return workId; +} + +/** + * queueDeferredWork: + * @workId: work identifier + * + * Ensure that the work identified by @workId will be + * run on map or timeout. You should call this function + * for example when data being displayed by the actor has + * changed. + */ +function queueDeferredWork(workId) { + let data = _deferredWorkData[workId]; + if (!data) { + let message = 'Invalid work id %d'.format(workId); + logError(new Error(message), message); + return; + } + if (_deferredWorkQueue.indexOf(workId) < 0) + _deferredWorkQueue.push(workId); + if (data.actor.mapped) { + _queueBeforeRedraw(workId); + return; + } else if (_deferredTimeoutId == 0) { + _deferredTimeoutId = Mainloop.timeout_add_seconds(DEFERRED_TIMEOUT_SECONDS, () => { + _runAllDeferredWork(); + _deferredTimeoutId = 0; + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(_deferredTimeoutId, '[gnome-shell] _runAllDeferredWork'); + } +} + +var RestartMessage = class extends ModalDialog.ModalDialog { + constructor(message) { + super({ shellReactive: true, + styleClass: 'restart-message headline', + shouldFadeIn: false, + destroyOnClose: true }); + + let label = new St.Label({ text: message }); + + this.contentLayout.add(label, { x_fill: false, + y_fill: false, + x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE }); + this.buttonLayout.hide(); + } +}; + +function showRestartMessage(message) { + let restartMessage = new RestartMessage(message); + restartMessage.open(); +} diff --git a/js/ui/messageList.js b/js/ui/messageList.js new file mode 100644 index 0000000..bd97ffc --- /dev/null +++ b/js/ui/messageList.js @@ -0,0 +1,693 @@ +const { Atk, Clutter, Gio, GLib, GObject, Meta, Pango, St } = imports.gi; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const Signals = imports.signals; + +const Calendar = imports.ui.calendar; +const Tweener = imports.ui.tweener; +const Util = imports.misc.util; + +var MESSAGE_ANIMATION_TIME = 0.1; + +var DEFAULT_EXPAND_LINES = 6; + +function _fixMarkup(text, allowMarkup) { + if (allowMarkup) { + // Support &, ", ', < and >, escape all other + // occurrences of '&'. + let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&'); + + // Support , , and , escape anything else + // so it displays as raw markup. + // Ref: https://developer.gnome.org/notification-spec/#markup + _text = _text.replace(/<(?!\/?[biu]>)/g, '<'); + + try { + Pango.parse_markup(_text, -1, ''); + return _text; + } catch (e) {} + } + + // !allowMarkup, or invalid markup + return GLib.markup_escape_text(text, -1); +} + +var URLHighlighter = class URLHighlighter { + constructor(text, lineWrap, allowMarkup) { + if (!text) + text = ''; + this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter', + x_expand: true, x_align: Clutter.ActorAlign.START }); + this._linkColor = '#ccccff'; + this.actor.connect('style-changed', () => { + let [hasColor, color] = this.actor.get_theme_node().lookup_color('link-color', false); + if (hasColor) { + let linkColor = color.to_string().substr(0, 7); + if (linkColor != this._linkColor) { + this._linkColor = linkColor; + this._highlightUrls(); + } + } + }); + this.actor.clutter_text.line_wrap = lineWrap; + this.actor.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR; + + this.setMarkup(text, allowMarkup); + this.actor.connect('button-press-event', (actor, event) => { + // Don't try to URL highlight when invisible. + // The MessageTray doesn't actually hide us, so + // we need to check for paint opacities as well. + if (!actor.visible || actor.get_paint_opacity() == 0) + return Clutter.EVENT_PROPAGATE; + + // Keep Notification.actor from seeing this and taking + // a pointer grab, which would block our button-release-event + // handler, if an URL is clicked + return this._findUrlAtPos(event) != -1; + }); + this.actor.connect('button-release-event', (actor, event) => { + if (!actor.visible || actor.get_paint_opacity() == 0) + return Clutter.EVENT_PROPAGATE; + + let urlId = this._findUrlAtPos(event); + if (urlId != -1) { + let url = this._urls[urlId].url; + if (url.indexOf(':') == -1) + url = 'http://' + url; + + Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1)); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + }); + this.actor.connect('motion-event', (actor, event) => { + if (!actor.visible || actor.get_paint_opacity() == 0) + return Clutter.EVENT_PROPAGATE; + + let urlId = this._findUrlAtPos(event); + if (urlId != -1 && !this._cursorChanged) { + global.display.set_cursor(Meta.Cursor.POINTING_HAND); + this._cursorChanged = true; + } else if (urlId == -1) { + global.display.set_cursor(Meta.Cursor.DEFAULT); + this._cursorChanged = false; + } + return Clutter.EVENT_PROPAGATE; + }); + this.actor.connect('leave-event', () => { + if (!this.actor.visible || this.actor.get_paint_opacity() == 0) + return Clutter.EVENT_PROPAGATE; + + if (this._cursorChanged) { + this._cursorChanged = false; + global.display.set_cursor(Meta.Cursor.DEFAULT); + } + return Clutter.EVENT_PROPAGATE; + }); + } + + setMarkup(text, allowMarkup) { + text = text ? _fixMarkup(text, allowMarkup) : ''; + this._text = text; + + this.actor.clutter_text.set_markup(text); + /* clutter_text.text contain text without markup */ + this._urls = Util.findUrls(this.actor.clutter_text.text); + this._highlightUrls(); + } + + _highlightUrls() { + // text here contain markup + let urls = Util.findUrls(this._text); + let markup = ''; + let pos = 0; + for (let i = 0; i < urls.length; i++) { + let url = urls[i]; + let str = this._text.substr(pos, url.pos - pos); + markup += str + '' + url.url + ''; + pos = url.pos + url.url.length; + } + markup += this._text.substr(pos); + this.actor.clutter_text.set_markup(markup); + } + + _findUrlAtPos(event) { + let success; + let [x, y] = event.get_coords(); + [success, x, y] = this.actor.transform_stage_point(x, y); + let find_pos = -1; + for (let i = 0; i < this.actor.clutter_text.text.length; i++) { + let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i); + if (py > y || py + line_height < y || x < px) + continue; + find_pos = i; + } + if (find_pos != -1) { + for (let i = 0; i < this._urls.length; i++) + if (find_pos >= this._urls[i].pos && + this._urls[i].pos + this._urls[i].url.length > find_pos) + return i; + } + return -1; + } +}; + +var ScaleLayout = GObject.registerClass( +class ScaleLayout extends Clutter.BinLayout { + _init(params) { + this._container = null; + super._init(params); + } + + _connectContainer(container) { + if (this._container == container) + return; + + if (this._container) + for (let id of this._signals) + this._container.disconnect(id); + + this._container = container; + this._signals = []; + + if (this._container) + for (let signal of ['notify::scale-x', 'notify::scale-y']) { + let id = this._container.connect(signal, () => { + this.layout_changed(); + }); + this._signals.push(id); + } + } + + vfunc_get_preferred_width(container, forHeight) { + this._connectContainer(container); + + let [min, nat] = super.vfunc_get_preferred_width(container, forHeight); + return [Math.floor(min * container.scale_x), + Math.floor(nat * container.scale_x)]; + } + + vfunc_get_preferred_height(container, forWidth) { + this._connectContainer(container); + + let [min, nat] = super.vfunc_get_preferred_height(container, forWidth); + return [Math.floor(min * container.scale_y), + Math.floor(nat * container.scale_y)]; + } +}); + +var LabelExpanderLayout = GObject.registerClass({ + Properties: { 'expansion': GObject.ParamSpec.double('expansion', + 'Expansion', + 'Expansion of the layout, between 0 (collapsed) ' + + 'and 1 (fully expanded', + GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, + 0, 1, 0)}, +}, class LabelExpanderLayout extends Clutter.LayoutManager { + _init(params) { + this._expansion = 0; + this._expandLines = DEFAULT_EXPAND_LINES; + + super._init(params); + } + + get expansion() { + return this._expansion; + } + + set expansion(v) { + if (v == this._expansion) + return; + this._expansion = v; + this.notify('expansion'); + + let visibleIndex = this._expansion > 0 ? 1 : 0; + for (let i = 0; this._container && i < this._container.get_n_children(); i++) + this._container.get_child_at_index(i).visible = (i == visibleIndex); + + this.layout_changed(); + } + + set expandLines(v) { + if (v == this._expandLines) + return; + this._expandLines = v; + if (this._expansion > 0) + this.layout_changed(); + } + + vfunc_set_container(container) { + this._container = container; + } + + vfunc_get_preferred_width(container, forHeight) { + let [min, nat] = [0, 0]; + + for (let i = 0; i < container.get_n_children(); i++) { + if (i > 1) + break; // we support one unexpanded + one expanded child + + let child = container.get_child_at_index(i); + let [childMin, childNat] = child.get_preferred_width(forHeight); + [min, nat] = [Math.max(min, childMin), Math.max(nat, childNat)]; + } + + return [min, nat]; + } + + vfunc_get_preferred_height(container, forWidth) { + let [min, nat] = [0, 0]; + + let children = container.get_children(); + if (children[0]) + [min, nat] = children[0].get_preferred_height(forWidth); + + if (children[1]) { + let [min2, nat2] = children[1].get_preferred_height(forWidth); + let [expMin, expNat] = [Math.min(min2, min * this._expandLines), + Math.min(nat2, nat * this._expandLines)]; + [min, nat] = [min + this._expansion * (expMin - min), + nat + this._expansion * (expNat - nat)]; + } + + return [min, nat]; + } + + vfunc_allocate(container, box, flags) { + for (let i = 0; i < container.get_n_children(); i++) { + let child = container.get_child_at_index(i); + + if (child.visible) + child.allocate(box, flags); + } + + } +}); + +var Message = class Message { + constructor(title, body) { + this.expanded = false; + + this._useBodyMarkup = false; + + this.actor = new St.Button({ style_class: 'message', + accessible_role: Atk.Role.NOTIFICATION, + can_focus: true, + x_expand: true, x_fill: true }); + this.actor.connect('key-press-event', + this._onKeyPressed.bind(this)); + + let vbox = new St.BoxLayout({ vertical: true }); + this.actor.set_child(vbox); + + let hbox = new St.BoxLayout(); + vbox.add_actor(hbox); + + this._actionBin = new St.Widget({ layout_manager: new ScaleLayout(), + visible: false }); + vbox.add_actor(this._actionBin); + + this._iconBin = new St.Bin({ style_class: 'message-icon-bin', + y_expand: true, + y_align: St.Align.START, + visible: false }); + hbox.add_actor(this._iconBin); + + let contentBox = new St.BoxLayout({ style_class: 'message-content', + vertical: true, x_expand: true }); + hbox.add_actor(contentBox); + + this._mediaControls = new St.BoxLayout(); + hbox.add_actor(this._mediaControls); + + let titleBox = new St.BoxLayout(); + contentBox.add_actor(titleBox); + + this.titleLabel = new St.Label({ style_class: 'message-title' }); + this.setTitle(title); + titleBox.add_actor(this.titleLabel); + + this._secondaryBin = new St.Bin({ style_class: 'message-secondary-bin', + x_expand: true, y_expand: true, + x_fill: true, y_fill: true }); + titleBox.add_actor(this._secondaryBin); + + let closeIcon = new St.Icon({ icon_name: 'window-close-symbolic', + icon_size: 16 }); + this._closeButton = new St.Button({ child: closeIcon, opacity: 0 }); + titleBox.add_actor(this._closeButton); + + this._bodyStack = new St.Widget({ x_expand: true }); + this._bodyStack.layout_manager = new LabelExpanderLayout(); + contentBox.add_actor(this._bodyStack); + + this.bodyLabel = new URLHighlighter('', false, this._useBodyMarkup); + this.bodyLabel.actor.add_style_class_name('message-body'); + this._bodyStack.add_actor(this.bodyLabel.actor); + this.setBody(body); + + this._closeButton.connect('clicked', this.close.bind(this)); + let actorHoverId = this.actor.connect('notify::hover', this._sync.bind(this)); + this._closeButton.connect('destroy', this.actor.disconnect.bind(this.actor, actorHoverId)); + this.actor.connect('clicked', this._onClicked.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + this._sync(); + } + + close() { + this.emit('close'); + } + + setIcon(actor) { + this._iconBin.child = actor; + this._iconBin.visible = (actor != null); + } + + setSecondaryActor(actor) { + this._secondaryBin.child = actor; + } + + setTitle(text) { + let title = text ? _fixMarkup(text.replace(/\n/g, ' '), false) : ''; + this.titleLabel.clutter_text.set_markup(title); + } + + setBody(text) { + this._bodyText = text; + this.bodyLabel.setMarkup(text ? text.replace(/\n/g, ' ') : '', + this._useBodyMarkup); + if (this._expandedLabel) + this._expandedLabel.setMarkup(text, this._useBodyMarkup); + } + + setUseBodyMarkup(enable) { + if (this._useBodyMarkup === enable) + return; + this._useBodyMarkup = enable; + if (this.bodyLabel) + this.setBody(this._bodyText); + } + + setActionArea(actor) { + if (actor == null) { + if (this._actionBin.get_n_children() > 0) + this._actionBin.get_child_at_index(0).destroy(); + return; + } + + if (this._actionBin.get_n_children() > 0) + throw new Error('Message already has an action area'); + + this._actionBin.add_actor(actor); + this._actionBin.visible = this.expanded; + } + + addMediaControl(iconName, callback) { + let icon = new St.Icon({ icon_name: iconName, icon_size: 16 }); + let button = new St.Button({ style_class: 'message-media-control', + child: icon }); + button.connect('clicked', callback); + this._mediaControls.add_actor(button); + return button; + } + + setExpandedBody(actor) { + if (actor == null) { + if (this._bodyStack.get_n_children() > 1) + this._bodyStack.get_child_at_index(1).destroy(); + return; + } + + if (this._bodyStack.get_n_children() > 1) + throw new Error('Message already has an expanded body actor'); + + this._bodyStack.insert_child_at_index(actor, 1); + } + + setExpandedLines(nLines) { + this._bodyStack.layout_manager.expandLines = nLines; + } + + expand(animate) { + this.expanded = true; + + this._actionBin.visible = (this._actionBin.get_n_children() > 0); + + if (this._bodyStack.get_n_children() < 2) { + this._expandedLabel = new URLHighlighter(this._bodyText, + true, this._useBodyMarkup); + this.setExpandedBody(this._expandedLabel.actor); + } + + if (animate) { + Tweener.addTween(this._bodyStack.layout_manager, + { expansion: 1, + time: MessageTray.ANIMATION_TIME, + transition: 'easeOutQuad' }); + this._actionBin.scale_y = 0; + Tweener.addTween(this._actionBin, + { scale_y: 1, + time: MessageTray.ANIMATION_TIME, + transition: 'easeOutQuad' }); + } else { + this._bodyStack.layout_manager.expansion = 1; + this._actionBin.scale_y = 1; + } + + this.emit('expanded'); + } + + unexpand(animate) { + if (animate) { + Tweener.addTween(this._bodyStack.layout_manager, + { expansion: 0, + time: MessageTray.ANIMATION_TIME, + transition: 'easeOutQuad' }); + Tweener.addTween(this._actionBin, + { scale_y: 0, + time: MessageTray.ANIMATION_TIME, + transition: 'easeOutQuad', + onCompleteScope: this, + onComplete() { + this._actionBin.hide(); + this.expanded = false; + }}); + } else { + this._bodyStack.layout_manager.expansion = 0; + this._actionBin.scale_y = 0; + this.expanded = false; + } + + this.emit('unexpanded'); + } + + canClose() { + return false; + } + + _sync() { + let visible = this.actor.hover && this.canClose(); + this._closeButton.opacity = visible ? 255 : 0; + this._closeButton.reactive = visible; + } + + _onClicked() { + } + + _onDestroy() { + } + + _onKeyPressed(a, event) { + let keysym = event.get_key_symbol(); + + if (keysym == Clutter.KEY_Delete || + keysym == Clutter.KEY_KP_Delete) { + this.close(); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } +}; +Signals.addSignalMethods(Message.prototype); + +var MessageListSection = class MessageListSection { + constructor() { + this.actor = new St.BoxLayout({ style_class: 'message-list-section', + clip_to_allocation: true, + x_expand: true, vertical: true }); + + this._list = new St.BoxLayout({ style_class: 'message-list-section-list', + vertical: true }); + this.actor.add_actor(this._list); + + this._list.connect('actor-added', this._sync.bind(this)); + this._list.connect('actor-removed', this._sync.bind(this)); + + let id = Main.sessionMode.connect('updated', + this._sync.bind(this)); + this.actor.connect('destroy', () => { + Main.sessionMode.disconnect(id); + }); + + this._messages = new Map(); + this._date = new Date(); + this.empty = true; + this.canClear = false; + this._sync(); + } + + _onKeyFocusIn(actor) { + this.emit('key-focus-in', actor); + } + + get allowed() { + return true; + } + + setDate(date) { + if (Calendar.sameDay(date, this._date)) + return; + this._date = date; + this._sync(); + } + + addMessage(message, animate) { + this.addMessageAtIndex(message, -1, animate); + } + + addMessageAtIndex(message, index, animate) { + let obj = { + container: null, + destroyId: 0, + keyFocusId: 0, + closeId: 0 + }; + let pivot = new Clutter.Point({ x: .5, y: .5 }); + let scale = animate ? 0 : 1; + obj.container = new St.Widget({ layout_manager: new ScaleLayout(), + pivot_point: pivot, + scale_x: scale, scale_y: scale }); + obj.keyFocusId = message.actor.connect('key-focus-in', + this._onKeyFocusIn.bind(this)); + obj.destroyId = message.actor.connect('destroy', () => { + this.removeMessage(message, false); + }); + obj.closeId = message.connect('close', () => { + this.removeMessage(message, true); + }); + + this._messages.set(message, obj); + obj.container.add_actor(message.actor); + + this._list.insert_child_at_index(obj.container, index); + + if (animate) + Tweener.addTween(obj.container, { scale_x: 1, + scale_y: 1, + time: MESSAGE_ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + + moveMessage(message, index, animate) { + let obj = this._messages.get(message); + + if (!animate) { + this._list.set_child_at_index(obj.container, index); + return; + } + + let onComplete = () => { + this._list.set_child_at_index(obj.container, index); + Tweener.addTween(obj.container, { scale_x: 1, + scale_y: 1, + time: MESSAGE_ANIMATION_TIME, + transition: 'easeOutQuad' }); + }; + Tweener.addTween(obj.container, { scale_x: 0, + scale_y: 0, + time: MESSAGE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: onComplete }); + } + + removeMessage(message, animate) { + let obj = this._messages.get(message); + + message.actor.disconnect(obj.destroyId); + message.actor.disconnect(obj.keyFocusId); + message.disconnect(obj.closeId); + + this._messages.delete(message); + + if (animate) { + Tweener.addTween(obj.container, { scale_x: 0, scale_y: 0, + time: MESSAGE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete() { + obj.container.destroy(); + global.sync_pointer(); + }}); + } else { + obj.container.destroy(); + global.sync_pointer(); + } + } + + clear() { + let messages = [...this._messages.keys()].filter(msg => msg.canClose()); + + // If there are few messages, letting them all zoom out looks OK + if (messages.length < 2) { + messages.forEach(message => { + message.close(); + }); + } else { + // Otherwise we slide them out one by one, and then zoom them + // out "off-screen" in the end to smoothly shrink the parent + let delay = MESSAGE_ANIMATION_TIME / Math.max(messages.length, 5); + for (let i = 0; i < messages.length; i++) { + let message = messages[i]; + let obj = this._messages.get(message); + Tweener.addTween(obj.container, + { anchor_x: this._list.width, + opacity: 0, + time: MESSAGE_ANIMATION_TIME, + delay: i * delay, + transition: 'easeOutQuad', + onComplete() { + message.close(); + }}); + } + } + } + + _canClear() { + for (let message of this._messages.keys()) + if (message.canClose()) + return true; + return false; + } + + _shouldShow() { + return !this.empty; + } + + _sync() { + let empty = this._list.get_n_children() == 0; + let changed = this.empty !== empty; + this.empty = empty; + + if (changed) + this.emit('empty-changed'); + + let canClear = this._canClear(); + changed = this.canClear !== canClear; + this.canClear = canClear; + + if (changed) + this.emit('can-clear-changed'); + + this.actor.visible = this.allowed && this._shouldShow(); + } +}; +Signals.addSignalMethods(MessageListSection.prototype); diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js new file mode 100644 index 0000000..8f81304 --- /dev/null +++ b/js/ui/messageTray.js @@ -0,0 +1,1486 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Calendar = imports.ui.calendar; +const GnomeSession = imports.misc.gnomeSession; +const Layout = imports.ui.layout; +const Main = imports.ui.main; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; + +const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; + +var ANIMATION_TIME = 0.2; +var NOTIFICATION_TIMEOUT = 4; + +var HIDE_TIMEOUT = 0.2; +var LONGER_HIDE_TIMEOUT = 0.6; + +var MAX_NOTIFICATIONS_IN_QUEUE = 3; +var MAX_NOTIFICATIONS_PER_SOURCE = 3; +var MAX_NOTIFICATION_BUTTONS = 3; + +// We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD +// range from the point where it left the tray. +var MOUSE_LEFT_ACTOR_THRESHOLD = 20; + +var IDLE_TIME = 1000; + +var State = { + HIDDEN: 0, + SHOWING: 1, + SHOWN: 2, + HIDING: 3 +}; + +// These reasons are useful when we destroy the notifications received through +// the notification daemon. We use EXPIRED for notifications that we dismiss +// and the user did not interact with, DISMISSED for all other notifications +// that were destroyed as a result of a user action, SOURCE_CLOSED for the +// notifications that were requested to be destroyed by the associated source, +// and REPLACED for notifications that were destroyed as a consequence of a +// newer version having replaced them. +var NotificationDestroyedReason = { + EXPIRED: 1, + DISMISSED: 2, + SOURCE_CLOSED: 3, + REPLACED: 4 +}; + +// Message tray has its custom Urgency enumeration. LOW, NORMAL and CRITICAL +// urgency values map to the corresponding values for the notifications received +// through the notification daemon. HIGH urgency value is used for chats received +// through the Telepathy client. +var Urgency = { + LOW: 0, + NORMAL: 1, + HIGH: 2, + CRITICAL: 3 +}; + +// The privacy of the details of a notification. USER is for notifications which +// contain private information to the originating user account (for example, +// details of an e-mail they’ve received). SYSTEM is for notifications which +// contain information private to the physical system (for example, battery +// status) and hence the same for every user. This affects whether the content +// of a notification is shown on the lock screen. +var PrivacyScope = { + USER: 0, + SYSTEM: 1, +}; + +var FocusGrabber = class FocusGrabber { + constructor(actor) { + this._actor = actor; + this._prevKeyFocusActor = null; + this._focusActorChangedId = 0; + this._focused = false; + } + + grabFocus() { + if (this._focused) + return; + + this._prevKeyFocusActor = global.stage.get_key_focus(); + + this._focusActorChangedId = global.stage.connect('notify::key-focus', this._focusActorChanged.bind(this)); + + if (!this._actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false)) + this._actor.grab_key_focus(); + + this._focused = true; + } + + _focusUngrabbed() { + if (!this._focused) + return false; + + if (this._focusActorChangedId > 0) { + global.stage.disconnect(this._focusActorChangedId); + this._focusActorChangedId = 0; + } + + this._focused = false; + return true; + } + + _focusActorChanged() { + let focusedActor = global.stage.get_key_focus(); + if (!focusedActor || !this._actor.contains(focusedActor)) + this._focusUngrabbed(); + } + + ungrabFocus() { + if (!this._focusUngrabbed()) + return; + + if (this._prevKeyFocusActor) { + global.stage.set_key_focus(this._prevKeyFocusActor); + this._prevKeyFocusActor = null; + } else { + let focusedActor = global.stage.get_key_focus(); + if (focusedActor && this._actor.contains(focusedActor)) + global.stage.set_key_focus(null); + } + } +}; + +// NotificationPolicy: +// An object that holds all bits of configurable policy related to a notification +// source, such as whether to play sound or honour the critical bit. +// +// A notification without a policy object will inherit the default one. +var NotificationPolicy = class NotificationPolicy { + constructor(params) { + params = Params.parse(params, { enable: true, + enableSound: true, + showBanners: true, + forceExpanded: false, + showInLockScreen: true, + detailsInLockScreen: false + }); + Object.getOwnPropertyNames(params).forEach(key => { + let desc = Object.getOwnPropertyDescriptor(params, key); + Object.defineProperty(this, `_${key}`, desc); + }); + } + + // Do nothing for the default policy. These methods are only useful for the + // GSettings policy. + store() { } + destroy() { } + + get enable() { + return this._enable; + } + + get enableSound() { + return this._enableSound; + } + + get showBanners() { + return this._showBanners; + } + + get forceExpanded() { + return this._forceExpanded; + } + + get showInLockScreen() { + return this._showInLockScreen; + } + + get detailsInLockScreen() { + return this._detailsInLockScreen; + } +}; +Signals.addSignalMethods(NotificationPolicy.prototype); + +var NotificationGenericPolicy = +class NotificationGenericPolicy extends NotificationPolicy { + constructor() { + super(); + this.id = 'generic'; + + this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' }); + this._masterSettings.connect('changed', this._changed.bind(this)); + } + + store() { } + + destroy() { + this._masterSettings.run_dispose(); + } + + _changed(settings, key) { + this.emit('policy-changed', key); + } + + get showBanners() { + return this._masterSettings.get_boolean('show-banners'); + } + + get showInLockScreen() { + return this._masterSettings.get_boolean('show-in-lock-screen'); + } +}; + +var NotificationApplicationPolicy = +class NotificationApplicationPolicy extends NotificationPolicy { + constructor(id) { + super(); + + this.id = id; + this._canonicalId = this._canonicalizeId(id); + + this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' }); + this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application', + path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' }); + + this._masterSettings.connect('changed', this._changed.bind(this)); + this._settings.connect('changed', this._changed.bind(this)); + } + + store() { + this._settings.set_string('application-id', this.id + '.desktop'); + + let apps = this._masterSettings.get_strv('application-children'); + if (apps.indexOf(this._canonicalId) < 0) { + apps.push(this._canonicalId); + this._masterSettings.set_strv('application-children', apps); + } + } + + destroy() { + this._masterSettings.run_dispose(); + this._settings.run_dispose(); + } + + _changed(settings, key) { + this.emit('policy-changed', key); + if (key == 'enable') + this.emit('enable-changed'); + } + + _canonicalizeId(id) { + // Keys are restricted to lowercase alphanumeric characters and dash, + // and two dashes cannot be in succession + return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-'); + } + + get enable() { + return this._settings.get_boolean('enable'); + } + + get enableSound() { + return this._settings.get_boolean('enable-sound-alerts'); + } + + get showBanners() { + return this._masterSettings.get_boolean('show-banners') && + this._settings.get_boolean('show-banners'); + } + + get forceExpanded() { + return this._settings.get_boolean('force-expanded'); + } + + get showInLockScreen() { + return this._masterSettings.get_boolean('show-in-lock-screen') && + this._settings.get_boolean('show-in-lock-screen'); + } + + get detailsInLockScreen() { + return this._settings.get_boolean('details-in-lock-screen'); + } +}; + +// Notification: +// @source: the notification's Source +// @title: the title +// @banner: the banner text +// @params: optional additional params +// +// Creates a notification. In the banner mode, the notification +// will show an icon, @title (in bold) and @banner, all on a single +// line (with @banner ellipsized if necessary). +// +// The notification will be expandable if either it has additional +// elements that were added to it or if the @banner text did not +// fit fully in the banner mode. When the notification is expanded, +// the @banner text from the top line is always removed. The complete +// @banner text is added as the first element in the content section, +// unless 'customContent' parameter with the value 'true' is specified +// in @params. +// +// Additional notification content can be added with addActor() and +// addBody() methods. The notification content is put inside a +// scrollview, so if it gets too tall, the notification will scroll +// rather than continue to grow. In addition to this main content +// area, there is also a single-row action area, which is not +// scrolled and can contain a single actor. The action area can +// be set by calling setActionArea() method. There is also a +// convenience method addButton() for adding a button to the action +// area. +// +// If @params contains a 'customContent' parameter with the value %true, +// then @banner will not be shown in the body of the notification when the +// notification is expanded and calls to update() will not clear the content +// unless 'clear' parameter with value %true is explicitly specified. +// +// By default, the icon shown is the same as the source's. +// However, if @params contains a 'gicon' parameter, the passed in gicon +// will be used. +// +// You can add a secondary icon to the banner with 'secondaryGIcon'. There +// is no fallback for this icon. +// +// If @params contains 'bannerMarkup', with the value %true, a subset (, +// and ) of the markup in [1] will be interpreted within @banner. If +// the parameter is not present, then anything that looks like markup +// in @banner will appear literally in the output. +// +// If @params contains a 'clear' parameter with the value %true, then +// the content and the action area of the notification will be cleared. +// The content area is also always cleared if 'customContent' is false +// because it might contain the @banner that didn't fit in the banner mode. +// +// If @params contains 'soundName' or 'soundFile', the corresponding +// event sound is played when the notification is shown (if the policy for +// @source allows playing sounds). +// +// [1] https://developer.gnome.org/notification-spec/#markup +var Notification = class Notification { + constructor(source, title, banner, params) { + this.source = source; + this.title = title; + this.urgency = Urgency.NORMAL; + this.resident = false; + // 'transient' is a reserved keyword in JS, so we have to use an alternate variable name + this.isTransient = false; + this.privacyScope = PrivacyScope.USER; + this.forFeedback = false; + this._acknowledged = false; + this.bannerBodyText = null; + this.bannerBodyMarkup = false; + this._soundName = null; + this._soundFile = null; + this._soundPlayed = false; + this.actions = []; + + // If called with only one argument we assume the caller + // will call .update() later on. This is the case of + // NotificationDaemon, which wants to use the same code + // for new and updated notifications + if (arguments.length != 1) + this.update(title, banner, params); + } + + // update: + // @title: the new title + // @banner: the new banner + // @params: as in the Notification constructor + // + // Updates the notification by regenerating its icon and updating + // the title/banner. If @params.clear is %true, it will also + // remove any additional actors/action buttons previously added. + update(title, banner, params) { + params = Params.parse(params, { gicon: null, + secondaryGIcon: null, + bannerMarkup: false, + clear: false, + datetime: null, + soundName: null, + soundFile: null }); + + this.title = title; + this.bannerBodyText = banner; + this.bannerBodyMarkup = params.bannerMarkup; + + if (params.datetime) + this.datetime = params.datetime; + else + this.datetime = GLib.DateTime.new_now_local(); + + if (params.gicon || params.clear) + this.gicon = params.gicon; + + if (params.secondaryGIcon || params.clear) + this.secondaryGIcon = params.secondaryGIcon; + + if (params.clear) + this.actions = []; + + if (this._soundName != params.soundName || + this._soundFile != params.soundFile) { + this._soundName = params.soundName; + this._soundFile = params.soundFile; + this._soundPlayed = false; + } + + this.emit('updated', params.clear); + } + + // addAction: + // @label: the label for the action's button + // @callback: the callback for the action + addAction(label, callback) { + this.actions.push({ label: label, callback: callback }); + } + + get acknowledged() { + return this._acknowledged; + } + + set acknowledged(v) { + if (this._acknowledged == v) + return; + this._acknowledged = v; + this.emit('acknowledged-changed'); + } + + setUrgency(urgency) { + this.urgency = urgency; + } + + setResident(resident) { + this.resident = resident; + } + + setTransient(isTransient) { + this.isTransient = isTransient; + } + + setForFeedback(forFeedback) { + this.forFeedback = forFeedback; + } + + setPrivacyScope(privacyScope) { + this.privacyScope = privacyScope; + } + + playSound() { + if (this._soundPlayed) + return; + + if (!this.source.policy.enableSound) { + this._soundPlayed = true; + return; + } + + let player = global.display.get_sound_player(); + if (this._soundName) + player.play_from_theme(this._soundName, this.title, null); + else if (this._soundFile) + player.play_from_file(this._soundFile, this.title, null); + } + + // Allow customizing the banner UI: + // the default implementation defers the creation to + // the source (which will create a NotificationBanner), + // so customization can be done by subclassing either + // Notification or Source + createBanner() { + return this.source.createBanner(this); + } + + activate() { + this.emit('activated'); + if (!this.resident) + this.destroy(); + } + + destroy(reason) { + if (!reason) + reason = NotificationDestroyedReason.DISMISSED; + this.emit('destroy', reason); + } +}; +Signals.addSignalMethods(Notification.prototype); + +var NotificationBanner = +class NotificationBanner extends Calendar.NotificationMessage { + constructor(notification) { + super(notification); + + this.actor.can_focus = false; + this.actor.add_style_class_name('notification-banner'); + + this._buttonBox = null; + + this._addActions(); + this._addSecondaryIcon(); + + this._activatedId = this.notification.connect('activated', () => { + // We hide all types of notifications once the user clicks on + // them because the common outcome of clicking should be the + // relevant window being brought forward and the user's + // attention switching to the window. + this.emit('done-displaying'); + }); + } + + _disconnectNotificationSignals() { + super._disconnectNotificationSignals(); + + if (this._activatedId) + this.notification.disconnect(this._activatedId); + this._activatedId = 0; + } + + _onUpdated(n, clear) { + super._onUpdated(n, clear); + + if (clear) { + this.setSecondaryActor(null); + this.setActionArea(null); + this._buttonBox = null; + } + + this._addActions(); + this._addSecondaryIcon(); + } + + _addActions() { + this.notification.actions.forEach(action => { + this.addAction(action.label, action.callback); + }); + } + + _addSecondaryIcon() { + if (this.notification.secondaryGIcon) { + let icon = new St.Icon({ gicon: this.notification.secondaryGIcon, + x_align: Clutter.ActorAlign.END }); + this.setSecondaryActor(icon); + } + } + + addButton(button, callback) { + if (!this._buttonBox) { + this._buttonBox = new St.BoxLayout({ style_class: 'notification-actions', + x_expand: true }); + this.setActionArea(this._buttonBox); + global.focus_manager.add_group(this._buttonBox); + } + + if (this._buttonBox.get_n_children() >= MAX_NOTIFICATION_BUTTONS) + return null; + + this._buttonBox.add(button); + button.connect('clicked', () => { + callback(); + + if (!this.notification.resident) { + // We don't hide a resident notification when the user invokes one of its actions, + // because it is common for such notifications to update themselves with new + // information based on the action. We'd like to display the updated information + // in place, rather than pop-up a new notification. + this.emit('done-displaying'); + this.notification.destroy(); + } + }); + + return button; + } + + addAction(label, callback) { + let button = new St.Button({ style_class: 'notification-button', + label: label, + x_expand: true, + can_focus: true }); + + return this.addButton(button, callback); + } +}; + +var SourceActor = GObject.registerClass( +class SourceActor extends St.Widget { + _init(source, size) { + super._init(); + + this._source = source; + this._size = size; + + this.actor = this; + this.connect('destroy', () => { + this._source.disconnect(this._iconUpdatedId); + this._actorDestroyed = true; + }); + this._actorDestroyed = false; + + let scale_factor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + this._iconBin = new St.Bin({ x_fill: true, + x_expand: true, + height: size * scale_factor, + width: size * scale_factor }); + + this.add_actor(this._iconBin); + + this._iconUpdatedId = this._source.connect('icon-updated', this._updateIcon.bind(this)); + this._updateIcon(); + } + + setIcon(icon) { + this._iconBin.child = icon; + this._iconSet = true; + } + + _updateIcon() { + if (this._actorDestroyed) + return; + + if (!this._iconSet) + this._iconBin.child = this._source.createIcon(this._size); + } +}); + +var SourceActorWithLabel = GObject.registerClass( +class SourceActorWithLabel extends SourceActor { + _init(source, size) { + super._init(source, size); + + this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER, + x_expand: true, + y_align: Clutter.ActorAlign.CENTER, + y_expand: true }); + + this._counterBin = new St.Bin({ style_class: 'summary-source-counter', + child: this._counterLabel, + layout_manager: new Clutter.BinLayout() }); + this._counterBin.hide(); + + this._counterBin.connect('style-changed', () => { + let themeNode = this._counterBin.get_theme_node(); + this._counterBin.translation_x = themeNode.get_length('-shell-counter-overlap-x'); + this._counterBin.translation_y = themeNode.get_length('-shell-counter-overlap-y'); + }); + + this.add_actor(this._counterBin); + + this._countUpdatedId = this._source.connect('count-updated', this._updateCount.bind(this)); + this._updateCount(); + + this.connect('destroy', () => { + this._source.disconnect(this._countUpdatedId); + }); + } + + vfunc_allocate(box, flags) { + super.vfunc_allocate(box, flags); + + let childBox = new Clutter.ActorBox(); + + let [minWidth, minHeight, naturalWidth, naturalHeight] = this._counterBin.get_preferred_size(); + let direction = this.get_text_direction(); + + if (direction == Clutter.TextDirection.LTR) { + // allocate on the right in LTR + childBox.x1 = box.x2 - naturalWidth; + childBox.x2 = box.x2; + } else { + // allocate on the left in RTL + childBox.x1 = 0; + childBox.x2 = naturalWidth; + } + + childBox.y1 = box.y2 - naturalHeight; + childBox.y2 = box.y2; + + this._counterBin.allocate(childBox, flags); + } + + _updateCount() { + if (this._actorDestroyed) + return; + + this._counterBin.visible = this._source.countVisible; + + let text; + if (this._source.count < 100) + text = this._source.count.toString(); + else + text = String.fromCharCode(0x22EF); // midline horizontal ellipsis + + this._counterLabel.set_text(text); + } +}); + +var Source = class Source { + constructor(title, iconName) { + this.SOURCE_ICON_SIZE = 48; + + this.title = title; + this.iconName = iconName; + + this.isChat = false; + + this.notifications = []; + + this._policy = null; + } + + get policy() { + if (!this._policy) + this._policy = this._createPolicy(); + return this._policy; + } + + set policy(policy) { + if (this._policy) + this._policy.destroy(); + this._policy = policy; + } + + get count() { + return this.notifications.length; + } + + get unseenCount() { + return this.notifications.filter(n => !n.acknowledged).length; + } + + get countVisible() { + return this.count > 1; + } + + countUpdated() { + this.emit('count-updated'); + } + + _createPolicy() { + return new NotificationPolicy(); + } + + get narrowestPrivacyScope() { + return this.notifications.every(n => n.privacyScope == PrivacyScope.SYSTEM) ? PrivacyScope.SYSTEM + : PrivacyScope.USER; + } + + setTitle(newTitle) { + this.title = newTitle; + this.emit('title-changed'); + } + + createBanner(notification) { + return new NotificationBanner(notification); + } + + // Called to create a new icon actor. + // Provides a sane default implementation, override if you need + // something more fancy. + createIcon(size) { + return new St.Icon({ gicon: this.getIcon(), + icon_size: size }); + } + + getIcon() { + return new Gio.ThemedIcon({ name: this.iconName }); + } + + _onNotificationDestroy(notification) { + let index = this.notifications.indexOf(notification); + if (index < 0) + return; + + this.notifications.splice(index, 1); + if (this.notifications.length == 0) + this.destroy(); + + this.countUpdated(); + } + + pushNotification(notification) { + if (this.notifications.indexOf(notification) >= 0) + return; + + while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE) + this.notifications.shift().destroy(NotificationDestroyedReason.EXPIRED); + + notification.connect('destroy', this._onNotificationDestroy.bind(this)); + notification.connect('acknowledged-changed', this.countUpdated.bind(this)); + this.notifications.push(notification); + this.emit('notification-added', notification); + + this.countUpdated(); + } + + notify(notification) { + notification.acknowledged = false; + this.pushNotification(notification); + + if (this.policy.showBanners || notification.urgency == Urgency.CRITICAL) { + this.emit('notify', notification); + } else { + notification.playSound(); + } + } + + destroy(reason) { + this.policy.destroy(); + + let notifications = this.notifications; + this.notifications = []; + + for (let i = 0; i < notifications.length; i++) + notifications[i].destroy(reason); + + this.emit('destroy', reason); + } + + iconUpdated() { + this.emit('icon-updated'); + } + + // To be overridden by subclasses + open() { + } + + destroyNonResidentNotifications() { + for (let i = this.notifications.length - 1; i >= 0; i--) + if (!this.notifications[i].resident) + this.notifications[i].destroy(); + + this.countUpdated(); + } +}; +Signals.addSignalMethods(Source.prototype); + +var MessageTray = class MessageTray { + constructor() { + this._presence = new GnomeSession.Presence((proxy, error) => { + this._onStatusChanged(proxy.status); + }); + this._busy = false; + this._bannerBlocked = false; + this._presence.connectSignal('StatusChanged', (proxy, senderName, [status]) => { + this._onStatusChanged(status); + }); + + global.stage.connect('enter-event', (a, ev) => { + // HACK: St uses ClutterInputDevice for hover tracking, which + // misses relevant X11 events when untracked actors are + // involved (read: the notification banner in normal mode), + // so fix up Clutter's view of the pointer position in + // that case. + let related = ev.get_related(); + if (!related || this.actor.contains(related)) + global.sync_pointer(); + }); + + this.actor = new St.Widget({ visible: false, + clip_to_allocation: true, + layout_manager: new Clutter.BinLayout() }); + let constraint = new Layout.MonitorConstraint({ primary: true }); + Main.layoutManager.panelBox.bind_property('visible', + constraint, 'work-area', + GObject.BindingFlags.SYNC_CREATE); + this.actor.add_constraint(constraint); + + this._bannerBin = new St.Widget({ name: 'notification-container', + reactive: true, + track_hover: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + x_expand: true, + layout_manager: new Clutter.BinLayout() }); + this._bannerBin.connect('key-release-event', + this._onNotificationKeyRelease.bind(this)); + this._bannerBin.connect('notify::hover', + this._onNotificationHoverChanged.bind(this)); + this.actor.add_actor(this._bannerBin); + + this._notificationFocusGrabber = new FocusGrabber(this._bannerBin); + this._notificationQueue = []; + this._notification = null; + this._banner = null; + this._bannerClickedId = 0; + + this._userActiveWhileNotificationShown = false; + + this.idleMonitor = Meta.IdleMonitor.get_core(); + + this._useLongerNotificationLeftTimeout = false; + + // pointerInNotification is sort of a misnomer -- it tracks whether + // a message tray notification should expand. The value is + // partially driven by the hover state of the notification, but has + // a lot of complex state related to timeouts and the current + // state of the pointer when a notification pops up. + this._pointerInNotification = false; + + // This tracks this._bannerBin.hover and is used to fizzle + // out non-changing hover notifications in onNotificationHoverChanged. + this._notificationHovered = false; + + this._notificationState = State.HIDDEN; + this._notificationTimeoutId = 0; + this._notificationRemoved = false; + + Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false }); + Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true }); + + global.display.connect('in-fullscreen-changed', this._updateState.bind(this)); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + + Main.overview.connect('window-drag-begin', + this._onDragBegin.bind(this)); + Main.overview.connect('window-drag-cancelled', + this._onDragEnd.bind(this)); + Main.overview.connect('window-drag-end', + this._onDragEnd.bind(this)); + + Main.overview.connect('item-drag-begin', + this._onDragBegin.bind(this)); + Main.overview.connect('item-drag-cancelled', + this._onDragEnd.bind(this)); + Main.overview.connect('item-drag-end', + this._onDragEnd.bind(this)); + + Main.xdndHandler.connect('drag-begin', + this._onDragBegin.bind(this)); + Main.xdndHandler.connect('drag-end', + this._onDragEnd.bind(this)); + + Main.wm.addKeybinding('focus-active-notification', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.NONE, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._expandActiveNotification.bind(this)); + + this._sources = new Map(); + + this._sessionUpdated(); + } + + _sessionUpdated() { + this._updateState(); + } + + _onDragBegin() { + Shell.util_set_hidden_from_pick(this.actor, true); + } + + _onDragEnd() { + Shell.util_set_hidden_from_pick(this.actor, false); + } + + get bannerAlignment() { + return this._bannerBin.get_x_align(); + } + + set bannerAlignment(align) { + this._bannerBin.set_x_align(align); + } + + _onNotificationKeyRelease(actor, event) { + if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) { + this._expireNotification(); + return Clutter.EVENT_STOP; + } + + return Clutter.EVENT_PROPAGATE; + } + + _expireNotification() { + this._notificationExpired = true; + this._updateState(); + } + + get queueCount() { + return this._notificationQueue.length; + } + + set bannerBlocked(v) { + if (this._bannerBlocked == v) + return; + this._bannerBlocked = v; + this._updateState(); + } + + contains(source) { + return this._sources.has(source); + } + + add(source) { + if (this.contains(source)) { + log('Trying to re-add source ' + source.title); + return; + } + + // Register that we got a notification for this source + source.policy.store(); + + source.policy.connect('enable-changed', () => { + this._onSourceEnableChanged(source.policy, source); + }); + source.policy.connect('policy-changed', this._updateState.bind(this)); + this._onSourceEnableChanged(source.policy, source); + } + + _addSource(source) { + let obj = { + source: source, + notifyId: 0, + destroyId: 0, + }; + + this._sources.set(source, obj); + + obj.notifyId = source.connect('notify', this._onNotify.bind(this)); + obj.destroyId = source.connect('destroy', this._onSourceDestroy.bind(this)); + + this.emit('source-added', source); + } + + _removeSource(source) { + let obj = this._sources.get(source); + this._sources.delete(source); + + source.disconnect(obj.notifyId); + source.disconnect(obj.destroyId); + + this.emit('source-removed', source); + } + + getSources() { + return [...this._sources.keys()]; + } + + _onSourceEnableChanged(policy, source) { + let wasEnabled = this.contains(source); + let shouldBeEnabled = policy.enable; + + if (wasEnabled != shouldBeEnabled) { + if (shouldBeEnabled) + this._addSource(source); + else + this._removeSource(source); + } + } + + _onSourceDestroy(source) { + this._removeSource(source); + } + + _onNotificationDestroy(notification) { + if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) { + this._updateNotificationTimeout(0); + this._notificationRemoved = true; + this._updateState(); + return; + } + + let index = this._notificationQueue.indexOf(notification); + if (index != -1) { + this._notificationQueue.splice(index, 1); + this.emit('queue-changed'); + } + } + + _onNotify(source, notification) { + if (this._notification == notification) { + // If a notification that is being shown is updated, we update + // how it is shown and extend the time until it auto-hides. + // If a new notification is updated while it is being hidden, + // we stop hiding it and show it again. + this._updateShowingNotification(); + } else if (this._notificationQueue.indexOf(notification) < 0) { + // If the queue is "full", we skip banner mode and just show a small + // indicator in the panel; however do make an exception for CRITICAL + // notifications, as only banner mode allows expansion. + let bannerCount = this._notification ? 1 : 0; + let full = (this.queueCount + bannerCount >= MAX_NOTIFICATIONS_IN_QUEUE); + if (!full || notification.urgency == Urgency.CRITICAL) { + notification.connect('destroy', + this._onNotificationDestroy.bind(this)); + this._notificationQueue.push(notification); + this._notificationQueue.sort( + (n1, n2) => n2.urgency - n1.urgency + ); + this.emit('queue-changed'); + } + } + this._updateState(); + } + + _resetNotificationLeftTimeout() { + this._useLongerNotificationLeftTimeout = false; + if (this._notificationLeftTimeoutId) { + Mainloop.source_remove(this._notificationLeftTimeoutId); + this._notificationLeftTimeoutId = 0; + this._notificationLeftMouseX = -1; + this._notificationLeftMouseY = -1; + } + } + + _onNotificationHoverChanged() { + if (this._bannerBin.hover == this._notificationHovered) + return; + + this._notificationHovered = this._bannerBin.hover; + if (this._notificationHovered) { + this._resetNotificationLeftTimeout(); + + if (this._showNotificationMouseX >= 0) { + let actorAtShowNotificationPosition = + global.stage.get_actor_at_pos(Clutter.PickMode.ALL, this._showNotificationMouseX, this._showNotificationMouseY); + this._showNotificationMouseX = -1; + this._showNotificationMouseY = -1; + // Don't set this._pointerInNotification to true if the pointer was initially in the area where the notification + // popped up. That way we will not be expanding notifications that happen to pop up over the pointer + // automatically. Instead, the user is able to expand the notification by mousing away from it and then + // mousing back in. Because this is an expected action, we set the boolean flag that indicates that a longer + // timeout should be used before popping down the notification. + if (this._bannerBin.contains(actorAtShowNotificationPosition)) { + this._useLongerNotificationLeftTimeout = true; + return; + } + } + + this._pointerInNotification = true; + this._updateState(); + } else { + // We record the position of the mouse the moment it leaves the tray. These coordinates are used in + // this._onNotificationLeftTimeout() to determine if the mouse has moved far enough during the initial timeout for us + // to consider that the user intended to leave the tray and therefore hide the tray. If the mouse is still + // close to its previous position, we extend the timeout once. + let [x, y, mods] = global.get_pointer(); + this._notificationLeftMouseX = x; + this._notificationLeftMouseY = y; + + // We wait just a little before hiding the message tray in case the user quickly moves the mouse back into it. + // We wait for a longer period if the notification popped up where the mouse pointer was already positioned. + // That gives the user more time to mouse away from the notification and mouse back in in order to expand it. + let timeout = this._useLongerNotificationLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000; + this._notificationLeftTimeoutId = Mainloop.timeout_add(timeout, this._onNotificationLeftTimeout.bind(this)); + GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout'); + } + } + + _onStatusChanged(status) { + if (status == GnomeSession.PresenceStatus.BUSY) { + // remove notification and allow the summary to be closed now + this._updateNotificationTimeout(0); + this._busy = true; + } else if (status != GnomeSession.PresenceStatus.IDLE) { + // We preserve the previous value of this._busy if the status turns to IDLE + // so that we don't start showing notifications queued during the BUSY state + // as the screensaver gets activated. + this._busy = false; + } + + this._updateState(); + } + + _onNotificationLeftTimeout() { + let [x, y, mods] = global.get_pointer(); + // We extend the timeout once if the mouse moved no further than MOUSE_LEFT_ACTOR_THRESHOLD to either side. + if (this._notificationLeftMouseX > -1 && + y < this._notificationLeftMouseY + MOUSE_LEFT_ACTOR_THRESHOLD && + y > this._notificationLeftMouseY - MOUSE_LEFT_ACTOR_THRESHOLD && + x < this._notificationLeftMouseX + MOUSE_LEFT_ACTOR_THRESHOLD && + x > this._notificationLeftMouseX - MOUSE_LEFT_ACTOR_THRESHOLD) { + this._notificationLeftMouseX = -1; + this._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000, + this._onNotificationLeftTimeout.bind(this)); + GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout'); + } else { + this._notificationLeftTimeoutId = 0; + this._useLongerNotificationLeftTimeout = false; + this._pointerInNotification = false; + this._updateNotificationTimeout(0); + this._updateState(); + } + return GLib.SOURCE_REMOVE; + } + + _escapeTray() { + this._pointerInNotification = false; + this._updateNotificationTimeout(0); + this._updateState(); + } + + // All of the logic for what happens when occurs here; the various + // event handlers merely update variables such as + // 'this._pointerInNotification', 'this._traySummoned', etc, and + // _updateState() figures out what (if anything) needs to be done + // at the present time. + _updateState() { + let hasMonitor = Main.layoutManager.primaryMonitor != null; + this.actor.visible = !this._bannerBlocked && hasMonitor && this._banner != null; + if (this._bannerBlocked || !hasMonitor) + return; + + // If our state changes caused _updateState to be called, + // just exit now to prevent reentrancy issues. + if (this._updatingState) + return; + + this._updatingState = true; + + // Filter out acknowledged notifications. + let changed = false; + this._notificationQueue = this._notificationQueue.filter(n => { + changed = changed || n.acknowledged; + return !n.acknowledged; + }); + + if (changed) + this.emit('queue-changed'); + + let hasNotifications = Main.sessionMode.hasNotifications; + + if (this._notificationState == State.HIDDEN) { + let nextNotification = this._notificationQueue[0] || null; + if (hasNotifications && nextNotification) { + let limited = this._busy || Main.layoutManager.primaryMonitor.inFullscreen; + let showNextNotification = (!limited || nextNotification.forFeedback || nextNotification.urgency == Urgency.CRITICAL); + if (showNextNotification) + this._showNotification(); + } + } else if (this._notificationState == State.SHOWN) { + let expired = (this._userActiveWhileNotificationShown && + this._notificationTimeoutId == 0 && + this._notification.urgency != Urgency.CRITICAL && + !this._banner.focused && + !this._pointerInNotification) || this._notificationExpired; + let mustClose = (this._notificationRemoved || !hasNotifications || expired); + + if (mustClose) { + let animate = hasNotifications && !this._notificationRemoved; + this._hideNotification(animate); + } else if (this._pointerInNotification && !this._banner.expanded) { + this._expandBanner(false); + } else if (this._pointerInNotification) { + this._ensureBannerFocused(); + } + } + + this._updatingState = false; + + // Clean transient variables that are used to communicate actions + // to updateState() + this._notificationExpired = false; + } + + _tween(actor, statevar, value, params) { + let onComplete = params.onComplete; + let onCompleteScope = params.onCompleteScope; + let onCompleteParams = params.onCompleteParams; + + params.onComplete = this._tweenComplete; + params.onCompleteScope = this; + params.onCompleteParams = [statevar, value, onComplete, onCompleteScope, onCompleteParams]; + + // Remove other tweens that could mess with the state machine + Tweener.removeTweens(actor); + Tweener.addTween(actor, params); + + let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING; + this[statevar] = valuing; + } + + _tweenComplete(statevar, value, onComplete, onCompleteScope, onCompleteParams) { + this[statevar] = value; + if (onComplete) + onComplete.apply(onCompleteScope, onCompleteParams); + this._updateState(); + } + + _clampOpacity() { + this._bannerBin.opacity = Math.max(0, Math.min(this._bannerBin._opacity, 255)); + } + + _onIdleMonitorBecameActive() { + this._userActiveWhileNotificationShown = true; + this._updateNotificationTimeout(2000); + this._updateState(); + } + + _showNotification() { + this._notification = this._notificationQueue.shift(); + this.emit('queue-changed'); + + this._userActiveWhileNotificationShown = this.idleMonitor.get_idletime() <= IDLE_TIME; + if (!this._userActiveWhileNotificationShown) { + // If the user isn't active, set up a watch to let us know + // when the user becomes active. + this.idleMonitor.add_user_active_watch(this._onIdleMonitorBecameActive.bind(this)); + } + + this._banner = this._notification.createBanner(); + this._bannerClickedId = this._banner.connect('done-displaying', + this._escapeTray.bind(this)); + this._bannerUnfocusedId = this._banner.connect('unfocused', () => { + this._updateState(); + }); + + this._bannerBin.add_actor(this._banner.actor); + + this._bannerBin._opacity = 0; + this._bannerBin.opacity = 0; + this._bannerBin.y = -this._banner.actor.height; + this.actor.show(); + + Meta.disable_unredirect_for_display(global.display); + this._updateShowingNotification(); + + let [x, y, mods] = global.get_pointer(); + // We save the position of the mouse at the time when we started showing the notification + // in order to determine if the notification popped up under it. We make that check if + // the user starts moving the mouse and _onNotificationHoverChanged() gets called. We don't + // expand the notification if it just happened to pop up under the mouse unless the user + // explicitly mouses away from it and then mouses back in. + this._showNotificationMouseX = x; + this._showNotificationMouseY = y; + // We save the coordinates of the mouse at the time when we started showing the notification + // and then we update it in _notificationTimeout(). We don't pop down the notification if + // the mouse is moving towards it or within it. + this._lastSeenMouseX = x; + this._lastSeenMouseY = y; + + this._resetNotificationLeftTimeout(); + } + + _updateShowingNotification() { + this._notification.acknowledged = true; + this._notification.playSound(); + + // We auto-expand notifications with CRITICAL urgency, or for which the relevant setting + // is on in the control center. + if (this._notification.urgency == Urgency.CRITICAL || + this._notification.source.policy.forceExpanded) + this._expandBanner(true); + + // We tween all notifications to full opacity. This ensures that both new notifications and + // notifications that might have been in the process of hiding get full opacity. + // + // We tween any notification showing in the banner mode to the appropriate height + // (which is banner height or expanded height, depending on the notification state) + // This ensures that both new notifications and notifications in the banner mode that might + // have been in the process of hiding are shown with the correct height. + // + // We use this._showNotificationCompleted() onComplete callback to extend the time the updated + // notification is being shown. + + let tweenParams = { y: 0, + _opacity: 255, + time: ANIMATION_TIME, + transition: 'easeOutBack', + onUpdate: this._clampOpacity, + onUpdateScope: this, + onComplete: this._showNotificationCompleted, + onCompleteScope: this + }; + + this._tween(this._bannerBin, '_notificationState', State.SHOWN, tweenParams); + } + + _showNotificationCompleted() { + if (this._notification.urgency != Urgency.CRITICAL) + this._updateNotificationTimeout(NOTIFICATION_TIMEOUT * 1000); + } + + _updateNotificationTimeout(timeout) { + if (this._notificationTimeoutId) { + Mainloop.source_remove(this._notificationTimeoutId); + this._notificationTimeoutId = 0; + } + if (timeout > 0) { + this._notificationTimeoutId = + Mainloop.timeout_add(timeout, + this._notificationTimeout.bind(this)); + GLib.Source.set_name_by_id(this._notificationTimeoutId, '[gnome-shell] this._notificationTimeout'); + } + } + + _notificationTimeout() { + let [x, y, mods] = global.get_pointer(); + if (y < this._lastSeenMouseY - 10 && !this._notificationHovered) { + // The mouse is moving towards the notification, so don't + // hide it yet. (We just create a new timeout (and destroy + // the old one) each time because the bookkeeping is + // simpler.) + this._updateNotificationTimeout(1000); + } else if (this._useLongerNotificationLeftTimeout && !this._notificationLeftTimeoutId && + (x != this._lastSeenMouseX || y != this._lastSeenMouseY)) { + // Refresh the timeout if the notification originally + // popped up under the pointer, and the pointer is hovering + // inside it. + this._updateNotificationTimeout(1000); + } else { + this._notificationTimeoutId = 0; + this._updateState(); + } + + this._lastSeenMouseX = x; + this._lastSeenMouseY = y; + return GLib.SOURCE_REMOVE; + } + + _hideNotification(animate) { + this._notificationFocusGrabber.ungrabFocus(); + + if (this._bannerClickedId) { + this._banner.disconnect(this._bannerClickedId); + this._bannerClickedId = 0; + } + if (this._bannerUnfocusedId) { + this._banner.disconnect(this._bannerUnfocusedId); + this._bannerUnfocusedId = 0; + } + + this._resetNotificationLeftTimeout(); + + if (animate) { + this._tween(this._bannerBin, '_notificationState', State.HIDDEN, + { y: -this._bannerBin.height, + _opacity: 0, + time: ANIMATION_TIME, + transition: 'easeOutBack', + onUpdate: this._clampOpacity, + onUpdateScope: this, + onComplete: this._hideNotificationCompleted, + onCompleteScope: this + }); + } else { + Tweener.removeTweens(this._bannerBin); + this._bannerBin.y = -this._bannerBin.height; + this._bannerBin.opacity = 0; + this._notificationState = State.HIDDEN; + this._hideNotificationCompleted(); + } + } + + _hideNotificationCompleted() { + let notification = this._notification; + this._notification = null; + if (notification.isTransient) + notification.destroy(NotificationDestroyedReason.EXPIRED); + + this._pointerInNotification = false; + this._notificationRemoved = false; + Meta.enable_unredirect_for_display(global.display); + + this._banner.actor.destroy(); + this._banner = null; + this.actor.hide(); + } + + _expandActiveNotification() { + if (!this._banner) + return; + + this._expandBanner(false); + } + + _expandBanner(autoExpanding) { + // Don't animate changes in notifications that are auto-expanding. + this._banner.expand(!autoExpanding); + + // Don't focus notifications that are auto-expanding. + if (!autoExpanding) + this._ensureBannerFocused(); + } + + _ensureBannerFocused() { + this._notificationFocusGrabber.grabFocus(); + } +}; +Signals.addSignalMethods(MessageTray.prototype); + +var SystemNotificationSource = class SystemNotificationSource extends Source { + constructor() { + super(_("System Information"), 'dialog-information-symbolic'); + } + + open() { + this.destroy(); + } +}; diff --git a/js/ui/modalDialog.js b/js/ui/modalDialog.js new file mode 100644 index 0000000..258e3b0 --- /dev/null +++ b/js/ui/modalDialog.js @@ -0,0 +1,250 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atk, Clutter, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Dialog = imports.ui.dialog; +const Layout = imports.ui.layout; +const Lightbox = imports.ui.lightbox; +const Main = imports.ui.main; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; + +var OPEN_AND_CLOSE_TIME = 0.1; +var FADE_OUT_DIALOG_TIME = 1.0; + +var State = { + OPENED: 0, + CLOSED: 1, + OPENING: 2, + CLOSING: 3, + FADED_OUT: 4 +}; + +var ModalDialog = class { + constructor(params) { + params = Params.parse(params, { shellReactive: false, + styleClass: null, + actionMode: Shell.ActionMode.SYSTEM_MODAL, + shouldFadeIn: true, + shouldFadeOut: true, + destroyOnClose: true }); + + this.state = State.CLOSED; + this._hasModal = false; + this._actionMode = params.actionMode; + this._shellReactive = params.shellReactive; + this._shouldFadeIn = params.shouldFadeIn; + this._shouldFadeOut = params.shouldFadeOut; + this._destroyOnClose = params.destroyOnClose; + + this._group = new St.Widget({ visible: false, + x: 0, + y: 0, + accessible_role: Atk.Role.DIALOG }); + Main.layoutManager.modalDialogGroup.add_actor(this._group); + + let constraint = new Clutter.BindConstraint({ source: global.stage, + coordinate: Clutter.BindCoordinate.ALL }); + this._group.add_constraint(constraint); + + this._group.connect('destroy', this._onGroupDestroy.bind(this)); + + this.backgroundStack = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._backgroundBin = new St.Bin({ child: this.backgroundStack, + x_fill: true, y_fill: true }); + this._monitorConstraint = new Layout.MonitorConstraint(); + this._backgroundBin.add_constraint(this._monitorConstraint); + this._group.add_actor(this._backgroundBin); + + this.dialogLayout = new Dialog.Dialog(this.backgroundStack, params.styleClass); + this.contentLayout = this.dialogLayout.contentLayout; + this.buttonLayout = this.dialogLayout.buttonLayout; + + if (!this._shellReactive) { + this._lightbox = new Lightbox.Lightbox(this._group, + { inhibitEvents: true, + radialEffect: true }); + this._lightbox.highlight(this._backgroundBin); + + this._eventBlocker = new Clutter.Actor({ reactive: true }); + this.backgroundStack.add_actor(this._eventBlocker); + } + + global.focus_manager.add_group(this.dialogLayout); + this._initialKeyFocus = null; + this._initialKeyFocusDestroyId = 0; + this._savedKeyFocus = null; + } + + destroy() { + this._group.destroy(); + } + + clearButtons() { + this.dialogLayout.clearButtons(); + } + + setButtons(buttons) { + this.clearButtons(); + + for (let buttonInfo of buttons) + this.addButton(buttonInfo); + } + + addButton(buttonInfo) { + return this.dialogLayout.addButton(buttonInfo); + } + + _onGroupDestroy() { + this.emit('destroy'); + } + + _fadeOpen(onPrimary) { + if (onPrimary) + this._monitorConstraint.primary = true; + else + this._monitorConstraint.index = global.display.get_current_monitor(); + + this.state = State.OPENING; + + this.dialogLayout.opacity = 255; + if (this._lightbox) + this._lightbox.show(); + this._group.opacity = 0; + this._group.show(); + Tweener.addTween(this._group, + { opacity: 255, + time: this._shouldFadeIn ? OPEN_AND_CLOSE_TIME : 0, + transition: 'easeOutQuad', + onComplete: () => { + this.state = State.OPENED; + this.emit('opened'); + } + }); + } + + setInitialKeyFocus(actor) { + if (this._initialKeyFocusDestroyId) + this._initialKeyFocus.disconnect(this._initialKeyFocusDestroyId); + + this._initialKeyFocus = actor; + + this._initialKeyFocusDestroyId = actor.connect('destroy', () => { + this._initialKeyFocus = null; + this._initialKeyFocusDestroyId = 0; + }); + } + + open(timestamp, onPrimary) { + if (this.state == State.OPENED || this.state == State.OPENING) + return true; + + if (!this.pushModal(timestamp)) + return false; + + this._fadeOpen(onPrimary); + return true; + } + + _closeComplete() { + this.state = State.CLOSED; + this._group.hide(); + this.emit('closed'); + + if (this._destroyOnClose) + this.destroy(); + } + + close(timestamp) { + if (this.state == State.CLOSED || this.state == State.CLOSING) + return; + + this.state = State.CLOSING; + this.popModal(timestamp); + this._savedKeyFocus = null; + + if (this._shouldFadeOut) + Tweener.addTween(this._group, + { opacity: 0, + time: OPEN_AND_CLOSE_TIME, + transition: 'easeOutQuad', + onComplete: this._closeComplete.bind(this) + }) + else + this._closeComplete(); + } + + // Drop modal status without closing the dialog; this makes the + // dialog insensitive as well, so it needs to be followed shortly + // by either a close() or a pushModal() + popModal(timestamp) { + if (!this._hasModal) + return; + + let focus = global.stage.key_focus; + if (focus && this._group.contains(focus)) + this._savedKeyFocus = focus; + else + this._savedKeyFocus = null; + Main.popModal(this._group, timestamp); + this._hasModal = false; + + if (!this._shellReactive) + this._eventBlocker.raise_top(); + } + + pushModal(timestamp) { + if (this._hasModal) + return true; + + let params = { actionMode: this._actionMode }; + if (timestamp) + params['timestamp'] = timestamp; + if (!Main.pushModal(this._group, params)) + return false; + + this._hasModal = true; + if (this._savedKeyFocus) { + this._savedKeyFocus.grab_key_focus(); + this._savedKeyFocus = null; + } else { + let focus = this._initialKeyFocus || this.dialogLayout.initialKeyFocus; + focus.grab_key_focus(); + } + + if (!this._shellReactive) + this._eventBlocker.lower_bottom(); + return true; + } + + // This method is like close, but fades the dialog out much slower, + // and leaves the lightbox in place. Once in the faded out state, + // the dialog can be brought back by an open call, or the lightbox + // can be dismissed by a close call. + // + // The main point of this method is to give some indication to the user + // that the dialog reponse has been acknowledged but will take a few + // moments before being processed. + // e.g., if a user clicked "Log Out" then the dialog should go away + // imediately, but the lightbox should remain until the logout is + // complete. + _fadeOutDialog(timestamp) { + if (this.state == State.CLOSED || this.state == State.CLOSING) + return; + + if (this.state == State.FADED_OUT) + return; + + this.popModal(timestamp); + Tweener.addTween(this.dialogLayout, + { opacity: 0, + time: FADE_OUT_DIALOG_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this.state = State.FADED_OUT; + } + }); + } +}; +Signals.addSignalMethods(ModalDialog.prototype); diff --git a/js/ui/mpris.js b/js/ui/mpris.js new file mode 100644 index 0000000..e900bce --- /dev/null +++ b/js/ui/mpris.js @@ -0,0 +1,248 @@ +const { Gio, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Calendar = imports.ui.calendar; +const Main = imports.ui.main; +const MessageList = imports.ui.messageList; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const DBusIface = loadInterfaceXML('org.freedesktop.DBus'); +const DBusProxy = Gio.DBusProxy.makeProxyWrapper(DBusIface); + +const MprisIface = loadInterfaceXML('org.mpris.MediaPlayer2'); +const MprisProxy = Gio.DBusProxy.makeProxyWrapper(MprisIface); + +const MprisPlayerIface = loadInterfaceXML('org.mpris.MediaPlayer2.Player'); +const MprisPlayerProxy = Gio.DBusProxy.makeProxyWrapper(MprisPlayerIface); + +const MPRIS_PLAYER_PREFIX = 'org.mpris.MediaPlayer2.'; + +var MediaMessage = class MediaMessage extends MessageList.Message { + constructor(player) { + super('', ''); + + this._player = player; + + this._icon = new St.Icon({ style_class: 'media-message-cover-icon' }); + this.setIcon(this._icon); + + this._prevButton = this.addMediaControl('media-skip-backward-symbolic', + () => { + this._player.previous(); + }); + + this._playPauseButton = this.addMediaControl(null, + () => { + this._player.playPause(); + }); + + this._nextButton = this.addMediaControl('media-skip-forward-symbolic', + () => { + this._player.next(); + }); + + this._player.connect('changed', this._update.bind(this)); + this._player.connect('closed', this.close.bind(this)); + this._update(); + } + + _onClicked() { + this._player.raise(); + Main.panel.closeCalendar(); + } + + _updateNavButton(button, sensitive) { + button.reactive = sensitive; + } + + _update() { + this.setTitle(this._player.trackArtists.join(', ')); + this.setBody(this._player.trackTitle); + + if (this._player.trackCoverUrl) { + let file = Gio.File.new_for_uri(this._player.trackCoverUrl); + this._icon.gicon = new Gio.FileIcon({ file: file }); + this._icon.remove_style_class_name('fallback'); + } else { + this._icon.icon_name = 'audio-x-generic-symbolic'; + this._icon.add_style_class_name('fallback'); + } + + let isPlaying = this._player.status == 'Playing'; + let iconName = isPlaying ? 'media-playback-pause-symbolic' + : 'media-playback-start-symbolic'; + this._playPauseButton.child.icon_name = iconName; + + this._updateNavButton(this._prevButton, this._player.canGoPrevious); + this._updateNavButton(this._nextButton, this._player.canGoNext); + } +}; + +var MprisPlayer = class MprisPlayer { + constructor(busName) { + this._mprisProxy = new MprisProxy(Gio.DBus.session, busName, + '/org/mpris/MediaPlayer2', + this._onMprisProxyReady.bind(this)); + this._playerProxy = new MprisPlayerProxy(Gio.DBus.session, busName, + '/org/mpris/MediaPlayer2', + this._onPlayerProxyReady.bind(this)); + + this._visible = false; + this._trackArtists = []; + this._trackTitle = ''; + this._trackCoverUrl = ''; + } + + get status() { + return this._playerProxy.PlaybackStatus; + } + + get trackArtists() { + return this._trackArtists; + } + + get trackTitle() { + return this._trackTitle; + } + + get trackCoverUrl() { + return this._trackCoverUrl; + } + + playPause() { + this._playerProxy.PlayPauseRemote(); + } + + get canGoNext() { + return this._playerProxy.CanGoNext; + } + + next() { + this._playerProxy.NextRemote(); + } + + get canGoPrevious() { + return this._playerProxy.CanGoPrevious; + } + + previous() { + this._playerProxy.PreviousRemote(); + } + + raise() { + // The remote Raise() method may run into focus stealing prevention, + // so prefer activating the app via .desktop file if possible + let app = null; + if (this._mprisProxy.DesktopEntry) { + let desktopId = this._mprisProxy.DesktopEntry + '.desktop'; + app = Shell.AppSystem.get_default().lookup_app(desktopId); + } + + if (app) + app.activate(); + else if (this._mprisProxy.CanRaise) + this._mprisProxy.RaiseRemote(); + } + + _close() { + this._mprisProxy.disconnect(this._ownerNotifyId); + this._mprisProxy = null; + + this._playerProxy.disconnect(this._propsChangedId); + this._playerProxy = null; + + this.emit('closed'); + } + + _onMprisProxyReady() { + this._ownerNotifyId = this._mprisProxy.connect('notify::g-name-owner', + () => { + if (!this._mprisProxy.g_name_owner) + this._close(); + }); + } + + _onPlayerProxyReady() { + this._propsChangedId = this._playerProxy.connect('g-properties-changed', + this._updateState.bind(this)); + this._updateState(); + } + + _updateState() { + let metadata = {}; + for (let prop in this._playerProxy.Metadata) + metadata[prop] = this._playerProxy.Metadata[prop].deep_unpack(); + + this._trackArtists = metadata['xesam:artist'] || [_("Unknown artist")]; + this._trackTitle = metadata['xesam:title'] || _("Unknown title"); + this._trackCoverUrl = metadata['mpris:artUrl'] || ''; + this.emit('changed'); + + let visible = this._playerProxy.CanPlay; + + if (this._visible != visible) { + this._visible = visible; + if (visible) + this.emit('show'); + else + this._close(); + } + } +}; +Signals.addSignalMethods(MprisPlayer.prototype); + +var MediaSection = class MediaSection extends MessageList.MessageListSection { + constructor() { + super(); + + this._players = new Map(); + + this._proxy = new DBusProxy(Gio.DBus.session, + 'org.freedesktop.DBus', + '/org/freedesktop/DBus', + this._onProxyReady.bind(this)); + } + + _shouldShow() { + return !this.empty && Calendar.isToday(this._date); + } + + _addPlayer(busName) { + if (this._players.get(busName)) + return; + + let player = new MprisPlayer(busName); + player.connect('closed', + () => { + this._players.delete(busName); + }); + player.connect('show', + () => { + let message = new MediaMessage(player); + this.addMessage(message, true); + }); + this._players.set(busName, player); + } + + _onProxyReady() { + this._proxy.ListNamesRemote(([names]) => { + names.forEach(name => { + if (!name.startsWith(MPRIS_PLAYER_PREFIX)) + return; + + this._addPlayer(name); + }); + }); + this._proxy.connectSignal('NameOwnerChanged', + this._onNameOwnerChanged.bind(this)); + } + + _onNameOwnerChanged(proxy, sender, [name, oldOwner, newOwner]) { + if (!name.startsWith(MPRIS_PLAYER_PREFIX)) + return; + + if (newOwner && !oldOwner) + this._addPlayer(name); + } +}; diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js new file mode 100644 index 0000000..4bdede8 --- /dev/null +++ b/js/ui/notificationDaemon.js @@ -0,0 +1,827 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { GdkPixbuf, Gio, GLib, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; + +const Config = imports.misc.config; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const Params = imports.misc.params; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +// Should really be defined in Gio.js +const BusIface = loadInterfaceXML('org.freedesktop.DBus'); +var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface); +function Bus() { + return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus'); +} + +const FdoNotificationsIface = loadInterfaceXML('org.freedesktop.Notifications'); + +var NotificationClosedReason = { + EXPIRED: 1, + DISMISSED: 2, + APP_CLOSED: 3, + UNDEFINED: 4 +}; + +var Urgency = { + LOW: 0, + NORMAL: 1, + CRITICAL: 2 +}; + +const rewriteRules = { + 'XChat': [ + { pattern: /^XChat: Private message from: (\S*) \(.*\)$/, + replacement: '<$1>' }, + { pattern: /^XChat: New public message from: (\S*) \((.*)\)$/, + replacement: '$2 <$1>' }, + { pattern: /^XChat: Highlighted message from: (\S*) \((.*)\)$/, + replacement: '$2 <$1>' } + ] +}; + +var FdoNotificationDaemon = class FdoNotificationDaemon { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(FdoNotificationsIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications'); + + this._sources = []; + this._senderToPid = {}; + this._notifications = {}; + this._busProxy = new Bus(); + + this._nextNotificationId = 1; + + Shell.WindowTracker.get_default().connect('notify::focus-app', + this._onFocusAppChanged.bind(this)); + Main.overview.connect('hidden', + this._onFocusAppChanged.bind(this)); + } + + _imageForNotificationData(hints) { + if (hints['image-data']) { + let [width, height, rowStride, hasAlpha, + bitsPerSample, nChannels, data] = hints['image-data']; + return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha, + bitsPerSample, width, height, rowStride); + } else if (hints['image-path']) { + return this._iconForNotificationData(hints['image-path']); + } + return null; + } + + _fallbackIconForNotificationData(hints) { + let stockIcon; + switch (hints.urgency) { + case Urgency.LOW: + case Urgency.NORMAL: + stockIcon = 'dialog-information'; + break; + case Urgency.CRITICAL: + stockIcon = 'dialog-error'; + break; + } + return new Gio.ThemedIcon({ name: stockIcon }); + } + + _iconForNotificationData(icon) { + if (icon) { + if (icon.substr(0, 7) == 'file://') + return new Gio.FileIcon({ file: Gio.File.new_for_uri(icon) }); + else if (icon[0] == '/') + return new Gio.FileIcon({ file: Gio.File.new_for_path(icon) }); + else + return new Gio.ThemedIcon({ name: icon }); + } + return null; + } + + _lookupSource(title, pid) { + for (let i = 0; i < this._sources.length; i++) { + let source = this._sources[i]; + if (source.pid == pid && source.initialTitle == title) + return source; + } + return null; + } + + // Returns the source associated with ndata.notification if it is set. + // If the existing or requested source is associated with a tray icon + // and passed in pid matches a pid of an existing source, the title + // match is ignored to enable representing a tray icon and notifications + // from the same application with a single source. + // + // If no existing source is found, a new source is created as long as + // pid is provided. + // + // Either a pid or ndata.notification is needed to retrieve or + // create a source. + _getSource(title, pid, ndata, sender) { + if (!pid && !(ndata && ndata.notification)) + return null; + + // We use notification's source for the notifications we still have + // around that are getting replaced because we don't keep sources + // for transient notifications in this._sources, but we still want + // the notification associated with them to get replaced correctly. + if (ndata && ndata.notification) + return ndata.notification.source; + + let source = this._lookupSource(title, pid); + if (source) { + source.setTitle(title); + return source; + } + + let appId = ndata ? ndata.hints['desktop-entry'] || null : null; + source = new FdoNotificationDaemonSource(title, pid, sender, appId); + + this._sources.push(source); + source.connect('destroy', () => { + let index = this._sources.indexOf(source); + if (index >= 0) + this._sources.splice(index, 1); + }); + + Main.messageTray.add(source); + return source; + } + + NotifyAsync(params, invocation) { + let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params; + let id; + + for (let hint in hints) { + // unpack the variants + hints[hint] = hints[hint].deep_unpack(); + } + + hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true); + + // Filter out chat, presence, calls and invitation notifications from + // Empathy, since we handle that information from telepathyClient.js + // + // Note that empathy uses im.received for one to one chats and + // x-empathy.im.mentioned for multi-user, so we're good here + if (appName == 'Empathy' && hints['category'] == 'im.received') { + // Ignore replacesId since we already sent back a + // NotificationClosed for that id. + id = this._nextNotificationId++; + let idle_id = Mainloop.idle_add(() => { + this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(idle_id, '[gnome-shell] this._emitNotificationClosed'); + return invocation.return_value(GLib.Variant.new('(u)', [id])); + } + + let rewrites = rewriteRules[appName]; + if (rewrites) { + for (let i = 0; i < rewrites.length; i++) { + let rule = rewrites[i]; + if (summary.search(rule.pattern) != -1) + summary = summary.replace(rule.pattern, rule.replacement); + } + } + + // Be compatible with the various hints for image data and image path + // 'image-data' and 'image-path' are the latest name of these hints, introduced in 1.2 + + if (!hints['image-path'] && hints['image_path']) + hints['image-path'] = hints['image_path']; // version 1.1 of the spec + + if (!hints['image-data']) { + if (hints['image_data']) + hints['image-data'] = hints['image_data']; // version 1.1 of the spec + else if (hints['icon_data'] && !hints['image-path']) + // early versions of the spec; 'icon_data' should only be used if 'image-path' is not available + hints['image-data'] = hints['icon_data']; + } + + let ndata = { appName: appName, + icon: icon, + summary: summary, + body: body, + actions: actions, + hints: hints, + timeout: timeout }; + if (replacesId != 0 && this._notifications[replacesId]) { + ndata.id = id = replacesId; + ndata.notification = this._notifications[replacesId].notification; + } else { + replacesId = 0; + ndata.id = id = this._nextNotificationId++; + } + this._notifications[id] = ndata; + + let sender = invocation.get_sender(); + let pid = this._senderToPid[sender]; + + let source = this._getSource(appName, pid, ndata, sender, null); + + if (source) { + this._notifyForSource(source, ndata); + return invocation.return_value(GLib.Variant.new('(u)', [id])); + } + + if (replacesId) { + // There's already a pending call to GetConnectionUnixProcessID, + // which will see the new notification data when it finishes, + // so we don't have to do anything. + return invocation.return_value(GLib.Variant.new('(u)', [id]));; + } + + this._busProxy.GetConnectionUnixProcessIDRemote(sender, (result, excp) => { + // The app may have updated or removed the notification + ndata = this._notifications[id]; + if (!ndata) + return; + + if (excp) { + logError(excp, 'Call to GetConnectionUnixProcessID failed'); + return; + } + + let [pid] = result; + source = this._getSource(appName, pid, ndata, sender, null); + + this._senderToPid[sender] = pid; + source.connect('destroy', () => { + delete this._senderToPid[sender]; + }); + this._notifyForSource(source, ndata); + }); + + return invocation.return_value(GLib.Variant.new('(u)', [id])); + } + + _notifyForSource(source, ndata) { + let [id, icon, summary, body, actions, hints, notification] = + [ndata.id, ndata.icon, ndata.summary, ndata.body, + ndata.actions, ndata.hints, ndata.notification]; + + if (notification == null) { + notification = new MessageTray.Notification(source); + ndata.notification = notification; + notification.connect('destroy', (n, reason) => { + delete this._notifications[ndata.id]; + let notificationClosedReason; + switch (reason) { + case MessageTray.NotificationDestroyedReason.EXPIRED: + notificationClosedReason = NotificationClosedReason.EXPIRED; + break; + case MessageTray.NotificationDestroyedReason.DISMISSED: + notificationClosedReason = NotificationClosedReason.DISMISSED; + break; + case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED: + notificationClosedReason = NotificationClosedReason.APP_CLOSED; + break; + } + this._emitNotificationClosed(ndata.id, notificationClosedReason); + }); + } + + let gicon = this._iconForNotificationData(icon); + let gimage = this._imageForNotificationData(hints); + + // If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon + // and don't show a large image. There are currently many applications that use + // notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets + // the 'image-data' hint. These applications don't typically pass in 'app_icon' + // argument to Notify() and actually expect the pixbuf to be shown as an icon. + // So the logic here does the right thing for this case. If both an icon and either + // one of 'image-data' or 'image-path' are specified, the icon and takes precedence. + if (!gicon && gimage) + gicon = gimage; + else if (!gicon) + gicon = this._fallbackIconForNotificationData(hints); + + notification.update(summary, body, { gicon: gicon, + bannerMarkup: true, + clear: true, + soundFile: hints['sound-file'], + soundName: hints['sound-name'] }); + + let hasDefaultAction = false; + + if (actions.length) { + for (let i = 0; i < actions.length - 1; i += 2) { + let [actionId, label] = [actions[i], actions[i+1]]; + if (actionId == 'default') + hasDefaultAction = true; + else + notification.addAction(label, () => { + this._emitActionInvoked(ndata.id, actionId); + }); + } + } + + if (hasDefaultAction) { + notification.connect('activated', () => { + this._emitActionInvoked(ndata.id, 'default'); + }); + } else { + notification.connect('activated', () => { + source.open(); + }); + } + + switch (hints.urgency) { + case Urgency.LOW: + notification.setUrgency(MessageTray.Urgency.LOW); + break; + case Urgency.NORMAL: + notification.setUrgency(MessageTray.Urgency.NORMAL); + break; + case Urgency.CRITICAL: + notification.setUrgency(MessageTray.Urgency.CRITICAL); + break; + } + notification.setResident(!!hints.resident); + // 'transient' is a reserved keyword in JS, so we have to retrieve the value + // of the 'transient' hint with hints['transient'] rather than hints.transient + notification.setTransient(!!hints['transient']); + + let privacyScope = (hints['x-gnome-privacy-scope'] || 'user'); + notification.setPrivacyScope(privacyScope == 'system' ? MessageTray.PrivacyScope.SYSTEM + : MessageTray.PrivacyScope.USER); + + let sourceGIcon = source.useNotificationIcon ? gicon : null; + source.processNotification(notification, sourceGIcon); + } + + CloseNotification(id) { + let ndata = this._notifications[id]; + if (ndata) { + if (ndata.notification) + ndata.notification.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); + delete this._notifications[id]; + } + } + + GetCapabilities() { + return [ + 'actions', + // 'action-icons', + 'body', + // 'body-hyperlinks', + // 'body-images', + 'body-markup', + // 'icon-multi', + 'icon-static', + 'persistence', + 'sound', + ]; + } + + GetServerInformation() { + return [ + Config.PACKAGE_NAME, + 'GNOME', + Config.PACKAGE_VERSION, + '1.2' + ]; + } + + _onFocusAppChanged() { + let tracker = Shell.WindowTracker.get_default(); + if (!tracker.focus_app) + return; + + for (let i = 0; i < this._sources.length; i++) { + let source = this._sources[i]; + if (source.app == tracker.focus_app) { + source.destroyNonResidentNotifications(); + return; + } + } + } + + _emitNotificationClosed(id, reason) { + this._dbusImpl.emit_signal('NotificationClosed', + GLib.Variant.new('(uu)', [id, reason])); + } + + _emitActionInvoked(id, action) { + this._dbusImpl.emit_signal('ActionInvoked', + GLib.Variant.new('(us)', [id, action])); + } +}; + +var FdoNotificationDaemonSource = +class FdoNotificationDaemonSource extends MessageTray.Source { + constructor(title, pid, sender, appId) { + super(title); + + this.pid = pid; + this.app = this._getApp(appId); + + this.initialTitle = title; + + if (this.app) + this.title = this.app.get_name(); + else + this.useNotificationIcon = true; + + if (sender) + this._nameWatcherId = Gio.DBus.session.watch_name(sender, + Gio.BusNameWatcherFlags.NONE, + null, + this._onNameVanished.bind(this)); + else + this._nameWatcherId = 0; + } + + _createPolicy() { + if (this.app && this.app.get_app_info()) { + let id = this.app.get_id().replace(/\.desktop$/,''); + return new MessageTray.NotificationApplicationPolicy(id); + } else { + return new MessageTray.NotificationGenericPolicy(); + } + } + + _onNameVanished() { + // Destroy the notification source when its sender is removed from DBus. + // Only do so if this.app is set to avoid removing "notify-send" sources, senders + // of which аre removed from DBus immediately. + // Sender being removed from DBus would normally result in a tray icon being removed, + // so allow the code path that handles the tray icon being removed to handle that case. + if (this.app) + this.destroy(); + } + + processNotification(notification, gicon) { + if (gicon) + this._gicon = gicon; + this.iconUpdated(); + + let tracker = Shell.WindowTracker.get_default(); + if (notification.resident && this.app && tracker.focus_app == this.app) + this.pushNotification(notification); + else + this.notify(notification); + } + + _getApp(appId) { + let app; + + app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid); + if (app != null) + return app; + + if (appId) { + app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop'); + if (app != null) + return app; + } + + return null; + } + + setTitle(title) { + // Do nothing if .app is set, we don't want to override the + // app name with whatever is provided through libnotify (usually + // garbage) + if (this.app) + return; + + super.setTitle(title); + } + + open() { + this.openApp(); + this.destroyNonResidentNotifications(); + } + + openApp() { + if (this.app == null) + return; + + this.app.activate(); + Main.overview.hide(); + Main.panel.closeCalendar(); + } + + destroy() { + if (this._nameWatcherId) { + Gio.DBus.session.unwatch_name(this._nameWatcherId); + this._nameWatcherId = 0; + } + + super.destroy(); + } + + createIcon(size) { + if (this.app) { + return this.app.create_icon_texture(size); + } else if (this._gicon) { + return new St.Icon({ gicon: this._gicon, + icon_size: size }); + } else { + return null; + } + } +}; + +const PRIORITY_URGENCY_MAP = { + low: MessageTray.Urgency.LOW, + normal: MessageTray.Urgency.NORMAL, + high: MessageTray.Urgency.HIGH, + urgent: MessageTray.Urgency.CRITICAL +}; + +var GtkNotificationDaemonNotification = +class GtkNotificationDaemonNotification extends MessageTray.Notification { + constructor(source, notification) { + super(source); + this._serialized = GLib.Variant.new('a{sv}', notification); + + let { "title": title, + "body": body, + "icon": gicon, + "urgent": urgent, + "priority": priority, + "buttons": buttons, + "default-action": defaultAction, + "default-action-target": defaultActionTarget, + "timestamp": time } = notification; + + if (priority) { + let urgency = PRIORITY_URGENCY_MAP[priority.unpack()]; + this.setUrgency(urgency != undefined ? urgency : MessageTray.Urgency.NORMAL); + } else if (urgent) { + this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL + : MessageTray.Urgency.NORMAL); + } else { + this.setUrgency(MessageTray.Urgency.NORMAL); + } + + if (buttons) { + buttons.deep_unpack().forEach(button => { + this.addAction(button.label.unpack(), () => { + this._onButtonClicked(button); + }); + }); + } + + this._defaultAction = defaultAction ? defaultAction.unpack() : null; + this._defaultActionTarget = defaultActionTarget; + + this.update(title.unpack(), body ? body.unpack() : null, + { gicon: gicon ? Gio.icon_deserialize(gicon) : null, + datetime : time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null }); + } + + _activateAction(namespacedActionId, target) { + if (namespacedActionId) { + if (namespacedActionId.startsWith('app.')) { + let actionId = namespacedActionId.slice('app.'.length); + this.source.activateAction(actionId, target); + } + } else { + this.source.open(); + } + } + + _onButtonClicked(button) { + let { 'action': action, 'target': actionTarget } = button; + this._activateAction(action.unpack(), actionTarget); + } + + activate() { + this._activateAction(this._defaultAction, this._defaultActionTarget); + super.activate(); + } + + serialize() { + return this._serialized; + } +}; + +const FdoApplicationIface = loadInterfaceXML('org.freedesktop.Application'); +const FdoApplicationProxy = Gio.DBusProxy.makeProxyWrapper(FdoApplicationIface); + +function objectPathFromAppId(appId) { + return '/' + appId.replace(/\./g, '/').replace(/-/g, '_'); +} + +function getPlatformData() { + let startupId = GLib.Variant.new('s', '_TIME' + global.get_current_time()); + return { "desktop-startup-id": startupId }; +} + +function InvalidAppError() {} + +var GtkNotificationDaemonAppSource = +class GtkNotificationDaemonAppSource extends MessageTray.Source { + constructor(appId) { + let objectPath = objectPathFromAppId(appId); + if (!GLib.Variant.is_object_path(objectPath)) + throw new InvalidAppError(); + + let app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop'); + if (!app) + throw new InvalidAppError(); + + super(app.get_name()); + + this._appId = appId; + this._app = app; + this._objectPath = objectPath; + + this._notifications = {}; + this._notificationPending = false; + } + + createIcon(size) { + return this._app.create_icon_texture(size); + } + + _createPolicy() { + return new MessageTray.NotificationApplicationPolicy(this._appId); + } + + _createApp(callback) { + return new FdoApplicationProxy(Gio.DBus.session, this._appId, this._objectPath, callback); + } + + _createNotification(params) { + return new GtkNotificationDaemonNotification(this, params); + } + + activateAction(actionId, target) { + this._createApp((app, error) => { + if (error == null) + app.ActivateActionRemote(actionId, target ? [target] : [], getPlatformData()); + else + logError(error, 'Failed to activate application proxy'); + }); + Main.overview.hide(); + Main.panel.closeCalendar(); + } + + open() { + this._createApp((app, error) => { + if (error == null) + app.ActivateRemote(getPlatformData()); + else + logError(error, 'Failed to open application proxy'); + }); + Main.overview.hide(); + Main.panel.closeCalendar(); + } + + addNotification(notificationId, notificationParams, showBanner) { + this._notificationPending = true; + + if (this._notifications[notificationId]) + this._notifications[notificationId].destroy(MessageTray.NotificationDestroyedReason.REPLACED); + + let notification = this._createNotification(notificationParams); + notification.connect('destroy', () => { + delete this._notifications[notificationId]; + }); + this._notifications[notificationId] = notification; + + if (showBanner) + this.notify(notification); + else + this.pushNotification(notification); + + this._notificationPending = false; + } + + destroy(reason) { + if (this._notificationPending) + return; + super.destroy(reason); + } + + removeNotification(notificationId) { + if (this._notifications[notificationId]) + this._notifications[notificationId].destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); + } + + serialize() { + let notifications = []; + for (let notificationId in this._notifications) { + let notification = this._notifications[notificationId]; + notifications.push([notificationId, notification.serialize()]); + } + return [this._appId, notifications]; + } +}; + +const GtkNotificationsIface = loadInterfaceXML('org.gtk.Notifications'); + +var GtkNotificationDaemon = class GtkNotificationDaemon { + constructor() { + this._sources = {}; + + this._loadNotifications(); + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GtkNotificationsIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gtk/Notifications'); + + Gio.DBus.session.own_name('org.gtk.Notifications', Gio.BusNameOwnerFlags.REPLACE, null, null); + } + + _ensureAppSource(appId) { + if (this._sources[appId]) + return this._sources[appId]; + + let source = new GtkNotificationDaemonAppSource(appId); + + source.connect('destroy', () => { + delete this._sources[appId]; + this._saveNotifications(); + }); + source.connect('count-updated', this._saveNotifications.bind(this)); + Main.messageTray.add(source); + this._sources[appId] = source; + return source; + } + + _loadNotifications() { + this._isLoading = true; + + let value = global.get_persistent_state('a(sa(sv))', 'notifications'); + if (value) { + let sources = value.deep_unpack(); + sources.forEach(([appId, notifications]) => { + if (notifications.length == 0) + return; + + let source; + try { + source = this._ensureAppSource(appId); + } catch(e) { + if (e instanceof InvalidAppError) + return; + throw e; + } + + notifications.forEach(([notificationId, notification]) => { + source.addNotification(notificationId, notification.deep_unpack(), false); + }); + }); + } + + this._isLoading = false; + } + + _saveNotifications() { + if (this._isLoading) + return; + + let sources = []; + for (let appId in this._sources) { + let source = this._sources[appId]; + sources.push(source.serialize()); + } + + global.set_persistent_state('notifications', new GLib.Variant('a(sa(sv))', sources)); + } + + AddNotificationAsync(params, invocation) { + let [appId, notificationId, notification] = params; + + let source; + try { + source = this._ensureAppSource(appId); + } catch(e) { + if (e instanceof InvalidAppError) { + invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId)); + return; + } + throw e; + } + + let timestamp = GLib.DateTime.new_now_local().to_unix(); + notification['timestamp'] = new GLib.Variant('x', timestamp); + + source.addNotification(notificationId, notification, true); + + invocation.return_value(null); + } + + RemoveNotificationAsync(params, invocation) { + let [appId, notificationId] = params; + let source = this._sources[appId]; + if (source) + source.removeNotification(notificationId); + + invocation.return_value(null); + } +}; + +var NotificationDaemon = class NotificationDaemon { + constructor() { + this._fdoNotificationDaemon = new FdoNotificationDaemon(); + this._gtkNotificationDaemon = new GtkNotificationDaemon(); + } +}; diff --git a/js/ui/osdMonitorLabeler.js b/js/ui/osdMonitorLabeler.js new file mode 100644 index 0000000..62feace --- /dev/null +++ b/js/ui/osdMonitorLabeler.js @@ -0,0 +1,117 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, Meta, St } = imports.gi; + +const Main = imports.ui.main; + +var FADE_TIME = 0.1; + +var OsdMonitorLabel = class { + constructor(monitor, label) { + this._actor = new St.Widget({ x_expand: true, + y_expand: true }); + + this._monitor = monitor; + + this._box = new St.BoxLayout({ style_class: 'osd-window', + vertical: true }); + this._actor.add_actor(this._box); + + this._label = new St.Label({ style_class: 'osd-monitor-label', + text: label }); + this._box.add(this._label); + + Main.uiGroup.add_child(this._actor); + Main.uiGroup.set_child_above_sibling(this._actor, null); + this._position(); + + Meta.disable_unredirect_for_display(global.display); + } + + _position() { + let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor); + + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + this._box.x = workArea.x + (workArea.width - this._box.width); + else + this._box.x = workArea.x; + + this._box.y = workArea.y; + } + + destroy() { + this._actor.destroy(); + Meta.enable_unredirect_for_display(global.display); + } +}; + +var OsdMonitorLabeler = class { + constructor() { + this._monitorManager = Meta.MonitorManager.get(); + this._client = null; + this._clientWatchId = 0; + this._osdLabels = []; + this._monitorLabels = null; + Main.layoutManager.connect('monitors-changed', + this._reset.bind(this)); + this._reset(); + } + + _reset() { + for (let i in this._osdLabels) + this._osdLabels[i].destroy(); + this._osdLabels = []; + this._monitorLabels = new Map(); + let monitors = Main.layoutManager.monitors; + for (let i in monitors) + this._monitorLabels.set(monitors[i].index, []); + } + + _trackClient(client) { + if (this._client) + return (this._client == client); + + this._client = client; + this._clientWatchId = Gio.bus_watch_name(Gio.BusType.SESSION, client, 0, null, + (c, name) => { + this.hide(name); + }); + return true; + } + + _untrackClient(client) { + if (!this._client || this._client != client) + return false; + + Gio.bus_unwatch_name(this._clientWatchId); + this._clientWatchId = 0; + this._client = null; + return true; + } + + show(client, params) { + if (!this._trackClient(client)) + return; + + this._reset(); + + for (let connector in params) { + let monitor = this._monitorManager.get_monitor_for_connector(connector); + if (monitor == -1) + continue; + this._monitorLabels.get(monitor).push(params[connector].deep_unpack()); + } + + for (let [monitor, labels] of this._monitorLabels.entries()) { + labels.sort(); + this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' '))); + } + } + + hide(client) { + if (!this._untrackClient(client)) + return; + + this._reset(); + } +}; diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js new file mode 100644 index 0000000..abf8c27 --- /dev/null +++ b/js/ui/osdWindow.js @@ -0,0 +1,278 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, GObject, Meta, St } = imports.gi; +const Mainloop = imports.mainloop; + +const BarLevel = imports.ui.barLevel; +const Layout = imports.ui.layout; +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +var HIDE_TIMEOUT = 1500; +var FADE_TIME = 0.1; +var LEVEL_ANIMATION_TIME = 0.1; + +var LevelBar = class extends BarLevel.BarLevel { + constructor() { + super(0, { styleClass: 'level' }); + + this._level = 0; + this._maxLevel = 100; + + this.actor.accessible_name = _("Volume"); + + this.actor.connect('notify::width', () => { this.level = this.level; }); + } + + get level() { + return this._level; + } + + set level(value) { + this._level = Math.max(0, Math.min(value, this._maxLevel)); + + this.setValue(this._level / 100); + } + + get maxLevel() { + return this._maxLevel; + } + + set maxLevel(value) { + this._maxLevel = Math.max(100, value); + + this.setMaximumValue(this._maxLevel / 100); + } +}; + +var OsdWindowConstraint = GObject.registerClass( +class OsdWindowConstraint extends Clutter.Constraint { + _init(props) { + this._minSize = 0; + super._init(props); + } + + set minSize(v) { + this._minSize = v; + if (this.actor) + this.actor.queue_relayout(); + } + + vfunc_update_allocation(actor, actorBox) { + // Clutter will adjust the allocation for margins, + // so add it to our minimum size + let minSize = this._minSize + actor.margin_top + actor.margin_bottom; + let [width, height] = actorBox.get_size(); + + // Enforce a ratio of 1 + let size = Math.ceil(Math.max(minSize, height)); + actorBox.set_size(size, size); + + // Recenter + let [x, y] = actorBox.get_origin(); + actorBox.set_origin(Math.ceil(x + width / 2 - size / 2), + Math.ceil(y + height / 2 - size / 2)); + } +}); + +var OsdWindow = class { + constructor(monitorIndex) { + this.actor = new St.Widget({ x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER }); + + this._monitorIndex = monitorIndex; + let constraint = new Layout.MonitorConstraint({ index: monitorIndex }); + this.actor.add_constraint(constraint); + + this._boxConstraint = new OsdWindowConstraint(); + this._box = new St.BoxLayout({ style_class: 'osd-window', + vertical: true }); + this._box.add_constraint(this._boxConstraint); + this.actor.add_actor(this._box); + + this._icon = new St.Icon(); + this._box.add(this._icon, { expand: true }); + + this._label = new St.Label(); + this._box.add(this._label); + + this._level = new LevelBar(); + this._box.add(this._level.actor); + + this._hideTimeoutId = 0; + this._reset(); + + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._monitorsChangedId = + Main.layoutManager.connect('monitors-changed', + this._relayout.bind(this)); + let themeContext = St.ThemeContext.get_for_stage(global.stage); + this._scaleChangedId = + themeContext.connect('notify::scale-factor', + this._relayout.bind(this)); + this._relayout(); + Main.uiGroup.add_child(this.actor); + } + + _onDestroy() { + if (this._monitorsChangedId) + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = 0; + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + if (this._scaleChangedId) + themeContext.disconnect(this._scaleChangedId); + this._scaleChangedId = 0; + } + + setIcon(icon) { + this._icon.gicon = icon; + } + + setLabel(label) { + this._label.visible = (label != undefined); + if (label) + this._label.text = label; + } + + setLevel(level) { + this._level.actor.visible = (level != undefined); + if (level != undefined) { + if (this.actor.visible) + Tweener.addTween(this._level, + { level: level, + time: LEVEL_ANIMATION_TIME, + transition: 'easeOutQuad' }); + else + this._level.level = level; + } + } + + setMaxLevel(maxLevel) { + if (maxLevel === undefined) + maxLevel = 100; + this._level.maxLevel = maxLevel; + } + + show() { + if (!this._icon.gicon) + return; + + if (!this.actor.visible) { + Meta.disable_unredirect_for_display(global.display); + this.actor.show(); + this.actor.opacity = 0; + this.actor.get_parent().set_child_above_sibling(this.actor, null); + + Tweener.addTween(this.actor, + { opacity: 255, + time: FADE_TIME, + transition: 'easeOutQuad' }); + } + + if (this._hideTimeoutId) + Mainloop.source_remove(this._hideTimeoutId); + this._hideTimeoutId = Mainloop.timeout_add(HIDE_TIMEOUT, + this._hide.bind(this)); + GLib.Source.set_name_by_id(this._hideTimeoutId, '[gnome-shell] this._hide'); + } + + cancel() { + if (!this._hideTimeoutId) + return; + + Mainloop.source_remove(this._hideTimeoutId); + this._hide(); + } + + _hide() { + this._hideTimeoutId = 0; + Tweener.addTween(this.actor, + { opacity: 0, + time: FADE_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this._reset(); + Meta.enable_unredirect_for_display(global.display); + } + }); + return GLib.SOURCE_REMOVE; + } + + _reset() { + this.actor.hide(); + this.setLabel(null); + this.setMaxLevel(null); + this.setLevel(null); + } + + _relayout() { + /* assume 110x110 on a 640x480 display and scale from there */ + let monitor = Main.layoutManager.monitors[this._monitorIndex]; + if (!monitor) + return; // we are about to be removed + + let scalew = monitor.width / 640.0; + let scaleh = monitor.height / 480.0; + let scale = Math.min(scalew, scaleh); + let popupSize = 110 * Math.max(1, scale); + + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + this._icon.icon_size = popupSize / (2 * scaleFactor); + this._box.translation_y = Math.round(monitor.height / 4); + this._boxConstraint.minSize = popupSize; + } +}; + +var OsdWindowManager = class { + constructor() { + this._osdWindows = []; + Main.layoutManager.connect('monitors-changed', + this._monitorsChanged.bind(this)); + this._monitorsChanged(); + } + + _monitorsChanged() { + for (let i = 0; i < Main.layoutManager.monitors.length; i++) { + if (this._osdWindows[i] == undefined) + this._osdWindows[i] = new OsdWindow(i); + } + + for (let i = Main.layoutManager.monitors.length; i < this._osdWindows.length; i++) { + this._osdWindows[i].actor.destroy(); + this._osdWindows[i] = null; + } + + this._osdWindows.length = Main.layoutManager.monitors.length; + } + + _showOsdWindow(monitorIndex, icon, label, level, maxLevel) { + this._osdWindows[monitorIndex].setIcon(icon); + this._osdWindows[monitorIndex].setLabel(label); + this._osdWindows[monitorIndex].setMaxLevel(maxLevel); + this._osdWindows[monitorIndex].setLevel(level); + this._osdWindows[monitorIndex].show(); + } + + show(monitorIndex, icon, label, level, maxLevel) { + if (monitorIndex != -1) { + for (let i = 0; i < this._osdWindows.length; i++) { + if (i == monitorIndex) + this._showOsdWindow(i, icon, label, level, maxLevel); + else + this._osdWindows[i].cancel(); + } + } else { + for (let i = 0; i < this._osdWindows.length; i++) + this._showOsdWindow(i, icon, label, level, maxLevel); + } + } + + hideAll() { + for (let i = 0; i < this._osdWindows.length; i++) + this._osdWindows[i].cancel(); + } +}; diff --git a/js/ui/overview.js b/js/ui/overview.js new file mode 100644 index 0000000..dc6ad18 --- /dev/null +++ b/js/ui/overview.js @@ -0,0 +1,643 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Background = imports.ui.background; +const DND = imports.ui.dnd; +const LayoutManager = imports.ui.layout; +const Lightbox = imports.ui.lightbox; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const OverviewControls = imports.ui.overviewControls; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; +const WorkspaceThumbnail = imports.ui.workspaceThumbnail; + +// Time for initial animation going into Overview mode +var ANIMATION_TIME = 0.25; + +// Must be less than ANIMATION_TIME, since we switch to +// or from the overview completely after ANIMATION_TIME, +// and don't want the shading animation to get cut off +var SHADE_ANIMATION_TIME = .20; + +var DND_WINDOW_SWITCH_TIMEOUT = 750; + +var OVERVIEW_ACTIVATION_TIMEOUT = 0.5; + +var ShellInfo = class { + constructor() { + this._source = null; + this._undoCallback = null; + } + + _onUndoClicked() { + if (this._undoCallback) + this._undoCallback(); + this._undoCallback = null; + + if (this._source) + this._source.destroy(); + } + + setMessage(text, options) { + options = Params.parse(options, { undoCallback: null, + forFeedback: false + }); + + let undoCallback = options.undoCallback; + let forFeedback = options.forFeedback; + + if (this._source == null) { + this._source = new MessageTray.SystemNotificationSource(); + this._source.connect('destroy', () => { + this._source = null; + }); + Main.messageTray.add(this._source); + } + + let notification = null; + if (this._source.notifications.length == 0) { + notification = new MessageTray.Notification(this._source, text, null); + notification.setTransient(true); + notification.setForFeedback(forFeedback); + } else { + notification = this._source.notifications[0]; + notification.update(text, null, { clear: true }); + } + + this._undoCallback = undoCallback; + if (undoCallback) + notification.addAction(_("Undo"), this._onUndoClicked.bind(this)); + + this._source.notify(notification); + } +}; + +var Overview = class { + constructor() { + this._overviewCreated = false; + this._initCalled = false; + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + } + + _createOverview() { + if (this._overviewCreated) + return; + + if (this.isDummy) + return; + + this._overviewCreated = true; + + this._overview = new St.BoxLayout({ name: 'overview', + /* Translators: This is the main view to select + activities. See also note for "Activities" string. */ + accessible_name: _("Overview"), + vertical: true }); + this._overview.add_constraint(new LayoutManager.MonitorConstraint({ primary: true })); + this._overview._delegate = this; + + // The main Background actors are inside global.window_group which are + // hidden when displaying the overview, so we create a new + // one. Instances of this class share a single CoglTexture behind the + // scenes which allows us to show the background with different + // rendering options without duplicating the texture data. + this._backgroundGroup = new Meta.BackgroundGroup({ reactive: true }); + Main.layoutManager.overviewGroup.add_child(this._backgroundGroup); + this._bgManagers = []; + + this._desktopFade = new St.Widget(); + Main.layoutManager.overviewGroup.add_child(this._desktopFade); + + this._activationTime = 0; + + this.visible = false; // animating to overview, in overview, animating out + this._shown = false; // show() and not hide() + this._modal = false; // have a modal grab + this.animationInProgress = false; + this.visibleTarget = false; + + // During transitions, we raise this to the top to avoid having the overview + // area be reactive; it causes too many issues such as double clicks on + // Dash elements, or mouseover handlers in the workspaces. + this._coverPane = new Clutter.Actor({ opacity: 0, + reactive: true }); + Main.layoutManager.overviewGroup.add_child(this._coverPane); + this._coverPane.connect('event', () => Clutter.EVENT_STOP); + + Main.layoutManager.overviewGroup.add_child(this._overview); + + this._coverPane.hide(); + + // XDND + this._dragMonitor = { + dragMotion: this._onDragMotion.bind(this) + }; + + + Main.layoutManager.overviewGroup.connect('scroll-event', + this._onScrollEvent.bind(this)); + Main.xdndHandler.connect('drag-begin', this._onDragBegin.bind(this)); + Main.xdndHandler.connect('drag-end', this._onDragEnd.bind(this)); + + global.display.connect('restacked', this._onRestacked.bind(this)); + + this._windowSwitchTimeoutId = 0; + this._windowSwitchTimestamp = 0; + this._lastActiveWorkspaceIndex = -1; + this._lastHoveredWindow = null; + + if (this._initCalled) + this.init(); + } + + _updateBackgrounds() { + for (let i = 0; i < this._bgManagers.length; i++) + this._bgManagers[i].destroy(); + + this._bgManagers = []; + + for (let i = 0; i < Main.layoutManager.monitors.length; i++) { + let bgManager = new Background.BackgroundManager({ container: this._backgroundGroup, + monitorIndex: i, + vignette: true }); + this._bgManagers.push(bgManager); + } + } + + _unshadeBackgrounds() { + let backgrounds = this._backgroundGroup.get_children(); + for (let i = 0; i < backgrounds.length; i++) { + Tweener.addTween(backgrounds[i], + { brightness: 1.0, + vignette_sharpness: 0.0, + time: SHADE_ANIMATION_TIME, + transition: 'easeOutQuad' + }); + } + } + + _shadeBackgrounds() { + let backgrounds = this._backgroundGroup.get_children(); + for (let i = 0; i < backgrounds.length; i++) { + Tweener.addTween(backgrounds[i], + { brightness: Lightbox.VIGNETTE_BRIGHTNESS, + vignette_sharpness: Lightbox.VIGNETTE_SHARPNESS, + time: SHADE_ANIMATION_TIME, + transition: 'easeOutQuad' + }); + } + } + + _sessionUpdated() { + this.isDummy = !Main.sessionMode.hasOverview; + this._createOverview(); + } + + // The members we construct that are implemented in JS might + // want to access the overview as Main.overview to connect + // signal handlers and so forth. So we create them after + // construction in this init() method. + init() { + this._initCalled = true; + + if (this.isDummy) + return; + + this._shellInfo = new ShellInfo(); + + // Add a clone of the panel to the overview so spacing and such is + // automatic + this._panelGhost = new St.Bin({ child: new Clutter.Clone({ source: Main.panel }), + reactive: false, + opacity: 0 }); + this._overview.add_actor(this._panelGhost); + + this._searchEntry = new St.Entry({ style_class: 'search-entry', + /* Translators: this is the text displayed + in the search entry when no search is + active; it should not exceed ~30 + characters. */ + hint_text: _("Type to search…"), + track_hover: true, + can_focus: true }); + this._searchEntryBin = new St.Bin({ child: this._searchEntry, + x_align: St.Align.MIDDLE }); + this._overview.add_actor(this._searchEntryBin); + + // Create controls + this._controls = new OverviewControls.ControlsManager(this._searchEntry); + this._dash = this._controls.dash; + this.viewSelector = this._controls.viewSelector; + + // Add our same-line elements after the search entry + this._overview.add(this._controls.actor, { y_fill: true, expand: true }); + + // TODO - recalculate everything when desktop size changes + this.dashIconSize = this._dash.iconSize; + this._dash.connect('icon-size-changed', () => { + this.dashIconSize = this._dash.iconSize; + }); + + Main.layoutManager.connect('monitors-changed', this._relayout.bind(this)); + this._relayout(); + } + + addSearchProvider(provider) { + this.viewSelector.addSearchProvider(provider); + } + + removeSearchProvider(provider) { + this.viewSelector.removeSearchProvider(provider); + } + + // + // options: + // - undoCallback (function): the callback to be called if undo support is needed + // - forFeedback (boolean): whether the message is for direct feedback of a user action + // + setMessage(text, options) { + if (this.isDummy) + return; + + this._shellInfo.setMessage(text, options); + } + + _onDragBegin() { + this._inXdndDrag = true; + + DND.addDragMonitor(this._dragMonitor); + // Remember the workspace we started from + let workspaceManager = global.workspace_manager; + this._lastActiveWorkspaceIndex = workspaceManager.get_active_workspace_index(); + } + + _onDragEnd(time) { + this._inXdndDrag = false; + + // In case the drag was canceled while in the overview + // we have to go back to where we started and hide + // the overview + if (this._shown) { + let workspaceManager = global.workspace_manager; + workspaceManager.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time); + this.hide(); + } + this._resetWindowSwitchTimeout(); + this._lastHoveredWindow = null; + DND.removeDragMonitor(this._dragMonitor); + this.endItemDrag(); + } + + _resetWindowSwitchTimeout() { + if (this._windowSwitchTimeoutId != 0) { + Mainloop.source_remove(this._windowSwitchTimeoutId); + this._windowSwitchTimeoutId = 0; + } + } + + _onDragMotion(dragEvent) { + let targetIsWindow = dragEvent.targetActor && + dragEvent.targetActor._delegate && + dragEvent.targetActor._delegate.metaWindow && + !(dragEvent.targetActor._delegate instanceof WorkspaceThumbnail.WindowClone); + + this._windowSwitchTimestamp = global.get_current_time(); + + if (targetIsWindow && + dragEvent.targetActor._delegate.metaWindow == this._lastHoveredWindow) + return DND.DragMotionResult.CONTINUE; + + this._lastHoveredWindow = null; + + this._resetWindowSwitchTimeout(); + + if (targetIsWindow) { + this._lastHoveredWindow = dragEvent.targetActor._delegate.metaWindow; + this._windowSwitchTimeoutId = Mainloop.timeout_add(DND_WINDOW_SWITCH_TIMEOUT, + () => { + this._windowSwitchTimeoutId = 0; + Main.activateWindow(dragEvent.targetActor._delegate.metaWindow, + this._windowSwitchTimestamp); + this.hide(); + this._lastHoveredWindow = null; + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._windowSwitchTimeoutId, '[gnome-shell] Main.activateWindow'); + } + + return DND.DragMotionResult.CONTINUE; + } + + _onScrollEvent(actor, event) { + this.emit('scroll-event', event); + return Clutter.EVENT_PROPAGATE; + } + + addAction(action) { + if (this.isDummy) + return; + + this._backgroundGroup.add_action(action); + } + + _getDesktopClone() { + let windows = global.get_window_actors().filter( + w => w.meta_window.get_window_type() == Meta.WindowType.DESKTOP + ); + if (windows.length == 0) + return null; + + let window = windows[0]; + let clone = new Clutter.Clone({ source: window, + x: window.x, y: window.y }); + clone.source.connect('destroy', () => { + clone.destroy(); + }); + return clone; + } + + _relayout() { + // To avoid updating the position and size of the workspaces + // we just hide the overview. The positions will be updated + // when it is next shown. + this.hide(); + + this._coverPane.set_position(0, 0); + this._coverPane.set_size(global.screen_width, global.screen_height); + + this._updateBackgrounds(); + } + + _onRestacked() { + let stack = global.get_window_actors(); + let stackIndices = {}; + + for (let i = 0; i < stack.length; i++) { + // Use the stable sequence for an integer to use as a hash key + stackIndices[stack[i].get_meta_window().get_stable_sequence()] = i; + } + + this.emit('windows-restacked', stackIndices); + } + + beginItemDrag(source) { + this.emit('item-drag-begin'); + this._inItemDrag = true; + } + + cancelledItemDrag(source) { + this.emit('item-drag-cancelled'); + } + + endItemDrag(source) { + if (!this._inItemDrag) + return; + this.emit('item-drag-end'); + this._inItemDrag = false; + } + + beginWindowDrag(window) { + this.emit('window-drag-begin', window); + this._inWindowDrag = true; + } + + cancelledWindowDrag(window) { + this.emit('window-drag-cancelled', window); + } + + endWindowDrag(window) { + if (!this._inWindowDrag) + return; + this.emit('window-drag-end', window); + this._inWindowDrag = false; + } + + focusSearch() { + this.show(); + this._searchEntry.grab_key_focus(); + } + + fadeInDesktop() { + this._desktopFade.opacity = 0; + this._desktopFade.show(); + Tweener.addTween(this._desktopFade, + { opacity: 255, + time: ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + + fadeOutDesktop() { + if (!this._desktopFade.get_n_children()) { + let clone = this._getDesktopClone(); + if (!clone) + return; + + this._desktopFade.add_child(clone); + } + + this._desktopFade.opacity = 255; + this._desktopFade.show(); + Tweener.addTween(this._desktopFade, + { opacity: 0, + time: ANIMATION_TIME, + transition: 'easeOutQuad' + }); + } + + // Checks if the Activities button is currently sensitive to + // clicks. The first call to this function within the + // OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being + // triggered will return false. This avoids opening and closing + // the overview if the user both triggered the hot corner and + // clicked the Activities button. + shouldToggleByCornerOrButton() { + if (this.animationInProgress) + return false; + if (this._inItemDrag || this._inWindowDrag) + return false; + if (this._activationTime == 0 || + GLib.get_monotonic_time() / GLib.USEC_PER_SEC - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT) + return true; + return false; + } + + _syncGrab() { + // We delay grab changes during animation so that when removing the + // overview we don't have a problem with the release of a press/release + // going to an application. + if (this.animationInProgress) + return true; + + if (this._shown) { + let shouldBeModal = !this._inXdndDrag; + if (shouldBeModal) { + if (!this._modal) { + if (Main.pushModal(this._overview, + { actionMode: Shell.ActionMode.OVERVIEW })) { + this._modal = true; + } else { + this.hide(); + return false; + } + } + } + } else { + if (this._modal) { + Main.popModal(this._overview); + this._modal = false; + } + } + return true; + } + + // show: + // + // Animates the overview visible and grabs mouse and keyboard input + show() { + if (this.isDummy) + return; + if (this._shown) + return; + this._shown = true; + + if (!this._syncGrab()) + return; + + Main.layoutManager.showOverview(); + this._animateVisible(); + } + + + _animateVisible() { + if (this.visible || this.animationInProgress) + return; + + this.visible = true; + this.animationInProgress = true; + this.visibleTarget = true; + this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC; + + Meta.disable_unredirect_for_display(global.display); + this.viewSelector.show(); + + this._overview.opacity = 0; + Tweener.addTween(this._overview, + { opacity: 255, + transition: 'easeOutQuad', + time: ANIMATION_TIME, + onComplete: this._showDone, + onCompleteScope: this + }); + this._shadeBackgrounds(); + + this._coverPane.raise_top(); + this._coverPane.show(); + this.emit('showing'); + } + + _showDone() { + this.animationInProgress = false; + this._desktopFade.hide(); + this._coverPane.hide(); + + this.emit('shown'); + // Handle any calls to hide* while we were showing + if (!this._shown) + this._animateNotVisible(); + + this._syncGrab(); + global.sync_pointer(); + } + + // hide: + // + // Reverses the effect of show() + hide() { + if (this.isDummy) + return; + + if (!this._shown) + return; + + let event = Clutter.get_current_event(); + if (event) { + let type = event.type(); + let button = (type == Clutter.EventType.BUTTON_PRESS || + type == Clutter.EventType.BUTTON_RELEASE); + let ctrl = (event.get_state() & Clutter.ModifierType.CONTROL_MASK) != 0; + if (button && ctrl) + return; + } + + this._shown = false; + + this._animateNotVisible(); + this._syncGrab(); + } + + _animateNotVisible() { + if (!this.visible || this.animationInProgress) + return; + + this.animationInProgress = true; + this.visibleTarget = false; + + this.viewSelector.animateFromOverview(); + + // Make other elements fade out. + Tweener.addTween(this._overview, + { opacity: 0, + transition: 'easeOutQuad', + time: ANIMATION_TIME, + onComplete: this._hideDone, + onCompleteScope: this + }); + this._unshadeBackgrounds(); + + this._coverPane.raise_top(); + this._coverPane.show(); + this.emit('hiding'); + } + + _hideDone() { + // Re-enable unredirection + Meta.enable_unredirect_for_display(global.display); + + this.viewSelector.hide(); + this._desktopFade.hide(); + this._coverPane.hide(); + + this.visible = false; + this.animationInProgress = false; + + this.emit('hidden'); + // Handle any calls to show* while we were hiding + if (this._shown) + this._animateVisible(); + else + Main.layoutManager.hideOverview(); + + this._syncGrab(); + } + + toggle() { + if (this.isDummy) + return; + + if (this.visible) + this.hide(); + else + this.show(); + } + + getShowAppsButton() { + return this._dash.showAppsButton; + } +}; +Signals.addSignalMethods(Overview.prototype); diff --git a/js/ui/overviewControls.js b/js/ui/overviewControls.js new file mode 100644 index 0000000..930bbb2 --- /dev/null +++ b/js/ui/overviewControls.js @@ -0,0 +1,498 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, Meta, St } = imports.gi; + +const Dash = imports.ui.dash; +const Main = imports.ui.main; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; +const ViewSelector = imports.ui.viewSelector; +const WorkspaceThumbnail = imports.ui.workspaceThumbnail; + +var SIDE_CONTROLS_ANIMATION_TIME = 0.16; + +function getRtlSlideDirection(direction, actor) { + let rtl = (actor.text_direction == Clutter.TextDirection.RTL); + if (rtl) + direction = (direction == SlideDirection.LEFT) ? + SlideDirection.RIGHT : SlideDirection.LEFT; + + return direction; +}; + +var SlideDirection = { + LEFT: 0, + RIGHT: 1 +}; + +var SlideLayout = GObject.registerClass( +class SlideLayout extends Clutter.FixedLayout { + _init(params) { + this._slideX = 1; + this._translationX = undefined; + this._direction = SlideDirection.LEFT; + + super._init(params); + } + + vfunc_get_preferred_width(container, forHeight) { + let child = container.get_first_child(); + + let [minWidth, natWidth] = child.get_preferred_width(forHeight); + + minWidth *= this._slideX; + natWidth *= this._slideX; + + return [minWidth, natWidth]; + } + + vfunc_allocate(container, box, flags) { + let child = container.get_first_child(); + + let availWidth = Math.round(box.x2 - box.x1); + let availHeight = Math.round(box.y2 - box.y1); + let [, natWidth] = child.get_preferred_width(availHeight); + + // Align the actor inside the clipped box, as the actor's alignment + // flags only determine what to do if the allocated box is bigger + // than the actor's box. + let realDirection = getRtlSlideDirection(this._direction, child); + let alignX = (realDirection == SlideDirection.LEFT) ? (availWidth - natWidth) + : (availWidth - natWidth * this._slideX); + + let actorBox = new Clutter.ActorBox(); + actorBox.x1 = box.x1 + alignX + this._translationX; + actorBox.x2 = actorBox.x1 + (child.x_expand ? availWidth : natWidth); + actorBox.y1 = box.y1; + actorBox.y2 = actorBox.y1 + availHeight; + + child.allocate(actorBox, flags); + } + + set slideX(value) { + this._slideX = value; + this.layout_changed(); + } + + get slideX() { + return this._slideX; + } + + set slideDirection(direction) { + this._direction = direction; + this.layout_changed(); + } + + get slideDirection() { + return this._direction; + } + + set translationX(value) { + this._translationX = value; + this.layout_changed(); + } + + get translationX() { + return this._translationX; + } +}); + +var SlidingControl = class { + constructor(params) { + params = Params.parse(params, { slideDirection: SlideDirection.LEFT }); + + this._visible = true; + this._inDrag = false; + + this.layout = new SlideLayout(); + this.layout.slideDirection = params.slideDirection; + this.actor = new St.Widget({ layout_manager: this.layout, + style_class: 'overview-controls', + clip_to_allocation: true }); + + Main.overview.connect('hiding', this._onOverviewHiding.bind(this)); + + Main.overview.connect('item-drag-begin', this._onDragBegin.bind(this)); + Main.overview.connect('item-drag-end', this._onDragEnd.bind(this)); + Main.overview.connect('item-drag-cancelled', this._onDragEnd.bind(this)); + + Main.overview.connect('window-drag-begin', this._onWindowDragBegin.bind(this)); + Main.overview.connect('window-drag-cancelled', this._onWindowDragEnd.bind(this)); + Main.overview.connect('window-drag-end', this._onWindowDragEnd.bind(this)); + } + + _getSlide() { + throw new Error('getSlide() must be overridden'); + } + + _updateSlide() { + Tweener.addTween(this.layout, { slideX: this._getSlide(), + time: SIDE_CONTROLS_ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + + getVisibleWidth() { + let child = this.actor.get_first_child(); + let [, , natWidth, ] = child.get_preferred_size(); + return natWidth; + } + + _getTranslation() { + let child = this.actor.get_first_child(); + let direction = getRtlSlideDirection(this.layout.slideDirection, child); + let visibleWidth = this.getVisibleWidth(); + + if (direction == SlideDirection.LEFT) + return - visibleWidth; + else + return visibleWidth; + } + + _updateTranslation() { + let translationStart = 0; + let translationEnd = 0; + let translation = this._getTranslation(); + + let shouldShow = (this._getSlide() > 0); + if (shouldShow) { + translationStart = translation; + } else { + translationEnd = translation; + } + + if (this.layout.translationX == translationEnd) + return; + + this.layout.translationX = translationStart; + Tweener.addTween(this.layout, { translationX: translationEnd, + time: SIDE_CONTROLS_ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + + _onOverviewHiding() { + // We need to explicitly slideOut since showing pages + // doesn't imply sliding out, instead, hiding the overview does. + this.slideOut(); + } + + _onWindowDragBegin() { + this._onDragBegin(); + } + + _onWindowDragEnd() { + this._onDragEnd(); + } + + _onDragBegin() { + this._inDrag = true; + this._updateTranslation(); + this._updateSlide(); + } + + _onDragEnd() { + this._inDrag = false; + this._updateSlide(); + } + + fadeIn() { + Tweener.addTween(this.actor, { opacity: 255, + time: SIDE_CONTROLS_ANIMATION_TIME / 2, + transition: 'easeInQuad' + }); + } + + fadeHalf() { + Tweener.addTween(this.actor, { opacity: 128, + time: SIDE_CONTROLS_ANIMATION_TIME / 2, + transition: 'easeOutQuad' + }); + } + + slideIn() { + this._visible = true; + // we will update slideX and the translation from pageEmpty + } + + slideOut() { + this._visible = false; + this._updateTranslation(); + // we will update slideX from pageEmpty + } + + pageEmpty() { + // When pageEmpty is received, there's no visible view in the + // selector; this means we can now safely set the full slide for + // the next page, since slideIn or slideOut might have been called, + // changing the visiblity + this.layout.slideX = this._getSlide(); + this._updateTranslation(); + } +}; + +var ThumbnailsSlider = class extends SlidingControl { + constructor(thumbnailsBox) { + super({ slideDirection: SlideDirection.RIGHT }); + + this._thumbnailsBox = thumbnailsBox; + + this.actor.request_mode = Clutter.RequestMode.WIDTH_FOR_HEIGHT; + this.actor.reactive = true; + this.actor.track_hover = true; + this.actor.add_actor(this._thumbnailsBox); + + Main.layoutManager.connect('monitors-changed', this._updateSlide.bind(this)); + global.workspace_manager.connect('active-workspace-changed', + this._updateSlide.bind(this)); + global.workspace_manager.connect('notify::n-workspaces', + this._updateSlide.bind(this)); + this.actor.connect('notify::hover', this._updateSlide.bind(this)); + this._thumbnailsBox.bind_property('visible', this.actor, 'visible', GObject.BindingFlags.SYNC_CREATE); + } + + _getAlwaysZoomOut() { + // Always show the pager on hover, during a drag, or if workspaces are + // actually used, e.g. there are windows on any non-active workspace + let workspaceManager = global.workspace_manager; + let alwaysZoomOut = this.actor.hover || + this._inDrag || + !Meta.prefs_get_dynamic_workspaces() || + workspaceManager.n_workspaces > 2 || + workspaceManager.get_active_workspace_index() != 0; + + if (!alwaysZoomOut) { + let monitors = Main.layoutManager.monitors; + let primary = Main.layoutManager.primaryMonitor; + + /* Look for any monitor to the right of the primary, if there is + * one, we always keep zoom out, otherwise its hard to reach + * the thumbnail area without passing into the next monitor. */ + for (let i = 0; i < monitors.length; i++) { + if (monitors[i].x >= primary.x + primary.width) { + alwaysZoomOut = true; + break; + } + } + } + + return alwaysZoomOut; + } + + getNonExpandedWidth() { + let child = this.actor.get_first_child(); + return child.get_theme_node().get_length('visible-width'); + } + + _onDragEnd() { + this.actor.sync_hover(); + super._onDragEnd(); + } + + _getSlide() { + if (!this._visible) + return 0; + + let alwaysZoomOut = this._getAlwaysZoomOut(); + if (alwaysZoomOut) + return 1; + + let child = this.actor.get_first_child(); + let preferredHeight = child.get_preferred_height(-1)[1]; + let expandedWidth = child.get_preferred_width(preferredHeight)[1]; + + return this.getNonExpandedWidth() / expandedWidth; + } + + getVisibleWidth() { + let alwaysZoomOut = this._getAlwaysZoomOut(); + if (alwaysZoomOut) + return super.getVisibleWidth(); + else + return this.getNonExpandedWidth(); + } +}; + +var DashSlider = class extends SlidingControl { + constructor(dash) { + super({ slideDirection: SlideDirection.LEFT }); + + this._dash = dash; + + // SlideLayout reads the actor's expand flags to decide + // whether to allocate the natural size to its child, or the whole + // available allocation + this._dash.actor.x_expand = true; + + this.actor.x_expand = true; + this.actor.x_align = Clutter.ActorAlign.START; + this.actor.y_expand = true; + + this.actor.add_actor(this._dash.actor); + + this._dash.connect('icon-size-changed', this._updateSlide.bind(this)); + } + + _getSlide() { + if (this._visible || this._inDrag) + return 1; + else + return 0; + } + + _onWindowDragBegin() { + this.fadeHalf(); + } + + _onWindowDragEnd() { + this.fadeIn(); + } +}; + +var DashSpacer = GObject.registerClass( +class DashSpacer extends St.Widget { + _init(params) { + super._init(params); + + this._bindConstraint = null; + } + + setDashActor(dashActor) { + if (this._bindConstraint) { + this.remove_constraint(this._bindConstraint); + this._bindConstraint = null; + } + + if (dashActor) { + this._bindConstraint = new Clutter.BindConstraint({ source: dashActor, + coordinate: Clutter.BindCoordinate.SIZE }); + this.add_constraint(this._bindConstraint); + } + } + + vfunc_get_preferred_width(forHeight) { + if (this._bindConstraint) + return this._bindConstraint.source.get_preferred_width(forHeight); + return super.vfunc_get_preferred_width(forHeight); + } + + vfunc_get_preferred_height(forWidth) { + if (this._bindConstraint) + return this._bindConstraint.source.get_preferred_height(forWidth); + return super.vfunc_get_preferred_height(forWidth); + } +}); + +var ControlsLayout = GObject.registerClass({ + Signals: { 'allocation-changed': { flags: GObject.SignalFlags.RUN_LAST } }, +}, class ControlsLayout extends Clutter.BinLayout { + vfunc_allocate(container, box, flags) { + super.vfunc_allocate(container, box, flags); + this.emit('allocation-changed'); + } +}); + +var ControlsManager = class { + constructor(searchEntry) { + this.dash = new Dash.Dash(); + this._dashSlider = new DashSlider(this.dash); + this._dashSpacer = new DashSpacer(); + this._dashSpacer.setDashActor(this._dashSlider.actor); + + this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox(); + this._thumbnailsSlider = new ThumbnailsSlider(this._thumbnailsBox); + + this.viewSelector = new ViewSelector.ViewSelector(searchEntry, + this.dash.showAppsButton); + this.viewSelector.connect('page-changed', this._setVisibility.bind(this)); + this.viewSelector.connect('page-empty', this._onPageEmpty.bind(this)); + + let layout = new ControlsLayout(); + this.actor = new St.Widget({ layout_manager: layout, + x_expand: true, y_expand: true, + clip_to_allocation: true }); + this._group = new St.BoxLayout({ name: 'overview-group', + x_expand: true, y_expand: true }); + this.actor.add_actor(this._group); + + this.actor.add_actor(this._dashSlider.actor); + + this._group.add_actor(this._dashSpacer); + this._group.add(this.viewSelector.actor, { x_fill: true, + expand: true }); + this._group.add_actor(this._thumbnailsSlider.actor); + + layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this)); + + Main.overview.connect('showing', this._updateSpacerVisibility.bind(this)); + Main.overview.connect('item-drag-begin', () => { + let activePage = this.viewSelector.getActivePage(); + if (activePage != ViewSelector.ViewPage.WINDOWS) + this.viewSelector.fadeHalf(); + }); + Main.overview.connect('item-drag-end', () => { + this.viewSelector.fadeIn(); + }); + Main.overview.connect('item-drag-cancelled', () => { + this.viewSelector.fadeIn(); + }); + } + + _updateWorkspacesGeometry() { + let [x, y] = this.actor.get_transformed_position(); + let [width, height] = this.actor.get_transformed_size(); + let geometry = { x: x, y: y, width: width, height: height }; + + let spacing = this.actor.get_theme_node().get_length('spacing'); + let dashWidth = this._dashSlider.getVisibleWidth() + spacing; + let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing; + + geometry.width -= dashWidth; + geometry.width -= thumbnailsWidth; + + if (this.actor.get_text_direction() == Clutter.TextDirection.LTR) + geometry.x += dashWidth; + else + geometry.x += thumbnailsWidth; + + this.viewSelector.setWorkspacesFullGeometry(geometry); + } + + _setVisibility() { + // Ignore the case when we're leaving the overview, since + // actors will be made visible again when entering the overview + // next time, and animating them while doing so is just + // unnecessary noise + if (!Main.overview.visible || + (Main.overview.animationInProgress && !Main.overview.visibleTarget)) + return; + + let activePage = this.viewSelector.getActivePage(); + let dashVisible = (activePage == ViewSelector.ViewPage.WINDOWS || + activePage == ViewSelector.ViewPage.APPS); + let thumbnailsVisible = (activePage == ViewSelector.ViewPage.WINDOWS); + + if (dashVisible) + this._dashSlider.slideIn(); + else + this._dashSlider.slideOut(); + + if (thumbnailsVisible) + this._thumbnailsSlider.slideIn(); + else + this._thumbnailsSlider.slideOut(); + } + + _updateSpacerVisibility() { + if (Main.overview.animationInProgress && !Main.overview.visibleTarget) + return; + + let activePage = this.viewSelector.getActivePage(); + this._dashSpacer.visible = (activePage == ViewSelector.ViewPage.WINDOWS); + } + + _onPageEmpty() { + this._dashSlider.pageEmpty(); + this._thumbnailsSlider.pageEmpty(); + + this._updateSpacerVisibility(); + } +}; diff --git a/js/ui/padOsd.js b/js/ui/padOsd.js new file mode 100644 index 0000000..a4af472 --- /dev/null +++ b/js/ui/padOsd.js @@ -0,0 +1,976 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atk, Clutter, GDesktopEnums, Gio, + GLib, GObject, Gtk, Meta, Rsvg, St } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Layout = imports.ui.layout; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const ACTIVE_COLOR = "#729fcf"; + +const LTR = 0; +const RTL = 1; + +const CW = 0; +const CCW = 1; + +const UP = 0; +const DOWN = 1; + +var PadChooser = class { + constructor(device, groupDevices) { + this.actor = new St.Button({ style_class: 'pad-chooser-button', + toggle_mode: true, + x_fill: false, + y_fill: false, + x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE }); + this.currentDevice = device; + this._padChooserMenu = null; + + let arrow = new St.Icon({ style_class: 'popup-menu-arrow', + icon_name: 'pan-down-symbolic', + accessible_role: Atk.Role.ARROW }); + this.actor.set_child(arrow); + this._ensureMenu(groupDevices); + + this.actor.connect('destroy', this._onDestroy.bind(this)); + this.actor.connect('clicked', actor => { + if (actor.get_checked()) { + if (this._padChooserMenu != null) + this._padChooserMenu.open(true); + else + this.set_checked(false); + } else { + this._padChooserMenu.close(true); + } + }); + } + + _ensureMenu(devices) { + this._padChooserMenu = new PopupMenu.PopupMenu(this.actor, 0.5, St.Side.TOP); + this._padChooserMenu.connect('menu-closed', () => { + this.actor.set_checked(false); + }); + this._padChooserMenu.actor.hide(); + Main.uiGroup.add_actor(this._padChooserMenu.actor); + + for (let i = 0; i < devices.length; i++) { + let device = devices[i]; + if (device == this.currentDevice) + continue; + + this._padChooserMenu.addAction(device.get_device_name(), () => { + this.emit('pad-selected', device); + }); + } + } + + _onDestroy() { + this._padChooserMenu.destroy(); + } + + update(devices) { + if (this._padChooserMenu) + this._padChooserMenu.actor.destroy(); + this.actor.set_checked(false); + this._ensureMenu(devices); + } + + destroy() { + this.actor.destroy(); + } +}; +Signals.addSignalMethods(PadChooser.prototype); + +var KeybindingEntry = class { + constructor() { + this.actor = new St.Entry({ hint_text: _("New shortcut…"), + style: 'width: 10em' }); + this.actor.connect('captured-event', this._onCapturedEvent.bind(this)); + } + + _onCapturedEvent(actor, event) { + if (event.type() != Clutter.EventType.KEY_PRESS) + return Clutter.EVENT_PROPAGATE; + + let str = Gtk.accelerator_name_with_keycode(null, + event.get_key_symbol(), + event.get_key_code(), + event.get_state()); + this.actor.set_text(str); + this.emit('keybinding-edited', str); + return Clutter.EVENT_STOP; + } +}; +Signals.addSignalMethods(KeybindingEntry.prototype); + +var ActionComboBox = class { + constructor() { + this.actor = new St.Button({ style_class: 'button' }); + this.actor.connect('clicked', this._onButtonClicked.bind(this)); + this.actor.set_toggle_mode(true); + + let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL, + spacing: 6 }); + let box = new St.Widget({ layout_manager: boxLayout }); + this.actor.set_child(box); + + this._label = new St.Label({ style_class: 'combo-box-label' }); + box.add_child(this._label) + + let arrow = new St.Icon({ style_class: 'popup-menu-arrow', + icon_name: 'pan-down-symbolic', + accessible_role: Atk.Role.ARROW, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + box.add_child(arrow); + + this._editMenu = new PopupMenu.PopupMenu(this.actor, 0, St.Side.TOP); + this._editMenu.connect('menu-closed', () => { + this.actor.set_checked(false); + }); + this._editMenu.actor.hide(); + Main.uiGroup.add_actor(this._editMenu.actor); + + this._actionLabels = new Map(); + this._actionLabels.set(GDesktopEnums.PadButtonAction.NONE, _("Application defined")); + this._actionLabels.set(GDesktopEnums.PadButtonAction.HELP, _("Show on-screen help")); + this._actionLabels.set(GDesktopEnums.PadButtonAction.SWITCH_MONITOR, _("Switch monitor")); + this._actionLabels.set(GDesktopEnums.PadButtonAction.KEYBINDING, _("Assign keystroke")); + + this._buttonItems = []; + + for (let [action, label] of this._actionLabels.entries()) { + let selectedAction = action; + let item = this._editMenu.addAction(label, () => { + this._onActionSelected(selectedAction); + }); + + /* These actions only apply to pad buttons */ + if (selectedAction == GDesktopEnums.PadButtonAction.HELP || + selectedAction == GDesktopEnums.PadButtonAction.SWITCH_MONITOR) + this._buttonItems.push(item); + } + + this.setAction(GDesktopEnums.PadButtonAction.NONE); + } + + _onActionSelected(action) { + this.setAction(action); + this.popdown(); + this.emit('action-selected', action); + } + + setAction(action) { + this._label.set_text(this._actionLabels.get(action)); + } + + popup() { + this._editMenu.open(true); + } + + popdown() { + this._editMenu.close(true); + } + + _onButtonClicked() { + if (this.actor.get_checked()) + this.popup(); + else + this.popdown(); + } + + setButtonActionsActive(active) { + this._buttonItems.forEach(item => { item.setSensitive(active); }); + } +}; +Signals.addSignalMethods(ActionComboBox.prototype); + +var ActionEditor = class { + constructor() { + let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL, + spacing: 12 }); + + this.actor = new St.Widget({ layout_manager: boxLayout }); + + this._actionComboBox = new ActionComboBox(); + this._actionComboBox.connect('action-selected', this._onActionSelected.bind(this)); + this.actor.add_actor(this._actionComboBox.actor); + + this._keybindingEdit = new KeybindingEntry(); + this._keybindingEdit.connect('keybinding-edited', this._onKeybindingEdited.bind(this)); + this.actor.add_actor(this._keybindingEdit.actor); + + this._doneButton = new St.Button({ label: _("Done"), + style_class: 'button', + x_expand: false}); + this._doneButton.connect('clicked', this._onEditingDone.bind(this)); + this.actor.add_actor(this._doneButton); + } + + _updateKeybindingEntryState() { + if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING) { + this._keybindingEdit.actor.set_text(this._currentKeybinding); + this._keybindingEdit.actor.show(); + this._keybindingEdit.actor.grab_key_focus(); + } else { + this._keybindingEdit.actor.hide(); + } + } + + setSettings(settings, action) { + this._buttonSettings = settings; + + this._currentAction = this._buttonSettings.get_enum('action'); + this._currentKeybinding = this._buttonSettings.get_string('keybinding'); + this._actionComboBox.setAction(this._currentAction); + this._updateKeybindingEntryState(); + + let isButton = (action == Meta.PadActionType.BUTTON); + this._actionComboBox.setButtonActionsActive(isButton); + } + + close() { + this._actionComboBox.popdown(); + this.actor.hide(); + } + + _onKeybindingEdited(entry, keybinding) { + this._currentKeybinding = keybinding; + } + + _onActionSelected(menu, action) { + this._currentAction = action; + this._updateKeybindingEntryState(); + } + + _storeSettings() { + if (!this._buttonSettings) + return; + + let keybinding = null; + + if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING) + keybinding = this._currentKeybinding; + + this._buttonSettings.set_enum('action', this._currentAction); + + if (keybinding) + this._buttonSettings.set_string('keybinding', keybinding); + else + this._buttonSettings.reset('keybinding'); + } + + _onEditingDone() { + this._storeSettings(); + this.close(); + this.emit('done'); + } +}; +Signals.addSignalMethods(ActionEditor.prototype); + +var PadDiagram = GObject.registerClass({ + Properties: { 'left-handed': GObject.ParamSpec.boolean('left-handed', + 'left-handed', 'Left handed', + GObject.ParamFlags.READWRITE | + GObject.ParamFlags.CONSTRUCT_ONLY, + false), + 'image': GObject.ParamSpec.string('image', 'image', 'Image', + GObject.ParamFlags.READWRITE | + GObject.ParamFlags.CONSTRUCT_ONLY, + null), + 'editor-actor': GObject.ParamSpec.object('editor-actor', + 'editor-actor', + 'Editor actor', + GObject.ParamFlags.READWRITE | + GObject.ParamFlags.CONSTRUCT_ONLY, + Clutter.Actor.$gtype) }, +}, class PadDiagram extends St.DrawingArea { + _init(params) { + let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css'); + let [success, css, etag] = file.load_contents(null); + if (css instanceof Uint8Array) + css = imports.byteArray.toString(css); + this._curEdited = null; + this._prevEdited = null; + this._css = css; + this._labels = []; + this._activeButtons = []; + super._init(params); + } + + get left_handed() { + return this._leftHanded; + } + + set left_handed(leftHanded) { + this._leftHanded = leftHanded; + } + + get image() { + return this._imagePath; + } + + set image(imagePath) { + let originalHandle = Rsvg.Handle.new_from_file(imagePath); + let dimensions = originalHandle.get_dimensions(); + this._imageWidth = dimensions.width; + this._imageHeight = dimensions.height; + + this._imagePath = imagePath; + this._handle = this._composeStyledDiagram(); + } + + get editor_actor() { + return this._editorActor; + } + + set editor_actor(actor) { + actor.hide(); + this._editorActor = actor; + this.add_actor(actor); + } + + _wrappingSvgHeader() { + return ('' + + ' ' + + '' + + '' + + ''); + } + + _cssString() { + let css = this._css; + + for (let i = 0; i < this._activeButtons.length; i++) { + let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]); + css += ('.' + ch + ' { ' + + ' stroke: ' + ACTIVE_COLOR + ' !important; ' + + ' fill: ' + ACTIVE_COLOR + ' !important; ' + + '} '); + } + + return css; + } + + _composeStyledDiagram() { + let svgData = ''; + + if (!GLib.file_test(this._imagePath, GLib.FileTest.EXISTS)) + return null; + + svgData += this._wrappingSvgHeader(); + svgData += this._cssString(); + svgData += this._wrappingSvgFooter(); + + let istream = new Gio.MemoryInputStream(); + istream.add_bytes(new GLib.Bytes(svgData)); + + return Rsvg.Handle.new_from_stream_sync(istream, + Gio.File.new_for_path(this._imagePath), + 0, null); + } + + _updateDiagramScale() { + if (this._handle == null) + return; + + [this._actorWidth, this._actorHeight] = this.get_size(); + let dimensions = this._handle.get_dimensions(); + let scaleX = this._actorWidth / dimensions.width; + let scaleY = this._actorHeight / dimensions.height; + this._scale = Math.min(scaleX, scaleY); + } + + _allocateChild(child, x, y, direction) { + let [prefHeight, natHeight] = child.get_preferred_height(-1); + let [prefWidth, natWidth] = child.get_preferred_width(natHeight); + let childBox = new Clutter.ActorBox(); + + if (direction == LTR) { + childBox.x1 = x; + childBox.x2 = x + natWidth; + } else { + childBox.x1 = x - natWidth; + childBox.x2 = x; + } + + childBox.y1 = y - natHeight / 2; + childBox.y2 = y + natHeight / 2; + child.allocate(childBox, 0); + } + + vfunc_allocate(box, flags) { + super.vfunc_allocate(box, flags); + this._updateDiagramScale(); + + for (let i = 0; i < this._labels.length; i++) { + let [label, action, idx, dir] = this._labels[i]; + let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir); + this._allocateChild(label, x, y, arrangement); + } + + if (this._editorActor && this._curEdited) { + let [label, action, idx, dir] = this._curEdited; + let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir); + this._allocateChild(this._editorActor, x, y, arrangement); + } + } + + vfunc_repaint() { + if (this._handle == null) + return; + + if (this._scale == null) + this._updateDiagramScale(); + + let [width, height] = this.get_surface_size(); + let dimensions = this._handle.get_dimensions(); + let cr = this.get_context(); + + cr.save(); + cr.translate(width/2, height/2); + cr.scale(this._scale, this._scale); + if (this._leftHanded) + cr.rotate(Math.PI); + cr.translate(-dimensions.width/2, -dimensions.height/2); + this._handle.render_cairo(cr); + cr.restore(); + cr.$dispose(); + } + + _transformPoint(x, y) { + if (this._handle == null || this._scale == null) + return [x, y]; + + // I miss Cairo.Matrix + let dimensions = this._handle.get_dimensions(); + x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale; + y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;; + return [Math.round(x), Math.round(y)]; + } + + _getItemLabelCoords(labelName, leaderName) { + if (this._handle == null) + return [false]; + + let leaderPos, leaderSize, pos; + let found, direction; + + [found, pos] = this._handle.get_position_sub('#' + labelName); + if (!found) + return [false]; + + [found, leaderPos] = this._handle.get_position_sub('#' + leaderName); + [found, leaderSize] = this._handle.get_dimensions_sub('#' + leaderName); + if (!found) + return [false]; + + if (pos.x > leaderPos.x + leaderSize.width) + direction = LTR; + else + direction = RTL; + + if (this._leftHanded) { + direction = 1 - direction; + pos.x = this._imageWidth - pos.x; + pos.y = this._imageHeight - pos.y; + } + + let [x, y] = this._transformPoint(pos.x, pos.y) + + return [true, x, y, direction]; + } + + getButtonLabelCoords(button) { + let ch = String.fromCharCode('A'.charCodeAt() + button); + let labelName = 'Label' + ch; + let leaderName = 'Leader' + ch; + + return this._getItemLabelCoords(labelName, leaderName); + } + + getRingLabelCoords(number, dir) { + let numStr = number > 0 ? (number + 1).toString() : ''; + let dirStr = dir == CW ? 'CW' : 'CCW'; + let labelName = 'LabelRing' + numStr + dirStr; + let leaderName = 'LeaderRing' + numStr + dirStr; + + return this._getItemLabelCoords(labelName, leaderName); + } + + getStripLabelCoords(number, dir) { + let numStr = number > 0 ? (number + 1).toString() : ''; + let dirStr = dir == UP ? 'Up' : 'Down'; + let labelName = 'LabelStrip' + numStr + dirStr; + let leaderName = 'LeaderStrip' + numStr + dirStr; + + return this._getItemLabelCoords(labelName, leaderName); + } + + getLabelCoords(action, idx, dir) { + if (action == Meta.PadActionType.BUTTON) + return this.getButtonLabelCoords(idx); + else if (action == Meta.PadActionType.RING) + return this.getRingLabelCoords(idx, dir); + else if (action == Meta.PadActionType.STRIP) + return this.getStripLabelCoords(idx, dir); + + return [false]; + } + + _invalidateSvg() { + if (this._handle == null) + return; + this._handle = this._composeStyledDiagram(); + this.queue_repaint(); + } + + activateButton(button) { + this._activeButtons.push(button); + this._invalidateSvg(); + } + + deactivateButton(button) { + for (let i = 0; i < this._activeButtons.length; i++) { + if (this._activeButtons[i] == button) + this._activeButtons.splice(i, 1); + } + this._invalidateSvg(); + } + + addLabel(label, type, idx, dir) { + this._labels.push([label, type, idx, dir]); + this.add_actor(label); + } + + _applyLabel(label, action, idx, dir, str) { + if (str != null) { + label.set_text(str); + + let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir); + this._allocateChild(label, x, y, arrangement); + } + label.show(); + } + + stopEdition(continues, str) { + this._editorActor.hide(); + + if (this._prevEdited) { + let [label, action, idx, dir] = this._prevEdited; + this._applyLabel(label, action, idx, dir, str); + this._prevEdited = null; + } + + if (this._curEdited) { + let [label, action, idx, dir] = this._curEdited; + this._applyLabel(label, action, idx, dir, str); + if (continues) + this._prevEdited = this._curEdited; + this._curEdited = null; + } + } + + startEdition(action, idx, dir) { + let editedLabel; + + if (this._curEdited) + return; + + for (let i = 0; i < this._labels.length; i++) { + let [label, itemAction, itemIdx, itemDir] = this._labels[i]; + if (action == itemAction && idx == itemIdx && dir == itemDir) { + this._curEdited = this._labels[i]; + editedLabel = label; + break; + } + } + + if (this._curEdited == null) + return; + let [found] = this.getLabelCoords(action, idx, dir); + if (!found) + return; + this._editorActor.show(); + editedLabel.hide(); + } +}); + +var PadOsd = class { + constructor(padDevice, settings, imagePath, editionMode, monitorIndex) { + this.padDevice = padDevice; + this._groupPads = [ padDevice ]; + this._settings = settings; + this._imagePath = imagePath; + this._editionMode = editionMode; + this._capturedEventId = global.stage.connect('captured-event', this._onCapturedEvent.bind(this)); + this._padChooser = null; + + let deviceManager = Clutter.DeviceManager.get_default(); + this._deviceAddedId = deviceManager.connect('device-added', (manager, device) => { + if (device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE && + this.padDevice.is_grouped(device)) { + this._groupPads.push(device); + this._updatePadChooser(); + } + }); + this._deviceRemovedId = deviceManager.connect('device-removed', (manager, device) => { + // If the device is being removed, destroy the padOsd. + if (device == this.padDevice) { + this.destroy(); + } else if (this._groupPads.indexOf(device) != -1) { + // Or update the pad chooser if the device belongs to + // the same group. + this._groupPads.splice(this._groupPads.indexOf(device), 1); + this._updatePadChooser(); + + } + }); + + deviceManager.list_devices().forEach(device => { + if (device != this.padDevice && + device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE && + this.padDevice.is_grouped(device)) + this._groupPads.push(device); + }); + + this.actor = new St.BoxLayout({ style_class: 'pad-osd-window', + x_expand: true, + y_expand: true, + vertical: true, + reactive: true }); + this.actor.connect('destroy', this._onDestroy.bind(this)); + Main.uiGroup.add_actor(this.actor); + + this._monitorIndex = monitorIndex; + let constraint = new Layout.MonitorConstraint({ index: monitorIndex }); + this.actor.add_constraint(constraint); + + this._titleBox = new St.BoxLayout({ style_class: 'pad-osd-title-box', + vertical: false, + x_expand: false, + x_align: Clutter.ActorAlign.CENTER }); + this.actor.add_actor(this._titleBox); + + let labelBox = new St.BoxLayout({ style_class: 'pad-osd-title-menu-box', + vertical: true }); + this._titleBox.add_actor(labelBox); + + this._titleLabel = new St.Label({ style: 'font-side: larger; font-weight: bold;', + x_align: Clutter.ActorAlign.CENTER }); + this._titleLabel.clutter_text.set_text(padDevice.get_device_name()); + labelBox.add_actor(this._titleLabel); + + this._tipLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER }); + labelBox.add_actor(this._tipLabel); + + this._updatePadChooser(); + + this._actionEditor = new ActionEditor(); + this._actionEditor.connect('done', this._endActionEdition.bind(this)); + + this._padDiagram = new PadDiagram({ image: this._imagePath, + left_handed: settings.get_boolean('left-handed'), + editor_actor: this._actionEditor.actor, + x_expand: true, + y_expand: true }); + this.actor.add_actor(this._padDiagram); + + // FIXME: Fix num buttons. + let i = 0; + for (i = 0; i < 50; i++) { + let [found] = this._padDiagram.getButtonLabelCoords(i); + if (!found) + break; + this._createLabel(Meta.PadActionType.BUTTON, i); + } + + for (i = 0; i < padDevice.get_n_rings(); i++) { + let [found] = this._padDiagram.getRingLabelCoords(i, CW); + if (!found) + break; + this._createLabel(Meta.PadActionType.RING, i, CW); + this._createLabel(Meta.PadActionType.RING, i, CCW); + } + + for (i = 0; i < padDevice.get_n_strips(); i++) { + let [found] = this._padDiagram.getStripLabelCoords(i, UP); + if (!found) + break; + this._createLabel(Meta.PadActionType.STRIP, i, UP); + this._createLabel(Meta.PadActionType.STRIP, i, DOWN); + } + + let buttonBox = new St.Widget({ layout_manager: new Clutter.BinLayout(), + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER }); + this.actor.add_actor(buttonBox); + this._editButton = new St.Button({ label: _("Edit…"), + style_class: 'button', + x_align: Clutter.ActorAlign.CENTER, + can_focus: true }); + this._editButton.connect('clicked', () => { + this.setEditionMode(true); + }); + buttonBox.add_actor(this._editButton); + + this._syncEditionMode(); + Main.pushModal(this.actor); + } + + _updatePadChooser() { + if (this._groupPads.length > 1) { + if (this._padChooser == null) { + this._padChooser = new PadChooser(this.padDevice, this._groupPads) + this._padChooser.connect('pad-selected', (chooser, pad) => { + this._requestForOtherPad(pad); + }); + this._titleBox.add_child(this._padChooser.actor); + } else { + this._padChooser.update(this._groupPads); + } + } else if (this._padChooser != null) { + this._padChooser.destroy(); + this._padChooser = null; + } + } + + _requestForOtherPad(pad) { + if (pad == this.padDevice || + this._groupPads.indexOf(pad) == -1) + return; + + let editionMode = this._editionMode; + this.destroy(); + global.display.request_pad_osd(pad, editionMode); + } + + _createLabel(type, number, dir) { + let str = global.display.get_pad_action_label(this.padDevice, type, number); + let label = new St.Label({ text: str ? str : _("None") }); + this._padDiagram.addLabel(label, type, number, dir); + } + + _onCapturedEvent(actor, event) { + if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS && + event.get_source_device() == this.padDevice) { + this._padDiagram.activateButton(event.get_button()); + let isModeSwitch = this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0; + + /* Buttons that switch between modes cannot be edited */ + if (this._editionMode && !isModeSwitch) + this._startButtonActionEdition(event.get_button()); + return Clutter.EVENT_STOP; + } else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE && + event.get_source_device() == this.padDevice) { + this._padDiagram.deactivateButton(event.get_button()); + return Clutter.EVENT_STOP; + } else if (event.type() == Clutter.EventType.KEY_PRESS && + (!this._editionMode || event.get_key_symbol() == Clutter.Escape)) { + if (this._editedAction != null) + this._endActionEdition(); + else + this.destroy(); + return Clutter.EVENT_STOP; + } else if (event.get_source_device() == this.padDevice && + event.type() == Clutter.EventType.PAD_STRIP) { + if (this._editionMode) { + let [retval, number, mode] = event.get_pad_event_details(); + this._startStripActionEdition(number, UP, mode); + } + } else if (event.get_source_device() == this.padDevice && + event.type() == Clutter.EventType.PAD_RING) { + if (this._editionMode) { + let [retval, number, mode] = event.get_pad_event_details(); + this._startRingActionEdition(number, CCW, mode); + } + } + + // If the event comes from another pad in the same group, + // show the OSD for it. + if (this._groupPads.indexOf(event.get_source_device()) != -1) { + this._requestForOtherPad(event.get_source_device()); + return Clutter.EVENT_STOP; + } + + return Clutter.EVENT_PROPAGATE; + } + + _syncEditionMode() { + this._editButton.set_reactive(!this._editionMode); + this._editButton.save_easing_state(); + this._editButton.set_easing_duration(200); + this._editButton.set_opacity(this._editionMode ? 128 : 255); + this._editButton.restore_easing_state(); + + let title; + + if (this._editionMode) { + title = _("Press a button to configure"); + this._tipLabel.set_text(_("Press Esc to exit")); + } else { + title = this.padDevice.get_device_name(); + this._tipLabel.set_text(_("Press any key to exit")); + } + + this._titleLabel.clutter_text.set_markup('' + title + ''); + } + + _isEditedAction(type, number, dir) { + if (!this._editedAction) + return false; + + return (this._editedAction.type == type && + this._editedAction.number == number && + this._editedAction.dir == dir); + } + + _followUpActionEdition(str) { + let { type, dir, number, mode } = this._editedAction; + let hasNextAction = (type == Meta.PadActionType.RING && dir == CCW || + type == Meta.PadActionType.STRIP && dir == UP); + if (!hasNextAction) + return false; + + this._padDiagram.stopEdition(true, str); + this._editedAction = null; + if (type == Meta.PadActionType.RING) + this._startRingActionEdition(number, CW, mode); + else + this._startStripActionEdition(number, DOWN, mode); + + return true; + } + + _endActionEdition() { + this._actionEditor.close(); + + if (this._editedAction != null) { + let str = global.display.get_pad_action_label(this.padDevice, + this._editedAction.type, + this._editedAction.number); + if (this._followUpActionEdition(str)) + return; + + this._padDiagram.stopEdition(false, str ? str : _("None")) + this._editedAction = null; + } + + this._editedActionSettings = null; + } + + _startActionEdition(key, type, number, dir, mode) { + if (this._isEditedAction(type, number, dir)) + return; + + this._endActionEdition(); + this._editedAction = { type, number, dir, mode }; + + let settingsPath = this._settings.path + key + '/'; + this._editedActionSettings = Gio.Settings.new_with_path('org.gnome.desktop.peripherals.tablet.pad-button', + settingsPath); + this._actionEditor.setSettings(this._editedActionSettings, type); + this._padDiagram.startEdition(type, number, dir); + } + + _startButtonActionEdition(button) { + let ch = String.fromCharCode('A'.charCodeAt() + button); + let key = 'button' + ch; + this._startActionEdition(key, Meta.PadActionType.BUTTON, button); + } + + _startRingActionEdition(ring, dir, mode) { + let ch = String.fromCharCode('A'.charCodeAt() + ring); + let key = 'ring%s-%s-mode-%d'.format(ch, dir == CCW ? 'ccw' : 'cw', mode); + this._startActionEdition(key, Meta.PadActionType.RING, ring, dir, mode); + } + + _startStripActionEdition(strip, dir, mode) { + let ch = String.fromCharCode('A'.charCodeAt() + strip); + let key = 'strip%s-%s-mode-%d'.format(ch, dir == UP ? 'up' : 'down', mode); + this._startActionEdition(key, Meta.PadActionType.STRIP, strip, dir, mode); + } + + setEditionMode(editionMode) { + if (this._editionMode == editionMode) + return; + + this._editionMode = editionMode; + this._syncEditionMode(); + } + + destroy() { + this.actor.destroy(); + } + + _onDestroy() { + Main.popModal(this.actor); + this._actionEditor.close(); + + let deviceManager = Clutter.DeviceManager.get_default(); + if (this._deviceRemovedId != 0) { + deviceManager.disconnect(this._deviceRemovedId); + this._deviceRemovedId = 0; + } + if (this._deviceAddedId != 0) { + deviceManager.disconnect(this._deviceAddedId); + this._deviceAddedId = 0; + } + + if (this._capturedEventId != 0) { + global.stage.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + + this.actor = null; + this.emit('closed'); + } +}; +Signals.addSignalMethods(PadOsd.prototype); + +const PadOsdIface = loadInterfaceXML('org.gnome.Shell.Wacom.PadOsd'); + +var PadOsdService = class { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(PadOsdIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Wacom'); + Gio.DBus.session.own_name('org.gnome.Shell.Wacom.PadOsd', Gio.BusNameOwnerFlags.REPLACE, null, null); + } + + ShowAsync(params, invocation) { + let [deviceNode, editionMode] = params; + let deviceManager = Clutter.DeviceManager.get_default(); + let devices = deviceManager.list_devices(); + let padDevice = null; + + devices.forEach(device => { + if (deviceNode == device.get_device_node() && + device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE) + padDevice = device; + }); + + if (padDevice == null) { + invocation.return_error_literal(Gio.IOErrorEnum, + Gio.IOErrorEnum.CANCELLED, + "Invalid params"); + return; + } + + global.display.request_pad_osd(padDevice, editionMode); + invocation.return_value(null); + } +}; +Signals.addSignalMethods(PadOsdService.prototype); diff --git a/js/ui/pageIndicators.js b/js/ui/pageIndicators.js new file mode 100644 index 0000000..8a1202c --- /dev/null +++ b/js/ui/pageIndicators.js @@ -0,0 +1,140 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, St } = imports.gi; + +const Tweener = imports.ui.tweener; +const { ANIMATION_TIME_OUT, ANIMATION_MAX_DELAY_OUT_FOR_ITEM, AnimationDirection } = imports.ui.iconGrid; + +var INDICATORS_BASE_TIME = 0.25; +var INDICATORS_BASE_TIME_OUT = 0.125; +var INDICATORS_ANIMATION_DELAY = 0.125; +var INDICATORS_ANIMATION_DELAY_OUT = 0.0625; +var INDICATORS_ANIMATION_MAX_TIME = 0.75; +var SWITCH_TIME = 0.4; +var INDICATORS_ANIMATION_MAX_TIME_OUT = + Math.min (SWITCH_TIME, + ANIMATION_TIME_OUT + ANIMATION_MAX_DELAY_OUT_FOR_ITEM); + +var ANIMATION_DELAY = 0.1; + +var PageIndicators = GObject.registerClass({ + Signals: { 'page-activated': { param_types: [GObject.TYPE_INT] } } +}, class PageIndicators extends St.BoxLayout { + _init(vertical = true) { + super._init({ style_class: 'page-indicators', + vertical, + x_expand: true, y_expand: true, + x_align: vertical ? Clutter.ActorAlign.END : Clutter.ActorAlign.CENTER, + y_align: vertical ? Clutter.ActorAlign.CENTER : Clutter.ActorAlign.END, + reactive: true, + clip_to_allocation: true }); + this._nPages = 0; + this._currentPage = undefined; + this._reactive = true; + this._reactive = true; + } + + vfunc_get_preferred_height(forWidth) { + // We want to request the natural height of all our children as our + // natural height, so we chain up to St.BoxLayout, but we only request 0 + // as minimum height, since it's not that important if some indicators + // are not shown + let [, natHeight] = super.vfunc_get_preferred_height(forWidth); + return [0, natHeight]; + } + + setReactive(reactive) { + let children = this.get_children(); + for (let i = 0; i < children.length; i++) + children[i].reactive = reactive; + + this._reactive = reactive; + } + + setNPages(nPages) { + if (this._nPages == nPages) + return; + + let diff = nPages - this._nPages; + if (diff > 0) { + for (let i = 0; i < diff; i++) { + let pageIndex = this._nPages + i; + let indicator = new St.Button({ style_class: 'page-indicator', + button_mask: St.ButtonMask.ONE | + St.ButtonMask.TWO | + St.ButtonMask.THREE, + toggle_mode: true, + reactive: this._reactive, + checked: pageIndex == this._currentPage }); + indicator.child = new St.Widget({ style_class: 'page-indicator-icon' }); + indicator.connect('clicked', () => { + this.emit('page-activated', pageIndex); + }); + this.add_actor(indicator); + } + } else { + let children = this.get_children().splice(diff); + for (let i = 0; i < children.length; i++) + children[i].destroy(); + } + this._nPages = nPages; + this.visible = (this._nPages > 1); + } + + setCurrentPage(currentPage) { + this._currentPage = currentPage; + + let children = this.get_children(); + for (let i = 0; i < children.length; i++) + children[i].set_checked(i == this._currentPage); + } +}); + +var AnimatedPageIndicators = GObject.registerClass( +class AnimatedPageIndicators extends PageIndicators { + _init() { + super._init(true); + + this.connect('notify::mapped', () => { + this.animateIndicators(AnimationDirection.IN); + }); + } + + animateIndicators(animationDirection) { + if (!this.mapped) + return; + + let children = this.get_children(); + if (children.length == 0) + return; + + for (let i = 0; i < this._nPages; i++) + Tweener.removeTweens(children[i]); + + let offset; + if (this.get_text_direction() == Clutter.TextDirection.RTL) + offset = -children[0].width; + else + offset = children[0].width; + + let isAnimationIn = animationDirection == AnimationDirection.IN; + let delay = isAnimationIn ? INDICATORS_ANIMATION_DELAY : + INDICATORS_ANIMATION_DELAY_OUT; + let baseTime = isAnimationIn ? INDICATORS_BASE_TIME : INDICATORS_BASE_TIME_OUT; + let totalAnimationTime = baseTime + delay * this._nPages; + let maxTime = isAnimationIn ? INDICATORS_ANIMATION_MAX_TIME : + INDICATORS_ANIMATION_MAX_TIME_OUT; + if (totalAnimationTime > maxTime) + delay -= (totalAnimationTime - maxTime) / this._nPages; + + for (let i = 0; i < this._nPages; i++) { + children[i].translation_x = isAnimationIn ? offset : 0; + Tweener.addTween(children[i], { + translation_x: isAnimationIn ? 0 : offset, + time: baseTime + delay * i, + transition: 'easeInOutQuad', + delay: isAnimationIn ? ANIMATION_DELAY : 0 + }); + } + } +}); diff --git a/js/ui/panel.js b/js/ui/panel.js new file mode 100644 index 0000000..1648485 --- /dev/null +++ b/js/ui/panel.js @@ -0,0 +1,1204 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; +const Cairo = imports.cairo; +const Mainloop = imports.mainloop; + +const Animation = imports.ui.animation; +const Config = imports.misc.config; +const CtrlAltTab = imports.ui.ctrlAltTab; +const DND = imports.ui.dnd; +const Overview = imports.ui.overview; +const PopupMenu = imports.ui.popupMenu; +const PanelMenu = imports.ui.panelMenu; +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +var PANEL_ICON_SIZE = 16; +var APP_MENU_ICON_MARGIN = 0; + +var BUTTON_DND_ACTIVATION_TIMEOUT = 250; + +var SPINNER_ANIMATION_TIME = 1.0; + +// To make sure the panel corners blend nicely with the panel, +// we draw background and borders the same way, e.g. drawing +// them as filled shapes from the outside inwards instead of +// using cairo stroke(). So in order to give the border the +// appearance of being drawn on top of the background, we need +// to blend border and background color together. +// For that purpose we use the following helper methods, taken +// from st-theme-node-drawing.c +function _norm(x) { + return Math.round(x / 255); +} + +function _over(srcColor, dstColor) { + let src = _premultiply(srcColor); + let dst = _premultiply(dstColor); + let result = new Clutter.Color(); + + result.alpha = src.alpha + _norm((255 - src.alpha) * dst.alpha); + result.red = src.red + _norm((255 - src.alpha) * dst.red); + result.green = src.green + _norm((255 - src.alpha) * dst.green); + result.blue = src.blue + _norm((255 - src.alpha) * dst.blue); + + return _unpremultiply(result); +} + +function _premultiply(color) { + return new Clutter.Color({ red: _norm(color.red * color.alpha), + green: _norm(color.green * color.alpha), + blue: _norm(color.blue * color.alpha), + alpha: color.alpha }); +}; + +function _unpremultiply(color) { + if (color.alpha == 0) + return new Clutter.Color(); + + let red = Math.min((color.red * 255 + 127) / color.alpha, 255); + let green = Math.min((color.green * 255 + 127) / color.alpha, 255); + let blue = Math.min((color.blue * 255 + 127) / color.alpha, 255); + return new Clutter.Color({ red: red, green: green, + blue: blue, alpha: color.alpha }); +}; + +class AppMenu extends PopupMenu.PopupMenu { + constructor(sourceActor) { + super(sourceActor, 0.0, St.Side.TOP); + + this.actor.add_style_class_name('app-menu'); + + this._app = null; + this._appSystem = Shell.AppSystem.get_default(); + + this._windowsChangedId = 0; + + this._windowSection = new PopupMenu.PopupMenuSection(); + this.addMenuItem(this._windowSection); + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + this._newWindowItem = this.addAction(_("New Window"), () => { + this._app.open_new_window(-1); + }); + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + this._actionSection = new PopupMenu.PopupMenuSection(); + this.addMenuItem(this._actionSection); + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + this._detailsItem = this.addAction(_("Show Details"), () => { + let id = this._app.get_id(); + let args = GLib.Variant.new('(ss)', [id, '']); + Gio.DBus.get(Gio.BusType.SESSION, null, (o, res) => { + let bus = Gio.DBus.get_finish(res); + bus.call('org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Actions', 'Activate', + GLib.Variant.new('(sava{sv})', + ['details', [args], null]), + null, 0, -1, null, null); + }); + }); + + this.addAction(_("Quit"), () => { + this._app.request_quit(); + }); + + this._appSystem.connect('installed-changed', () => { + this._updateDetailsVisibility(); + }); + this._updateDetailsVisibility(); + } + + _updateDetailsVisibility() { + let sw = this._appSystem.lookup_app('org.gnome.Software.desktop'); + this._detailsItem.actor.visible = (sw != null); + } + + isEmpty() { + if (!this._app) + return true; + return super.isEmpty(); + } + + setApp(app) { + if (this._app == app) + return; + + if (this._windowsChangedId) + this._app.disconnect(this._windowsChangedId); + this._windowsChangedId = 0; + + this._app = app; + + if (app) { + this._windowsChangedId = app.connect('windows-changed', () => { + this._updateWindowsSection(); + }); + } + + this._updateWindowsSection(); + + let appInfo = app ? app.app_info : null; + let actions = appInfo ? appInfo.list_actions() : []; + + this._actionSection.removeAll(); + actions.forEach(action => { + let label = appInfo.get_action_name(action); + this._actionSection.addAction(label, event => { + this._app.launch_action(action, event.get_time(), -1); + }); + }); + + this._newWindowItem.actor.visible = + app && app.can_open_new_window() && !actions.includes('new-window'); + } + + _updateWindowsSection() { + this._windowSection.removeAll(); + + if (!this._app) + return; + + let windows = this._app.get_windows(); + windows.forEach(window => { + let title = window.title || this._app.get_name(); + this._windowSection.addAction(title, event => { + Main.activateWindow(window, event.get_time()); + }); + }); + + // Add separator between windows of the current desktop and other windows. + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + let pos = windows.findIndex(w => w.get_workspace() != activeWorkspace); + if (pos >= 0) + this._windowSection.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(), pos); + } +} + +/** + * AppMenuButton: + * + * This class manages the "application menu" component. It tracks the + * currently focused application. However, when an app is launched, + * this menu also handles startup notification for it. So when we + * have an active startup notification, we switch modes to display that. + */ +var AppMenuButton = GObject.registerClass({ + Signals: {'changed': {}}, +}, class AppMenuButton extends PanelMenu.Button { + _init(panel) { + super._init(0.0, null, true); + + this.actor.accessible_role = Atk.Role.MENU; + + this._startingApps = []; + + this._menuManager = panel.menuManager; + this._targetApp = null; + this._busyNotifyId = 0; + + let bin = new St.Bin({ name: 'appMenu' }); + bin.connect('style-changed', this._onStyleChanged.bind(this)); + this.actor.add_actor(bin); + + this.actor.bind_property("reactive", this.actor, "can-focus", 0); + this.actor.reactive = false; + + this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); + bin.set_child(this._container); + + let textureCache = St.TextureCache.get_default(); + textureCache.connect('icon-theme-changed', + this._onIconThemeChanged.bind(this)); + + let iconEffect = new Clutter.DesaturateEffect(); + this._iconBox = new St.Bin({ style_class: 'app-menu-icon' }); + this._iconBox.add_effect(iconEffect); + this._container.add_actor(this._iconBox); + + this._iconBox.connect('style-changed', () => { + let themeNode = this._iconBox.get_theme_node(); + iconEffect.enabled = themeNode.get_icon_style() == St.IconStyle.SYMBOLIC; + }); + + this._label = new St.Label({ y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + this._container.add_actor(this._label); + this._arrow = PopupMenu.arrowIcon(St.Side.BOTTOM); + this._container.add_actor(this._arrow); + + this._visible = !Main.overview.visible; + if (!this._visible) + this.hide(); + this._overviewHidingId = Main.overview.connect('hiding', this._sync.bind(this)); + this._overviewShowingId = Main.overview.connect('showing', this._sync.bind(this)); + + this._stop = true; + + this._spinner = null; + + let menu = new AppMenu(this); + this.setMenu(menu); + this._menuManager.addMenu(menu); + + let tracker = Shell.WindowTracker.get_default(); + let appSys = Shell.AppSystem.get_default(); + this._focusAppNotifyId = + tracker.connect('notify::focus-app', this._focusAppChanged.bind(this)); + this._appStateChangedSignalId = + appSys.connect('app-state-changed', this._onAppStateChanged.bind(this)); + this._switchWorkspaceNotifyId = + global.window_manager.connect('switch-workspace', this._sync.bind(this)); + + this._sync(); + } + + fadeIn() { + if (this._visible) + return; + + this._visible = true; + this.actor.reactive = true; + this.show(); + Tweener.removeTweens(this.actor); + Tweener.addTween(this.actor, + { opacity: 255, + time: Overview.ANIMATION_TIME, + transition: 'easeOutQuad' }); + } + + fadeOut() { + if (!this._visible) + return; + + this._visible = false; + this.actor.reactive = false; + Tweener.removeTweens(this.actor); + Tweener.addTween(this.actor, + { opacity: 0, + time: Overview.ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete() { + this.hide(); + }, + onCompleteScope: this }); + } + + _onStyleChanged(actor) { + let node = actor.get_theme_node(); + let [success, icon] = node.lookup_url('spinner-image', false); + if (!success || (this._spinnerIcon && this._spinnerIcon.equal(icon))) + return; + this._spinnerIcon = icon; + this._spinner = new Animation.AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE); + this._container.add_actor(this._spinner.actor); + this._spinner.actor.hide(); + } + + _syncIcon() { + if (!this._targetApp) + return; + + let icon = this._targetApp.create_icon_texture(PANEL_ICON_SIZE - APP_MENU_ICON_MARGIN); + this._iconBox.set_child(icon); + } + + _onIconThemeChanged() { + if (this._iconBox.child == null) + return; + + this._syncIcon(); + } + + stopAnimation() { + if (this._stop) + return; + + this._stop = true; + + if (this._spinner == null) + return; + + Tweener.addTween(this._spinner.actor, + { opacity: 0, + time: SPINNER_ANIMATION_TIME, + transition: "easeOutQuad", + onCompleteScope: this, + onComplete() { + this._spinner.stop(); + this._spinner.actor.opacity = 255; + this._spinner.actor.hide(); + } + }); + } + + startAnimation() { + this._stop = false; + + if (this._spinner == null) + return; + + this._spinner.play(); + this._spinner.actor.show(); + } + + _onAppStateChanged(appSys, app) { + let state = app.state; + if (state != Shell.AppState.STARTING) + this._startingApps = this._startingApps.filter(a => a != app); + else if (state == Shell.AppState.STARTING) + this._startingApps.push(app); + // For now just resync on all running state changes; this is mainly to handle + // cases where the focused window's application changes without the focus + // changing. An example case is how we map OpenOffice.org based on the window + // title which is a dynamic property. + this._sync(); + } + + _focusAppChanged() { + let tracker = Shell.WindowTracker.get_default(); + let focusedApp = tracker.focus_app; + if (!focusedApp) { + // If the app has just lost focus to the panel, pretend + // nothing happened; otherwise you can't keynav to the + // app menu. + if (global.stage.key_focus != null) + return; + } + this._sync(); + } + + _findTargetApp() { + let workspaceManager = global.workspace_manager; + let workspace = workspaceManager.get_active_workspace(); + let tracker = Shell.WindowTracker.get_default(); + let focusedApp = tracker.focus_app; + if (focusedApp && focusedApp.is_on_workspace(workspace)) + return focusedApp; + + for (let i = 0; i < this._startingApps.length; i++) + if (this._startingApps[i].is_on_workspace(workspace)) + return this._startingApps[i]; + + return null; + } + + _sync() { + let targetApp = this._findTargetApp(); + + if (this._targetApp != targetApp) { + if (this._busyNotifyId) { + this._targetApp.disconnect(this._busyNotifyId); + this._busyNotifyId = 0; + } + + this._targetApp = targetApp; + + if (this._targetApp) { + this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this)); + this._label.set_text(this._targetApp.get_name()); + this.actor.set_accessible_name(this._targetApp.get_name()); + } + } + + let visible = (this._targetApp != null && !Main.overview.visibleTarget); + if (visible) + this.fadeIn(); + else + this.fadeOut(); + + let isBusy = (this._targetApp != null && + (this._targetApp.get_state() == Shell.AppState.STARTING || + this._targetApp.get_busy())); + if (isBusy) + this.startAnimation(); + else + this.stopAnimation(); + + this.actor.reactive = (visible && !isBusy); + + this._syncIcon(); + this.menu.setApp(this._targetApp); + this.emit('changed'); + } + + _onDestroy() { + if (this._appStateChangedSignalId > 0) { + let appSys = Shell.AppSystem.get_default(); + appSys.disconnect(this._appStateChangedSignalId); + this._appStateChangedSignalId = 0; + } + if (this._focusAppNotifyId > 0) { + let tracker = Shell.WindowTracker.get_default(); + tracker.disconnect(this._focusAppNotifyId); + this._focusAppNotifyId = 0; + } + if (this._overviewHidingId > 0) { + Main.overview.disconnect(this._overviewHidingId); + this._overviewHidingId = 0; + } + if (this._overviewShowingId > 0) { + Main.overview.disconnect(this._overviewShowingId); + this._overviewShowingId = 0; + } + if (this._switchWorkspaceNotifyId > 0) { + global.window_manager.disconnect(this._switchWorkspaceNotifyId); + this._switchWorkspaceNotifyId = 0; + } + + super._onDestroy(); + } +}); + +var ActivitiesButton = GObject.registerClass( +class ActivitiesButton extends PanelMenu.Button { + _init() { + super._init(0.0, null, true); + this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON; + + this.actor.name = 'panelActivities'; + + /* Translators: If there is no suitable word for "Activities" + in your language, you can use the word for "Overview". */ + this._label = new St.Label({ text: _("Activities"), + y_align: Clutter.ActorAlign.CENTER }); + this.actor.add_actor(this._label); + + this.actor.label_actor = this._label; + + this.actor.connect('captured-event', this._onCapturedEvent.bind(this)); + this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this)); + + Main.overview.connect('showing', () => { + this.actor.add_style_pseudo_class('overview'); + this.actor.add_accessible_state (Atk.StateType.CHECKED); + }); + Main.overview.connect('hiding', () => { + this.actor.remove_style_pseudo_class('overview'); + this.actor.remove_accessible_state (Atk.StateType.CHECKED); + }); + + this._xdndTimeOut = 0; + } + + handleDragOver(source, actor, x, y, time) { + if (source != Main.xdndHandler) + return DND.DragMotionResult.CONTINUE; + + if (this._xdndTimeOut != 0) + Mainloop.source_remove(this._xdndTimeOut); + this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT, () => { + this._xdndToggleOverview(actor); + }); + GLib.Source.set_name_by_id(this._xdndTimeOut, '[gnome-shell] this._xdndToggleOverview'); + + return DND.DragMotionResult.CONTINUE; + } + + _onCapturedEvent(actor, event) { + if (event.type() == Clutter.EventType.BUTTON_PRESS || + event.type() == Clutter.EventType.TOUCH_BEGIN) { + if (!Main.overview.shouldToggleByCornerOrButton()) + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + _onEvent(actor, event) { + super._onEvent(actor, event); + + if (event.type() == Clutter.EventType.TOUCH_END || + event.type() == Clutter.EventType.BUTTON_RELEASE) + if (Main.overview.shouldToggleByCornerOrButton()) + Main.overview.toggle(); + + return Clutter.EVENT_PROPAGATE; + } + + _onKeyRelease(actor, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) { + if (Main.overview.shouldToggleByCornerOrButton()) + Main.overview.toggle(); + } + return Clutter.EVENT_PROPAGATE; + } + + _xdndToggleOverview(actor) { + let [x, y, mask] = global.get_pointer(); + let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); + + if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton()) + Main.overview.toggle(); + + Mainloop.source_remove(this._xdndTimeOut); + this._xdndTimeOut = 0; + return GLib.SOURCE_REMOVE; + } +}); + +var PanelCorner = class { + constructor(side) { + this._side = side; + + this.actor = new St.DrawingArea({ style_class: 'panel-corner' }); + this.actor.connect('style-changed', this._styleChanged.bind(this)); + this.actor.connect('repaint', this._repaint.bind(this)); + } + + _findRightmostButton(container) { + if (!container.get_children) + return null; + + let children = container.get_children(); + + if (!children || children.length == 0) + return null; + + // Start at the back and work backward + let index; + for (index = children.length - 1; index >= 0; index--) { + if (children[index].visible) + break; + } + if (index < 0) + return null; + + if (!(children[index].has_style_class_name('panel-menu')) && + !(children[index].has_style_class_name('panel-button'))) + return this._findRightmostButton(children[index]); + + return children[index]; + } + + _findLeftmostButton(container) { + if (!container.get_children) + return null; + + let children = container.get_children(); + + if (!children || children.length == 0) + return null; + + // Start at the front and work forward + let index; + for (index = 0; index < children.length; index++) { + if (children[index].visible) + break; + } + if (index == children.length) + return null; + + if (!(children[index].has_style_class_name('panel-menu')) && + !(children[index].has_style_class_name('panel-button'))) + return this._findLeftmostButton(children[index]); + + return children[index]; + } + + setStyleParent(box) { + let side = this._side; + + let rtlAwareContainer = box instanceof St.BoxLayout; + if (rtlAwareContainer && + box.get_text_direction() == Clutter.TextDirection.RTL) { + if (this._side == St.Side.LEFT) + side = St.Side.RIGHT; + else if (this._side == St.Side.RIGHT) + side = St.Side.LEFT; + } + + let button; + if (side == St.Side.LEFT) + button = this._findLeftmostButton(box); + else if (side == St.Side.RIGHT) + button = this._findRightmostButton(box); + + if (button) { + if (this._button && this._buttonStyleChangedSignalId) { + this._button.disconnect(this._buttonStyleChangedSignalId); + this._button.style = null; + } + + this._button = button; + + button.connect('destroy', () => { + if (this._button == button) { + this._button = null; + this._buttonStyleChangedSignalId = 0; + } + }); + + // Synchronize the locate button's pseudo classes with this corner + this._buttonStyleChangedSignalId = button.connect('style-changed', + actor => { + let pseudoClass = button.get_style_pseudo_class(); + this.actor.set_style_pseudo_class(pseudoClass); + }); + + // The corner doesn't support theme transitions, so override + // the .panel-button default + button.style = 'transition-duration: 0ms'; + } + } + + _repaint() { + let node = this.actor.get_theme_node(); + + let cornerRadius = node.get_length("-panel-corner-radius"); + let borderWidth = node.get_length('-panel-corner-border-width'); + + let backgroundColor = node.get_color('-panel-corner-background-color'); + let borderColor = node.get_color('-panel-corner-border-color'); + + let overlap = borderColor.alpha != 0; + let offsetY = overlap ? 0 : borderWidth; + + let cr = this.actor.get_context(); + cr.setOperator(Cairo.Operator.SOURCE); + + cr.moveTo(0, offsetY); + if (this._side == St.Side.LEFT) + cr.arc(cornerRadius, + borderWidth + cornerRadius, + cornerRadius, Math.PI, 3 * Math.PI / 2); + else + cr.arc(0, + borderWidth + cornerRadius, + cornerRadius, 3 * Math.PI / 2, 2 * Math.PI); + cr.lineTo(cornerRadius, offsetY); + cr.closePath(); + + let savedPath = cr.copyPath(); + + let xOffsetDirection = this._side == St.Side.LEFT ? -1 : 1; + let over = _over(borderColor, backgroundColor); + Clutter.cairo_set_source_color(cr, over); + cr.fill(); + + if (overlap) { + let offset = borderWidth; + Clutter.cairo_set_source_color(cr, backgroundColor); + + cr.save(); + cr.translate(xOffsetDirection * offset, - offset); + cr.appendPath(savedPath); + cr.fill(); + cr.restore(); + } + + cr.$dispose(); + } + + _styleChanged() { + let node = this.actor.get_theme_node(); + + let cornerRadius = node.get_length("-panel-corner-radius"); + let borderWidth = node.get_length('-panel-corner-border-width'); + + this.actor.set_size(cornerRadius, borderWidth + cornerRadius); + this.actor.set_anchor_point(0, borderWidth); + } +}; + +var AggregateLayout = GObject.registerClass( +class AggregateLayout extends Clutter.BoxLayout { + _init(params) { + if (!params) + params = {}; + params['orientation'] = Clutter.Orientation.VERTICAL; + super._init(params); + + this._sizeChildren = []; + } + + addSizeChild(actor) { + this._sizeChildren.push(actor); + this.layout_changed(); + } + + vfunc_get_preferred_width(container, forHeight) { + let themeNode = container.get_theme_node(); + let minWidth = themeNode.get_min_width(); + let natWidth = minWidth; + + for (let i = 0; i < this._sizeChildren.length; i++) { + let child = this._sizeChildren[i]; + let [childMin, childNat] = child.get_preferred_width(forHeight); + minWidth = Math.max(minWidth, childMin); + natWidth = Math.max(natWidth, childNat); + } + return [minWidth, natWidth]; + } +}); + +var AggregateMenu = GObject.registerClass( +class AggregateMenu extends PanelMenu.Button { + _init() { + super._init(0.0, C_("System menu in the top bar", "System"), false); + this.menu.actor.add_style_class_name('aggregate-menu'); + + let menuLayout = new AggregateLayout(); + this.menu.box.set_layout_manager(menuLayout); + + this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); + this.actor.add_child(this._indicators); + + if (Config.HAVE_NETWORKMANAGER) { + this._network = new imports.ui.status.network.NMApplet(); + } else { + this._network = null; + } + if (Config.HAVE_BLUETOOTH) { + this._bluetooth = new imports.ui.status.bluetooth.Indicator(); + } else { + this._bluetooth = null; + } + + this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet(); + this._power = new imports.ui.status.power.Indicator(); + this._rfkill = new imports.ui.status.rfkill.Indicator(); + this._volume = new imports.ui.status.volume.Indicator(); + this._brightness = new imports.ui.status.brightness.Indicator(); + this._system = new imports.ui.status.system.Indicator(); + this._screencast = new imports.ui.status.screencast.Indicator(); + this._location = new imports.ui.status.location.Indicator(); + this._nightLight = new imports.ui.status.nightLight.Indicator(); + this._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); + if (this._network) { + this._indicators.add_child(this._network.indicators); + } + if (this._bluetooth) { + this._indicators.add_child(this._bluetooth.indicators); + } + this._indicators.add_child(this._remoteAccess.indicators); + this._indicators.add_child(this._rfkill.indicators); + this._indicators.add_child(this._volume.indicators); + this._indicators.add_child(this._power.indicators); + this._indicators.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM)); + + this.menu.addMenuItem(this._volume.menu); + this.menu.addMenuItem(this._brightness.menu); + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + if (this._network) { + this.menu.addMenuItem(this._network.menu); + } + if (this._bluetooth) { + this.menu.addMenuItem(this._bluetooth.menu); + } + this.menu.addMenuItem(this._remoteAccess.menu); + this.menu.addMenuItem(this._location.menu); + this.menu.addMenuItem(this._rfkill.menu); + this.menu.addMenuItem(this._power.menu); + this.menu.addMenuItem(this._nightLight.menu); + this.menu.addMenuItem(this._system.menu); + + menuLayout.addSizeChild(this._location.menu.actor); + menuLayout.addSizeChild(this._rfkill.menu.actor); + menuLayout.addSizeChild(this._power.menu.actor); + menuLayout.addSizeChild(this._system.buttonGroup); + } +}); + +const PANEL_ITEM_IMPLEMENTATIONS = { + 'activities': ActivitiesButton, + 'aggregateMenu': AggregateMenu, + 'appMenu': AppMenuButton, + 'dateMenu': imports.ui.dateMenu.DateMenuButton, + 'a11y': imports.ui.status.accessibility.ATIndicator, + 'keyboard': imports.ui.status.keyboard.InputSourceIndicator, +}; + +var Panel = GObject.registerClass( +class Panel extends St.Widget { + _init() { + super._init({ name: 'panel', + reactive: true }); + + // For compatibility with extensions that still use the + // this.actor field + this.actor = this; + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this._sessionStyle = null; + + this.statusArea = {}; + + this.menuManager = new PopupMenu.PopupMenuManager(this); + + this._leftBox = new St.BoxLayout({ name: 'panelLeft' }); + this.add_child(this._leftBox); + this._centerBox = new St.BoxLayout({ name: 'panelCenter' }); + this.add_child(this._centerBox); + this._rightBox = new St.BoxLayout({ name: 'panelRight' }); + this.add_child(this._rightBox); + + this._leftCorner = new PanelCorner(St.Side.LEFT); + this.add_child(this._leftCorner.actor); + + this._rightCorner = new PanelCorner(St.Side.RIGHT); + this.add_child(this._rightCorner.actor); + + this.connect('button-press-event', this._onButtonPress.bind(this)); + this.connect('touch-event', this._onButtonPress.bind(this)); + this.connect('key-press-event', this._onKeyPress.bind(this)); + + Main.overview.connect('showing', () => { + this.add_style_pseudo_class('overview'); + }); + Main.overview.connect('hiding', () => { + this.remove_style_pseudo_class('overview'); + }); + + Main.layoutManager.panelBox.add(this); + Main.ctrlAltTabManager.addGroup(this, _("Top Bar"), 'focus-top-bar-symbolic', + { sortGroup: CtrlAltTab.SortGroup.TOP }); + + Main.sessionMode.connect('updated', this._updatePanel.bind(this)); + + global.display.connect('workareas-changed', () => { this.queue_relayout(); }); + this._updatePanel(); + } + + vfunc_get_preferred_width(forHeight) { + let primaryMonitor = Main.layoutManager.primaryMonitor; + + if (primaryMonitor) + return [0, primaryMonitor.width]; + + return [0, 0]; + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let allocWidth = box.x2 - box.x1; + let allocHeight = box.y2 - box.y1; + + let [leftMinWidth, leftNaturalWidth] = this._leftBox.get_preferred_width(-1); + let [centerMinWidth, centerNaturalWidth] = this._centerBox.get_preferred_width(-1); + let [rightMinWidth, rightNaturalWidth] = this._rightBox.get_preferred_width(-1); + + let sideWidth, centerWidth; + centerWidth = centerNaturalWidth; + + // get workspace area and center date entry relative to it + let monitor = Main.layoutManager.findMonitorForActor(this); + 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(); + + childBox.y1 = 0; + childBox.y2 = allocHeight; + if (this.get_text_direction() == Clutter.TextDirection.RTL) { + childBox.x1 = Math.max(allocWidth - Math.min(Math.floor(sideWidth), + leftNaturalWidth), + 0); + childBox.x2 = allocWidth; + } else { + childBox.x1 = 0; + childBox.x2 = Math.min(Math.floor(sideWidth), + leftNaturalWidth); + } + this._leftBox.allocate(childBox, flags); + + childBox.x1 = Math.ceil(sideWidth); + childBox.y1 = 0; + childBox.x2 = childBox.x1 + centerWidth; + childBox.y2 = allocHeight; + this._centerBox.allocate(childBox, flags); + + childBox.y1 = 0; + childBox.y2 = allocHeight; + if (this.get_text_direction() == Clutter.TextDirection.RTL) { + childBox.x1 = 0; + childBox.x2 = Math.min(Math.floor(sideWidth), + rightNaturalWidth); + } else { + childBox.x1 = Math.max(allocWidth - Math.min(Math.floor(sideWidth), + rightNaturalWidth), + 0); + childBox.x2 = allocWidth; + } + this._rightBox.allocate(childBox, flags); + + let cornerMinWidth, cornerMinHeight; + let cornerWidth, cornerHeight; + + [cornerMinWidth, cornerWidth] = this._leftCorner.actor.get_preferred_width(-1); + [cornerMinHeight, cornerHeight] = this._leftCorner.actor.get_preferred_height(-1); + childBox.x1 = 0; + childBox.x2 = cornerWidth; + childBox.y1 = allocHeight; + childBox.y2 = allocHeight + cornerHeight; + this._leftCorner.actor.allocate(childBox, flags); + + [cornerMinWidth, cornerWidth] = this._rightCorner.actor.get_preferred_width(-1); + [cornerMinHeight, cornerHeight] = this._rightCorner.actor.get_preferred_height(-1); + childBox.x1 = allocWidth - cornerWidth; + childBox.x2 = allocWidth; + childBox.y1 = allocHeight; + childBox.y2 = allocHeight + cornerHeight; + this._rightCorner.actor.allocate(childBox, flags); + } + + _onButtonPress(actor, event) { + if (Main.modalCount > 0) + return Clutter.EVENT_PROPAGATE; + + if (event.get_source() != actor) + return Clutter.EVENT_PROPAGATE; + + let type = event.type(); + let isPress = type == Clutter.EventType.BUTTON_PRESS; + if (!isPress && type != Clutter.EventType.TOUCH_BEGIN) + return Clutter.EVENT_PROPAGATE; + + let button = isPress ? event.get_button() : -1; + if (isPress && button != 1) + return Clutter.EVENT_PROPAGATE; + + let focusWindow = global.display.focus_window; + if (!focusWindow) + return Clutter.EVENT_PROPAGATE; + + let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for() + : focusWindow; + if (!dragWindow) + return Clutter.EVENT_PROPAGATE; + + let rect = dragWindow.get_frame_rect(); + let [stageX, stageY] = event.get_coords(); + + let allowDrag = dragWindow.maximized_vertically && + stageX > rect.x && stageX < rect.x + rect.width; + + if (!allowDrag) + return Clutter.EVENT_PROPAGATE; + + global.display.begin_grab_op(dragWindow, + Meta.GrabOp.MOVING, + false, /* pointer grab */ + true, /* frame action */ + button, + event.get_state(), + event.get_time(), + stageX, stageY); + + return Clutter.EVENT_STOP; + } + + _onKeyPress(actor, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Escape) { + global.display.focus_default_window(event.get_time()); + return Clutter.EVENT_STOP; + } + + return Clutter.EVENT_PROPAGATE; + } + + _toggleMenu(indicator) { + if (!indicator || !indicator.container.visible) + return; // menu not supported by current session mode + + let menu = indicator.menu; + if (!indicator.actor.reactive) + return; + + menu.toggle(); + if (menu.isOpen) + menu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + + toggleAppMenu() { + this._toggleMenu(this.statusArea.appMenu); + } + + toggleCalendar() { + this._toggleMenu(this.statusArea.dateMenu); + } + + closeCalendar() { + let indicator = this.statusArea.dateMenu; + if (!indicator) // calendar not supported by current session mode + return; + + let menu = indicator.menu; + if (!indicator.actor.reactive) + return; + + menu.close(); + } + + set boxOpacity(value) { + let isReactive = value > 0; + + this._leftBox.opacity = value; + this._leftBox.reactive = isReactive; + this._centerBox.opacity = value; + this._centerBox.reactive = isReactive; + this._rightBox.opacity = value; + this._rightBox.reactive = isReactive; + } + + get boxOpacity() { + return this._leftBox.opacity; + } + + _updatePanel() { + let panel = Main.sessionMode.panel; + this._hideIndicators(); + this._updateBox(panel.left, this._leftBox); + this._updateBox(panel.center, this._centerBox); + this._updateBox(panel.right, this._rightBox); + + if (panel.left.indexOf('dateMenu') != -1) + Main.messageTray.bannerAlignment = Clutter.ActorAlign.START; + else if (panel.right.indexOf('dateMenu') != -1) + Main.messageTray.bannerAlignment = Clutter.ActorAlign.END; + // Default to center if there is no dateMenu + else + Main.messageTray.bannerAlignment = Clutter.ActorAlign.CENTER; + + if (this._sessionStyle) + this._removeStyleClassName(this._sessionStyle); + + this._sessionStyle = Main.sessionMode.panelStyle; + if (this._sessionStyle) + this._addStyleClassName(this._sessionStyle); + + if (this.get_text_direction() == Clutter.TextDirection.RTL) { + this._leftCorner.setStyleParent(this._rightBox); + this._rightCorner.setStyleParent(this._leftBox); + } else { + this._leftCorner.setStyleParent(this._leftBox); + this._rightCorner.setStyleParent(this._rightBox); + } + } + + _hideIndicators() { + for (let role in PANEL_ITEM_IMPLEMENTATIONS) { + let indicator = this.statusArea[role]; + if (!indicator) + continue; + indicator.container.hide(); + } + } + + _ensureIndicator(role) { + let indicator = this.statusArea[role]; + if (!indicator) { + let constructor = PANEL_ITEM_IMPLEMENTATIONS[role]; + if (!constructor) { + // This icon is not implemented (this is a bug) + return null; + } + indicator = new constructor(this); + this.statusArea[role] = indicator; + } + return indicator; + } + + _updateBox(elements, box) { + let nChildren = box.get_n_children(); + + for (let i = 0; i < elements.length; i++) { + let role = elements[i]; + let indicator = this._ensureIndicator(role); + if (indicator == null) + continue; + + this._addToPanelBox(role, indicator, i + nChildren, box); + } + } + + _addToPanelBox(role, indicator, position, box) { + let container = indicator.container; + container.show(); + + let parent = container.get_parent(); + if (parent) + parent.remove_actor(container); + + + box.insert_child_at_index(container, position); + if (indicator.menu) + this.menuManager.addMenu(indicator.menu); + this.statusArea[role] = indicator; + let destroyId = indicator.connect('destroy', emitter => { + delete this.statusArea[role]; + emitter.disconnect(destroyId); + }); + indicator.connect('menu-set', this._onMenuSet.bind(this)); + this._onMenuSet(indicator); + } + + addToStatusArea(role, indicator, position, box) { + if (this.statusArea[role]) + throw new Error('Extension point conflict: there is already a status indicator for role ' + role); + + if (!(indicator instanceof PanelMenu.Button)) + throw new TypeError('Status indicator must be an instance of PanelMenu.Button'); + + position = position || 0; + let boxes = { + left: this._leftBox, + center: this._centerBox, + right: this._rightBox + }; + let boxContainer = boxes[box] || this._rightBox; + this.statusArea[role] = indicator; + this._addToPanelBox(role, indicator, position, boxContainer); + return indicator; + } + + _addStyleClassName(className) { + this.add_style_class_name(className); + this._rightCorner.actor.add_style_class_name(className); + this._leftCorner.actor.add_style_class_name(className); + } + + _removeStyleClassName(className) { + this.remove_style_class_name(className); + this._rightCorner.actor.remove_style_class_name(className); + this._leftCorner.actor.remove_style_class_name(className); + } + + _onMenuSet(indicator) { + if (!indicator.menu || indicator.menu.hasOwnProperty('_openChangedId')) + return; + + indicator.menu._openChangedId = indicator.menu.connect('open-state-changed', + (menu, isOpen) => { + let boxAlignment; + if (this._leftBox.contains(indicator.container)) + boxAlignment = Clutter.ActorAlign.START; + else if (this._centerBox.contains(indicator.container)) + boxAlignment = Clutter.ActorAlign.CENTER; + else if (this._rightBox.contains(indicator.container)) + boxAlignment = Clutter.ActorAlign.END; + + if (boxAlignment == Main.messageTray.bannerAlignment) + Main.messageTray.bannerBlocked = isOpen; + }); + } +}); diff --git a/js/ui/panelMenu.js b/js/ui/panelMenu.js new file mode 100644 index 0000000..bafafc1 --- /dev/null +++ b/js/ui/panelMenu.js @@ -0,0 +1,223 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atk, Clutter, GObject, St } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const Params = imports.misc.params; +const PopupMenu = imports.ui.popupMenu; + +var ButtonBox = GObject.registerClass( +class ButtonBox extends St.Widget { + _init(params) { + params = Params.parse(params, { style_class: 'panel-button' }, true); + + super._init(params); + + this.actor = this; + this._delegate = this; + + this.container = new St.Bin({ y_fill: true, + x_fill: true, + child: this.actor }); + + this.connect('style-changed', this._onStyleChanged.bind(this)); + this.connect('destroy', this._onDestroy.bind(this)); + + this._minHPadding = this._natHPadding = 0.0; + } + + _onStyleChanged(actor) { + let themeNode = actor.get_theme_node(); + + this._minHPadding = themeNode.get_length('-minimum-hpadding'); + this._natHPadding = themeNode.get_length('-natural-hpadding'); + } + + vfunc_get_preferred_width(forHeight) { + let child = this.get_first_child(); + let minimumSize, naturalSize; + + if (child) + [minimumSize, naturalSize] = child.get_preferred_width(-1); + else + minimumSize = naturalSize = 0; + + minimumSize += 2 * this._minHPadding; + naturalSize += 2 * this._natHPadding; + + return [minimumSize, naturalSize]; + } + + vfunc_get_preferred_height(forWidth) { + let child = this.get_first_child(); + + if (child) + return child.get_preferred_height(-1); + + return [0, 0]; + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let child = this.get_first_child(); + if (!child) + return; + + let [minWidth, natWidth] = child.get_preferred_width(-1); + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + + let childBox = new Clutter.ActorBox(); + if (natWidth + 2 * this._natHPadding <= availWidth) { + childBox.x1 = this._natHPadding; + childBox.x2 = availWidth - this._natHPadding; + } else { + childBox.x1 = this._minHPadding; + childBox.x2 = availWidth - this._minHPadding; + } + + childBox.y1 = 0; + childBox.y2 = availHeight; + + child.allocate(childBox, flags); + } + + _onDestroy() { + this.container.child = null; + this.container.destroy(); + } +}); + +var Button = GObject.registerClass({ + Signals: {'menu-set': {} }, +}, class PanelMenuButton extends ButtonBox { + _init(menuAlignment, nameText, dontCreateMenu) { + super._init({ reactive: true, + can_focus: true, + track_hover: true, + accessible_name: nameText ? nameText : "", + accessible_role: Atk.Role.MENU }); + + this.connect('event', this._onEvent.bind(this)); + this.connect('notify::visible', this._onVisibilityChanged.bind(this)); + + if (dontCreateMenu) + this.menu = new PopupMenu.PopupDummyMenu(this.actor); + else + this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0)); + } + + setSensitive(sensitive) { + this.reactive = sensitive; + this.can_focus = sensitive; + this.track_hover = sensitive; + } + + setMenu(menu) { + if (this.menu) + this.menu.destroy(); + + this.menu = menu; + if (this.menu) { + this.menu.actor.add_style_class_name('panel-menu'); + this.menu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + this.menu.actor.connect('key-press-event', this._onMenuKeyPress.bind(this)); + + Main.uiGroup.add_actor(this.menu.actor); + this.menu.actor.hide(); + } + this.emit('menu-set'); + } + + _onEvent(actor, event) { + if (this.menu && + (event.type() == Clutter.EventType.TOUCH_BEGIN || + event.type() == Clutter.EventType.BUTTON_PRESS)) + this.menu.toggle(); + + return Clutter.EVENT_PROPAGATE; + } + + _onVisibilityChanged() { + if (!this.menu) + return; + + if (!this.actor.visible) + this.menu.close(); + } + + _onMenuKeyPress(actor, event) { + if (global.focus_manager.navigate_from_event(event)) + return Clutter.EVENT_STOP; + + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) { + let group = global.focus_manager.get_group(this.actor); + if (group) { + let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT; + group.navigate_focus(this.actor, direction, false); + return Clutter.EVENT_STOP; + } + } + return Clutter.EVENT_PROPAGATE; + } + + _onOpenStateChanged(menu, open) { + if (open) + this.actor.add_style_pseudo_class('active'); + else + this.actor.remove_style_pseudo_class('active'); + + // Setting the max-height won't do any good if the minimum height of the + // menu is higher then the screen; it's useful if part of the menu is + // scrollable so the minimum height is smaller than the natural height + let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + let verticalMargins = this.menu.actor.margin_top + this.menu.actor.margin_bottom; + + // The workarea and margin dimensions are in physical pixels, but CSS + // measures are in logical pixels, so make sure to consider the scale + // factor when computing max-height + let maxHeight = Math.round((workArea.height - verticalMargins) / scaleFactor); + this.menu.actor.style = ('max-height: %spx;').format(maxHeight); + } + + _onDestroy() { + super._onDestroy(); + + if (this.menu) + this.menu.destroy(); + } +}); + +/* SystemIndicator: + * + * This class manages one system indicator, which are the icons + * that you see at the top right. A system indicator is composed + * of an icon and a menu section, which will be composed into the + * aggregate menu. + */ +var SystemIndicator = class { + constructor() { + this.indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box', + reactive: true }); + this.indicators.hide(); + this.menu = new PopupMenu.PopupMenuSection(); + } + + _syncIndicatorsVisible() { + this.indicators.visible = this.indicators.get_children().some(a => a.visible); + } + + _addIndicator() { + let icon = new St.Icon({ style_class: 'system-status-icon' }); + this.indicators.add_actor(icon); + icon.connect('notify::visible', this._syncIndicatorsVisible.bind(this)); + this._syncIndicatorsVisible(); + return icon; + } +}; +Signals.addSignalMethods(SystemIndicator.prototype); diff --git a/js/ui/pointerWatcher.js b/js/ui/pointerWatcher.js new file mode 100644 index 0000000..d1722bd --- /dev/null +++ b/js/ui/pointerWatcher.js @@ -0,0 +1,125 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { GLib, Meta } = imports.gi; +const Mainloop = imports.mainloop; + +// We stop polling if the user is idle for more than this amount of time +var IDLE_TIME = 1000; + +// This file implements a reasonably efficient system for tracking the position +// of the mouse pointer. We simply query the pointer from the X server in a loop, +// but we turn off the polling when the user is idle. + +let _pointerWatcher = null; +function getPointerWatcher() { + if (_pointerWatcher == null) + _pointerWatcher = new PointerWatcher(); + + return _pointerWatcher; +} + +var PointerWatch = class { + constructor(watcher, interval, callback) { + this.watcher = watcher; + this.interval = interval; + this.callback = callback; + } + + // remove: + // remove this watch. This function may safely be called + // while the callback is executing. + remove() { + this.watcher._removeWatch(this); + } +}; + +var PointerWatcher = class { + constructor() { + this._idleMonitor = Meta.IdleMonitor.get_core(); + this._idleMonitor.add_idle_watch(IDLE_TIME, this._onIdleMonitorBecameIdle.bind(this)); + this._idle = this._idleMonitor.get_idletime() > IDLE_TIME; + this._watches = []; + this.pointerX = null; + this.pointerY = null; + } + + // addWatch: + // @interval: hint as to the time resolution needed. When the user is + // not idle, the position of the pointer will be queried at least + // once every this many milliseconds. + // @callback to call when the pointer position changes - takes + // two arguments, X and Y. + // + // Set up a watch on the position of the mouse pointer. Returns a + // PointerWatch object which has a remove() method to remove the watch. + addWatch(interval, callback) { + // Avoid unreliably calling the watch for the current position + this._updatePointer(); + + let watch = new PointerWatch(this, interval, callback); + this._watches.push(watch); + this._updateTimeout(); + return watch; + } + + _removeWatch(watch) { + for (let i = 0; i < this._watches.length; i++) { + if (this._watches[i] == watch) { + this._watches.splice(i, 1); + this._updateTimeout(); + return; + } + } + } + + _onIdleMonitorBecameActive(monitor) { + this._idle = false; + this._updatePointer(); + this._updateTimeout(); + } + + _onIdleMonitorBecameIdle(monitor) { + this._idle = true; + this._idleMonitor.add_user_active_watch(this._onIdleMonitorBecameActive.bind(this)); + this._updateTimeout(); + } + + _updateTimeout() { + if (this._timeoutId) { + Mainloop.source_remove(this._timeoutId); + this._timeoutId = 0; + } + + if (this._idle || this._watches.length == 0) + return; + + let minInterval = this._watches[0].interval; + for (let i = 1; i < this._watches.length; i++) + minInterval = Math.min(this._watches[i].interval, minInterval); + + this._timeoutId = Mainloop.timeout_add(minInterval, + this._onTimeout.bind(this)); + GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout'); + } + + _onTimeout() { + this._updatePointer(); + return GLib.SOURCE_CONTINUE; + } + + _updatePointer() { + let [x, y, mods] = global.get_pointer(); + if (this.pointerX == x && this.pointerY == y) + return; + + this.pointerX = x; + this.pointerY = y; + + for (let i = 0; i < this._watches.length;) { + let watch = this._watches[i]; + watch.callback(x, y); + if (watch == this._watches[i]) // guard against self-removal + i++; + } + } +}; diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js new file mode 100644 index 0000000..4481853 --- /dev/null +++ b/js/ui/popupMenu.js @@ -0,0 +1,1299 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atk, Clutter, Gio, GObject, Shell, St } = imports.gi; +const Signals = imports.signals; + +const BoxPointer = imports.ui.boxpointer; +const GrabHelper = imports.ui.grabHelper; +const Main = imports.ui.main; +const Params = imports.misc.params; +const Tweener = imports.ui.tweener; + +var Ornament = { + NONE: 0, + DOT: 1, + CHECK: 2, +}; + +function isPopupMenuItemVisible(child) { + if (child._delegate instanceof PopupMenuSection) + if (child._delegate.isEmpty()) + return false; + return child.visible; +} + +/** + * @side Side to which the arrow points. + */ +function arrowIcon(side) { + let iconName; + switch (side) { + case St.Side.TOP: + iconName = 'pan-up-symbolic'; + break; + case St.Side.RIGHT: + iconName = 'pan-end-symbolic'; + break; + case St.Side.BOTTOM: + iconName = 'pan-down-symbolic'; + break; + case St.Side.LEFT: + iconName = 'pan-start-symbolic'; + break; + } + + let arrow = new St.Icon({ style_class: 'popup-menu-arrow', + icon_name: iconName, + accessible_role: Atk.Role.ARROW, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + + return arrow; +} + +var PopupBaseMenuItem = class { + constructor(params) { + params = Params.parse (params, { reactive: true, + activate: true, + hover: true, + style_class: null, + can_focus: true + }); + + this.actor = new St.BoxLayout({ style_class: 'popup-menu-item', + reactive: params.reactive, + track_hover: params.reactive, + can_focus: params.can_focus, + accessible_role: Atk.Role.MENU_ITEM }); + this.actor._delegate = this; + + this._ornament = Ornament.NONE; + this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' }); + this.actor.add(this._ornamentLabel); + + this._parent = null; + this.active = false; + this._activatable = params.reactive && params.activate; + this._sensitive = true; + + if (!this._activatable) + this.actor.add_style_class_name('popup-inactive-menu-item'); + + if (params.style_class) + this.actor.add_style_class_name(params.style_class); + + if (this._activatable) { + this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this)); + this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this)); + this.actor.connect('touch-event', this._onTouchEvent.bind(this)); + this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this)); + } + if (params.reactive && params.hover) + this.actor.connect('notify::hover', this._onHoverChanged.bind(this)); + + this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this)); + this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + } + + _getTopMenu() { + if (this._parent) + return this._parent._getTopMenu(); + else + return this; + } + + _setParent(parent) { + this._parent = parent; + } + + _onButtonPressEvent(actor, event) { + // This is the CSS active state + this.actor.add_style_pseudo_class ('active'); + return Clutter.EVENT_PROPAGATE; + } + + _onButtonReleaseEvent(actor, event) { + this.actor.remove_style_pseudo_class ('active'); + this.activate(event); + return Clutter.EVENT_STOP; + } + + _onTouchEvent(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_END) { + this.actor.remove_style_pseudo_class ('active'); + this.activate(event); + return Clutter.EVENT_STOP; + } else if (event.type() == Clutter.EventType.TOUCH_BEGIN) { + // This is the CSS active state + this.actor.add_style_pseudo_class ('active'); + } + return Clutter.EVENT_PROPAGATE; + } + + _onKeyPressEvent(actor, event) { + let state = event.get_state(); + + // if user has a modifier down (except capslock and numlock) + // then don't handle the key press here + state &= ~Clutter.ModifierType.LOCK_MASK; + state &= ~Clutter.ModifierType.MOD2_MASK; + state &= Clutter.ModifierType.MODIFIER_MASK; + + if (state) + return Clutter.EVENT_PROPAGATE; + + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { + this.activate(event); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + _onKeyFocusIn(actor) { + this.setActive(true); + } + + _onKeyFocusOut(actor) { + this.setActive(false); + } + + _onHoverChanged(actor) { + this.setActive(actor.hover); + } + + activate(event) { + this.emit('activate', event); + } + + setActive(active) { + let activeChanged = active != this.active; + if (activeChanged) { + this.active = active; + if (active) { + this.actor.add_style_class_name('selected'); + if (this.actor.can_focus) + this.actor.grab_key_focus(); + } else { + this.actor.remove_style_class_name('selected'); + // Remove the CSS active state if the user press the button and + // while holding moves to another menu item, so we don't paint all items. + // The correct behaviour would be to set the new item with the CSS + // active state as well, but button-press-event is not trigered, + // so we should track it in our own, which would involve some work + // in the container + this.actor.remove_style_pseudo_class ('active'); + } + this.emit('active-changed', active); + } + } + + syncSensitive() { + let sensitive = this.getSensitive(); + this.actor.reactive = sensitive; + this.actor.can_focus = sensitive; + this.emit('sensitive-changed'); + return sensitive; + } + + getSensitive() { + let parentSensitive = this._parent ? this._parent.getSensitive() : true; + return this._activatable && this._sensitive && parentSensitive; + } + + setSensitive(sensitive) { + if (this._sensitive == sensitive) + return; + + this._sensitive = sensitive; + this.syncSensitive(); + } + + destroy() { + this.actor.destroy(); + } + + _onDestroy() { + this.emit('destroy'); + } + + setOrnament(ornament) { + if (ornament == this._ornament) + return; + + this._ornament = ornament; + + if (ornament == Ornament.DOT) { + this._ornamentLabel.text = '\u2022'; + this.actor.add_accessible_state(Atk.StateType.CHECKED); + } else if (ornament == Ornament.CHECK) { + this._ornamentLabel.text = '\u2713'; + this.actor.add_accessible_state(Atk.StateType.CHECKED); + } else if (ornament == Ornament.NONE) { + this._ornamentLabel.text = ''; + this.actor.remove_accessible_state(Atk.StateType.CHECKED); + } + } +}; +Signals.addSignalMethods(PopupBaseMenuItem.prototype); + +var PopupMenuItem = class extends PopupBaseMenuItem { + constructor(text, params) { + super(params); + + this.label = new St.Label({ text: text }); + this.actor.add_child(this.label); + this.actor.label_actor = this.label + } +}; + +var PopupSeparatorMenuItem = class extends PopupBaseMenuItem { + constructor(text) { + super({ reactive: false, + can_focus: false}); + + this.label = new St.Label({ text: text || '' }); + this.actor.add(this.label); + this.actor.label_actor = this.label; + + this.label.connect('notify::text', + this._syncVisibility.bind(this)); + this._syncVisibility(); + + this._separator = new St.Widget({ style_class: 'popup-separator-menu-item', + y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + this.actor.add(this._separator, { expand: true }); + } + + _syncVisibility() { + this.label.visible = this.label.text != ''; + } +}; + +var Switch = class { + constructor(state) { + this.actor = new St.Bin({ style_class: 'toggle-switch', + accessible_role: Atk.Role.CHECK_BOX, + can_focus: true }); + this.setToggleState(state); + } + + setToggleState(state) { + if (state) + this.actor.add_style_pseudo_class('checked'); + else + this.actor.remove_style_pseudo_class('checked'); + this.state = state; + } + + toggle() { + this.setToggleState(!this.state); + } +}; + +var PopupSwitchMenuItem = class extends PopupBaseMenuItem { + constructor(text, active, params) { + super(params); + + this.label = new St.Label({ text: text }); + this._switch = new Switch(active); + + this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; + this.checkAccessibleState(); + this.actor.label_actor = this.label; + + this.actor.add_child(this.label); + + this._statusBin = new St.Bin({ x_align: St.Align.END }); + this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END }); + + this._statusLabel = new St.Label({ text: '', + style_class: 'popup-status-menu-item' + }); + this._statusBin.child = this._switch.actor; + } + + setStatus(text) { + if (text != null) { + this._statusLabel.text = text; + this._statusBin.child = this._statusLabel; + this.actor.reactive = false; + this.actor.accessible_role = Atk.Role.MENU_ITEM; + } else { + this._statusBin.child = this._switch.actor; + this.actor.reactive = true; + this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; + } + this.checkAccessibleState(); + } + + activate(event) { + if (this._switch.actor.mapped) { + this.toggle(); + } + + // we allow pressing space to toggle the switch + // without closing the menu + if (event.type() == Clutter.EventType.KEY_PRESS && + event.get_key_symbol() == Clutter.KEY_space) + return; + + super.activate(event); + } + + toggle() { + this._switch.toggle(); + this.emit('toggled', this._switch.state); + this.checkAccessibleState(); + } + + get state() { + return this._switch.state; + } + + setToggleState(state) { + this._switch.setToggleState(state); + this.checkAccessibleState(); + } + + checkAccessibleState() { + switch (this.actor.accessible_role) { + case Atk.Role.CHECK_MENU_ITEM: + if (this._switch.state) + this.actor.add_accessible_state (Atk.StateType.CHECKED); + else + this.actor.remove_accessible_state (Atk.StateType.CHECKED); + break; + default: + this.actor.remove_accessible_state (Atk.StateType.CHECKED); + } + } +}; + +var PopupImageMenuItem = class extends PopupBaseMenuItem { + constructor(text, icon, params) { + super(params); + + this._icon = new St.Icon({ style_class: 'popup-menu-icon', + x_align: Clutter.ActorAlign.END }); + this.actor.add_child(this._icon); + this.label = new St.Label({ text: text }); + this.actor.add_child(this.label); + this.actor.label_actor = this.label; + + this.setIcon(icon); + } + + setIcon(icon) { + // The 'icon' parameter can be either a Gio.Icon or a string. + if (icon instanceof GObject.Object && GObject.type_is_a(icon, Gio.Icon)) + this._icon.gicon = icon; + else + this._icon.icon_name = icon; + } +}; + +var PopupMenuBase = class { + constructor(sourceActor, styleClass) { + if (new.target === PopupMenuBase) + throw new TypeError('Cannot instantiate abstract class ' + new.target.name); + + this.sourceActor = sourceActor; + this._parent = null; + + if (styleClass !== undefined) { + this.box = new St.BoxLayout({ style_class: styleClass, + vertical: true }); + } else { + this.box = new St.BoxLayout({ vertical: true }); + } + this.length = 0; + + this.isOpen = false; + + // If set, we don't send events (including crossing events) to the source actor + // for the menu which causes its prelight state to freeze + this.blockSourceEvents = false; + + this._activeMenuItem = null; + this._settingsActions = { }; + + this._sensitive = true; + + this._sessionUpdatedId = Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + } + + _getTopMenu() { + if (this._parent) + return this._parent._getTopMenu(); + else + return this; + } + + _setParent(parent) { + this._parent = parent; + } + + getSensitive() { + let parentSensitive = this._parent ? this._parent.getSensitive() : true; + return this._sensitive && parentSensitive; + } + + setSensitive(sensitive) { + this._sensitive = sensitive; + this.emit('sensitive-changed'); + } + + _sessionUpdated() { + this._setSettingsVisibility(Main.sessionMode.allowSettings); + this.close(); + } + + addAction(title, callback, icon) { + let menuItem; + if (icon != undefined) + menuItem = new PopupImageMenuItem(title, icon); + else + menuItem = new PopupMenuItem(title); + + this.addMenuItem(menuItem); + menuItem.connect('activate', (menuItem, event) => { + callback(event); + }); + + return menuItem; + } + + addSettingsAction(title, desktopFile) { + let menuItem = this.addAction(title, () => { + let app = Shell.AppSystem.get_default().lookup_app(desktopFile); + + if (!app) { + log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!'); + return; + } + + Main.overview.hide(); + app.activate(); + }); + + menuItem.actor.visible = Main.sessionMode.allowSettings; + this._settingsActions[desktopFile] = menuItem; + + return menuItem; + } + + _setSettingsVisibility(visible) { + for (let id in this._settingsActions) { + let item = this._settingsActions[id]; + item.actor.visible = visible; + } + } + + isEmpty() { + let hasVisibleChildren = this.box.get_children().some(child => { + if (child._delegate instanceof PopupSeparatorMenuItem) + return false; + return isPopupMenuItemVisible(child); + }); + + return !hasVisibleChildren; + } + + itemActivated(animate) { + if (animate == undefined) + animate = BoxPointer.PopupAnimation.FULL; + + this._getTopMenu().close(animate); + } + + _subMenuActiveChanged(submenu, submenuItem) { + if (this._activeMenuItem && this._activeMenuItem != submenuItem) + this._activeMenuItem.setActive(false); + this._activeMenuItem = submenuItem; + this.emit('active-changed', submenuItem); + } + + _connectItemSignals(menuItem) { + menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => { + if (active && this._activeMenuItem != menuItem) { + if (this._activeMenuItem) + this._activeMenuItem.setActive(false); + this._activeMenuItem = menuItem; + this.emit('active-changed', menuItem); + } else if (!active && this._activeMenuItem == menuItem) { + this._activeMenuItem = null; + this.emit('active-changed', null); + } + }); + menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => { + let sensitive = menuItem.getSensitive(); + if (!sensitive && this._activeMenuItem == menuItem) { + if (!this.actor.navigate_focus(menuItem.actor, + St.DirectionType.TAB_FORWARD, + true)) + this.actor.grab_key_focus(); + } else if (sensitive && this._activeMenuItem == null) { + if (global.stage.get_key_focus() == this.actor) + menuItem.actor.grab_key_focus(); + } + }); + menuItem._activateId = menuItem.connect('activate', (menuItem, event) => { + this.emit('activate', menuItem); + this.itemActivated(BoxPointer.PopupAnimation.FULL); + }); + + menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => { + menuItem.syncSensitive(); + }); + + // the weird name is to avoid a conflict with some random property + // the menuItem may have, called destroyId + // (FIXME: in the future it may make sense to have container objects + // like PopupMenuManager does) + menuItem._popupMenuDestroyId = menuItem.connect('destroy', menuItem => { + menuItem.disconnect(menuItem._popupMenuDestroyId); + menuItem.disconnect(menuItem._activateId); + menuItem.disconnect(menuItem._activeChangeId); + menuItem.disconnect(menuItem._sensitiveChangeId); + this.disconnect(menuItem._parentSensitiveChangeId); + if (menuItem == this._activeMenuItem) + this._activeMenuItem = null; + }); + } + + _updateSeparatorVisibility(menuItem) { + if (menuItem.label.text) + return; + + let children = this.box.get_children(); + + let index = children.indexOf(menuItem.actor); + + if (index < 0) + return; + + let childBeforeIndex = index - 1; + + while (childBeforeIndex >= 0 && !isPopupMenuItemVisible(children[childBeforeIndex])) + childBeforeIndex--; + + if (childBeforeIndex < 0 + || children[childBeforeIndex]._delegate instanceof PopupSeparatorMenuItem) { + menuItem.actor.hide(); + return; + } + + let childAfterIndex = index + 1; + + while (childAfterIndex < children.length && !isPopupMenuItemVisible(children[childAfterIndex])) + childAfterIndex++; + + if (childAfterIndex >= children.length + || children[childAfterIndex]._delegate instanceof PopupSeparatorMenuItem) { + menuItem.actor.hide(); + return; + } + + menuItem.actor.show(); + } + + moveMenuItem(menuItem, position) { + let items = this._getMenuItems(); + let i = 0; + + while (i < items.length && position > 0) { + if (items[i] != menuItem) + position--; + i++; + } + + if (i < items.length) { + if (items[i] != menuItem) + this.box.set_child_below_sibling(menuItem.actor, items[i].actor); + } else { + this.box.set_child_above_sibling(menuItem.actor, null); + } + } + + addMenuItem(menuItem, position) { + let before_item = null; + if (position == undefined) { + this.box.add(menuItem.actor); + } else { + let items = this._getMenuItems(); + if (position < items.length) { + before_item = items[position].actor; + this.box.insert_child_below(menuItem.actor, before_item); + } else { + this.box.add(menuItem.actor); + } + } + + if (menuItem instanceof PopupMenuSection) { + let activeChangeId = menuItem.connect('active-changed', this._subMenuActiveChanged.bind(this)); + + let parentOpenStateChangedId = this.connect('open-state-changed', (self, open) => { + if (open) + menuItem.open(); + else + menuItem.close(); + }); + let parentClosingId = this.connect('menu-closed', () => { + menuItem.emit('menu-closed'); + }); + let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => { + menuItem.emit('sensitive-changed'); + }); + + menuItem.connect('destroy', () => { + menuItem.disconnect(activeChangeId); + this.disconnect(subMenuSensitiveChangedId); + this.disconnect(parentOpenStateChangedId); + this.disconnect(parentClosingId); + this.length--; + }); + } else if (menuItem instanceof PopupSubMenuMenuItem) { + if (before_item == null) + this.box.add(menuItem.menu.actor); + else + this.box.insert_child_below(menuItem.menu.actor, before_item); + + this._connectItemSignals(menuItem); + let subMenuActiveChangeId = menuItem.menu.connect('active-changed', this._subMenuActiveChanged.bind(this)); + let closingId = this.connect('menu-closed', () => { + menuItem.menu.close(BoxPointer.PopupAnimation.NONE); + }); + + menuItem.connect('destroy', () => { + menuItem.menu.disconnect(subMenuActiveChangeId); + this.disconnect(closingId); + }); + } else if (menuItem instanceof PopupSeparatorMenuItem) { + this._connectItemSignals(menuItem); + + // updateSeparatorVisibility needs to get called any time the + // separator's adjacent siblings change visibility or position. + // open-state-changed isn't exactly that, but doing it in more + // precise ways would require a lot more bookkeeping. + let openStateChangeId = this.connect('open-state-changed', () => { + this._updateSeparatorVisibility(menuItem); + }); + let destroyId = menuItem.connect('destroy', () => { + this.disconnect(openStateChangeId); + menuItem.disconnect(destroyId); + }); + } else if (menuItem instanceof PopupBaseMenuItem) + this._connectItemSignals(menuItem); + else + throw TypeError("Invalid argument to PopupMenuBase.addMenuItem()"); + + menuItem._setParent(this); + + this.length++; + } + + _getMenuItems() { + return this.box.get_children().map(a => a._delegate).filter(item => { + return item instanceof PopupBaseMenuItem || item instanceof PopupMenuSection; + }); + } + + get firstMenuItem() { + let items = this._getMenuItems(); + if (items.length) + return items[0]; + else + return null; + } + + get numMenuItems() { + return this._getMenuItems().length; + } + + removeAll() { + let children = this._getMenuItems(); + for (let i = 0; i < children.length; i++) { + let item = children[i]; + item.destroy(); + } + } + + toggle() { + if (this.isOpen) + this.close(BoxPointer.PopupAnimation.FULL); + else + this.open(BoxPointer.PopupAnimation.FULL); + } + + destroy() { + this.close(); + this.removeAll(); + this.actor.destroy(); + + this.emit('destroy'); + + Main.sessionMode.disconnect(this._sessionUpdatedId); + this._sessionUpdatedId = 0; + } +}; +Signals.addSignalMethods(PopupMenuBase.prototype); + +var PopupMenu = class extends PopupMenuBase { + constructor(sourceActor, arrowAlignment, arrowSide) { + super(sourceActor, 'popup-menu-content'); + + this._arrowAlignment = arrowAlignment; + this._arrowSide = arrowSide; + + this._boxPointer = new BoxPointer.BoxPointer(arrowSide, + { x_fill: true, + y_fill: true, + x_align: St.Align.START }); + this.actor = this._boxPointer; + this.actor._delegate = this; + this.actor.style_class = 'popup-menu-boxpointer'; + + this._boxPointer.bin.set_child(this.box); + this.actor.add_style_class_name('popup-menu'); + + global.focus_manager.add_group(this.actor); + this.actor.reactive = true; + + if (this.sourceActor) + this._keyPressId = this.sourceActor.connect('key-press-event', + this._onKeyPress.bind(this)); + + this._openedSubMenu = null; + } + + _setOpenedSubMenu(submenu) { + if (this._openedSubMenu) + this._openedSubMenu.close(true); + + this._openedSubMenu = submenu; + } + + _onKeyPress(actor, event) { + // Disable toggling the menu by keyboard + // when it cannot be toggled by pointer + if (!actor.reactive) + return Clutter.EVENT_PROPAGATE; + + let navKey; + switch (this._boxPointer.arrowSide) { + case St.Side.TOP: + navKey = Clutter.KEY_Down; + break; + case St.Side.BOTTOM: + navKey = Clutter.KEY_Up; + break; + case St.Side.LEFT: + navKey = Clutter.KEY_Right; + break; + case St.Side.RIGHT: + navKey = Clutter.KEY_Left; + break; + } + + let state = event.get_state(); + + // if user has a modifier down (except capslock) + // then don't handle the key press here + state &= ~Clutter.ModifierType.LOCK_MASK; + state &= Clutter.ModifierType.MODIFIER_MASK; + + if (state) + return Clutter.EVENT_PROPAGATE; + + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { + this.toggle(); + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.KEY_Escape && this.isOpen) { + this.close(); + return Clutter.EVENT_STOP; + } else if (symbol == navKey) { + if (!this.isOpen) + this.toggle(); + this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + return Clutter.EVENT_STOP; + } else + return Clutter.EVENT_PROPAGATE; + } + + setArrowOrigin(origin) { + this._boxPointer.setArrowOrigin(origin); + } + + setSourceAlignment(alignment) { + this._boxPointer.setSourceAlignment(alignment); + } + + open(animate) { + if (this.isOpen) + return; + + if (this.isEmpty()) + return; + + this.isOpen = true; + + this._boxPointer.setPosition(this.sourceActor, this._arrowAlignment); + this._boxPointer.open(animate); + + this.actor.raise_top(); + + this.emit('open-state-changed', true); + } + + close(animate) { + if (this._activeMenuItem) + this._activeMenuItem.setActive(false); + + if (this._boxPointer.actor.visible) { + this._boxPointer.close(animate, () => { + this.emit('menu-closed'); + }); + } + + if (!this.isOpen) + return; + + this.isOpen = false; + this.emit('open-state-changed', false); + } + + destroy() { + if (this._keyPressId) + this.sourceActor.disconnect(this._keyPressId); + super.destroy(); + } +}; + +var PopupDummyMenu = class { + constructor(sourceActor) { + this.sourceActor = sourceActor; + this.actor = sourceActor; + this.actor._delegate = this; + } + + getSensitive() { + return true; + } + + open() { this.emit('open-state-changed', true); } + close() { this.emit('open-state-changed', false); } + toggle() {} + destroy() { + this.emit('destroy'); + } +}; +Signals.addSignalMethods(PopupDummyMenu.prototype); + +var PopupSubMenu = class extends PopupMenuBase { + constructor(sourceActor, sourceArrow) { + super(sourceActor); + + this._arrow = sourceArrow; + + // Since a function of a submenu might be to provide a "More.." expander + // with long content, we make it scrollable - the scrollbar will only take + // effect if a CSS max-height is set on the top menu. + this.actor = new St.ScrollView({ style_class: 'popup-sub-menu', + hscrollbar_policy: St.PolicyType.NEVER, + vscrollbar_policy: St.PolicyType.NEVER }); + + this.actor.add_actor(this.box); + this.actor._delegate = this; + this.actor.clip_to_allocation = true; + this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this)); + this.actor.hide(); + } + + _needsScrollbar() { + let topMenu = this._getTopMenu(); + let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1); + let topThemeNode = topMenu.actor.get_theme_node(); + + let topMaxHeight = topThemeNode.get_max_height(); + return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight; + } + + getSensitive() { + return this._sensitive && this.sourceActor._delegate.getSensitive(); + } + + open(animate) { + if (this.isOpen) + return; + + if (this.isEmpty()) + return; + + this.isOpen = true; + this.emit('open-state-changed', true); + + this.actor.show(); + + let needsScrollbar = this._needsScrollbar(); + + // St.ScrollView always requests space horizontally for a possible vertical + // scrollbar if in AUTOMATIC mode. Doing better would require implementation + // of width-for-height in St.BoxLayout and St.ScrollView. This looks bad + // when we *don't* need it, so turn off the scrollbar when that's true. + // Dynamic changes in whether we need it aren't handled properly. + this.actor.vscrollbar_policy = + needsScrollbar ? St.PolicyType.AUTOMATIC : St.PolicyType.NEVER; + + if (needsScrollbar) + this.actor.add_style_pseudo_class('scrolled'); + else + this.actor.remove_style_pseudo_class('scrolled'); + + // It looks funny if we animate with a scrollbar (at what point is + // the scrollbar added?) so just skip that case + if (animate && needsScrollbar) + animate = false; + + let targetAngle = this.actor.text_direction == Clutter.TextDirection.RTL ? -90 : 90; + + if (animate) { + let [minHeight, naturalHeight] = this.actor.get_preferred_height(-1); + this.actor.height = 0; + this.actor._arrowRotation = this._arrow.rotation_angle_z; + Tweener.addTween(this.actor, + { _arrowRotation: targetAngle, + height: naturalHeight, + time: 0.25, + onUpdateScope: this, + onUpdate() { + this._arrow.rotation_angle_z = this.actor._arrowRotation; + }, + onCompleteScope: this, + onComplete() { + this.actor.set_height(-1); + } + }); + } else { + this._arrow.rotation_angle_z = targetAngle; + } + } + + close(animate) { + if (!this.isOpen) + return; + + this.isOpen = false; + this.emit('open-state-changed', false); + + if (this._activeMenuItem) + this._activeMenuItem.setActive(false); + + if (animate && this._needsScrollbar()) + animate = false; + + if (animate) { + this.actor._arrowRotation = this._arrow.rotation_angle_z; + Tweener.addTween(this.actor, + { _arrowRotation: 0, + height: 0, + time: 0.25, + onUpdateScope: this, + onUpdate() { + this._arrow.rotation_angle_z = this.actor._arrowRotation; + }, + onCompleteScope: this, + onComplete() { + this.actor.hide(); + this.actor.set_height(-1); + }, + }); + } else { + this._arrow.rotation_angle_z = 0; + this.actor.hide(); + } + } + + _onKeyPressEvent(actor, event) { + // Move focus back to parent menu if the user types Left. + + if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) { + this.close(BoxPointer.PopupAnimation.FULL); + this.sourceActor._delegate.setActive(true); + return Clutter.EVENT_STOP; + } + + return Clutter.EVENT_PROPAGATE; + } +}; + +/** + * PopupMenuSection: + * + * A section of a PopupMenu which is handled like a submenu + * (you can add and remove items, you can destroy it, you + * can add it to another menu), but is completely transparent + * to the user + */ +var PopupMenuSection = class extends PopupMenuBase { + constructor() { + super(); + + this.actor = this.box; + this.actor._delegate = this; + this.isOpen = true; + } + + // deliberately ignore any attempt to open() or close(), but emit the + // corresponding signal so children can still pick it up + open() { this.emit('open-state-changed', true); } + close() { this.emit('open-state-changed', false); } +}; + +var PopupSubMenuMenuItem = class extends PopupBaseMenuItem { + constructor(text, wantIcon) { + super(); + + this.actor.add_style_class_name('popup-submenu-menu-item'); + + if (wantIcon) { + this.icon = new St.Icon({ style_class: 'popup-menu-icon' }); + this.actor.add_child(this.icon); + } + + this.label = new St.Label({ text: text, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + this.actor.add_child(this.label); + this.actor.label_actor = this.label; + + let expander = new St.Bin({ style_class: 'popup-menu-item-expander' }); + this.actor.add(expander, { expand: true }); + + this._triangle = arrowIcon(St.Side.RIGHT); + this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 }); + + this._triangleBin = new St.Widget({ y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + this._triangleBin.add_child(this._triangle); + + this.actor.add_child(this._triangleBin); + this.actor.add_accessible_state (Atk.StateType.EXPANDABLE); + + this.menu = new PopupSubMenu(this.actor, this._triangle); + this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this)); + } + + _setParent(parent) { + super._setParent(parent); + this.menu._setParent(parent); + } + + syncSensitive() { + let sensitive = super.syncSensitive(); + this._triangle.visible = sensitive; + if (!sensitive) + this.menu.close(false); + } + + _subMenuOpenStateChanged(menu, open) { + if (open) { + this.actor.add_style_pseudo_class('open'); + this._getTopMenu()._setOpenedSubMenu(this.menu); + this.actor.add_accessible_state (Atk.StateType.EXPANDED); + this.actor.add_style_pseudo_class('checked'); + } else { + this.actor.remove_style_pseudo_class('open'); + this._getTopMenu()._setOpenedSubMenu(null); + this.actor.remove_accessible_state (Atk.StateType.EXPANDED); + this.actor.remove_style_pseudo_class('checked'); + } + } + + destroy() { + this.menu.destroy(); + + super.destroy(); + } + + setSubmenuShown(open) { + if (open) + this.menu.open(BoxPointer.PopupAnimation.FULL); + else + this.menu.close(BoxPointer.PopupAnimation.FULL); + } + + _setOpenState(open) { + this.setSubmenuShown(open); + } + + _getOpenState() { + return this.menu.isOpen; + } + + _onKeyPressEvent(actor, event) { + let symbol = event.get_key_symbol(); + + if (symbol == Clutter.KEY_Right) { + this._setOpenState(true); + this.menu.actor.navigate_focus(null, St.DirectionType.DOWN, false); + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.KEY_Left && this._getOpenState()) { + this._setOpenState(false); + return Clutter.EVENT_STOP; + } + + return super._onKeyPressEvent(actor, event); + } + + activate(event) { + this._setOpenState(true); + } + + _onButtonReleaseEvent(actor) { + // Since we override the parent, we need to manage what the parent does + // with the active style class + this.actor.remove_style_pseudo_class ('active'); + this._setOpenState(!this._getOpenState()); + return Clutter.EVENT_PROPAGATE; + } + + _onTouchEvent(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_END) { + // Since we override the parent, we need to manage what the parent does + // with the active style class + this.actor.remove_style_pseudo_class ('active'); + this._setOpenState(!this._getOpenState()); + } + return Clutter.EVENT_PROPAGATE; + } +}; + +/* Basic implementation of a menu manager. + * Call addMenu to add menus + */ +var PopupMenuManager = class { + constructor(owner, grabParams) { + grabParams = Params.parse(grabParams, + { actionMode: Shell.ActionMode.POPUP }); + this._owner = owner; + this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams); + this._menus = []; + } + + addMenu(menu, position) { + if (this._findMenu(menu) > -1) + return; + + let menudata = { + menu: menu, + openStateChangeId: menu.connect('open-state-changed', this._onMenuOpenState.bind(this)), + destroyId: menu.connect('destroy', this._onMenuDestroy.bind(this)), + enterId: 0, + focusInId: 0 + }; + + let source = menu.sourceActor; + if (source) { + if (!menu.blockSourceEvents) + this._grabHelper.addActor(source); + menudata.enterId = source.connect('enter-event', + () => this._onMenuSourceEnter(menu)); + menudata.focusInId = source.connect('key-focus-in', () => { + this._onMenuSourceEnter(menu); + }); + } + + if (position == undefined) + this._menus.push(menudata); + else + this._menus.splice(position, 0, menudata); + } + + removeMenu(menu) { + if (menu == this.activeMenu) + this._closeMenu(false, menu); + + let position = this._findMenu(menu); + if (position == -1) // not a menu we manage + return; + + let menudata = this._menus[position]; + menu.disconnect(menudata.openStateChangeId); + menu.disconnect(menudata.destroyId); + + if (menudata.enterId) + menu.sourceActor.disconnect(menudata.enterId); + if (menudata.focusInId) + menu.sourceActor.disconnect(menudata.focusInId); + + if (menu.sourceActor) + this._grabHelper.removeActor(menu.sourceActor); + this._menus.splice(position, 1); + } + + get activeMenu() { + let firstGrab = this._grabHelper.grabStack[0]; + if (firstGrab) + return firstGrab.actor._delegate; + else + return null; + } + + ignoreRelease() { + return this._grabHelper.ignoreRelease(); + } + + _onMenuOpenState(menu, open) { + if (open) { + if (this.activeMenu) + this.activeMenu.close(BoxPointer.PopupAnimation.FADE); + this._grabHelper.grab({ actor: menu.actor, focus: menu.sourceActor, + onUngrab: isUser => { + this._closeMenu(isUser, menu); + } }); + } else { + this._grabHelper.ungrab({ actor: menu.actor }); + } + } + + _changeMenu(newMenu) { + newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE + : BoxPointer.PopupAnimation.FULL); + } + + _onMenuSourceEnter(menu) { + if (!this._grabHelper.grabbed) + return Clutter.EVENT_PROPAGATE; + + if (this._grabHelper.isActorGrabbed(menu.actor)) + return Clutter.EVENT_PROPAGATE; + + this._changeMenu(menu); + return Clutter.EVENT_PROPAGATE; + } + + _onMenuDestroy(menu) { + this.removeMenu(menu); + } + + _findMenu(item) { + for (let i = 0; i < this._menus.length; i++) { + let menudata = this._menus[i]; + if (item == menudata.menu) + return i; + } + return -1; + } + + _closeMenu(isUser, menu) { + // If this isn't a user action, we called close() + // on the BoxPointer ourselves, so we shouldn't + // reanimate. + if (isUser) + menu.close(BoxPointer.PopupAnimation.FULL); + } +}; diff --git a/js/ui/remoteSearch.js b/js/ui/remoteSearch.js new file mode 100644 index 0000000..1b9186b --- /dev/null +++ b/js/ui/remoteSearch.js @@ -0,0 +1,333 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { GdkPixbuf, Gio, GLib, Shell, St } = imports.gi; + +const FileUtils = imports.misc.fileUtils; + +const KEY_FILE_GROUP = 'Shell Search Provider'; + +const SearchProviderIface = ` + + + + + + + + + + + + + + + + + + + +`; + +const SearchProvider2Iface = ` + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +var SearchProviderProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProviderIface); +var SearchProvider2ProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProvider2Iface); + +function loadRemoteSearchProviders(searchSettings, callback) { + let objectPaths = {}; + let loadedProviders = []; + + function loadRemoteSearchProvider(file) { + let keyfile = new GLib.KeyFile(); + let path = file.get_path(); + + try { + keyfile.load_from_file(path, 0); + } catch(e) { + return; + } + + if (!keyfile.has_group(KEY_FILE_GROUP)) + return; + + let remoteProvider; + try { + let group = KEY_FILE_GROUP; + let busName = keyfile.get_string(group, 'BusName'); + let objectPath = keyfile.get_string(group, 'ObjectPath'); + + if (objectPaths[objectPath]) + return; + + let appInfo = null; + try { + let desktopId = keyfile.get_string(group, 'DesktopId'); + appInfo = Gio.DesktopAppInfo.new(desktopId); + } catch (e) { + log('Ignoring search provider ' + path + ': missing DesktopId'); + return; + } + + let autoStart = true; + try { + autoStart = keyfile.get_boolean(group, 'AutoStart'); + } catch(e) { + // ignore error + } + + let version = '1'; + try { + version = keyfile.get_string(group, 'Version'); + } catch (e) { + // ignore error + } + + if (version >= 2) + remoteProvider = new RemoteSearchProvider2(appInfo, busName, objectPath, autoStart); + else + remoteProvider = new RemoteSearchProvider(appInfo, busName, objectPath, autoStart); + + remoteProvider.defaultEnabled = true; + try { + remoteProvider.defaultEnabled = !keyfile.get_boolean(group, 'DefaultDisabled'); + } catch(e) { + // ignore error + } + + objectPaths[objectPath] = remoteProvider; + loadedProviders.push(remoteProvider); + } catch(e) { + log('Failed to add search provider %s: %s'.format(path, e.toString())); + } + } + + if (searchSettings.get_boolean('disable-external')) { + callback([]); + return; + } + + FileUtils.collectFromDatadirs('search-providers', false, loadRemoteSearchProvider); + + let sortOrder = searchSettings.get_strv('sort-order'); + + // Special case gnome-control-center to be always active and always first + sortOrder.unshift('gnome-control-center.desktop'); + + loadedProviders = loadedProviders.filter(provider => { + let appId = provider.appInfo.get_id(); + + if (provider.defaultEnabled) { + let disabled = searchSettings.get_strv('disabled'); + return disabled.indexOf(appId) == -1; + } else { + let enabled = searchSettings.get_strv('enabled'); + return enabled.indexOf(appId) != -1; + } + }); + + loadedProviders.sort((providerA, providerB) => { + let idxA, idxB; + let appIdA, appIdB; + + appIdA = providerA.appInfo.get_id(); + appIdB = providerB.appInfo.get_id(); + + idxA = sortOrder.indexOf(appIdA); + idxB = sortOrder.indexOf(appIdB); + + // if no provider is found in the order, use alphabetical order + if ((idxA == -1) && (idxB == -1)) { + let nameA = providerA.appInfo.get_name(); + let nameB = providerB.appInfo.get_name(); + + return GLib.utf8_collate(nameA, nameB); + } + + // if providerA isn't found, it's sorted after providerB + if (idxA == -1) + return 1; + + // if providerB isn't found, it's sorted after providerA + if (idxB == -1) + return -1; + + // finally, if both providers are found, return their order in the list + return (idxA - idxB); + }); + + callback(loadedProviders); +} + +var RemoteSearchProvider = class { + constructor(appInfo, dbusName, dbusPath, autoStart, proxyInfo) { + if (!proxyInfo) + proxyInfo = SearchProviderProxyInfo; + + let g_flags = Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES; + if (autoStart) + g_flags |= Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION; + else + g_flags |= Gio.DBusProxyFlags.DO_NOT_AUTO_START; + + this.proxy = new Gio.DBusProxy({ g_bus_type: Gio.BusType.SESSION, + g_name: dbusName, + g_object_path: dbusPath, + g_interface_info: proxyInfo, + g_interface_name: proxyInfo.name, + g_flags }); + this.proxy.init_async(GLib.PRIORITY_DEFAULT, null, null); + + this.appInfo = appInfo; + this.id = appInfo.get_id(); + this.isRemoteProvider = true; + this.canLaunchSearch = false; + } + + createIcon(size, meta) { + let gicon = null; + let icon = null; + + if (meta['icon']) { + gicon = Gio.icon_deserialize(meta['icon']); + } else if (meta['gicon']) { + gicon = Gio.icon_new_for_string(meta['gicon']); + } else if (meta['icon-data']) { + let [width, height, rowStride, hasAlpha, + bitsPerSample, nChannels, data] = meta['icon-data']; + gicon = Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha, + bitsPerSample, width, height, rowStride); + } + + if (gicon) + icon = new St.Icon({ gicon: gicon, + icon_size: size }); + return icon; + } + + filterResults(results, maxNumber) { + if (results.length <= maxNumber) + return results; + + let regularResults = results.filter(r => !r.startsWith('special:')); + let specialResults = results.filter(r => r.startsWith('special:')); + + return regularResults.slice(0, maxNumber).concat(specialResults.slice(0, maxNumber)); + } + + _getResultsFinished(results, error, callback) { + if (error) { + if (error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + return; + + log('Received error from DBus search provider %s: %s'.format(this.id, String(error))); + callback([]); + return; + } + + callback(results[0]); + } + + getInitialResultSet(terms, callback, cancellable) { + this.proxy.GetInitialResultSetRemote(terms, + (results, error) => { + this._getResultsFinished(results, error, callback); + }, + cancellable); + } + + getSubsearchResultSet(previousResults, newTerms, callback, cancellable) { + this.proxy.GetSubsearchResultSetRemote(previousResults, newTerms, + (results, error) => { + this._getResultsFinished(results, error, callback); + }, + cancellable); + } + + _getResultMetasFinished(results, error, callback) { + if (error) { + if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + log('Received error from DBus search provider %s during GetResultMetas: %s'.format(this.id, String(error))); + callback([]); + return; + } + let metas = results[0]; + let resultMetas = []; + for (let i = 0; i < metas.length; i++) { + for (let prop in metas[i]) { + // we can use the serialized icon variant directly + if (prop != 'icon') + metas[i][prop] = metas[i][prop].deep_unpack(); + } + + resultMetas.push({ id: metas[i]['id'], + name: metas[i]['name'], + description: metas[i]['description'], + createIcon: size => { + return this.createIcon(size, metas[i]); + }, + clipboardText: metas[i]['clipboardText'] }); + } + callback(resultMetas); + } + + getResultMetas(ids, callback, cancellable) { + this.proxy.GetResultMetasRemote(ids, + (results, error) => { + this._getResultMetasFinished(results, error, callback); + }, + cancellable); + } + + activateResult(id) { + this.proxy.ActivateResultRemote(id); + } + + launchSearch(terms) { + // the provider is not compatible with the new version of the interface, launch + // the app itself but warn so we can catch the error in logs + log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch'); + this.appInfo.launch([], global.create_app_launch_context(0, -1)); + } +}; + +var RemoteSearchProvider2 = class extends RemoteSearchProvider { + constructor(appInfo, dbusName, dbusPath, autoStart) { + super(appInfo, dbusName, dbusPath, autoStart, SearchProvider2ProxyInfo); + + this.canLaunchSearch = true; + } + + activateResult(id, terms) { + this.proxy.ActivateResultRemote(id, terms, global.get_current_time()); + } + + launchSearch(terms) { + this.proxy.LaunchSearchRemote(terms, global.get_current_time()); + } +}; diff --git a/js/ui/runDialog.js b/js/ui/runDialog.js new file mode 100644 index 0000000..49f1402 --- /dev/null +++ b/js/ui/runDialog.js @@ -0,0 +1,286 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const ModalDialog = imports.ui.modalDialog; +const ShellEntry = imports.ui.shellEntry; +const Tweener = imports.ui.tweener; +const Util = imports.misc.util; +const History = imports.misc.history; + +var MAX_FILE_DELETED_BEFORE_INVALID = 10; + +const HISTORY_KEY = 'command-history'; + +const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; +const DISABLE_COMMAND_LINE_KEY = 'disable-command-line'; + +const TERMINAL_SCHEMA = 'org.gnome.desktop.default-applications.terminal'; +const EXEC_KEY = 'exec'; +const EXEC_ARG_KEY = 'exec-arg'; + +var DIALOG_GROW_TIME = 0.1; + +var RunDialog = class extends ModalDialog.ModalDialog { + constructor() { + super({ styleClass: 'run-dialog', + destroyOnClose: false }); + + this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); + this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA }); + global.settings.connect('changed::development-tools', () => { + this._enableInternalCommands = global.settings.get_boolean('development-tools'); + }); + this._enableInternalCommands = global.settings.get_boolean('development-tools'); + + this._internalCommands = { 'lg': () => { + Main.createLookingGlass().open(); + }, + + 'r': this._restart.bind(this), + + // Developer brain backwards compatibility + 'restart': this._restart.bind(this), + + 'debugexit': () => { + Meta.quit(Meta.ExitCode.ERROR); + }, + + // rt is short for "reload theme" + 'rt': () => { + Main.reloadThemeResource(); + Main.loadTheme(); + }, + + 'check_cloexec_fds': () => { + Shell.util_check_cloexec_fds(); + }, + }; + + + let label = new St.Label({ style_class: 'run-dialog-label', + text: _("Enter a Command") }); + + this.contentLayout.add(label, { x_fill: false, + x_align: St.Align.START, + y_align: St.Align.START }); + + let entry = new St.Entry({ style_class: 'run-dialog-entry', + can_focus: true }); + ShellEntry.addContextMenu(entry); + + entry.label_actor = label; + + this._entryText = entry.clutter_text; + this.contentLayout.add(entry, { y_align: St.Align.START }); + this.setInitialKeyFocus(this._entryText); + + this._errorBox = new St.BoxLayout({ style_class: 'run-dialog-error-box' }); + + this.contentLayout.add(this._errorBox, { expand: true }); + + let errorIcon = new St.Icon({ icon_name: 'dialog-error-symbolic', + icon_size: 24, + style_class: 'run-dialog-error-icon' }); + + this._errorBox.add(errorIcon, { y_align: St.Align.MIDDLE }); + + this._commandError = false; + + this._errorMessage = new St.Label({ style_class: 'run-dialog-error-label' }); + this._errorMessage.clutter_text.line_wrap = true; + + this._errorBox.add(this._errorMessage, { expand: true, + x_align: St.Align.START, + x_fill: false, + y_align: St.Align.MIDDLE, + y_fill: false }); + + this._errorBox.hide(); + + this.setButtons([{ action: this.close.bind(this), + label: _("Close"), + key: Clutter.Escape }]); + + this._pathCompleter = new Gio.FilenameCompleter(); + + this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY, + entry: this._entryText }); + this._entryText.connect('activate', (o) => { + this.popModal(); + this._run(o.get_text(), + Clutter.get_current_event().get_state() & Clutter.ModifierType.CONTROL_MASK); + if (!this._commandError || + !this.pushModal()) + this.close(); + }); + this._entryText.connect('key-press-event', (o, e) => { + let symbol = e.get_key_symbol(); + if (symbol == Clutter.Tab) { + let text = o.get_text(); + let prefix; + if (text.lastIndexOf(' ') == -1) + prefix = text; + else + prefix = text.substr(text.lastIndexOf(' ') + 1); + let postfix = this._getCompletion(prefix); + if (postfix != null && postfix.length > 0) { + o.insert_text(postfix, -1); + o.set_cursor_position(text.length + postfix.length); + } + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + }); + } + + _getCommandCompletion(text) { + function _getCommon(s1, s2) { + if (s1 == null) + return s2; + + let k = 0; + for (; k < s1.length && k < s2.length; k++) { + if (s1[k] != s2[k]) + break; + } + if (k == 0) + return ''; + return s1.substr(0, k); + } + + let paths = GLib.getenv('PATH').split(':'); + paths.push(GLib.get_home_dir()); + let someResults = paths.map(path => { + let results = []; + try { + let file = Gio.File.new_for_path(path); + let fileEnum = file.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null); + let info; + while ((info = fileEnum.next_file(null))) { + let name = info.get_name(); + if (name.slice(0, text.length) == text) + results.push(name); + } + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND) && + !e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_DIRECTORY)) + log(e); + } finally { + return results; + } + }); + let results = someResults.reduce((a, b) => a.concat(b), []); + + if (!results.length) + return null; + + let common = results.reduce(_getCommon, null); + return common.substr(text.length); + } + + _getCompletion(text) { + if (text.indexOf('/') != -1) { + return this._pathCompleter.get_completion_suffix(text); + } else { + return this._getCommandCompletion(text); + } + } + + _run(input, inTerminal) { + let command = input; + + this._history.addItem(input); + this._commandError = false; + let f; + if (this._enableInternalCommands) + f = this._internalCommands[input]; + else + f = null; + if (f) { + f(); + } else if (input) { + try { + if (inTerminal) { + let exec = this._terminalSettings.get_string(EXEC_KEY); + let exec_arg = this._terminalSettings.get_string(EXEC_ARG_KEY); + command = exec + ' ' + exec_arg + ' ' + input; + } + Util.trySpawnCommandLine(command); + } catch (e) { + // Mmmh, that failed - see if @input matches an existing file + let path = null; + if (input.charAt(0) == '/') { + path = input; + } else { + if (input.charAt(0) == '~') + input = input.slice(1); + path = GLib.get_home_dir() + '/' + input; + } + + if (GLib.file_test(path, GLib.FileTest.EXISTS)) { + let file = Gio.file_new_for_path(path); + try { + Gio.app_info_launch_default_for_uri(file.get_uri(), + global.create_app_launch_context(0, -1)); + } catch (e) { + // The exception from gjs contains an error string like: + // Error invoking Gio.app_info_launch_default_for_uri: No application + // is registered as handling this file + // We are only interested in the part after the first colon. + let message = e.message.replace(/[^:]*: *(.+)/, '$1'); + this._showError(message); + } + } else { + this._showError(e.message); + } + } + } + } + + _showError(message) { + this._commandError = true; + + this._errorMessage.set_text(message); + + if (!this._errorBox.visible) { + let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1); + + let parentActor = this._errorBox.get_parent(); + Tweener.addTween(parentActor, + { height: parentActor.height + errorBoxNaturalHeight, + time: DIALOG_GROW_TIME, + transition: 'easeOutQuad', + onComplete: () => { + parentActor.set_height(-1); + this._errorBox.show(); + } + }); + } + } + + _restart() { + if (Meta.is_wayland_compositor()) { + this._showError(_("Restart is not available on Wayland")); + return; + } + this._shouldFadeOut = false; + this.close(); + Meta.restart(_("Restarting…")); + } + + open() { + this._history.lastItem(); + this._errorBox.hide(); + this._entryText.set_text(''); + this._commandError = false; + + if (this._lockdownSettings.get_boolean(DISABLE_COMMAND_LINE_KEY)) + return; + + super.open(); + } +}; +Signals.addSignalMethods(RunDialog.prototype); diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js new file mode 100644 index 0000000..a005a20 --- /dev/null +++ b/js/ui/screenShield.js @@ -0,0 +1,1335 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { AccountsService, Clutter, Cogl, Gio, GLib, + GnomeDesktop, GObject, Meta, Shell, St } = imports.gi; +const Cairo = imports.cairo; +const Mainloop = imports.mainloop; +const Signals = imports.signals; +const TweenerEquations = imports.tweener.equations; + +const Background = imports.ui.background; +const GnomeSession = imports.misc.gnomeSession; +const Layout = imports.ui.layout; +const OVirt = imports.gdm.oVirt; +const LoginManager = imports.misc.loginManager; +const Lightbox = imports.ui.lightbox; +const Main = imports.ui.main; +const Overview = imports.ui.overview; +const MessageTray = imports.ui.messageTray; +const ShellDBus = imports.ui.shellDBus; +const SmartcardManager = imports.misc.smartcardManager; +const Tweener = imports.ui.tweener; + +const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver'; +const LOCK_ENABLED_KEY = 'lock-enabled'; +const LOCK_DELAY_KEY = 'lock-delay'; + +const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; +const DISABLE_LOCK_KEY = 'disable-lock-screen'; + +const LOCKED_STATE_STR = 'screenShield.locked'; +// fraction of screen height the arrow must reach before completing +// the slide up automatically +var ARROW_DRAG_THRESHOLD = 0.1; + +// Parameters for the arrow animation +var N_ARROWS = 3; +var ARROW_ANIMATION_TIME = 0.6; +var ARROW_ANIMATION_PEAK_OPACITY = 0.4; +var ARROW_IDLE_TIME = 30000; // ms + +var SUMMARY_ICON_SIZE = 48; + +// ScreenShield animation time +// - STANDARD_FADE_TIME is used when the session goes idle +// - MANUAL_FADE_TIME is used for lowering the shield when asked by the user, +// or when cancelling the dialog +// - BACKGROUND_FADE_TIME is used when the background changes to crossfade to new background +// - CURTAIN_SLIDE_TIME is used when raising the shield before unlocking +var STANDARD_FADE_TIME = 10; +var MANUAL_FADE_TIME = 0.3; +var BACKGROUND_FADE_TIME = 1.0; +var CURTAIN_SLIDE_TIME = 0.3; + +var Clock = class { + constructor() { + this.actor = new St.BoxLayout({ style_class: 'screen-shield-clock', + vertical: true }); + + this._time = new St.Label({ style_class: 'screen-shield-clock-time' }); + this._date = new St.Label({ style_class: 'screen-shield-clock-date' }); + + this.actor.add(this._time, { x_align: St.Align.MIDDLE }); + this.actor.add(this._date, { x_align: St.Align.MIDDLE }); + + this._wallClock = new GnomeDesktop.WallClock({ time_only: true }); + this._wallClock.connect('notify::clock', this._updateClock.bind(this)); + + this._updateClock(); + } + + _updateClock() { + this._time.text = this._wallClock.clock; + + let date = new Date(); + /* Translators: This is a time format for a date in + long format */ + let dateFormat = Shell.util_translate_time_string(N_("%A, %B %d")); + this._date.text = date.toLocaleFormat(dateFormat); + } + + destroy() { + this.actor.destroy(); + this._wallClock.run_dispose(); + } +}; + +var NotificationsBox = class { + constructor() { + this.actor = new St.BoxLayout({ vertical: true, + name: 'screenShieldNotifications', + style_class: 'screen-shield-notifications-container' }); + + this._scrollView = new St.ScrollView({ x_fill: false, x_align: St.Align.START, + hscrollbar_policy: St.PolicyType.NEVER }); + this._notificationBox = new St.BoxLayout({ vertical: true, + style_class: 'screen-shield-notifications-container' }); + this._scrollView.add_actor(this._notificationBox); + + this.actor.add(this._scrollView, { x_fill: true, x_align: St.Align.START }); + + this._sources = new Map(); + Main.messageTray.getSources().forEach(source => { + this._sourceAdded(Main.messageTray, source, true); + }); + this._updateVisibility(); + + this._sourceAddedId = Main.messageTray.connect('source-added', this._sourceAdded.bind(this)); + } + + destroy() { + if (this._sourceAddedId) { + Main.messageTray.disconnect(this._sourceAddedId); + this._sourceAddedId = 0; + } + + let items = this._sources.entries(); + for (let [source, obj] of items) { + this._removeSource(source, obj); + } + + this.actor.destroy(); + } + + _updateVisibility() { + this._notificationBox.visible = + this._notificationBox.get_children().some(a => a.visible); + + this.actor.visible = this._notificationBox.visible; + } + + _makeNotificationCountText(count, isChat) { + if (isChat) + return ngettext("%d new message", "%d new messages", count).format(count); + else + return ngettext("%d new notification", "%d new notifications", count).format(count); + } + + _makeNotificationSource(source, box) { + let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE); + box.add(sourceActor, { y_fill: true }); + + let textBox = new St.BoxLayout({ vertical: true }); + box.add(textBox, { y_fill: false, y_align: St.Align.START }); + + let title = new St.Label({ text: source.title, + style_class: 'screen-shield-notification-label' }); + textBox.add(title); + + let count = source.unseenCount; + let countLabel = new St.Label({ text: this._makeNotificationCountText(count, source.isChat), + style_class: 'screen-shield-notification-count-text' }); + textBox.add(countLabel); + + box.visible = count != 0; + return [title, countLabel]; + } + + _makeNotificationDetailedSource(source, box) { + let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE); + let sourceBin = new St.Bin({ y_align: St.Align.START, + x_align: St.Align.START, + child: sourceActor }); + box.add(sourceBin); + + let textBox = new St.BoxLayout({ vertical: true }); + box.add(textBox, { y_fill: false, y_align: St.Align.START }); + + let title = new St.Label({ text: source.title, + style_class: 'screen-shield-notification-label' }); + textBox.add(title); + + let visible = false; + for (let i = 0; i < source.notifications.length; i++) { + let n = source.notifications[i]; + + if (n.acknowledged) + continue; + + let body = ''; + if (n.bannerBodyText) { + body = n.bannerBodyMarkup ? n.bannerBodyText + : GLib.markup_escape_text(n.bannerBodyText, -1); + } + + let label = new St.Label({ style_class: 'screen-shield-notification-count-text' }); + label.clutter_text.set_markup('' + n.title + ' ' + body); + textBox.add(label); + + visible = true; + } + + box.visible = visible; + return [title, null]; + } + + _shouldShowDetails(source) { + return source.policy.detailsInLockScreen || + source.narrowestPrivacyScope == MessageTray.PrivacyScope.SYSTEM; + } + + _showSource(source, obj, box) { + if (obj.detailed) { + [obj.titleLabel, obj.countLabel] = this._makeNotificationDetailedSource(source, box); + } else { + [obj.titleLabel, obj.countLabel] = this._makeNotificationSource(source, box); + } + + box.visible = obj.visible && (source.unseenCount > 0); + } + + _sourceAdded(tray, source, initial) { + let obj = { + visible: source.policy.showInLockScreen, + detailed: this._shouldShowDetails(source), + sourceDestroyId: 0, + sourceCountChangedId: 0, + sourceTitleChangedId: 0, + sourceUpdatedId: 0, + sourceBox: null, + titleLabel: null, + countLabel: null, + }; + + obj.sourceBox = new St.BoxLayout({ style_class: 'screen-shield-notification-source', + x_expand: true }); + this._showSource(source, obj, obj.sourceBox); + this._notificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.START }); + + obj.sourceCountChangedId = source.connect('count-updated', source => { + this._countChanged(source, obj); + }); + obj.sourceTitleChangedId = source.connect('title-changed', source => { + this._titleChanged(source, obj); + }); + obj.policyChangedId = source.policy.connect('policy-changed', (policy, key) => { + if (key == 'show-in-lock-screen') + this._visibleChanged(source, obj); + else + this._detailedChanged(source, obj); + }); + obj.sourceDestroyId = source.connect('destroy', source => { + this._onSourceDestroy(source, obj); + }); + + this._sources.set(source, obj); + + if (!initial) { + // block scrollbars while animating, if they're not needed now + let boxHeight = this._notificationBox.height; + if (this._scrollView.height >= boxHeight) + this._scrollView.vscrollbar_policy = St.PolicyType.NEVER; + + let widget = obj.sourceBox; + let [, natHeight] = widget.get_preferred_height(-1); + widget.height = 0; + Tweener.addTween(widget, + { height: natHeight, + transition: 'easeOutQuad', + time: 0.25, + onComplete() { + this._scrollView.vscrollbar_policy = St.PolicyType.AUTOMATIC; + widget.set_height(-1); + }, + onCompleteScope: this + }); + + this._updateVisibility(); + if (obj.sourceBox.visible) + this.emit('wake-up-screen'); + } + } + + _titleChanged(source, obj) { + obj.titleLabel.text = source.title; + } + + _countChanged(source, obj) { + // A change in the number of notifications may change whether we show + // details. + let newDetailed = this._shouldShowDetails(source); + let oldDetailed = obj.detailed; + + obj.detailed = newDetailed; + + if (obj.detailed || oldDetailed != newDetailed) { + // A new notification was pushed, or a previous notification was destroyed. + // Give up, and build the list again. + + obj.sourceBox.destroy_all_children(); + obj.titleLabel = obj.countLabel = null; + this._showSource(source, obj, obj.sourceBox); + } else { + let count = source.unseenCount; + obj.countLabel.text = this._makeNotificationCountText(count, source.isChat); + } + + obj.sourceBox.visible = obj.visible && (source.unseenCount > 0); + + this._updateVisibility(); + if (obj.sourceBox.visible) + this.emit('wake-up-screen'); + } + + _visibleChanged(source, obj) { + if (obj.visible == source.policy.showInLockScreen) + return; + + obj.visible = source.policy.showInLockScreen; + obj.sourceBox.visible = obj.visible && source.unseenCount > 0; + + this._updateVisibility(); + if (obj.sourceBox.visible) + this.emit('wake-up-screen'); + } + + _detailedChanged(source, obj) { + let newDetailed = this._shouldShowDetails(source); + if (obj.detailed == newDetailed) + return; + + obj.detailed = newDetailed; + + obj.sourceBox.destroy_all_children(); + obj.titleLabel = obj.countLabel = null; + this._showSource(source, obj, obj.sourceBox); + } + + _onSourceDestroy(source, obj) { + this._removeSource(source, obj); + this._updateVisibility(); + } + + _removeSource(source, obj) { + obj.sourceBox.destroy(); + obj.sourceBox = obj.titleLabel = obj.countLabel = null; + + source.disconnect(obj.sourceDestroyId); + source.disconnect(obj.sourceCountChangedId); + source.disconnect(obj.sourceTitleChangedId); + source.policy.disconnect(obj.policyChangedId); + + this._sources.delete(source); + } +}; +Signals.addSignalMethods(NotificationsBox.prototype); + +var Arrow = GObject.registerClass( +class ScreenShieldArrow extends St.Bin { + _init(params) { + super._init(params); + this.x_fill = this.y_fill = true; + + this._drawingArea = new St.DrawingArea(); + this._drawingArea.connect('repaint', this._drawArrow.bind(this)); + this.child = this._drawingArea; + + this._shadowHelper = null; + this._shadowWidth = this._shadowHeight = 0; + } + + _drawArrow(arrow) { + let cr = arrow.get_context(); + let [w, h] = arrow.get_surface_size(); + let node = this.get_theme_node(); + let thickness = node.get_length('-arrow-thickness'); + + Clutter.cairo_set_source_color(cr, node.get_foreground_color()); + + cr.setLineCap(Cairo.LineCap.ROUND); + cr.setLineWidth(thickness); + + cr.moveTo(thickness / 2, h - thickness / 2); + cr.lineTo(w/2, thickness); + cr.lineTo(w - thickness / 2, h - thickness / 2); + cr.stroke(); + cr.$dispose(); + } + + vfunc_get_paint_volume(volume) { + if (!super.vfunc_get_paint_volume(volume)) + return false; + + if (!this._shadow) + return true; + + let shadow_box = new Clutter.ActorBox(); + this._shadow.get_box(this._drawingArea.get_allocation_box(), shadow_box); + + volume.set_width(Math.max(shadow_box.x2 - shadow_box.x1, volume.get_width())); + volume.set_height(Math.max(shadow_box.y2 - shadow_box.y1, volume.get_height())); + + return true; + } + + vfunc_style_changed() { + let node = this.get_theme_node(); + this._shadow = node.get_shadow('-arrow-shadow'); + if (this._shadow) + this._shadowHelper = St.ShadowHelper.new(this._shadow); + else + this._shadowHelper = null; + + super.vfunc_style_changed(); + } + + vfunc_paint() { + if (this._shadowHelper) { + this._shadowHelper.update(this._drawingArea); + + let allocation = this._drawingArea.get_allocation_box(); + let paintOpacity = this._drawingArea.get_paint_opacity(); + let framebuffer = Cogl.get_draw_framebuffer(); + + this._shadowHelper.paint(framebuffer, allocation, paintOpacity); + } + + this._drawingArea.paint(); + } +}); + +function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} + +/** + * If you are setting org.gnome.desktop.session.idle-delay directly in dconf, + * rather than through System Settings, you also need to set + * org.gnome.settings-daemon.plugins.power.sleep-display-ac and + * org.gnome.settings-daemon.plugins.power.sleep-display-battery to the same value. + * This will ensure that the screen blanks at the right time when it fades out. + * https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependency. + */ +var ScreenShield = class { + constructor() { + this.actor = Main.layoutManager.screenShieldGroup; + + this._lockScreenState = MessageTray.State.HIDDEN; + this._lockScreenGroup = new St.Widget({ x_expand: true, + y_expand: true, + reactive: true, + can_focus: true, + name: 'lockScreenGroup', + visible: false, + }); + this._lockScreenGroup.connect('key-press-event', + this._onLockScreenKeyPress.bind(this)); + this._lockScreenGroup.connect('scroll-event', + this._onLockScreenScroll.bind(this)); + Main.ctrlAltTabManager.addGroup(this._lockScreenGroup, _("Lock"), 'changes-prevent-symbolic'); + + this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(), + name: 'lockScreenContents' }); + this._lockScreenContents.add_constraint(new Layout.MonitorConstraint({ primary: true })); + + this._lockScreenGroup.add_actor(this._lockScreenContents); + + this._backgroundGroup = new Clutter.Actor(); + + this._lockScreenGroup.add_actor(this._backgroundGroup); + this._backgroundGroup.lower_bottom(); + this._bgManagers = []; + + this._updateBackgrounds(); + Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this)); + + this._arrowAnimationId = 0; + this._arrowWatchId = 0; + this._arrowActiveWatchId = 0; + this._arrowContainer = new St.BoxLayout({ style_class: 'screen-shield-arrows', + vertical: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END, + // HACK: without these, ClutterBinLayout + // ignores alignment properties on the actor + x_expand: true, + y_expand: true }); + + for (let i = 0; i < N_ARROWS; i++) { + let arrow = new Arrow({ opacity: 0 }); + this._arrowContainer.add_actor(arrow); + } + this._lockScreenContents.add_actor(this._arrowContainer); + + this._dragAction = new Clutter.GestureAction(); + this._dragAction.connect('gesture-begin', this._onDragBegin.bind(this)); + this._dragAction.connect('gesture-progress', this._onDragMotion.bind(this)); + this._dragAction.connect('gesture-end', this._onDragEnd.bind(this)); + this._lockScreenGroup.add_action(this._dragAction); + + this._lockDialogGroup = new St.Widget({ x_expand: true, + y_expand: true, + reactive: true, + pivot_point: new Clutter.Point({ x: 0.5, y: 0.5 }), + name: 'lockDialogGroup' }); + + this.actor.add_actor(this._lockDialogGroup); + this.actor.add_actor(this._lockScreenGroup); + + this._presence = new GnomeSession.Presence((proxy, error) => { + if (error) { + logError(error, 'Error while reading gnome-session presence'); + return; + } + + this._onStatusChanged(proxy.status); + }); + this._presence.connectSignal('StatusChanged', (proxy, senderName, [status]) => { + this._onStatusChanged(status); + }); + + this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this); + + this._smartcardManager = SmartcardManager.getSmartcardManager(); + this._smartcardManager.connect('smartcard-inserted', + (manager, token) => { + if (this._isLocked && token.UsedToLogin) + this._liftShield(true, 0); + }); + + this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); + this._oVirtCredentialsManager.connect('user-authenticated', + () => { + if (this._isLocked) + this._liftShield(true, 0); + }); + + this._loginManager = LoginManager.getLoginManager(); + this._loginManager.connect('prepare-for-sleep', + this._prepareForSleep.bind(this)); + + this._loginSession = null; + this._loginManager.getCurrentSessionProxy(sessionProxy => { + this._loginSession = sessionProxy; + this._loginSession.connectSignal('Lock', + () => { this.lock(false); }); + this._loginSession.connectSignal('Unlock', + () => { this.deactivate(false); }); + this._loginSession.connect('g-properties-changed', this._syncInhibitor.bind(this)); + this._syncInhibitor(); + }); + + this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA }); + this._settings.connect('changed::' + LOCK_ENABLED_KEY, this._syncInhibitor.bind(this)); + + this._lockSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); + this._lockSettings.connect('changed::' + DISABLE_LOCK_KEY, this._syncInhibitor.bind(this)); + + this._isModal = false; + this._hasLockScreen = false; + this._isGreeter = false; + this._isActive = false; + this._isLocked = false; + this._inUnlockAnimation = false; + this._activationTime = 0; + this._becameActiveId = 0; + this._lockTimeoutId = 0; + + // The "long" lightbox is used for the longer (20 seconds) fade from session + // to idle status, the "short" is used for quickly fading to black when locking + // manually + this._longLightbox = new Lightbox.Lightbox(Main.uiGroup, + { inhibitEvents: true, + fadeFactor: 1 }); + this._longLightbox.connect('shown', this._onLongLightboxShown.bind(this)); + this._shortLightbox = new Lightbox.Lightbox(Main.uiGroup, + { inhibitEvents: true, + fadeFactor: 1 }); + this._shortLightbox.connect('shown', this._onShortLightboxShown.bind(this)); + + this.idleMonitor = Meta.IdleMonitor.get_core(); + this._cursorTracker = Meta.CursorTracker.get_for_display(global.display); + + this._syncInhibitor(); + } + + _setActive(active) { + let prevIsActive = this._isActive; + this._isActive = active; + + if (prevIsActive != this._isActive) + this.emit('active-changed'); + + if (this._loginSession) + this._loginSession.SetLockedHintRemote(active); + + this._syncInhibitor(); + } + + _createBackground(monitorIndex) { + let monitor = Main.layoutManager.monitors[monitorIndex]; + let widget = new St.Widget({ style_class: 'screen-shield-background', + x: monitor.x, + y: monitor.y, + width: monitor.width, + height: monitor.height }); + + let bgManager = new Background.BackgroundManager({ container: widget, + monitorIndex: monitorIndex, + controlPosition: false, + settingsSchema: SCREENSAVER_SCHEMA }); + + this._bgManagers.push(bgManager); + + this._backgroundGroup.add_child(widget); + } + + _updateBackgrounds() { + for (let i = 0; i < this._bgManagers.length; i++) + this._bgManagers[i].destroy(); + + this._bgManagers = []; + this._backgroundGroup.destroy_all_children(); + + for (let i = 0; i < Main.layoutManager.monitors.length; i++) + this._createBackground(i); + } + + _liftShield(onPrimary, velocity) { + if (this._isLocked) { + if (this._ensureUnlockDialog(onPrimary, true /* allowCancel */)) + this._hideLockScreen(true /* animate */, velocity); + } else { + this.deactivate(true /* animate */); + } + } + + _maybeCancelDialog() { + if (!this._dialog) + return; + + this._dialog.cancel(); + if (this._isGreeter) { + // LoginDialog.cancel() will grab the key focus + // on its own, so ensure it stays on lock screen + // instead + this._lockScreenGroup.grab_key_focus(); + } else { + this._dialog = null; + } + } + + _becomeModal() { + if (this._isModal) + return true; + + this._isModal = Main.pushModal(this.actor, { actionMode: Shell.ActionMode.LOCK_SCREEN }); + if (this._isModal) + return true; + + // We failed to get a pointer grab, it means that + // something else has it. Try with a keyboard grab only + this._isModal = Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED, + actionMode: Shell.ActionMode.LOCK_SCREEN }); + return this._isModal; + } + + _onLockScreenKeyPress(actor, event) { + let symbol = event.get_key_symbol(); + let unichar = event.get_key_unicode(); + + // Do nothing if the lock screen is not fully shown. + // This avoids reusing the previous (and stale) unlock + // dialog if esc is pressed while the curtain is going + // down after cancel. + + if (this._lockScreenState != MessageTray.State.SHOWN) + return Clutter.EVENT_PROPAGATE; + + let isEnter = (symbol == Clutter.KEY_Return || + symbol == Clutter.KEY_KP_Enter || + symbol == Clutter.KEY_ISO_Enter); + let isEscape = (symbol == Clutter.KEY_Escape); + let isLiftChar = (GLib.unichar_isprint(unichar) && + (this._isLocked || !GLib.unichar_isgraph(unichar))); + if (!isEnter && !isEscape && !isLiftChar) + return Clutter.EVENT_PROPAGATE; + + if (this._isLocked && + this._ensureUnlockDialog(true, true) && + GLib.unichar_isgraph(unichar)) + this._dialog.addCharacter(unichar); + + this._liftShield(true, 0); + return Clutter.EVENT_STOP; + } + + _onLockScreenScroll(actor, event) { + if (this._lockScreenState != MessageTray.State.SHOWN) + return Clutter.EVENT_PROPAGATE; + + let delta = 0; + if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH) + delta = Math.abs(event.get_scroll_delta()[0]); + else + delta = 5; + + this._lockScreenScrollCounter += delta; + + // 7 standard scrolls to lift up + if (this._lockScreenScrollCounter > 35) { + this._liftShield(true, 0); + } + + return Clutter.EVENT_STOP; + } + + _syncInhibitor() { + let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY); + let lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY); + let inhibit = (this._loginSession && this._loginSession.Active && + !this._isActive && lockEnabled && !lockLocked); + if (inhibit) { + this._loginManager.inhibit(_("GNOME needs to lock the screen"), + inhibitor => { + if (this._inhibitor) + this._inhibitor.close(null); + this._inhibitor = inhibitor; + }); + } else { + if (this._inhibitor) + this._inhibitor.close(null); + this._inhibitor = null; + } + } + + _prepareForSleep(loginManager, aboutToSuspend) { + if (aboutToSuspend) { + if (this._settings.get_boolean(LOCK_ENABLED_KEY)) + this.lock(true); + } else { + this._wakeUpScreen(); + } + } + + _animateArrows() { + let arrows = this._arrowContainer.get_children(); + let unitaryDelay = ARROW_ANIMATION_TIME / (arrows.length + 1); + let maxOpacity = 255 * ARROW_ANIMATION_PEAK_OPACITY; + for (let i = 0; i < arrows.length; i++) { + arrows[i].opacity = 0; + Tweener.addTween(arrows[i], + { opacity: 0, + delay: unitaryDelay * (N_ARROWS - (i + 1)), + time: ARROW_ANIMATION_TIME, + transition(t, b, c, d) { + if (t < d/2) + return TweenerEquations.easeOutQuad(t, 0, maxOpacity, d/2); + else + return TweenerEquations.easeInQuad(t - d/2, maxOpacity, -maxOpacity, d/2); + } + }); + } + + return GLib.SOURCE_CONTINUE; + } + + _onDragBegin() { + Tweener.removeTweens(this._lockScreenGroup); + this._lockScreenState = MessageTray.State.HIDING; + + if (this._isLocked) + this._ensureUnlockDialog(false, false); + + return true; + } + + _onDragMotion() { + let [origX, origY] = this._dragAction.get_press_coords(0); + let [currentX, currentY] = this._dragAction.get_motion_coords(0); + + let newY = currentY - origY; + newY = clamp(newY, -global.stage.height, 0); + + this._lockScreenGroup.y = newY; + + return true; + } + + _onDragEnd(action, actor, eventX, eventY, modifiers) { + if (this._lockScreenState != MessageTray.State.HIDING) + return; + if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) { + // Complete motion automatically + let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0); + this._liftShield(true, -velocityY); + } else { + // restore the lock screen to its original place + // try to use the same speed as the normal animation + let h = global.stage.height; + let time = MANUAL_FADE_TIME * (-this._lockScreenGroup.y) / h; + Tweener.removeTweens(this._lockScreenGroup); + Tweener.addTween(this._lockScreenGroup, + { y: 0, + time: time, + transition: 'easeInQuad', + onComplete() { + this._lockScreenGroup.fixed_position_set = false; + this._lockScreenState = MessageTray.State.SHOWN; + }, + onCompleteScope: this, + }); + + this._maybeCancelDialog(); + } + } + + _onStatusChanged(status) { + if (status != GnomeSession.PresenceStatus.IDLE) + return; + + this._maybeCancelDialog(); + + if (this._longLightbox.actor.visible) { + // We're in the process of showing. + return; + } + + if (!this._becomeModal()) { + // We could not become modal, so we can't activate the + // screenshield. The user is probably very upset at this + // point, but any application using global grabs is broken + // Just tell him to stop using this app + // + // XXX: another option is to kick the user into the gdm login + // screen, where we're not affected by grabs + Main.notifyError(_("Unable to lock"), + _("Lock was blocked by an application")); + return; + } + + if (this._activationTime == 0) + this._activationTime = GLib.get_monotonic_time(); + + let shouldLock = this._settings.get_boolean(LOCK_ENABLED_KEY) && !this._isLocked; + + if (shouldLock) { + let lockTimeout = Math.max(STANDARD_FADE_TIME, this._settings.get_uint(LOCK_DELAY_KEY)); + this._lockTimeoutId = Mainloop.timeout_add(lockTimeout * 1000, + () => { + this._lockTimeoutId = 0; + this.lock(false); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._lockTimeoutId, '[gnome-shell] this.lock'); + } + + this._activateFade(this._longLightbox, STANDARD_FADE_TIME); + } + + _activateFade(lightbox, time) { + Main.uiGroup.set_child_above_sibling(lightbox.actor, null); + lightbox.show(time); + + if (this._becameActiveId == 0) + this._becameActiveId = this.idleMonitor.add_user_active_watch(this._onUserBecameActive.bind(this)); + } + + _onUserBecameActive() { + // This function gets called here when the user becomes active + // after we activated a lightbox + // There are two possibilities here: + // - we're called when already locked/active; isLocked or isActive is true, + // we just go back to the lock screen curtain + // (isActive == isLocked == true: normal case + // isActive == false, isLocked == true: during the fade for manual locking + // isActive == true, isLocked == false: after session idle, before lock-delay) + // - we're called because the session is IDLE but before the lightbox + // is fully shown; at this point isActive is false, so we just hide + // the lightbox, reset the activationTime and go back to the unlocked + // desktop + // using deactivate() is a little of overkill, but it ensures we + // don't forget of some bit like modal, DBus properties or idle watches + // + // Note: if the (long) lightbox is shown then we're necessarily + // active, because we call activate() without animation. + + this.idleMonitor.remove_watch(this._becameActiveId); + this._becameActiveId = 0; + + if (this._isActive || this._isLocked) { + this._longLightbox.hide(); + this._shortLightbox.hide(); + } else { + this.deactivate(false); + } + } + + _onLongLightboxShown() { + this.activate(false); + } + + _onShortLightboxShown() { + this._completeLockScreenShown(); + } + + showDialog() { + if (!this._becomeModal()) { + // In the login screen, this is a hard error. Fail-whale + log('Could not acquire modal grab for the login screen. Aborting login process.'); + Meta.quit(Meta.ExitCode.ERROR); + } + + this.actor.show(); + this._isGreeter = Main.sessionMode.isGreeter; + this._isLocked = true; + if (this._ensureUnlockDialog(true, true)) + this._hideLockScreen(false, 0); + } + + _hideLockScreenComplete() { + if (Main.sessionMode.currentMode == 'lock-screen') + Main.sessionMode.popMode('lock-screen'); + + this._lockScreenState = MessageTray.State.HIDDEN; + this._lockScreenGroup.hide(); + + if (this._dialog) { + this._dialog.actor.grab_key_focus(); + this._dialog.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + } + + _hideLockScreen(animate, velocity) { + if (this._lockScreenState == MessageTray.State.HIDDEN) + return; + + this._lockScreenState = MessageTray.State.HIDING; + + Tweener.removeTweens(this._lockScreenGroup); + + if (animate) { + // Tween the lock screen out of screen + // if velocity is not specified (i.e. we come here from pressing ESC), + // use the same speed regardless of original position + // if velocity is specified, it's in pixels per milliseconds + let h = global.stage.height; + let delta = (h + this._lockScreenGroup.y); + let min_velocity = global.stage.height / (CURTAIN_SLIDE_TIME * 1000); + + velocity = Math.max(min_velocity, velocity); + let time = (delta / velocity) / 1000; + + Tweener.addTween(this._lockScreenGroup, + { y: -h, + time: time, + transition: 'easeInQuad', + onComplete: this._hideLockScreenComplete.bind(this), + }); + } else { + this._hideLockScreenComplete(); + } + + this._cursorTracker.set_pointer_visible(true); + } + + _ensureUnlockDialog(onPrimary, allowCancel) { + if (!this._dialog) { + let constructor = Main.sessionMode.unlockDialog; + if (!constructor) { + // This session mode has no locking capabilities + this.deactivate(true); + return false; + } + + this._dialog = new constructor(this._lockDialogGroup); + + + let time = global.get_current_time(); + if (!this._dialog.open(time, onPrimary)) { + // This is kind of an impossible error: we're already modal + // by the time we reach this... + log('Could not open login dialog: failed to acquire grab'); + this.deactivate(true); + return false; + } + + this._dialog.connect('failed', this._onUnlockFailed.bind(this)); + } + + this._dialog.allowCancel = allowCancel; + return true; + } + + _onUnlockFailed() { + this._resetLockScreen({ animateLockScreen: true, + fadeToBlack: false }); + } + + _resetLockScreen(params) { + // Don't reset the lock screen unless it is completely hidden + // This prevents the shield going down if the lock-delay timeout + // fires while the user is dragging (which has the potential + // to confuse our state) + if (this._lockScreenState != MessageTray.State.HIDDEN) + return; + + this._ensureLockScreen(); + this._lockDialogGroup.scale_x = 1; + this._lockDialogGroup.scale_y = 1; + + this._lockScreenGroup.show(); + this._lockScreenState = MessageTray.State.SHOWING; + + let fadeToBlack = params.fadeToBlack; + + if (params.animateLockScreen) { + this._lockScreenGroup.y = -global.screen_height; + Tweener.removeTweens(this._lockScreenGroup); + Tweener.addTween(this._lockScreenGroup, + { y: 0, + time: MANUAL_FADE_TIME, + transition: 'easeOutQuad', + onComplete() { + this._lockScreenShown({ fadeToBlack: fadeToBlack, + animateFade: true }); + }, + onCompleteScope: this + }); + } else { + this._lockScreenGroup.fixed_position_set = false; + this._lockScreenShown({ fadeToBlack: fadeToBlack, + animateFade: false }); + } + + this._lockScreenGroup.grab_key_focus(); + + if (Main.sessionMode.currentMode != 'lock-screen') + Main.sessionMode.pushMode('lock-screen'); + } + + _startArrowAnimation() { + this._arrowActiveWatchId = 0; + + if (!this._arrowAnimationId) { + this._arrowAnimationId = Mainloop.timeout_add(6000, this._animateArrows.bind(this)); + GLib.Source.set_name_by_id(this._arrowAnimationId, '[gnome-shell] this._animateArrows'); + this._animateArrows(); + } + + if (!this._arrowWatchId) + this._arrowWatchId = this.idleMonitor.add_idle_watch(ARROW_IDLE_TIME, + this._pauseArrowAnimation.bind(this)); + } + + _pauseArrowAnimation() { + if (this._arrowAnimationId) { + Mainloop.source_remove(this._arrowAnimationId); + this._arrowAnimationId = 0; + } + + if (!this._arrowActiveWatchId) + this._arrowActiveWatchId = this.idleMonitor.add_user_active_watch(this._startArrowAnimation.bind(this)); + } + + _stopArrowAnimation() { + if (this._arrowAnimationId) { + Mainloop.source_remove(this._arrowAnimationId); + this._arrowAnimationId = 0; + } + if (this._arrowActiveWatchId) { + this.idleMonitor.remove_watch(this._arrowActiveWatchId); + this._arrowActiveWatchId = 0; + } + if (this._arrowWatchId) { + this.idleMonitor.remove_watch(this._arrowWatchId); + this._arrowWatchId = 0; + } + } + + _checkArrowAnimation() { + let idleTime = this.idleMonitor.get_idletime(); + + if (idleTime < ARROW_IDLE_TIME) + this._startArrowAnimation(); + else + this._pauseArrowAnimation(); + } + + _lockScreenShown(params) { + if (this._dialog && !this._isGreeter) { + this._dialog.destroy(); + this._dialog = null; + } + + this._checkArrowAnimation(); + + let motionId = global.stage.connect('captured-event', (stage, event) => { + if (event.type() == Clutter.EventType.MOTION) { + this._cursorTracker.set_pointer_visible(true); + global.stage.disconnect(motionId); + } + + return Clutter.EVENT_PROPAGATE; + }); + this._cursorTracker.set_pointer_visible(false); + + this._lockScreenState = MessageTray.State.SHOWN; + this._lockScreenGroup.fixed_position_set = false; + this._lockScreenScrollCounter = 0; + + if (params.fadeToBlack && params.animateFade) { + // Take a beat + + let id = Mainloop.timeout_add(1000 * MANUAL_FADE_TIME, () => { + this._activateFade(this._shortLightbox, MANUAL_FADE_TIME); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] this._activateFade'); + } else { + if (params.fadeToBlack) + this._activateFade(this._shortLightbox, 0); + + this._completeLockScreenShown(); + } + } + + _completeLockScreenShown() { + this._setActive(true); + this.emit('lock-screen-shown'); + } + + // Some of the actors in the lock screen are heavy in + // resources, so we only create them when needed + _ensureLockScreen() { + if (this._hasLockScreen) + return; + + this._lockScreenContentsBox = new St.BoxLayout({ x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true, + y_expand: true, + vertical: true, + style_class: 'screen-shield-contents-box' }); + this._clock = new Clock(); + this._lockScreenContentsBox.add(this._clock.actor, { x_fill: true, + y_fill: true }); + + this._lockScreenContents.add_actor(this._lockScreenContentsBox); + + this._notificationsBox = new NotificationsBox(); + this._wakeUpScreenId = this._notificationsBox.connect('wake-up-screen', this._wakeUpScreen.bind(this)); + this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true, + y_fill: true, + expand: true }); + + this._hasLockScreen = true; + } + + _wakeUpScreen() { + this._onUserBecameActive(); + this.emit('wake-up-screen'); + } + + _clearLockScreen() { + this._clock.destroy(); + this._clock = null; + + if (this._notificationsBox) { + this._notificationsBox.disconnect(this._wakeUpScreenId); + this._notificationsBox.destroy(); + this._notificationsBox = null; + } + + this._stopArrowAnimation(); + + this._lockScreenContentsBox.destroy(); + + this._hasLockScreen = false; + } + + get locked() { + return this._isLocked; + } + + get active() { + return this._isActive; + } + + get activationTime() { + return this._activationTime; + } + + deactivate(animate) { + if (this._dialog) + this._dialog.finish(() => { this._continueDeactivate(animate); }); + else + this._continueDeactivate(animate); + } + + _continueDeactivate(animate) { + this._hideLockScreen(animate, 0); + + if (this._hasLockScreen) + this._clearLockScreen(); + + if (Main.sessionMode.currentMode == 'lock-screen') + Main.sessionMode.popMode('lock-screen'); + if (Main.sessionMode.currentMode == 'unlock-dialog') + Main.sessionMode.popMode('unlock-dialog'); + + if (this._isGreeter) { + // We don't want to "deactivate" any more than + // this. In particular, we don't want to drop + // the modal, hide ourselves or destroy the dialog + // But we do want to set isActive to false, so that + // gnome-session will reset the idle counter, and + // gnome-settings-daemon will stop blanking the screen + + this._activationTime = 0; + this._setActive(false); + return; + } + + if (this._dialog && !this._isGreeter) + this._dialog.popModal(); + + if (this._isModal) { + Main.popModal(this.actor); + this._isModal = false; + } + + Tweener.addTween(this._lockDialogGroup, { + scale_x: 0, + scale_y: 0, + time: animate ? Overview.ANIMATION_TIME : 0, + transition: 'easeOutQuad', + onComplete: this._completeDeactivate.bind(this), + onCompleteScope: this + }); + } + + _completeDeactivate() { + if (this._dialog) { + this._dialog.destroy(); + this._dialog = null; + } + + this._longLightbox.hide(); + this._shortLightbox.hide(); + this.actor.hide(); + + if (this._becameActiveId != 0) { + this.idleMonitor.remove_watch(this._becameActiveId); + this._becameActiveId = 0; + } + + if (this._lockTimeoutId != 0) { + Mainloop.source_remove(this._lockTimeoutId); + this._lockTimeoutId = 0; + } + + this._activationTime = 0; + this._setActive(false); + this._isLocked = false; + this.emit('locked-changed'); + global.set_runtime_state(LOCKED_STATE_STR, null); + } + + activate(animate) { + if (this._activationTime == 0) + this._activationTime = GLib.get_monotonic_time(); + + this.actor.show(); + + if (Main.sessionMode.currentMode != 'unlock-dialog' && + Main.sessionMode.currentMode != 'lock-screen') { + this._isGreeter = Main.sessionMode.isGreeter; + if (!this._isGreeter) + Main.sessionMode.pushMode('unlock-dialog'); + } + + this._resetLockScreen({ animateLockScreen: animate, + fadeToBlack: 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 + // there is a 0.3 seconds window during which the lock + // screen is effectively visible and the screen is locked, but + // the DBus interface reports the screensaver is off. + // This is because when we emit ActiveChanged(true), + // gnome-settings-daemon blanks the screen, and we don't want + // blank during the animation. + // This is not a problem for the idle fade case, because we + // activate without animation in that case. + } + + lock(animate) { + if (this._lockSettings.get_boolean(DISABLE_LOCK_KEY)) { + log('Screen lock is locked down, not locking') // lock, lock - who's there? + return; + } + + // Warn the user if we can't become modal + if (!this._becomeModal()) { + Main.notifyError(_("Unable to lock"), + _("Lock was blocked by an application")); + return; + } + + // Clear the clipboard - otherwise, its contents may be leaked + // to unauthorized parties by pasting into the unlock dialog's + // password entry and unmasking the entry + St.Clipboard.get_default().set_text(St.ClipboardType.CLIPBOARD, ''); + St.Clipboard.get_default().set_text(St.ClipboardType.PRIMARY, ''); + + let userManager = AccountsService.UserManager.get_default(); + let user = userManager.get_user(GLib.get_user_name()); + + if (this._isGreeter) + this._isLocked = true; + else + this._isLocked = user.password_mode != AccountsService.UserPasswordMode.NONE; + + this.activate(animate); + + this.emit('locked-changed'); + } + + // If the previous shell crashed, and gnome-session restarted us, then re-lock + lockIfWasLocked() { + if (!this._settings.get_boolean(LOCK_ENABLED_KEY)) + return; + let wasLocked = global.get_runtime_state('b', LOCKED_STATE_STR); + if (wasLocked === null) + return; + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this.lock(false); + }); + } +}; +Signals.addSignalMethods(ScreenShield.prototype); diff --git a/js/ui/screencast.js b/js/ui/screencast.js new file mode 100644 index 0000000..0b0b14a --- /dev/null +++ b/js/ui/screencast.js @@ -0,0 +1,146 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib, Shell } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast'); + +var ScreencastService = class { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreencastIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screencast'); + + Gio.DBus.session.own_name('org.gnome.Shell.Screencast', Gio.BusNameOwnerFlags.REPLACE, null, null); + + this._recorders = new Map(); + + this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' }); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + } + + get isRecording() { + return this._recorders.size > 0; + } + + _ensureRecorderForSender(sender) { + let recorder = this._recorders.get(sender); + if (!recorder) { + recorder = new Shell.Recorder({ stage: global.stage, + display: global.display }); + recorder._watchNameId = + Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, + this._onNameVanished.bind(this)); + this._recorders.set(sender, recorder); + this.emit('updated'); + } + return recorder; + } + + _sessionUpdated() { + if (Main.sessionMode.allowScreencast) + return; + + for (let sender of this._recorders.keys()) + this._stopRecordingForSender(sender); + } + + _onNameVanished(connection, name) { + this._stopRecordingForSender(name); + } + + _stopRecordingForSender(sender) { + let recorder = this._recorders.get(sender); + if (!recorder) + return false; + + Gio.bus_unwatch_name(recorder._watchNameId); + recorder.close(); + this._recorders.delete(sender); + this.emit('updated'); + + return true; + } + + _applyOptionalParameters(recorder, options) { + for (let option in options) + options[option] = options[option].deep_unpack(); + + if (options['pipeline']) + recorder.set_pipeline(options['pipeline']); + if (options['framerate']) + recorder.set_framerate(options['framerate']); + if ('draw-cursor' in options) + recorder.set_draw_cursor(options['draw-cursor']); + } + + ScreencastAsync(params, invocation) { + let returnValue = [false, '']; + if (!Main.sessionMode.allowScreencast || + this._lockdownSettings.get_boolean('disable-save-to-disk')) { + invocation.return_value(GLib.Variant.new('(bs)', returnValue)); + return; + } + + let sender = invocation.get_sender(); + let recorder = this._ensureRecorderForSender(sender); + if (!recorder.is_recording()) { + let [fileTemplate, options] = params; + + recorder.set_file_template(fileTemplate); + this._applyOptionalParameters(recorder, options); + let [success, fileName] = recorder.record(); + returnValue = [success, fileName ? fileName : '']; + if (!success) + this._stopRecordingForSender(sender); + } + + invocation.return_value(GLib.Variant.new('(bs)', returnValue)); + } + + ScreencastAreaAsync(params, invocation) { + let returnValue = [false, '']; + if (!Main.sessionMode.allowScreencast || + this._lockdownSettings.get_boolean('disable-save-to-disk')) { + invocation.return_value(GLib.Variant.new('(bs)', returnValue)); + return; + } + + let sender = invocation.get_sender(); + let recorder = this._ensureRecorderForSender(sender); + + if (!recorder.is_recording()) { + let [x, y, width, height, fileTemplate, options] = params; + + if (x < 0 || y < 0 || + width <= 0 || height <= 0 || + x + width > global.screen_width || + y + height > global.screen_height) { + invocation.return_error_literal(Gio.IOErrorEnum, + Gio.IOErrorEnum.CANCELLED, + "Invalid params"); + return; + } + + recorder.set_file_template(fileTemplate); + recorder.set_area(x, y, width, height); + this._applyOptionalParameters(recorder, options); + let [success, fileName] = recorder.record(); + returnValue = [success, fileName ? fileName : '']; + if (!success) + this._stopRecordingForSender(sender); + } + + invocation.return_value(GLib.Variant.new('(bs)', returnValue)); + } + + StopScreencastAsync(params, invocation) { + let success = this._stopRecordingForSender(invocation.get_sender()); + invocation.return_value(GLib.Variant.new('(b)', [success])); + } +}; +Signals.addSignalMethods(ScreencastService.prototype); diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js new file mode 100644 index 0000000..c6896ff --- /dev/null +++ b/js/ui/screenshot.js @@ -0,0 +1,395 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; + +const GrabHelper = imports.ui.grabHelper; +const Lightbox = imports.ui.lightbox; +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const ScreenshotIface = loadInterfaceXML('org.gnome.Shell.Screenshot'); + +var ScreenshotService = class { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot'); + + this._screenShooter = new Map(); + + this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' }); + + Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null); + } + + _createScreenshot(invocation, needsDisk=true) { + let lockedDown = false; + if (needsDisk) + lockedDown = this._lockdownSettings.get_boolean('disable-save-to-disk') + + let sender = invocation.get_sender(); + if (this._screenShooter.has(sender) || lockedDown) { + invocation.return_value(GLib.Variant.new('(bs)', [false, ''])); + return null; + } + + let shooter = new Shell.Screenshot(); + shooter._watchNameId = + Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, + this._onNameVanished.bind(this)); + + this._screenShooter.set(sender, shooter); + + return shooter; + } + + _onNameVanished(connection, name) { + this._removeShooterForSender(name); + } + + _removeShooterForSender(sender) { + let shooter = this._screenShooter.get(sender); + if (!shooter) + return; + + Gio.bus_unwatch_name(shooter._watchNameId); + this._screenShooter.delete(sender); + } + + _checkArea(x, y, width, height) { + return x >= 0 && y >= 0 && + width > 0 && height > 0 && + x + width <= global.screen_width && + y + height <= global.screen_height; + } + + _onScreenshotComplete(result, area, filenameUsed, flash, invocation) { + if (result) { + if (flash) { + let flashspot = new Flashspot(area); + flashspot.fire(() => { + this._removeShooterForSender(invocation.get_sender()); + }); + } + else + this._removeShooterForSender(invocation.get_sender()); + } + + let retval = GLib.Variant.new('(bs)', [result, filenameUsed]); + invocation.return_value(retval); + } + + _scaleArea(x, y, width, height) { + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + x *= scaleFactor; + y *= scaleFactor; + width *= scaleFactor; + height *= scaleFactor; + return [x, y, width, height]; + } + + _unscaleArea(x, y, width, height) { + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + x /= scaleFactor; + y /= scaleFactor; + width /= scaleFactor; + height /= scaleFactor; + return [x, y, width, height]; + } + + ScreenshotAreaAsync(params, invocation) { + let [x, y, width, height, flash, filename] = params; + [x, y, width, height] = this._scaleArea(x, y, width, height); + if (!this._checkArea(x, y, width, height)) { + invocation.return_error_literal(Gio.IOErrorEnum, + Gio.IOErrorEnum.CANCELLED, + "Invalid params"); + return; + } + let screenshot = this._createScreenshot(invocation); + if (!screenshot) + return; + screenshot.screenshot_area (x, y, width, height, filename, + (o, res) => { + try { + let [result, area, filenameUsed] = + screenshot.screenshot_area_finish(res); + this._onScreenshotComplete(result, area, filenameUsed, + flash, invocation); + } catch (e) { + invocation.return_gerror (e); + } + }); + } + + ScreenshotWindowAsync(params, invocation) { + let [include_frame, include_cursor, flash, filename] = params; + let screenshot = this._createScreenshot(invocation); + if (!screenshot) + return; + screenshot.screenshot_window (include_frame, include_cursor, filename, + (o, res) => { + try { + let [result, area, filenameUsed] = + screenshot.screenshot_window_finish(res); + this._onScreenshotComplete(result, area, filenameUsed, + flash, invocation); + } catch (e) { + invocation.return_gerror (e); + } + }); + } + + ScreenshotAsync(params, invocation) { + let [include_cursor, flash, filename] = params; + let screenshot = this._createScreenshot(invocation); + if (!screenshot) + return; + screenshot.screenshot(include_cursor, filename, + (o, res) => { + try { + let [result, area, filenameUsed] = + screenshot.screenshot_finish(res); + this._onScreenshotComplete(result, area, filenameUsed, + flash, invocation); + } catch (e) { + invocation.return_gerror (e); + } + }); + } + + SelectAreaAsync(params, invocation) { + let selectArea = new SelectArea(); + selectArea.show(); + selectArea.connect('finished', (selectArea, areaRectangle) => { + if (areaRectangle) { + let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y, + areaRectangle.width, areaRectangle.height); + let retval = GLib.Variant.new('(iiii)', retRectangle); + invocation.return_value(retval); + } else { + invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, + "Operation was cancelled"); + } + }); + } + + FlashAreaAsync(params, invocation) { + let [x, y, width, height] = params; + [x, y, width, height] = this._scaleArea(x, y, width, height); + if (!this._checkArea(x, y, width, height)) { + invocation.return_error_literal(Gio.IOErrorEnum, + Gio.IOErrorEnum.CANCELLED, + "Invalid params"); + return; + } + let flashspot = new Flashspot({ x : x, y : y, width: width, height: height}); + flashspot.fire(); + invocation.return_value(null); + } + + PickColorAsync(params, invocation) { + let pickPixel = new PickPixel(); + pickPixel.show(); + pickPixel.connect('finished', (pickPixel, coords) => { + if (coords) { + let screenshot = this._createScreenshot(invocation, false); + if (!screenshot) + return; + screenshot.pick_color(...coords, (o, res) => { + let [success, color] = screenshot.pick_color_finish(res); + let { red, green, blue } = color; + let retval = GLib.Variant.new('(a{sv})', [{ + color: GLib.Variant.new('(ddd)', [ + red / 255.0, + green / 255.0, + blue / 255.0 + ]) + }]); + this._removeShooterForSender(invocation.get_sender()); + invocation.return_value(retval); + }); + } else { + invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, + "Operation was cancelled"); + } + }); + } +}; + +var SelectArea = class { + constructor() { + this._startX = -1; + this._startY = -1; + this._lastX = 0; + this._lastY = 0; + this._result = null; + + this._group = new St.Widget({ visible: false, + reactive: true, + x: 0, + y: 0 }); + Main.uiGroup.add_actor(this._group); + + this._grabHelper = new GrabHelper.GrabHelper(this._group); + + this._group.connect('button-press-event', + this._onButtonPress.bind(this)); + this._group.connect('button-release-event', + this._onButtonRelease.bind(this)); + this._group.connect('motion-event', + this._onMotionEvent.bind(this)); + + let constraint = new Clutter.BindConstraint({ source: global.stage, + coordinate: Clutter.BindCoordinate.ALL }); + this._group.add_constraint(constraint); + + this._rubberband = new St.Widget({ + style_class: 'select-area-rubberband', + visible: false + }); + this._group.add_actor(this._rubberband); + } + + show() { + if (!this._grabHelper.grab({ actor: this._group, + onUngrab: this._onUngrab.bind(this) })) + return; + + global.display.set_cursor(Meta.Cursor.CROSSHAIR); + Main.uiGroup.set_child_above_sibling(this._group, null); + this._group.visible = true; + } + + _getGeometry() { + return { x: Math.min(this._startX, this._lastX), + y: Math.min(this._startY, this._lastY), + width: Math.abs(this._startX - this._lastX) + 1, + height: Math.abs(this._startY - this._lastY) + 1 }; + } + + _onMotionEvent(actor, event) { + if (this._startX == -1 || this._startY == -1) + return Clutter.EVENT_PROPAGATE; + + [this._lastX, this._lastY] = event.get_coords(); + this._lastX = Math.floor(this._lastX); + this._lastY = Math.floor(this._lastY); + let geometry = this._getGeometry(); + + this._rubberband.set_position(geometry.x, geometry.y); + this._rubberband.set_size(geometry.width, geometry.height); + this._rubberband.show(); + + return Clutter.EVENT_PROPAGATE; + } + + _onButtonPress(actor, event) { + [this._startX, this._startY] = event.get_coords(); + this._startX = Math.floor(this._startX); + this._startY = Math.floor(this._startY); + this._rubberband.set_position(this._startX, this._startY); + + return Clutter.EVENT_PROPAGATE; + } + + _onButtonRelease(actor, event) { + this._result = this._getGeometry(); + Tweener.addTween(this._group, + { opacity: 0, + time: 0.2, + transition: 'easeOutQuad', + onComplete: () => { + this._grabHelper.ungrab(); + } + }); + return Clutter.EVENT_PROPAGATE; + } + + _onUngrab() { + global.display.set_cursor(Meta.Cursor.DEFAULT); + this.emit('finished', this._result); + + GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + this._group.destroy(); + return GLib.SOURCE_REMOVE; + }); + } +}; +Signals.addSignalMethods(SelectArea.prototype); + +var PickPixel = class { + constructor() { + this._result = null; + + this._group = new St.Widget({ visible: false, + reactive: true }); + Main.uiGroup.add_actor(this._group); + + this._grabHelper = new GrabHelper.GrabHelper(this._group); + + this._group.connect('button-release-event', + this._onButtonRelease.bind(this)); + + let constraint = new Clutter.BindConstraint({ source: global.stage, + coordinate: Clutter.BindCoordinate.ALL }); + this._group.add_constraint(constraint); + } + + show() { + if (!this._grabHelper.grab({ actor: this._group, + onUngrab: this._onUngrab.bind(this) })) + return; + + global.display.set_cursor(Meta.Cursor.CROSSHAIR); + Main.uiGroup.set_child_above_sibling(this._group, null); + this._group.visible = true; + } + + _onButtonRelease(actor, event) { + this._result = event.get_coords(); + this._grabHelper.ungrab(); + return Clutter.EVENT_PROPAGATE; + } + + _onUngrab() { + global.display.set_cursor(Meta.Cursor.DEFAULT); + this.emit('finished', this._result); + + GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + this._group.destroy(); + return GLib.SOURCE_REMOVE; + }); + } +}; +Signals.addSignalMethods(PickPixel.prototype); + +var FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds + +var Flashspot = class extends Lightbox.Lightbox { + constructor(area) { + super(Main.uiGroup, { inhibitEvents: true, + width: area.width, + height: area.height }); + + this.actor.style_class = 'flashspot'; + this.actor.set_position(area.x, area.y); + } + + fire(doneCallback) { + this.actor.show(); + this.actor.opacity = 255; + Tweener.addTween(this.actor, + { opacity: 0, + time: FLASHSPOT_ANIMATION_OUT_TIME, + transition: 'easeOutQuad', + onComplete: () => { + if (doneCallback) + doneCallback(); + this.destroy(); + } + }); + } +}; diff --git a/js/ui/scripting.js b/js/ui/scripting.js new file mode 100644 index 0000000..d227b9e --- /dev/null +++ b/js/ui/scripting.js @@ -0,0 +1,332 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib, Meta, Shell } = imports.gi; +const Mainloop = imports.mainloop; + +const Main = imports.ui.main; +const Params = imports.misc.params; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +// This module provides functionality for driving the shell user interface +// in an automated fashion. The primary current use case for this is +// automated performance testing (see runPerfScript()), but it could +// be applied to other forms of automation, such as testing for +// correctness as well. +// +// When scripting an automated test we want to make a series of calls +// in a linear fashion, but we also want to be able to let the main +// loop run so actions can finish. For this reason we write the script +// as a generator function that yields when it want to let the main +// loop run. +// +// yield Scripting.sleep(1000); +// main.overview.show(); +// yield Scripting.waitLeisure(); +// +// While it isn't important to the person writing the script, the actual +// yielded result is a function that the caller uses to provide the +// callback for resuming the script. + +/** + * sleep: + * @milliseconds: number of milliseconds to wait + * + * Used within an automation script to pause the the execution of the + * current script for the specified amount of time. Use as + * 'yield Scripting.sleep(500);' + */ +function sleep(milliseconds) { + return new Promise(resolve => { + let id = Mainloop.timeout_add(milliseconds, () => { + resolve(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] sleep'); + }); +} + +/** + * waitLeisure: + * + * Used within an automation script to pause the the execution of the + * current script until the shell is completely idle. Use as + * 'yield Scripting.waitLeisure();' + */ +function waitLeisure() { + return new Promise(resolve => { + global.run_at_leisure(resolve); + }); +} + +const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper'); +var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface); +function PerfHelper() { + return new PerfHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PerfHelper', '/org/gnome/Shell/PerfHelper'); +} + +let _perfHelper = null; +function _getPerfHelper() { + if (_perfHelper == null) + _perfHelper = new PerfHelper(); + + return _perfHelper; +} + +function _callRemote(obj, method, ...args) { + return new Promise((resolve, reject) => { + args.push((result, excp) => { + if (excp) + reject(excp); + else + resolve(); + }); + + method.apply(obj, args); + }); +} + +/** + * createTestWindow: + * @params: options for window creation. + * width - width of window, in pixels (default 640) + * height - height of window, in pixels (default 480) + * alpha - whether the window should have an alpha channel (default false) + * maximized - whether the window should be created maximized (default false) + * redraws - whether the window should continually redraw itself (default false) + * @maximized: whethe the window should be created maximized + * + * Creates a window using gnome-shell-perf-helper for testing purposes. + * While this function can be used with yield in an automation + * script to pause until the D-Bus call to the helper process returns, + * because of the normal X asynchronous mapping process, to actually wait + * until the window has been mapped and exposed, use waitTestWindows(). + */ +function createTestWindow(params) { + params = Params.parse(params, { width: 640, + height: 480, + alpha: false, + maximized: false, + redraws: false }); + + let perfHelper = _getPerfHelper(); + return _callRemote(perfHelper, perfHelper.CreateWindowRemote, + params.width, params.height, + params.alpha, params.maximized, params.redraws); +} + +/** + * waitTestWindows: + * + * Used within an automation script to pause until all windows previously + * created with createTestWindow have been mapped and exposed. + */ +function waitTestWindows() { + let perfHelper = _getPerfHelper(); + return _callRemote(perfHelper, perfHelper.WaitWindowsRemote); +} + +/** + * destroyTestWindows: + * + * Destroys all windows previously created with createTestWindow(). + * While this function can be used with yield in an automation + * script to pause until the D-Bus call to the helper process returns, + * this doesn't guarantee that Mutter has actually finished the destroy + * process because of normal X asynchronicity. + */ +function destroyTestWindows() { + let perfHelper = _getPerfHelper(); + return _callRemote(perfHelper, perfHelper.DestroyWindowsRemote); +} + +/** + * defineScriptEvent + * @name: The event will be called script. + * @description: Short human-readable description of the event + * + * Convenience function to define a zero-argument performance event + * within the 'script' namespace that is reserved for events defined locally + * within a performance automation script + */ +function defineScriptEvent(name, description) { + Shell.PerfLog.get_default().define_event("script." + name, + description, + ""); +} + +/** + * scriptEvent + * @name: Name registered with defineScriptEvent() + * + * Convenience function to record a script-local performance event + * previously defined with defineScriptEvent + */ +function scriptEvent(name) { + Shell.PerfLog.get_default().event("script." + name); +} + +/** + * collectStatistics + * + * Convenience function to trigger statistics collection + */ +function collectStatistics() { + Shell.PerfLog.get_default().collect_statistics(); +} + +function _collect(scriptModule, outputFile) { + let eventHandlers = {}; + + for (let f in scriptModule) { + let m = /([A-Za-z]+)_([A-Za-z]+)/.exec(f); + if (m) + eventHandlers[m[1] + "." + m[2]] = scriptModule[f]; + } + + Shell.PerfLog.get_default().replay( + (time, eventName, signature, arg) => { + if (eventName in eventHandlers) + eventHandlers[eventName](time, arg); + }); + + if ('finish' in scriptModule) + scriptModule.finish(); + + if (outputFile) { + let f = Gio.file_new_for_path(outputFile); + let raw = f.replace(null, false, + Gio.FileCreateFlags.NONE, + null); + let out = Gio.BufferedOutputStream.new_sized (raw, 4096); + Shell.write_string_to_stream (out, "{\n"); + + Shell.write_string_to_stream(out, '"events":\n'); + Shell.PerfLog.get_default().dump_events(out); + + let monitors = Main.layoutManager.monitors; + let primary = Main.layoutManager.primaryIndex; + Shell.write_string_to_stream(out, ',\n"monitors":\n['); + for (let i = 0; i < monitors.length; i++) { + let monitor = monitors[i]; + if (i != 0) + Shell.write_string_to_stream(out, ', '); + Shell.write_string_to_stream(out, '"%s%dx%d+%d+%d"'.format(i == primary ? "*" : "", + monitor.width, monitor.height, + monitor.x, monitor.y)); + } + Shell.write_string_to_stream(out, ' ]'); + + Shell.write_string_to_stream(out, ',\n"metrics":\n[ '); + let first = true; + for (let name in scriptModule.METRICS) { + let metric = scriptModule.METRICS[name]; + // Extra checks here because JSON.stringify generates + // invalid JSON for undefined values + if (metric.description == null) { + log("Error: No description found for metric " + name); + continue; + } + if (metric.units == null) { + log("Error: No units found for metric " + name); + continue; + } + if (metric.value == null) { + log("Error: No value found for metric " + name); + continue; + } + + if (!first) + Shell.write_string_to_stream(out, ',\n '); + first = false; + + Shell.write_string_to_stream(out, + '{ "name": ' + JSON.stringify(name) + ',\n' + + ' "description": ' + JSON.stringify(metric.description) + ',\n' + + ' "units": ' + JSON.stringify(metric.units) + ',\n' + + ' "value": ' + JSON.stringify(metric.value) + ' }'); + } + Shell.write_string_to_stream(out, ' ]'); + + Shell.write_string_to_stream (out, ',\n"log":\n'); + Shell.PerfLog.get_default().dump_log(out); + + Shell.write_string_to_stream (out, '\n}\n'); + out.close(null); + } else { + let metrics = []; + for (let metric in scriptModule.METRICS) + metrics.push(metric); + + metrics.sort(); + + print ('------------------------------------------------------------'); + for (let i = 0; i < metrics.length; i++) { + let metric = metrics[i]; + print ('# ' + scriptModule.METRICS[metric].description); + print (metric + ': ' + scriptModule.METRICS[metric].value + scriptModule.METRICS[metric].units); + } + print ('------------------------------------------------------------'); + } +} + +/** + * runPerfScript + * @scriptModule: module object with run and finish functions + * and event handlers + * + * Runs a script for automated collection of performance data. The + * script is defined as a Javascript module with specified contents. + * + * First the run() function within the module will be called as a + * generator to automate a series of actions. These actions will + * trigger performance events and the script can also record its + * own performance events. + * + * Then the recorded event log is replayed using handler functions + * within the module. The handler for the event 'foo.bar' is called + * foo_bar(). + * + * Finally if the module has a function called finish(), that will + * be called. + * + * The event handler and finish functions are expected to fill in + * metrics to an object within the module called METRICS. Each + * property of this object represents an individual metric. The + * name of the property is the name of the metric, the value + * of the property is an object with the following properties: + * + * description: human readable description of the metric + * units: a string representing the units of the metric. It has + * the form ' ... / / ...'. Certain + * unit values are recognized: s, ms, us, B, KiB, MiB. Other + * values can appear but are uninterpreted. Examples 's', + * '/ s', 'frames', 'frames / s', 'MiB / s / frame' + * value: computed value of the metric + * + * The resulting metrics will be written to @outputFile as JSON, or, + * if @outputFile is not provided, logged. + * + * After running the script and collecting statistics from the + * event log, GNOME Shell will exit. + **/ +async function runPerfScript(scriptModule, outputFile) { + Shell.PerfLog.get_default().set_enabled(true); + + for (let step of scriptModule.run()) { + try { + await step; + } catch (err) { + log(`Script failed: ${err}\n${err.stack}`); + Meta.exit(Meta.ExitCode.ERROR); + } + } + + try { + _collect(scriptModule, outputFile); + } catch (err) { + log(`Script failed: ${err}\n${err.stack}`); + Meta.exit(Meta.ExitCode.ERROR); + } + Meta.exit(Meta.ExitCode.SUCCESS); +} diff --git a/js/ui/search.js b/js/ui/search.js new file mode 100644 index 0000000..fe4f616 --- /dev/null +++ b/js/ui/search.js @@ -0,0 +1,764 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Shell, St } = imports.gi; +const Signals = imports.signals; + +const AppDisplay = imports.ui.appDisplay; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const RemoteSearch = imports.ui.remoteSearch; +const Util = imports.misc.util; + +const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; + +var MAX_LIST_SEARCH_RESULTS_ROWS = 5; +var MAX_GRID_SEARCH_RESULTS_ROWS = 1; + +var MaxWidthBin = GObject.registerClass( +class MaxWidthBin extends St.Bin { + vfunc_allocate(box, flags) { + let themeNode = this.get_theme_node(); + let maxWidth = themeNode.get_max_width(); + let availWidth = box.x2 - box.x1; + let adjustedBox = box; + + if (availWidth > maxWidth) { + let excessWidth = availWidth - maxWidth; + adjustedBox.x1 += Math.floor(excessWidth / 2); + adjustedBox.x2 -= Math.floor(excessWidth / 2); + } + + super.vfunc_allocate(adjustedBox, flags); + } +}); + +var SearchResult = class { + constructor(provider, metaInfo, resultsView) { + this.provider = provider; + this.metaInfo = metaInfo; + this._resultsView = resultsView; + + this.actor = new St.Button({ reactive: true, + can_focus: true, + track_hover: true, + x_align: St.Align.START, + y_fill: true }); + + this.actor._delegate = this; + this.actor.connect('clicked', this.activate.bind(this)); + } + + activate() { + this.emit('activate', this.metaInfo.id); + } +}; +Signals.addSignalMethods(SearchResult.prototype); + +var ListSearchResult = class extends SearchResult { + + constructor(provider, metaInfo, resultsView) { + super(provider, metaInfo, resultsView); + + this.actor.style_class = 'list-search-result'; + this.actor.x_fill = true; + + let content = new St.BoxLayout({ style_class: 'list-search-result-content', + vertical: false }); + this.actor.set_child(content); + + this._termsChangedId = 0; + + let titleBox = new St.BoxLayout({ style_class: 'list-search-result-title' }); + + content.add(titleBox, { x_fill: true, + y_fill: false, + x_align: St.Align.START, + y_align: St.Align.MIDDLE }); + + // An icon for, or thumbnail of, content + let icon = this.metaInfo['createIcon'](this.ICON_SIZE); + if (icon) { + titleBox.add(icon); + } + + let title = new St.Label({ text: this.metaInfo['name'] }); + titleBox.add(title, { x_fill: false, + y_fill: false, + x_align: St.Align.START, + y_align: St.Align.MIDDLE }); + + this.actor.label_actor = title; + + if (this.metaInfo['description']) { + this._descriptionLabel = new St.Label({ style_class: 'list-search-result-description' }); + content.add(this._descriptionLabel, { x_fill: false, + y_fill: false, + x_align: St.Align.START, + y_align: St.Align.MIDDLE }); + + this._termsChangedId = + this._resultsView.connect('terms-changed', + this._highlightTerms.bind(this)); + + this._highlightTerms(); + } + + this.actor.connect('destroy', this._onDestroy.bind(this)); + } + + get ICON_SIZE() { + return 24; + } + + _highlightTerms() { + let markup = this._resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]); + this._descriptionLabel.clutter_text.set_markup(markup); + } + + _onDestroy() { + if (this._termsChangedId) + this._resultsView.disconnect(this._termsChangedId); + this._termsChangedId = 0; + } +}; + +var GridSearchResult = class extends SearchResult { + constructor(provider, metaInfo, resultsView) { + super(provider, metaInfo, resultsView); + + this.actor.style_class = 'grid-search-result'; + + this.icon = new IconGrid.BaseIcon(this.metaInfo['name'], + { createIcon: this.metaInfo['createIcon'] }); + let content = new St.Bin({ child: this.icon }); + this.actor.set_child(content); + this.actor.label_actor = this.icon.label; + } +}; + +var SearchResultsBase = class { + constructor(provider, resultsView) { + this.provider = provider; + this._resultsView = resultsView; + + this._terms = []; + + this.actor = new St.BoxLayout({ style_class: 'search-section', + vertical: true }); + + this._resultDisplayBin = new St.Bin({ x_fill: true, + y_fill: true }); + this.actor.add(this._resultDisplayBin, { expand: true }); + + let separator = new St.Widget({ style_class: 'search-section-separator' }); + this.actor.add(separator); + + this._resultDisplays = {}; + + this._clipboard = St.Clipboard.get_default(); + + this._cancellable = new Gio.Cancellable(); + } + + destroy() { + this.actor.destroy(); + this._terms = []; + } + + _createResultDisplay(meta) { + if (this.provider.createResultObject) + return this.provider.createResultObject(meta, this._resultsView); + + return null; + } + + clear() { + this._cancellable.cancel(); + for (let resultId in this._resultDisplays) + this._resultDisplays[resultId].actor.destroy(); + this._resultDisplays = {}; + this._clearResultDisplay(); + this.actor.hide(); + } + + _keyFocusIn(actor) { + this.emit('key-focus-in', actor); + } + + _activateResult(result, id) { + this.provider.activateResult(id, this._terms); + if (result.metaInfo.clipboardText) + this._clipboard.set_text(St.ClipboardType.CLIPBOARD, result.metaInfo.clipboardText); + Main.overview.toggle(); + } + + _setMoreCount(count) { + } + + _ensureResultActors(results, callback) { + let metasNeeded = results.filter( + resultId => this._resultDisplays[resultId] === undefined + ); + + if (metasNeeded.length === 0) { + callback(true); + } else { + this._cancellable.cancel(); + this._cancellable.reset(); + + this.provider.getResultMetas(metasNeeded, metas => { + if (this._cancellable.is_cancelled()) { + if (metas.length > 0) + log(`Search provider ${this.provider.id} returned results after the request was canceled`); + callback(false); + return; + } + if (metas.length != metasNeeded.length) { + log('Wrong number of result metas returned by search provider ' + this.provider.id + + ': expected ' + metasNeeded.length + ' but got ' + metas.length); + callback(false); + return; + } + if (metas.some(meta => !meta.name || !meta.id)) { + log('Invalid result meta returned from search provider ' + this.provider.id); + callback(false); + return; + } + + metasNeeded.forEach((resultId, i) => { + let meta = metas[i]; + let display = this._createResultDisplay(meta); + display.connect('activate', this._activateResult.bind(this)); + display.actor.connect('key-focus-in', this._keyFocusIn.bind(this)); + this._resultDisplays[resultId] = display; + }); + callback(true); + }, this._cancellable); + } + } + + updateSearch(providerResults, terms, callback) { + this._terms = terms; + if (providerResults.length == 0) { + this._clearResultDisplay(); + this.actor.hide(); + callback(); + } else { + let maxResults = this._getMaxDisplayedResults(); + let results = this.provider.filterResults(providerResults, maxResults); + let moreCount = Math.max(providerResults.length - results.length, 0); + + this._ensureResultActors(results, successful => { + if (!successful) { + this._clearResultDisplay(); + callback(); + return; + } + + // To avoid CSS transitions causing flickering when + // the first search result stays the same, we hide the + // content while filling in the results. + this.actor.hide(); + this._clearResultDisplay(); + results.forEach(resultId => { + this._addItem(this._resultDisplays[resultId]); + }); + this._setMoreCount(this.provider.canLaunchSearch ? moreCount : 0); + this.actor.show(); + callback(); + }); + } + } +}; + +var ListSearchResults = class extends SearchResultsBase { + constructor(provider, resultsView) { + super(provider, resultsView); + + this._container = new St.BoxLayout({ style_class: 'search-section-content' }); + this.providerInfo = new ProviderInfo(provider); + this.providerInfo.connect('key-focus-in', this._keyFocusIn.bind(this)); + this.providerInfo.connect('clicked', () => { + this.providerInfo.animateLaunch(); + provider.launchSearch(this._terms); + Main.overview.toggle(); + }); + + this._container.add(this.providerInfo, { x_fill: false, + y_fill: false, + x_align: St.Align.START, + y_align: St.Align.START }); + + this._content = new St.BoxLayout({ style_class: 'list-search-results', + vertical: true }); + this._container.add(this._content, { expand: true }); + + this._resultDisplayBin.set_child(this._container); + } + + _setMoreCount(count) { + this.providerInfo.setMoreCount(count); + } + + _getMaxDisplayedResults() { + return MAX_LIST_SEARCH_RESULTS_ROWS; + } + + _clearResultDisplay() { + this._content.remove_all_children(); + } + + _createResultDisplay(meta) { + return super._createResultDisplay(meta, this._resultsView) || + new ListSearchResult(this.provider, meta, this._resultsView); + } + + _addItem(display) { + this._content.add_actor(display.actor); + } + + getFirstResult() { + if (this._content.get_n_children() > 0) + return this._content.get_child_at_index(0)._delegate; + else + return null; + } +}; +Signals.addSignalMethods(ListSearchResults.prototype); + +var GridSearchResults = class extends SearchResultsBase { + constructor(provider, resultsView) { + super(provider, resultsView); + // We need to use the parent container to know how much results we can show. + // None of the actors in this class can be used for that, since the main actor + // goes hidden when no results are displayed, and then it lost its allocation. + // Then on the next use of _getMaxDisplayedResults allocation is 0, en therefore + // it doesn't show any result although we have some. + this._parentContainer = resultsView.actor; + + this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS, + xAlign: St.Align.START }); + + this._bin = new St.Bin({ x_align: St.Align.MIDDLE }); + this._bin.set_child(this._grid); + + this._resultDisplayBin.set_child(this._bin); + } + + _getMaxDisplayedResults() { + let parentThemeNode = this._parentContainer.get_theme_node(); + let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width); + return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit(); + } + + _clearResultDisplay() { + this._grid.removeAll(); + } + + _createResultDisplay(meta) { + return super._createResultDisplay(meta, this._resultsView) || + new GridSearchResult(this.provider, meta, this._resultsView); + } + + _addItem(display) { + this._grid.addItem(display); + } + + getFirstResult() { + if (this._grid.visibleItemsCount() > 0) + return this._grid.getItemAtIndex(0)._delegate; + else + return null; + } +}; +Signals.addSignalMethods(GridSearchResults.prototype); + +var SearchResults = class { + constructor() { + this.actor = new St.BoxLayout({ name: 'searchResults', + vertical: true }); + + this._content = new St.BoxLayout({ name: 'searchResultsContent', + vertical: true }); + this._contentBin = new MaxWidthBin({ name: 'searchResultsBin', + x_fill: true, + y_fill: true, + child: this._content }); + + let scrollChild = new St.BoxLayout(); + scrollChild.add(this._contentBin, { expand: true }); + + this._scrollView = new St.ScrollView({ x_fill: true, + y_fill: false, + overlay_scrollbars: true, + style_class: 'search-display vfade' }); + this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + this._scrollView.add_actor(scrollChild); + let action = new Clutter.PanAction({ interpolate: true }); + action.connect('pan', this._onPan.bind(this)); + this._scrollView.add_action(action); + + this.actor.add(this._scrollView, { x_fill: true, + y_fill: true, + expand: true, + x_align: St.Align.START, + y_align: St.Align.START }); + + this._statusText = new St.Label({ style_class: 'search-statustext' }); + this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE }); + this.actor.add(this._statusBin, { expand: true }); + this._statusBin.add_actor(this._statusText); + + this._highlightDefault = false; + this._defaultResult = null; + this._startingSearch = false; + + this._terms = []; + this._results = {}; + + this._providers = []; + + this._highlightRegex = null; + + this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA }); + this._searchSettings.connect('changed::disabled', this._reloadRemoteProviders.bind(this)); + this._searchSettings.connect('changed::enabled', this._reloadRemoteProviders.bind(this)); + this._searchSettings.connect('changed::disable-external', this._reloadRemoteProviders.bind(this)); + this._searchSettings.connect('changed::sort-order', this._reloadRemoteProviders.bind(this)); + + this._searchTimeoutId = 0; + this._cancellable = new Gio.Cancellable(); + + this._registerProvider(new AppDisplay.AppSearchProvider()); + this._reloadRemoteProviders(); + } + + _reloadRemoteProviders() { + let remoteProviders = this._providers.filter(p => p.isRemoteProvider); + remoteProviders.forEach(provider => { + this._unregisterProvider(provider); + }); + + RemoteSearch.loadRemoteSearchProviders(this._searchSettings, providers => { + providers.forEach(this._registerProvider.bind(this)); + }); + } + + _registerProvider(provider) { + provider.searchInProgress = false; + this._providers.push(provider); + this._ensureProviderDisplay(provider); + } + + _unregisterProvider(provider) { + let index = this._providers.indexOf(provider); + this._providers.splice(index, 1); + + if (provider.display) + provider.display.destroy(); + } + + _gotResults(results, provider) { + this._results[provider.id] = results; + this._updateResults(provider, results); + } + + _clearSearchTimeout() { + if (this._searchTimeoutId > 0) { + GLib.source_remove(this._searchTimeoutId); + this._searchTimeoutId = 0; + } + } + + _reset() { + this._terms = []; + this._results = {}; + this._clearDisplay(); + this._clearSearchTimeout(); + this._defaultResult = null; + this._startingSearch = false; + + this._updateSearchProgress(); + } + + _doSearch() { + this._startingSearch = false; + + let previousResults = this._results; + this._results = {}; + + this._providers.forEach(provider => { + provider.searchInProgress = true; + + let previousProviderResults = previousResults[provider.id]; + if (this._isSubSearch && previousProviderResults) + provider.getSubsearchResultSet(previousProviderResults, + this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + else + provider.getInitialResultSet(this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + }); + + this._updateSearchProgress(); + + this._clearSearchTimeout(); + } + + _onSearchTimeout() { + this._searchTimeoutId = 0; + this._doSearch(); + return GLib.SOURCE_REMOVE; + } + + setTerms(terms) { + // Check for the case of making a duplicate previous search before + // setting state of the current search or cancelling the search. + // This will prevent incorrect state being as a result of a duplicate + // search while the previous search is still active. + let searchString = terms.join(' '); + let previousSearchString = this._terms.join(' '); + if (searchString == previousSearchString) + return; + + this._startingSearch = true; + + this._cancellable.cancel(); + this._cancellable.reset(); + + if (terms.length == 0) { + this._reset(); + return; + } + + let isSubSearch = false; + if (this._terms.length > 0) + isSubSearch = searchString.indexOf(previousSearchString) == 0; + + this._terms = terms; + this._isSubSearch = isSubSearch; + this._updateSearchProgress(); + + if (this._searchTimeoutId == 0) + this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, this._onSearchTimeout.bind(this)); + + let escapedTerms = this._terms.map(term => Shell.util_regex_escape(term)); + this._highlightRegex = new RegExp(`(${escapedTerms.join('|')})`, 'gi'); + + this.emit('terms-changed'); + } + + _onPan(action) { + let [dist, dx, dy] = action.get_motion_delta(0); + let adjustment = this._scrollView.vscroll.adjustment; + adjustment.value -= (dy / this.actor.height) * adjustment.page_size; + return false; + } + + _keyFocusIn(provider, actor) { + Util.ensureActorVisibleInScrollView(this._scrollView, actor); + } + + _ensureProviderDisplay(provider) { + if (provider.display) + return; + + let providerDisplay; + if (provider.appInfo) + providerDisplay = new ListSearchResults(provider, this); + else + providerDisplay = new GridSearchResults(provider, this); + + providerDisplay.connect('key-focus-in', this._keyFocusIn.bind(this)); + providerDisplay.actor.hide(); + this._content.add(providerDisplay.actor); + provider.display = providerDisplay; + } + + _clearDisplay() { + this._providers.forEach(provider => { + provider.display.clear(); + }); + } + + _maybeSetInitialSelection() { + let newDefaultResult = null; + + let providers = this._providers; + for (let i = 0; i < providers.length; i++) { + let provider = providers[i]; + let display = provider.display; + + if (!display.actor.visible) + continue; + + let firstResult = display.getFirstResult(); + if (firstResult) { + newDefaultResult = firstResult; + break; // select this one! + } + } + + if (newDefaultResult != this._defaultResult) { + this._setSelected(this._defaultResult, false); + this._setSelected(newDefaultResult, this._highlightDefault); + + this._defaultResult = newDefaultResult; + } + } + + get searchInProgress() { + if (this._startingSearch) + return true; + + return this._providers.some(p => p.searchInProgress); + } + + _updateSearchProgress() { + let haveResults = this._providers.some(provider => { + let display = provider.display; + return (display.getFirstResult() != null); + }); + + this._scrollView.visible = haveResults; + this._statusBin.visible = !haveResults; + + if (!haveResults) { + if (this.searchInProgress) { + this._statusText.set_text(_("Searching…")); + } else { + this._statusText.set_text(_("No results.")); + } + } + } + + _updateResults(provider, results) { + let terms = this._terms; + let display = provider.display; + + display.updateSearch(results, terms, () => { + provider.searchInProgress = false; + + this._maybeSetInitialSelection(); + this._updateSearchProgress(); + }); + } + + activateDefault() { + // If we have a search queued up, force the search now. + if (this._searchTimeoutId > 0) + this._doSearch(); + + if (this._defaultResult) + this._defaultResult.activate(); + } + + highlightDefault(highlight) { + this._highlightDefault = highlight; + this._setSelected(this._defaultResult, highlight); + } + + popupMenuDefault() { + // If we have a search queued up, force the search now. + if (this._searchTimeoutId > 0) + this._doSearch(); + + if (this._defaultResult) + this._defaultResult.actor.popup_menu(); + } + + navigateFocus(direction) { + let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL; + if (direction == St.DirectionType.TAB_BACKWARD || + direction == (rtl ? St.DirectionType.RIGHT + : St.DirectionType.LEFT) || + direction == St.DirectionType.UP) { + this.actor.navigate_focus(null, direction, false); + return; + } + + let from = this._defaultResult ? this._defaultResult.actor : null; + this.actor.navigate_focus(from, direction, false); + } + + _setSelected(result, selected) { + if (!result) + return; + + if (selected) { + result.actor.add_style_pseudo_class('selected'); + Util.ensureActorVisibleInScrollView(this._scrollView, result.actor); + } else { + result.actor.remove_style_pseudo_class('selected'); + } + } + + highlightTerms(description) { + if (!description) + return ''; + + if (!this._highlightRegex) + return description; + + return description.replace(this._highlightRegex, '$1'); + } +}; +Signals.addSignalMethods(SearchResults.prototype); + +var ProviderInfo = GObject.registerClass( +class ProviderInfo extends St.Button { + _init(provider) { + this.provider = provider; + super._init({ style_class: 'search-provider-icon', + reactive: true, + can_focus: true, + accessible_name: provider.appInfo.get_name(), + track_hover: true }); + + this._content = new St.BoxLayout({ vertical: false, + style_class: 'list-search-provider-content' }); + this.set_child(this._content); + + let icon = new St.Icon({ icon_size: this.PROVIDER_ICON_SIZE, + gicon: provider.appInfo.get_icon() }); + + let detailsBox = new St.BoxLayout({ style_class: 'list-search-provider-details', + vertical: true, + x_expand: true }); + + let nameLabel = new St.Label({ text: provider.appInfo.get_name(), + x_align: Clutter.ActorAlign.START }); + + this._moreLabel = new St.Label({ x_align: Clutter.ActorAlign.START }); + + detailsBox.add_actor(nameLabel); + detailsBox.add_actor(this._moreLabel); + + + this._content.add_actor(icon); + this._content.add_actor(detailsBox); + } + + get PROVIDER_ICON_SIZE() { + return 32; + } + + animateLaunch() { + let appSys = Shell.AppSystem.get_default(); + let app = appSys.lookup_app(this.provider.appInfo.get_id()); + if (app.state == Shell.AppState.STOPPED) + IconGrid.zoomOutActor(this._content); + } + + setMoreCount(count) { + this._moreLabel.text = ngettext("%d more", "%d more", count).format(count); + this._moreLabel.visible = count > 0; + } +}); diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js new file mode 100644 index 0000000..25aa75a --- /dev/null +++ b/js/ui/sessionMode.js @@ -0,0 +1,205 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const GLib = imports.gi.GLib; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const FileUtils = imports.misc.fileUtils; +const Params = imports.misc.params; + +const Config = imports.misc.config; + +const DEFAULT_MODE = 'restrictive'; + +const _modes = { + 'restrictive': { + parentMode: null, + stylesheetName: 'gnome-shell.css', + hasOverview: false, + showCalendarEvents: false, + allowSettings: false, + allowExtensions: false, + allowScreencast: false, + enabledExtensions: [], + hasRunDialog: false, + hasWorkspaces: false, + hasWindows: false, + hasNotifications: false, + isLocked: false, + isGreeter: false, + isPrimary: false, + unlockDialog: null, + components: [], + panel: { + left: [], + center: [], + right: [] + }, + panelStyle: null + }, + + 'gdm': { + hasNotifications: true, + isGreeter: true, + isPrimary: true, + unlockDialog: imports.gdm.loginDialog.LoginDialog, + components: ['polkitAgent'], + panel: { + left: [], + center: ['dateMenu'], + right: ['a11y', 'keyboard', 'aggregateMenu'] + }, + panelStyle: 'login-screen' + }, + + 'lock-screen': { + isLocked: true, + isGreeter: undefined, + unlockDialog: undefined, + components: ['polkitAgent', 'telepathyClient'], + panel: { + left: [], + center: [], + right: ['aggregateMenu'] + }, + panelStyle: 'lock-screen' + }, + + 'unlock-dialog': { + isLocked: true, + unlockDialog: undefined, + components: ['polkitAgent', 'telepathyClient'], + panel: { + left: [], + center: [], + right: ['a11y', 'keyboard', 'aggregateMenu'] + }, + panelStyle: 'unlock-screen' + }, + + 'user': { + hasOverview: true, + showCalendarEvents: true, + allowSettings: true, + allowExtensions: true, + allowScreencast: true, + hasRunDialog: true, + hasWorkspaces: true, + hasWindows: true, + hasNotifications: true, + isLocked: false, + isPrimary: true, + unlockDialog: imports.ui.unlockDialog.UnlockDialog, + components: Config.HAVE_NETWORKMANAGER ? + ['networkAgent', 'polkitAgent', 'telepathyClient', + 'keyring', 'autorunManager', 'automountManager'] : + ['polkitAgent', 'telepathyClient', + 'keyring', 'autorunManager', 'automountManager'], + + panel: { + left: ['activities', 'appMenu'], + center: ['dateMenu'], + right: ['a11y', 'keyboard', 'aggregateMenu'] + } + } +}; + +function _loadMode(file, info) { + let name = info.get_name(); + let suffix = name.indexOf('.json'); + let modeName = suffix == -1 ? name : name.slice(name, suffix); + + if (_modes.hasOwnProperty(modeName)) + return; + + let fileContent, success, tag, newMode; + try { + [success, fileContent, tag] = file.load_contents(null); + if (fileContent instanceof Uint8Array) + fileContent = imports.byteArray.toString(fileContent); + newMode = JSON.parse(fileContent); + } catch(e) { + return; + } + + _modes[modeName] = {}; + let propBlacklist = ['unlockDialog']; + for (let prop in _modes[DEFAULT_MODE]) { + if (newMode[prop] !== undefined && + propBlacklist.indexOf(prop) == -1) + _modes[modeName][prop] = newMode[prop]; + } + _modes[modeName]['isPrimary'] = true; +} + +function _loadModes() { + FileUtils.collectFromDatadirs('modes', false, _loadMode); +} + +function listModes() { + _loadModes(); + let id = Mainloop.idle_add(() => { + let names = Object.getOwnPropertyNames(_modes); + for (let i = 0; i < names.length; i++) + if (_modes[names[i]].isPrimary) + print(names[i]); + Mainloop.quit('listModes'); + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] listModes'); + Mainloop.run('listModes'); +} + +var SessionMode = class { + constructor() { + _loadModes(); + let isPrimary = (_modes[global.session_mode] && + _modes[global.session_mode].isPrimary); + let mode = isPrimary ? global.session_mode : 'user'; + this._modeStack = [mode]; + this._sync(); + } + + pushMode(mode) { + this._modeStack.push(mode); + this._sync(); + } + + popMode(mode) { + if (this.currentMode != mode || this._modeStack.length === 1) + throw new Error("Invalid SessionMode.popMode"); + this._modeStack.pop(); + this._sync(); + } + + switchMode(to) { + if (this.currentMode == to) + return; + this._modeStack[this._modeStack.length - 1] = to; + this._sync(); + } + + get currentMode() { + return this._modeStack[this._modeStack.length - 1]; + } + + _sync() { + let params = _modes[this.currentMode]; + let defaults; + if (params.parentMode) + defaults = Params.parse(_modes[params.parentMode], + _modes[DEFAULT_MODE]); + else + defaults = _modes[DEFAULT_MODE]; + params = Params.parse(params, defaults); + + // A simplified version of Lang.copyProperties, handles + // undefined as a special case for "no change / inherit from previous mode" + for (let prop in params) { + if (params[prop] !== undefined) + this[prop] = params[prop]; + } + + this.emit('updated'); + } +}; +Signals.addSignalMethods(SessionMode.prototype); diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js new file mode 100644 index 0000000..19d07ac --- /dev/null +++ b/js/ui/shellDBus.js @@ -0,0 +1,398 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib, Meta, Shell } = imports.gi; +const Lang = imports.lang; + +const Config = imports.misc.config; +const ExtensionSystem = imports.ui.extensionSystem; +const ExtensionDownloader = imports.ui.extensionDownloader; +const ExtensionUtils = imports.misc.extensionUtils; +const Main = imports.ui.main; +const Screenshot = imports.ui.screenshot; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const GnomeShellIface = loadInterfaceXML('org.gnome.Shell'); +const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver'); + +var GnomeShell = class { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); + + this._extensionsService = new GnomeShellExtensions(); + this._screenshotService = new Screenshot.ScreenshotService(); + + this._grabbedAccelerators = new Map(); + this._grabbers = new Map(); + + global.display.connect('accelerator-activated', + (display, action, deviceid, timestamp) => { + this._emitAcceleratorActivated(action, deviceid, timestamp); + }); + + this._cachedOverviewVisible = false; + Main.overview.connect('showing', + this._checkOverviewVisibleChanged.bind(this)); + Main.overview.connect('hidden', + this._checkOverviewVisibleChanged.bind(this)); + } + + /** + * Eval: + * @code: A string containing JavaScript code + * + * This function executes arbitrary code in the main + * loop, and returns a boolean success and + * JSON representation of the object as a string. + * + * If evaluation completes without throwing an exception, + * then the return value will be [true, JSON.stringify(result)]. + * If evaluation fails, then the return value will be + * [false, JSON.stringify(exception)]; + * + */ + Eval(code) { + if (!global.settings.get_boolean('development-tools')) + return [false, '']; + + let returnValue; + let success; + try { + returnValue = JSON.stringify(eval(code)); + // A hack; DBus doesn't have null/undefined + if (returnValue == undefined) + returnValue = ''; + success = true; + } catch (e) { + returnValue = '' + e; + success = false; + } + return [success, returnValue]; + } + + FocusSearch() { + Main.overview.focusSearch(); + } + + ShowOSD(params) { + for (let param in params) + params[param] = params[param].deep_unpack(); + + let { connector, + label, + level, + max_level: maxLevel, + icon: serializedIcon } = params; + + let monitorIndex = -1; + if (connector) { + let monitorManager = Meta.MonitorManager.get(); + monitorIndex = monitorManager.get_monitor_for_connector(connector); + } + + let icon = null; + if (serializedIcon) + icon = Gio.Icon.new_for_string(serializedIcon); + + Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel); + } + + FocusApp(id) { + this.ShowApplications(); + Main.overview.viewSelector.appDisplay.selectApp(id); + } + + ShowApplications() { + Main.overview.viewSelector.showApps(); + } + + GrabAcceleratorAsync(params, invocation) { + let [accel, modeFlags, grabFlags] = params; + let sender = invocation.get_sender(); + let bindingAction = this._grabAcceleratorForSender(accel, modeFlags, grabFlags, sender); + return invocation.return_value(GLib.Variant.new('(u)', [bindingAction])); + } + + GrabAcceleratorsAsync(params, invocation) { + let [accels] = params; + let sender = invocation.get_sender(); + let bindingActions = []; + for (let i = 0; i < accels.length; i++) { + let [accel, modeFlags, grabFlags] = accels[i]; + bindingActions.push(this._grabAcceleratorForSender(accel, modeFlags, grabFlags, sender)); + } + return invocation.return_value(GLib.Variant.new('(au)', [bindingActions])); + } + + UngrabAcceleratorAsync(params, invocation) { + let [action] = params; + let sender = invocation.get_sender(); + let ungrabSucceeded = this._ungrabAcceleratorForSender(action, sender); + + return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded])); + } + + UngrabAcceleratorsAsync(params, invocation) { + let [actions] = params; + let sender = invocation.get_sender(); + let ungrabSucceeded = true; + + for (let i = 0; i < actions.length; i++) + ungrabSucceeded &= this._ungrabAcceleratorForSender(actions[i], sender); + + return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded])); + } + + _emitAcceleratorActivated(action, deviceid, timestamp) { + let destination = this._grabbedAccelerators.get(action); + if (!destination) + return; + + let connection = this._dbusImpl.get_connection(); + let info = this._dbusImpl.get_info(); + let params = { 'device-id': GLib.Variant.new('u', deviceid), + 'timestamp': GLib.Variant.new('u', timestamp), + 'action-mode': GLib.Variant.new('u', Main.actionMode) }; + connection.emit_signal(destination, + this._dbusImpl.get_object_path(), + info ? info.name : null, + 'AcceleratorActivated', + GLib.Variant.new('(ua{sv})', [action, params])); + } + + _grabAcceleratorForSender(accelerator, modeFlags, grabFlags, sender) { + let bindingAction = global.display.grab_accelerator(accelerator, grabFlags); + if (bindingAction == Meta.KeyBindingAction.NONE) + return Meta.KeyBindingAction.NONE; + + let bindingName = Meta.external_binding_name_for_action(bindingAction); + Main.wm.allowKeybinding(bindingName, modeFlags); + + this._grabbedAccelerators.set(bindingAction, sender); + + if (!this._grabbers.has(sender)) { + let id = Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, + this._onGrabberBusNameVanished.bind(this)); + this._grabbers.set(sender, id); + } + + return bindingAction; + } + + _ungrabAccelerator(action) { + let ungrabSucceeded = global.display.ungrab_accelerator(action); + if (ungrabSucceeded) + this._grabbedAccelerators.delete(action); + + return ungrabSucceeded; + } + + _ungrabAcceleratorForSender(action, sender) { + let grabbedBy = this._grabbedAccelerators.get(action); + if (sender != grabbedBy) + return false; + + return this._ungrabAccelerator(action); + } + + _onGrabberBusNameVanished(connection, name) { + let grabs = this._grabbedAccelerators.entries(); + for (let [action, sender] of grabs) { + if (sender == name) + this._ungrabAccelerator(action); + } + Gio.bus_unwatch_name(this._grabbers.get(name)); + this._grabbers.delete(name); + } + + ShowMonitorLabels2Async(params, invocation) { + let sender = invocation.get_sender(); + let [dict] = params; + Main.osdMonitorLabeler.show(sender, dict); + } + + HideMonitorLabelsAsync(params, invocation) { + let sender = invocation.get_sender(); + Main.osdMonitorLabeler.hide(sender); + } + + _checkOverviewVisibleChanged() { + if (Main.overview.visible !== this._cachedOverviewVisible) { + this._cachedOverviewVisible = Main.overview.visible; + this._dbusImpl.emit_property_changed('OverviewActive', new GLib.Variant('b', this._cachedOverviewVisible)); + } + } + + get Mode() { + return global.session_mode; + } + + get OverviewActive() { + return this._cachedOverviewVisible; + } + + set OverviewActive(visible) { + if (visible) + Main.overview.show(); + else + Main.overview.hide(); + } + + get ShellVersion() { + return Config.PACKAGE_VERSION; + } +}; + +const GnomeShellExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions'); + +var GnomeShellExtensions = class { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); + ExtensionSystem.connect('extension-state-changed', + this._extensionStateChanged.bind(this)); + } + + ListExtensions() { + let out = {}; + for (let uuid in ExtensionUtils.extensions) { + let dbusObj = this.GetExtensionInfo(uuid); + out[uuid] = dbusObj; + } + return out; + } + + GetExtensionInfo(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + if (!extension) + return {}; + + let obj = {}; + Lang.copyProperties(extension.metadata, obj); + + // Only serialize the properties that we actually need. + const serializedProperties = ["type", "state", "path", "error", "hasPrefs"]; + + serializedProperties.forEach(prop => { + obj[prop] = extension[prop]; + }); + + let out = {}; + for (let key in obj) { + let val = obj[key]; + let type; + switch (typeof val) { + case 'string': + type = 's'; + break; + case 'number': + type = 'd'; + break; + case 'boolean': + type = 'b'; + break; + default: + continue; + } + out[key] = GLib.Variant.new(type, val); + } + + return out; + } + + GetExtensionErrors(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + if (!extension) + return []; + + if (!extension.errors) + return []; + + return extension.errors; + } + + InstallRemoteExtensionAsync([uuid], invocation) { + return ExtensionDownloader.installExtension(uuid, invocation); + } + + UninstallExtension(uuid) { + return ExtensionDownloader.uninstallExtension(uuid); + } + + LaunchExtensionPrefs(uuid) { + let appSys = Shell.AppSystem.get_default(); + let app = appSys.lookup_app('gnome-shell-extension-prefs.desktop'); + let info = app.get_app_info(); + let timestamp = global.display.get_current_time_roundtrip(); + info.launch_uris(['extension:///' + uuid], + global.create_app_launch_context(timestamp, -1)); + } + + ReloadExtension(uuid) { + let extension = ExtensionUtils.extensions[uuid]; + if (!extension) + return; + + ExtensionSystem.reloadExtension(extension); + } + + CheckForUpdates() { + ExtensionDownloader.checkForUpdates(); + } + + get ShellVersion() { + return Config.PACKAGE_VERSION; + } + + _extensionStateChanged(_, newState) { + this._dbusImpl.emit_signal('ExtensionStatusChanged', + GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error])); + } +}; + +var ScreenSaverDBus = class { + constructor(screenShield) { + this._screenShield = screenShield; + screenShield.connect('active-changed', shield => { + this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active])); + }); + screenShield.connect('wake-up-screen', shield => { + this._dbusImpl.emit_signal('WakeUpScreen', null); + }); + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver'); + + Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null); + } + + LockAsync(parameters, invocation) { + let tmpId = this._screenShield.connect('lock-screen-shown', () => { + this._screenShield.disconnect(tmpId); + + invocation.return_value(null); + }); + + this._screenShield.lock(true); + } + + SetActive(active) { + if (active) + this._screenShield.activate(true); + else + this._screenShield.deactivate(false); + } + + GetActive() { + return this._screenShield.active; + } + + GetActiveTime() { + let started = this._screenShield.activationTime; + if (started > 0) + return Math.floor((GLib.get_monotonic_time() - started) / 1000000); + else + return 0; + } +}; diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js new file mode 100644 index 0000000..79f1aad --- /dev/null +++ b/js/ui/shellEntry.js @@ -0,0 +1,172 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Shell, St } = imports.gi; + +const BoxPointer = imports.ui.boxpointer; +const Main = imports.ui.main; +const Params = imports.misc.params; +const PopupMenu = imports.ui.popupMenu; + +var EntryMenu = class extends PopupMenu.PopupMenu { + constructor(entry) { + super(entry, 0, St.Side.TOP); + + this._entry = entry; + this._clipboard = St.Clipboard.get_default(); + + // Populate menu + let item; + item = new PopupMenu.PopupMenuItem(_("Copy")); + item.connect('activate', this._onCopyActivated.bind(this)); + this.addMenuItem(item); + this._copyItem = item; + + item = new PopupMenu.PopupMenuItem(_("Paste")); + item.connect('activate', this._onPasteActivated.bind(this)); + this.addMenuItem(item); + this._pasteItem = item; + + this._passwordItem = null; + + Main.uiGroup.add_actor(this.actor); + this.actor.hide(); + } + + _makePasswordItem() { + let item = new PopupMenu.PopupMenuItem(''); + item.connect('activate', this._onPasswordActivated.bind(this)); + this.addMenuItem(item); + this._passwordItem = item; + } + + get isPassword() { + return this._passwordItem != null; + } + + set isPassword(v) { + if (v == this.isPassword) + return; + + if (v) { + this._makePasswordItem(); + this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD; + } else { + this._passwordItem.destroy(); + this._passwordItem = null; + this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL; + } + } + + open(animate) { + this._updatePasteItem(); + this._updateCopyItem(); + if (this._passwordItem) + this._updatePasswordItem(); + + super.open(animate); + this._entry.add_style_pseudo_class('focus'); + + let direction = St.DirectionType.TAB_FORWARD; + if (!this.actor.navigate_focus(null, direction, false)) + this.actor.grab_key_focus(); + } + + _updateCopyItem() { + let selection = this._entry.clutter_text.get_selection(); + this._copyItem.setSensitive(!this._entry.clutter_text.password_char && + selection && selection != ''); + } + + _updatePasteItem() { + this._clipboard.get_text(St.ClipboardType.CLIPBOARD, + (clipboard, text) => { + this._pasteItem.setSensitive(text && text != ''); + }); + } + + _updatePasswordItem() { + let textHidden = (this._entry.clutter_text.password_char); + if (textHidden) + this._passwordItem.label.set_text(_("Show Text")); + else + this._passwordItem.label.set_text(_("Hide Text")); + } + + _onCopyActivated() { + let selection = this._entry.clutter_text.get_selection(); + this._clipboard.set_text(St.ClipboardType.CLIPBOARD, selection); + } + + _onPasteActivated() { + this._clipboard.get_text(St.ClipboardType.CLIPBOARD, + (clipboard, text) => { + if (!text) + return; + this._entry.clutter_text.delete_selection(); + let pos = this._entry.clutter_text.get_cursor_position(); + this._entry.clutter_text.insert_text(text, pos); + }); + } + + _onPasswordActivated() { + let visible = !!(this._entry.clutter_text.password_char); + this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf'); + } +}; + +function _setMenuAlignment(entry, stageX) { + let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0); + if (success) + entry.menu.setSourceAlignment(entryX / entry.width); +}; + +function _onButtonPressEvent(actor, event, entry) { + if (entry.menu.isOpen) { + entry.menu.close(BoxPointer.PopupAnimation.FULL); + return Clutter.EVENT_STOP; + } else if (event.get_button() == 3) { + let [stageX, stageY] = event.get_coords(); + _setMenuAlignment(entry, stageX); + entry.menu.open(BoxPointer.PopupAnimation.FULL); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; +}; + +function _onPopup(actor, entry) { + let [success, textX, textY, lineHeight] = entry.clutter_text.position_to_coords(-1); + if (success) + entry.menu.setSourceAlignment(textX / entry.width); + entry.menu.open(BoxPointer.PopupAnimation.FULL); +}; + +function addContextMenu(entry, params) { + if (entry.menu) + return; + + params = Params.parse (params, { isPassword: false, actionMode: Shell.ActionMode.POPUP }); + + entry.menu = new EntryMenu(entry); + entry.menu.isPassword = params.isPassword; + entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry }, + { actionMode: params.actionMode }); + entry._menuManager.addMenu(entry.menu); + + // Add an event handler to both the entry and its clutter_text; the former + // so padding is included in the clickable area, the latter because the + // event processing of ClutterText prevents event-bubbling. + entry.clutter_text.connect('button-press-event', (actor, event) => { + _onButtonPressEvent(actor, event, entry); + }); + entry.connect('button-press-event', (actor, event) => { + _onButtonPressEvent(actor, event, entry); + }); + + entry.connect('popup-menu', actor => { _onPopup(actor, entry); }); + + entry.connect('destroy', () => { + entry.menu.destroy(); + entry.menu = null; + entry._menuManager = null; + }); +} diff --git a/js/ui/shellMountOperation.js b/js/ui/shellMountOperation.js new file mode 100644 index 0000000..f976f40 --- /dev/null +++ b/js/ui/shellMountOperation.js @@ -0,0 +1,633 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, Pango, Shell, St } = imports.gi; +const Signals = imports.signals; + +const CheckBox = imports.ui.checkBox; +const Dialog = imports.ui.dialog; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const ModalDialog = imports.ui.modalDialog; +const Params = imports.misc.params; +const ShellEntry = imports.ui.shellEntry; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +var LIST_ITEM_ICON_SIZE = 48; + +const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password'; + +/* ------ Common Utils ------- */ +function _setLabelText(label, text) { + if (text) { + label.set_text(text); + label.show(); + } else { + label.set_text(''); + label.hide(); + } +} + +function _setButtonsForChoices(dialog, choices) { + let buttons = []; + + for (let idx = 0; idx < choices.length; idx++) { + let button = idx; + buttons.unshift({ label: choices[idx], + action: () => { dialog.emit('response', button); } + }); + } + + dialog.setButtons(buttons); +} + +function _setLabelsForMessage(content, message) { + let labels = message.split('\n'); + + content.title = labels.shift(); + content.body = labels.join('\n'); +} + +function _createIcon(gicon) { + return new St.Icon({ gicon: gicon, + style_class: 'shell-mount-operation-icon' }) +} + +/* -------------------------------------------------------- */ + +var ListItem = class { + constructor(app) { + this._app = app; + + let layout = new St.BoxLayout({ vertical: false}); + + this.actor = new St.Button({ style_class: 'mount-dialog-app-list-item', + can_focus: true, + child: layout, + reactive: true, + x_align: St.Align.START, + x_fill: true }); + + this._icon = this._app.create_icon_texture(LIST_ITEM_ICON_SIZE); + + let iconBin = new St.Bin({ style_class: 'mount-dialog-app-list-item-icon', + child: this._icon }); + layout.add(iconBin); + + this._nameLabel = new St.Label({ text: this._app.get_name(), + style_class: 'mount-dialog-app-list-item-name' }); + let labelBin = new St.Bin({ y_align: St.Align.MIDDLE, + child: this._nameLabel }); + layout.add(labelBin); + + this.actor.connect('clicked', this._onClicked.bind(this)); + } + + _onClicked() { + this.emit('activate'); + this._app.activate(); + } +}; +Signals.addSignalMethods(ListItem.prototype); + +var ShellMountOperation = class { + constructor(source, params) { + params = Params.parse(params, { existingDialog: null }); + + this._dialog = null; + this._dialogId = 0; + this._existingDialog = params.existingDialog; + this._processesDialog = null; + + this.mountOp = new Shell.MountOperation(); + + this.mountOp.connect('ask-question', + this._onAskQuestion.bind(this)); + this.mountOp.connect('ask-password', + this._onAskPassword.bind(this)); + this.mountOp.connect('show-processes-2', + this._onShowProcesses2.bind(this)); + this.mountOp.connect('aborted', + this.close.bind(this)); + this.mountOp.connect('show-unmount-progress', + this._onShowUnmountProgress.bind(this)); + + this._gicon = source.get_icon(); + } + + _closeExistingDialog() { + if (!this._existingDialog) + return; + + this._existingDialog.close(); + this._existingDialog = null; + } + + _onAskQuestion(op, message, choices) { + this._closeExistingDialog(); + this._dialog = new ShellMountQuestionDialog(this._gicon); + + this._dialogId = this._dialog.connect('response', + (object, choice) => { + this.mountOp.set_choice(choice); + this.mountOp.reply(Gio.MountOperationResult.HANDLED); + + this.close(); + }); + + this._dialog.update(message, choices); + this._dialog.open(); + } + + _onAskPassword(op, message, defaultUser, defaultDomain, flags) { + if (this._existingDialog) { + this._dialog = this._existingDialog; + this._dialog.reaskPassword(); + } else { + this._dialog = new ShellMountPasswordDialog(message, this._gicon, flags); + } + + this._dialogId = this._dialog.connect('response', + (object, choice, password, remember) => { + if (choice == -1) { + this.mountOp.reply(Gio.MountOperationResult.ABORTED); + } else { + if (remember) + this.mountOp.set_password_save(Gio.PasswordSave.PERMANENTLY); + else + this.mountOp.set_password_save(Gio.PasswordSave.NEVER); + + this.mountOp.set_password(password); + this.mountOp.reply(Gio.MountOperationResult.HANDLED); + } + }); + this._dialog.open(); + } + + close(op) { + this._closeExistingDialog(); + this._processesDialog = null; + + if (this._dialog) { + this._dialog.close(); + this._dialog = null; + } + + if (this._notifier) { + this._notifier.done(); + this._notifier = null; + } + } + + _onShowProcesses2(op) { + this._closeExistingDialog(); + + let processes = op.get_show_processes_pids(); + let choices = op.get_show_processes_choices(); + let message = op.get_show_processes_message(); + + if (!this._processesDialog) { + this._processesDialog = new ShellProcessesDialog(this._gicon); + this._dialog = this._processesDialog; + + this._dialogId = this._processesDialog.connect('response', + (object, choice) => { + if (choice == -1) { + this.mountOp.reply(Gio.MountOperationResult.ABORTED); + } else { + this.mountOp.set_choice(choice); + this.mountOp.reply(Gio.MountOperationResult.HANDLED); + } + + this.close(); + }); + this._processesDialog.open(); + } + + this._processesDialog.update(message, processes, choices); + } + + _onShowUnmountProgress(op, message, timeLeft, bytesLeft) { + if (!this._notifier) + this._notifier = new ShellUnmountNotifier(); + + if (bytesLeft == 0) + this._notifier.done(message); + else + this._notifier.show(message); + } + + borrowDialog() { + if (this._dialogId != 0) { + this._dialog.disconnect(this._dialogId); + this._dialogId = 0; + } + + return this._dialog; + } +}; + +var ShellUnmountNotifier = class extends MessageTray.Source { + constructor() { + super('', 'media-removable'); + + this._notification = null; + Main.messageTray.add(this); + } + + show(message) { + let [header, text] = message.split('\n', 2); + + if (!this._notification) { + this._notification = new MessageTray.Notification(this, header, text); + this._notification.setTransient(true); + this._notification.setUrgency(MessageTray.Urgency.CRITICAL); + } else { + this._notification.update(header, text); + } + + this.notify(this._notification); + } + + done(message) { + if (this._notification) { + this._notification.destroy(); + this._notification = null; + } + + if (message) { + let notification = new MessageTray.Notification(this, message, null); + notification.setTransient(true); + + this.notify(notification); + } + } +}; + +var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog { + constructor(icon) { + super({ styleClass: 'mount-dialog' }); + + this._content = new Dialog.MessageDialogContent({ icon }); + this.contentLayout.add(this._content, { x_fill: true, y_fill: false }); + } + + update(message, choices) { + _setLabelsForMessage(this._content, message); + _setButtonsForChoices(this, choices); + } +}; +Signals.addSignalMethods(ShellMountQuestionDialog.prototype); + +var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog { + constructor(message, icon, flags) { + let strings = message.split('\n'); + let title = strings.shift() || null; + let body = strings.shift() || null; + super({ styleClass: 'prompt-dialog' }); + + let content = new Dialog.MessageDialogContent({ icon, title, body }); + this.contentLayout.add_actor(content); + + this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' }); + content.messageBox.add(this._passwordBox); + + this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label', + text: _("Password") })); + this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE }); + + this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', + text: "", + can_focus: true}); + ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); + this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); + this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE + this._passwordBox.add(this._passwordEntry, {expand: true }); + this.setInitialKeyFocus(this._passwordEntry); + + this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label', + text: _("Sorry, that didn’t work. Please try again.") }); + this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._errorMessageLabel.clutter_text.line_wrap = true; + this._errorMessageLabel.hide(); + content.messageBox.add(this._errorMessageLabel); + + if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) { + this._rememberChoice = new CheckBox.CheckBox(); + this._rememberChoice.getLabelActor().text = _("Remember Password"); + this._rememberChoice.actor.checked = + global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY); + content.messageBox.add(this._rememberChoice.actor); + } else { + this._rememberChoice = null; + } + + let buttons = [{ label: _("Cancel"), + action: this._onCancelButton.bind(this), + key: Clutter.Escape + }, + { label: _("Unlock"), + action: this._onUnlockButton.bind(this), + default: true + }]; + + this.setButtons(buttons); + } + + reaskPassword() { + this._passwordEntry.set_text(''); + this._errorMessageLabel.show(); + } + + _onCancelButton() { + this.emit('response', -1, '', false); + } + + _onUnlockButton() { + this._onEntryActivate(); + } + + _onEntryActivate() { + global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY, + this._rememberChoice && this._rememberChoice.actor.checked); + this.emit('response', 1, + this._passwordEntry.get_text(), + this._rememberChoice && + this._rememberChoice.actor.checked); + } +}; + +var ShellProcessesDialog = class extends ModalDialog.ModalDialog { + constructor(icon) { + super({ styleClass: 'mount-dialog' }); + + this._content = new Dialog.MessageDialogContent({ icon }); + this.contentLayout.add(this._content, { x_fill: true, y_fill: false }); + + let scrollView = new St.ScrollView({ style_class: 'mount-dialog-app-list'}); + scrollView.set_policy(St.PolicyType.NEVER, + St.PolicyType.AUTOMATIC); + this.contentLayout.add(scrollView, + { x_fill: true, + y_fill: true }); + scrollView.hide(); + + this._applicationList = new St.BoxLayout({ vertical: true }); + scrollView.add_actor(this._applicationList); + + this._applicationList.connect('actor-added', () => { + if (this._applicationList.get_n_children() == 1) + scrollView.show(); + }); + + this._applicationList.connect('actor-removed', () => { + if (this._applicationList.get_n_children() == 0) + scrollView.hide(); + }); + } + + _setAppsForPids(pids) { + // remove all the items + this._applicationList.destroy_all_children(); + + pids.forEach(pid => { + let tracker = Shell.WindowTracker.get_default(); + let app = tracker.get_app_from_pid(pid); + + if (!app) + return; + + let item = new ListItem(app); + this._applicationList.add(item.actor, { x_fill: true }); + + item.connect('activate', () => { + // use -1 to indicate Cancel + this.emit('response', -1); + }); + }); + } + + update(message, processes, choices) { + this._setAppsForPids(processes); + _setLabelsForMessage(this._content, message); + _setButtonsForChoices(this, choices); + } +}; +Signals.addSignalMethods(ShellProcessesDialog.prototype); + +const GnomeShellMountOpIface = loadInterfaceXML('org.Gtk.MountOperationHandler'); + +var ShellMountOperationType = { + NONE: 0, + ASK_PASSWORD: 1, + ASK_QUESTION: 2, + SHOW_PROCESSES: 3 +}; + +var GnomeShellMountOpHandler = class { + constructor() { + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler'); + Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler', + Gio.BusNameOwnerFlags.REPLACE, null, null); + + this._dialog = null; + this._volumeMonitor = Gio.VolumeMonitor.get(); + + this._ensureEmptyRequest(); + } + + _ensureEmptyRequest() { + this._currentId = null; + this._currentInvocation = null; + this._currentType = ShellMountOperationType.NONE; + } + + _clearCurrentRequest(response, details) { + if (this._currentInvocation) { + this._currentInvocation.return_value( + GLib.Variant.new('(ua{sv})', [response, details])); + } + + this._ensureEmptyRequest(); + } + + _setCurrentRequest(invocation, id, type) { + let oldId = this._currentId; + let oldType = this._currentType; + let requestId = id + '@' + invocation.get_sender(); + + this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {}); + + this._currentInvocation = invocation; + this._currentId = requestId; + this._currentType = type; + + if (this._dialog && (oldId == requestId) && (oldType == type)) + return true; + + return false; + } + + _closeDialog() { + if (this._dialog) { + this._dialog.close(); + this._dialog = null; + } + } + + _createGIcon(iconName) { + let realIconName = iconName ? iconName : 'drive-harddisk'; + return new Gio.ThemedIcon({ name: realIconName, + use_default_fallbacks: true }); + } + + /** + * AskPassword: + * @id: an opaque ID identifying the object for which the operation is requested + * The ID must be unique in the context of the calling process. + * @message: the message to display + * @icon_name: the name of an icon to display + * @default_user: the default username for display + * @default_domain: the default domain for display + * @flags: a set of GAskPasswordFlags + * @response: a GMountOperationResult + * @response_details: a dictionary containing the response details as + * entered by the user. The dictionary MAY contain the following properties: + * - "password" -> (s): a password to be used to complete the mount operation + * - "password_save" -> (u): a GPasswordSave + * + * The dialog will stay visible until clients call the Close() method, or + * another dialog becomes visible. + * Calling AskPassword again for the same id will have the effect to clear + * the existing dialog and update it with a message indicating the previous + * attempt went wrong. + */ + AskPasswordAsync(params, invocation) { + let [id, message, iconName, defaultUser, defaultDomain, flags] = params; + + if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_PASSWORD)) { + this._dialog.reaskPassword(); + return; + } + + this._closeDialog(); + + this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags); + this._dialog.connect('response', + (object, choice, password, remember) => { + let details = {}; + let response; + + if (choice == -1) { + response = Gio.MountOperationResult.ABORTED; + } else { + response = Gio.MountOperationResult.HANDLED; + + let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER; + details['password_save'] = GLib.Variant.new('u', passSave); + details['password'] = GLib.Variant.new('s', password); + } + + this._clearCurrentRequest(response, details); + }); + this._dialog.open(); + } + + /** + * AskQuestion: + * @id: an opaque ID identifying the object for which the operation is requested + * The ID must be unique in the context of the calling process. + * @message: the message to display + * @icon_name: the name of an icon to display + * @choices: an array of choice strings + * GetResponse: + * @response: a GMountOperationResult + * @response_details: a dictionary containing the response details as + * entered by the user. The dictionary MAY contain the following properties: + * - "choice" -> (i): the chosen answer among the array of strings passed in + * + * The dialog will stay visible until clients call the Close() method, or + * another dialog becomes visible. + * Calling AskQuestion again for the same id will have the effect to clear + * update the dialog with the new question. + */ + AskQuestionAsync(params, invocation) { + let [id, message, iconName, choices] = params; + + if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_QUESTION)) { + this._dialog.update(message, choices); + return; + } + + this._closeDialog(); + + this._dialog = new ShellMountQuestionDialog(this._createGIcon(iconName), message); + this._dialog.connect('response', (object, choice) => { + this._clearCurrentRequest(Gio.MountOperationResult.HANDLED, + { choice: GLib.Variant.new('i', choice) }); + }); + + this._dialog.update(message, choices); + this._dialog.open(); + } + + /** + * ShowProcesses: + * @id: an opaque ID identifying the object for which the operation is requested + * The ID must be unique in the context of the calling process. + * @message: the message to display + * @icon_name: the name of an icon to display + * @application_pids: the PIDs of the applications to display + * @choices: an array of choice strings + * @response: a GMountOperationResult + * @response_details: a dictionary containing the response details as + * entered by the user. The dictionary MAY contain the following properties: + * - "choice" -> (i): the chosen answer among the array of strings passed in + * + * The dialog will stay visible until clients call the Close() method, or + * another dialog becomes visible. + * Calling ShowProcesses again for the same id will have the effect to clear + * the existing dialog and update it with the new message and the new list + * of processes. + */ + ShowProcessesAsync(params, invocation) { + let [id, message, iconName, applicationPids, choices] = params; + + if (this._setCurrentRequest(invocation, id, ShellMountOperationType.SHOW_PROCESSES)) { + this._dialog.update(message, applicationPids, choices); + return; + } + + this._closeDialog(); + + this._dialog = new ShellProcessesDialog(this._createGIcon(iconName)); + this._dialog.connect('response', (object, choice) => { + let response; + let details = {}; + + if (choice == -1) { + response = Gio.MountOperationResult.ABORTED; + } else { + response = Gio.MountOperationResult.HANDLED; + details['choice'] = GLib.Variant.new('i', choice); + } + + this._clearCurrentRequest(response, details); + }); + + this._dialog.update(message, applicationPids, choices); + this._dialog.open(); + } + + /** + * Close: + * + * Closes a dialog previously opened by AskPassword, AskQuestion or ShowProcesses. + * If no dialog is open, does nothing. + */ + Close(params, invocation) { + this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {}); + this._closeDialog(); + } +}; diff --git a/js/ui/slider.js b/js/ui/slider.js new file mode 100644 index 0000000..f9fa732 --- /dev/null +++ b/js/ui/slider.js @@ -0,0 +1,212 @@ +/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ + +const { Atk, Clutter } = imports.gi; +const Signals = imports.signals; + +const BarLevel = imports.ui.barLevel; + +var SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */ + +var Slider = class extends BarLevel.BarLevel { + constructor(value) { + let params = { + styleClass: 'slider', + canFocus: true, + reactive: true, + accessibleRole: Atk.Role.SLIDER, + } + super(value, params) + + this.actor.connect('button-press-event', this._startDragging.bind(this)); + this.actor.connect('touch-event', this._touchDragging.bind(this)); + this.actor.connect('scroll-event', this._onScrollEvent.bind(this)); + this.actor.connect('key-press-event', this.onKeyPressEvent.bind(this)); + + this._releaseId = this._motionId = 0; + this._dragging = false; + + this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this)); + } + + _barLevelRepaint(area) { + super._barLevelRepaint(area); + + // Add handle + let cr = area.get_context(); + let themeNode = area.get_theme_node(); + let [width, height] = area.get_surface_size(); + + let handleRadius = themeNode.get_length('-slider-handle-radius'); + + let handleBorderWidth = themeNode.get_length('-slider-handle-border-width'); + let [hasHandleColor, handleBorderColor] = + themeNode.lookup_color('-slider-handle-border-color', false); + + const TAU = Math.PI * 2; + + let handleX = handleRadius + (width - 2 * handleRadius) * this._value / this._maxValue; + let handleY = height / 2; + + let color = themeNode.get_foreground_color(); + Clutter.cairo_set_source_color(cr, color); + cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI); + cr.fillPreserve(); + if (hasHandleColor && handleBorderWidth) { + Clutter.cairo_set_source_color(cr, handleBorderColor); + cr.setLineWidth(handleBorderWidth); + cr.stroke(); + } + cr.$dispose(); + } + + _startDragging(actor, event) { + return this.startDragging(event); + } + + startDragging(event) { + if (this._dragging) + return Clutter.EVENT_PROPAGATE; + + this._dragging = true; + + let device = event.get_device(); + let sequence = event.get_event_sequence(); + + if (sequence != null) + device.sequence_grab(sequence, this.actor); + else + device.grab(this.actor); + + this._grabbedDevice = device; + this._grabbedSequence = sequence; + + if (sequence == null) { + this._releaseId = this.actor.connect('button-release-event', this._endDragging.bind(this)); + this._motionId = this.actor.connect('motion-event', this._motionEvent.bind(this)); + } + + // We need to emit 'drag-begin' before moving the handle to make + // sure that no 'value-changed' signal is emitted before this one. + this.emit('drag-begin'); + + let absX, absY; + [absX, absY] = event.get_coords(); + this._moveHandle(absX, absY); + return Clutter.EVENT_STOP; + } + + _endDragging() { + if (this._dragging) { + if (this._releaseId) + this.actor.disconnect(this._releaseId); + if (this._motionId) + this.actor.disconnect(this._motionId); + + if (this._grabbedSequence != null) + this._grabbedDevice.sequence_ungrab(this._grabbedSequence); + else + this._grabbedDevice.ungrab(); + + this._grabbedSequence = null; + this._grabbedDevice = null; + this._dragging = false; + + this.emit('drag-end'); + } + return Clutter.EVENT_STOP; + } + + _touchDragging(actor, event) { + let device = event.get_device(); + let sequence = event.get_event_sequence(); + + if (!this._dragging && + event.type() == Clutter.EventType.TOUCH_BEGIN) { + this.startDragging(event); + return Clutter.EVENT_STOP; + } else if (device.sequence_get_grabbed_actor(sequence) == actor) { + if (event.type() == Clutter.EventType.TOUCH_UPDATE) + return this._motionEvent(actor, event); + else if (event.type() == Clutter.EventType.TOUCH_END) + return this._endDragging(); + } + + return Clutter.EVENT_PROPAGATE; + } + + scroll(event) { + let direction = event.get_scroll_direction(); + let delta; + + if (event.is_pointer_emulated()) + return Clutter.EVENT_PROPAGATE; + + if (direction == Clutter.ScrollDirection.DOWN) { + delta = -SLIDER_SCROLL_STEP; + } else if (direction == Clutter.ScrollDirection.UP) { + delta = +SLIDER_SCROLL_STEP; + } else if (direction == Clutter.ScrollDirection.SMOOTH) { + let [dx, dy] = event.get_scroll_delta(); + // Even though the slider is horizontal, use dy to match + // the UP/DOWN above. + delta = -dy * SLIDER_SCROLL_STEP; + } + + this._value = Math.min(Math.max(0, this._value + delta), this._maxValue); + + this.actor.queue_repaint(); + this.emit('value-changed', this._value); + return Clutter.EVENT_STOP; + } + + _onScrollEvent(actor, event) { + return this.scroll(event); + } + + _motionEvent(actor, event) { + let absX, absY; + [absX, absY] = event.get_coords(); + this._moveHandle(absX, absY); + return Clutter.EVENT_STOP; + } + + onKeyPressEvent(actor, event) { + let key = event.get_key_symbol(); + if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) { + let delta = key == Clutter.KEY_Right ? 0.1 : -0.1; + this._value = Math.max(0, Math.min(this._value + delta, this._maxValue)); + this.actor.queue_repaint(); + this.emit('drag-begin'); + this.emit('value-changed', this._value); + this.emit('drag-end'); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + _moveHandle(absX, absY) { + let relX, relY, sliderX, sliderY; + [sliderX, sliderY] = this.actor.get_transformed_position(); + relX = absX - sliderX; + relY = absY - sliderY; + + let width = this._barLevelWidth; + let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius'); + + let newvalue; + if (relX < handleRadius) + newvalue = 0; + else if (relX > width - handleRadius) + newvalue = 1; + else + newvalue = (relX - handleRadius) / (width - 2 * handleRadius); + this._value = newvalue * this._maxValue; + this.actor.queue_repaint(); + this.emit('value-changed', this._value); + } + + _getMinimumIncrement(actor) { + return 0.1; + } +}; +Signals.addSignalMethods(Slider.prototype); diff --git a/js/ui/status/accessibility.js b/js/ui/status/accessibility.js new file mode 100644 index 0000000..10223ec --- /dev/null +++ b/js/ui/status/accessibility.js @@ -0,0 +1,194 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GLib, GObject, St } = imports.gi; +const Mainloop = imports.mainloop; + +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +const A11Y_SCHEMA = 'org.gnome.desktop.a11y'; +const KEY_ALWAYS_SHOW = 'always-show-universal-access-status'; + +const A11Y_KEYBOARD_SCHEMA = 'org.gnome.desktop.a11y.keyboard'; +const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable'; +const KEY_BOUNCE_KEYS_ENABLED = 'bouncekeys-enable'; +const KEY_SLOW_KEYS_ENABLED = 'slowkeys-enable'; +const KEY_MOUSE_KEYS_ENABLED = 'mousekeys-enable'; + +const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications'; + +var DPI_FACTOR_LARGE = 1.25; + +const WM_SCHEMA = 'org.gnome.desktop.wm.preferences'; +const KEY_VISUAL_BELL = 'visual-bell'; + +const DESKTOP_INTERFACE_SCHEMA = 'org.gnome.desktop.interface'; +const KEY_GTK_THEME = 'gtk-theme'; +const KEY_ICON_THEME = 'icon-theme'; +const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor'; + +const HIGH_CONTRAST_THEME = 'HighContrast'; + +var ATIndicator = GObject.registerClass( +class ATIndicator extends PanelMenu.Button { + _init() { + super._init(0.0, _("Accessibility")); + + this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); + this._hbox.add_child(new St.Icon({ style_class: 'system-status-icon', + icon_name: 'preferences-desktop-accessibility-symbolic' })); + this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM)); + + this.actor.add_child(this._hbox); + + this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); + this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this)); + + let highContrast = this._buildHCItem(); + this.menu.addMenuItem(highContrast); + + let magnifier = this._buildItem(_("Zoom"), APPLICATIONS_SCHEMA, + 'screen-magnifier-enabled'); + this.menu.addMenuItem(magnifier); + + let textZoom = this._buildFontItem(); + this.menu.addMenuItem(textZoom); + + let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, + 'screen-reader-enabled'); + this.menu.addMenuItem(screenReader); + + let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA, + 'screen-keyboard-enabled'); + this.menu.addMenuItem(screenKeyboard); + + let visualBell = this._buildItem(_("Visual Alerts"), WM_SCHEMA, KEY_VISUAL_BELL); + this.menu.addMenuItem(visualBell); + + let stickyKeys = this._buildItem(_("Sticky Keys"), A11Y_KEYBOARD_SCHEMA, KEY_STICKY_KEYS_ENABLED); + this.menu.addMenuItem(stickyKeys); + + let slowKeys = this._buildItem(_("Slow Keys"), A11Y_KEYBOARD_SCHEMA, KEY_SLOW_KEYS_ENABLED); + this.menu.addMenuItem(slowKeys); + + let bounceKeys = this._buildItem(_("Bounce Keys"), A11Y_KEYBOARD_SCHEMA, KEY_BOUNCE_KEYS_ENABLED); + this.menu.addMenuItem(bounceKeys); + + let mouseKeys = this._buildItem(_("Mouse Keys"), A11Y_KEYBOARD_SCHEMA, KEY_MOUSE_KEYS_ENABLED); + this.menu.addMenuItem(mouseKeys); + + this._syncMenuVisibility(); + } + + _syncMenuVisibility() { + this._syncMenuVisibilityIdle = 0; + + let alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW); + let items = this.menu._getMenuItems(); + + this.actor.visible = alwaysShow || items.some(f => !!f.state); + + return GLib.SOURCE_REMOVE; + } + + _queueSyncMenuVisibility() { + if (this._syncMenuVisibilityIdle) + return; + + this._syncMenuVisibilityIdle = Mainloop.idle_add(this._syncMenuVisibility.bind(this)); + GLib.Source.set_name_by_id(this._syncMenuVisibilityIdle, '[gnome-shell] this._syncMenuVisibility'); + } + + _buildItemExtended(string, initial_value, writable, on_set) { + let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value); + if (!writable) + widget.actor.reactive = false; + else + widget.connect('toggled', item => { + on_set(item.state); + }); + return widget; + } + + _buildItem(string, schema, key) { + let settings = new Gio.Settings({ schema_id: schema }); + settings.connect('changed::'+key, () => { + widget.setToggleState(settings.get_boolean(key)); + + this._queueSyncMenuVisibility(); + }); + + let widget = this._buildItemExtended(string, + settings.get_boolean(key), + settings.is_writable(key), + enabled => settings.set_boolean(key, enabled)); + return widget; + } + + _buildHCItem() { + let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); + interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => { + let value = interfaceSettings.get_string(KEY_GTK_THEME); + if (value == HIGH_CONTRAST_THEME) { + highContrast.setToggleState(true); + } else { + highContrast.setToggleState(false); + gtkTheme = value; + } + + this._queueSyncMenuVisibility(); + }); + interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => { + let value = interfaceSettings.get_string(KEY_ICON_THEME); + if (value != HIGH_CONTRAST_THEME) + iconTheme = value; + }); + + let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME); + let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME); + let hasHC = (gtkTheme == HIGH_CONTRAST_THEME); + let highContrast = this._buildItemExtended( + _("High Contrast"), + hasHC, + interfaceSettings.is_writable(KEY_GTK_THEME) && + interfaceSettings.is_writable(KEY_ICON_THEME), + enabled => { + if (enabled) { + interfaceSettings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME); + interfaceSettings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME); + } else if(!hasHC) { + interfaceSettings.set_string(KEY_GTK_THEME, gtkTheme); + interfaceSettings.set_string(KEY_ICON_THEME, iconTheme); + } else { + interfaceSettings.reset(KEY_GTK_THEME); + interfaceSettings.reset(KEY_ICON_THEME); + } + }); + return highContrast; + } + + _buildFontItem() { + let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); + settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => { + let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR); + let active = (factor > 1.0); + widget.setToggleState(active); + + this._queueSyncMenuVisibility(); + }); + + let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR); + let initial_setting = (factor > 1.0); + let widget = this._buildItemExtended(_("Large Text"), + initial_setting, + settings.is_writable(KEY_TEXT_SCALING_FACTOR), + enabled => { + if (enabled) + settings.set_double(KEY_TEXT_SCALING_FACTOR, + DPI_FACTOR_LARGE); + else + settings.reset(KEY_TEXT_SCALING_FACTOR); + }); + return widget; + } +}); diff --git a/js/ui/status/bluetooth.js b/js/ui/status/bluetooth.js new file mode 100644 index 0000000..6282234 --- /dev/null +++ b/js/ui/status/bluetooth.js @@ -0,0 +1,135 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, GnomeBluetooth } = imports.gi; + +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const BUS_NAME = 'org.gnome.SettingsDaemon.Rfkill'; +const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill'; + +const RfkillManagerInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Rfkill'); +const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface); + +const HAD_BLUETOOTH_DEVICES_SETUP = 'had-bluetooth-devices-setup'; + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'bluetooth-active-symbolic'; + this._hadSetupDevices = global.settings.get_boolean(HAD_BLUETOOTH_DEVICES_SETUP); + + this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + + this._sync(); + }); + this._proxy.connect('g-properties-changed', this._sync.bind(this)); + + this._item = new PopupMenu.PopupSubMenuMenuItem(_("Bluetooth"), true); + this._item.icon.icon_name = 'bluetooth-active-symbolic'; + + this._toggleItem = new PopupMenu.PopupMenuItem(''); + this._toggleItem.connect('activate', () => { + this._proxy.BluetoothAirplaneMode = !this._proxy.BluetoothAirplaneMode; + }); + this._item.menu.addMenuItem(this._toggleItem); + + this._item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-bluetooth-panel.desktop'); + this.menu.addMenuItem(this._item); + + this._client = new GnomeBluetooth.Client(); + this._model = this._client.get_model(); + this._model.connect('row-changed', this._sync.bind(this)); + this._model.connect('row-deleted', this._sync.bind(this)); + this._model.connect('row-inserted', this._sync.bind(this)); + Main.sessionMode.connect('updated', this._sync.bind(this)); + this._sync(); + } + + _getDefaultAdapter() { + let [ret, iter] = this._model.get_iter_first(); + while (ret) { + let isDefault = this._model.get_value(iter, + GnomeBluetooth.Column.DEFAULT); + let isPowered = this._model.get_value(iter, + GnomeBluetooth.Column.POWERED); + if (isDefault && isPowered) + return iter; + ret = this._model.iter_next(iter); + } + return null; + } + + // nDevices is the number of devices setup for the current default + // adapter if one exists and is powered. If unpowered or unavailable, + // nDevice is "1" if it had setup devices associated to it the last + // time it was seen, and "-1" if not. + // + // nConnectedDevices is the number of devices connected to the default + // adapter if one exists and is powered, or -1 if it's not available. + _getNDevices() { + let adapter = this._getDefaultAdapter(); + if (!adapter) + return [ this._hadSetupDevices ? 1 : -1, -1 ]; + + let nConnectedDevices = 0; + let nDevices = 0; + let [ret, iter] = this._model.iter_children(adapter); + while (ret) { + let isConnected = this._model.get_value(iter, + GnomeBluetooth.Column.CONNECTED); + if (isConnected) + nConnectedDevices++; + + let isPaired = this._model.get_value(iter, + GnomeBluetooth.Column.PAIRED); + let isTrusted = this._model.get_value(iter, + GnomeBluetooth.Column.TRUSTED); + if (isPaired || isTrusted) + nDevices++; + ret = this._model.iter_next(iter); + } + + if (this._hadSetupDevices != (nDevices > 0)) { + this._hadSetupDevices = !this._hadSetupDevices; + global.settings.set_boolean(HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices); + } + + return [ nDevices, nConnectedDevices]; + } + + _sync() { + let [ nDevices, nConnectedDevices ] = this._getNDevices(); + let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + + this.menu.setSensitive(sensitive); + this._indicator.visible = nConnectedDevices > 0; + + // Remember if there were setup devices and show the menu + // if we've seen setup devices and we're not hard blocked + if (nDevices > 0) + this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode; + else + this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; + + if (nConnectedDevices > 0) + /* Translators: this is the number of connected bluetooth devices */ + this._item.label.text = ngettext("%d Connected", "%d Connected", nConnectedDevices).format(nConnectedDevices); + else if (nConnectedDevices == -1) + this._item.label.text = _("Off"); + else + this._item.label.text = _("On"); + + this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off"); + } +}; diff --git a/js/ui/status/brightness.js b/js/ui/status/brightness.js new file mode 100644 index 0000000..025f299 --- /dev/null +++ b/js/ui/status/brightness.js @@ -0,0 +1,62 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Gio, St } = imports.gi; + +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; +const Slider = imports.ui.slider; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const BUS_NAME = 'org.gnome.SettingsDaemon.Power'; +const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power'; + +const BrightnessInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Power.Screen'); +const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface); + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super('display-brightness-symbolic'); + this._proxy = new BrightnessProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + + this._proxy.connect('g-properties-changed', this._sync.bind(this)); + this._sync(); + }); + + this._item = new PopupMenu.PopupBaseMenuItem({ activate: false }); + this.menu.addMenuItem(this._item); + + this._slider = new Slider.Slider(0); + this._slider.connect('value-changed', this._sliderChanged.bind(this)); + this._slider.actor.accessible_name = _("Brightness"); + + let icon = new St.Icon({ icon_name: 'display-brightness-symbolic', + style_class: 'popup-menu-icon' }); + this._item.actor.add(icon); + this._item.actor.add(this._slider.actor, { expand: true }); + this._item.actor.connect('button-press-event', (actor, event) => { + return this._slider.startDragging(event); + }); + this._item.actor.connect('key-press-event', (actor, event) => { + return this._slider.onKeyPressEvent(actor, event); + }); + + } + + _sliderChanged(slider, value) { + let percent = value * 100; + this._proxy.Brightness = percent; + } + + _sync() { + let visible = this._proxy.Brightness >= 0; + this._item.actor.visible = visible; + if (visible) + this._slider.setValue(this._proxy.Brightness / 100.0); + } +}; diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js new file mode 100644 index 0000000..c939065 --- /dev/null +++ b/js/ui/status/keyboard.js @@ -0,0 +1,1065 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, IBus, Meta, Shell, St } = imports.gi; +const Gettext = imports.gettext; +const Signals = imports.signals; + +const IBusManager = imports.misc.ibusManager; +const KeyboardManager = imports.misc.keyboardManager; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const PanelMenu = imports.ui.panelMenu; +const SwitcherPopup = imports.ui.switcherPopup; +const Util = imports.misc.util; + +const INPUT_SOURCE_TYPE_XKB = 'xkb'; +const INPUT_SOURCE_TYPE_IBUS = 'ibus'; + +var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem { + constructor(displayName, shortName) { + super(); + + this.label = new St.Label({ text: displayName }); + this.indicator = new St.Label({ text: shortName }); + this.actor.add(this.label, { expand: true }); + this.actor.add(this.indicator); + this.actor.label_actor = this.label; + } +}; + +var InputSource = class { + constructor(type, id, displayName, shortName, index) { + this.type = type; + this.id = id; + this.displayName = displayName; + this._shortName = shortName; + this.index = index; + + this.properties = null; + + this.xkbId = this._getXkbId(); + } + + get shortName() { + return this._shortName; + } + + set shortName(v) { + this._shortName = v; + this.emit('changed'); + } + + activate(interactive) { + this.emit('activate', !!interactive); + } + + _getXkbId() { + let engineDesc = IBusManager.getIBusManager().getEngineDesc(this.id); + if (!engineDesc) + return this.id; + + if (engineDesc.variant && engineDesc.variant.length > 0) + return engineDesc.layout + '+' + engineDesc.variant; + else + return engineDesc.layout; + } +}; +Signals.addSignalMethods(InputSource.prototype); + +var InputSourcePopup = GObject.registerClass( +class InputSourcePopup extends SwitcherPopup.SwitcherPopup { + _init(items, action, actionBackward) { + super._init(items); + + this._action = action; + this._actionBackward = actionBackward; + + this._switcherList = new InputSourceSwitcher(this._items); + } + + _keyPressHandler(keysym, action) { + if (action == this._action) + this._select(this._next()); + else if (action == this._actionBackward) + this._select(this._previous()); + else if (keysym == Clutter.Left) + this._select(this._previous()); + else if (keysym == Clutter.Right) + this._select(this._next()); + else + return Clutter.EVENT_PROPAGATE; + + return Clutter.EVENT_STOP; + } + + _finish() { + super._finish(); + + this._items[this._selectedIndex].activate(true); + } +}); + +var InputSourceSwitcher = GObject.registerClass( +class InputSourceSwitcher extends SwitcherPopup.SwitcherList { + _init(items) { + super._init(true); + + for (let i = 0; i < items.length; i++) + this._addIcon(items[i]); + } + + _addIcon(item) { + let box = new St.BoxLayout({ vertical: true }); + + let bin = new St.Bin({ style_class: 'input-source-switcher-symbol' }); + let symbol = new St.Label({ text: item.shortName }); + bin.set_child(symbol); + box.add(bin, { x_fill: false, y_fill: false } ); + + let text = new St.Label({ text: item.displayName }); + box.add(text, { x_fill: false }); + + this.addItem(box, text); + } +}); + +var InputSourceSettings = class { + constructor() { + if (new.target === InputSourceSettings) + throw new TypeError('Cannot instantiate abstract class ' + new.target.name); + } + + _emitInputSourcesChanged() { + this.emit('input-sources-changed'); + } + + _emitKeyboardOptionsChanged() { + this.emit('keyboard-options-changed'); + } + + _emitPerWindowChanged() { + this.emit('per-window-changed'); + } + + get inputSources() { + return []; + } + + get mruSources() { + return []; + } + + set mruSources(sourcesList) { + // do nothing + } + + get keyboardOptions() { + return []; + } + + get perWindow() { + return false; + } +}; +Signals.addSignalMethods(InputSourceSettings.prototype); + +var InputSourceSystemSettings = class extends InputSourceSettings { + constructor() { + super(); + + this._BUS_NAME = 'org.freedesktop.locale1'; + this._BUS_PATH = '/org/freedesktop/locale1'; + this._BUS_IFACE = 'org.freedesktop.locale1'; + this._BUS_PROPS_IFACE = 'org.freedesktop.DBus.Properties'; + + this._layouts = ''; + this._variants = ''; + this._options = ''; + + this._reload(); + + Gio.DBus.system.signal_subscribe(this._BUS_NAME, + this._BUS_PROPS_IFACE, + 'PropertiesChanged', + this._BUS_PATH, + null, + Gio.DBusSignalFlags.NONE, + this._reload.bind(this)); + } + + _reload() { + Gio.DBus.system.call(this._BUS_NAME, + this._BUS_PATH, + this._BUS_PROPS_IFACE, + 'GetAll', + new GLib.Variant('(s)', [this._BUS_IFACE]), + null, Gio.DBusCallFlags.NONE, -1, null, + (conn, result) => { + let props; + try { + props = conn.call_finish(result).deep_unpack()[0]; + } catch(e) { + log('Could not get properties from ' + this._BUS_NAME); + return; + } + let layouts = props['X11Layout'].unpack(); + let variants = props['X11Variant'].unpack(); + let options = props['X11Options'].unpack(); + + if (layouts != this._layouts || + variants != this._variants) { + this._layouts = layouts; + this._variants = variants; + this._emitInputSourcesChanged(); + } + if (options != this._options) { + this._options = options; + this._emitKeyboardOptionsChanged(); + } + }); + } + + get inputSources() { + let sourcesList = []; + let layouts = this._layouts.split(','); + let variants = this._variants.split(','); + + for (let i = 0; i < layouts.length && !!layouts[i]; i++) { + let id = layouts[i]; + if (!!variants[i]) + id += '+' + variants[i]; + sourcesList.push({ type: INPUT_SOURCE_TYPE_XKB, id: id }); + } + return sourcesList; + } + + get keyboardOptions() { + return this._options.split(','); + } +}; + +var InputSourceSessionSettings = class extends InputSourceSettings { + constructor() { + super(); + + this._DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources'; + this._KEY_INPUT_SOURCES = 'sources'; + this._KEY_MRU_SOURCES = 'mru-sources'; + this._KEY_KEYBOARD_OPTIONS = 'xkb-options'; + this._KEY_PER_WINDOW = 'per-window'; + + this._settings = new Gio.Settings({ schema_id: this._DESKTOP_INPUT_SOURCES_SCHEMA }); + this._settings.connect('changed::' + this._KEY_INPUT_SOURCES, this._emitInputSourcesChanged.bind(this)); + this._settings.connect('changed::' + this._KEY_KEYBOARD_OPTIONS, this._emitKeyboardOptionsChanged.bind(this)); + this._settings.connect('changed::' + this._KEY_PER_WINDOW, this._emitPerWindowChanged.bind(this)); + } + + _getSourcesList(key) { + let sourcesList = []; + let sources = this._settings.get_value(key); + let nSources = sources.n_children(); + + for (let i = 0; i < nSources; i++) { + let [type, id] = sources.get_child_value(i).deep_unpack(); + sourcesList.push({ type: type, id: id }); + } + return sourcesList; + } + + get inputSources() { + return this._getSourcesList(this._KEY_INPUT_SOURCES); + } + + get mruSources() { + return this._getSourcesList(this._KEY_MRU_SOURCES); + } + + set mruSources(sourcesList) { + let sources = GLib.Variant.new('a(ss)', sourcesList); + this._settings.set_value(this._KEY_MRU_SOURCES, sources); + } + + get keyboardOptions() { + return this._settings.get_strv(this._KEY_KEYBOARD_OPTIONS); + } + + get perWindow() { + return this._settings.get_boolean(this._KEY_PER_WINDOW); + } +}; + +var InputSourceManager = class { + constructor() { + // All valid input sources currently in the gsettings + // KEY_INPUT_SOURCES list indexed by their index there + this._inputSources = {}; + // All valid input sources currently in the gsettings + // KEY_INPUT_SOURCES list of type INPUT_SOURCE_TYPE_IBUS + // indexed by the IBus ID + this._ibusSources = {}; + + this._currentSource = null; + + // All valid input sources currently in the gsettings + // KEY_INPUT_SOURCES list ordered by most recently used + this._mruSources = []; + this._mruSourcesBackup = null; + this._keybindingAction = + Main.wm.addKeybinding('switch-input-source', + new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }), + Meta.KeyBindingFlags.NONE, + Shell.ActionMode.ALL, + this._switchInputSource.bind(this)); + this._keybindingActionBackward = + Main.wm.addKeybinding('switch-input-source-backward', + new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }), + Meta.KeyBindingFlags.IS_REVERSED, + Shell.ActionMode.ALL, + this._switchInputSource.bind(this)); + if (Main.sessionMode.isGreeter) + this._settings = new InputSourceSystemSettings(); + else + this._settings = new InputSourceSessionSettings(); + this._settings.connect('input-sources-changed', this._inputSourcesChanged.bind(this)); + this._settings.connect('keyboard-options-changed', this._keyboardOptionsChanged.bind(this)); + + this._xkbInfo = KeyboardManager.getXkbInfo(); + this._keyboardManager = KeyboardManager.getKeyboardManager(); + + this._ibusReady = false; + this._ibusManager = IBusManager.getIBusManager(); + this._ibusManager.connect('ready', this._ibusReadyCallback.bind(this)); + this._ibusManager.connect('properties-registered', this._ibusPropertiesRegistered.bind(this)); + this._ibusManager.connect('property-updated', this._ibusPropertyUpdated.bind(this)); + this._ibusManager.connect('set-content-type', this._ibusSetContentType.bind(this)); + + global.display.connect('modifiers-accelerator-activated', this._modifiersSwitcher.bind(this)); + + this._sourcesPerWindow = false; + this._focusWindowNotifyId = 0; + this._overviewShowingId = 0; + this._overviewHiddenId = 0; + this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this)); + this._sourcesPerWindowChanged(); + this._disableIBus = false; + this._reloading = false; + } + + reload() { + this._reloading = true; + this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions); + this._inputSourcesChanged(); + this._reloading = false; + } + + _ibusReadyCallback(im, ready) { + if (this._ibusReady == ready) + return; + + this._ibusReady = ready; + this._mruSources = []; + this._inputSourcesChanged(); + } + + _modifiersSwitcher() { + let sourceIndexes = Object.keys(this._inputSources); + if (sourceIndexes.length == 0) { + KeyboardManager.releaseKeyboard(); + return true; + } + + let is = this._currentSource; + if (!is) + is = this._inputSources[sourceIndexes[0]]; + + let nextIndex = is.index + 1; + if (nextIndex > sourceIndexes[sourceIndexes.length - 1]) + nextIndex = 0; + + while (!(is = this._inputSources[nextIndex])) + nextIndex += 1; + + is.activate(true); + return true; + } + + _switchInputSource(display, window, binding) { + if (this._mruSources.length < 2) + return; + + // HACK: Fall back on simple input source switching since we + // can't show a popup switcher while a GrabHelper grab is in + // effect without considerable work to consolidate the usage + // of pushModal/popModal and grabHelper. See + // https://bugzilla.gnome.org/show_bug.cgi?id=695143 . + if (Main.actionMode == Shell.ActionMode.POPUP) { + this._modifiersSwitcher(); + return; + } + + let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward); + if (!popup.show(binding.is_reversed(), binding.get_name(), binding.get_mask())) + popup.fadeAndDestroy(); + } + + _keyboardOptionsChanged() { + this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions); + this._keyboardManager.reapply(); + } + + _updateMruSettings() { + // If IBus is not ready we don't have a full picture of all + // the available sources, so don't update the setting + if (!this._ibusReady) + return; + + // If IBus is temporarily disabled, don't update the setting + if (this._disableIBus) + return; + + let sourcesList = []; + for (let i = 0; i < this._mruSources.length; ++i) { + let source = this._mruSources[i]; + sourcesList.push([source.type, source.id]); + } + + this._settings.mruSources = sourcesList; + } + + _currentInputSourceChanged(newSource) { + let oldSource; + [oldSource, this._currentSource] = [this._currentSource, newSource]; + + this.emit('current-source-changed', oldSource); + + for (let i = 1; i < this._mruSources.length; ++i) + if (this._mruSources[i] == newSource) { + let currentSource = this._mruSources.splice(i, 1); + this._mruSources = currentSource.concat(this._mruSources); + break; + } + + this._changePerWindowSource(); + } + + activateInputSource(is, interactive) { + // The focus changes during holdKeyboard/releaseKeyboard may trick + // the client into hiding UI containing the currently focused entry. + // So holdKeyboard/releaseKeyboard are not called when + // 'set-content-type' signal is received. + // E.g. Focusing on a password entry in a popup in Xorg Firefox + // will emit 'set-content-type' signal. + // https://gitlab.gnome.org/GNOME/gnome-shell/issues/391 + if (!this._reloading) + KeyboardManager.holdKeyboard(); + this._keyboardManager.apply(is.xkbId); + + // All the "xkb:..." IBus engines simply "echo" back symbols, + // despite their naming implying differently, so we always set + // one in order for XIM applications to work given that we set + // XMODIFIERS=@im=ibus in the first place so that they can + // work without restarting when/if the user adds an IBus input + // source. + let engine; + if (is.type == INPUT_SOURCE_TYPE_IBUS) + engine = is.id; + else + engine = 'xkb:us::eng'; + + if (!this._reloading) + this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); + else + this._ibusManager.setEngine(engine); + this._currentInputSourceChanged(is); + + if (interactive) + this._updateMruSettings(); + } + + _updateMruSources() { + let sourcesList = []; + for (let i in this._inputSources) + sourcesList.push(this._inputSources[i]); + + this._keyboardManager.setUserLayouts(sourcesList.map(x => x.xkbId)); + + if (!this._disableIBus && this._mruSourcesBackup) { + this._mruSources = this._mruSourcesBackup; + this._mruSourcesBackup = null; + } + + // Initialize from settings when we have no MRU sources list + if (this._mruSources.length == 0) { + let mruSettings = this._settings.mruSources; + for (let i = 0; i < mruSettings.length; i++) { + let mruSettingSource = mruSettings[i]; + let mruSource = null; + + for (let j = 0; j < sourcesList.length; j++) { + let source = sourcesList[j]; + if (source.type == mruSettingSource.type && + source.id == mruSettingSource.id) { + mruSource = source; + break; + } + } + + if (mruSource) + this._mruSources.push(mruSource); + } + } + + let mruSources = []; + for (let i = 0; i < this._mruSources.length; i++) { + for (let j = 0; j < sourcesList.length; j++) + if (this._mruSources[i].type == sourcesList[j].type && + this._mruSources[i].id == sourcesList[j].id) { + mruSources = mruSources.concat(sourcesList.splice(j, 1)); + break; + } + } + this._mruSources = mruSources.concat(sourcesList); + } + + _inputSourcesChanged() { + let sources = this._settings.inputSources; + let nSources = sources.length; + + this._currentSource = null; + this._inputSources = {}; + this._ibusSources = {}; + + let infosList = []; + for (let i = 0; i < nSources; i++) { + let displayName; + let shortName; + let type = sources[i].type; + let id = sources[i].id; + let exists = false; + + if (type == INPUT_SOURCE_TYPE_XKB) { + [exists, displayName, shortName, , ] = + this._xkbInfo.get_layout_info(id); + } else if (type == INPUT_SOURCE_TYPE_IBUS) { + if (this._disableIBus) + continue; + let engineDesc = this._ibusManager.getEngineDesc(id); + if (engineDesc) { + let language = IBus.get_language_name(engineDesc.get_language()); + let longName = engineDesc.get_longname(); + let textdomain = engineDesc.get_textdomain(); + if (textdomain != '') + longName = Gettext.dgettext(textdomain, longName); + exists = true; + displayName = '%s (%s)'.format(language, longName); + shortName = this._makeEngineShortName(engineDesc); + } + } + + if (exists) + infosList.push({ type: type, id: id, displayName: displayName, shortName: shortName }); + } + + if (infosList.length == 0) { + let type = INPUT_SOURCE_TYPE_XKB; + let id = KeyboardManager.DEFAULT_LAYOUT; + let [ , displayName, shortName, , ] = this._xkbInfo.get_layout_info(id); + infosList.push({ type: type, id: id, displayName: displayName, shortName: shortName }); + } + + let inputSourcesByShortName = {}; + for (let i = 0; i < infosList.length; i++) { + let is = new InputSource(infosList[i].type, + infosList[i].id, + infosList[i].displayName, + infosList[i].shortName, + i); + is.connect('activate', this.activateInputSource.bind(this)); + + if (!(is.shortName in inputSourcesByShortName)) + inputSourcesByShortName[is.shortName] = []; + inputSourcesByShortName[is.shortName].push(is); + + this._inputSources[is.index] = is; + + if (is.type == INPUT_SOURCE_TYPE_IBUS) + this._ibusSources[is.id] = is; + } + + for (let i in this._inputSources) { + let is = this._inputSources[i]; + if (inputSourcesByShortName[is.shortName].length > 1) { + let sub = inputSourcesByShortName[is.shortName].indexOf(is) + 1; + is.shortName += String.fromCharCode(0x2080 + sub); + } + } + + this.emit('sources-changed'); + + this._updateMruSources(); + + if (this._mruSources.length > 0) + this._mruSources[0].activate(false); + + // All ibus engines are preloaded here to reduce the launching time + // when users switch the input sources. + this._ibusManager.preloadEngines(Object.keys(this._ibusSources)); + } + + _makeEngineShortName(engineDesc) { + let symbol = engineDesc.get_symbol(); + if (symbol && symbol[0]) + return symbol; + + let langCode = engineDesc.get_language().split('_', 1)[0]; + if (langCode.length == 2 || langCode.length == 3) + return langCode.toLowerCase(); + + return String.fromCharCode(0x2328); // keyboard glyph + } + + _ibusPropertiesRegistered(im, engineName, props) { + let source = this._ibusSources[engineName]; + if (!source) + return; + + source.properties = props; + + if (source == this._currentSource) + this.emit('current-source-changed', null); + } + + _ibusPropertyUpdated(im, engineName, prop) { + let source = this._ibusSources[engineName]; + if (!source) + return; + + if (this._updateSubProperty(source.properties, prop) && + source == this._currentSource) + this.emit('current-source-changed', null); + } + + _updateSubProperty(props, prop) { + if (!props) + return false; + + let p; + for (let i = 0; (p = props.get(i)) != null; ++i) { + if (p.get_key() == prop.get_key() && p.get_prop_type() == prop.get_prop_type()) { + p.update(prop); + return true; + } else if (p.get_prop_type() == IBus.PropType.MENU) { + if (this._updateSubProperty(p.get_sub_props(), prop)) + return true; + } + } + return false; + } + + _ibusSetContentType(im, purpose, hints) { + if (purpose == IBus.InputPurpose.PASSWORD) { + if (Object.keys(this._inputSources).length == Object.keys(this._ibusSources).length) + return; + + if (this._disableIBus) + return; + this._disableIBus = true; + this._mruSourcesBackup = this._mruSources.slice(); + } else { + if (!this._disableIBus) + return; + this._disableIBus = false; + } + this.reload(); + } + + _getNewInputSource(current) { + let sourceIndexes = Object.keys(this._inputSources); + if (sourceIndexes.length == 0) + return null; + + if (current) { + for (let i in this._inputSources) { + let is = this._inputSources[i]; + if (is.type == current.type && + is.id == current.id) + return is; + } + } + + return this._inputSources[sourceIndexes[0]]; + } + + _getCurrentWindow() { + if (Main.overview.visible) + return Main.overview; + else + return global.display.focus_window; + } + + _setPerWindowInputSource() { + let window = this._getCurrentWindow(); + if (!window) + return; + + if (window._inputSources != this._inputSources) { + window._inputSources = this._inputSources; + window._currentSource = this._getNewInputSource(window._currentSource); + } + + if (window._currentSource) + window._currentSource.activate(false); + } + + _sourcesPerWindowChanged() { + this._sourcesPerWindow = this._settings.perWindow; + + if (this._sourcesPerWindow && this._focusWindowNotifyId == 0) { + this._focusWindowNotifyId = global.display.connect('notify::focus-window', + this._setPerWindowInputSource.bind(this)); + this._overviewShowingId = Main.overview.connect('showing', + this._setPerWindowInputSource.bind(this)); + this._overviewHiddenId = Main.overview.connect('hidden', + this._setPerWindowInputSource.bind(this)); + } else if (!this._sourcesPerWindow && this._focusWindowNotifyId != 0) { + global.display.disconnect(this._focusWindowNotifyId); + this._focusWindowNotifyId = 0; + Main.overview.disconnect(this._overviewShowingId); + this._overviewShowingId = 0; + Main.overview.disconnect(this._overviewHiddenId); + this._overviewHiddenId = 0; + + let windows = global.get_window_actors().map(w => w.meta_window); + for (let i = 0; i < windows.length; ++i) { + delete windows[i]._inputSources; + delete windows[i]._currentSource; + } + delete Main.overview._inputSources; + delete Main.overview._currentSource; + } + } + + _changePerWindowSource() { + if (!this._sourcesPerWindow) + return; + + let window = this._getCurrentWindow(); + if (!window) + return; + + window._inputSources = this._inputSources; + window._currentSource = this._currentSource; + } + + get currentSource() { + return this._currentSource; + } + + get inputSources() { + return this._inputSources; + } +}; +Signals.addSignalMethods(InputSourceManager.prototype); + +let _inputSourceManager = null; + +function getInputSourceManager() { + if (_inputSourceManager == null) + _inputSourceManager = new InputSourceManager(); + return _inputSourceManager; +} + +var InputSourceIndicatorContainer = GObject.registerClass( +class InputSourceIndicatorContainer extends St.Widget { + + vfunc_get_preferred_width(forHeight) { + // Here, and in vfunc_get_preferred_height, we need to query + // for the height of all children, but we ignore the results + // for those we don't actually display. + return this.get_children().reduce((maxWidth, child) => { + let width = child.get_preferred_width(forHeight); + return [Math.max(maxWidth[0], width[0]), + Math.max(maxWidth[1], width[1])]; + }, [0, 0]); + } + + vfunc_get_preferred_height(forWidth) { + return this.get_children().reduce((maxHeight, child) => { + let height = child.get_preferred_height(forWidth); + return [Math.max(maxHeight[0], height[0]), + Math.max(maxHeight[1], height[1])]; + }, [0, 0]); + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + // translate box to (0, 0) + box.x2 -= box.x1; + box.x1 = 0; + box.y2 -= box.y1; + box.y1 = 0; + + this.get_children().forEach(c => { + c.allocate_align_fill(box, 0.5, 0.5, false, false, flags); + }); + } +}); + +var InputSourceIndicator = GObject.registerClass( +class InputSourceIndicator extends PanelMenu.Button { + _init() { + super._init(0.0, _("Keyboard")); + + this.connect('destroy', this._onDestroy.bind(this)); + + this._menuItems = {}; + this._indicatorLabels = {}; + + this._container = new InputSourceIndicatorContainer(); + + this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); + this._hbox.add_child(this._container); + this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM)); + + this.actor.add_child(this._hbox); + + this._propSeparator = new PopupMenu.PopupSeparatorMenuItem(); + this.menu.addMenuItem(this._propSeparator); + this._propSection = new PopupMenu.PopupMenuSection(); + this.menu.addMenuItem(this._propSection); + this._propSection.actor.hide(); + + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), this._showLayout.bind(this)); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + + this._inputSourceManager = getInputSourceManager(); + this._inputSourceManagerSourcesChangedId = + this._inputSourceManager.connect('sources-changed', this._sourcesChanged.bind(this)); + this._inputSourceManagerCurrentSourceChangedId = + this._inputSourceManager.connect('current-source-changed', this._currentSourceChanged.bind(this)); + this._inputSourceManager.reload(); + } + + _onDestroy() { + if (this._inputSourceManager) { + this._inputSourceManager.disconnect(this._inputSourceManagerSourcesChangedId); + this._inputSourceManager.disconnect(this._inputSourceManagerCurrentSourceChangedId); + this._inputSourceManager = null; + } + } + + _sessionUpdated() { + // re-using "allowSettings" for the keyboard layout is a bit shady, + // but at least for now it is used as "allow popping up windows + // from shell menus"; we can always add a separate sessionMode + // option if need arises. + this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings; + } + + _sourcesChanged() { + for (let i in this._menuItems) + this._menuItems[i].destroy(); + for (let i in this._indicatorLabels) + this._indicatorLabels[i].destroy(); + + this._menuItems = {}; + this._indicatorLabels = {}; + + let menuIndex = 0; + for (let i in this._inputSourceManager.inputSources) { + let is = this._inputSourceManager.inputSources[i]; + + let menuItem = new LayoutMenuItem(is.displayName, is.shortName); + menuItem.connect('activate', () => { is.activate(true); }); + + let indicatorLabel = new St.Label({ text: is.shortName, + visible: false }); + + this._menuItems[i] = menuItem; + this._indicatorLabels[i] = indicatorLabel; + is.connect('changed', () => { + menuItem.indicator.set_text(is.shortName); + indicatorLabel.set_text(is.shortName); + }); + + this.menu.addMenuItem(menuItem, menuIndex++); + this._container.add_actor(indicatorLabel); + } + } + + _currentSourceChanged(manager, oldSource) { + let nVisibleSources = Object.keys(this._inputSourceManager.inputSources).length; + let newSource = this._inputSourceManager.currentSource; + + if (oldSource) { + this._menuItems[oldSource.index].setOrnament(PopupMenu.Ornament.NONE); + this._indicatorLabels[oldSource.index].hide(); + } + + if (!newSource || (nVisibleSources < 2 && !newSource.properties)) { + // This source index might be invalid if we weren't able + // to build a menu item for it, so we hide ourselves since + // we can't fix it here. *shrug* + + // We also hide if we have only one visible source unless + // it's an IBus source with properties. + this.menu.close(); + this.actor.hide(); + return; + } + + this.actor.show(); + + this._buildPropSection(newSource.properties); + + this._menuItems[newSource.index].setOrnament(PopupMenu.Ornament.DOT); + this._indicatorLabels[newSource.index].show(); + } + + _buildPropSection(properties) { + this._propSeparator.actor.hide(); + this._propSection.actor.hide(); + this._propSection.removeAll(); + + this._buildPropSubMenu(this._propSection, properties); + + if (!this._propSection.isEmpty()) { + this._propSection.actor.show(); + this._propSeparator.actor.show(); + } + } + + _buildPropSubMenu(menu, props) { + if (!props) + return; + + let ibusManager = IBusManager.getIBusManager(); + let radioGroup = []; + let p; + for (let i = 0; (p = props.get(i)) != null; ++i) { + let prop = p; + + if (!prop.get_visible()) + continue; + + if (prop.get_key() == 'InputMode') { + let text; + if (prop.get_symbol) + text = prop.get_symbol().get_text(); + else + text = prop.get_label().get_text(); + + let currentSource = this._inputSourceManager.currentSource; + if (currentSource) { + let indicatorLabel = this._indicatorLabels[currentSource.index]; + if (text && text.length > 0 && text.length < 3) + indicatorLabel.set_text(text); + } + } + + let item; + let type = prop.get_prop_type(); + switch (type) { + case IBus.PropType.MENU: + item = new PopupMenu.PopupSubMenuMenuItem(prop.get_label().get_text()); + this._buildPropSubMenu(item.menu, prop.get_sub_props()); + break; + + case IBus.PropType.RADIO: + item = new PopupMenu.PopupMenuItem(prop.get_label().get_text()); + item.prop = prop; + radioGroup.push(item); + item.radioGroup = radioGroup; + item.setOrnament(prop.get_state() == IBus.PropState.CHECKED ? + PopupMenu.Ornament.DOT : PopupMenu.Ornament.NONE); + item.connect('activate', () => { + if (item.prop.get_state() == IBus.PropState.CHECKED) + return; + + let group = item.radioGroup; + for (let i = 0; i < group.length; ++i) { + if (group[i] == item) { + item.setOrnament(PopupMenu.Ornament.DOT); + item.prop.set_state(IBus.PropState.CHECKED); + ibusManager.activateProperty(item.prop.get_key(), + IBus.PropState.CHECKED); + } else { + group[i].setOrnament(PopupMenu.Ornament.NONE); + group[i].prop.set_state(IBus.PropState.UNCHECKED); + ibusManager.activateProperty(group[i].prop.get_key(), + IBus.PropState.UNCHECKED); + } + } + }); + break; + + case IBus.PropType.TOGGLE: + item = new PopupMenu.PopupSwitchMenuItem(prop.get_label().get_text(), prop.get_state() == IBus.PropState.CHECKED); + item.prop = prop; + item.connect('toggled', () => { + if (item.state) { + item.prop.set_state(IBus.PropState.CHECKED); + ibusManager.activateProperty(item.prop.get_key(), + IBus.PropState.CHECKED); + } else { + item.prop.set_state(IBus.PropState.UNCHECKED); + ibusManager.activateProperty(item.prop.get_key(), + IBus.PropState.UNCHECKED); + } + }); + break; + + case IBus.PropType.NORMAL: + item = new PopupMenu.PopupMenuItem(prop.get_label().get_text()); + item.prop = prop; + item.connect('activate', () => { + ibusManager.activateProperty(item.prop.get_key(), + item.prop.get_state()); + }); + break; + + case IBus.PropType.SEPARATOR: + item = new PopupMenu.PopupSeparatorMenuItem(); + break; + + default: + log ('IBus property %s has invalid type %d'.format(prop.get_key(), type)); + continue; + } + + item.setSensitive(prop.get_sensitive()); + menu.addMenuItem(item); + } + } + + _showLayout() { + Main.overview.hide(); + + let source = this._inputSourceManager.currentSource; + let xkbLayout = ''; + let xkbVariant = ''; + + if (source.type == INPUT_SOURCE_TYPE_XKB) { + [, , , xkbLayout, xkbVariant] = KeyboardManager.getXkbInfo().get_layout_info(source.id); + } else if (source.type == INPUT_SOURCE_TYPE_IBUS) { + let engineDesc = IBusManager.getIBusManager().getEngineDesc(source.id); + if (engineDesc) { + xkbLayout = engineDesc.get_layout(); + xkbVariant = engineDesc.get_layout_variant(); + } + } + + if (!xkbLayout || xkbLayout.length == 0) + return; + + let description = xkbLayout; + if (xkbVariant.length > 0) + description = description + '\t' + xkbVariant; + + Util.spawn(['gkbd-keyboard-display', '-l', description]); + } +}); diff --git a/js/ui/status/location.js b/js/ui/status/location.js new file mode 100644 index 0000000..f030ae8 --- /dev/null +++ b/js/ui/status/location.js @@ -0,0 +1,379 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, Shell } = imports.gi; + +const Dialog = imports.ui.dialog; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; +const ModalDialog = imports.ui.modalDialog; +const PermissionStore = imports.misc.permissionStore; +const Signals = imports.signals; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const LOCATION_SCHEMA = 'org.gnome.system.location'; +const MAX_ACCURACY_LEVEL = 'max-accuracy-level'; +const ENABLED = 'enabled'; + +const APP_PERMISSIONS_TABLE = 'gnome'; +const APP_PERMISSIONS_ID = 'geolocation'; + +var GeoclueAccuracyLevel = { + NONE: 0, + COUNTRY: 1, + CITY: 4, + NEIGHBORHOOD: 5, + STREET: 6, + EXACT: 8 +}; + +function accuracyLevelToString(accuracyLevel) { + for (let key in GeoclueAccuracyLevel) { + if (GeoclueAccuracyLevel[key] == accuracyLevel) + return key; + } + + return 'NONE'; +} + +var GeoclueIface = loadInterfaceXML('org.freedesktop.GeoClue2.Manager'); +const GeoclueManager = Gio.DBusProxy.makeProxyWrapper(GeoclueIface); + +var AgentIface = loadInterfaceXML('org.freedesktop.GeoClue2.Agent'); + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._settings = new Gio.Settings({ schema_id: LOCATION_SCHEMA }); + this._settings.connect('changed::' + ENABLED, + this._onMaxAccuracyLevelChanged.bind(this)); + this._settings.connect('changed::' + MAX_ACCURACY_LEVEL, + this._onMaxAccuracyLevelChanged.bind(this)); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'find-location-symbolic'; + + this._item = new PopupMenu.PopupSubMenuMenuItem('', true); + this._item.icon.icon_name = 'find-location-symbolic'; + + this._agent = Gio.DBusExportedObject.wrapJSObject(AgentIface, this); + this._agent.export(Gio.DBus.system, '/org/freedesktop/GeoClue2/Agent'); + + this._item.label.text = _("Location Enabled"); + this._onOffAction = this._item.menu.addAction(_("Disable"), this._onOnOffAction.bind(this)); + this._item.menu.addSettingsAction(_("Privacy Settings"), 'gnome-privacy-panel.desktop'); + + this.menu.addMenuItem(this._item); + + this._watchId = Gio.bus_watch_name(Gio.BusType.SYSTEM, + 'org.freedesktop.GeoClue2', + 0, + this._connectToGeoclue.bind(this), + this._onGeoclueVanished.bind(this)); + Main.sessionMode.connect('updated', this._onSessionUpdated.bind(this)); + this._onSessionUpdated(); + this._onMaxAccuracyLevelChanged(); + this._connectToGeoclue(); + this._connectToPermissionStore(); + } + + get MaxAccuracyLevel() { + return this._getMaxAccuracyLevel(); + } + + AuthorizeAppAsync(params, invocation) { + let [desktopId, reqAccuracyLevel] = params; + + let authorizer = new AppAuthorizer(desktopId, + reqAccuracyLevel, + this._permStoreProxy, + this._getMaxAccuracyLevel()); + + authorizer.authorize(accuracyLevel => { + let ret = (accuracyLevel != GeoclueAccuracyLevel.NONE); + invocation.return_value(GLib.Variant.new('(bu)', + [ret, accuracyLevel])); + }); + } + + _syncIndicator() { + if (this._managerProxy == null) { + this._indicator.visible = false; + this._item.actor.visible = false; + return; + } + + this._indicator.visible = this._managerProxy.InUse; + this._item.actor.visible = this._indicator.visible; + this._updateMenuLabels(); + } + + _connectToGeoclue() { + if (this._managerProxy != null || this._connecting) + return false; + + this._connecting = true; + new GeoclueManager(Gio.DBus.system, + 'org.freedesktop.GeoClue2', + '/org/freedesktop/GeoClue2/Manager', + this._onManagerProxyReady.bind(this)); + return true; + } + + _onManagerProxyReady(proxy, error) { + if (error != null) { + log(error.message); + this._connecting = false; + return; + } + + this._managerProxy = proxy; + this._propertiesChangedId = this._managerProxy.connect('g-properties-changed', + this._onGeocluePropsChanged.bind(this)); + + this._syncIndicator(); + + this._managerProxy.AddAgentRemote('gnome-shell', this._onAgentRegistered.bind(this)); + } + + _onAgentRegistered(result, error) { + this._connecting = false; + this._notifyMaxAccuracyLevel(); + + if (error != null) + log(error.message); + } + + _onGeoclueVanished() { + if (this._propertiesChangedId) { + this._managerProxy.disconnect(this._propertiesChangedId); + this._propertiesChangedId = 0; + } + this._managerProxy = null; + + this._syncIndicator(); + } + + _onOnOffAction() { + let enabled = this._settings.get_boolean(ENABLED); + this._settings.set_boolean(ENABLED, !enabled); + } + + _onSessionUpdated() { + let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + this.menu.setSensitive(sensitive); + } + + _updateMenuLabels() { + if (this._settings.get_boolean(ENABLED)) { + this._item.label.text = this._indicator.visible ? _("Location In Use") + : _("Location Enabled"); + this._onOffAction.label.text = _("Disable"); + } else { + this._item.label.text = _("Location Disabled"); + this._onOffAction.label.text = _("Enable"); + } + } + + _onMaxAccuracyLevelChanged() { + this._updateMenuLabels(); + + // Gotta ensure geoclue is up and we are registered as agent to it + // before we emit the notify for this property change. + if (!this._connectToGeoclue()) + this._notifyMaxAccuracyLevel(); + } + + _getMaxAccuracyLevel() { + if (this._settings.get_boolean(ENABLED)) { + let level = this._settings.get_string(MAX_ACCURACY_LEVEL); + + return GeoclueAccuracyLevel[level.toUpperCase()] || + GeoclueAccuracyLevel.NONE; + } else { + return GeoclueAccuracyLevel.NONE; + } + } + + _notifyMaxAccuracyLevel() { + let variant = new GLib.Variant('u', this._getMaxAccuracyLevel()); + this._agent.emit_property_changed('MaxAccuracyLevel', variant); + } + + _onGeocluePropsChanged(proxy, properties) { + let unpacked = properties.deep_unpack(); + if ("InUse" in unpacked) + this._syncIndicator(); + } + + _connectToPermissionStore() { + this._permStoreProxy = null; + new PermissionStore.PermissionStore(this._onPermStoreProxyReady.bind(this)); + } + + _onPermStoreProxyReady(proxy, error) { + if (error != null) { + log(error.message); + return; + } + + this._permStoreProxy = proxy; + } +}; + +function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} + +var AppAuthorizer = class { + constructor(desktopId, reqAccuracyLevel, permStoreProxy, maxAccuracyLevel) { + this.desktopId = desktopId; + this.reqAccuracyLevel = reqAccuracyLevel; + this._permStoreProxy = permStoreProxy; + this._maxAccuracyLevel = maxAccuracyLevel; + this._permissions = {}; + + this._accuracyLevel = GeoclueAccuracyLevel.NONE; + } + + authorize(onAuthDone) { + this._onAuthDone = onAuthDone; + + let appSystem = Shell.AppSystem.get_default(); + this._app = appSystem.lookup_app(this.desktopId + ".desktop"); + if (this._app == null || this._permStoreProxy == null) { + this._completeAuth(); + + return; + } + + this._permStoreProxy.LookupRemote(APP_PERMISSIONS_TABLE, + APP_PERMISSIONS_ID, + this._onPermLookupDone.bind(this)); + } + + _onPermLookupDone(result, error) { + if (error != null) { + if (error.domain == Gio.DBusError) { + // Likely no xdg-app installed, just authorize the app + this._accuracyLevel = this.reqAccuracyLevel; + this._permStoreProxy = null; + this._completeAuth(); + } else { + // Currently xdg-app throws an error if we lookup for + // unknown ID (which would be the case first time this code + // runs) so we continue with user authorization as normal + // and ID is added to the store if user says "yes". + log(error.message); + this._permissions = {}; + this._userAuthorizeApp(); + } + + return; + } + + [this._permissions] = result; + let permission = this._permissions[this.desktopId]; + + if (permission == null) { + this._userAuthorizeApp(); + } else { + let [levelStr] = permission || ['NONE']; + this._accuracyLevel = GeoclueAccuracyLevel[levelStr] || + GeoclueAccuracyLevel.NONE; + this._completeAuth(); + } + } + + _userAuthorizeApp() { + let name = this._app.get_name(); + let appInfo = this._app.get_app_info(); + let reason = appInfo.get_locale_string("X-Geoclue-Reason"); + + this._showAppAuthDialog(name, reason); + } + + _showAppAuthDialog(name, reason) { + this._dialog = new GeolocationDialog(name, + reason, + this.reqAccuracyLevel); + + let responseId = this._dialog.connect('response', (dialog, level) => { + this._dialog.disconnect(responseId); + this._accuracyLevel = level; + this._completeAuth(); + }); + + this._dialog.open(); + } + + _completeAuth() { + if (this._accuracyLevel != GeoclueAccuracyLevel.NONE) { + this._accuracyLevel = clamp(this._accuracyLevel, + 0, + this._maxAccuracyLevel); + } + this._saveToPermissionStore(); + + this._onAuthDone(this._accuracyLevel); + } + + _saveToPermissionStore() { + if (this._permStoreProxy == null) + return; + + let levelStr = accuracyLevelToString(this._accuracyLevel); + let dateStr = Math.round(Date.now() / 1000).toString(); + this._permissions[this.desktopId] = [levelStr, dateStr]; + + let data = GLib.Variant.new('av', {}); + + this._permStoreProxy.SetRemote(APP_PERMISSIONS_TABLE, + true, + APP_PERMISSIONS_ID, + this._permissions, + data, + (result, error) => { + if (error != null) + log(error.message); + }); + } +}; + +var GeolocationDialog = class extends ModalDialog.ModalDialog { + constructor(name, subtitle, reqAccuracyLevel) { + super({ styleClass: 'geolocation-dialog' }); + this.reqAccuracyLevel = reqAccuracyLevel; + + let icon = new Gio.ThemedIcon({ name: 'find-location-symbolic' }); + + /* Translators: %s is an application name */ + let title = _("Give %s access to your location?").format(name); + let body = _("Location access can be changed at any time from the privacy settings."); + + let contentParams = { icon, title, subtitle, body }; + let content = new Dialog.MessageDialogContent(contentParams); + this.contentLayout.add_actor(content); + + let button = this.addButton({ label: _("Deny Access"), + action: this._onDenyClicked.bind(this), + key: Clutter.KEY_Escape }); + this.addButton({ label: _("Grant Access"), + action: this._onGrantClicked.bind(this) }); + + this.setInitialKeyFocus(button); + } + + _onGrantClicked() { + this.emit('response', this.reqAccuracyLevel); + this.close(); + } + + _onDenyClicked() { + this.emit('response', GeoclueAccuracyLevel.NONE); + this.close(); + } +}; +Signals.addSignalMethods(GeolocationDialog.prototype); diff --git a/js/ui/status/network.js b/js/ui/status/network.js new file mode 100644 index 0000000..421d2e7 --- /dev/null +++ b/js/ui/status/network.js @@ -0,0 +1,2051 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +const { Clutter, Gio, GLib, GObject, NM, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Animation = imports.ui.animation; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; +const MessageTray = imports.ui.messageTray; +const ModalDialog = imports.ui.modalDialog; +const ModemManager = imports.misc.modemManager; +const Rfkill = imports.ui.status.rfkill; +const Util = imports.misc.util; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const NMConnectionCategory = { + INVALID: 'invalid', + WIRED: 'wired', + WIRELESS: 'wireless', + WWAN: 'wwan', + VPN: 'vpn' +}; + +const NMAccessPointSecurity = { + NONE: 1, + WEP: 2, + WPA_PSK: 3, + WPA2_PSK: 4, + WPA_ENT: 5, + WPA2_ENT: 6 +}; + +var MAX_DEVICE_ITEMS = 4; + +// small optimization, to avoid using [] all the time +const NM80211Mode = NM['80211Mode']; +const NM80211ApFlags = NM['80211ApFlags']; +const NM80211ApSecurityFlags = NM['80211ApSecurityFlags']; + +var PortalHelperResult = { + CANCELLED: 0, + COMPLETED: 1, + RECHECK: 2 +}; + +const PortalHelperIface = loadInterfaceXML('org.gnome.Shell.PortalHelper'); +const PortalHelperProxy = Gio.DBusProxy.makeProxyWrapper(PortalHelperIface); + +function signalToIcon(value) { + if (value > 80) + return 'excellent'; + if (value > 55) + return 'good'; + if (value > 30) + return 'ok'; + if (value > 5) + return 'weak'; + return 'none'; +} + +function ssidToLabel(ssid) { + let label = NM.utils_ssid_to_utf8(ssid.get_data()); + if (!label) + label = _(""); + return label; +} + +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; + } +} + +var NMConnectionItem = class { + constructor(section, connection) { + this._section = section; + this._connection = connection; + this._activeConnection = null; + this._activeConnectionChangedId = 0; + + this._buildUI(); + this._sync(); + } + + _buildUI() { + this.labelItem = new PopupMenu.PopupMenuItem(''); + this.labelItem.connect('activate', this._toggle.bind(this)); + + this.radioItem = new PopupMenu.PopupMenuItem(this._connection.get_id(), false); + this.radioItem.connect('activate', this._activate.bind(this)); + } + + destroy() { + this.labelItem.destroy(); + this.radioItem.destroy(); + } + + updateForConnection(connection) { + // connection should always be the same object + // (and object path) as this._connection, but + // this can be false if NetworkManager was restarted + // and picked up connections in a different order + // Just to be safe, we set it here again + + this._connection = connection; + this.radioItem.label.text = connection.get_id(); + this._sync(); + this.emit('name-changed'); + } + + getName() { + return this._connection.get_id(); + } + + isActive() { + if (this._activeConnection == null) + return false; + + return this._activeConnection.state <= NM.ActiveConnectionState.ACTIVATED; + } + + _sync() { + let isActive = this.isActive(); + this.labelItem.label.text = isActive ? _("Turn Off") : this._section.getConnectLabel(); + this.radioItem.setOrnament(isActive ? PopupMenu.Ornament.DOT : PopupMenu.Ornament.NONE); + this.emit('icon-changed'); + } + + _toggle() { + if (this._activeConnection == null) + this._section.activateConnection(this._connection); + else + this._section.deactivateConnection(this._activeConnection); + + this._sync(); + } + + _activate() { + if (this._activeConnection == null) + this._section.activateConnection(this._connection); + + this._sync(); + } + + _connectionStateChanged(ac, newstate, reason) { + this._sync(); + } + + setActiveConnection(activeConnection) { + if (this._activeConnectionChangedId > 0) { + this._activeConnection.disconnect(this._activeConnectionChangedId); + this._activeConnectionChangedId = 0; + } + + this._activeConnection = activeConnection; + + if (this._activeConnection) + this._activeConnectionChangedId = this._activeConnection.connect('notify::state', + this._connectionStateChanged.bind(this)); + + this._sync(); + } +}; +Signals.addSignalMethods(NMConnectionItem.prototype); + +var NMConnectionSection = class { + constructor(client) { + if (new.target === NMConnectionSection) + throw new TypeError('Cannot instantiate abstract type ' + new.target.name); + + this._client = client; + + this._connectionItems = new Map(); + this._connections = []; + + this._labelSection = new PopupMenu.PopupMenuSection(); + this._radioSection = new PopupMenu.PopupMenuSection(); + + this.item = new PopupMenu.PopupSubMenuMenuItem('', true); + this.item.menu.addMenuItem(this._labelSection); + this.item.menu.addMenuItem(this._radioSection); + + this._notifyConnectivityId = this._client.connect('notify::connectivity', this._iconChanged.bind(this)); + } + + destroy() { + if (this._notifyConnectivityId != 0) { + this._client.disconnect(this._notifyConnectivityId); + this._notifyConnectivityId = 0; + } + + this.item.destroy(); + } + + _iconChanged() { + this._sync(); + this.emit('icon-changed'); + } + + _sync() { + let nItems = this._connectionItems.size; + + this._radioSection.actor.visible = (nItems > 1); + this._labelSection.actor.visible = (nItems == 1); + + this.item.label.text = this._getStatus(); + this.item.icon.icon_name = this._getMenuIcon(); + } + + _getMenuIcon() { + return this.getIndicatorIcon(); + } + + getConnectLabel() { + return _("Connect"); + } + + _connectionValid(connection) { + return true; + } + + _connectionSortFunction(one, two) { + return GLib.utf8_collate(one.get_id(), two.get_id()); + } + + _makeConnectionItem(connection) { + return new NMConnectionItem(this, connection); + } + + checkConnection(connection) { + if (!this._connectionValid(connection)) + return; + + // This function is called everytime connection is added or updated + // In the usual case, we already added this connection and UUID + // didn't change. So we need to check if we already have an item, + // and update it for properties in the connection that changed + // (the only one we care about is the name) + // But it's also possible we didn't know about this connection + // (eg, during coldplug, or because it was updated and suddenly + // it's valid for this device), in which case we add a new item + + let item = this._connectionItems.get(connection.get_uuid()); + if (item) + this._updateForConnection(item, connection); + else + this._addConnection(connection); + } + + _updateForConnection(item, connection) { + let pos = this._connections.indexOf(connection); + + this._connections.splice(pos, 1); + pos = Util.insertSorted(this._connections, connection, this._connectionSortFunction.bind(this)); + this._labelSection.moveMenuItem(item.labelItem, pos); + this._radioSection.moveMenuItem(item.radioItem, pos); + + item.updateForConnection(connection); + } + + _addConnection(connection) { + let item = this._makeConnectionItem(connection); + if (!item) + return; + + item.connect('icon-changed', () => { this._iconChanged(); }); + item.connect('activation-failed', (item, reason) => { + this.emit('activation-failed', reason); + }); + item.connect('name-changed', this._sync.bind(this)); + + let pos = Util.insertSorted(this._connections, connection, this._connectionSortFunction.bind(this)); + this._labelSection.addMenuItem(item.labelItem, pos); + this._radioSection.addMenuItem(item.radioItem, pos); + this._connectionItems.set(connection.get_uuid(), item); + this._sync(); + } + + removeConnection(connection) { + let uuid = connection.get_uuid(); + let item = this._connectionItems.get(uuid); + if (item == undefined) + return; + + item.destroy(); + this._connectionItems.delete(uuid); + + let pos = this._connections.indexOf(connection); + this._connections.splice(pos, 1); + + this._sync(); + } +}; +Signals.addSignalMethods(NMConnectionSection.prototype); + +var NMConnectionDevice = class extends NMConnectionSection { + constructor(client, device) { + if (new.target === NMConnectionDevice) + throw new TypeError('Cannot instantiate abstract type ' + new.target.name); + + super(client); + this._device = device; + this._description = ''; + + this._autoConnectItem = this.item.menu.addAction(_("Connect"), this._autoConnect.bind(this)); + this._deactivateItem = this._radioSection.addAction(_("Turn Off"), this.deactivateConnection.bind(this)); + + this._stateChangedId = this._device.connect('state-changed', this._deviceStateChanged.bind(this)); + this._activeConnectionChangedId = this._device.connect('notify::active-connection', this._activeConnectionChanged.bind(this)); + } + + _canReachInternet() { + if (this._client.primary_connection != this._device.active_connection) + return true; + + return this._client.connectivity == NM.ConnectivityState.FULL; + } + + _autoConnect() { + let connection = new NM.SimpleConnection(); + this._client.add_and_activate_connection_async(connection, this._device, null, null, null); + } + + destroy() { + if (this._stateChangedId) { + GObject.Object.prototype.disconnect.call(this._device, this._stateChangedId); + this._stateChangedId = 0; + } + if (this._activeConnectionChangedId) { + GObject.Object.prototype.disconnect.call(this._device, this._activeConnectionChangedId); + this._activeConnectionChangedId = 0; + } + + super.destroy(); + } + + _activeConnectionChanged() { + if (this._activeConnection) { + let item = this._connectionItems.get(this._activeConnection.connection.get_uuid()); + item.setActiveConnection(null); + this._activeConnection = null; + } + + this._sync(); + } + + _deviceStateChanged(device, newstate, oldstate, reason) { + if (newstate == oldstate) { + log('device emitted state-changed without actually changing state'); + return; + } + + /* 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 == NM.DeviceState.FAILED && + reason != NM.DeviceStateReason.NO_SECRETS) { + this.emit('activation-failed', reason); + } + + this._sync(); + } + + _connectionValid(connection) { + return this._device.connection_valid(connection); + } + + activateConnection(connection) { + this._client.activate_connection_async(connection, this._device, null, null, null); + } + + deactivateConnection(activeConnection) { + this._device.disconnect(null); + } + + setDeviceDescription(desc) { + this._description = desc; + this._sync(); + } + + _getDescription() { + return this._description; + } + + _sync() { + let nItems = this._connectionItems.size; + this._autoConnectItem.actor.visible = (nItems == 0); + this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED; + + if (this._activeConnection == null) { + let activeConnection = this._device.active_connection; + if (activeConnection && activeConnection.connection) { + let item = this._connectionItems.get(activeConnection.connection.get_uuid()); + if (item) { + this._activeConnection = activeConnection; + ensureActiveConnectionProps(this._activeConnection, this._client); + item.setActiveConnection(this._activeConnection); + } + } + } + + super._sync(); + } + + _getStatus() { + if (!this._device) + return ''; + + switch(this._device.state) { + case NM.DeviceState.DISCONNECTED: + /* Translators: %s is a network identifier */ + return _("%s Off").format(this._getDescription()); + case NM.DeviceState.ACTIVATED: + /* Translators: %s is a network identifier */ + return _("%s Connected").format(this._getDescription()); + 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 NM.DeviceState.DEACTIVATING: + /* Translators: %s is a network identifier */ + return _("%s Disconnecting").format(this._getDescription()); + 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 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 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). + if (this._device.firmware_missing) { + /* Translators: this is for devices that require some kind of firmware or kernel + module, which is missing; %s is a network identifier */ + return _("Firmware Missing For %s").format(this._getDescription()); + } + /* 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 NM.DeviceState.FAILED: + /* Translators: %s is a network identifier */ + return _("%s Connection Failed").format(this._getDescription()); + default: + log('Device state invalid, is %d'.format(this._device.state)); + return 'invalid'; + } + } +}; + +var NMDeviceWired = class extends NMConnectionDevice { + constructor(client, device) { + super(client, device); + + this.item.menu.addSettingsAction(_("Wired Settings"), 'gnome-network-panel.desktop'); + } + + get category() { + return NMConnectionCategory.WIRED; + } + + _hasCarrier() { + if (this._device instanceof NM.DeviceEthernet) + return this._device.carrier; + else + return true; + } + + _sync() { + this.item.actor.visible = this._hasCarrier(); + super._sync(); + } + + getIndicatorIcon() { + if (this._device.active_connection) { + let state = this._device.active_connection.state; + + if (state == NM.ActiveConnectionState.ACTIVATING) { + return 'network-wired-acquiring-symbolic'; + } else if (state == NM.ActiveConnectionState.ACTIVATED) { + if (this._canReachInternet()) + return 'network-wired-symbolic'; + else + return 'network-wired-no-route-symbolic'; + } else { + return 'network-wired-disconnected-symbolic'; + } + } else + return 'network-wired-disconnected-symbolic'; + } +}; + +var NMDeviceModem = class extends NMConnectionDevice { + constructor(client, device) { + super(client, device); + + this.item.menu.addSettingsAction(_("Mobile Broadband Settings"), 'gnome-network-panel.desktop'); + + this._mobileDevice = null; + + 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 & NM.DeviceModemCapabilities.GSM_UMTS) + this._mobileDevice = new ModemManager.ModemGsm(device.udi); + else if (capabilities & NM.DeviceModemCapabilities.CDMA_EVDO) + this._mobileDevice = new ModemManager.ModemCdma(device.udi); + else if (capabilities & NM.DeviceModemCapabilities.LTE) + this._mobileDevice = new ModemManager.ModemGsm(device.udi); + + if (this._mobileDevice) { + this._operatorNameId = this._mobileDevice.connect('notify::operator-name', this._sync.bind(this)); + this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', () => { + this._iconChanged(); + }); + } + } + + get category() { + return NMConnectionCategory.WWAN; + } + + _autoConnect() { + Util.spawn(['gnome-control-center', 'network', + 'connect-3g', this._device.get_path()]); + } + + destroy() { + if (this._operatorNameId) { + this._mobileDevice.disconnect(this._operatorNameId); + this._operatorNameId = 0; + } + if (this._signalQualityId) { + this._mobileDevice.disconnect(this._signalQualityId); + this._signalQualityId = 0; + } + + super.destroy(); + } + + _getStatus() { + if (!this._client.wwan_hardware_enabled) + /* Translators: %s is a network identifier */ + return _("%s Hardware Disabled").format(this._getDescription()); + else if (!this._client.wwan_enabled) + /* 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 == NM.DeviceState.ACTIVATED && + this._mobileDevice && this._mobileDevice.operator_name) + return this._mobileDevice.operator_name; + else + return super._getStatus(); + } + + getIndicatorIcon() { + if (this._device.active_connection) { + if (this._device.active_connection.state == NM.ActiveConnectionState.ACTIVATING) + return 'network-cellular-acquiring-symbolic'; + + return this._getSignalIcon(); + } else { + return 'network-cellular-signal-none-symbolic'; + } + } + + _getSignalIcon() { + return 'network-cellular-signal-' + signalToIcon(this._mobileDevice.signal_quality) + '-symbolic'; + } +}; + +var NMDeviceBluetooth = class extends NMConnectionDevice { + constructor(client, device) { + super(client, device); + + this.item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-network-panel.desktop'); + } + + get category() { + return NMConnectionCategory.WWAN; + } + + _getDescription() { + return this._device.name; + } + + getConnectLabel() { + return _("Connect to Internet"); + } + + getIndicatorIcon() { + if (this._device.active_connection) { + let state = this._device.active_connection.state; + if (state == NM.ActiveConnectionState.ACTIVATING) + return 'network-cellular-acquiring-symbolic'; + else if (state == NM.ActiveConnectionState.ACTIVATED) + return 'network-cellular-connected-symbolic'; + else + return 'network-cellular-signal-none-symbolic'; + } else { + return 'network-cellular-signal-none-symbolic'; + } + } +}; + +var NMWirelessDialogItem = class { + constructor(network) { + this._network = network; + this._ap = network.accessPoints[0]; + + this.actor = new St.BoxLayout({ style_class: 'nm-dialog-item', + can_focus: true, + reactive: true }); + this.actor.connect('key-focus-in', () => { this.emit('selected'); }); + let action = new Clutter.ClickAction(); + action.connect('clicked', () => { this.actor.grab_key_focus(); }); + this.actor.add_action(action); + + let title = ssidToLabel(this._ap.get_ssid()); + this._label = new St.Label({ text: title }); + + this.actor.label_actor = this._label; + this.actor.add(this._label, { x_align: St.Align.START }); + + this._selectedIcon = new St.Icon({ style_class: 'nm-dialog-icon', + icon_name: 'object-select-symbolic' }); + this.actor.add(this._selectedIcon); + + this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' }); + this.actor.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END }); + + this._secureIcon = new St.Icon({ style_class: 'nm-dialog-icon' }); + if (this._ap._secType != NMAccessPointSecurity.NONE) + this._secureIcon.icon_name = 'network-wireless-encrypted-symbolic'; + this._icons.add_actor(this._secureIcon); + + this._signalIcon = new St.Icon({ style_class: 'nm-dialog-icon' }); + this._icons.add_actor(this._signalIcon); + + this._sync(); + } + + _sync() { + this._signalIcon.icon_name = this._getSignalIcon(); + } + + updateBestAP(ap) { + this._ap = ap; + this._sync(); + } + + setActive(isActive) { + this._selectedIcon.opacity = isActive ? 255 : 0; + } + + _getSignalIcon() { + if (this._ap.mode == NM80211Mode.ADHOC) + return 'network-workgroup-symbolic'; + else + return 'network-wireless-signal-' + signalToIcon(this._ap.strength) + '-symbolic'; + } +}; +Signals.addSignalMethods(NMWirelessDialogItem.prototype); + +var NMWirelessDialog = class extends ModalDialog.ModalDialog { + constructor(client, device) { + super({ styleClass: 'nm-dialog' }); + + this._client = client; + this._device = device; + + this._wirelessEnabledChangedId = this._client.connect('notify::wireless-enabled', + this._syncView.bind(this)); + + this._rfkill = Rfkill.getRfkillManager(); + this._airplaneModeChangedId = this._rfkill.connect('airplane-mode-changed', + this._syncView.bind(this)); + + this._networks = []; + this._buildLayout(); + + let connections = client.get_connections(); + this._connections = connections.filter( + connection => device.connection_valid(connection) + ); + + this._apAddedId = device.connect('access-point-added', this._accessPointAdded.bind(this)); + this._apRemovedId = device.connect('access-point-removed', this._accessPointRemoved.bind(this)); + this._activeApChangedId = device.connect('notify::active-access-point', this._activeApChanged.bind(this)); + + // accessPointAdded will also create dialog items + let accessPoints = device.get_access_points() || [ ]; + accessPoints.forEach(ap => { + this._accessPointAdded(this._device, ap); + }); + + this._selectedNetwork = null; + this._activeApChanged(); + this._updateSensitivity(); + this._syncView(); + + this._scanTimeoutId = Mainloop.timeout_add_seconds(15, this._onScanTimeout.bind(this)); + GLib.Source.set_name_by_id(this._scanTimeoutId, '[gnome-shell] this._onScanTimeout'); + this._onScanTimeout(); + + let id = Main.sessionMode.connect('updated', () => { + if (Main.sessionMode.allowSettings) + return; + + Main.sessionMode.disconnect(id); + this.close(); + }); + } + + destroy() { + if (this._apAddedId) { + GObject.Object.prototype.disconnect.call(this._device, this._apAddedId); + this._apAddedId = 0; + } + if (this._apRemovedId) { + GObject.Object.prototype.disconnect.call(this._device, this._apRemovedId); + this._apRemovedId = 0; + } + if (this._activeApChangedId) { + GObject.Object.prototype.disconnect.call(this._device, this._activeApChangedId); + this._activeApChangedId = 0; + } + if (this._wirelessEnabledChangedId) { + this._client.disconnect(this._wirelessEnabledChangedId); + this._wirelessEnabledChangedId = 0; + } + if (this._airplaneModeChangedId) { + this._rfkill.disconnect(this._airplaneModeChangedId); + this._airplaneModeChangedId = 0; + } + + if (this._scanTimeoutId) { + Mainloop.source_remove(this._scanTimeoutId); + this._scanTimeoutId = 0; + } + + super.destroy(); + } + + _onScanTimeout() { + this._device.request_scan_async(null, null); + return GLib.SOURCE_CONTINUE; + } + + _activeApChanged() { + if (this._activeNetwork) + this._activeNetwork.item.setActive(false); + + this._activeNetwork = null; + if (this._device.active_access_point) { + let idx = this._findNetwork(this._device.active_access_point); + if (idx >= 0) + this._activeNetwork = this._networks[idx]; + } + + if (this._activeNetwork) + this._activeNetwork.item.setActive(true); + this._updateSensitivity(); + } + + _updateSensitivity() { + let connectSensitive = this._client.wireless_enabled && this._selectedNetwork && (this._selectedNetwork != this._activeNetwork); + this._connectButton.reactive = connectSensitive; + this._connectButton.can_focus = connectSensitive; + } + + _syncView() { + if (this._rfkill.airplaneMode) { + this._airplaneBox.show(); + + this._airplaneIcon.icon_name = 'airplane-mode-symbolic'; + this._airplaneHeadline.text = _("Airplane Mode is On"); + this._airplaneText.text = _("Wi-Fi is disabled when airplane mode is on."); + this._airplaneButton.label = _("Turn Off Airplane Mode"); + + this._airplaneButton.visible = !this._rfkill.hwAirplaneMode; + this._airplaneInactive.visible = this._rfkill.hwAirplaneMode; + this._noNetworksBox.hide(); + } else if (!this._client.wireless_enabled) { + this._airplaneBox.show(); + + this._airplaneIcon.icon_name = 'dialog-information-symbolic'; + this._airplaneHeadline.text = _("Wi-Fi is Off"); + this._airplaneText.text = _("Wi-Fi needs to be turned on in order to connect to a network."); + this._airplaneButton.label = _("Turn On Wi-Fi"); + + this._airplaneButton.show(); + this._airplaneInactive.hide(); + this._noNetworksBox.hide(); + } else { + this._airplaneBox.hide(); + + this._noNetworksBox.visible = (this._networks.length == 0); + } + + if (this._noNetworksBox.visible) + this._noNetworksSpinner.play(); + else + this._noNetworksSpinner.stop(); + } + + _buildLayout() { + let headline = new St.BoxLayout({ style_class: 'nm-dialog-header-hbox' }); + + let icon = new St.Icon({ style_class: 'nm-dialog-header-icon', + icon_name: 'network-wireless-signal-excellent-symbolic' }); + + let titleBox = new St.BoxLayout({ vertical: true }); + let title = new St.Label({ style_class: 'nm-dialog-header', + text: _("Wi-Fi Networks") }); + let subtitle = new St.Label({ style_class: 'nm-dialog-subheader', + text: _("Select a network") }); + titleBox.add(title); + titleBox.add(subtitle); + + headline.add(icon); + headline.add(titleBox); + + this.contentLayout.style_class = 'nm-dialog-content'; + this.contentLayout.add(headline); + + this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + + this._itemBox = new St.BoxLayout({ vertical: true }); + this._scrollView = new St.ScrollView({ style_class: 'nm-dialog-scroll-view' }); + this._scrollView.set_x_expand(true); + this._scrollView.set_y_expand(true); + this._scrollView.set_policy(St.PolicyType.NEVER, + St.PolicyType.AUTOMATIC); + this._scrollView.add_actor(this._itemBox); + this._stack.add_child(this._scrollView); + + this._noNetworksBox = new St.BoxLayout({ vertical: true, + style_class: 'no-networks-box', + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER }); + + this._noNetworksSpinner = new Animation.Spinner(16); + this._noNetworksBox.add_actor(this._noNetworksSpinner.actor); + this._noNetworksBox.add_actor(new St.Label({ style_class: 'no-networks-label', + text: _("No Networks") })); + this._stack.add_child(this._noNetworksBox); + + this._airplaneBox = new St.BoxLayout({ vertical: true, + style_class: 'nm-dialog-airplane-box', + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER }); + this._airplaneIcon = new St.Icon({ icon_size: 48 }); + this._airplaneHeadline = new St.Label({ style_class: 'nm-dialog-airplane-headline headline' }); + this._airplaneText = new St.Label({ style_class: 'nm-dialog-airplane-text' }); + + let airplaneSubStack = new St.Widget({ layout_manager: new Clutter.BinLayout }); + this._airplaneButton = new St.Button({ style_class: 'modal-dialog-button button' }); + this._airplaneButton.connect('clicked', () => { + if (this._rfkill.airplaneMode) + this._rfkill.airplaneMode = false; + else + this._client.wireless_enabled = true; + }); + airplaneSubStack.add_actor(this._airplaneButton); + this._airplaneInactive = new St.Label({ style_class: 'nm-dialog-airplane-text', + text: _("Use hardware switch to turn off") }); + airplaneSubStack.add_actor(this._airplaneInactive); + + this._airplaneBox.add(this._airplaneIcon, { x_align: St.Align.MIDDLE }); + this._airplaneBox.add(this._airplaneHeadline, { x_align: St.Align.MIDDLE }); + this._airplaneBox.add(this._airplaneText, { x_align: St.Align.MIDDLE }); + this._airplaneBox.add(airplaneSubStack, { x_align: St.Align.MIDDLE }); + this._stack.add_child(this._airplaneBox); + + this.contentLayout.add(this._stack, { expand: true }); + + this._disconnectButton = this.addButton({ action: this.close.bind(this), + label: _("Cancel"), + key: Clutter.Escape }); + this._connectButton = this.addButton({ action: this._connect.bind(this), + label: _("Connect"), + key: Clutter.Return }); + } + + _connect() { + let network = this._selectedNetwork; + if (network.connections.length > 0) { + let connection = network.connections[0]; + this._client.activate_connection_async(connection, this._device, null, null, null); + } else { + let accessPoints = network.accessPoints; + if ((accessPoints[0]._secType == NMAccessPointSecurity.WPA2_ENT) + || (accessPoints[0]._secType == NMAccessPointSecurity.WPA_ENT)) { + // 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].get_path()]); + } else { + let connection = new NM.SimpleConnection(); + this._client.add_and_activate_connection_async(connection, this._device, accessPoints[0].get_path(), null, null) + } + } + + this.close(); + } + + _notifySsidCb(accessPoint) { + if (accessPoint.get_ssid() != null) { + accessPoint.disconnect(accessPoint._notifySsidId); + accessPoint._notifySsidId = 0; + this._accessPointAdded(this._device, accessPoint); + } + } + + _getApSecurityType(accessPoint) { + if (accessPoint._secType) + return accessPoint._secType; + + let flags = accessPoint.flags; + let wpa_flags = accessPoint.wpa_flags; + let rsn_flags = accessPoint.rsn_flags; + let type; + if (rsn_flags != NM80211ApSecurityFlags.NONE) { + /* RSN check first so that WPA+WPA2 APs are treated as RSN/WPA2 */ + if (rsn_flags & NM80211ApSecurityFlags.KEY_MGMT_802_1X) + type = NMAccessPointSecurity.WPA2_ENT; + else if (rsn_flags & NM80211ApSecurityFlags.KEY_MGMT_PSK) + type = NMAccessPointSecurity.WPA2_PSK; + } else if (wpa_flags != NM80211ApSecurityFlags.NONE) { + if (wpa_flags & NM80211ApSecurityFlags.KEY_MGMT_802_1X) + type = NMAccessPointSecurity.WPA_ENT; + else if (wpa_flags & NM80211ApSecurityFlags.KEY_MGMT_PSK) + type = NMAccessPointSecurity.WPA_PSK; + } else { + if (flags & NM80211ApFlags.PRIVACY) + type = NMAccessPointSecurity.WEP; + else + type = NMAccessPointSecurity.NONE; + } + + // cache the found value to avoid checking flags all the time + accessPoint._secType = type; + return type; + } + + _networkSortFunction(one, two) { + let oneHasConnection = one.connections.length != 0; + let twoHasConnection = two.connections.length != 0; + + // place known connections first + // (-1 = good order, 1 = wrong order) + if (oneHasConnection && !twoHasConnection) + return -1; + else if (!oneHasConnection && twoHasConnection) + return 1; + + let oneAp = one.accessPoints[0] || null; + let twoAp = two.accessPoints[0] || null; + + if (oneAp != null && twoAp == null) + return -1; + else if (oneAp == null && twoAp != null) + return 1; + + let oneStrength = oneAp.strength; + let twoStrength = twoAp.strength; + + // place stronger connections first + if (oneStrength != twoStrength) + return oneStrength < twoStrength ? 1 : -1; + + let oneHasSecurity = one.security != NMAccessPointSecurity.NONE; + let twoHasSecurity = two.security != NMAccessPointSecurity.NONE; + + // place secure connections first + // (we treat WEP/WPA/WPA2 the same as there is no way to + // take them apart from the UI) + if (oneHasSecurity && !twoHasSecurity) + return -1; + else if (!oneHasSecurity && twoHasSecurity) + return 1; + + // sort alphabetically + return GLib.utf8_collate(one.ssidText, two.ssidText); + } + + _networkCompare(network, accessPoint) { + if (!network.ssid.equal (accessPoint.get_ssid())) + return false; + if (network.mode != accessPoint.mode) + return false; + if (network.security != this._getApSecurityType(accessPoint)) + return false; + + return true; + } + + _findExistingNetwork(accessPoint) { + for (let i = 0; i < this._networks.length; i++) { + let network = this._networks[i]; + for (let j = 0; j < network.accessPoints.length; j++) { + if (network.accessPoints[j] == accessPoint) + return { network: i, ap: j }; + } + } + + return null; + } + + _findNetwork(accessPoint) { + if (accessPoint.get_ssid() == null) + return -1; + + for (let i = 0; i < this._networks.length; i++) { + if (this._networkCompare(this._networks[i], accessPoint)) + return i; + } + return -1; + } + + _checkConnections(network, accessPoint) { + this._connections.forEach(connection => { + if (accessPoint.connection_valid(connection) && + network.connections.indexOf(connection) == -1) { + network.connections.push(connection); + } + }); + } + + _accessPointAdded(device, accessPoint) { + if (accessPoint.get_ssid() == null) { + // This access point is not visible yet + // Wait for it to get a ssid + accessPoint._notifySsidId = accessPoint.connect('notify::ssid', this._notifySsidCb.bind(this)); + return; + } + + let pos = this._findNetwork(accessPoint); + let network; + + if (pos != -1) { + network = this._networks[pos]; + if (network.accessPoints.indexOf(accessPoint) != -1) { + log('Access point was already seen, not adding again'); + return; + } + + Util.insertSorted(network.accessPoints, accessPoint, (one, two) => { + return two.strength - one.strength; + }); + network.item.updateBestAP(network.accessPoints[0]); + this._checkConnections(network, accessPoint); + + this._resortItems(); + } else { + network = { ssid: accessPoint.get_ssid(), + mode: accessPoint.mode, + security: this._getApSecurityType(accessPoint), + connections: [ ], + item: null, + accessPoints: [ accessPoint ] + }; + network.ssidText = ssidToLabel(network.ssid); + this._checkConnections(network, accessPoint); + + let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction); + this._createNetworkItem(network); + this._itemBox.insert_child_at_index(network.item.actor, newPos); + } + + this._syncView(); + } + + _accessPointRemoved(device, accessPoint) { + let res = this._findExistingNetwork(accessPoint); + + if (res == null) { + log('Removing an access point that was never added'); + return; + } + + let network = this._networks[res.network]; + network.accessPoints.splice(res.ap, 1); + + if (network.accessPoints.length == 0) { + network.item.actor.destroy(); + this._networks.splice(res.network, 1); + } else { + network.item.updateBestAP(network.accessPoints[0]); + this._resortItems(); + } + + this._syncView(); + } + + _resortItems() { + let adjustment = this._scrollView.vscroll.adjustment; + let scrollValue = adjustment.value; + + this._itemBox.remove_all_children(); + this._networks.forEach(network => { + this._itemBox.add_child(network.item.actor); + }); + + adjustment.value = scrollValue; + } + + _selectNetwork(network) { + if (this._selectedNetwork) + this._selectedNetwork.item.actor.remove_style_pseudo_class('selected'); + + this._selectedNetwork = network; + this._updateSensitivity(); + + if (this._selectedNetwork) + this._selectedNetwork.item.actor.add_style_pseudo_class('selected'); + } + + _createNetworkItem(network) { + network.item = new NMWirelessDialogItem(network); + network.item.setActive(network == this._selectedNetwork); + network.item.connect('selected', () => { + Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor); + this._selectNetwork(network); + }); + network.item.actor.connect('destroy', () => { + let keyFocus = global.stage.key_focus; + if (keyFocus && keyFocus.contains(network.item.actor)) + this._itemBox.grab_key_focus(); + }); + } +}; + +var NMDeviceWireless = class { + constructor(client, device) { + this._client = client; + this._device = device; + + this._description = ''; + + this.item = new PopupMenu.PopupSubMenuMenuItem('', true); + this.item.menu.addAction(_("Select Network"), this._showDialog.bind(this)); + + this._toggleItem = new PopupMenu.PopupMenuItem(''); + this._toggleItem.connect('activate', this._toggleWifi.bind(this)); + this.item.menu.addMenuItem(this._toggleItem); + + this.item.menu.addSettingsAction(_("Wi-Fi Settings"), 'gnome-wifi-panel.desktop'); + + this._wirelessEnabledChangedId = this._client.connect('notify::wireless-enabled', this._sync.bind(this)); + this._wirelessHwEnabledChangedId = this._client.connect('notify::wireless-hardware-enabled', this._sync.bind(this)); + this._activeApChangedId = this._device.connect('notify::active-access-point', this._activeApChanged.bind(this)); + this._stateChangedId = this._device.connect('state-changed', this._deviceStateChanged.bind(this)); + this._notifyConnectivityId = this._client.connect('notify::connectivity', this._iconChanged.bind(this)); + + this._sync(); + } + + get category() { + return NMConnectionCategory.WIRELESS; + } + + _iconChanged() { + this._sync(); + this.emit('icon-changed'); + } + + destroy() { + if (this._activeApChangedId) { + GObject.Object.prototype.disconnect.call(this._device, this._activeApChangedId); + this._activeApChangedId = 0; + } + if (this._stateChangedId) { + GObject.Object.prototype.disconnect.call(this._device, this._stateChangedId); + this._stateChangedId = 0; + } + if (this._strengthChangedId > 0) { + this._activeAccessPoint.disconnect(this._strengthChangedId); + this._strengthChangedId = 0; + } + if (this._wirelessEnabledChangedId) { + this._client.disconnect(this._wirelessEnabledChangedId); + this._wirelessEnabledChangedId = 0; + } + if (this._wirelessHwEnabledChangedId) { + this._client.disconnect(this._wirelessHwEnabledChangedId); + this._wirelessHwEnabledChangedId = 0; + } + if (this._dialog) { + this._dialog.destroy(); + this._dialog = null; + } + if (this._notifyConnectivityId) { + this._client.disconnect(this._notifyConnectivityId); + this._notifyConnectivityId = 0; + } + + this.item.destroy(); + } + + _deviceStateChanged(device, newstate, oldstate, reason) { + if (newstate == oldstate) { + log('device emitted state-changed without actually changing state'); + return; + } + + /* 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 == NM.DeviceState.FAILED && + reason != NM.DeviceStateReason.NO_SECRETS) { + this.emit('activation-failed', reason); + } + + this._sync(); + } + + _toggleWifi() { + this._client.wireless_enabled = !this._client.wireless_enabled; + } + + _showDialog() { + this._dialog = new NMWirelessDialog(this._client, this._device); + this._dialog.connect('closed', this._dialogClosed.bind(this)); + this._dialog.open(); + } + + _dialogClosed() { + this._dialog = null; + } + + _strengthChanged() { + this._iconChanged(); + } + + _activeApChanged() { + if (this._activeAccessPoint) { + this._activeAccessPoint.disconnect(this._strengthChangedId); + this._strengthChangedId = 0; + } + + this._activeAccessPoint = this._device.active_access_point; + + if (this._activeAccessPoint) { + this._strengthChangedId = this._activeAccessPoint.connect('notify::strength', + this._strengthChanged.bind(this)); + } + + this._sync(); + } + + _sync() { + this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On"); + this._toggleItem.actor.visible = this._client.wireless_hardware_enabled; + + this.item.icon.icon_name = this._getMenuIcon(); + this.item.label.text = this._getStatus(); + } + + setDeviceDescription(desc) { + this._description = desc; + this._sync(); + } + + _getStatus() { + let ap = this._device.active_access_point; + + if (this._isHotSpotMaster()) + /* Translators: %s is a network identifier */ + return _("%s Hotspot Active").format(this._description); + 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) + return ssidToLabel(ap.get_ssid()); + else if (!this._client.wireless_hardware_enabled) + /* Translators: %s is a network identifier */ + return _("%s Hardware Disabled").format(this._description); + else if (!this._client.wireless_enabled) + /* Translators: %s is a network identifier */ + return _("%s Off").format(this._description); + else if (this._device.state == NM.DeviceState.DISCONNECTED) + /* Translators: %s is a network identifier */ + return _("%s Not Connected").format(this._description); + else + return ''; + } + + _getMenuIcon() { + if (this._device.active_connection) + return this.getIndicatorIcon(); + else + return 'network-wireless-signal-none-symbolic'; + } + + _canReachInternet() { + if (this._client.primary_connection != this._device.active_connection) + return true; + + return this._client.connectivity == NM.ConnectivityState.FULL; + } + + _isHotSpotMaster() { + if (!this._device.active_connection) + return false; + + let connection = this._device.active_connection.connection; + if (!connection) + return false; + + let ip4config = connection.get_setting_ip4_config(); + if (!ip4config) + return false; + + return ip4config.get_method() == NM.SETTING_IP4_CONFIG_METHOD_SHARED; + } + + getIndicatorIcon() { + if (this._device.state < NM.DeviceState.PREPARE) + return 'network-wireless-disconnected-symbolic'; + if (this._device.state < NM.DeviceState.ACTIVATED) + return 'network-wireless-acquiring-symbolic'; + + if (this._isHotSpotMaster()) + return 'network-wireless-hotspot-symbolic'; + + let ap = this._device.active_access_point; + if (!ap) { + if (this._device.mode != NM80211Mode.ADHOC) + log('An active wireless connection, in infrastructure mode, involves no access point?'); + + if (this._canReachInternet()) + return 'network-wireless-connected-symbolic'; + else + return 'network-wireless-no-route-symbolic'; + } + + if (this._canReachInternet()) + return 'network-wireless-signal-' + signalToIcon(ap.strength) + '-symbolic'; + else + return 'network-wireless-no-route-symbolic'; + } +}; +Signals.addSignalMethods(NMDeviceWireless.prototype); + +var NMVpnConnectionItem = class extends NMConnectionItem { + isActive() { + if (this._activeConnection == null) + return false; + + return this._activeConnection.vpn_state != NM.VpnConnectionState.DISCONNECTED; + } + + _buildUI() { + this.labelItem = new PopupMenu.PopupMenuItem(''); + this.labelItem.connect('activate', this._toggle.bind(this)); + + this.radioItem = new PopupMenu.PopupSwitchMenuItem(this._connection.get_id(), false); + this.radioItem.connect('toggled', this._toggle.bind(this)); + } + + _sync() { + let isActive = this.isActive(); + this.labelItem.label.text = isActive ? _("Turn Off") : this._section.getConnectLabel(); + this.radioItem.setToggleState(isActive); + this.radioItem.setStatus(this._getStatus()); + this.emit('icon-changed'); + } + + _getStatus() { + if (this._activeConnection == null) + return null; + + switch(this._activeConnection.vpn_state) { + case NM.VpnConnectionState.DISCONNECTED: + case NM.VpnConnectionState.ACTIVATED: + return null; + case NM.VpnConnectionState.PREPARE: + case NM.VpnConnectionState.CONNECT: + case NM.VpnConnectionState.IP_CONFIG_GET: + return _("connecting…"); + case NM.VpnConnectionState.NEED_AUTH: + /* Translators: this is for network connections that require some kind of key or password */ + return _("authentication required"); + case NM.VpnConnectionState.FAILED: + return _("connection failed"); + default: + return 'invalid'; + } + } + + _connectionStateChanged(ac, newstate, reason) { + 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 NM.VpnConnectionStateReason + // to NM.DeviceStateReason + this.emit('activation-failed', reason); + } + + this.emit('icon-changed'); + super._connectionStateChanged(); + } + + setActiveConnection(activeConnection) { + if (this._activeConnectionChangedId > 0) { + this._activeConnection.disconnect(this._activeConnectionChangedId); + this._activeConnectionChangedId = 0; + } + + this._activeConnection = activeConnection; + + if (this._activeConnection) + this._activeConnectionChangedId = this._activeConnection.connect('vpn-state-changed', + this._connectionStateChanged.bind(this)); + + this._sync(); + } + + getIndicatorIcon() { + if (this._activeConnection) { + if (this._activeConnection.vpn_state < NM.VpnConnectionState.ACTIVATED) + return 'network-vpn-acquiring-symbolic'; + else + return 'network-vpn-symbolic'; + } else { + return ''; + } + } +}; + +var NMVpnSection = class extends NMConnectionSection { + constructor(client) { + super(client); + + this.item.menu.addSettingsAction(_("VPN Settings"), 'gnome-network-panel.desktop'); + + this._sync(); + } + + _sync() { + let nItems = this._connectionItems.size; + this.item.actor.visible = (nItems > 0); + + super._sync(); + } + + get category() { + return NMConnectionCategory.VPN; + } + + _getDescription() { + return _("VPN"); + } + + _getStatus() { + let values = this._connectionItems.values(); + for (let item of values) { + if (item.isActive()) + return item.getName(); + } + + return _("VPN Off"); + } + + _getMenuIcon() { + return this.getIndicatorIcon() || 'network-vpn-symbolic'; + } + + activateConnection(connection) { + this._client.activate_connection_async(connection, null, null, null, null); + } + + deactivateConnection(activeConnection) { + this._client.deactivate_connection(activeConnection, null); + } + + setActiveConnections(vpnConnections) { + let connections = this._connectionItems.values(); + for (let item of connections) { + item.setActiveConnection(null); + } + vpnConnections.forEach(a => { + if (a.connection) { + let item = this._connectionItems.get(a.connection.get_uuid()); + item.setActiveConnection(a); + } + }); + } + + _makeConnectionItem(connection) { + return new NMVpnConnectionItem(this, connection); + } + + getIndicatorIcon() { + let items = this._connectionItems.values(); + for (let item of items) { + let icon = item.getIndicatorIcon(); + if (icon) + return icon; + } + return ''; + } +}; +Signals.addSignalMethods(NMVpnSection.prototype); + +var DeviceCategory = class extends PopupMenu.PopupMenuSection { + constructor(category) { + super(); + + this._category = category; + + this.devices = []; + + this.section = new PopupMenu.PopupMenuSection(); + this.section.box.connect('actor-added', this._sync.bind(this)); + this.section.box.connect('actor-removed', this._sync.bind(this)); + this.addMenuItem(this.section); + + this._summaryItem = new PopupMenu.PopupSubMenuMenuItem('', true); + this._summaryItem.icon.icon_name = this._getSummaryIcon(); + this.addMenuItem(this._summaryItem); + + this._summaryItem.menu.addSettingsAction(_('Network Settings'), + 'gnome-network-panel.desktop'); + this._summaryItem.actor.hide(); + + } + + _sync() { + let nDevices = this.section.box.get_children().reduce( + (prev, child) => prev + (child.visible ? 1 : 0), 0); + this._summaryItem.label.text = this._getSummaryLabel(nDevices); + let shouldSummarize = nDevices > MAX_DEVICE_ITEMS; + this._summaryItem.actor.visible = shouldSummarize; + this.section.actor.visible = !shouldSummarize; + } + + _getSummaryIcon() { + switch(this._category) { + case NMConnectionCategory.WIRED: + return 'network-wired-symbolic'; + case NMConnectionCategory.WIRELESS: + case NMConnectionCategory.WWAN: + return 'network-wireless-symbolic'; + } + return ''; + } + + _getSummaryLabel(nDevices) { + switch(this._category) { + case NMConnectionCategory.WIRED: + return ngettext("%s Wired Connection", + "%s Wired Connections", + nDevices).format(nDevices); + case NMConnectionCategory.WIRELESS: + return ngettext("%s Wi-Fi Connection", + "%s Wi-Fi Connections", + nDevices).format(nDevices); + case NMConnectionCategory.WWAN: + return ngettext("%s Modem Connection", + "%s Modem Connections", + nDevices).format(nDevices); + } + return ''; + } +}; + +var NMApplet = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._primaryIndicator = this._addIndicator(); + this._vpnIndicator = this._addIndicator(); + + // Device types + this._dtypes = { }; + 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[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; + + NM.Client.new_async(null, this._clientGot.bind(this)); + } + + _clientGot(obj, result) { + this._client = NM.Client.new_finish(result); + + this._activeConnections = [ ]; + this._connections = [ ]; + this._connectivityQueue = [ ]; + + this._mainConnection = null; + this._mainConnectionIconChangedId = 0; + this._mainConnectionStateChangedId = 0; + + this._notification = null; + + this._nmDevices = []; + this._devices = { }; + + let categories = [NMConnectionCategory.WIRED, + NMConnectionCategory.WIRELESS, + NMConnectionCategory.WWAN]; + for (let category of categories) { + this._devices[category] = new DeviceCategory(category); + this.menu.addMenuItem(this._devices[category]); + } + + this._vpnSection = new NMVpnSection(this._client); + this._vpnSection.connect('activation-failed', this._onActivationFailed.bind(this)); + this._vpnSection.connect('icon-changed', this._updateIcon.bind(this)); + this.menu.addMenuItem(this._vpnSection.item); + + this._readConnections(); + this._readDevices(); + this._syncNMState(); + this._syncMainConnection(); + this._syncVpnConnections(); + + this._client.connect('notify::nm-running', this._syncNMState.bind(this)); + this._client.connect('notify::networking-enabled', this._syncNMState.bind(this)); + this._client.connect('notify::state', this._syncNMState.bind(this)); + this._client.connect('notify::primary-connection', this._syncMainConnection.bind(this)); + this._client.connect('notify::activating-connection', this._syncMainConnection.bind(this)); + this._client.connect('notify::active-connections', this._syncVpnConnections.bind(this)); + this._client.connect('notify::connectivity', this._syncConnectivity.bind(this)); + this._client.connect('device-added', this._deviceAdded.bind(this)); + this._client.connect('device-removed', this._deviceRemoved.bind(this)); + this._client.connect('connection-added', this._connectionAdded.bind(this)); + this._client.connect('connection-removed', this._connectionRemoved.bind(this)); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + } + + _sessionUpdated() { + let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + this.menu.setSensitive(sensitive); + } + + _ensureSource() { + if (!this._source) { + this._source = new MessageTray.Source(_("Network Manager"), + 'network-transmit-receive'); + this._source.policy = new MessageTray.NotificationApplicationPolicy('gnome-network-panel'); + + this._source.connect('destroy', () => { this._source = null; }); + Main.messageTray.add(this._source); + } + } + + _readDevices() { + let devices = this._client.get_devices() || [ ]; + for (let i = 0; i < devices.length; ++i) { + try { + this._deviceAdded(this._client, devices[i], true); + } catch (e) { + log(`Failed to add device ${devices[i]}: ${e}`); + } + } + this._syncDeviceNames(); + } + + _notify(iconName, title, text, urgency) { + if (this._notification) + this._notification.destroy(); + + this._ensureSource(); + + let gicon = new Gio.ThemedIcon({ name: iconName }); + this._notification = new MessageTray.Notification(this._source, title, text, { gicon: gicon }); + this._notification.setUrgency(urgency); + this._notification.setTransient(true); + this._notification.connect('destroy', () => { + this._notification = null; + }); + this._source.notify(this._notification); + } + + _onActivationFailed(device, reason) { + // XXX: nm-applet has no special text depending on reason + // but I'm not sure of this generic message + this._notify('network-error-symbolic', + _("Connection failed"), + _("Activation of network connection failed"), + MessageTray.Urgency.HIGH); + } + + _syncDeviceNames() { + 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]; + if (device._delegate) + device._delegate.setDeviceDescription(description); + } + } + + _deviceAdded(client, device, skipSyncDeviceNames) { + if (device._delegate) { + // already seen, not adding again + return; + } + + let wrapperClass = this._dtypes[device.get_device_type()]; + if (wrapperClass) { + let wrapper = new wrapperClass(this._client, device); + device._delegate = wrapper; + this._addDeviceWrapper(wrapper); + + this._nmDevices.push(device); + this._deviceChanged(device, skipSyncDeviceNames); + + device.connect('notify::interface', () => { + this._deviceChanged(device, false); + }); + } + } + + _deviceChanged(device, skipSyncDeviceNames) { + let wrapper = device._delegate; + + if (!skipSyncDeviceNames) + this._syncDeviceNames(); + + if (wrapper instanceof NMConnectionSection) { + this._connections.forEach(connection => { + wrapper.checkConnection(connection); + }); + } + } + + _addDeviceWrapper(wrapper) { + wrapper._activationFailedId = wrapper.connect('activation-failed', + this._onActivationFailed.bind(this)); + + let section = this._devices[wrapper.category].section; + section.addMenuItem(wrapper.item); + + let devices = this._devices[wrapper.category].devices; + devices.push(wrapper); + } + + _deviceRemoved(client, device) { + let pos = this._nmDevices.indexOf(device); + if (pos != -1) { + this._nmDevices.splice(pos, 1); + this._syncDeviceNames(); + } + + let wrapper = device._delegate; + if (!wrapper) { + log('Removing a network device that was not added'); + return; + } + + this._removeDeviceWrapper(wrapper); + } + + _removeDeviceWrapper(wrapper) { + wrapper.disconnect(wrapper._activationFailedId); + wrapper.destroy(); + + let devices = this._devices[wrapper.category].devices; + let pos = devices.indexOf(wrapper); + devices.splice(pos, 1); + } + + _getMainConnection() { + let connection; + + connection = this._client.get_primary_connection(); + if (connection) { + ensureActiveConnectionProps(connection, this._client); + return connection; + } + + connection = this._client.get_activating_connection(); + if (connection) { + ensureActiveConnectionProps(connection, this._client); + return connection; + } + + return null; + } + + _syncMainConnection() { + if (this._mainConnectionIconChangedId > 0) { + this._mainConnection._primaryDevice.disconnect(this._mainConnectionIconChangedId); + this._mainConnectionIconChangedId = 0; + } + + if (this._mainConnectionStateChangedId > 0) { + this._mainConnection.disconnect(this._mainConnectionStateChangedId); + this._mainConnectionStateChangedId = 0; + } + + this._mainConnection = this._getMainConnection(); + + if (this._mainConnection) { + if (this._mainConnection._primaryDevice) + this._mainConnectionIconChangedId = this._mainConnection._primaryDevice.connect('icon-changed', this._updateIcon.bind(this)); + this._mainConnectionStateChangedId = this._mainConnection.connect('notify::state', this._mainConnectionStateChanged.bind(this)); + this._mainConnectionStateChanged(); + } + + this._updateIcon(); + this._syncConnectivity(); + } + + _syncVpnConnections() { + let activeConnections = this._client.get_active_connections() || []; + let vpnConnections = activeConnections.filter( + a => (a instanceof NM.VpnConnection) + ); + vpnConnections.forEach(a => { + ensureActiveConnectionProps(a, this._client); + }); + this._vpnSection.setActiveConnections(vpnConnections); + + this._updateIcon(); + } + + _mainConnectionStateChanged() { + if (this._mainConnection.state == NM.ActiveConnectionState.ACTIVATED && this._notification) + this._notification.destroy(); + } + + _ignoreConnection(connection) { + let setting = connection.get_setting_connection(); + if (!setting) + return true; + + // Ignore slave connections + if (setting.get_master()) + return true; + + return false; + } + + _addConnection(connection) { + if (this._ignoreConnection(connection)) + return; + if (connection._updatedId) { + // connection was already seen + return; + } + + connection._updatedId = connection.connect('changed', this._updateConnection.bind(this)); + + this._updateConnection(connection); + this._connections.push(connection); + } + + _readConnections() { + let connections = this._client.get_connections(); + connections.forEach(this._addConnection.bind(this)); + } + + _connectionAdded(client, connection) { + this._addConnection(connection); + } + + _connectionRemoved(client, connection) { + let pos = this._connections.indexOf(connection); + if (pos != -1) + this._connections.splice(pos, 1); + + let section = connection._section; + + if (section == NMConnectionCategory.INVALID) + return; + + if (section == NMConnectionCategory.VPN) { + this._vpnSection.removeConnection(connection); + } else { + let devices = this._devices[section].devices; + for (let i = 0; i < devices.length; i++) { + if (devices[i] instanceof NMConnectionSection) + devices[i].removeConnection(connection); + } + } + + connection.disconnect(connection._updatedId); + connection._updatedId = 0; + } + + _updateConnection(connection) { + let connectionSettings = connection.get_setting_by_name(NM.SETTING_CONNECTION_SETTING_NAME); + connection._type = connectionSettings.type; + connection._section = this._ctypes[connection._type] || NMConnectionCategory.INVALID; + + let section = connection._section; + + if (section == NMConnectionCategory.INVALID) + return; + + if (section == NMConnectionCategory.VPN) { + this._vpnSection.checkConnection(connection); + } else { + let devices = this._devices[section].devices; + devices.forEach(wrapper => { + if (wrapper instanceof NMConnectionSection) + wrapper.checkConnection(connection); + }); + } + } + + _syncNMState() { + this.indicators.visible = this._client.nm_running; + this.menu.actor.visible = this._client.networking_enabled; + + this._updateIcon(); + this._syncConnectivity(); + } + + _flushConnectivityQueue() { + if (this._portalHelperProxy) { + for (let item of this._connectivityQueue) + this._portalHelperProxy.CloseRemote(item); + } + + this._connectivityQueue = []; + } + + _closeConnectivityCheck(path) { + let index = this._connectivityQueue.indexOf(path); + + if (index >= 0) { + if (this._portalHelperProxy) + this._portalHelperProxy.CloseRemote(path); + + this._connectivityQueue.splice(index, 1); + } + } + + _portalHelperDone(proxy, emitter, parameters) { + let [path, result] = parameters; + + if (result == PortalHelperResult.CANCELLED) { + // Keep the connection in the queue, so the user is not + // spammed with more logins until we next flush the queue, + // which will happen once he chooses a better connection + // or we get to full connectivity through other means + } else if (result == PortalHelperResult.COMPLETED) { + this._closeConnectivityCheck(path); + return; + } else if (result == PortalHelperResult.RECHECK) { + this._client.check_connectivity_async(null, (client, result) => { + try { + let state = client.check_connectivity_finish(result); + if (state >= NM.ConnectivityState.FULL) + this._closeConnectivityCheck(path); + } catch(e) { } + }); + } else { + log('Invalid result from portal helper: ' + result); + } + } + + _syncConnectivity() { + if (this._mainConnection == null || + this._mainConnection.state != NM.ActiveConnectionState.ACTIVATED) { + this._flushConnectivityQueue(); + return; + } + + 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 < NM.ConnectivityState.FULL; + if (!isPortal || Main.sessionMode.isGreeter) + return; + + let path = this._mainConnection.get_path(); + for (let item of this._connectivityQueue) { + if (item == path) + return; + } + + let timestamp = global.get_current_time(); + if (this._portalHelperProxy) { + this._portalHelperProxy.AuthenticateRemote(path, '', timestamp); + } else { + new PortalHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PortalHelper', + '/org/gnome/Shell/PortalHelper', (proxy, error) => { + if (error) { + log('Error launching the portal helper: ' + error); + return; + } + + this._portalHelperProxy = proxy; + proxy.connectSignal('Done', this._portalHelperDone.bind(this)); + + proxy.AuthenticateRemote(path, '', timestamp); + }); + } + + this._connectivityQueue.push(path); + } + + _updateIcon() { + if (!this._client.networking_enabled) { + this._primaryIndicator.visible = false; + } else { + let dev = null; + if (this._mainConnection) + dev = this._mainConnection._primaryDevice; + + let state = this._client.get_state(); + 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 == NM.ConnectivityState.FULL) + this._primaryIndicator.icon_name = 'network-wired-symbolic'; + else + this._primaryIndicator.icon_name = 'network-wired-no-route-symbolic'; + } + } + + this._vpnIndicator.icon_name = this._vpnSection.getIndicatorIcon(); + this._vpnIndicator.visible = (this._vpnIndicator.icon_name != ''); + } +}; diff --git a/js/ui/status/nightLight.js b/js/ui/status/nightLight.js new file mode 100644 index 0000000..353db92 --- /dev/null +++ b/js/ui/status/nightLight.js @@ -0,0 +1,66 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; + +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const BUS_NAME = 'org.gnome.SettingsDaemon.Color'; +const OBJECT_PATH = '/org/gnome/SettingsDaemon/Color'; + +const ColorInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Color'); +const ColorProxy = Gio.DBusProxy.makeProxyWrapper(ColorInterface); + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'night-light-symbolic'; + this._proxy = new ColorProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + this._proxy.connect('g-properties-changed', + this._sync.bind(this)); + this._sync(); + }); + + this._item = new PopupMenu.PopupSubMenuMenuItem("", true); + this._item.icon.icon_name = 'night-light-symbolic'; + this._disableItem = this._item.menu.addAction('', () => { + this._proxy.DisabledUntilTomorrow = !this._proxy.DisabledUntilTomorrow; + }); + this._item.menu.addAction(_("Turn Off"), () => { + let settings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.plugins.color' }); + settings.set_boolean('night-light-enabled', false); + }); + this._item.menu.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop'); + this.menu.addMenuItem(this._item); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + this._sync(); + } + + _sessionUpdated() { + let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + this.menu.setSensitive(sensitive); + } + + _sync() { + let visible = this._proxy.NightLightActive; + let disabled = this._proxy.DisabledUntilTomorrow; + + this._item.label.text = disabled ? _("Night Light Disabled") + : _("Night Light On"); + this._disableItem.label.text = disabled ? _("Resume") + : _("Disable Until Tomorrow"); + this._item.actor.visible = this._indicator.visible = visible; + } +}; diff --git a/js/ui/status/power.js b/js/ui/status/power.js new file mode 100644 index 0000000..3279811 --- /dev/null +++ b/js/ui/status/power.js @@ -0,0 +1,125 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, St, UPowerGlib: UPower } = imports.gi; + +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const BUS_NAME = 'org.freedesktop.UPower'; +const OBJECT_PATH = '/org/freedesktop/UPower/devices/DisplayDevice'; + +const DisplayDeviceInterface = loadInterfaceXML('org.freedesktop.UPower.Device'); +const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(DisplayDeviceInterface); + +const SHOW_BATTERY_PERCENTAGE = 'show-battery-percentage'; + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); + this._desktopSettings.connect('changed::' + SHOW_BATTERY_PERCENTAGE, + this._sync.bind(this)); + + this._indicator = this._addIndicator(); + this._percentageLabel = new St.Label({ y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + this.indicators.add(this._percentageLabel, { expand: true, y_fill: true }); + this.indicators.add_style_class_name('power-status'); + + this._proxy = new PowerManagerProxy(Gio.DBus.system, BUS_NAME, OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + this._proxy.connect('g-properties-changed', + this._sync.bind(this)); + this._sync(); + }); + + this._item = new PopupMenu.PopupSubMenuMenuItem("", true); + this._item.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop'); + this.menu.addMenuItem(this._item); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + } + + _sessionUpdated() { + let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + this.menu.setSensitive(sensitive); + } + + _getStatus() { + let seconds = 0; + + if (this._proxy.State == UPower.DeviceState.FULLY_CHARGED) + return _("Fully Charged"); + else if (this._proxy.State == UPower.DeviceState.CHARGING) + seconds = this._proxy.TimeToFull; + else if (this._proxy.State == UPower.DeviceState.DISCHARGING) + seconds = this._proxy.TimeToEmpty; + else if (this._proxy.State == UPower.DeviceState.PENDING_CHARGE) + return _("Not Charging"); + // state is PENDING_DISCHARGE + else + return _("Estimating…"); + + let time = Math.round(seconds / 60); + if (time == 0) { + // 0 is reported when UPower does not have enough data + // to estimate battery life + return _("Estimating…"); + } + + let minutes = time % 60; + let hours = Math.floor(time / 60); + + if (this._proxy.State == UPower.DeviceState.DISCHARGING) { + // Translators: this is : Remaining () + return _("%d\u2236%02d Remaining (%d\u2009%%)").format(hours, minutes, this._proxy.Percentage); + } + + if (this._proxy.State == UPower.DeviceState.CHARGING) { + // Translators: this is : Until Full () + return _("%d\u2236%02d Until Full (%d\u2009%%)").format(hours, minutes, this._proxy.Percentage); + } + + return null; + } + + _sync() { + // Do we have batteries or a UPS? + let visible = this._proxy.IsPresent; + if (visible) { + this._item.actor.show(); + this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE); + } else { + // If there's no battery, then we use the power icon. + this._item.actor.hide(); + this._indicator.icon_name = 'system-shutdown-symbolic'; + this._percentageLabel.hide(); + return; + } + + // The icons + let icon = this._proxy.IconName; + this._indicator.icon_name = icon; + this._item.icon.icon_name = icon; + + // The icon label + let label + if (this._proxy.State == UPower.DeviceState.FULLY_CHARGED) + label = _("%d\u2009%%").format(100); + else + label = _("%d\u2009%%").format(this._proxy.Percentage); + this._percentageLabel.clutter_text.set_markup('' + label + ''); + + // The status label + this._item.label.text = this._getStatus(); + } +}; diff --git a/js/ui/status/remoteAccess.js b/js/ui/status/remoteAccess.js new file mode 100644 index 0000000..ab0b55f --- /dev/null +++ b/js/ui/status/remoteAccess.js @@ -0,0 +1,77 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Meta = imports.gi.Meta; + +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +var RemoteAccessApplet = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + let backend = Meta.get_backend(); + let controller = backend.get_remote_access_controller(); + + if (!controller) + return; + + // We can't possibly know about all types of screen sharing on X11, so + // showing these controls on X11 might give a false sense of security. + // Thus, only enable these controls when using Wayland, where we are + // in control of sharing. + if (!Meta.is_wayland_compositor()) + return; + + this._handles = new Set(); + this._indicator = null; + this._menuSection = null; + + controller.connect('new-handle', (controller, handle) => { + this._onNewHandle(handle); + }); + } + + _ensureControls() { + if (this._indicator) + return; + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'screen-shared-symbolic'; + this._indicator.add_style_class_name('remote-access-indicator'); + this._item = + new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"), + true); + this._item.menu.addAction(_("Turn off"), + () => { + for (let handle of this._handles) + handle.stop(); + }); + this._item.icon.icon_name = 'screen-shared-symbolic'; + this.menu.addMenuItem(this._item); + } + + _sync() { + if (this._handles.size == 0) { + this._indicator.visible = false; + this._item.actor.visible = false; + } else { + this._indicator.visible = true; + this._item.actor.visible = true; + } + } + + _onStopped(handle) { + this._handles.delete(handle); + this._sync(); + } + + _onNewHandle(handle) { + this._handles.add(handle); + handle.connect('stopped', this._onStopped.bind(this)); + + if (this._handles.size == 1) { + this._ensureControls(); + this._sync(); + } + } +}; diff --git a/js/ui/status/rfkill.js b/js/ui/status/rfkill.js new file mode 100644 index 0000000..e818e87 --- /dev/null +++ b/js/ui/status/rfkill.js @@ -0,0 +1,108 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; +const Signals = imports.signals; + +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +const BUS_NAME = 'org.gnome.SettingsDaemon.Rfkill'; +const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill'; + +const RfkillManagerInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Rfkill'); +const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface); + +var RfkillManager = class { + constructor() { + this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + this._proxy.connect('g-properties-changed', + this._changed.bind(this)); + this._changed(); + }); + } + + get airplaneMode() { + return this._proxy.AirplaneMode; + } + + set airplaneMode(v) { + this._proxy.AirplaneMode = v; + } + + get hwAirplaneMode() { + return this._proxy.HardwareAirplaneMode; + } + + get shouldShowAirplaneMode() { + return this._proxy.ShouldShowAirplaneMode; + } + + _changed() { + this.emit('airplane-mode-changed'); + } +}; +Signals.addSignalMethods(RfkillManager.prototype); + +var _manager; +function getRfkillManager() { + if (_manager != null) + return _manager; + + _manager = new RfkillManager(); + return _manager; +} + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._manager = getRfkillManager(); + this._manager.connect('airplane-mode-changed', this._sync.bind(this)); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'airplane-mode-symbolic'; + this._indicator.hide(); + + // The menu only appears when airplane mode is on, so just + // statically build it as if it was on, rather than dynamically + // changing the menu contents. + this._item = new PopupMenu.PopupSubMenuMenuItem(_("Airplane Mode On"), true); + this._item.icon.icon_name = 'airplane-mode-symbolic'; + this._offItem = this._item.menu.addAction(_("Turn Off"), () => { + this._manager.airplaneMode = false; + }); + this._item.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop'); + this.menu.addMenuItem(this._item); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + } + + _sessionUpdated() { + let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + this.menu.setSensitive(sensitive); + } + + _sync() { + let airplaneMode = this._manager.airplaneMode; + let hwAirplaneMode = this._manager.hwAirplaneMode; + let showAirplaneMode = this._manager.shouldShowAirplaneMode; + + this._indicator.visible = (airplaneMode && showAirplaneMode); + this._item.actor.visible = (airplaneMode && showAirplaneMode); + this._offItem.setSensitive(!hwAirplaneMode); + + if (hwAirplaneMode) + this._offItem.label.text = _("Use hardware switch to turn off"); + else + this._offItem.label.text = _("Turn Off"); + } +}; diff --git a/js/ui/status/screencast.js b/js/ui/status/screencast.js new file mode 100644 index 0000000..4f147e0 --- /dev/null +++ b/js/ui/status/screencast.js @@ -0,0 +1,21 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'media-record-symbolic'; + this._indicator.add_style_class_name('screencast-indicator'); + this._sync(); + + Main.screencastService.connect('updated', this._sync.bind(this)); + } + + _sync() { + this._indicator.visible = Main.screencastService.isRecording; + } +}; diff --git a/js/ui/status/system.js b/js/ui/status/system.js new file mode 100644 index 0000000..1b0d10d --- /dev/null +++ b/js/ui/status/system.js @@ -0,0 +1,324 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { AccountsService, Clutter, GLib, GObject, Shell, St } = imports.gi; + +const BoxPointer = imports.ui.boxpointer; +const SystemActions = imports.misc.systemActions; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + + +var AltSwitcher = class { + constructor(standard, alternate) { + this._standard = standard; + this._standard.connect('notify::visible', this._sync.bind(this)); + if (this._standard instanceof St.Button) + this._standard.connect('clicked', + () => { this._clickAction.release(); }); + + this._alternate = alternate; + this._alternate.connect('notify::visible', this._sync.bind(this)); + if (this._alternate instanceof St.Button) + this._alternate.connect('clicked', + () => { this._clickAction.release(); }); + + this._capturedEventId = global.stage.connect('captured-event', this._onCapturedEvent.bind(this)); + + this._flipped = false; + + this._clickAction = new Clutter.ClickAction(); + this._clickAction.connect('long-press', this._onLongPress.bind(this)); + + this.actor = new St.Bin(); + this.actor.connect('destroy', this._onDestroy.bind(this)); + this.actor.connect('notify::mapped', () => { this._flipped = false; }); + } + + _sync() { + let childToShow = null; + + if (this._standard.visible && this._alternate.visible) { + let [x, y, mods] = global.get_pointer(); + let altPressed = (mods & Clutter.ModifierType.MOD1_MASK) != 0; + if (this._flipped) + childToShow = altPressed ? this._standard : this._alternate; + else + childToShow = altPressed ? this._alternate : this._standard; + } else if (this._standard.visible) { + childToShow = this._standard; + } else if (this._alternate.visible) { + childToShow = this._alternate; + } else { + this.actor.hide(); + return; + } + + let childShown = this.actor.get_child(); + if (childShown != childToShow) { + if (childShown) { + if (childShown.fake_release) + childShown.fake_release(); + childShown.remove_action(this._clickAction); + } + childToShow.add_action(this._clickAction); + + let hasFocus = this.actor.contains(global.stage.get_key_focus()); + this.actor.set_child(childToShow); + if (hasFocus) + childToShow.grab_key_focus(); + + // The actors might respond to hover, so + // sync the pointer to make sure they update. + global.sync_pointer(); + } + + this.actor.show(); + } + + _onDestroy() { + if (this._capturedEventId > 0) { + global.stage.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + } + + _onCapturedEvent(actor, event) { + let type = event.type(); + if (type == Clutter.EventType.KEY_PRESS || type == Clutter.EventType.KEY_RELEASE) { + let key = event.get_key_symbol(); + if (key == Clutter.KEY_Alt_L || key == Clutter.KEY_Alt_R) + this._sync(); + } + + return Clutter.EVENT_PROPAGATE; + } + + _onLongPress(action, actor, state) { + if (state == Clutter.LongPressState.QUERY || + state == Clutter.LongPressState.CANCEL) + return true; + + this._flipped = !this._flipped; + this._sync(); + return true; + } +}; + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + let userManager = AccountsService.UserManager.get_default(); + this._user = userManager.get_user(GLib.get_user_name()); + + this._systemActions = new SystemActions.getDefault(); + + this._createSubMenu(); + + this._loginScreenItem.actor.connect('notify::visible', + () => { this._updateMultiUser(); }); + this._logoutItem.actor.connect('notify::visible', + () => { this._updateMultiUser(); }); + // Whether shutdown is available or not depends on both lockdown + // settings (disable-log-out) and Polkit policy - the latter doesn't + // notify, so we update the menu item each time the menu opens or + // the lockdown setting changes, which should be close enough. + this.menu.connect('open-state-changed', (menu, open) => { + if (!open) + return; + + this._systemActions.forceUpdate(); + }); + this._updateMultiUser(); + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + this._sessionUpdated(); + } + + _updateActionsVisibility() { + let visible = (this._settingsAction.visible || + this._orientationLockAction.visible || + this._lockScreenAction.visible || + this._altSwitcher.actor.visible); + + this._actionsItem.actor.visible = visible; + } + + _sessionUpdated() { + this._settingsAction.visible = Main.sessionMode.allowSettings; + } + + _updateMultiUser() { + let hasSwitchUser = this._loginScreenItem.actor.visible; + let hasLogout = this._logoutItem.actor.visible; + + this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout; + } + + _updateSwitchUserSubMenu() { + this._switchUserSubMenu.label.text = this._user.get_real_name(); + let clutterText = this._switchUserSubMenu.label.clutter_text; + + // XXX -- for some reason, the ClutterText's width changes + // rapidly unless we force a relayout of the actor. Probably + // a size cache issue or something. Moving this to be a layout + // manager would be a much better idea. + clutterText.get_allocation_box(); + + let layout = clutterText.get_layout(); + if (layout.is_ellipsized()) + this._switchUserSubMenu.label.text = this._user.get_user_name(); + } + + _createActionButton(iconName, accessibleName) { + let icon = new St.Button({ reactive: true, + can_focus: true, + track_hover: true, + accessible_name: accessibleName, + style_class: 'system-menu-action' }); + icon.child = new St.Icon({ icon_name: iconName }); + return icon; + } + + _createSubMenu() { + let bindFlags = GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE; + let item; + + this._switchUserSubMenu = new PopupMenu.PopupSubMenuMenuItem('', true); + this._switchUserSubMenu.icon.set({ + icon_name: 'avatar-default-symbolic', + style_class: 'system-switch-user-submenu-icon' + }); + + // Since the label of the switch user submenu depends on the width of + // the popup menu, and we can't easily connect on allocation-changed + // or notify::width without creating layout cycles, simply update the + // label whenever the menu is opened. + this.menu.connect('open-state-changed', (menu, isOpen) => { + if (isOpen) + this._updateSwitchUserSubMenu(); + }); + + item = new PopupMenu.PopupMenuItem(_("Switch User")); + item.connect('activate', () => { + this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); + this._systemActions.activateSwitchUser(); + }); + this._switchUserSubMenu.menu.addMenuItem(item); + this._loginScreenItem = item; + this._systemActions.bind_property('can-switch-user', + this._loginScreenItem.actor, + 'visible', + bindFlags); + + item = new PopupMenu.PopupMenuItem(_("Log Out")); + item.connect('activate', () => { + this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); + this._systemActions.activateLogout(); + }); + this._switchUserSubMenu.menu.addMenuItem(item); + this._logoutItem = item; + this._systemActions.bind_property('can-logout', + this._logoutItem.actor, + 'visible', + bindFlags); + + this._switchUserSubMenu.menu.addSettingsAction(_("Account Settings"), + 'gnome-user-accounts-panel.desktop'); + + this._user.connect('notify::is-loaded', this._updateSwitchUserSubMenu.bind(this)); + this._user.connect('changed', this._updateSwitchUserSubMenu.bind(this)); + + this.menu.addMenuItem(this._switchUserSubMenu); + + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + item = new PopupMenu.PopupBaseMenuItem({ reactive: false, + can_focus: false }); + this.buttonGroup = item.actor; + + let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( + 'gnome-control-center.desktop' + ); + if (app) { + let [icon, name] = [app.app_info.get_icon().names[0], + app.get_name()]; + this._settingsAction = this._createActionButton(icon, name); + this._settingsAction.connect('clicked', + this._onSettingsClicked.bind(this)); + } else { + log('Missing required core component Settings, expect trouble…'); + this._settingsAction = new St.Widget(); + } + item.actor.add(this._settingsAction, { expand: true, x_fill: false }); + + this._orientationLockAction = this._createActionButton('', _("Orientation Lock")); + this._orientationLockAction.connect('clicked', () => { + this.menu.itemActivated(BoxPointer.PopupAnimation.NONE), + this._systemActions.activateLockOrientation(); + }); + item.actor.add(this._orientationLockAction, { expand: true, x_fill: false }); + this._systemActions.bind_property('can-lock-orientation', + this._orientationLockAction, + 'visible', + bindFlags); + this._systemActions.bind_property('orientation-lock-icon', + this._orientationLockAction.child, + 'icon-name', + bindFlags); + + this._lockScreenAction = this._createActionButton('changes-prevent', _("Lock")); + this._lockScreenAction.connect('clicked', () => { + this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); + this._systemActions.activateLockScreen(); + }); + item.actor.add(this._lockScreenAction, { expand: true, x_fill: false }); + this._systemActions.bind_property('can-lock-screen', + this._lockScreenAction, + 'visible', + bindFlags); + + this._suspendAction = this._createActionButton('media-playback-pause', _("Suspend")); + this._suspendAction.connect('clicked', () => { + this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); + this._systemActions.activateSuspend(); + }); + this._systemActions.bind_property('can-suspend', + this._suspendAction, + 'visible', + bindFlags); + + this._powerOffAction = this._createActionButton('system-shutdown', _("Power Off")); + this._powerOffAction.connect('clicked', () => { + this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); + this._systemActions.activatePowerOff(); + }); + this._systemActions.bind_property('can-power-off', + this._powerOffAction, + 'visible', + bindFlags); + + this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction); + item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false }); + + this._actionsItem = item; + this.menu.addMenuItem(item); + + + this._settingsAction.connect('notify::visible', + () => { this._updateActionsVisibility(); }); + this._orientationLockAction.connect('notify::visible', + () => { this._updateActionsVisibility(); }); + this._lockScreenAction.connect('notify::visible', + () => { this._updateActionsVisibility(); }); + this._altSwitcher.actor.connect('notify::visible', + () => { this._updateActionsVisibility(); }); + } + + _onSettingsClicked() { + this.menu.itemActivated(); + Main.overview.hide(); + this._settingsApp.activate(); + } +}; diff --git a/js/ui/status/thunderbolt.js b/js/ui/status/thunderbolt.js new file mode 100644 index 0000000..b36819a --- /dev/null +++ b/js/ui/status/thunderbolt.js @@ -0,0 +1,337 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +// the following is a modified version of bolt/contrib/js/client.js + +const { Gio, GLib, Polkit, Shell } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const PanelMenu = imports.ui.panelMenu; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +/* Keep in sync with data/org.freedesktop.bolt.xml */ + +const BoltClientInterface = loadInterfaceXML('org.freedesktop.bolt1.Manager'); +const BoltDeviceInterface = loadInterfaceXML('org.freedesktop.bolt1.Device'); + +const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface); + +/* */ + +var Status = { + DISCONNECTED: 'disconnected', + CONNECTING: 'connecting', + CONNECTED: 'connected', + AUTHORIZING: 'authorizing', + AUTH_ERROR: 'auth-error', + AUTHORIZED: 'authorized' +}; + +var Policy = { + DEFAULT: 'default', + MANUAL: 'manual', + AUTO: 'auto' +}; + +var AuthCtrl = { + NONE: 'none', +}; + +var AuthMode = { + DISABLED: 'disabled', + ENABLED: 'enabled' +}; + +const BOLT_DBUS_CLIENT_IFACE = 'org.freedesktop.bolt1.Manager'; +const BOLT_DBUS_NAME = 'org.freedesktop.bolt'; +const BOLT_DBUS_PATH = '/org/freedesktop/bolt'; + +var Client = class { + constructor() { + this._proxy = null; + let nodeInfo = Gio.DBusNodeInfo.new_for_xml(BoltClientInterface); + Gio.DBusProxy.new(Gio.DBus.system, + Gio.DBusProxyFlags.DO_NOT_AUTO_START, + nodeInfo.lookup_interface(BOLT_DBUS_CLIENT_IFACE), + BOLT_DBUS_NAME, + BOLT_DBUS_PATH, + BOLT_DBUS_CLIENT_IFACE, + null, + this._onProxyReady.bind(this)); + + this.probing = false; + } + + _onProxyReady(o, res) { + try { + this._proxy = Gio.DBusProxy.new_finish(res); + } catch(e) { + log('error creating bolt proxy: %s'.format(e.message)); + return; + } + this._propsChangedId = this._proxy.connect('g-properties-changed', this._onPropertiesChanged.bind(this)); + this._deviceAddedId = this._proxy.connectSignal('DeviceAdded', this._onDeviceAdded.bind(this)); + + this.probing = this._proxy.Probing; + if (this.probing) + this.emit('probing-changed', this.probing); + + } + + _onPropertiesChanged(proxy, properties) { + let unpacked = properties.deep_unpack(); + if (!('Probing' in unpacked)) + return; + + this.probing = this._proxy.Probing; + this.emit('probing-changed', this.probing); + } + + _onDeviceAdded(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() { + if (!this._proxy) + return; + + this._proxy.disconnectSignal(this._deviceAddedId); + this._proxy.disconnect(this._propsChangedId); + this._proxy = null; + } + + enrollDevice(id, policy, callback) { + this._proxy.EnrollDeviceRemote(id, policy, AuthCtrl.NONE, + (res, error) => { + if (error) { + Gio.DBusError.strip_remote_error(error); + callback(null, error); + return; + } + + let [path] = res; + let device = new BoltDeviceProxy(Gio.DBus.system, + BOLT_DBUS_NAME, + path); + callback(device, null); + }); + } + + get authMode () { + return this._proxy.AuthMode; + } +}; +Signals.addSignalMethods(Client.prototype); + +/* helper class to automatically authorize new devices */ +var AuthRobot = class { + constructor(client) { + this._client = client; + + this._devicesToEnroll = []; + this._enrolling = false; + + this._client.connect('device-added', this._onDeviceAdded.bind(this)); + } + + close() { + 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(cli, dev) { + if (dev.Status !== Status.CONNECTED) + return; + + /* check if authorization is enabled in the daemon. if not + * we won't even bother authorizing, because we will only + * get an error back. The exact contents of AuthMode might + * change in the future, but must contain AuthMode.ENABLED + * if it is enabled. */ + if (!cli.authMode.split('|').includes(AuthMode.ENABLED)) + 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() { + if (this._enrolling) + return; + + this._enrolling = true; + GLib.idle_add(GLib.PRIORITY_DEFAULT, + this._enrollDevicesIdle.bind(this)); + } + + _onEnrollDone(device, error) { + if (error) + this.emit('enroll-failed', device, error); + + /* 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, + this._enrollDevicesIdle.bind(this)); + } + + _enrollDevicesIdle() { + let devices = this._devicesToEnroll; + + let dev = devices.shift(); + if (dev === undefined) + return GLib.SOURCE_REMOVE; + + this._client.enrollDevice(dev.Uid, + Policy.DEFAULT, + this._onEnrollDone.bind(this)); + return GLib.SOURCE_REMOVE; + } +}; +Signals.addSignalMethods(AuthRobot.prototype); + +/* eof client.js */ + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'thunderbolt-symbolic'; + + this._client = new Client(); + this._client.connect('probing-changed', this._onProbing.bind(this)); + + this._robot = new AuthRobot(this._client); + + this._robot.connect('enroll-device', this._onEnrollDevice.bind(this)); + this._robot.connect('enroll-failed', this._onEnrollFailed.bind(this)); + + Main.sessionMode.connect('updated', this._sync.bind(this)); + this._sync(); + + this._source = null; + this._perm = null; + + Polkit.Permission.new('org.freedesktop.bolt.enroll', null, null, (source, res) => { + try { + this._perm = Polkit.Permission.new_finish(res); + } catch (e) { + log('Failed to get PolKit permission: %s'.format(e.toString())); + } + }); + } + + _onDestroy() { + this._robot.close(); + this._client.close(); + } + + _ensureSource() { + if (!this._source) { + this._source = new MessageTray.Source(_("Thunderbolt"), + 'thunderbolt-symbolic'); + this._source.connect('destroy', () => { this._source = null; }); + + Main.messageTray.add(this._source); + } + + return this._source; + } + + _notify(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', () => { + 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() { + let active = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + this._indicator.visible = active && this._client.probing; + } + + /* Bolt.Client callbacks */ + _onProbing(cli, probing) { + if (probing) + this._indicator.icon_name = 'thunderbolt-acquiring-symbolic'; + else + this._indicator.icon_name = 'thunderbolt-symbolic'; + + this._sync(); + } + + /* AuthRobot callbacks */ + _onEnrollDevice(obj, device, policy) { + /* only authorize new devices when in an unlocked user session */ + let unlocked = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + /* and if we have the permission to do so, otherwise we trigger a PolKit dialog */ + let allowed = this._perm && this._perm.allowed; + + let auth = unlocked && allowed; + policy[0] = auth; + + log(`thunderbolt: [${device.Name}] auto enrollment: ${auth ? 'yes' : 'no'} (allowed: ${allowed ? 'yes' : 'no'})`); + + if (auth) + return; /* we are done */ + + if (!unlocked) { + 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); + } else { + const title = _("Unauthorized Thunderbolt device"); + const body = _("New device has been detected and needs to be authorized by an administrator."); + this._notify(title, body); + } + } + + _onEnrollFailed(obj, device, error) { + const title = _("Thunderbolt authorization error"); + const body = _("Could not authorize the Thunderbolt device: %s").format(error.message); + this._notify(title, body); + } +}; diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js new file mode 100644 index 0000000..d555b42 --- /dev/null +++ b/js/ui/status/volume.js @@ -0,0 +1,378 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, Gvc, St } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; +const Slider = imports.ui.slider; + +const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent'; + +var VOLUME_NOTIFY_ID = 1; + +// Each Gvc.MixerControl is a connection to PulseAudio, +// so it's better to make it a singleton +let _mixerControl; +function getMixerControl() { + if (_mixerControl) + return _mixerControl; + + _mixerControl = new Gvc.MixerControl({ name: 'GNOME Shell Volume Control' }); + _mixerControl.open(); + + return _mixerControl; +} + +var StreamSlider = class { + constructor(control) { + this._control = control; + + this.item = new PopupMenu.PopupBaseMenuItem({ activate: false }); + + this._slider = new Slider.Slider(0); + + this._soundSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.sound' }); + this._soundSettings.connect('changed::' + ALLOW_AMPLIFIED_VOLUME_KEY, this._amplifySettingsChanged.bind(this)); + this._amplifySettingsChanged(); + + this._slider.connect('value-changed', this._sliderChanged.bind(this)); + this._slider.connect('drag-end', this._notifyVolumeChange.bind(this)); + + this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); + this.item.actor.add(this._icon); + this.item.actor.add(this._slider.actor, { expand: true }); + this.item.actor.connect('button-press-event', (actor, event) => { + return this._slider.startDragging(event); + }); + this.item.actor.connect('key-press-event', (actor, event) => { + return this._slider.onKeyPressEvent(actor, event); + }); + + this._stream = null; + this._volumeCancellable = null; + } + + get stream() { + return this._stream; + } + + set stream(stream) { + if (this._stream) { + this._disconnectStream(this._stream); + } + + this._stream = stream; + + if (this._stream) { + this._connectStream(this._stream); + this._updateVolume(); + } else { + this.emit('stream-updated'); + } + + this._updateVisibility(); + } + + _disconnectStream(stream) { + stream.disconnect(this._mutedChangedId); + this._mutedChangedId = 0; + stream.disconnect(this._volumeChangedId); + this._volumeChangedId = 0; + } + + _connectStream(stream) { + this._mutedChangedId = stream.connect('notify::is-muted', this._updateVolume.bind(this)); + this._volumeChangedId = stream.connect('notify::volume', this._updateVolume.bind(this)); + } + + _shouldBeVisible() { + return this._stream != null; + } + + _updateVisibility() { + let visible = this._shouldBeVisible(); + this.item.actor.visible = visible; + } + + scroll(event) { + return this._slider.scroll(event); + } + + setValue(value) { + // piggy-back off of sliderChanged + this._slider.setValue(value); + } + + _sliderChanged(slider, value, property) { + if (!this._stream) + return; + + let volume = value * this._control.get_vol_max_norm(); + let prevMuted = this._stream.is_muted; + if (volume < 1) { + this._stream.volume = 0; + if (!prevMuted) + this._stream.change_is_muted(true); + } else { + this._stream.volume = volume; + if (prevMuted) + this._stream.change_is_muted(false); + } + this._stream.push_volume(); + } + + _notifyVolumeChange() { + if (this._volumeCancellable) + this._volumeCancellable.cancel(); + + this._volumeCancellable = new Gio.Cancellable(); + let player = global.display.get_sound_player(); + player.play_from_theme('audio-volume-change', + _("Volume changed"), + this._volumeCancellable); + } + + _updateVolume() { + let muted = this._stream.is_muted; + this._slider.setValue(muted ? 0 : (this._stream.volume / this._control.get_vol_max_norm())); + this.emit('stream-updated'); + } + + _amplifySettingsChanged() { + this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY); + + if (this._allowAmplified) + this._slider.setMaximumValue(this.getMaxLevel() / 100); + else + this._slider.setMaximumValue(1); + + if (this._stream) + this._updateVolume(); + } + + getIcon() { + if (!this._stream) + return null; + + let icons = ["audio-volume-muted-symbolic", + "audio-volume-low-symbolic", + "audio-volume-medium-symbolic", + "audio-volume-high-symbolic", + "audio-volume-overamplified-symbolic"]; + + let volume = this._stream.volume; + let n; + if (this._stream.is_muted || volume <= 0) { + n = 0; + } else { + n = Math.ceil(3 * volume / this._control.get_vol_max_norm()); + if (n < 1) + n = 1; + else if (n > 3) + n = 4; + } + return icons[n]; + } + + getLevel() { + if (!this._stream) + return null; + + return 100 * this._stream.volume / this._control.get_vol_max_norm(); + } + + getMaxLevel() { + let maxVolume = this._control.get_vol_max_norm(); + if (this._allowAmplified) + maxVolume = this._control.get_vol_max_amplified(); + + return 100 * maxVolume / this._control.get_vol_max_norm(); + } +}; +Signals.addSignalMethods(StreamSlider.prototype); + +var OutputStreamSlider = class extends StreamSlider { + constructor(control) { + super(control); + this._slider.actor.accessible_name = _("Volume"); + } + + _connectStream(stream) { + super._connectStream(stream); + this._portChangedId = stream.connect('notify::port', this._portChanged.bind(this)); + this._portChanged(); + } + + _findHeadphones(sink) { + // This only works for external headphones (e.g. bluetooth) + if (sink.get_form_factor() == 'headset' || + sink.get_form_factor() == 'headphone') + return true; + + // a bit hackish, but ALSA/PulseAudio have a number + // of different identifiers for headphones, and I could + // not find the complete list + if (sink.get_ports().length > 0) + return sink.get_port().port.indexOf('headphone') >= 0; + + return false; + } + + _disconnectStream(stream) { + super._disconnectStream(stream); + stream.disconnect(this._portChangedId); + this._portChangedId = 0; + } + + _updateSliderIcon() { + this._icon.icon_name = (this._hasHeadphones ? + 'audio-headphones-symbolic' : + 'audio-speakers-symbolic'); + } + + _portChanged() { + let hasHeadphones = this._findHeadphones(this._stream); + if (hasHeadphones != this._hasHeadphones) { + this._hasHeadphones = hasHeadphones; + this._updateSliderIcon(); + } + } +}; + +var InputStreamSlider = class extends StreamSlider { + constructor(control) { + super(control); + this._slider.actor.accessible_name = _("Microphone"); + this._control.connect('stream-added', this._maybeShowInput.bind(this)); + this._control.connect('stream-removed', this._maybeShowInput.bind(this)); + this._icon.icon_name = 'audio-input-microphone-symbolic'; + } + + _connectStream(stream) { + super._connectStream(stream); + this._maybeShowInput(); + } + + _maybeShowInput() { + // only show input widgets if any application is recording audio + let showInput = false; + let recordingApps = this._control.get_source_outputs(); + if (this._stream && recordingApps) { + for (let i = 0; i < recordingApps.length; i++) { + let outputStream = recordingApps[i]; + let id = outputStream.get_application_id(); + // but skip gnome-volume-control and pavucontrol + // (that appear as recording because they show the input level) + if (!id || (id != 'org.gnome.VolumeControl' && id != 'org.PulseAudio.pavucontrol')) { + showInput = true; + break; + } + } + } + + this._showInput = showInput; + this._updateVisibility(); + } + + _shouldBeVisible() { + return super._shouldBeVisible() && this._showInput; + } +}; + +var VolumeMenu = class extends PopupMenu.PopupMenuSection { + constructor(control) { + super(); + + this.hasHeadphones = false; + + this._control = control; + this._control.connect('state-changed', this._onControlStateChanged.bind(this)); + this._control.connect('default-sink-changed', this._readOutput.bind(this)); + this._control.connect('default-source-changed', this._readInput.bind(this)); + + this._output = new OutputStreamSlider(this._control); + this._output.connect('stream-updated', () => { + this.emit('icon-changed'); + }); + this.addMenuItem(this._output.item); + + this._input = new InputStreamSlider(this._control); + this.addMenuItem(this._input.item); + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + this._onControlStateChanged(); + } + + scroll(event) { + return this._output.scroll(event); + } + + _onControlStateChanged() { + if (this._control.get_state() == Gvc.MixerControlState.READY) { + this._readInput(); + this._readOutput(); + } else { + this.emit('icon-changed'); + } + } + + _readOutput() { + this._output.stream = this._control.get_default_sink(); + } + + _readInput() { + this._input.stream = this._control.get_default_source(); + } + + getIcon() { + return this._output.getIcon(); + } + + getLevel() { + return this._output.getLevel(); + } + + getMaxLevel() { + return this._output.getMaxLevel(); + } +}; + +var Indicator = class extends PanelMenu.SystemIndicator { + constructor() { + super(); + + this._primaryIndicator = this._addIndicator(); + + this._control = getMixerControl(); + this._volumeMenu = new VolumeMenu(this._control); + this._volumeMenu.connect('icon-changed', menu => { + let icon = this._volumeMenu.getIcon(); + + if (icon != null) { + this.indicators.show(); + this._primaryIndicator.icon_name = icon; + } else { + this.indicators.hide(); + } + }); + + this.menu.addMenuItem(this._volumeMenu); + + this.indicators.connect('scroll-event', this._onScrollEvent.bind(this)); + } + + _onScrollEvent(actor, event) { + let result = this._volumeMenu.scroll(event); + if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped) + return result; + + let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() }); + let level = parseInt(this._volumeMenu.getLevel()); + let maxLevel = parseInt(this._volumeMenu.getMaxLevel()); + Main.osdWindowManager.show(-1, gicon, null, level, maxLevel); + return result; + } +}; diff --git a/js/ui/switchMonitor.js b/js/ui/switchMonitor.js new file mode 100644 index 0000000..df802fe --- /dev/null +++ b/js/ui/switchMonitor.js @@ -0,0 +1,93 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GObject, Meta, St } = imports.gi; + +const SwitcherPopup = imports.ui.switcherPopup; + +var APP_ICON_SIZE = 96; + +var SwitchMonitorPopup = GObject.registerClass( +class SwitchMonitorPopup extends SwitcherPopup.SwitcherPopup { + _init() { + let items = [{ icon: 'view-mirror-symbolic', + /* Translators: this is for display mirroring i.e. cloning. + * Try to keep it under around 15 characters. + */ + label: _('Mirror') }, + { icon: 'video-joined-displays-symbolic', + /* Translators: this is for the desktop spanning displays. + * Try to keep it under around 15 characters. + */ + label: _('Join Displays') }, + { icon: 'video-single-display-symbolic', + /* Translators: this is for using only an external display. + * Try to keep it under around 15 characters. + */ + label: _('External Only') }, + { icon: 'computer-symbolic', + /* Translators: this is for using only the laptop display. + * Try to keep it under around 15 characters. + */ + label: _('Built-in Only') }]; + + super._init(items); + + this._switcherList = new SwitchMonitorSwitcher(items); + } + + show(backward, binding, mask) { + if (!Meta.MonitorManager.get().can_switch_config()) + return false; + + return super.show(backward, binding, mask); + } + + _initialSelection() { + let currentConfig = Meta.MonitorManager.get().get_switch_config(); + let selectConfig = (currentConfig + 1) % Meta.MonitorSwitchConfigType.UNKNOWN; + this._select(selectConfig); + } + + _keyPressHandler(keysym, action) { + if (action == Meta.KeyBindingAction.SWITCH_MONITOR) + this._select(this._next()); + else if (keysym == Clutter.Left) + this._select(this._previous()); + else if (keysym == Clutter.Right) + this._select(this._next()); + else + return Clutter.EVENT_PROPAGATE; + + return Clutter.EVENT_STOP; + } + + _finish() { + super._finish(); + + Meta.MonitorManager.get().switch_config(this._selectedIndex); + } +}); + +var SwitchMonitorSwitcher = GObject.registerClass( +class SwitchMonitorSwitcher extends SwitcherPopup.SwitcherList { + _init(items) { + super._init(true); + + for (let i = 0; i < items.length; i++) + this._addIcon(items[i]); + } + + _addIcon(item) { + let box = new St.BoxLayout({ style_class: 'alt-tab-app', + vertical: true }); + + let icon = new St.Icon({ icon_name: item.icon, + icon_size: APP_ICON_SIZE }); + box.add(icon, { x_fill: false, y_fill: false } ); + + let text = new St.Label({ text: item.label }); + box.add(text, { x_fill: false }); + + this.addItem(box, text); + } +}); diff --git a/js/ui/switcherPopup.js b/js/ui/switcherPopup.js new file mode 100644 index 0000000..c28c229 --- /dev/null +++ b/js/ui/switcherPopup.js @@ -0,0 +1,636 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, GObject, Meta, St } = imports.gi; +const Mainloop = imports.mainloop; + +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +var POPUP_DELAY_TIMEOUT = 150; // milliseconds + +var POPUP_SCROLL_TIME = 0.10; // seconds +var POPUP_FADE_OUT_TIME = 0.1; // seconds + +var DISABLE_HOVER_TIMEOUT = 500; // milliseconds +var NO_MODS_TIMEOUT = 1500; // milliseconds + +function mod(a, b) { + return (a + b) % b; +} + +function primaryModifier(mask) { + if (mask == 0) + return 0; + + let primary = 1; + while (mask > 1) { + mask >>= 1; + primary <<= 1; + } + return primary; +} + +var SwitcherPopup = GObject.registerClass( +class SwitcherPopup extends St.Widget { + _init(items) { + if (new.target === SwitcherPopup) + throw new TypeError('Cannot instantiate abstract class ' + new.target.name); + + super._init({ style_class: 'switcher-popup', + reactive: true, + visible: false }); + + this._switcherList = null; + + this._items = items || []; + this._selectedIndex = 0; + + this.connect('destroy', this._onDestroy.bind(this)); + + Main.uiGroup.add_actor(this); + + this._haveModal = false; + this._modifierMask = 0; + + this._motionTimeoutId = 0; + this._initialDelayTimeoutId = 0; + this._noModsTimeoutId = 0; + + this.add_constraint(new Clutter.BindConstraint({ + source: global.stage, + coordinate: Clutter.BindCoordinate.ALL, + })); + + // Initially disable hover so we ignore the enter-event if + // the switcher appears underneath the current pointer location + this._disableHover(); + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let childBox = new Clutter.ActorBox(); + let primary = Main.layoutManager.primaryMonitor; + + let leftPadding = this.get_theme_node().get_padding(St.Side.LEFT); + let rightPadding = this.get_theme_node().get_padding(St.Side.RIGHT); + let hPadding = leftPadding + rightPadding; + + // Allocate the switcherList + // We select a size based on an icon size that does not overflow the screen + let [childMinHeight, childNaturalHeight] = this._switcherList.get_preferred_height(primary.width - hPadding); + let [childMinWidth, childNaturalWidth] = this._switcherList.get_preferred_width(childNaturalHeight); + childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2)); + childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth); + childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2); + childBox.y2 = childBox.y1 + childNaturalHeight; + this._switcherList.allocate(childBox, flags); + } + + _initialSelection(backward, binding) { + if (backward) + this._select(this._items.length - 1); + else if (this._items.length == 1) + this._select(0); + else + this._select(1); + } + + show(backward, binding, mask) { + if (this._items.length == 0) + return false; + + if (!Main.pushModal(this)) { + // Probably someone else has a pointer grab, try again with keyboard only + if (!Main.pushModal(this, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED })) + return false; + } + this._haveModal = true; + this._modifierMask = primaryModifier(mask); + + this.connect('key-press-event', this._keyPressEvent.bind(this)); + this.connect('key-release-event', this._keyReleaseEvent.bind(this)); + + this.connect('button-press-event', this._clickedOutside.bind(this)); + this.connect('scroll-event', this._scrollEvent.bind(this)); + + this.add_actor(this._switcherList); + this._switcherList.connect('item-activated', this._itemActivated.bind(this)); + this._switcherList.connect('item-entered', this._itemEntered.bind(this)); + this._switcherList.connect('item-removed', this._itemRemoved.bind(this)); + + // Need to force an allocation so we can figure out whether we + // need to scroll when selecting + this.opacity = 0; + this.visible = true; + this.get_allocation_box(); + + this._initialSelection(backward, binding); + + // There's a race condition; if the user released Alt before + // we got the grab, then we won't be notified. (See + // https://bugzilla.gnome.org/show_bug.cgi?id=596695 for + // details.) So we check now. (Have to do this after updating + // selection.) + if (this._modifierMask) { + let [x, y, mods] = global.get_pointer(); + if (!(mods & this._modifierMask)) { + this._finish(global.get_current_time()); + return false; + } + } else { + this._resetNoModsTimeout(); + } + + // We delay showing the popup so that fast Alt+Tab users aren't + // disturbed by the popup briefly flashing. + this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT, + () => { + Main.osdWindowManager.hideAll(); + this.opacity = 255; + this._initialDelayTimeoutId = 0; + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(this._initialDelayTimeoutId, '[gnome-shell] Main.osdWindow.cancel'); + return true; + } + + _next() { + return mod(this._selectedIndex + 1, this._items.length); + } + + _previous() { + return mod(this._selectedIndex - 1, this._items.length); + } + + _keyPressHandler(keysym, action) { + throw new Error('Not implemented'); + } + + _keyPressEvent(actor, event) { + let keysym = event.get_key_symbol(); + let action = global.display.get_keybinding_action(event.get_key_code(), event.get_state()); + + this._disableHover(); + + if (this._keyPressHandler(keysym, action) != Clutter.EVENT_PROPAGATE) + return Clutter.EVENT_STOP; + + // Note: pressing one of the below keys will destroy the popup only if + // that key is not used by the active popup's keyboard shortcut + if (keysym == Clutter.Escape || keysym == Clutter.Tab) + this.fadeAndDestroy(); + + return Clutter.EVENT_STOP; + } + + _keyReleaseEvent(actor, event) { + if (this._modifierMask) { + let [x, y, mods] = global.get_pointer(); + let state = mods & this._modifierMask; + + if (state == 0) + this._finish(event.get_time()); + } else { + this._resetNoModsTimeout(); + } + + return Clutter.EVENT_STOP; + } + + _clickedOutside(actor, event) { + this.fadeAndDestroy(); + return Clutter.EVENT_PROPAGATE; + } + + _scrollHandler(direction) { + if (direction == Clutter.ScrollDirection.UP) + this._select(this._previous()); + else if (direction == Clutter.ScrollDirection.DOWN) + this._select(this._next()); + } + + _scrollEvent(actor, event) { + this._scrollHandler(event.get_scroll_direction()); + return Clutter.EVENT_PROPAGATE; + } + + _itemActivatedHandler(n) { + this._select(n); + } + + _itemActivated(switcher, n) { + this._itemActivatedHandler(n); + this._finish(global.get_current_time()); + } + + _itemEnteredHandler(n) { + this._select(n); + } + + _itemEntered(switcher, n) { + if (!this.mouseActive) + return; + this._itemEnteredHandler(n); + } + + _itemRemovedHandler(n) { + if (this._items.length > 0) { + let newIndex = Math.min(n, this._items.length - 1); + this._select(newIndex); + } else { + this.fadeAndDestroy(); + } + } + + _itemRemoved(switcher, n) { + this._itemRemovedHandler(n); + } + + _disableHover() { + this.mouseActive = false; + + if (this._motionTimeoutId != 0) + Mainloop.source_remove(this._motionTimeoutId); + + this._motionTimeoutId = Mainloop.timeout_add(DISABLE_HOVER_TIMEOUT, this._mouseTimedOut.bind(this)); + GLib.Source.set_name_by_id(this._motionTimeoutId, '[gnome-shell] this._mouseTimedOut'); + } + + _mouseTimedOut() { + this._motionTimeoutId = 0; + this.mouseActive = true; + return GLib.SOURCE_REMOVE; + } + + _resetNoModsTimeout() { + if (this._noModsTimeoutId != 0) + Mainloop.source_remove(this._noModsTimeoutId); + + this._noModsTimeoutId = Mainloop.timeout_add(NO_MODS_TIMEOUT, + () => { + this._finish(global.get_current_time()); + this._noModsTimeoutId = 0; + return GLib.SOURCE_REMOVE; + }); + } + + _popModal() { + if (this._haveModal) { + Main.popModal(this); + this._haveModal = false; + } + } + + fadeAndDestroy() { + this._popModal(); + if (this.visible) { + Tweener.addTween(this, + { opacity: 0, + time: POPUP_FADE_OUT_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this.destroy(); + } + }); + } else { + this.destroy(); + } + } + + _finish(timestamp) { + this.fadeAndDestroy(); + } + + _onDestroy() { + this._popModal(); + + if (this._motionTimeoutId != 0) + Mainloop.source_remove(this._motionTimeoutId); + if (this._initialDelayTimeoutId != 0) + Mainloop.source_remove(this._initialDelayTimeoutId); + if (this._noModsTimeoutId != 0) + Mainloop.source_remove(this._noModsTimeoutId); + } + + _select(num) { + this._selectedIndex = num; + this._switcherList.highlight(num); + } +}); + +var SwitcherButton = GObject.registerClass( +class SwitcherButton extends St.Button { + _init(square) { + super._init({ style_class: 'item-box', + reactive: true }); + + this._square = square; + } + + vfunc_get_preferred_width(forHeight) { + if (this._square) + return this.get_preferred_height(-1); + else + return super.vfunc_get_preferred_width(forHeight); + } +}); + +var SwitcherList = GObject.registerClass({ + Signals: { 'item-activated': { param_types: [GObject.TYPE_INT] }, + 'item-entered': { param_types: [GObject.TYPE_INT] }, + 'item-removed': { param_types: [GObject.TYPE_INT] } }, +}, class SwitcherList extends St.Widget { + _init(squareItems) { + super._init({ style_class: 'switcher-list' }); + + this._list = new St.BoxLayout({ style_class: 'switcher-list-item-container', + vertical: false, + x_expand: true, + y_expand: true }); + + let layoutManager = this._list.get_layout_manager(); + + this._list.spacing = 0; + this._list.connect('style-changed', () => { + this._list.spacing = this._list.get_theme_node().get_length('spacing'); + }); + + this._scrollView = new St.ScrollView({ style_class: 'hfade', + enable_mouse_scrolling: false }); + this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.NEVER); + + this._scrollView.add_actor(this._list); + this.add_actor(this._scrollView); + + // Those arrows indicate whether scrolling in one direction is possible + this._leftArrow = new St.DrawingArea({ style_class: 'switcher-arrow', + pseudo_class: 'highlighted' }); + this._leftArrow.connect('repaint', () => { + drawArrow(this._leftArrow, St.Side.LEFT); + }); + this._rightArrow = new St.DrawingArea({ style_class: 'switcher-arrow', + pseudo_class: 'highlighted' }); + this._rightArrow.connect('repaint', () => { + drawArrow(this._rightArrow, St.Side.RIGHT); + }); + + this.add_actor(this._leftArrow); + this.add_actor(this._rightArrow); + + this._items = []; + this._highlighted = -1; + this._squareItems = squareItems; + this._scrollableRight = true; + this._scrollableLeft = false; + + layoutManager.homogeneous = squareItems; + } + + addItem(item, label) { + let bbox = new SwitcherButton(this._squareItems); + + bbox.set_child(item); + this._list.add_actor(bbox); + + let n = this._items.length; + bbox.connect('clicked', () => { this._onItemClicked(n); }); + bbox.connect('motion-event', () => this._onItemEnter(n)); + + bbox.label_actor = label; + + this._items.push(bbox); + + return bbox; + } + + removeItem(index) { + let item = this._items.splice(index, 1); + item[0].destroy(); + this.emit('item-removed', index); + } + + _onItemClicked(index) { + this._itemActivated(index); + } + + _onItemEnter(index) { + // Avoid reentrancy + if (index != this._currentItemEntered) { + this._currentItemEntered = index; + this._itemEntered(index); + } + return Clutter.EVENT_PROPAGATE; + } + + highlight(index, justOutline) { + if (this._items[this._highlighted]) { + this._items[this._highlighted].remove_style_pseudo_class('outlined'); + this._items[this._highlighted].remove_style_pseudo_class('selected'); + } + + if (this._items[index]) { + if (justOutline) + this._items[index].add_style_pseudo_class('outlined'); + else + 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(); + let [result, posX, posY] = this.transform_stage_point(absItemX, 0); + let [containerWidth, containerHeight] = this.get_transformed_size(); + if (posX + this._items[index].get_width() > containerWidth) + this._scrollToRight(); + else if (this._items[index].allocation.x1 - value < 0) + this._scrollToLeft(); + + } + + _scrollToLeft() { + let adjustment = this._scrollView.hscroll.adjustment; + let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values(); + + let item = this._items[this._highlighted]; + + if (item.allocation.x1 < value) + value = Math.min(0, item.allocation.x1); + else if (item.allocation.x2 > value + pageSize) + value = Math.max(upper, item.allocation.x2 - pageSize); + + this._scrollableRight = true; + Tweener.addTween(adjustment, + { value: value, + time: POPUP_SCROLL_TIME, + transition: 'easeOutQuad', + onComplete: () => { + if (this._highlighted == 0) + this._scrollableLeft = false; + this.queue_relayout(); + } + }); + } + + _scrollToRight() { + let adjustment = this._scrollView.hscroll.adjustment; + let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values(); + + let item = this._items[this._highlighted]; + + if (item.allocation.x1 < value) + value = Math.max(0, item.allocation.x1); + else if (item.allocation.x2 > value + pageSize) + value = Math.min(upper, item.allocation.x2 - pageSize); + + this._scrollableLeft = true; + Tweener.addTween(adjustment, + { value: value, + time: POPUP_SCROLL_TIME, + transition: 'easeOutQuad', + onComplete: () => { + if (this._highlighted == this._items.length - 1) + this._scrollableRight = false; + this.queue_relayout(); + } + }); + } + + _itemActivated(n) { + this.emit('item-activated', n); + } + + _itemEntered(n) { + this.emit('item-entered', n); + } + + _maxChildWidth(forHeight) { + let maxChildMin = 0; + let maxChildNat = 0; + + for (let i = 0; i < this._items.length; i++) { + let [childMin, childNat] = this._items[i].get_preferred_width(forHeight); + maxChildMin = Math.max(childMin, maxChildMin); + maxChildNat = Math.max(childNat, maxChildNat); + + if (this._squareItems) { + let [childMin, childNat] = this._items[i].get_preferred_height(-1); + maxChildMin = Math.max(childMin, maxChildMin); + maxChildNat = Math.max(childNat, maxChildNat); + } + } + + return [maxChildMin, maxChildNat]; + } + + vfunc_get_preferred_width(forHeight) { + let themeNode = this.get_theme_node(); + let [maxChildMin, ] = this._maxChildWidth(forHeight); + let [minListWidth, ] = this._list.get_preferred_width(forHeight); + + return themeNode.adjust_preferred_width(maxChildMin, minListWidth); + } + + vfunc_get_preferred_height(forWidth) { + let maxChildMin = 0; + let maxChildNat = 0; + + for (let i = 0; i < this._items.length; i++) { + let [childMin, childNat] = this._items[i].get_preferred_height(-1); + maxChildMin = Math.max(childMin, maxChildMin); + maxChildNat = Math.max(childNat, maxChildNat); + } + + if (this._squareItems) { + let [childMin, childNat] = this._maxChildWidth(-1); + maxChildMin = Math.max(childMin, maxChildMin); + maxChildNat = maxChildMin; + } + + let themeNode = this.get_theme_node(); + return themeNode.adjust_preferred_height(maxChildMin, maxChildNat); + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let contentBox = this.get_theme_node().get_content_box(box); + let width = contentBox.x2 - contentBox.x1; + let height = contentBox.y2 - contentBox.y1; + + let leftPadding = this.get_theme_node().get_padding(St.Side.LEFT); + let rightPadding = this.get_theme_node().get_padding(St.Side.RIGHT); + + let [, natScrollViewWidth] = this._scrollView.get_preferred_width(height); + + let childBox = new Clutter.ActorBox(); + let scrollable = natScrollViewWidth > width; + + this._scrollView.allocate(contentBox, flags); + + let arrowWidth = Math.floor(leftPadding / 3); + let arrowHeight = arrowWidth * 2; + childBox.x1 = leftPadding / 2; + childBox.y1 = this.height / 2 - arrowWidth; + childBox.x2 = childBox.x1 + arrowWidth; + childBox.y2 = childBox.y1 + arrowHeight; + this._leftArrow.allocate(childBox, flags); + this._leftArrow.opacity = (this._scrollableLeft && scrollable) ? 255 : 0; + + arrowWidth = Math.floor(rightPadding / 3); + arrowHeight = arrowWidth * 2; + childBox.x1 = this.width - arrowWidth - rightPadding / 2; + childBox.y1 = this.height / 2 - arrowWidth; + childBox.x2 = childBox.x1 + arrowWidth; + childBox.y2 = childBox.y1 + arrowHeight; + this._rightArrow.allocate(childBox, flags); + this._rightArrow.opacity = (this._scrollableRight && scrollable) ? 255 : 0; + } +}); + +function drawArrow(area, side) { + let themeNode = area.get_theme_node(); + let borderColor = themeNode.get_border_color(side); + let bodyColor = themeNode.get_foreground_color(); + + let [width, height] = area.get_surface_size (); + let cr = area.get_context(); + + cr.setLineWidth(1.0); + Clutter.cairo_set_source_color(cr, borderColor); + + switch (side) { + case St.Side.TOP: + cr.moveTo(0, height); + cr.lineTo(Math.floor(width * 0.5), 0); + cr.lineTo(width, height); + break; + + case St.Side.BOTTOM: + cr.moveTo(width, 0); + cr.lineTo(Math.floor(width * 0.5), height); + cr.lineTo(0, 0); + break; + + case St.Side.LEFT: + cr.moveTo(width, height); + cr.lineTo(0, Math.floor(height * 0.5)); + cr.lineTo(width, 0); + break; + + case St.Side.RIGHT: + cr.moveTo(0, 0); + cr.lineTo(width, Math.floor(height * 0.5)); + cr.lineTo(0, height); + break; + } + + cr.strokePreserve(); + + Clutter.cairo_set_source_color(cr, bodyColor); + cr.fill(); + cr.$dispose(); +} + diff --git a/js/ui/tweener.js b/js/ui/tweener.js new file mode 100644 index 0000000..bb9ea55 --- /dev/null +++ b/js/ui/tweener.js @@ -0,0 +1,223 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, Shell, St } = imports.gi; +const Signals = imports.signals; +const Tweener = imports.tweener.tweener; + +// This is a wrapper around imports.tweener.tweener that adds a bit of +// Clutter integration. If the tweening target is a Clutter.Actor, then +// the tweenings will automatically be removed if the actor is destroyed. + +// ActionScript Tweener methods that imports.tweener.tweener doesn't +// currently implement: getTweens, getVersion, registerTransition, +// setTimeScale, updateTime. + +// imports.tweener.tweener methods that we don't re-export: +// pauseAllTweens, removeAllTweens, resumeAllTweens. (It would be hard +// to clean up properly after removeAllTweens, and also, any code that +// calls any of these is almost certainly wrong anyway, because they +// affect the entire application.) + +// Called from Main.start +function init() { + Tweener.setFrameTicker(new ClutterFrameTicker()); +} + + +function addCaller(target, tweeningParameters) { + _wrapTweening(target, tweeningParameters); + Tweener.addCaller(target, tweeningParameters); +} + +function addTween(target, tweeningParameters) { + _wrapTweening(target, tweeningParameters); + Tweener.addTween(target, tweeningParameters); +} + +function _wrapTweening(target, tweeningParameters) { + let state = _getTweenState(target); + + if (!state.destroyedId) { + if (target instanceof Clutter.Actor) { + state.actor = target; + state.destroyedId = target.connect('destroy', _actorDestroyed); + } else if (target.actor && target.actor instanceof Clutter.Actor) { + state.actor = target.actor; + state.destroyedId = target.actor.connect('destroy', () => { _actorDestroyed(target); }); + } + } + + if (!St.Settings.get().enable_animations) { + tweeningParameters['time'] = 0.000001; + tweeningParameters['delay'] = 0.000001; + } + + _addHandler(target, tweeningParameters, 'onComplete', _tweenCompleted); +} + +function _getTweenState(target) { + // If we were paranoid, we could keep a plist mapping targets to + // states... but we're not that paranoid. + if (!target.__ShellTweenerState) + target.__ShellTweenerState = {}; + return target.__ShellTweenerState; +} + +function _resetTweenState(target) { + let state = target.__ShellTweenerState; + + if (state) { + if (state.destroyedId) + state.actor.disconnect(state.destroyedId); + } + + target.__ShellTweenerState = {}; +} + +function _addHandler(target, params, name, handler) { + if (params[name]) { + let oldHandler = params[name]; + let oldScope = params[name + 'Scope']; + let oldParams = params[name + 'Params']; + let eventScope = oldScope ? oldScope : target; + + params[name] = () => { + oldHandler.apply(eventScope, oldParams); + handler(target); + }; + } else + params[name] = () => { handler(target); }; +} + +function _actorDestroyed(target) { + _resetTweenState(target); + Tweener.removeTweens(target); +} + +function _tweenCompleted(target) { + if (!isTweening(target)) + _resetTweenState(target); +} + +function getTweenCount(scope) { + return Tweener.getTweenCount(scope); +} + +// imports.tweener.tweener doesn't provide this method (which exists +// in the ActionScript version) but it's easy to implement. +function isTweening(scope) { + return Tweener.getTweenCount(scope) != 0; +} + +function removeTweens(scope) { + if (Tweener.removeTweens.apply(null, arguments)) { + // If we just removed the last active tween, clean up + if (Tweener.getTweenCount(scope) == 0) + _tweenCompleted(scope); + return true; + } else + return false; +} + +function pauseTweens() { + return Tweener.pauseTweens.apply(null, arguments); +} + +function resumeTweens() { + return Tweener.resumeTweens.apply(null, arguments); +} + + +function registerSpecialProperty(name, getFunction, setFunction, + parameters, preProcessFunction) { + Tweener.registerSpecialProperty(name, getFunction, setFunction, + parameters, preProcessFunction); +} + +function registerSpecialPropertyModifier(name, modifyFunction, getFunction) { + Tweener.registerSpecialPropertyModifier(name, modifyFunction, getFunction); +} + +function registerSpecialPropertySplitter(name, splitFunction, parameters) { + Tweener.registerSpecialPropertySplitter(name, splitFunction, parameters); +} + + +// The 'FrameTicker' object is an object used to feed new frames to +// Tweener so it can update values and redraw. The default frame +// ticker for Tweener just uses a simple timeout at a fixed frame rate +// and has no idea of "catching up" by dropping frames. +// +// We substitute it with custom frame ticker here that connects +// Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a +// whole lot more sophisticated than a simple timeout at a fixed frame +// rate, but at least it knows how to drop frames. (See +// HippoAnimationManager for a more sophisticated view of continous +// time updates; even better is to pay attention to the vertical +// vblank and sync to that when possible.) +// +var ClutterFrameTicker = class { + constructor() { + // We don't have a finite duration; tweener will tell us to stop + // when we need to stop, so use 1000 seconds as "infinity", and + // set the timeline to loop. Doing this means we have to track + // time ourselves, since clutter timeline's time will cycle + // instead of strictly increase. + this._timeline = new Clutter.Timeline({ duration: 1000*1000 }); + this._timeline.set_loop(true); + this._startTime = -1; + this._currentTime = -1; + + this._timeline.connect('new-frame', (timeline, frame) => { + this._onNewFrame(frame); + }); + + let perf_log = Shell.PerfLog.get_default(); + perf_log.define_event("tweener.framePrepareStart", + "Start of a new animation frame", + ""); + perf_log.define_event("tweener.framePrepareDone", + "Finished preparing frame", + ""); + } + + get FRAME_RATE() { + return 60; + } + + _onNewFrame(frame) { + // If there is a lot of setup to start the animation, then + // first frame number we get from clutter might be a long ways + // into the animation (or the animation might even be done). + // That looks bad, so we always start at the first frame of the + // animation then only do frame dropping from there. + if (this._startTime < 0) + this._startTime = GLib.get_monotonic_time() / 1000.0; + + // currentTime is in milliseconds + let perf_log = Shell.PerfLog.get_default(); + this._currentTime = GLib.get_monotonic_time() / 1000.0 - this._startTime; + perf_log.event("tweener.framePrepareStart"); + this.emit('prepare-frame'); + perf_log.event("tweener.framePrepareDone"); + } + + getTime() { + return this._currentTime; + } + + start() { + if (St.get_slow_down_factor() > 0) + Tweener.setTimeScale(1 / St.get_slow_down_factor()); + this._timeline.start(); + global.begin_work(); + } + + stop() { + this._timeline.stop(); + this._startTime = -1; + this._currentTime = -1; + global.end_work(); + } +}; +Signals.addSignalMethods(ClutterFrameTicker.prototype); diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js new file mode 100644 index 0000000..5c9d460 --- /dev/null +++ b/js/ui/unlockDialog.js @@ -0,0 +1,154 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { AccountsService, Atk, Clutter, + Gdm, Gio, GLib, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Layout = imports.ui.layout; +const Main = imports.ui.main; + +const AuthPrompt = imports.gdm.authPrompt; + +// The timeout before going back automatically to the lock screen (in seconds) +const IDLE_TIMEOUT = 2 * 60; + +var UnlockDialog = class { + constructor(parentActor) { + this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW, + style_class: 'login-dialog', + layout_manager: new Clutter.BoxLayout(), + visible: false }); + + this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true })); + parentActor.add_child(this.actor); + + this._userManager = AccountsService.UserManager.get_default(); + this._userName = GLib.get_user_name(); + this._user = this._userManager.get_user(this._userName); + + this._promptBox = new St.BoxLayout({ vertical: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true, + y_expand: true }); + this.actor.add_child(this._promptBox); + + this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); + this._authPrompt.connect('failed', this._fail.bind(this)); + this._authPrompt.connect('cancelled', this._fail.bind(this)); + this._authPrompt.connect('reset', this._onReset.bind(this)); + this._authPrompt.setPasswordChar('\u25cf'); + this._authPrompt.nextButton.label = _("Unlock"); + + this._promptBox.add_child(this._authPrompt.actor); + + this.allowCancel = false; + + let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' }); + if (screenSaverSettings.get_boolean('user-switch-enabled')) { + let otherUserLabel = new St.Label({ text: _("Log in as another user"), + style_class: 'login-dialog-not-listed-label' }); + this._otherUserButton = new St.Button({ style_class: 'login-dialog-not-listed-button', + can_focus: true, + child: otherUserLabel, + reactive: true, + x_align: St.Align.START, + x_fill: false }); + this._otherUserButton.connect('clicked', this._otherUserClicked.bind(this)); + this._promptBox.add_child(this._otherUserButton); + } else { + this._otherUserButton = null; + } + + this._authPrompt.reset(); + this._updateSensitivity(true); + + Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic'); + + this._idleMonitor = Meta.IdleMonitor.get_core(); + this._idleWatchId = this._idleMonitor.add_idle_watch(IDLE_TIMEOUT * 1000, this._escape.bind(this)); + } + + _updateSensitivity(sensitive) { + this._authPrompt.updateSensitivity(sensitive); + + if (this._otherUserButton) { + this._otherUserButton.reactive = sensitive; + this._otherUserButton.can_focus = sensitive; + } + } + + _fail() { + this.emit('failed'); + } + + _onReset(authPrompt, beginRequest) { + let userName; + if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) { + this._authPrompt.setUser(this._user); + userName = this._userName; + } else { + userName = null; + } + + this._authPrompt.begin({ userName: userName }); + } + + _escape() { + if (this.allowCancel) + this._authPrompt.cancel(); + } + + _otherUserClicked(button, event) { + Gdm.goto_login_session_sync(null); + + this._authPrompt.cancel(); + } + + destroy() { + this.popModal(); + this.actor.destroy(); + + if (this._idleWatchId) { + this._idleMonitor.remove_watch(this._idleWatchId); + this._idleWatchId = 0; + } + } + + cancel() { + this._authPrompt.cancel(); + + this.destroy(); + } + + addCharacter(unichar) { + this._authPrompt.addCharacter(unichar); + } + + finish(onComplete) { + this._authPrompt.finish(onComplete); + } + + open(timestamp) { + this.actor.show(); + + if (this._isModal) + return true; + + if (!Main.pushModal(this.actor, { timestamp: timestamp, + actionMode: Shell.ActionMode.UNLOCK_SCREEN })) + return false; + + this._isModal = true; + + return true; + } + + popModal(timestamp) { + if (this._isModal) { + Main.popModal(this.actor, timestamp); + this._isModal = false; + } + } +}; +Signals.addSignalMethods(UnlockDialog.prototype); diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js new file mode 100644 index 0000000..a11b34b --- /dev/null +++ b/js/ui/userWidget.js @@ -0,0 +1,180 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +// +// A widget showing the user avatar and name + +const { Clutter, Gio, GLib, GObject, St } = imports.gi; + +const Params = imports.misc.params; + +var AVATAR_ICON_SIZE = 64; + +// Adapted from gdm/gui/user-switch-applet/applet.c +// +// Copyright (C) 2004-2005 James M. Cape . +// Copyright (C) 2008,2009 Red Hat, Inc. + +var Avatar = class { + constructor(user, params) { + this._user = user; + params = Params.parse(params, { reactive: false, + iconSize: AVATAR_ICON_SIZE, + styleClass: 'user-icon' }); + this._iconSize = params.iconSize; + + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + this.actor = new St.Bin({ style_class: params.styleClass, + track_hover: params.reactive, + reactive: params.reactive, + width: this._iconSize * scaleFactor, + height: this._iconSize * scaleFactor }); + + // Monitor the scaling factor to make sure we recreate the avatar when needed. + let themeContext = St.ThemeContext.get_for_stage(global.stage); + themeContext.connect('notify::scale-factor', this.update.bind(this)); + } + + setSensitive(sensitive) { + this.actor.can_focus = sensitive; + this.actor.reactive = sensitive; + } + + update() { + let iconFile = this._user.get_icon_file(); + if (iconFile && !GLib.file_test(iconFile, GLib.FileTest.EXISTS)) + iconFile = null; + + if (iconFile) { + let file = Gio.File.new_for_path(iconFile); + this.actor.child = null; + this.actor.style = ` + background-image: url("${iconFile}"); + background-size: ${this._iconSize}px`; + } else { + this.actor.style = null; + this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic', + icon_size: this._iconSize }); + } + } +}; + +var UserWidgetLabel = GObject.registerClass( +class UserWidgetLabel extends St.Widget { + _init(user) { + super._init({ layout_manager: new Clutter.BinLayout() }); + + this._user = user; + + this._realNameLabel = new St.Label({ style_class: 'user-widget-label', + y_align: Clutter.ActorAlign.CENTER }); + this.add_child(this._realNameLabel); + + this._userNameLabel = new St.Label({ style_class: 'user-widget-label', + y_align: Clutter.ActorAlign.CENTER }); + this.add_child(this._userNameLabel); + + this._currentLabel = null; + + this._userLoadedId = this._user.connect('notify::is-loaded', this._updateUser.bind(this)); + this._userChangedId = this._user.connect('changed', this._updateUser.bind(this)); + this._updateUser(); + + // We can't override the destroy vfunc because that might be called during + // object finalization, and we can't call any JS inside a GC finalize callback, + // so we use a signal, that will be disconnected by GObject the first time + // the actor is destroyed (which is guaranteed to be as part of a normal + // destroy() call from JS, possibly from some ancestor) + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._userLoadedId != 0) { + this._user.disconnect(this._userLoadedId); + this._userLoadedId = 0; + } + + if (this._userChangedId != 0) { + this._user.disconnect(this._userChangedId); + this._userChangedId = 0; + } + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + + let [minRealNameWidth, minRealNameHeight, + natRealNameWidth, natRealNameHeight] = this._realNameLabel.get_preferred_size(); + + let [minUserNameWidth, minUserNameHeight, + natUserNameWidth, natUserNameHeight] = this._userNameLabel.get_preferred_size(); + + if (natRealNameWidth <= availWidth) + this._currentLabel = this._realNameLabel; + else + this._currentLabel = this._userNameLabel; + this.label_actor = this._currentLabel; + + let childBox = new Clutter.ActorBox(); + childBox.x1 = 0; + childBox.y1 = 0; + childBox.x2 = availWidth; + childBox.y2 = availHeight; + + this._currentLabel.allocate(childBox, flags); + } + + vfunc_paint() { + this._currentLabel.paint(); + } + + _updateUser() { + if (this._user.is_loaded) { + this._realNameLabel.text = this._user.get_real_name(); + this._userNameLabel.text = this._user.get_user_name(); + } else { + this._realNameLabel.text = ''; + this._userNameLabel.text = ''; + } + } +}); + +var UserWidget = class { + constructor(user) { + this._user = user; + + this.actor = new St.BoxLayout({ style_class: 'user-widget', + vertical: false }); + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._avatar = new Avatar(user); + this.actor.add_child(this._avatar.actor); + + this._label = new UserWidgetLabel(user); + this.actor.add_child(this._label); + + this._label.bind_property('label-actor', this.actor, 'label-actor', + GObject.BindingFlags.SYNC_CREATE); + + this._userLoadedId = this._user.connect('notify::is-loaded', this._updateUser.bind(this)); + this._userChangedId = this._user.connect('changed', this._updateUser.bind(this)); + this._updateUser(); + } + + _onDestroy() { + if (this._userLoadedId != 0) { + this._user.disconnect(this._userLoadedId); + this._userLoadedId = 0; + } + + if (this._userChangedId != 0) { + this._user.disconnect(this._userChangedId); + this._userChangedId = 0; + } + } + + _updateUser() { + this._avatar.update(); + } +}; diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js new file mode 100644 index 0000000..7714655 --- /dev/null +++ b/js/ui/viewSelector.js @@ -0,0 +1,622 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; + +const AppDisplay = imports.ui.appDisplay; +const Main = imports.ui.main; +const OverviewControls = imports.ui.overviewControls; +const Params = imports.misc.params; +const Search = imports.ui.search; +const ShellEntry = imports.ui.shellEntry; +const Tweener = imports.ui.tweener; +const WorkspacesView = imports.ui.workspacesView; +const EdgeDragAction = imports.ui.edgeDragAction; +const IconGrid = imports.ui.iconGrid; + +const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; +var PINCH_GESTURE_THRESHOLD = 0.7; + +var ViewPage = { + WINDOWS: 1, + APPS: 2, + SEARCH: 3 +}; + +var FocusTrap = GObject.registerClass( +class FocusTrap extends St.Widget { + vfunc_navigate_focus(from, direction) { + if (direction == St.DirectionType.TAB_FORWARD || + direction == St.DirectionType.TAB_BACKWARD) + return super.vfunc_navigate_focus(from, direction); + return false; + } +}); + +function getTermsForSearchString(searchString) { + searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); + if (searchString == '') + return []; + + let terms = searchString.split(/\s+/); + return terms; +} + +var TouchpadShowOverviewAction = class { + constructor(actor) { + actor.connect('captured-event', this._handleEvent.bind(this)); + } + + _handleEvent(actor, event) { + if (event.type() != Clutter.EventType.TOUCHPAD_PINCH) + return Clutter.EVENT_PROPAGATE; + + if (event.get_touchpad_gesture_finger_count() != 3) + return Clutter.EVENT_PROPAGATE; + + if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END) + this.emit('activated', event.get_gesture_pinch_scale ()); + + return Clutter.EVENT_STOP; + } +}; +Signals.addSignalMethods(TouchpadShowOverviewAction.prototype); + +var ShowOverviewAction = GObject.registerClass({ + Signals: { 'activated': { param_types: [GObject.TYPE_DOUBLE] } }, +}, class ShowOverviewAction extends Clutter.GestureAction { + _init() { + super._init(); + this.set_n_touch_points(3); + + global.display.connect('grab-op-begin', () => { + this.cancel(); + }); + } + + vfunc_gesture_prepare(actor) { + return Main.actionMode == Shell.ActionMode.NORMAL && + this.get_n_current_points() == this.get_n_touch_points(); + } + + _getBoundingRect(motion) { + let minX, minY, maxX, maxY; + + for (let i = 0; i < this.get_n_current_points(); i++) { + let x, y; + + if (motion == true) { + [x, y] = this.get_motion_coords(i); + } else { + [x, y] = this.get_press_coords(i); + } + + if (i == 0) { + minX = maxX = x; + minY = maxY = y; + } else { + minX = Math.min(minX, x); + minY = Math.min(minY, y); + maxX = Math.max(maxX, x); + maxY = Math.max(maxY, y); + } + } + + return new Meta.Rectangle({ x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY }); + } + + vfunc_gesture_begin(actor) { + this._initialRect = this._getBoundingRect(false); + return true; + } + + vfunc_gesture_end(actor) { + let rect = this._getBoundingRect(true); + let oldArea = this._initialRect.width * this._initialRect.height; + let newArea = rect.width * rect.height; + let areaDiff = newArea / oldArea; + + this.emit('activated', areaDiff); + } +}); + +var ViewSelector = class { + constructor(searchEntry, showAppsButton) { + this.actor = new Shell.Stack({ name: 'viewSelector' }); + + this._showAppsButton = showAppsButton; + this._showAppsButton.connect('notify::checked', this._onShowAppsButtonToggled.bind(this)); + + this._activePage = null; + + this._searchActive = false; + + this._entry = searchEntry; + ShellEntry.addContextMenu(this._entry); + + this._text = this._entry.clutter_text; + this._text.connect('text-changed', this._onTextChanged.bind(this)); + this._text.connect('key-press-event', this._onKeyPress.bind(this)); + this._text.connect('key-focus-in', () => { + this._searchResults.highlightDefault(true); + }); + this._text.connect('key-focus-out', () => { + this._searchResults.highlightDefault(false); + }); + this._entry.connect('popup-menu', () => { + if (!this._searchActive) + return; + + this._entry.menu.close(); + this._searchResults.popupMenuDefault(); + }); + this._entry.connect('notify::mapped', this._onMapped.bind(this)); + global.stage.connect('notify::key-focus', this._onStageKeyFocusChanged.bind(this)); + + this._entry.set_primary_icon(new St.Icon({ style_class: 'search-entry-icon', + icon_name: 'edit-find-symbolic' })); + this._clearIcon = new St.Icon({ style_class: 'search-entry-icon', + icon_name: 'edit-clear-symbolic' }); + + this._iconClickedId = 0; + this._capturedEventId = 0; + + this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay(); + this._workspacesPage = this._addPage(this._workspacesDisplay.actor, + _("Windows"), 'focus-windows-symbolic'); + + this.appDisplay = new AppDisplay.AppDisplay(); + this._appsPage = this._addPage(this.appDisplay.actor, + _("Applications"), 'view-app-grid-symbolic'); + + this._searchResults = new Search.SearchResults(); + this._searchPage = this._addPage(this._searchResults.actor, + _("Search"), 'edit-find-symbolic', + { a11yFocus: this._entry }); + + // Since the entry isn't inside the results container we install this + // dummy widget as the last results container child so that we can + // include the entry in the keynav tab path + this._focusTrap = new FocusTrap({ can_focus: true }); + this._focusTrap.connect('key-focus-in', () => { + this._entry.grab_key_focus(); + }); + this._searchResults.actor.add_actor(this._focusTrap); + + global.focus_manager.add_group(this._searchResults.actor); + + this._stageKeyPressId = 0; + Main.overview.connect('showing', () => { + this._stageKeyPressId = global.stage.connect('key-press-event', + this._onStageKeyPress.bind(this)); + }); + Main.overview.connect('hiding', () => { + if (this._stageKeyPressId != 0) { + global.stage.disconnect(this._stageKeyPressId); + this._stageKeyPressId = 0; + } + }); + Main.overview.connect('shown', () => { + // If we were animating from the desktop view to the + // apps page the workspace page was visible, allowing + // the windows to animate, but now we no longer want to + // show it given that we are now on the apps page or + // search page. + if (this._activePage != this._workspacesPage) { + this._workspacesPage.opacity = 0; + this._workspacesPage.hide(); + } + }); + + Main.wm.addKeybinding('toggle-application-view', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._toggleAppsPage.bind(this)); + + Main.wm.addKeybinding('toggle-overview', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + Main.overview.toggle.bind(Main.overview)); + + let side; + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + side = St.Side.RIGHT; + else + side = St.Side.LEFT; + let gesture = new EdgeDragAction.EdgeDragAction(side, + Shell.ActionMode.NORMAL); + gesture.connect('activated', () => { + if (Main.overview.visible) + Main.overview.hide(); + else + this.showApps(); + }); + global.stage.add_action(gesture); + + gesture = new ShowOverviewAction(); + gesture.connect('activated', this._pinchGestureActivated.bind(this)); + global.stage.add_action(gesture); + + gesture = new TouchpadShowOverviewAction(global.stage); + gesture.connect('activated', this._pinchGestureActivated.bind(this)); + } + + _pinchGestureActivated(action, scale) { + if (scale < PINCH_GESTURE_THRESHOLD) + Main.overview.show(); + } + + _toggleAppsPage() { + this._showAppsButton.checked = !this._showAppsButton.checked; + Main.overview.show(); + } + + showApps() { + this._showAppsButton.checked = true; + Main.overview.show(); + } + + show() { + this.reset(); + this._workspacesDisplay.show(this._showAppsButton.checked); + this._activePage = null; + if (this._showAppsButton.checked) + this._showPage(this._appsPage); + else + this._showPage(this._workspacesPage); + + if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows()) + Main.overview.fadeOutDesktop(); + } + + animateFromOverview() { + // Make sure workspace page is fully visible to allow + // workspace.js do the animation of the windows + this._workspacesPage.opacity = 255; + + this._workspacesDisplay.animateFromOverview(this._activePage != this._workspacesPage); + + this._showAppsButton.checked = false; + + if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows()) + Main.overview.fadeInDesktop(); + } + + setWorkspacesFullGeometry(geom) { + this._workspacesDisplay.setWorkspacesFullGeometry(geom); + } + + hide() { + this.reset(); + this._workspacesDisplay.hide(); + } + + _addPage(actor, name, a11yIcon, params) { + params = Params.parse(params, { a11yFocus: null }); + + let page = new St.Bin({ child: actor, + x_align: St.Align.START, + y_align: St.Align.START, + x_fill: true, + y_fill: true }); + if (params.a11yFocus) + Main.ctrlAltTabManager.addGroup(params.a11yFocus, name, a11yIcon); + else + Main.ctrlAltTabManager.addGroup(actor, name, a11yIcon, + { proxy: this.actor, + focusCallback: () => { + this._a11yFocusPage(page); + } + });; + page.hide(); + this.actor.add_actor(page); + return page; + } + + _fadePageIn() { + Tweener.addTween(this._activePage, + { opacity: 255, + time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME, + transition: 'easeOutQuad' + }); + } + + _fadePageOut(page) { + let oldPage = page; + Tweener.addTween(page, + { opacity: 0, + time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this._animateIn(oldPage); + } + }); + } + + _animateIn(oldPage) { + if (oldPage) + oldPage.hide(); + + this.emit('page-empty'); + + this._activePage.show(); + + if (this._activePage == this._appsPage && oldPage == this._workspacesPage) { + // Restore opacity, in case we animated via _fadePageOut + this._activePage.opacity = 255; + this.appDisplay.animate(IconGrid.AnimationDirection.IN); + } else { + this._fadePageIn(); + } + } + + _animateOut(page) { + let oldPage = page; + if (page == this._appsPage && + this._activePage == this._workspacesPage && + !Main.overview.animationInProgress) { + this.appDisplay.animate(IconGrid.AnimationDirection.OUT, () => { + this._animateIn(oldPage) + }); + } else { + this._fadePageOut(page); + } + } + + _showPage(page) { + if (!Main.overview.visible) + return; + + if (page == this._activePage) + return; + + let oldPage = this._activePage; + this._activePage = page; + this.emit('page-changed'); + + if (oldPage) + this._animateOut(oldPage) + else + this._animateIn(); + } + + _a11yFocusPage(page) { + this._showAppsButton.checked = page == this._appsPage; + page.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + + _onShowAppsButtonToggled() { + this._showPage(this._showAppsButton.checked ? + this._appsPage : this._workspacesPage); + } + + _onStageKeyPress(actor, event) { + // Ignore events while anything but the overview has + // pushed a modal (system modals, looking glass, ...) + if (Main.modalCount > 1) + return Clutter.EVENT_PROPAGATE; + + let modifiers = event.get_state(); + let symbol = event.get_key_symbol(); + + if (symbol == Clutter.Escape) { + if (this._searchActive) + this.reset(); + else if (this._showAppsButton.checked) + this._showAppsButton.checked = false; + else + Main.overview.hide(); + return Clutter.EVENT_STOP; + } else if (this._shouldTriggerSearch(symbol)) { + this.startSearch(event); + } else if (!this._searchActive && !global.stage.key_focus) { + if (symbol == Clutter.Tab || symbol == Clutter.Down) { + this._activePage.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.ISO_Left_Tab) { + this._activePage.navigate_focus(null, St.DirectionType.TAB_BACKWARD, false); + return Clutter.EVENT_STOP; + } + } + return Clutter.EVENT_PROPAGATE; + } + + _searchCancelled() { + this._showPage(this._showAppsButton.checked ? this._appsPage + : this._workspacesPage); + + // Leave the entry focused when it doesn't have any text; + // when replacing a selected search term, Clutter emits + // two 'text-changed' signals, one for deleting the previous + // text and one for the new one - the second one is handled + // incorrectly when we remove focus + // (https://bugzilla.gnome.org/show_bug.cgi?id=636341) */ + if (this._text.text != '') + this.reset(); + } + + reset() { + // Don't drop the key focus on Clutter's side if anything but the + // overview has pushed a modal (e.g. system modals when activated using + // the overview). + if (Main.modalCount <= 1) + global.stage.set_key_focus(null); + + this._entry.text = ''; + + this._text.set_cursor_visible(true); + this._text.set_selection(0, 0); + } + + _onStageKeyFocusChanged() { + let focus = global.stage.get_key_focus(); + let appearFocused = (this._entry.contains(focus) || + this._searchResults.actor.contains(focus)); + + this._text.set_cursor_visible(appearFocused); + + if (appearFocused) + this._entry.add_style_pseudo_class('focus'); + else + this._entry.remove_style_pseudo_class('focus'); + } + + _onMapped() { + if (this._entry.mapped) { + // Enable 'find-as-you-type' + this._capturedEventId = global.stage.connect('captured-event', + this._onCapturedEvent.bind(this)); + this._text.set_cursor_visible(true); + this._text.set_selection(0, 0); + } else { + // Disable 'find-as-you-type' + if (this._capturedEventId > 0) + global.stage.disconnect(this._capturedEventId); + this._capturedEventId = 0; + } + } + + _shouldTriggerSearch(symbol) { + if (symbol == Clutter.Multi_key) + return true; + + if (symbol == Clutter.BackSpace && this._searchActive) + return true; + + let unicode = Clutter.keysym_to_unicode(symbol); + if (unicode == 0) + return false; + + if (getTermsForSearchString(String.fromCharCode(unicode)).length > 0) + return true; + + return false; + } + + startSearch(event) { + global.stage.set_key_focus(this._text); + + let synthEvent = event.copy(); + synthEvent.set_source(this._text); + this._text.event(synthEvent, false); + } + + // the entry does not show the hint + _isActivated() { + return this._text.text == this._entry.get_text(); + } + + _onTextChanged(se, prop) { + let terms = getTermsForSearchString(this._entry.get_text()); + + this._searchActive = (terms.length > 0); + this._searchResults.setTerms(terms); + + if (this._searchActive) { + this._showPage(this._searchPage); + + this._entry.set_secondary_icon(this._clearIcon); + + if (this._iconClickedId == 0) + this._iconClickedId = this._entry.connect('secondary-icon-clicked', + this.reset.bind(this)); + } else { + if (this._iconClickedId > 0) { + this._entry.disconnect(this._iconClickedId); + this._iconClickedId = 0; + } + + this._entry.set_secondary_icon(null); + this._searchCancelled(); + } + } + + _onKeyPress(entry, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.Escape) { + if (this._isActivated()) { + this.reset(); + return Clutter.EVENT_STOP; + } + } else if (this._searchActive) { + let arrowNext, nextDirection; + if (entry.get_text_direction() == Clutter.TextDirection.RTL) { + arrowNext = Clutter.Left; + nextDirection = St.DirectionType.LEFT; + } else { + arrowNext = Clutter.Right; + nextDirection = St.DirectionType.RIGHT; + } + + if (symbol == Clutter.Tab) { + this._searchResults.navigateFocus(St.DirectionType.TAB_FORWARD); + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.ISO_Left_Tab) { + this._focusTrap.can_focus = false; + this._searchResults.navigateFocus(St.DirectionType.TAB_BACKWARD); + this._focusTrap.can_focus = true; + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.Down) { + this._searchResults.navigateFocus(St.DirectionType.DOWN); + return Clutter.EVENT_STOP; + } else if (symbol == arrowNext && this._text.position == -1) { + this._searchResults.navigateFocus(nextDirection); + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) { + this._searchResults.activateDefault(); + return Clutter.EVENT_STOP; + } + } + return Clutter.EVENT_PROPAGATE; + } + + _onCapturedEvent(actor, event) { + if (event.type() == Clutter.EventType.BUTTON_PRESS) { + let source = event.get_source(); + if (source != this._text && + this._text.text == '' && + !this._text.has_preedit () && + !Main.layoutManager.keyboardBox.contains(source)) { + // the user clicked outside after activating the entry, but + // with no search term entered and no keyboard button pressed + // - cancel the search + this.reset(); + } + } + + return Clutter.EVENT_PROPAGATE; + } + + getActivePage() { + if (this._activePage == this._workspacesPage) + return ViewPage.WINDOWS; + else if (this._activePage == this._appsPage) + return ViewPage.APPS; + else + return ViewPage.SEARCH; + } + + fadeIn() { + let actor = this._activePage; + Tweener.addTween(actor, { opacity: 255, + time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / 2, + transition: 'easeInQuad' + }); + } + + fadeHalf() { + let actor = this._activePage; + Tweener.addTween(actor, { opacity: 128, + time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / 2, + transition: 'easeOutQuad' + }); + } +}; +Signals.addSignalMethods(ViewSelector.prototype); diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js new file mode 100644 index 0000000..abdb8a4 --- /dev/null +++ b/js/ui/windowAttentionHandler.js @@ -0,0 +1,105 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Shell = imports.gi.Shell; + +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; + +var WindowAttentionHandler = class { + constructor() { + this._tracker = Shell.WindowTracker.get_default(); + this._windowDemandsAttentionId = global.display.connect('window-demands-attention', + this._onWindowDemandsAttention.bind(this)); + this._windowMarkedUrgentId = global.display.connect('window-marked-urgent', + this._onWindowDemandsAttention.bind(this)); + } + + _getTitleAndBanner(app, window) { + let title = app.get_name(); + let banner = _("“%s” is ready").format(window.get_title()); + return [title, banner] + } + + _onWindowDemandsAttention(display, window) { + // We don't want to show the notification when the window is already focused, + // because this is rather pointless. + // Some apps (like GIMP) do things like setting the urgency hint on the + // toolbar windows which would result into a notification even though GIMP itself is + // focused. + // We are just ignoring the hint on skip_taskbar windows for now. + // (Which is the same behaviour as with metacity + panel) + + if (!window || window.has_focus() || window.is_skip_taskbar()) + return; + + let app = this._tracker.get_window_app(window); + let source = new Source(app, window); + Main.messageTray.add(source); + + let [title, banner] = this._getTitleAndBanner(app, window); + + let notification = new MessageTray.Notification(source, title, banner); + notification.connect('activated', () => { + source.open(); + }); + notification.setForFeedback(true); + + source.notify(notification); + + source.signalIDs.push(window.connect('notify::title', () => { + let [title, banner] = this._getTitleAndBanner(app, window); + notification.update(title, banner); + })); + } +}; + +var Source = class WindowAttentionSource extends MessageTray.Source { + constructor(app, window) { + super(app.get_name()); + + this._window = window; + this._app = app; + + this.signalIDs = []; + this.signalIDs.push(this._window.connect('notify::demands-attention', + this._sync.bind(this))); + this.signalIDs.push(this._window.connect('notify::urgent', + this._sync.bind(this))); + this.signalIDs.push(this._window.connect('focus', + () => { this.destroy(); })); + this.signalIDs.push(this._window.connect('unmanaged', + () => { this.destroy(); })); + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _sync() { + if (this._window.demands_attention || this._window.urgent) + return; + this.destroy(); + } + + _onDestroy() { + for(let i = 0; i < this.signalIDs.length; i++) { + this._window.disconnect(this.signalIDs[i]); + } + this.signalIDs = []; + } + + _createPolicy() { + if (this._app && this._app.get_app_info()) { + let id = this._app.get_id().replace(/\.desktop$/,''); + return new MessageTray.NotificationApplicationPolicy(id); + } else { + return new MessageTray.NotificationGenericPolicy(); + } + } + + createIcon(size) { + return this._app.create_icon_texture(size); + } + + open() { + Main.activateWindow(this._window); + } +}; diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js new file mode 100644 index 0000000..b9f5fef --- /dev/null +++ b/js/ui/windowManager.js @@ -0,0 +1,2261 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const AltTab = imports.ui.altTab; +const AppFavorites = imports.ui.appFavorites; +const Dialog = imports.ui.dialog; +const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup; +const InhibitShortcutsDialog = imports.ui.inhibitShortcutsDialog; +const Main = imports.ui.main; +const ModalDialog = imports.ui.modalDialog; +const Tweener = imports.ui.tweener; +const WindowMenu = imports.ui.windowMenu; +const PadOsd = imports.ui.padOsd; +const EdgeDragAction = imports.ui.edgeDragAction; +const CloseDialog = imports.ui.closeDialog; +const SwitchMonitor = imports.ui.switchMonitor; + +const { loadInterfaceXML } = imports.misc.fileUtils; + +var SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; +var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2; +var SHOW_WINDOW_ANIMATION_TIME = 0.15; +var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1; +var DESTROY_WINDOW_ANIMATION_TIME = 0.15; +var DIALOG_DESTROY_WINDOW_ANIMATION_TIME = 0.1; +var WINDOW_ANIMATION_TIME = 0.25; +var DIM_BRIGHTNESS = -0.3; +var DIM_TIME = 0.500; +var UNDIM_TIME = 0.250; +var MOTION_THRESHOLD = 100; + +var ONE_SECOND = 1000; // in ms + +const GSD_WACOM_BUS_NAME = 'org.gnome.SettingsDaemon.Wacom'; +const GSD_WACOM_OBJECT_PATH = '/org/gnome/SettingsDaemon/Wacom'; + +const GsdWacomIface = loadInterfaceXML('org.gnome.SettingsDaemon.Wacom'); +const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface); + +var DisplayChangeDialog = class extends ModalDialog.ModalDialog { + constructor(wm) { + super({ styleClass: 'prompt-dialog' }); + + this._wm = wm; + + this._countDown = Meta.MonitorManager.get_display_configuration_timeout(); + + let iconName = 'preferences-desktop-display-symbolic'; + let icon = new Gio.ThemedIcon({ name: iconName }); + let title = _("Do you want to keep these display settings?"); + let body = this._formatCountDown(); + + this._content = new Dialog.MessageDialogContent({ icon, title, body }); + + this.contentLayout.add(this._content, + { x_fill: true, + y_fill: true }); + + /* Translators: this and the following message should be limited in lenght, + to avoid ellipsizing the labels. + */ + this._cancelButton = this.addButton({ label: _("Revert Settings"), + action: this._onFailure.bind(this), + key: Clutter.Escape }); + this._okButton = this.addButton({ label: _("Keep Changes"), + action: this._onSuccess.bind(this), + default: true }); + + this._timeoutId = Mainloop.timeout_add(ONE_SECOND, this._tick.bind(this)); + GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._tick'); + } + + close(timestamp) { + if (this._timeoutId > 0) { + Mainloop.source_remove(this._timeoutId); + this._timeoutId = 0; + } + + super.close(timestamp); + } + + _formatCountDown() { + let fmt = ngettext("Settings changes will revert in %d second", + "Settings changes will revert in %d seconds"); + return fmt.format(this._countDown); + } + + _tick() { + this._countDown--; + + if (this._countDown == 0) { + /* mutter already takes care of failing at timeout */ + this._timeoutId = 0; + this.close(); + return GLib.SOURCE_REMOVE; + } + + this._content.body = this._formatCountDown(); + return GLib.SOURCE_CONTINUE; + } + + _onFailure() { + this._wm.complete_display_change(false); + this.close(); + } + + _onSuccess() { + this._wm.complete_display_change(true); + this.close(); + } +}; + +var WindowDimmer = class { + constructor(actor) { + this._brightnessEffect = new Clutter.BrightnessContrastEffect(); + actor.add_effect(this._brightnessEffect); + this.actor = actor; + this._enabled = true; + this._dimFactor = 0.0; + this._syncEnabled(); + } + + _syncEnabled() { + this._brightnessEffect.enabled = (this._enabled && this._dimFactor > 0); + } + + setEnabled(enabled) { + this._enabled = enabled; + this._syncEnabled(); + } + + set dimFactor(factor) { + this._dimFactor = factor; + this._brightnessEffect.set_brightness(factor * DIM_BRIGHTNESS); + this._syncEnabled(); + } + + get dimFactor() { + return this._dimFactor; + } +}; + +function getWindowDimmer(actor) { + let enabled = Meta.prefs_get_attach_modal_dialogs(); + if (actor._windowDimmer) + actor._windowDimmer.setEnabled(enabled); + + if (enabled) { + if (!actor._windowDimmer) + actor._windowDimmer = new WindowDimmer(actor); + return actor._windowDimmer; + } else { + return null; + } +} + +/* + * When the last window closed on a workspace is a dialog or splash + * screen, we assume that it might be an initial window shown before + * the main window of an application, and give the app a grace period + * where it can map another window before we remove the workspace. + */ +var LAST_WINDOW_GRACE_TIME = 1000; + +var WorkspaceTracker = class { + constructor(wm) { + this._wm = wm; + + this._workspaces = []; + this._checkWorkspacesId = 0; + + this._pauseWorkspaceCheck = false; + + let tracker = Shell.WindowTracker.get_default(); + tracker.connect('startup-sequence-changed', this._queueCheckWorkspaces.bind(this)); + + let workspaceManager = global.workspace_manager; + workspaceManager.connect('notify::n-workspaces', + this._nWorkspacesChanged.bind(this)); + global.window_manager.connect('switch-workspace', + this._queueCheckWorkspaces.bind(this)); + + global.display.connect('window-entered-monitor', + this._windowEnteredMonitor.bind(this)); + global.display.connect('window-left-monitor', + this._windowLeftMonitor.bind(this)); + global.display.connect('restacked', + this._windowsRestacked.bind(this)); + + this._workspaceSettings = new Gio.Settings({ schema_id: 'org.gnome.mutter' }); + this._workspaceSettings.connect('changed::dynamic-workspaces', this._queueCheckWorkspaces.bind(this)); + + this._nWorkspacesChanged(); + } + + blockUpdates() { + this._pauseWorkspaceCheck = true; + } + + unblockUpdates() { + this._pauseWorkspaceCheck = false; + } + + _checkWorkspaces() { + let workspaceManager = global.workspace_manager; + let i; + let emptyWorkspaces = []; + + if (!Meta.prefs_get_dynamic_workspaces()) { + this._checkWorkspacesId = 0; + return false; + } + + // Update workspaces only if Dynamic Workspace Management has not been paused by some other function + if (this._pauseWorkspaceCheck) + return true; + + for (i = 0; i < this._workspaces.length; i++) { + let lastRemoved = this._workspaces[i]._lastRemovedWindow; + if ((lastRemoved && + (lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN || + lastRemoved.get_window_type() == Meta.WindowType.DIALOG || + lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG)) || + this._workspaces[i]._keepAliveId) + emptyWorkspaces[i] = false; + else + emptyWorkspaces[i] = true; + } + + let sequences = Shell.WindowTracker.get_default().get_startup_sequences(); + for (i = 0; i < sequences.length; i++) { + let index = sequences[i].get_workspace(); + if (index >= 0 && index <= workspaceManager.n_workspaces) + emptyWorkspaces[index] = false; + } + + let windows = global.get_window_actors(); + for (i = 0; i < windows.length; i++) { + let actor = windows[i]; + let win = actor.get_meta_window(); + + if (win.is_on_all_workspaces()) + continue; + + let workspaceIndex = win.get_workspace().index(); + emptyWorkspaces[workspaceIndex] = false; + } + + // If we don't have an empty workspace at the end, add one + if (!emptyWorkspaces[emptyWorkspaces.length -1]) { + workspaceManager.append_new_workspace(false, global.get_current_time()); + emptyWorkspaces.push(true); + } + + let lastIndex = emptyWorkspaces.length - 1; + let lastEmptyIndex = emptyWorkspaces.lastIndexOf(false) + 1; + let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); + emptyWorkspaces[activeWorkspaceIndex] = false; + + // Delete empty workspaces except for the last one; do it from the end + // to avoid index changes + for (i = lastIndex; i >= 0; i--) { + if (emptyWorkspaces[i] && i != lastEmptyIndex) + workspaceManager.remove_workspace(this._workspaces[i], global.get_current_time()); + } + + this._checkWorkspacesId = 0; + return false; + } + + keepWorkspaceAlive(workspace, duration) { + if (workspace._keepAliveId) + Mainloop.source_remove(workspace._keepAliveId); + + workspace._keepAliveId = Mainloop.timeout_add(duration, () => { + workspace._keepAliveId = 0; + this._queueCheckWorkspaces(); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(workspace._keepAliveId, '[gnome-shell] this._queueCheckWorkspaces'); + } + + _windowRemoved(workspace, window) { + workspace._lastRemovedWindow = window; + this._queueCheckWorkspaces(); + let id = Mainloop.timeout_add(LAST_WINDOW_GRACE_TIME, () => { + if (workspace._lastRemovedWindow == window) { + workspace._lastRemovedWindow = null; + this._queueCheckWorkspaces(); + } + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces'); + } + + _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { + // If the window left the primary monitor, that + // might make that workspace empty + if (monitorIndex == Main.layoutManager.primaryIndex) + this._queueCheckWorkspaces(); + } + + _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { + // If the window entered the primary monitor, that + // might make that workspace non-empty + if (monitorIndex == Main.layoutManager.primaryIndex) + this._queueCheckWorkspaces(); + } + + _windowsRestacked() { + // Figure out where the pointer is in case we lost track of + // it during a grab. (In particular, if a trayicon popup menu + // is dismissed, see if we need to close the message tray.) + global.sync_pointer(); + } + + _queueCheckWorkspaces() { + if (this._checkWorkspacesId == 0) + this._checkWorkspacesId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, this._checkWorkspaces.bind(this)); + } + + _nWorkspacesChanged() { + let workspaceManager = global.workspace_manager; + let oldNumWorkspaces = this._workspaces.length; + let newNumWorkspaces = workspaceManager.n_workspaces; + + if (oldNumWorkspaces == newNumWorkspaces) + return false; + + let lostWorkspaces = []; + if (newNumWorkspaces > oldNumWorkspaces) { + let w; + + // Assume workspaces are only added at the end + for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) + this._workspaces[w] = workspaceManager.get_workspace_by_index(w); + + for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) { + let workspace = this._workspaces[w]; + workspace._windowAddedId = workspace.connect('window-added', this._queueCheckWorkspaces.bind(this)); + workspace._windowRemovedId = workspace.connect('window-removed', this._windowRemoved.bind(this)); + } + + } else { + // Assume workspaces are only removed sequentially + // (e.g. 2,3,4 - not 2,4,7) + let removedIndex; + let removedNum = oldNumWorkspaces - newNumWorkspaces; + for (let w = 0; w < oldNumWorkspaces; w++) { + let workspace = workspaceManager.get_workspace_by_index(w); + if (this._workspaces[w] != workspace) { + removedIndex = w; + break; + } + } + + let lostWorkspaces = this._workspaces.splice(removedIndex, removedNum); + lostWorkspaces.forEach(workspace => { + workspace.disconnect(workspace._windowAddedId); + workspace.disconnect(workspace._windowRemovedId); + }); + } + + this._queueCheckWorkspaces(); + + return false; + } +}; + +var TilePreview = class { + constructor() { + this.actor = new St.Widget(); + global.window_group.add_actor(this.actor); + + this._reset(); + this._showing = false; + } + + show(window, tileRect, monitorIndex) { + let windowActor = window.get_compositor_private(); + if (!windowActor) + return; + + global.window_group.set_child_below_sibling(this.actor, windowActor); + + if (this._rect && this._rect.equal(tileRect)) + return; + + let changeMonitor = (this._monitorIndex == -1 || + this._monitorIndex != monitorIndex); + + this._monitorIndex = monitorIndex; + this._rect = tileRect; + + let monitor = Main.layoutManager.monitors[monitorIndex]; + + this._updateStyle(monitor); + + if (!this._showing || changeMonitor) { + let monitorRect = new Meta.Rectangle({ x: monitor.x, + y: monitor.y, + width: monitor.width, + height: monitor.height }); + let [, rect] = window.get_frame_rect().intersect(monitorRect); + this.actor.set_size(rect.width, rect.height); + this.actor.set_position(rect.x, rect.y); + this.actor.opacity = 0; + } + + this._showing = true; + this.actor.show(); + Tweener.addTween(this.actor, + { x: tileRect.x, + y: tileRect.y, + width: tileRect.width, + height: tileRect.height, + opacity: 255, + time: WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad' + }); + } + + hide() { + if (!this._showing) + return; + + this._showing = false; + Tweener.addTween(this.actor, + { opacity: 0, + time: WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._reset.bind(this) + }); + } + + _reset() { + this.actor.hide(); + this._rect = null; + this._monitorIndex = -1; + } + + _updateStyle(monitor) { + let styles = ['tile-preview']; + if (this._monitorIndex == Main.layoutManager.primaryIndex) + styles.push('on-primary'); + if (this._rect.x == monitor.x) + styles.push('tile-preview-left'); + if (this._rect.x + this._rect.width == monitor.x + monitor.width) + styles.push('tile-preview-right'); + + this.actor.style_class = styles.join(' '); + } +}; + +var TouchpadWorkspaceSwitchAction = class { + constructor(actor, allowedModes) { + this._allowedModes = allowedModes; + this._dx = 0; + this._dy = 0; + this._enabled = true; + actor.connect('captured-event', this._handleEvent.bind(this)); + this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'}); + } + + get enabled() { + return this._enabled; + } + + set enabled(enabled) { + if (this._enabled == enabled) + return; + + this._enabled = enabled; + if (!enabled) + this.emit('cancel'); + } + + _checkActivated() { + let dir; + + if (this._dy < -MOTION_THRESHOLD) + dir = Meta.MotionDirection.DOWN; + else if (this._dy > MOTION_THRESHOLD) + dir = Meta.MotionDirection.UP; + else if (this._dx < -MOTION_THRESHOLD) + dir = Meta.MotionDirection.RIGHT; + else if (this._dx > MOTION_THRESHOLD) + dir = Meta.MotionDirection.LEFT; + else + return false; + + this.emit('activated', dir); + return true; + } + + _handleEvent(actor, event) { + if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) + return Clutter.EVENT_PROPAGATE; + + if (event.get_touchpad_gesture_finger_count() != 4) + return Clutter.EVENT_PROPAGATE; + + if ((this._allowedModes & Main.actionMode) == 0) + return Clutter.EVENT_PROPAGATE; + + if (!this._enabled) + return Clutter.EVENT_PROPAGATE; + + if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { + let [dx, dy] = event.get_gesture_motion_delta(); + + // Scale deltas up a bit to make it feel snappier + this._dx += dx * 2; + if(!(this._touchpadSettings.get_boolean('natural-scroll'))) + this._dy -= dy * 2; + else + this._dy += dy * 2; + + this.emit('motion', this._dx, this._dy); + } else { + if ((event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END && ! this._checkActivated()) || + event.get_gesture_phase() == Clutter.TouchpadGesturePhase.CANCEL) + this.emit('cancel'); + + this._dx = 0; + this._dy = 0; + } + + return Clutter.EVENT_STOP; + } +}; +Signals.addSignalMethods(TouchpadWorkspaceSwitchAction.prototype); + +var WorkspaceSwitchAction = GObject.registerClass({ + Signals: { 'activated': { param_types: [Meta.MotionDirection.$gtype] }, + 'motion': { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] }, + 'cancel': { param_types: [] }}, +}, class WorkspaceSwitchAction extends Clutter.SwipeAction { + _init(allowedModes) { + super._init(); + this.set_n_touch_points(4); + this._swept = false; + this._allowedModes = allowedModes; + + global.display.connect('grab-op-begin', () => { + this.cancel(); + }); + } + + vfunc_gesture_prepare(actor) { + this._swept = false; + + if (!super.vfunc_gesture_prepare(actor)) + return false; + + return (this._allowedModes & Main.actionMode); + } + + vfunc_gesture_progress(actor) { + let [x, y] = this.get_motion_coords(0); + let [xPress, yPress] = this.get_press_coords(0); + this.emit('motion', x - xPress, y - yPress); + return true; + } + + vfunc_gesture_cancel(actor) { + if (!this._swept) + this.emit('cancel'); + } + + vfunc_swipe(actor, direction) { + let [x, y] = this.get_motion_coords(0); + let [xPress, yPress] = this.get_press_coords(0); + if (Math.abs(x - xPress) < MOTION_THRESHOLD && + Math.abs(y - yPress) < MOTION_THRESHOLD) { + this.emit('cancel'); + return; + } + + let dir; + + if (direction & Clutter.SwipeDirection.UP) + dir = Meta.MotionDirection.DOWN; + else if (direction & Clutter.SwipeDirection.DOWN) + dir = Meta.MotionDirection.UP; + else if (direction & Clutter.SwipeDirection.LEFT) + dir = Meta.MotionDirection.RIGHT; + else if (direction & Clutter.SwipeDirection.RIGHT) + dir = Meta.MotionDirection.LEFT; + + this._swept = true; + this.emit('activated', dir); + } +}); + +var AppSwitchAction = GObject.registerClass({ + Signals: { 'activated': {} }, +}, class AppSwitchAction extends Clutter.GestureAction { + _init() { + super._init(); + this.set_n_touch_points(3); + + global.display.connect('grab-op-begin', () => { + this.cancel(); + }); + } + + vfunc_gesture_prepare(actor) { + if (Main.actionMode != Shell.ActionMode.NORMAL) { + this.cancel(); + return false; + } + + return this.get_n_current_points() <= 4; + } + + vfunc_gesture_begin(actor) { + // in milliseconds + const LONG_PRESS_TIMEOUT = 250; + + let nPoints = this.get_n_current_points(); + let event = this.get_last_event (nPoints - 1); + + if (nPoints == 3) + this._longPressStartTime = event.get_time(); + else if (nPoints == 4) { + // Check whether the 4th finger press happens after a 3-finger long press, + // this only needs to be checked on the first 4th finger press + if (this._longPressStartTime != null && + event.get_time() < this._longPressStartTime + LONG_PRESS_TIMEOUT) + this.cancel(); + else { + this._longPressStartTime = null; + this.emit('activated'); + } + } + + return this.get_n_current_points() <= 4; + } + + vfunc_gesture_progress(actor) { + const MOTION_THRESHOLD = 30; + + if (this.get_n_current_points() == 3) { + for (let i = 0; i < this.get_n_current_points(); i++) { + let [startX, startY] = this.get_press_coords(i); + let [x, y] = this.get_motion_coords(i); + + if (Math.abs(x - startX) > MOTION_THRESHOLD || + Math.abs(y - startY) > MOTION_THRESHOLD) + return false; + } + + } + + return true; + } +}); + +var ResizePopup = class { + constructor() { + this._widget = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._label = new St.Label({ style_class: 'resize-popup', + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true, y_expand: true }); + this._widget.add_child(this._label); + Main.uiGroup.add_actor(this._widget); + } + + set(rect, displayW, displayH) { + /* Translators: This represents the size of a window. The first number is + * the width of the window and the second is the height. */ + let text = _("%d × %d").format(displayW, displayH); + this._label.set_text(text); + + this._widget.set_position(rect.x, rect.y); + this._widget.set_size(rect.width, rect.height); + } + + destroy() { + this._widget.destroy(); + this._widget = null; + } +}; + +var WindowManager = class { + constructor() { + this._shellwm = global.window_manager; + + this._minimizing = []; + this._unminimizing = []; + this._mapping = []; + this._resizing = []; + this._destroying = []; + this._movingWindow = null; + + this._dimmedWindows = []; + + this._skippedActors = []; + + this._allowedKeybindings = {}; + + this._isWorkspacePrepended = false; + + this._switchData = null; + this._shellwm.connect('kill-switch-workspace', (shellwm) => { + if (this._switchData) { + if (this._switchData.inProgress) + this._switchWorkspaceDone(shellwm); + else if (!this._switchData.gestureActivated) + this._finishWorkspaceSwitch(this._switchData); + } + }); + this._shellwm.connect('kill-window-effects', (shellwm, actor) => { + this._minimizeWindowDone(shellwm, actor); + this._mapWindowDone(shellwm, actor); + this._destroyWindowDone(shellwm, actor); + this._sizeChangeWindowDone(shellwm, actor); + }); + + this._shellwm.connect('switch-workspace', this._switchWorkspace.bind(this)); + this._shellwm.connect('show-tile-preview', this._showTilePreview.bind(this)); + this._shellwm.connect('hide-tile-preview', this._hideTilePreview.bind(this)); + this._shellwm.connect('show-window-menu', this._showWindowMenu.bind(this)); + this._shellwm.connect('minimize', this._minimizeWindow.bind(this)); + this._shellwm.connect('unminimize', this._unminimizeWindow.bind(this)); + this._shellwm.connect('size-change', this._sizeChangeWindow.bind(this)); + this._shellwm.connect('size-changed', this._sizeChangedWindow.bind(this)); + this._shellwm.connect('map', this._mapWindow.bind(this)); + this._shellwm.connect('destroy', this._destroyWindow.bind(this)); + this._shellwm.connect('filter-keybinding', this._filterKeybinding.bind(this)); + this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this)); + this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this)); + this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this)); + global.display.connect('restacked', this._syncStacking.bind(this)); + + this._workspaceSwitcherPopup = null; + this._tilePreview = null; + + this.allowKeybinding('switch-to-session-1', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-2', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-3', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-4', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-5', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-6', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-7', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-8', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-9', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-10', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-11', Shell.ActionMode.ALL); + this.allowKeybinding('switch-to-session-12', Shell.ActionMode.ALL); + + this.setCustomKeybindingHandler('switch-to-workspace-left', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-right', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-up', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-down', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-last', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-left', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-right', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-up', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-down', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-1', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-2', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-3', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-4', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-5', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-6', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-7', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-8', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-9', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-10', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-11', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-to-workspace-12', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-1', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-2', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-3', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-4', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-5', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-6', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-7', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-8', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-9', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-10', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-11', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-12', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('move-to-workspace-last', + Shell.ActionMode.NORMAL, + this._showWorkspaceSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-applications', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-group', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-applications-backward', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-group-backward', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-windows', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-windows-backward', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('cycle-windows', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('cycle-windows-backward', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('cycle-group', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('cycle-group-backward', + Shell.ActionMode.NORMAL, + this._startSwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-panels', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | + Shell.ActionMode.LOCK_SCREEN | + Shell.ActionMode.UNLOCK_SCREEN | + Shell.ActionMode.LOGIN_SCREEN, + this._startA11ySwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-panels-backward', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | + Shell.ActionMode.LOCK_SCREEN | + Shell.ActionMode.UNLOCK_SCREEN | + Shell.ActionMode.LOGIN_SCREEN, + this._startA11ySwitcher.bind(this)); + this.setCustomKeybindingHandler('switch-monitor', + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._startSwitcher.bind(this)); + + this.addKeybinding('pause-resume-tweens', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.NONE, + Shell.ActionMode.ALL, + this._toggleTweens.bind(this)); + + this.addKeybinding('open-application-menu', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.POPUP, + this._toggleAppMenu.bind(this)); + + this.addKeybinding('toggle-message-tray', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | + Shell.ActionMode.POPUP, + this._toggleCalendar.bind(this)); + + this.addKeybinding('switch-to-application-1', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-2', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-3', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-4', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-5', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-6', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-7', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-8', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + this.addKeybinding('switch-to-application-9', + new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW, + this._switchToApplication.bind(this)); + + global.display.connect('show-resize-popup', this._showResizePopup.bind(this)); + global.display.connect('show-pad-osd', this._showPadOsd.bind(this)); + global.display.connect('show-osd', (display, monitorIndex, iconName, label) => { + let icon = Gio.Icon.new_for_string(iconName); + Main.osdWindowManager.show(monitorIndex, icon, label, null); + }); + + this._gsdWacomProxy = new GsdWacomProxy(Gio.DBus.session, GSD_WACOM_BUS_NAME, + GSD_WACOM_OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + }); + + global.display.connect('pad-mode-switch', (display, pad, group, mode) => { + let labels = []; + + //FIXME: Fix num buttons + for (let i = 0; i < 50; i++) { + let str = display.get_pad_action_label(pad, Meta.PadActionType.BUTTON, i); + labels.push(str ? str: ''); + } + + if (this._gsdWacomProxy) { + this._gsdWacomProxy.SetOLEDLabelsRemote(pad.get_device_node(), labels); + this._gsdWacomProxy.SetGroupModeLEDRemote(pad.get_device_node(), group, mode); + } + }); + + Main.overview.connect('showing', () => { + for (let i = 0; i < this._dimmedWindows.length; i++) + this._undimWindow(this._dimmedWindows[i]); + }); + Main.overview.connect('hiding', () => { + for (let i = 0; i < this._dimmedWindows.length; i++) + this._dimWindow(this._dimmedWindows[i]); + }); + + this._windowMenuManager = new WindowMenu.WindowMenuManager(); + + if (Main.sessionMode.hasWorkspaces) + this._workspaceTracker = new WorkspaceTracker(this); + + global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, + false, -1, 1); + + let allowedModes = Shell.ActionMode.NORMAL; + let gesture = new WorkspaceSwitchAction(allowedModes); + gesture.connect('motion', this._switchWorkspaceMotion.bind(this)); + gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); + gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); + global.stage.add_action(gesture); + + // This is not a normal Clutter.GestureAction, doesn't need add_action() + gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes); + gesture.connect('motion', this._switchWorkspaceMotion.bind(this)); + gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); + gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); + + gesture = new AppSwitchAction(); + gesture.connect('activated', this._switchApp.bind(this)); + global.stage.add_action(gesture); + + let mode = Shell.ActionMode.ALL & ~Shell.ActionMode.LOCK_SCREEN; + gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM, mode); + gesture.connect('activated', () => { + Main.keyboard.show(Main.layoutManager.bottomIndex); + }); + Main.layoutManager.connect('keyboard-visible-changed', (manager, visible) => { + gesture.cancel(); + gesture.set_enabled(!visible); + }); + global.stage.add_action(gesture); + + gesture = new EdgeDragAction.EdgeDragAction(St.Side.TOP, mode); + gesture.connect('activated', () => { + let currentWindow = global.display.focus_window; + if (currentWindow) + currentWindow.unmake_fullscreen(); + }); + + let updateUnfullscreenGesture = () => { + let currentWindow = global.display.focus_window; + gesture.enabled = currentWindow && currentWindow.is_fullscreen(); + } + + global.display.connect('notify::focus-window', updateUnfullscreenGesture); + global.display.connect('in-fullscreen-changed', updateUnfullscreenGesture); + + global.stage.add_action(gesture); + } + + _showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) { + this._currentPadOsd = new PadOsd.PadOsd(device, settings, imagePath, editionMode, monitorIndex); + this._currentPadOsd.connect('closed', () => { this._currentPadOsd = null }); + + return this._currentPadOsd.actor; + } + + _switchWorkspaceMotion(action, xRel, yRel) { + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + + if (!this._switchData) + this._prepareWorkspaceSwitch(activeWorkspace.index(), -1); + + if (yRel < 0 && !this._switchData.surroundings[Meta.MotionDirection.DOWN]) + yRel = 0; + if (yRel > 0 && !this._switchData.surroundings[Meta.MotionDirection.UP]) + yRel = 0; + if (xRel < 0 && !this._switchData.surroundings[Meta.MotionDirection.RIGHT]) + xRel = 0; + if (xRel > 0 && !this._switchData.surroundings[Meta.MotionDirection.LEFT]) + xRel = 0; + + this._switchData.container.set_position(xRel, yRel); + } + + _switchWorkspaceCancel() { + if (!this._switchData || this._switchData.inProgress) + return; + let switchData = this._switchData; + this._switchData = null; + Tweener.addTween(switchData.container, + { x: 0, + y: 0, + time: WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._finishWorkspaceSwitch, + onCompleteScope: this, + onCompleteParams: [switchData], + }); + } + + _actionSwitchWorkspace(action, direction) { + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + let newWs = activeWorkspace.get_neighbor(direction); + + if (newWs == activeWorkspace) { + this._switchWorkspaceCancel(); + } else { + this._switchData.gestureActivated = true; + this.actionMoveWorkspace(newWs); + } + } + + _lookupIndex(windows, metaWindow) { + for (let i = 0; i < windows.length; i++) { + if (windows[i].metaWindow == metaWindow) { + return i; + } + } + return -1; + } + + _switchApp() { + let windows = global.get_window_actors().filter(actor => { + let win = actor.metaWindow; + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + return (!win.is_override_redirect() && + win.located_on_workspace(activeWorkspace)); + }); + + if (windows.length == 0) + return; + + let focusWindow = global.display.focus_window; + let nextWindow; + + if (focusWindow == null) + nextWindow = windows[0].metaWindow; + else { + let index = this._lookupIndex (windows, focusWindow) + 1; + + if (index >= windows.length) + index = 0; + + nextWindow = windows[index].metaWindow; + } + + Main.activateWindow(nextWindow); + } + + insertWorkspace(pos) { + let workspaceManager = global.workspace_manager; + + if (!Meta.prefs_get_dynamic_workspaces()) + return; + + workspaceManager.append_new_workspace(false, global.get_current_time()); + + let windows = global.get_window_actors().map(a => a.meta_window); + + // To create a new workspace, we slide all the windows on workspaces + // below us to the next workspace, leaving a blank workspace for us + // to recycle. + windows.forEach(window => { + // If the window is attached to an ancestor, we don't need/want + // to move it + if (window.get_transient_for() != null) + return; + // Same for OR windows + if (window.is_override_redirect()) + return; + // Sticky windows don't need moving, in fact moving would + // unstick them + if (window.on_all_workspaces) + return; + // Windows on workspaces below pos don't need moving + let index = window.get_workspace().index(); + if (index < pos) + return; + window.change_workspace_by_index(index + 1, true); + }); + + // If the new workspace was inserted before the active workspace, + // activate the workspace to which its windows went + let activeIndex = workspaceManager.get_active_workspace_index(); + if (activeIndex >= pos) { + let newWs = workspaceManager.get_workspace_by_index(activeIndex + 1); + this._blockAnimations = true; + newWs.activate(global.get_current_time()); + this._blockAnimations = false; + } + } + + keepWorkspaceAlive(workspace, duration) { + if (!this._workspaceTracker) + return; + + this._workspaceTracker.keepWorkspaceAlive(workspace, duration); + } + + skipNextEffect(actor) { + this._skippedActors.push(actor); + } + + setCustomKeybindingHandler(name, modes, handler) { + if (Meta.keybindings_set_custom_handler(name, handler)) + this.allowKeybinding(name, modes); + } + + addKeybinding(name, settings, flags, modes, handler) { + let action = global.display.add_keybinding(name, settings, flags, handler); + if (action != Meta.KeyBindingAction.NONE) + this.allowKeybinding(name, modes); + return action; + } + + removeKeybinding(name) { + if (global.display.remove_keybinding(name)) + this.allowKeybinding(name, Shell.ActionMode.NONE); + } + + allowKeybinding(name, modes) { + this._allowedKeybindings[name] = modes; + } + + _shouldAnimate() { + return !(Main.overview.visible || this._blockAnimations); + } + + _shouldAnimateActor(actor, types) { + if (this._removeEffect(this._skippedActors, actor)) + return false; + + if (!this._shouldAnimate()) + return false; + + if (!actor.get_texture()) + return false; + + let type = actor.meta_window.get_window_type(); + return types.indexOf(type) >= 0; + } + + _removeEffect(list, actor) { + let idx = list.indexOf(actor); + if (idx != -1) { + list.splice(idx, 1); + return true; + } + return false; + } + + _minimizeWindow(shellwm, actor) { + let types = [Meta.WindowType.NORMAL, + Meta.WindowType.MODAL_DIALOG, + Meta.WindowType.DIALOG]; + if (!this._shouldAnimateActor(actor, types)) { + shellwm.completed_minimize(actor); + return; + } + + actor.set_scale(1.0, 1.0); + + this._minimizing.push(actor); + + if (actor.meta_window.is_monitor_sized()) { + Tweener.addTween(actor, + { opacity: 0, + time: MINIMIZE_WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._minimizeWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._minimizeWindowOverwritten, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + } else { + let xDest, yDest, xScale, yScale; + let [success, geom] = actor.meta_window.get_icon_geometry(); + if (success) { + xDest = geom.x; + yDest = geom.y; + xScale = geom.width / actor.width; + yScale = geom.height / actor.height; + } else { + let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; + if (!monitor) { + this._minimizeWindowDone(); + return; + } + xDest = monitor.x; + yDest = monitor.y; + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + xDest += monitor.width; + xScale = 0; + yScale = 0; + } + + Tweener.addTween(actor, + { scale_x: xScale, + scale_y: yScale, + x: xDest, + y: yDest, + time: MINIMIZE_WINDOW_ANIMATION_TIME, + transition: 'easeInExpo', + onComplete: this._minimizeWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._minimizeWindowOverwritten, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + } + } + + _minimizeWindowDone(shellwm, actor) { + if (this._removeEffect(this._minimizing, actor)) { + Tweener.removeTweens(actor); + actor.set_scale(1.0, 1.0); + actor.set_opacity(255); + actor.set_pivot_point(0, 0); + + shellwm.completed_minimize(actor); + } + } + + _minimizeWindowOverwritten(shellwm, actor) { + if (this._removeEffect(this._minimizing, actor)) { + shellwm.completed_minimize(actor); + } + } + + _unminimizeWindow(shellwm, actor) { + let types = [Meta.WindowType.NORMAL, + Meta.WindowType.MODAL_DIALOG, + Meta.WindowType.DIALOG]; + if (!this._shouldAnimateActor(actor, types)) { + shellwm.completed_unminimize(actor); + return; + } + + this._unminimizing.push(actor); + + if (actor.meta_window.is_monitor_sized()) { + actor.opacity = 0; + actor.set_scale(1.0, 1.0); + Tweener.addTween(actor, + { opacity: 255, + time: MINIMIZE_WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._unminimizeWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._unminimizeWindowOverwritten, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + } else { + let [success, geom] = actor.meta_window.get_icon_geometry(); + if (success) { + actor.set_position(geom.x, geom.y); + actor.set_scale(geom.width / actor.width, + geom.height / actor.height); + } else { + let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; + if (!monitor) { + actor.show(); + this._unminimizeWindowDone(); + return; + } + actor.set_position(monitor.x, monitor.y); + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + actor.x += monitor.width; + actor.set_scale(0, 0); + } + + let rect = actor.meta_window.get_frame_rect(); + let [xDest, yDest] = [rect.x, rect.y]; + + actor.show(); + Tweener.addTween(actor, + { scale_x: 1.0, + scale_y: 1.0, + x: xDest, + y: yDest, + time: MINIMIZE_WINDOW_ANIMATION_TIME, + transition: 'easeInExpo', + onComplete: this._unminimizeWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._unminimizeWindowOverwritten, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + } + } + + _unminimizeWindowDone(shellwm, actor) { + if (this._removeEffect(this._unminimizing, actor)) { + Tweener.removeTweens(actor); + actor.set_scale(1.0, 1.0); + actor.set_opacity(255); + actor.set_pivot_point(0, 0); + + shellwm.completed_unminimize(actor); + } + } + + _unminimizeWindowOverwritten(shellwm, actor) { + if (this._removeEffect(this._unminimizing, actor)) { + shellwm.completed_unminimize(actor); + } + } + + _sizeChangeWindow(shellwm, actor, whichChange, oldFrameRect, oldBufferRect) { + let types = [Meta.WindowType.NORMAL]; + if (!this._shouldAnimateActor(actor, types)) { + shellwm.completed_size_change(actor); + return; + } + + if (oldFrameRect.width > 0 && oldFrameRect.height > 0) + this._prepareAnimationInfo(shellwm, actor, oldFrameRect, whichChange); + else + shellwm.completed_size_change(actor); + } + + _prepareAnimationInfo(shellwm, actor, oldFrameRect, change) { + // Position a clone of the window on top of the old position, + // while actor updates are frozen. + let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect); + let actorClone = new St.Widget({ content: actorContent }); + actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + actorClone.set_position(oldFrameRect.x, oldFrameRect.y); + actorClone.set_size(oldFrameRect.width, oldFrameRect.height); + Main.uiGroup.add_actor(actorClone); + + if (this._clearAnimationInfo(actor)) + this._shellwm.completed_size_change(actor); + + let destroyId = actor.connect('destroy', () => { + this._clearAnimationInfo(actor); + }); + + actor.__animationInfo = { clone: actorClone, + oldRect: oldFrameRect, + destroyId: destroyId }; + } + + _sizeChangedWindow(shellwm, actor) { + if (!actor.__animationInfo) + return; + if (this._resizing.indexOf(actor) != -1) + return; + + let actorClone = actor.__animationInfo.clone; + let targetRect = actor.meta_window.get_frame_rect(); + let sourceRect = actor.__animationInfo.oldRect; + + let scaleX = targetRect.width / sourceRect.width; + let scaleY = targetRect.height / sourceRect.height; + + this._resizing.push(actor); + + // Now scale and fade out the clone + Tweener.addTween(actorClone, + { x: targetRect.x, + y: targetRect.y, + scale_x: scaleX, + scale_y: scaleY, + opacity: 0, + time: WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad' + }); + + actor.translation_x = -targetRect.x + sourceRect.x; + actor.translation_y = -targetRect.y + sourceRect.y; + + // Now set scale the actor to size it as the clone. + actor.scale_x = 1 / scaleX; + actor.scale_y = 1 / scaleY; + + // Scale it to its actual new size + Tweener.addTween(actor, + { scale_x: 1.0, + scale_y: 1.0, + translation_x: 0, + translation_y: 0, + time: WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._sizeChangeWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._sizeChangeWindowOverwritten, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + + // Now unfreeze actor updates, to get it to the new size. + // It's important that we don't wait until the animation is completed to + // do this, otherwise our scale will be applied to the old texture size. + shellwm.completed_size_change(actor); + } + + _clearAnimationInfo(actor) { + if (actor.__animationInfo) { + actor.__animationInfo.clone.destroy(); + actor.disconnect(actor.__animationInfo.destroyId); + delete actor.__animationInfo; + return true; + } + return false; + } + + _sizeChangeWindowDone(shellwm, actor) { + if (this._removeEffect(this._resizing, actor)) { + Tweener.removeTweens(actor); + actor.scale_x = 1.0; + actor.scale_y = 1.0; + actor.translation_x = 0; + actor.translation_y = 0; + this._clearAnimationInfo(actor); + } + } + + _sizeChangeWindowOverwritten(shellwm, actor) { + if (this._removeEffect(this._resizing, actor)) + this._clearAnimationInfo(actor); + } + + _hasAttachedDialogs(window, ignoreWindow) { + var count = 0; + window.foreach_transient(win => { + if (win != ignoreWindow && + win.is_attached_dialog() && + win.get_transient_for() == window) { + count++; + return false; + } + return true; + }); + return count != 0; + } + + _checkDimming(window, ignoreWindow) { + let shouldDim = this._hasAttachedDialogs(window, ignoreWindow); + + if (shouldDim && !window._dimmed) { + window._dimmed = true; + this._dimmedWindows.push(window); + this._dimWindow(window); + } else if (!shouldDim && window._dimmed) { + window._dimmed = false; + this._dimmedWindows = + this._dimmedWindows.filter(win => win != window); + this._undimWindow(window); + } + } + + _dimWindow(window) { + let actor = window.get_compositor_private(); + if (!actor) + return; + let dimmer = getWindowDimmer(actor); + if (!dimmer) + return; + if (this._shouldAnimate()) + Tweener.addTween(dimmer, + { dimFactor: 1.0, + time: DIM_TIME, + transition: 'linear' + }); + else + dimmer.dimFactor = 1.0; + } + + _undimWindow(window) { + let actor = window.get_compositor_private(); + if (!actor) + return; + let dimmer = getWindowDimmer(actor); + if (!dimmer) + return; + if (this._shouldAnimate()) + Tweener.addTween(dimmer, + { dimFactor: 0.0, + time: UNDIM_TIME, + transition: 'linear' }); + else + dimmer.dimFactor = 0.0; + } + + _mapWindow(shellwm, actor) { + actor._windowType = actor.meta_window.get_window_type(); + actor._notifyWindowTypeSignalId = + actor.meta_window.connect('notify::window-type', () => { + let type = actor.meta_window.get_window_type(); + if (type == actor._windowType) + return; + if (type == Meta.WindowType.MODAL_DIALOG || + actor._windowType == Meta.WindowType.MODAL_DIALOG) { + let parent = actor.get_meta_window().get_transient_for(); + if (parent) + this._checkDimming(parent); + } + + actor._windowType = type; + }); + actor.meta_window.connect('unmanaged', window => { + let parent = window.get_transient_for(); + if (parent) + this._checkDimming(parent); + }); + + if (actor.meta_window.is_attached_dialog()) + this._checkDimming(actor.get_meta_window().get_transient_for()); + + let types = [Meta.WindowType.NORMAL, + Meta.WindowType.DIALOG, + Meta.WindowType.MODAL_DIALOG]; + if (!this._shouldAnimateActor(actor, types)) { + shellwm.completed_map(actor); + return; + } + + switch (actor._windowType) { + case Meta.WindowType.NORMAL: + actor.set_pivot_point(0.5, 1.0); + actor.scale_x = 0.01; + actor.scale_y = 0.05; + actor.opacity = 0; + actor.show(); + this._mapping.push(actor); + + Tweener.addTween(actor, + { opacity: 255, + scale_x: 1, + scale_y: 1, + time: SHOW_WINDOW_ANIMATION_TIME, + transition: 'easeOutExpo', + onComplete: this._mapWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._mapWindowOverwrite, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + break; + case Meta.WindowType.MODAL_DIALOG: + case Meta.WindowType.DIALOG: + actor.set_pivot_point(0.5, 0.5); + actor.scale_y = 0; + actor.opacity = 0; + actor.show(); + this._mapping.push(actor); + + Tweener.addTween(actor, + { opacity: 255, + scale_x: 1, + scale_y: 1, + time: DIALOG_SHOW_WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._mapWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._mapWindowOverwrite, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + break; + default: + shellwm.completed_map(actor); + return; + } + } + + _mapWindowDone(shellwm, actor) { + if (this._removeEffect(this._mapping, actor)) { + Tweener.removeTweens(actor); + actor.opacity = 255; + actor.set_pivot_point(0, 0); + actor.scale_y = 1; + actor.scale_x = 1; + actor.translation_y = 0; + actor.translation_x = 0; + shellwm.completed_map(actor); + } + } + + _mapWindowOverwrite(shellwm, actor) { + if (this._removeEffect(this._mapping, actor)) { + shellwm.completed_map(actor); + } + } + + _destroyWindow(shellwm, actor) { + let window = actor.meta_window; + if (actor._notifyWindowTypeSignalId) { + window.disconnect(actor._notifyWindowTypeSignalId); + actor._notifyWindowTypeSignalId = 0; + } + if (window._dimmed) { + this._dimmedWindows = + this._dimmedWindows.filter(win => win != window); + } + + if (window.is_attached_dialog()) + this._checkDimming(window.get_transient_for(), window); + + let types = [Meta.WindowType.NORMAL, + Meta.WindowType.DIALOG, + Meta.WindowType.MODAL_DIALOG]; + if (!this._shouldAnimateActor(actor, types)) { + shellwm.completed_destroy(actor); + return; + } + + switch (actor.meta_window.window_type) { + case Meta.WindowType.NORMAL: + actor.set_pivot_point(0.5, 0.5); + this._destroying.push(actor); + + Tweener.addTween(actor, + { opacity: 0, + scale_x: 0.8, + scale_y: 0.8, + time: DESTROY_WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._destroyWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._destroyWindowDone, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + break; + case Meta.WindowType.MODAL_DIALOG: + case Meta.WindowType.DIALOG: + actor.set_pivot_point(0.5, 0.5); + this._destroying.push(actor); + + if (window.is_attached_dialog()) { + let parent = window.get_transient_for(); + actor._parentDestroyId = parent.connect('unmanaged', () => { + Tweener.removeTweens(actor); + this._destroyWindowDone(shellwm, actor); + }); + } + + Tweener.addTween(actor, + { scale_y: 0, + time: DIALOG_DESTROY_WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._destroyWindowDone, + onCompleteScope: this, + onCompleteParams: [shellwm, actor], + onOverwrite: this._destroyWindowDone, + onOverwriteScope: this, + onOverwriteParams: [shellwm, actor] + }); + break; + default: + shellwm.completed_destroy(actor); + return; + } + } + + _destroyWindowDone(shellwm, actor) { + if (this._removeEffect(this._destroying, actor)) { + let parent = actor.get_meta_window().get_transient_for(); + if (parent && actor._parentDestroyId) { + parent.disconnect(actor._parentDestroyId); + actor._parentDestroyId = 0; + } + shellwm.completed_destroy(actor); + } + } + + _filterKeybinding(shellwm, binding) { + if (Main.actionMode == Shell.ActionMode.NONE) + return true; + + // There's little sense in implementing a keybinding in mutter and + // not having it work in NORMAL mode; handle this case generically + // so we don't have to explicitly allow all builtin keybindings in + // NORMAL mode. + if (Main.actionMode == Shell.ActionMode.NORMAL && + binding.is_builtin()) + return false; + + return !(this._allowedKeybindings[binding.get_name()] & Main.actionMode); + } + + _syncStacking() { + if (this._switchData == null) + return; + + let windows = global.get_window_actors(); + let lastCurSibling = null; + let lastDirSibling = []; + for (let i = 0; i < windows.length; i++) { + if (windows[i].get_parent() == this._switchData.curGroup) { + this._switchData.curGroup.set_child_above_sibling(windows[i], lastCurSibling); + lastCurSibling = windows[i]; + } else { + for (let dir of Object.values(Meta.MotionDirection)) { + let info = this._switchData.surroundings[dir]; + if (!info || windows[i].get_parent() != info.actor) + continue; + + let sibling = lastDirSibling[dir]; + if (sibling == undefined) + sibling = null; + + info.actor.set_child_above_sibling(windows[i], sibling); + lastDirSibling[dir] = windows[i]; + break; + } + } + } + } + + _getPositionForDirection(direction) { + let xDest = 0, yDest = 0; + + if (direction == Meta.MotionDirection.UP || + direction == Meta.MotionDirection.UP_LEFT || + direction == Meta.MotionDirection.UP_RIGHT) + yDest = -global.screen_height + Main.panel.height; + else if (direction == Meta.MotionDirection.DOWN || + direction == Meta.MotionDirection.DOWN_LEFT || + direction == Meta.MotionDirection.DOWN_RIGHT) + yDest = global.screen_height - Main.panel.height; + + if (direction == Meta.MotionDirection.LEFT || + direction == Meta.MotionDirection.UP_LEFT || + direction == Meta.MotionDirection.DOWN_LEFT) + xDest = -global.screen_width; + else if (direction == Meta.MotionDirection.RIGHT || + direction == Meta.MotionDirection.UP_RIGHT || + direction == Meta.MotionDirection.DOWN_RIGHT) + xDest = global.screen_width; + + return [xDest, yDest]; + } + + _prepareWorkspaceSwitch(from, to, direction) { + if (this._switchData) + return; + + let wgroup = global.window_group; + let windows = global.get_window_actors(); + let switchData = {}; + + this._switchData = switchData; + switchData.curGroup = new Clutter.Actor(); + switchData.movingWindowBin = new Clutter.Actor(); + switchData.windows = []; + switchData.surroundings = {}; + switchData.gestureActivated = false; + switchData.inProgress = false; + + switchData.container = new Clutter.Actor(); + switchData.container.add_actor(switchData.curGroup); + + wgroup.add_actor(switchData.movingWindowBin); + wgroup.add_actor(switchData.container); + + let workspaceManager = global.workspace_manager; + let curWs = workspaceManager.get_workspace_by_index (from); + + for (let dir of Object.values(Meta.MotionDirection)) { + let ws = null; + + if (to < 0) + ws = curWs.get_neighbor(dir); + else if (dir == direction) + ws = workspaceManager.get_workspace_by_index(to); + + if (ws == null || ws == curWs) { + switchData.surroundings[dir] = null; + continue; + } + + let info = { index: ws.index(), + actor: new Clutter.Actor() }; + switchData.surroundings[dir] = info; + switchData.container.add_actor(info.actor); + info.actor.raise_top(); + + let [x, y] = this._getPositionForDirection(dir); + info.actor.set_position(x, y); + } + + switchData.movingWindowBin.raise_top(); + + for (let i = 0; i < windows.length; i++) { + let actor = windows[i]; + let window = actor.get_meta_window(); + + if (!window.showing_on_its_workspace()) + continue; + + if (window.is_on_all_workspaces()) + continue; + + let record = { window: actor, + parent: actor.get_parent() }; + + if (this._movingWindow && window == this._movingWindow) { + switchData.movingWindow = record; + switchData.windows.push(switchData.movingWindow); + actor.reparent(switchData.movingWindowBin); + } else if (window.get_workspace().index() == from) { + switchData.windows.push(record); + actor.reparent(switchData.curGroup); + } else { + let visible = false; + for (let dir of Object.values(Meta.MotionDirection)) { + let info = switchData.surroundings[dir]; + + if (!info || info.index != window.get_workspace().index()) + continue; + + switchData.windows.push(record); + actor.reparent(info.actor); + visible = true; + break; + } + + actor.visible = visible; + } + } + + for (let i = 0; i < switchData.windows.length; i++) { + let w = switchData.windows[i]; + + w.windowDestroyId = w.window.connect('destroy', () => { + switchData.windows.splice(switchData.windows.indexOf(w), 1); + }); + } + } + + _finishWorkspaceSwitch(switchData) { + this._switchData = null; + + for (let i = 0; i < switchData.windows.length; i++) { + let w = switchData.windows[i]; + + w.window.disconnect(w.windowDestroyId); + w.window.reparent(w.parent); + + if (w.window.get_meta_window().get_workspace() != + global.workspace_manager.get_active_workspace()) + w.window.hide(); + } + Tweener.removeTweens(switchData.container); + switchData.container.destroy(); + switchData.movingWindowBin.destroy(); + + this._movingWindow = null; + } + + _switchWorkspace(shellwm, from, to, direction) { + if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) { + shellwm.completed_switch_workspace(); + return; + } + + // If we come from a gesture, switchData will already be set, + // and we don't want to overwrite it. + if (!this._switchData) + this._prepareWorkspaceSwitch(from, to, direction); + + this._switchData.inProgress = true; + + let [xDest, yDest] = this._getPositionForDirection(direction); + + /* @direction is the direction that the "camera" moves, so the + * screen contents have to move one screen's worth in the + * opposite direction. + */ + xDest = -xDest; + yDest = -yDest; + + Tweener.addTween(this._switchData.container, + { x: xDest, + y: yDest, + time: WINDOW_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._switchWorkspaceDone, + onCompleteScope: this, + onCompleteParams: [shellwm] + }); + } + + _switchWorkspaceDone(shellwm) { + this._finishWorkspaceSwitch(this._switchData); + shellwm.completed_switch_workspace(); + } + + _showTilePreview(shellwm, window, tileRect, monitorIndex) { + if (!this._tilePreview) + this._tilePreview = new TilePreview(); + this._tilePreview.show(window, tileRect, monitorIndex); + } + + _hideTilePreview(shellwm) { + if (!this._tilePreview) + return; + this._tilePreview.hide(); + } + + _showWindowMenu(shellwm, window, menu, rect) { + this._windowMenuManager.showWindowMenuForWindow(window, menu, rect); + } + + _startSwitcher(display, window, binding) { + let constructor = null; + switch (binding.get_name()) { + case 'switch-applications': + case 'switch-applications-backward': + case 'switch-group': + case 'switch-group-backward': + constructor = AltTab.AppSwitcherPopup; + break; + case 'switch-windows': + case 'switch-windows-backward': + constructor = AltTab.WindowSwitcherPopup; + break; + case 'cycle-windows': + case 'cycle-windows-backward': + constructor = AltTab.WindowCyclerPopup; + break; + case 'cycle-group': + case 'cycle-group-backward': + constructor = AltTab.GroupCyclerPopup; + break; + case 'switch-monitor': + constructor = SwitchMonitor.SwitchMonitorPopup; + break; + } + + if (!constructor) + return; + + /* prevent a corner case where both popups show up at once */ + if (this._workspaceSwitcherPopup != null) + this._workspaceSwitcherPopup.destroy(); + + let tabPopup = new constructor(); + + if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask())) + tabPopup.destroy(); + } + + _startA11ySwitcher(display, window, binding) { + Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask()); + } + + _switchToApplication(display, window, binding) { + let [,,,target] = binding.get_name().split('-'); + let apps = AppFavorites.getAppFavorites().getFavorites(); + let app = apps[target - 1]; + if (app) + app.activate(); + } + + _toggleAppMenu(display, window, event, binding) { + Main.panel.toggleAppMenu(); + } + + _toggleCalendar(display, window, event, binding) { + Main.panel.toggleCalendar(); + } + + _toggleTweens() { + this._tweensPaused = !this._tweensPaused; + const OrigTweener = imports.tweener.tweener; + if (this._tweensPaused) + OrigTweener.pauseAllTweens(); + else + OrigTweener.resumeAllTweens(); + } + + _showWorkspaceSwitcher(display, window, binding) { + let workspaceManager = display.get_workspace_manager(); + + if (!Main.sessionMode.hasWorkspaces) + return; + + if (workspaceManager.n_workspaces == 1) + return; + + let [action,,,target] = binding.get_name().split('-'); + let newWs; + let direction; + + if (action == 'move') { + // "Moving" a window to another workspace doesn't make sense when + // it cannot be unstuck, and is potentially confusing if a new + // workspaces is added at the start/end + if (window.is_always_on_all_workspaces() || + (Meta.prefs_get_workspaces_only_on_primary() && + window.get_monitor() != Main.layoutManager.primaryIndex)) + return; + } + + if (target == 'last') { + direction = Meta.MotionDirection.DOWN; + newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1); + } else if (isNaN(target)) { + // Prepend a new workspace dynamically + if (workspaceManager.get_active_workspace_index() == 0 && + action == 'move' && target == 'up' && this._isWorkspacePrepended == false) { + this.insertWorkspace(0); + this._isWorkspacePrepended = true; + } + + direction = Meta.MotionDirection[target.toUpperCase()]; + newWs = workspaceManager.get_active_workspace().get_neighbor(direction); + } else if ((target > 0) && (target <= workspaceManager.n_workspaces)) { + target--; + newWs = workspaceManager.get_workspace_by_index(target); + + if (workspaceManager.get_active_workspace().index() > target) + direction = Meta.MotionDirection.UP; + else + direction = Meta.MotionDirection.DOWN; + } + + if (direction != Meta.MotionDirection.UP && + direction != Meta.MotionDirection.DOWN) + return; + + if (action == 'switch') + this.actionMoveWorkspace(newWs); + else + this.actionMoveWindow(window, newWs); + + if (!Main.overview.visible) { + if (this._workspaceSwitcherPopup == null) { + this._workspaceTracker.blockUpdates(); + this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup(); + this._workspaceSwitcherPopup.connect('destroy', () => { + this._workspaceTracker.unblockUpdates(); + this._workspaceSwitcherPopup = null; + this._isWorkspacePrepended = false; + }); + } + this._workspaceSwitcherPopup.display(direction, newWs.index()); + } + } + + actionMoveWorkspace(workspace) { + if (!Main.sessionMode.hasWorkspaces) + return; + + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + + if (activeWorkspace != workspace) + workspace.activate(global.get_current_time()); + } + + actionMoveWindow(window, workspace) { + if (!Main.sessionMode.hasWorkspaces) + return; + + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + + if (activeWorkspace != workspace) { + // This won't have any effect for "always sticky" windows + // (like desktop windows or docks) + + this._movingWindow = window; + window.change_workspace(workspace); + + global.display.clear_mouse_mode(); + workspace.activate_with_focus (window, global.get_current_time()); + } + } + + _confirmDisplayChange() { + let dialog = new DisplayChangeDialog(this._shellwm); + dialog.open(); + } + + _createCloseDialog(shellwm, window) { + return new CloseDialog.CloseDialog(window); + } + + _createInhibitShortcutsDialog(shellwm, window) { + return new InhibitShortcutsDialog.InhibitShortcutsDialog(window); + } + + _showResizePopup(display, show, rect, displayW, displayH) { + if (show) { + if (!this._resizePopup) + this._resizePopup = new ResizePopup(); + + this._resizePopup.set(rect, displayW, displayH); + } else { + if (this._resizePopup) { + this._resizePopup.destroy(); + this._resizePopup = null; + } + } + } +}; diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js new file mode 100644 index 0000000..628f145 --- /dev/null +++ b/js/ui/windowMenu.js @@ -0,0 +1,214 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -* + +const { Meta, St } = imports.gi; + +const BoxPointer = imports.ui.boxpointer; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; + +var WindowMenu = class extends PopupMenu.PopupMenu { + constructor(window, sourceActor) { + super(sourceActor, 0, St.Side.TOP); + + this.actor.add_style_class_name('window-menu'); + + Main.layoutManager.uiGroup.add_actor(this.actor); + this.actor.hide(); + + this._buildMenu(window); + } + + _buildMenu(window) { + let type = window.get_window_type(); + + let item; + + item = this.addAction(_("Minimize"), () => { + window.minimize(); + }); + if (!window.can_minimize()) + item.setSensitive(false); + + if (window.get_maximized()) { + item = this.addAction(_("Unmaximize"), () => { + window.unmaximize(Meta.MaximizeFlags.BOTH); + }); + } else { + item = this.addAction(_("Maximize"), () => { + window.maximize(Meta.MaximizeFlags.BOTH); + }); + } + if (!window.can_maximize()) + item.setSensitive(false); + + item = this.addAction(_("Move"), event => { + window.begin_grab_op(Meta.GrabOp.KEYBOARD_MOVING, true, event.get_time()); + }); + if (!window.allows_move()) + item.setSensitive(false); + + item = this.addAction(_("Resize"), event => { + window.begin_grab_op(Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN, true, event.get_time()); + }); + if (!window.allows_resize()) + item.setSensitive(false); + + if (!window.titlebar_is_onscreen() && type != Meta.WindowType.DOCK && type != Meta.WindowType.DESKTOP) { + this.addAction(_("Move Titlebar Onscreen"), () => { + window.shove_titlebar_onscreen(); + }); + } + + item = this.addAction(_("Always on Top"), () => { + if (window.is_above()) + window.unmake_above(); + else + window.make_above(); + }); + if (window.is_above()) + item.setOrnament(PopupMenu.Ornament.CHECK); + if (window.get_maximized() == Meta.MaximizeFlags.BOTH || + type == Meta.WindowType.DOCK || + type == Meta.WindowType.DESKTOP || + type == Meta.WindowType.SPLASHSCREEN) + item.setSensitive(false); + + if (Main.sessionMode.hasWorkspaces && + (!Meta.prefs_get_workspaces_only_on_primary() || + window.is_on_primary_monitor())) { + let isSticky = window.is_on_all_workspaces(); + + item = this.addAction(_("Always on Visible Workspace"), () => { + if (isSticky) + window.unstick(); + else + window.stick(); + }); + if (isSticky) + item.setOrnament(PopupMenu.Ornament.CHECK); + if (window.is_always_on_all_workspaces()) + item.setSensitive(false); + + if (!isSticky) { + let workspace = window.get_workspace(); + if (workspace != workspace.get_neighbor(Meta.MotionDirection.LEFT)) { + this.addAction(_("Move to Workspace Left"), () => { + let dir = Meta.MotionDirection.LEFT; + window.change_workspace(workspace.get_neighbor(dir)); + }); + } + if (workspace != workspace.get_neighbor(Meta.MotionDirection.RIGHT)) { + this.addAction(_("Move to Workspace Right"), () => { + let dir = Meta.MotionDirection.RIGHT; + window.change_workspace(workspace.get_neighbor(dir)); + }); + } + if (workspace != workspace.get_neighbor(Meta.MotionDirection.UP)) { + this.addAction(_("Move to Workspace Up"), () => { + let dir = Meta.MotionDirection.UP; + window.change_workspace(workspace.get_neighbor(dir)); + }); + } + if (workspace != workspace.get_neighbor(Meta.MotionDirection.DOWN)) { + this.addAction(_("Move to Workspace Down"), () => { + let dir = Meta.MotionDirection.DOWN; + window.change_workspace(workspace.get_neighbor(dir)); + }); + } + } + } + + let display = global.display; + let nMonitors = display.get_n_monitors(); + let monitorIndex = window.get_monitor(); + if (nMonitors > 1 && monitorIndex >= 0) { + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + let dir = Meta.DisplayDirection.UP; + let upMonitorIndex = + display.get_monitor_neighbor_index(monitorIndex, dir); + if (upMonitorIndex != -1) { + this.addAction(_("Move to Monitor Up"), () => { + window.move_to_monitor(upMonitorIndex); + }); + } + + dir = Meta.DisplayDirection.DOWN; + let downMonitorIndex = + display.get_monitor_neighbor_index(monitorIndex, dir); + if (downMonitorIndex != -1) { + this.addAction(_("Move to Monitor Down"), () => { + window.move_to_monitor(downMonitorIndex); + }); + } + + dir = Meta.DisplayDirection.LEFT; + let leftMonitorIndex = + display.get_monitor_neighbor_index(monitorIndex, dir); + if (leftMonitorIndex != -1) { + this.addAction(_("Move to Monitor Left"), () => { + window.move_to_monitor(leftMonitorIndex); + }); + } + + dir = Meta.DisplayDirection.RIGHT; + let rightMonitorIndex = + display.get_monitor_neighbor_index(monitorIndex, dir); + if (rightMonitorIndex != -1) { + this.addAction(_("Move to Monitor Right"), () => { + window.move_to_monitor(rightMonitorIndex); + }); + } + } + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + item = this.addAction(_("Close"), event => { + window.delete(event.get_time()); + }); + if (!window.can_close()) + item.setSensitive(false); + } +}; + +var WindowMenuManager = class { + constructor() { + this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor }); + + this._sourceActor = new St.Widget({ reactive: true, visible: false }); + this._sourceActor.connect('button-press-event', () => { + this._manager.activeMenu.toggle(); + }); + Main.uiGroup.add_actor(this._sourceActor); + } + + showWindowMenuForWindow(window, type, rect) { + if (type != Meta.WindowMenuType.WM) + throw new Error('Unsupported window menu type'); + let menu = new WindowMenu(window, this._sourceActor); + + this._manager.addMenu(menu); + + menu.connect('activate', () => { + window.check_alive(global.get_current_time()); + }); + let destroyId = window.connect('unmanaged', () => { + menu.close(); + }); + + this._sourceActor.set_size(Math.max(1, rect.width), Math.max(1, rect.height)); + this._sourceActor.set_position(rect.x, rect.y); + this._sourceActor.show(); + + menu.open(BoxPointer.PopupAnimation.NONE); + menu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + menu.connect('open-state-changed', (menu_, isOpen) => { + if (isOpen) + return; + + this._sourceActor.hide(); + menu.destroy(); + window.disconnect(destroyId); + }); + } +}; diff --git a/js/ui/workspace.js b/js/ui/workspace.js new file mode 100644 index 0000000..9c58861 --- /dev/null +++ b/js/ui/workspace.js @@ -0,0 +1,2017 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Atk, Clutter, GLib, GObject, Meta, Pango, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const DND = imports.ui.dnd; +const Main = imports.ui.main; +const Overview = imports.ui.overview; +const Tweener = imports.ui.tweener; + +var WINDOW_DND_SIZE = 256; + +var WINDOW_CLONE_MAXIMUM_SCALE = 1.0; + +var WINDOW_OVERLAY_IDLE_HIDE_TIMEOUT = 750; +var WINDOW_OVERLAY_FADE_TIME = 0.1; + +var WINDOW_REPOSITIONING_DELAY = 750; + +var DRAGGING_WINDOW_OPACITY = 100; + +// When calculating a layout, we calculate the scale of windows and the percent +// of the available area the new layout uses. If the values for the new layout, +// when weighted with the values as below, are worse than the previous layout's, +// we stop looking for a new layout and use the previous layout. +// Otherwise, we keep looking for a new layout. +var LAYOUT_SCALE_WEIGHT = 1; +var LAYOUT_SPACE_WEIGHT = 0.1; + +var WINDOW_ANIMATION_MAX_NUMBER_BLENDING = 3; + +function _interpolate(start, end, step) { + return start + (end - start) * step; +} + +var WindowCloneLayout = GObject.registerClass( +class WindowCloneLayout extends Clutter.LayoutManager { + _init(boundingBox) { + super._init(); + + this._boundingBox = boundingBox; + } + + get boundingBox() { + return this._boundingBox; + } + + set boundingBox(b) { + this._boundingBox = b; + this.layout_changed(); + } + + _makeBoxForWindow(window) { + // We need to adjust the position of the actor because of the + // consequences of invisible borders -- in reality, the texture + // has an extra set of "padding" around it that we need to trim + // down. + + // The outer rect (from which we compute the bounding box) + // paradoxically is the smaller rectangle, containing the positions + // of the visible frame. The input rect contains everything, + // including the invisible border padding. + let inputRect = window.get_buffer_rect(); + + let box = new Clutter.ActorBox(); + + box.set_origin(inputRect.x - this._boundingBox.x, + inputRect.y - this._boundingBox.y); + box.set_size(inputRect.width, inputRect.height); + + return box; + } + + vfunc_get_preferred_height(container, forWidth) { + return [this._boundingBox.height, this._boundingBox.height]; + } + + vfunc_get_preferred_width(container, forHeight) { + return [this._boundingBox.width, this._boundingBox.width]; + } + + vfunc_allocate(container, box, flags) { + container.get_children().forEach(child => { + let realWindow; + if (child == container._delegate._windowClone) + realWindow = container._delegate.realWindow; + else + realWindow = child.source; + + child.allocate(this._makeBoxForWindow(realWindow.meta_window), + flags); + }); + } +}); + +var WindowClone = class { + constructor(realWindow, workspace) { + this.realWindow = realWindow; + this.metaWindow = realWindow.meta_window; + this.metaWindow._delegate = this; + this._workspace = workspace; + + this._windowClone = new Clutter.Clone({ source: realWindow }); + // We expect this.actor to be used for all interaction rather than + // this._windowClone; as the former is reactive and the latter + // is not, this just works for most cases. However, for DND all + // actors are picked, so DND operations would operate on the clone. + // To avoid this, we hide it from pick. + Shell.util_set_hidden_from_pick(this._windowClone, true); + + // The MetaShapedTexture that we clone has a size that includes + // the invisible border; this is inconvenient; rather than trying + // to compensate all over the place we insert a ClutterActor into + // the hierarchy that is sized to only the visible portion. + this.actor = new St.Widget({ reactive: true, + can_focus: true, + accessible_role: Atk.Role.PUSH_BUTTON, + layout_manager: new WindowCloneLayout() }); + + this.actor.add_child(this._windowClone); + + this.actor._delegate = this; + + this.slotId = 0; + this._slot = [0, 0, 0, 0]; + this._dragSlot = [0, 0, 0, 0]; + this._stackAbove = null; + + this._windowClone._sizeChangedId = this.metaWindow.connect('size-changed', + this._onMetaWindowSizeChanged.bind(this)); + this._windowClone._posChangedId = this.metaWindow.connect('position-changed', + this._computeBoundingBox.bind(this)); + this._windowClone._destroyId = + this.realWindow.connect('destroy', () => { + // First destroy the clone and then destroy everything + // This will ensure that we never see it in the + // _disconnectSignals loop + this._windowClone.destroy(); + this.destroy(); + }); + + this._updateAttachedDialogs(); + this._computeBoundingBox(); + this.actor.x = this._boundingBox.x; + this.actor.y = this._boundingBox.y; + + let clickAction = new Clutter.ClickAction(); + clickAction.connect('clicked', this._onClicked.bind(this)); + clickAction.connect('long-press', this._onLongPress.bind(this)); + this.actor.add_action(clickAction); + this.actor.connect('destroy', this._onDestroy.bind(this)); + this.actor.connect('key-press-event', this._onKeyPress.bind(this)); + + this.actor.connect('enter-event', () => { this.emit('show-chrome'); }); + this.actor.connect('key-focus-in', () => { this.emit('show-chrome'); }); + + this.actor.connect('leave-event', () => { this.emit('hide-chrome'); }); + this.actor.connect('key-focus-out', () => { this.emit('hide-chrome'); }); + + this._draggable = DND.makeDraggable(this.actor, + { restoreOnSuccess: true, + manualMode: true, + dragActorMaxSize: WINDOW_DND_SIZE, + dragActorOpacity: DRAGGING_WINDOW_OPACITY }); + this._draggable.connect('drag-begin', this._onDragBegin.bind(this)); + this._draggable.connect('drag-cancelled', this._onDragCancelled.bind(this)); + this._draggable.connect('drag-end', this._onDragEnd.bind(this)); + this.inDrag = false; + + this._selected = false; + this._closeRequested = false; + } + + set slot(slot) { + this._slot = slot; + } + + get slot() { + if (this.inDrag) + return this._dragSlot; + else + return this._slot; + } + + deleteAll() { + // Delete all windows, starting from the bottom-most (most-modal) one + let windows = this.actor.get_children(); + for (let i = windows.length - 1; i >= 1; i--) { + let realWindow = windows[i].source; + let metaWindow = realWindow.meta_window; + + metaWindow.delete(global.get_current_time()); + } + + this.metaWindow.delete(global.get_current_time()); + this._closeRequested = true; + } + + addDialog(win) { + let parent = win.get_transient_for(); + while (parent.is_attached_dialog()) + parent = parent.get_transient_for(); + + // Display dialog if it is attached to our metaWindow + if (win.is_attached_dialog() && parent == this.metaWindow) { + this._doAddAttachedDialog(win, win.get_compositor_private()); + this._onMetaWindowSizeChanged(); + } + + // The dialog popped up after the user tried to close the window, + // assume it's a close confirmation and leave the overview + if (this._closeRequested) + this._activate(); + } + + hasAttachedDialogs() { + return this.actor.get_n_children() > 1; + } + + _doAddAttachedDialog(metaWin, realWin) { + let clone = new Clutter.Clone({ source: realWin }); + clone._sizeChangedId = metaWin.connect('size-changed', + this._onMetaWindowSizeChanged.bind(this)); + clone._posChangedId = metaWin.connect('position-changed', + this._onMetaWindowSizeChanged.bind(this)); + clone._destroyId = realWin.connect('destroy', () => { + clone.destroy(); + + this._onMetaWindowSizeChanged(); + }); + this.actor.add_child(clone); + } + + _updateAttachedDialogs() { + let iter = win => { + let actor = win.get_compositor_private(); + + if (!actor) + return false; + if (!win.is_attached_dialog()) + return false; + + this._doAddAttachedDialog(win, actor); + win.foreach_transient(iter); + return true; + }; + this.metaWindow.foreach_transient(iter); + } + + get boundingBox() { + return this._boundingBox; + } + + get width() { + return this._boundingBox.width; + } + + get height() { + return this._boundingBox.height; + } + + getOriginalPosition() { + return [this._boundingBox.x, this._boundingBox.y]; + } + + _computeBoundingBox() { + let rect = this.metaWindow.get_frame_rect(); + + this.actor.get_children().forEach(child => { + let realWindow; + if (child == this._windowClone) + realWindow = this.realWindow; + else + realWindow = child.source; + + let metaWindow = realWindow.meta_window; + rect = rect.union(metaWindow.get_frame_rect()); + }); + + // Convert from a MetaRectangle to a native JS object + this._boundingBox = { x: rect.x, y: rect.y, width: rect.width, height: rect.height }; + this.actor.layout_manager.boundingBox = rect; + } + + // Find the actor just below us, respecting reparenting done by DND code + getActualStackAbove() { + if (this._stackAbove == null) + return null; + + if (this.inDrag) { + if (this._stackAbove._delegate) + return this._stackAbove._delegate.getActualStackAbove(); + else + return null; + } else { + return this._stackAbove; + } + } + + setStackAbove(actor) { + this._stackAbove = actor; + if (this.inDrag) + // We'll fix up the stack after the drag + return; + + let actualAbove = this.getActualStackAbove(); + if (actualAbove == null) + this.actor.lower_bottom(); + else + this.actor.raise(actualAbove); + } + + destroy() { + this.actor.destroy(); + } + + _disconnectSignals() { + this.actor.get_children().forEach(child => { + let realWindow; + if (child == this._windowClone) + realWindow = this.realWindow; + else + realWindow = child.source; + + realWindow.meta_window.disconnect(child._sizeChangedId); + realWindow.meta_window.disconnect(child._posChangedId); + realWindow.disconnect(child._destroyId); + }); + } + + _onMetaWindowSizeChanged() { + this._computeBoundingBox(); + this.emit('size-changed'); + } + + _onDestroy() { + this._disconnectSignals(); + + this.metaWindow._delegate = null; + this.actor._delegate = null; + + if (this.inDrag) { + this.emit('drag-end'); + this.inDrag = false; + } + + this.disconnectAll(); + } + + _activate() { + this._selected = true; + this.emit('selected', global.get_current_time()); + } + + _onKeyPress(actor, event) { + let symbol = event.get_key_symbol(); + let isEnter = (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter); + if (isEnter) { + this._activate(); + return true; + } + + return false; + } + + _onClicked(action, actor) { + this._activate(); + } + + _onLongPress(action, actor, state) { + // Take advantage of the Clutter policy to consider + // a long-press canceled when the pointer movement + // exceeds dnd-drag-threshold to manually start the drag + if (state == Clutter.LongPressState.CANCEL) { + let event = Clutter.get_current_event(); + this._dragTouchSequence = event.get_event_sequence(); + + // A click cancels a long-press before any click handler is + // run - make sure to not start a drag in that case + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + if (this._selected) + return; + let [x, y] = action.get_coords(); + action.release(); + this._draggable.startDrag(x, y, global.get_current_time(), this._dragTouchSequence); + }); + } else { + this.emit('show-chrome'); + } + return true; + } + + _onDragBegin(draggable, time) { + this._dragSlot = this._slot; + [this.dragOrigX, this.dragOrigY] = this.actor.get_position(); + this.dragOrigScale = this.actor.scale_x; + this.inDrag = true; + this.emit('drag-begin'); + } + + handleDragOver(source, actor, x, y, time) { + return this._workspace.handleDragOver(source, actor, x, y, time); + } + + acceptDrop(source, actor, x, y, time) { + this._workspace.acceptDrop(source, actor, x, y, time); + } + + _onDragCancelled(draggable, time) { + this.emit('drag-cancelled'); + } + + _onDragEnd(draggable, time, snapback) { + this.inDrag = false; + + // We may not have a parent if DnD completed successfully, in + // which case our clone will shortly be destroyed and replaced + // with a new one on the target workspace. + if (this.actor.get_parent() != null) { + if (this._stackAbove == null) + this.actor.lower_bottom(); + else + this.actor.raise(this._stackAbove); + } + + + this.emit('drag-end'); + } +}; +Signals.addSignalMethods(WindowClone.prototype); + + +/** + * @windowClone: Corresponding window clone + * @parentActor: The actor which will be the parent of all overlay items + * such as the close button and window caption + */ +var WindowOverlay = class { + constructor(windowClone, parentActor) { + let metaWindow = windowClone.metaWindow; + + this._windowClone = windowClone; + this._parentActor = parentActor; + this._hidden = false; + + this._idleHideOverlayId = 0; + + this.borderSize = 0; + this.border = new St.Bin({ style_class: 'window-clone-border' }); + + this.title = new St.Label({ style_class: 'window-caption', + text: this._getCaption() }); + this.title.clutter_text.ellipsize = Pango.EllipsizeMode.END; + windowClone.actor.label_actor = this.title; + + this._maxTitleWidth = -1; + + this._updateCaptionId = metaWindow.connect('notify::title', w => { + this.title.text = this._getCaption(); + this.relayout(false); + }); + + this.closeButton = new St.Button({ style_class: 'window-close' }); + this.closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); + this.closeButton._overlap = 0; + + this.closeButton.connect('clicked', () => this._windowClone.deleteAll()); + + windowClone.actor.connect('destroy', this._onDestroy.bind(this)); + windowClone.connect('show-chrome', this._onShowChrome.bind(this)); + windowClone.connect('hide-chrome', this._onHideChrome.bind(this)); + + this.title.hide(); + this.closeButton.hide(); + + // Don't block drop targets + Shell.util_set_hidden_from_pick(this.title, true); + Shell.util_set_hidden_from_pick(this.border, true); + + parentActor.add_actor(this.border); + parentActor.add_actor(this.title); + parentActor.add_actor(this.closeButton); + this.title.connect('style-changed', + this._onStyleChanged.bind(this)); + this.closeButton.connect('style-changed', + this._onStyleChanged.bind(this)); + this.border.connect('style-changed', + this._onStyleChanged.bind(this)); + + // Force a style change if we are already on a stage - otherwise + // the signal will be emitted normally when we are added + if (parentActor.get_stage()) + this._onStyleChanged(); + } + + hide() { + this._hidden = true; + + this.hideOverlay(); + } + + show() { + this._hidden = false; + + if (this._windowClone.actor['has-pointer']) + this._animateVisible(); + } + + chromeHeights() { + return [Math.max(this.borderSize, this.closeButton.height - this.closeButton._overlap), + (this.title.height - this.borderSize) / 2]; + } + + chromeWidths() { + return [this.borderSize, + Math.max(this.borderSize, this.closeButton.width - this.closeButton._overlap)]; + } + + setMaxChromeWidth(max) { + if (this._maxTitleWidth == max) + return; + + this._maxTitleWidth = max; + } + + relayout(animate) { + let button = this.closeButton; + let title = this.title; + let border = this.border; + + Tweener.removeTweens(button); + Tweener.removeTweens(border); + Tweener.removeTweens(title); + + let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot; + + let layout = Meta.prefs_get_button_layout(); + let side = layout.left_buttons.indexOf(Meta.ButtonFunction.CLOSE) > -1 ? St.Side.LEFT : St.Side.RIGHT; + + let buttonX; + let buttonY = cloneY - (button.height - button._overlap); + if (side == St.Side.LEFT) + buttonX = cloneX - (button.width - button._overlap); + else + buttonX = cloneX + (cloneWidth - button._overlap); + + if (animate) + this._animateOverlayActor(button, Math.floor(buttonX), Math.floor(buttonY), button.width); + else + button.set_position(Math.floor(buttonX), Math.floor(buttonY)); + + // Clutter.Actor.get_preferred_width() will return the fixed width if + // one is set, so we need to reset the width by calling set_width(-1), + // to forward the call down to StLabel. + // We also need to save and restore the current width, otherwise the + // animation starts from the wrong point. + let prevTitleWidth = title.width; + title.set_width(-1); + + let [titleMinWidth, titleNatWidth] = title.get_preferred_width(-1); + let titleWidth = Math.max(titleMinWidth, + Math.min(titleNatWidth, this._maxTitleWidth)); + title.width = prevTitleWidth; + + let titleX = cloneX + (cloneWidth - titleWidth) / 2; + let titleY = cloneY + cloneHeight - (title.height - this.borderSize) / 2; + + if (animate) { + this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY), titleWidth); + } else { + title.width = titleWidth; + title.set_position(Math.floor(titleX), Math.floor(titleY)); + } + + let borderX = cloneX - this.borderSize; + let borderY = cloneY - this.borderSize; + let borderWidth = cloneWidth + 2 * this.borderSize; + let borderHeight = cloneHeight + 2 * this.borderSize; + + if (animate) { + this._animateOverlayActor(this.border, borderX, borderY, + borderWidth, borderHeight); + } else { + this.border.set_position(borderX, borderY); + this.border.set_size(borderWidth, borderHeight); + } + } + + _getCaption() { + let metaWindow = this._windowClone.metaWindow; + if (metaWindow.title) + return metaWindow.title; + + let tracker = Shell.WindowTracker.get_default(); + let app = tracker.get_window_app(metaWindow); + return app.get_name(); + } + + _animateOverlayActor(actor, x, y, width, height) { + let params = { x: x, + y: y, + width: width, + time: Overview.ANIMATION_TIME, + transition: 'easeOutQuad' }; + + if (height !== undefined) + params.height = height; + + Tweener.addTween(actor, params); + } + + _windowCanClose() { + return this._windowClone.metaWindow.can_close() && + !this._windowClone.hasAttachedDialogs(); + } + + _onDestroy() { + if (this._idleHideOverlayId > 0) { + Mainloop.source_remove(this._idleHideOverlayId); + this._idleHideOverlayId = 0; + } + this._windowClone.metaWindow.disconnect(this._updateCaptionId); + this.title.destroy(); + this.closeButton.destroy(); + this.border.destroy(); + } + + _animateVisible() { + this._parentActor.raise_top(); + + let toAnimate = [this.border, this.title]; + if (this._windowCanClose()) + toAnimate.push(this.closeButton); + + toAnimate.forEach(a => { + a.show(); + a.opacity = 0; + Tweener.addTween(a, + { opacity: 255, + time: WINDOW_OVERLAY_FADE_TIME, + transition: 'easeOutQuad' }); + }); + } + + _animateInvisible() { + [this.closeButton, this.border, this.title].forEach(a => { + a.opacity = 255; + Tweener.addTween(a, + { opacity: 0, + time: WINDOW_OVERLAY_FADE_TIME, + transition: 'easeInQuad' }); + }); + } + + _onShowChrome() { + // We might get enter events on the clone while the overlay is + // hidden, e.g. during animations, we ignore these events, + // as the close button will be shown as needed when the overlays + // are shown again + if (this._hidden) + return; + + this._animateVisible(); + this.emit('chrome-visible'); + } + + _onHideChrome() { + if (this._idleHideOverlayId == 0) { + this._idleHideOverlayId = Mainloop.timeout_add(WINDOW_OVERLAY_IDLE_HIDE_TIMEOUT, this._idleHideOverlay.bind(this)); + GLib.Source.set_name_by_id(this._idleHideOverlayId, '[gnome-shell] this._idleHideOverlay'); + } + } + + _idleHideOverlay() { + this._idleHideOverlayId = 0; + + if (!this._windowClone.actor['has-pointer'] && + !this.closeButton['has-pointer']) + this._animateInvisible(); + + return GLib.SOURCE_REMOVE; + } + + hideOverlay() { + if (this._idleHideOverlayId > 0) { + Mainloop.source_remove(this._idleHideOverlayId); + this._idleHideOverlayId = 0; + } + this.closeButton.hide(); + this.border.hide(); + this.title.hide(); + } + + _onStyleChanged() { + let closeNode = this.closeButton.get_theme_node(); + this.closeButton._overlap = closeNode.get_length('-shell-close-overlap'); + + let borderNode = this.border.get_theme_node(); + this.borderSize = borderNode.get_border_width(St.Side.TOP); + + this._parentActor.queue_relayout(); + } +}; +Signals.addSignalMethods(WindowOverlay.prototype); + +var WindowPositionFlags = { + NONE: 0, + INITIAL: 1 << 0, + ANIMATE: 1 << 1 +}; + +// Window Thumbnail Layout Algorithm +// ================================= +// +// General overview +// ---------------- +// +// The window thumbnail layout algorithm calculates some optimal layout +// by computing layouts with some number of rows, calculating how good +// each layout is, and stopping iterating when it finds one that is worse +// than the previous layout. A layout consists of which windows are in +// which rows, row sizes and other general state tracking that would make +// calculating window positions from this information fairly easy. +// +// We don't compute some global order of windows right now for optimal +// travel when animating into the overview; windows are assumed to be +// in some stable order. +// +// After a layout is computed that's considered the best layout, we +// compute the layout scale to fit it in the area, and then compute +// slots (sizes and positions) for each thumbnail. +// +// Layout generation +// ----------------- +// +// Layout generation is naive and simple: we simply add windows to a row +// until we've added too many windows to a row, and then make a new row, +// until we have our required N rows. The potential issue with this strategy +// is that we may have too many windows at the bottom in some pathological +// cases, which tends to make the thumbnails have the shape of a pile of +// sand with a peak, with one window at the top. +// +// Scaling factors +// --------------- +// +// Thumbnail position is mostly straightforward -- the main issue is +// computing an optimal scale for each window that fits the constraints, +// and doesn't make the thumbnail too small to see. There are two factors +// involved in thumbnail scale to make sure that these two goals are met: +// the window scale (calculated by _computeWindowScale) and the layout +// scale (calculated by computeSizeAndScale). +// +// The calculation logic becomes slightly more complicated because row +// and column spacing are not scaled, they're constant, so we can't +// simply generate a bunch of window positions and then scale it. In +// practice, it's not too bad -- we can simply try to fit the layout +// in the input area minus whatever spacing we have, and then add +// it back afterwards. +// +// The window scale is constant for the window's size regardless of the +// input area or the layout scale or rows or anything else, and right +// now just enlarges the window if it's too small. The fact that this +// factor is stable makes it easy to calculate, so there's no sense +// in not applying it in most calculations. +// +// The layout scale depends on the input area, the rows, etc, but is the +// same for the entire layout, rather than being per-window. After +// generating the rows of windows, we basically do some basic math to +// fit the full, unscaled layout to the input area, as described above. +// +// With these two factors combined, the final scale of each thumbnail is +// simply windowScale * layoutScale... almost. +// +// There's one additional constraint: the thumbnail scale must never be +// larger than WINDOW_CLONE_MAXIMUM_SCALE, which means that the inequality: +// +// windowScale * layoutScale <= WINDOW_CLONE_MAXIMUM_SCALE +// +// must always be true. This is for each individual window -- while we +// could adjust layoutScale to make the largest thumbnail smaller than +// WINDOW_CLONE_MAXIMUM_SCALE, it would shrink windows which are already +// under the inequality. To solve this, we simply cheat: we simply keep +// each window's "cell" area to be the same, but we shrink the thumbnail +// and center it horizontally, and align it to the bottom vertically. + +var LayoutStrategy = class { + constructor(monitor, rowSpacing, columnSpacing) { + if (new.target === LayoutStrategy) + throw new TypeError('Cannot instantiate abstract type ' + new.target.name); + + this._monitor = monitor; + this._rowSpacing = rowSpacing; + this._columnSpacing = columnSpacing; + } + + _newRow() { + // Row properties: + // + // * x, y are the position of row, relative to area + // + // * width, height are the scaled versions of fullWidth, fullHeight + // + // * width also has the spacing in between windows. It's not in + // fullWidth, as the spacing is constant, whereas fullWidth is + // meant to be scaled + // + // * neither height/fullHeight have any sort of spacing or padding + return { x: 0, y: 0, + width: 0, height: 0, + fullWidth: 0, fullHeight: 0, + windows: [] }; + } + + // Computes and returns an individual scaling factor for @window, + // to be applied in addition to the overal layout scale. + _computeWindowScale(window) { + // Since we align windows next to each other, the height of the + // thumbnails is much more important to preserve than the width of + // them, so two windows with equal height, but maybe differering + // widths line up. + let ratio = window.height / this._monitor.height; + + // The purpose of this manipulation here is to prevent windows + // from getting too small. For something like a calculator window, + // we need to bump up the size just a bit to make sure it looks + // good. We'll use a multiplier of 1.5 for this. + + // Map from [0, 1] to [1.5, 1] + return _interpolate(1.5, 1, ratio); + } + + // Compute the size of each row, by assigning to the properties + // row.width, row.height, row.fullWidth, row.fullHeight, and + // (optionally) for each row in @layout.rows. This method is + // intended to be called by subclasses. + _computeRowSizes(layout) { + throw new Error('_computeRowSizes not implemented'); + } + + // Compute strategy-specific window slots for each window in + // @windows, given the @layout. The strategy may also use @layout + // as strategy-specific storage. + // + // This must calculate: + // * maxColumns - The maximum number of columns used by the layout. + // * gridWidth - The total width used by the grid, unscaled, unspaced. + // * gridHeight - The totial height used by the grid, unscaled, unspaced. + // * rows - A list of rows, which should be instantiated by _newRow. + computeLayout(windows, layout) { + throw new Error('computeLayout not implemented'); + } + + // Given @layout, compute the overall scale and space of the layout. + // The scale is the individual, non-fancy scale of each window, and + // the space is the percentage of the available area eventually + // used by the layout. + + // This method does not return anything, but instead installs + // the properties "scale" and "space" on @layout directly. + // + // Make sure to call this methods before calling computeWindowSlots(), + // as it depends on the scale property installed in @layout here. + computeScaleAndSpace(layout) { + let area = layout.area; + + let hspacing = (layout.maxColumns - 1) * this._columnSpacing; + let vspacing = (layout.numRows - 1) * this._rowSpacing; + + let spacedWidth = area.width - hspacing; + let spacedHeight = area.height - vspacing; + + let horizontalScale = spacedWidth / layout.gridWidth; + let verticalScale = spacedHeight / layout.gridHeight; + + // Thumbnails should be less than 70% of the original size + let scale = Math.min(horizontalScale, verticalScale, WINDOW_CLONE_MAXIMUM_SCALE); + + let scaledLayoutWidth = layout.gridWidth * scale + hspacing; + let scaledLayoutHeight = layout.gridHeight * scale + vspacing; + let space = (scaledLayoutWidth * scaledLayoutHeight) / (area.width * area.height); + + layout.scale = scale; + layout.space = space; + } + + computeWindowSlots(layout, area) { + this._computeRowSizes(layout); + + let { rows: rows, scale: scale } = layout; + + let slots = []; + + // Do this in three parts. + let heightWithoutSpacing = 0; + for (let i = 0; i < rows.length; i++) { + let row = rows[i]; + heightWithoutSpacing += row.height; + } + + let verticalSpacing = (rows.length - 1) * this._rowSpacing; + let additionalVerticalScale = Math.min(1, (area.height - verticalSpacing) / heightWithoutSpacing); + + // keep track how much smaller the grid becomes due to scaling + // so it can be centered again + let compensation = 0 + let y = 0; + + for (let i = 0; i < rows.length; i++) { + let row = rows[i]; + + // If this window layout row doesn't fit in the actual + // geometry, then apply an additional scale to it. + let horizontalSpacing = (row.windows.length - 1) * this._columnSpacing; + let widthWithoutSpacing = row.width - horizontalSpacing; + let additionalHorizontalScale = Math.min(1, (area.width - horizontalSpacing) / widthWithoutSpacing); + + if (additionalHorizontalScale < additionalVerticalScale) { + row.additionalScale = additionalHorizontalScale; + // Only consider the scaling in addition to the vertical scaling for centering. + compensation += (additionalVerticalScale - additionalHorizontalScale) * row.height; + } else { + row.additionalScale = additionalVerticalScale; + // No compensation when scaling vertically since centering based on a too large + // height would undo what vertical scaling is trying to achieve. + } + + row.x = area.x + (Math.max(area.width - (widthWithoutSpacing * row.additionalScale + horizontalSpacing), 0) / 2) + row.y = area.y + (Math.max(area.height - (heightWithoutSpacing + verticalSpacing), 0) / 2) + y; + y += row.height * row.additionalScale + this._rowSpacing; + } + + compensation = compensation / 2; + + for (let i = 0; i < rows.length; i++) { + let row = rows[i]; + let x = row.x; + for (let j = 0; j < row.windows.length; j++) { + let window = row.windows[j]; + + let s = scale * this._computeWindowScale(window) * row.additionalScale; + let cellWidth = window.width * s; + let cellHeight = window.height * s; + + s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE); + let cloneWidth = window.width * s; + + let cloneX = x + (cellWidth - cloneWidth) / 2; + let cloneY = row.y + row.height * row.additionalScale - cellHeight + compensation; + + // Align with the pixel grid to prevent blurry windows at scale = 1 + cloneX = Math.floor(cloneX); + cloneY = Math.floor(cloneY); + + slots.push([cloneX, cloneY, s, window]); + x += cellWidth + this._columnSpacing; + } + } + return slots; + } +}; + +var UnalignedLayoutStrategy = class extends LayoutStrategy { + _computeRowSizes(layout) { + let { rows: rows, scale: scale } = layout; + for (let i = 0; i < rows.length; i++) { + let row = rows[i]; + row.width = row.fullWidth * scale + (row.windows.length - 1) * this._columnSpacing; + row.height = row.fullHeight * scale; + } + } + + _keepSameRow(row, window, width, idealRowWidth) { + if (row.fullWidth + width <= idealRowWidth) + return true; + + let oldRatio = row.fullWidth / idealRowWidth; + let newRatio = (row.fullWidth + width) / idealRowWidth; + + if (Math.abs(1 - newRatio) < Math.abs(1 - oldRatio)) + return true; + + return false; + } + + _sortRow(row) { + // Sort windows horizontally to minimize travel distance + row.windows.sort((a, b) => a.realWindow.x - b.realWindow.x); + } + + computeLayout(windows, layout) { + let numRows = layout.numRows; + + let rows = []; + let totalWidth = 0; + for (let i = 0; i < windows.length; i++) { + let window = windows[i]; + let s = this._computeWindowScale(window); + totalWidth += window.width * s; + } + + let idealRowWidth = totalWidth / numRows; + let windowIdx = 0; + for (let i = 0; i < numRows; i++) { + let col = 0; + let row = this._newRow(); + rows.push(row); + + for (; windowIdx < windows.length; windowIdx++) { + let window = windows[windowIdx]; + let s = this._computeWindowScale(window); + let width = window.width * s; + let height = window.height * s; + row.fullHeight = Math.max(row.fullHeight, height); + + // either new width is < idealWidth or new width is nearer from idealWidth then oldWidth + if (this._keepSameRow(row, window, width, idealRowWidth) || (i == numRows - 1)) { + row.windows.push(window); + row.fullWidth += width; + } else { + break; + } + } + } + + let gridHeight = 0; + let maxRow; + for (let i = 0; i < numRows; i++) { + let row = rows[i]; + this._sortRow(row); + + if (!maxRow || row.fullWidth > maxRow.fullWidth) + maxRow = row; + gridHeight += row.fullHeight; + } + + layout.rows = rows; + layout.maxColumns = maxRow.windows.length; + layout.gridWidth = maxRow.fullWidth; + layout.gridHeight = gridHeight; + } +}; + +function padArea(area, padding) { + return { + x: area.x + padding.left, + y: area.y + padding.top, + width: area.width - padding.left - padding.right, + height: area.height - padding.top - padding.bottom, + }; +} + +function rectEqual(one, two) { + if (one == two) + return true; + + if (!one || !two) + return false; + + return (one.x == two.x && + one.y == two.y && + one.width == two.width && + one.height == two.height); +} + +const WorkspaceActor = GObject.registerClass( +class WorkspaceActor extends St.Widget { + vfunc_get_focus_chain() { + return this.get_children().filter(c => c.visible).sort((a,b) => { + let cloneA = (a._delegate && a._delegate instanceof WindowClone) ? a._delegate: null; + let cloneB = (b._delegate && b._delegate instanceof WindowClone) ? b._delegate: null; + if (cloneA && cloneB) + return cloneA.slotId - cloneB.slotId; + + return 0; + }); + } +}); + +/** + * @metaWorkspace: a #Meta.Workspace, or null + */ +var Workspace = class { + constructor(metaWorkspace, monitorIndex) { + // When dragging a window, we use this slot for reserve space. + this._reservedSlot = null; + this._reservedSlotWindow = null; + this.metaWorkspace = metaWorkspace; + + // The full geometry is the geometry we should try and position + // windows for. The actual geometry we allocate may be less than + // this, like if the workspace switcher is slid out. + this._fullGeometry = null; + + // The actual geometry is the geometry we need to arrange windows + // in. If this is a smaller area than the full geometry, we'll + // do some simple aspect ratio like math to fit the layout calculated + // for the full geometry into this area. + this._actualGeometry = null; + this._actualGeometryLater = 0; + + this._currentLayout = null; + + this.monitorIndex = monitorIndex; + this._monitor = Main.layoutManager.monitors[this.monitorIndex]; + this._windowOverlaysGroup = new Clutter.Actor(); + // Without this the drop area will be overlapped. + this._windowOverlaysGroup.set_size(0, 0); + + this.actor = new WorkspaceActor({ style_class: 'window-picker' }); + if (monitorIndex != Main.layoutManager.primaryIndex) + this.actor.add_style_class_name('external-monitor'); + this.actor.set_size(0, 0); + + this._dropRect = new Clutter.Actor({ opacity: 0 }); + this._dropRect._delegate = this; + + this.actor.add_actor(this._dropRect); + this.actor.add_actor(this._windowOverlaysGroup); + + this.actor.connect('destroy', this._onDestroy.bind(this)); + + let windows = global.get_window_actors().filter(this._isMyWindow, this); + + // Create clones for windows that should be + // visible in the Overview + this._windows = []; + this._windowOverlays = []; + for (let i = 0; i < windows.length; i++) { + if (this._isOverviewWindow(windows[i])) + this._addWindowClone(windows[i], true); + } + + // Track window changes + if (this.metaWorkspace) { + this._windowAddedId = this.metaWorkspace.connect('window-added', + this._windowAdded.bind(this)); + this._windowRemovedId = this.metaWorkspace.connect('window-removed', + this._windowRemoved.bind(this)); + } + this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', + this._windowEnteredMonitor.bind(this)); + this._windowLeftMonitorId = global.display.connect('window-left-monitor', + this._windowLeftMonitor.bind(this)); + this._repositionWindowsId = 0; + + this.leavingOverview = false; + + this._positionWindowsFlags = 0; + this._positionWindowsId = 0; + + this.actor.connect('notify::mapped', () => { + if (this.actor.mapped) + this._syncActualGeometry(); + }); + } + + setFullGeometry(geom) { + if (rectEqual(this._fullGeometry, geom)) + return; + + this._fullGeometry = geom; + + if (this.actor.mapped) + this._recalculateWindowPositions(WindowPositionFlags.NONE); + } + + setActualGeometry(geom) { + if (rectEqual(this._actualGeometry, geom)) + return; + + this._actualGeometry = geom; + this._actualGeometryDirty = true; + + if (this.actor.mapped) + this._syncActualGeometry(); + } + + _syncActualGeometry() { + if (this._actualGeometryLater || !this._actualGeometryDirty) + return; + if (!this._actualGeometry) + return; + + this._actualGeometryLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._actualGeometryLater = 0; + if (!this.actor.mapped) + return false; + + let geom = this._actualGeometry; + + this._dropRect.set_position(geom.x, geom.y); + this._dropRect.set_size(geom.width, geom.height); + this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE); + + return false; + }); + } + + _lookupIndex(metaWindow) { + return this._windows.findIndex(w => w.metaWindow == metaWindow); + } + + containsMetaWindow(metaWindow) { + return this._lookupIndex(metaWindow) >= 0; + } + + isEmpty() { + return this._windows.length == 0; + } + + setReservedSlot(metaWindow) { + if (this._reservedSlotWindow == metaWindow) + return; + + if (!metaWindow || this.containsMetaWindow(metaWindow)) { + this._reservedSlotWindow = null; + this._reservedSlot = null; + } else { + this._reservedSlotWindow = metaWindow; + this._reservedSlot = this._windows[this._lookupIndex(metaWindow)]; + } + + this._recalculateWindowPositions(WindowPositionFlags.ANIMATE); + } + + _recalculateWindowPositions(flags) { + this._positionWindowsFlags |= flags; + + if (this._positionWindowsId > 0) + return; + + this._positionWindowsId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._realRecalculateWindowPositions(this._positionWindowsFlags); + this._positionWindowsFlags = 0; + this._positionWindowsId = 0; + return false; + }); + } + + _realRecalculateWindowPositions(flags) { + if (this._repositionWindowsId > 0) { + Mainloop.source_remove(this._repositionWindowsId); + this._repositionWindowsId = 0; + } + + let clones = this._windows.slice(); + if (clones.length == 0) + return; + + clones.sort((a, b) => { + return a.metaWindow.get_stable_sequence() - b.metaWindow.get_stable_sequence(); + }); + + if (this._reservedSlot) + clones.push(this._reservedSlot); + + this._currentLayout = this._computeLayout(clones); + this._updateWindowPositions(flags); + } + + _updateWindowPositions(flags) { + if (this._currentLayout == null) { + this._recalculateWindowPositions(flags); + return; + } + + // We will reposition windows anyway when enter again overview or when ending the windows + // animations whith fade animation. + // In this way we avoid unwanted animations of windows repositioning while + // animating overview. + if (this.leavingOverview || this._animatingWindowsFade) + return; + + let initialPositioning = flags & WindowPositionFlags.INITIAL; + let animate = flags & WindowPositionFlags.ANIMATE; + + let layout = this._currentLayout; + let strategy = layout.strategy; + + let [, , padding] = this._getSpacingAndPadding(); + let area = padArea(this._actualGeometry, padding); + let slots = strategy.computeWindowSlots(layout, area); + + let workspaceManager = global.workspace_manager; + let currentWorkspace = workspaceManager.get_active_workspace(); + let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace; + + for (let i = 0; i < slots.length; i++) { + let slot = slots[i]; + let [x, y, scale, clone] = slot; + + clone.slotId = i; + + // Positioning a window currently being dragged must be avoided; + // we'll just leave a blank spot in the layout for it. + if (clone.inDrag) + continue; + + let cloneWidth = clone.actor.width * scale; + let cloneHeight = clone.actor.height * scale; + clone.slot = [x, y, cloneWidth, cloneHeight]; + + let cloneCenter = x + cloneWidth / 2; + let maxChromeWidth = 2 * Math.min( + cloneCenter - area.x, + area.x + area.width - cloneCenter); + clone.overlay.setMaxChromeWidth(Math.round(maxChromeWidth)); + + if (clone.overlay && (initialPositioning || !clone.positioned)) + clone.overlay.hide(); + + if (!clone.positioned) { + // This window appeared after the overview was already up + // Grow the clone from the center of the slot + clone.actor.x = x + cloneWidth / 2; + clone.actor.y = y + cloneHeight / 2; + clone.actor.scale_x = 0; + clone.actor.scale_y = 0; + clone.positioned = true; + } + + if (animate && isOnCurrentWorkspace) { + if (!clone.metaWindow.showing_on_its_workspace()) { + /* Hidden windows should fade in and grow + * therefore we need to resize them now so they + * can be scaled up later */ + if (initialPositioning) { + clone.actor.opacity = 0; + clone.actor.scale_x = 0; + clone.actor.scale_y = 0; + clone.actor.x = x; + clone.actor.y = y; + } + + Tweener.addTween(clone.actor, + { opacity: 255, + time: Overview.ANIMATION_TIME, + transition: 'easeInQuad' + }); + } + + this._animateClone(clone, clone.overlay, x, y, scale); + } else { + // cancel any active tweens (otherwise they might override our changes) + Tweener.removeTweens(clone.actor); + clone.actor.set_position(x, y); + clone.actor.set_scale(scale, scale); + clone.actor.set_opacity(255); + clone.overlay.relayout(false); + this._showWindowOverlay(clone, clone.overlay); + } + } + } + + syncStacking(stackIndices) { + let clones = this._windows.slice(); + clones.sort((a, b) => { + let indexA = stackIndices[a.metaWindow.get_stable_sequence()]; + let indexB = stackIndices[b.metaWindow.get_stable_sequence()]; + return indexA - indexB; + }); + + for (let i = 0; i < clones.length; i++) { + let clone = clones[i]; + let metaWindow = clone.metaWindow; + if (i == 0) { + clone.setStackAbove(this._dropRect); + } else { + let previousClone = clones[i - 1]; + clone.setStackAbove(previousClone.actor); + } + } + } + + _animateClone(clone, overlay, x, y, scale) { + Tweener.addTween(clone.actor, + { x: x, + y: y, + scale_x: scale, + scale_y: scale, + time: Overview.ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this._showWindowOverlay(clone, overlay); + } + }); + + clone.overlay.relayout(true); + } + + _showWindowOverlay(clone, overlay) { + if (clone.inDrag) + return; + + if (overlay && overlay._hidden) + overlay.show(); + } + + _delayedWindowRepositioning() { + let [x, y, mask] = global.get_pointer(); + + let pointerHasMoved = (this._cursorX != x && this._cursorY != y); + let inWorkspace = (this._fullGeometry.x < x && x < this._fullGeometry.x + this._fullGeometry.width && + this._fullGeometry.y < y && y < this._fullGeometry.y + this._fullGeometry.height); + + if (pointerHasMoved && inWorkspace) { + // store current cursor position + this._cursorX = x; + this._cursorY = y; + return GLib.SOURCE_CONTINUE; + } + + let actorUnderPointer = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); + for (let i = 0; i < this._windows.length; i++) { + if (this._windows[i].actor == actorUnderPointer) + return GLib.SOURCE_CONTINUE; + } + + this._recalculateWindowPositions(WindowPositionFlags.ANIMATE); + this._repositionWindowsId = 0; + return GLib.SOURCE_REMOVE; + } + + _doRemoveWindow(metaWin) { + let win = metaWin.get_compositor_private(); + + let clone = this._removeWindowClone(metaWin); + + if (clone) { + // If metaWin.get_compositor_private() returned non-NULL, that + // means the window still exists (and is just being moved to + // another workspace or something), so set its overviewHint + // accordingly. (If it returned NULL, then the window is being + // destroyed; we'd like to animate this, but it's too late at + // this point.) + if (win) { + let [stageX, stageY] = clone.actor.get_transformed_position(); + let [stageWidth, stageHeight] = clone.actor.get_transformed_size(); + win._overviewHint = { + x: stageX, + y: stageY, + scale: stageWidth / clone.actor.width + }; + } + clone.destroy(); + } + + // We need to reposition the windows; to avoid shuffling windows + // around while the user is interacting with the workspace, we delay + // the positioning until the pointer remains still for at least 750 ms + // or is moved outside the workspace + + // remove old handler + if (this._repositionWindowsId > 0) { + Mainloop.source_remove(this._repositionWindowsId); + this._repositionWindowsId = 0; + } + + // setup new handler + let [x, y, mask] = global.get_pointer(); + this._cursorX = x; + this._cursorY = y; + + this._currentLayout = null; + this._repositionWindowsId = Mainloop.timeout_add(WINDOW_REPOSITIONING_DELAY, + this._delayedWindowRepositioning.bind(this)); + GLib.Source.set_name_by_id(this._repositionWindowsId, '[gnome-shell] this._delayedWindowRepositioning'); + } + + _doAddWindow(metaWin) { + if (this.leavingOverview) + return; + + let win = metaWin.get_compositor_private(); + + if (!win) { + // Newly-created windows are added to a workspace before + // the compositor finds out about them... + let id = Mainloop.idle_add(() => { + if (this.actor && + metaWin.get_compositor_private() && + metaWin.get_workspace() == this.metaWorkspace) + this._doAddWindow(metaWin); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] this._doAddWindow'); + return; + } + + // We might have the window in our list already if it was on all workspaces and + // now was moved to this workspace + if (this._lookupIndex(metaWin) != -1) + return; + + if (!this._isMyWindow(win)) + return; + + if (!this._isOverviewWindow(win)) { + if (metaWin.get_transient_for() == null) + return; + + // Let the top-most ancestor handle all transients + let parent = metaWin.find_root_ancestor(); + let clone = this._windows.find(c => c.metaWindow == parent); + + // If no clone was found, the parent hasn't been created yet + // and will take care of the dialog when added + if (clone) + clone.addDialog(metaWin); + + return; + } + + let [clone, overlay] = this._addWindowClone(win, false); + + if (win._overviewHint) { + let x = win._overviewHint.x - this.actor.x; + let y = win._overviewHint.y - this.actor.y; + let scale = win._overviewHint.scale; + delete win._overviewHint; + + clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale]; + clone.positioned = true; + + clone.actor.set_position(x, y); + clone.actor.set_scale(scale, scale); + clone.overlay.relayout(false); + } + + this._currentLayout = null; + this._recalculateWindowPositions(WindowPositionFlags.ANIMATE); + } + + _windowAdded(metaWorkspace, metaWin) { + this._doAddWindow(metaWin); + } + + _windowRemoved(metaWorkspace, metaWin) { + this._doRemoveWindow(metaWin); + } + + _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { + if (monitorIndex == this.monitorIndex) { + this._doAddWindow(metaWin); + } + } + + _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { + if (monitorIndex == this.monitorIndex) { + this._doRemoveWindow(metaWin); + } + } + + // check for maximized windows on the workspace + hasMaximizedWindows() { + for (let i = 0; i < this._windows.length; i++) { + let metaWindow = this._windows[i].metaWindow; + if (metaWindow.showing_on_its_workspace() && + metaWindow.maximized_horizontally && + metaWindow.maximized_vertically) + return true; + } + return false; + } + + fadeToOverview() { + // We don't want to reposition windows while animating in this way. + this._animatingWindowsFade = true; + this._overviewShownId = Main.overview.connect('shown', this._doneShowingOverview.bind(this)); + if (this._windows.length == 0) + return; + + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace) + return; + + // Special case maximized windows, since it doesn't make sense + // to animate windows below in the stack + let topMaximizedWindow; + // It is ok to treat the case where there is no maximized + // window as if the bottom-most window was maximized given that + // it won't affect the result of the animation + for (topMaximizedWindow = this._windows.length - 1; topMaximizedWindow > 0; topMaximizedWindow--) { + let metaWindow = this._windows[topMaximizedWindow].metaWindow; + if (metaWindow.maximized_horizontally && metaWindow.maximized_vertically) + break; + } + + let nTimeSlots = Math.min(WINDOW_ANIMATION_MAX_NUMBER_BLENDING + 1, this._windows.length - topMaximizedWindow); + let windowBaseTime = Overview.ANIMATION_TIME / nTimeSlots; + + let topIndex = this._windows.length - 1; + for (let i = 0; i < this._windows.length; i++) { + if (i < topMaximizedWindow) { + // below top-most maximized window, don't animate + let overlay = this._windowOverlays[i]; + if (overlay) + overlay.hide(); + this._windows[i].actor.opacity = 0; + } else { + let fromTop = topIndex - i; + let time; + if (fromTop < nTimeSlots) // animate top-most windows gradually + time = windowBaseTime * (nTimeSlots - fromTop); + else + time = windowBaseTime; + + this._windows[i].actor.opacity = 255; + this._fadeWindow(i, time, 0); + } + } + } + + fadeFromOverview() { + this.leavingOverview = true; + this._overviewHiddenId = Main.overview.connect('hidden', this._doneLeavingOverview.bind(this)); + if (this._windows.length == 0) + return; + + for (let i = 0; i < this._windows.length; i++) { + let clone = this._windows[i]; + Tweener.removeTweens(clone.actor); + } + + if (this._repositionWindowsId > 0) { + Mainloop.source_remove(this._repositionWindowsId); + this._repositionWindowsId = 0; + } + + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace) + return; + + // Special case maximized windows, since it doesn't make sense + // to animate windows below in the stack + let topMaximizedWindow; + // It is ok to treat the case where there is no maximized + // window as if the bottom-most window was maximized given that + // it won't affect the result of the animation + for (topMaximizedWindow = this._windows.length - 1; topMaximizedWindow > 0; topMaximizedWindow--) { + let metaWindow = this._windows[topMaximizedWindow].metaWindow; + if (metaWindow.maximized_horizontally && metaWindow.maximized_vertically) + break; + } + + let nTimeSlots = Math.min(WINDOW_ANIMATION_MAX_NUMBER_BLENDING + 1, this._windows.length - topMaximizedWindow); + let windowBaseTime = Overview.ANIMATION_TIME / nTimeSlots; + + let topIndex = this._windows.length - 1; + for (let i = 0; i < this._windows.length; i++) { + if (i < topMaximizedWindow) { + // below top-most maximized window, don't animate + let overlay = this._windowOverlays[i]; + if (overlay) + overlay.hide(); + this._windows[i].actor.opacity = 0; + } else { + let fromTop = topIndex - i; + let time; + if (fromTop < nTimeSlots) // animate top-most windows gradually + time = windowBaseTime * (fromTop + 1); + else + time = windowBaseTime * nTimeSlots; + + this._windows[i].actor.opacity = 0; + this._fadeWindow(i, time, 255); + } + } + } + + _fadeWindow(index, time, opacity) { + let clone = this._windows[index]; + let overlay = this._windowOverlays[index]; + + if (overlay) + overlay.hide(); + + if (clone.metaWindow.showing_on_its_workspace()) { + let [origX, origY] = clone.getOriginalPosition(); + clone.actor.scale_x = 1; + clone.actor.scale_y = 1; + clone.actor.x = origX; + clone.actor.y = origY; + Tweener.addTween(clone.actor, + { time: time, + opacity: opacity, + transition: 'easeOutQuad' + }); + } else { + // The window is hidden + clone.actor.opacity = 0; + } + } + + zoomToOverview() { + // Position and scale the windows. + this._recalculateWindowPositions(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL); + } + + zoomFromOverview() { + let workspaceManager = global.workspace_manager; + let currentWorkspace = workspaceManager.get_active_workspace(); + + this.leavingOverview = true; + + for (let i = 0; i < this._windows.length; i++) { + let clone = this._windows[i]; + Tweener.removeTweens(clone.actor); + } + + if (this._repositionWindowsId > 0) { + Mainloop.source_remove(this._repositionWindowsId); + this._repositionWindowsId = 0; + } + this._overviewHiddenId = Main.overview.connect('hidden', this._doneLeavingOverview.bind(this)); + + if (this.metaWorkspace != null && this.metaWorkspace != currentWorkspace) + return; + + // Position and scale the windows. + for (let i = 0; i < this._windows.length; i++) + this._zoomWindowFromOverview(i); + } + + _zoomWindowFromOverview(index) { + let clone = this._windows[index]; + let overlay = this._windowOverlays[index]; + + if (overlay) + overlay.hide(); + + if (clone.metaWindow.showing_on_its_workspace()) { + let [origX, origY] = clone.getOriginalPosition(); + Tweener.addTween(clone.actor, + { x: origX, + y: origY, + scale_x: 1.0, + scale_y: 1.0, + time: Overview.ANIMATION_TIME, + opacity: 255, + transition: 'easeOutQuad' + }); + } else { + // The window is hidden, make it shrink and fade it out + Tweener.addTween(clone.actor, + { scale_x: 0, + scale_y: 0, + opacity: 0, + time: Overview.ANIMATION_TIME, + transition: 'easeOutQuad' + }); + } + } + + destroy() { + this.actor.destroy(); + } + + _onDestroy(actor) { + if (this._overviewHiddenId) { + Main.overview.disconnect(this._overviewHiddenId); + this._overviewHiddenId = 0; + } + Tweener.removeTweens(actor); + + if (this.metaWorkspace) { + this.metaWorkspace.disconnect(this._windowAddedId); + this.metaWorkspace.disconnect(this._windowRemovedId); + } + global.display.disconnect(this._windowEnteredMonitorId); + global.display.disconnect(this._windowLeftMonitorId); + + if (this._repositionWindowsId > 0) { + Mainloop.source_remove(this._repositionWindowsId); + this._repositionWindowsId = 0; + } + + if (this._positionWindowsId > 0) { + Meta.later_remove(this._positionWindowsId); + this._positionWindowsId = 0; + } + + if (this._actualGeometryLater > 0) { + Meta.later_remove(this._actualGeometryLater); + this._actualGeometryLater = 0; + } + + this._windows = []; + } + + // Sets this.leavingOverview flag to false. + _doneLeavingOverview() { + this.leavingOverview = false; + } + + _doneShowingOverview() { + this._animatingWindowsFade = false; + this._recalculateWindowPositions(WindowPositionFlags.INITIAL); + } + + // Tests if @actor belongs to this workspaces and monitor + _isMyWindow(actor) { + let win = actor.meta_window; + return (this.metaWorkspace == null || win.located_on_workspace(this.metaWorkspace)) && + (win.get_monitor() == this.monitorIndex); + } + + // Tests if @win should be shown in the Overview + _isOverviewWindow(win) { + return !win.get_meta_window().skip_taskbar; + } + + // Create a clone of a (non-desktop) window and add it to the window list + _addWindowClone(win, positioned) { + let clone = new WindowClone(win, this); + let overlay = new WindowOverlay(clone, this._windowOverlaysGroup); + clone.overlay = overlay; + clone.positioned = positioned; + + clone.connect('selected', + this._onCloneSelected.bind(this)); + clone.connect('drag-begin', () => { + Main.overview.beginWindowDrag(clone.metaWindow); + overlay.hide(); + }); + clone.connect('drag-cancelled', () => { + Main.overview.cancelledWindowDrag(clone.metaWindow); + }); + clone.connect('drag-end', () => { + Main.overview.endWindowDrag(clone.metaWindow); + overlay.show(); + }); + clone.connect('size-changed', () => { + this._recalculateWindowPositions(WindowPositionFlags.NONE); + }); + clone.actor.connect('destroy', () => { + this._removeWindowClone(clone.metaWindow); + }); + + this.actor.add_actor(clone.actor); + + overlay.connect('chrome-visible', () => { + let focus = global.stage.key_focus; + if (focus == null || this.actor.contains(focus)) + clone.actor.grab_key_focus(); + + this._windowOverlays.forEach(o => { + if (o != overlay) + o.hideOverlay(); + }); + }); + + if (this._windows.length == 0) + clone.setStackAbove(null); + else + clone.setStackAbove(this._windows[this._windows.length - 1].actor); + + this._windows.push(clone); + this._windowOverlays.push(overlay); + + return [clone, overlay]; + } + + _removeWindowClone(metaWin) { + // find the position of the window in our list + let index = this._lookupIndex(metaWin); + + if (index == -1) + return null; + + this._windowOverlays.splice(index, 1); + return this._windows.splice(index, 1).pop(); + } + + _isBetterLayout(oldLayout, newLayout) { + if (oldLayout.scale === undefined) + return true; + + let spacePower = (newLayout.space - oldLayout.space) * LAYOUT_SPACE_WEIGHT; + let scalePower = (newLayout.scale - oldLayout.scale) * LAYOUT_SCALE_WEIGHT; + + if (newLayout.scale > oldLayout.scale && newLayout.space > oldLayout.space) { + // Win win -- better scale and better space + return true; + } else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) { + // Keep new layout only if scale gain outweights aspect space loss + return scalePower > spacePower; + } else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) { + // Keep new layout only if aspect space gain outweights scale loss + return spacePower > scalePower; + } else { + // Lose -- worse scale and space + return false; + } + } + + _getBestLayout(windows, area, rowSpacing, columnSpacing) { + // We look for the largest scale that allows us to fit the + // largest row/tallest column on the workspace. + + let lastLayout = {}; + + let strategy = new UnalignedLayoutStrategy(this._monitor, rowSpacing, columnSpacing); + + for (let numRows = 1; ; numRows++) { + let numColumns = Math.ceil(windows.length / numRows); + + // If adding a new row does not change column count just stop + // (for instance: 9 windows, with 3 rows -> 3 columns, 4 rows -> + // 3 columns as well => just use 3 rows then) + if (numColumns == lastLayout.numColumns) + break; + + let layout = { area: area, strategy: strategy, numRows: numRows, numColumns: numColumns }; + strategy.computeLayout(windows, layout); + strategy.computeScaleAndSpace(layout); + + if (!this._isBetterLayout(lastLayout, layout)) + break; + + lastLayout = layout; + } + + return lastLayout; + } + + _getSpacingAndPadding() { + let node = this.actor.get_theme_node(); + + // Window grid spacing + let columnSpacing = node.get_length('-horizontal-spacing'); + let rowSpacing = node.get_length('-vertical-spacing'); + let padding = { + left: node.get_padding(St.Side.LEFT), + top: node.get_padding(St.Side.TOP), + bottom: node.get_padding(St.Side.BOTTOM), + right: node.get_padding(St.Side.RIGHT), + }; + + // All of the overlays have the same chrome sizes, + // so just pick the first one. + let overlay = this._windowOverlays[0]; + let [topBorder, bottomBorder] = overlay.chromeHeights(); + let [leftBorder, rightBorder] = overlay.chromeWidths(); + + rowSpacing += (topBorder + bottomBorder) / 2; + columnSpacing += (rightBorder + leftBorder) / 2; + padding.top += topBorder; + padding.bottom += bottomBorder; + padding.left += leftBorder; + padding.right += rightBorder; + + return [rowSpacing, columnSpacing, padding]; + } + + _computeLayout(windows) { + let [rowSpacing, columnSpacing, padding] = this._getSpacingAndPadding(); + let area = padArea(this._fullGeometry, padding); + return this._getBestLayout(windows, area, rowSpacing, columnSpacing); + } + + _onCloneSelected(clone, time) { + let wsIndex = undefined; + if (this.metaWorkspace) + wsIndex = this.metaWorkspace.index(); + Main.activateWindow(clone.metaWindow, time, wsIndex); + } + + // Draggable target interface + handleDragOver(source, actor, x, y, time) { + if (source.realWindow && !this._isMyWindow(source.realWindow)) + return DND.DragMotionResult.MOVE_DROP; + if (source.shellWorkspaceLaunch) + return DND.DragMotionResult.COPY_DROP; + + return DND.DragMotionResult.CONTINUE; + } + + acceptDrop(source, actor, x, y, time) { + if (source.realWindow) { + let win = source.realWindow; + if (this._isMyWindow(win)) + return false; + + // Set a hint on the Mutter.Window so its initial position + // in the new workspace will be correct + win._overviewHint = { + x: actor.x, + y: actor.y, + scale: actor.scale_x + }; + + let metaWindow = win.get_meta_window(); + + // We need to move the window before changing the workspace, because + // the move itself could cause a workspace change if the window enters + // the primary monitor + if (metaWindow.get_monitor() != this.monitorIndex) + metaWindow.move_to_monitor(this.monitorIndex); + + let workspaceManager = global.workspace_manager; + let index = this.metaWorkspace ? this.metaWorkspace.index() : workspaceManager.get_active_workspace_index(); + metaWindow.change_workspace_by_index(index, false); + return true; + } else if (source.shellWorkspaceLaunch) { + source.shellWorkspaceLaunch({ workspace: this.metaWorkspace ? this.metaWorkspace.index() : -1, + timestamp: time }); + return true; + } + + return false; + } +}; +Signals.addSignalMethods(Workspace.prototype); diff --git a/js/ui/workspaceSwitcherPopup.js b/js/ui/workspaceSwitcherPopup.js new file mode 100644 index 0000000..26404ea --- /dev/null +++ b/js/ui/workspaceSwitcherPopup.js @@ -0,0 +1,183 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, GLib, GObject, Meta, St } = imports.gi; +const Mainloop = imports.mainloop; + +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +var ANIMATION_TIME = 0.1; +var DISPLAY_TIMEOUT = 600; + +var WorkspaceSwitcherPopupList = GObject.registerClass( +class WorkspaceSwitcherPopupList extends St.Widget { + _init() { + super._init({ style_class: 'workspace-switcher' }); + + this._itemSpacing = 0; + this._childHeight = 0; + this._childWidth = 0; + + this.connect('style-changed', () => { + this._itemSpacing = this.get_theme_node().get_length('spacing'); + }); + } + + vfunc_get_preferred_height(forWidth) { + let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); + let themeNode = this.get_theme_node(); + + let availHeight = workArea.height; + availHeight -= themeNode.get_vertical_padding(); + + let height = 0; + for (let child of this.get_children()) { + let [childMinHeight, childNaturalHeight] = child.get_preferred_height(-1); + let [childMinWidth, childNaturalWidth] = child.get_preferred_width(childNaturalHeight); + height += childNaturalHeight * workArea.width / workArea.height; + } + + let workspaceManager = global.workspace_manager; + let spacing = this._itemSpacing * (workspaceManager.n_workspaces - 1); + height += spacing; + height = Math.min(height, availHeight); + + this._childHeight = (height - spacing) / workspaceManager.n_workspaces; + + return themeNode.adjust_preferred_height(height, height); + } + + vfunc_get_preferred_width(forHeight) { + let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); + this._childWidth = Math.round(this._childHeight * workArea.width / workArea.height); + + return [this._childWidth, this._childWidth]; + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let themeNode = this.get_theme_node(); + box = themeNode.get_content_box(box); + + let childBox = new Clutter.ActorBox(); + + let y = box.y1; + let prevChildBoxY2 = box.y1 - this._itemSpacing; + for (let child of this.get_children()) { + childBox.x1 = box.x1; + childBox.x2 = box.x1 + this._childWidth; + childBox.y1 = prevChildBoxY2 + this._itemSpacing; + childBox.y2 = Math.round(y + this._childHeight); + y += this._childHeight + this._itemSpacing; + prevChildBoxY2 = childBox.y2; + child.allocate(childBox, flags); + } + } +}); + +var WorkspaceSwitcherPopup = GObject.registerClass( +class WorkspaceSwitcherPopup extends St.Widget { + _init() { + super._init({ x: 0, + y: 0, + width: global.screen_width, + height: global.screen_height, + style_class: 'workspace-switcher-group' }); + + this.actor = this; + + Main.uiGroup.add_actor(this); + + this._timeoutId = 0; + + this._container = new St.BoxLayout({ style_class: 'workspace-switcher-container' }); + this.add_child(this._container); + + this._list = new WorkspaceSwitcherPopupList(); + this._container.add_child(this._list); + + this._redisplay(); + + this.hide(); + + let workspaceManager = global.workspace_manager; + this._workspaceManagerSignals = []; + this._workspaceManagerSignals.push(workspaceManager.connect('workspace-added', + this._redisplay.bind(this))); + this._workspaceManagerSignals.push(workspaceManager.connect('workspace-removed', + this._redisplay.bind(this))); + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _redisplay() { + let workspaceManager = global.workspace_manager; + + this._list.destroy_all_children(); + + for (let i = 0; i < workspaceManager.n_workspaces; i++) { + let indicator = null; + + if (i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.UP) + indicator = new St.Bin({ style_class: 'ws-switcher-active-up' }); + else if(i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.DOWN) + indicator = new St.Bin({ style_class: 'ws-switcher-active-down' }); + else + indicator = new St.Bin({ style_class: 'ws-switcher-box' }); + + this._list.add_actor(indicator); + + } + + let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); + let [containerMinHeight, containerNatHeight] = this._container.get_preferred_height(global.screen_width); + let [containerMinWidth, containerNatWidth] = this._container.get_preferred_width(containerNatHeight); + this._container.x = workArea.x + Math.floor((workArea.width - containerNatWidth) / 2); + this._container.y = workArea.y + Math.floor((workArea.height - containerNatHeight) / 2); + } + + _show() { + Tweener.addTween(this._container, { opacity: 255, + time: ANIMATION_TIME, + transition: 'easeOutQuad' + }); + this.actor.show(); + } + + display(direction, activeWorkspaceIndex) { + this._direction = direction; + this._activeWorkspaceIndex = activeWorkspaceIndex; + + this._redisplay(); + if (this._timeoutId != 0) + Mainloop.source_remove(this._timeoutId); + this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, this._onTimeout.bind(this)); + GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout'); + this._show(); + } + + _onTimeout() { + Mainloop.source_remove(this._timeoutId); + this._timeoutId = 0; + Tweener.addTween(this._container, { opacity: 0.0, + time: ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete() { this.destroy(); }, + onCompleteScope: this + }); + return GLib.SOURCE_REMOVE; + } + + _onDestroy() { + if (this._timeoutId) + Mainloop.source_remove(this._timeoutId); + this._timeoutId = 0; + + let workspaceManager = global.workspace_manager; + for (let i = 0; i < this._workspaceManagerSignals.length; i++) + workspaceManager.disconnect(this._workspaceManagerSignals[i]); + + this._workspaceManagerSignals = []; + } +}); diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js new file mode 100644 index 0000000..73cf7b4 --- /dev/null +++ b/js/ui/workspaceThumbnail.js @@ -0,0 +1,1331 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Background = imports.ui.background; +const DND = imports.ui.dnd; +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; +const Workspace = imports.ui.workspace; +const WorkspacesView = imports.ui.workspacesView; + +// The maximum size of a thumbnail is 1/10 the width and height of the screen +let MAX_THUMBNAIL_SCALE = 1/10.; + +var RESCALE_ANIMATION_TIME = 0.2; +var SLIDE_ANIMATION_TIME = 0.2; + +// When we create workspaces by dragging, we add a "cut" into the top and +// bottom of each workspace so that the user doesn't have to hit the +// placeholder exactly. +var WORKSPACE_CUT_SIZE = 10; + +var WORKSPACE_KEEP_ALIVE_TIME = 100; + +var MUTTER_SCHEMA = 'org.gnome.mutter'; + +/* A layout manager that requests size only for primary_actor, but then allocates + all using a fixed layout */ +var PrimaryActorLayout = GObject.registerClass( +class PrimaryActorLayout extends Clutter.FixedLayout { + _init(primaryActor) { + super._init(); + + this.primaryActor = primaryActor; + } + + vfunc_get_preferred_width(container, forHeight) { + return this.primaryActor.get_preferred_width(forHeight); + } + + vfunc_get_preferred_height(container, forWidth) { + return this.primaryActor.get_preferred_height(forWidth); + } +}); + +var WindowClone = class { + constructor(realWindow) { + this.clone = new Clutter.Clone({ source: realWindow }); + + /* Can't use a Shell.GenericContainer because of DND and reparenting... */ + this.actor = new Clutter.Actor({ layout_manager: new PrimaryActorLayout(this.clone), + reactive: true }); + this.actor._delegate = this; + this.actor.add_child(this.clone); + this.realWindow = realWindow; + this.metaWindow = realWindow.meta_window; + + this.clone._updateId = this.realWindow.connect('notify::position', + this._onPositionChanged.bind(this)); + this.clone._destroyId = this.realWindow.connect('destroy', () => { + // First destroy the clone and then destroy everything + // This will ensure that we never see it in the _disconnectSignals loop + this.clone.destroy(); + this.destroy(); + }); + this._onPositionChanged(); + + this.actor.connect('button-release-event', + this._onButtonRelease.bind(this)); + this.actor.connect('touch-event', + this._onTouchEvent.bind(this)); + + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._draggable = DND.makeDraggable(this.actor, + { restoreOnSuccess: true, + dragActorMaxSize: Workspace.WINDOW_DND_SIZE, + dragActorOpacity: Workspace.DRAGGING_WINDOW_OPACITY }); + this._draggable.connect('drag-begin', this._onDragBegin.bind(this)); + this._draggable.connect('drag-cancelled', this._onDragCancelled.bind(this)); + this._draggable.connect('drag-end', this._onDragEnd.bind(this)); + this.inDrag = false; + + let iter = win => { + let actor = win.get_compositor_private(); + + if (!actor) + return false; + if (!win.is_attached_dialog()) + return false; + + this._doAddAttachedDialog(win, actor); + win.foreach_transient(iter); + + return true; + }; + this.metaWindow.foreach_transient(iter); + } + + // Find the actor just below us, respecting reparenting done + // by DND code + getActualStackAbove() { + if (this._stackAbove == null) + return null; + + if (this.inDrag) { + if (this._stackAbove._delegate) + return this._stackAbove._delegate.getActualStackAbove(); + else + return null; + } else { + return this._stackAbove; + } + } + + setStackAbove(actor) { + this._stackAbove = actor; + + // Don't apply the new stacking now, it will be applied + // when dragging ends and window are stacked again + if (actor.inDrag) + return; + + let actualAbove = this.getActualStackAbove(); + if (actualAbove == null) + this.actor.lower_bottom(); + else + this.actor.raise(actualAbove); + } + + destroy() { + this.actor.destroy(); + } + + addAttachedDialog(win) { + this._doAddAttachedDialog(win, win.get_compositor_private()); + } + + _doAddAttachedDialog(metaDialog, realDialog) { + let clone = new Clutter.Clone({ source: realDialog }); + this._updateDialogPosition(realDialog, clone); + + clone._updateId = realDialog.connect('notify::position', dialog => { + this._updateDialogPosition(dialog, clone); + }); + clone._destroyId = realDialog.connect('destroy', () => { + clone.destroy(); + }); + this.actor.add_child(clone); + } + + _updateDialogPosition(realDialog, cloneDialog) { + let metaDialog = realDialog.meta_window; + let dialogRect = metaDialog.get_frame_rect(); + let rect = this.metaWindow.get_frame_rect(); + + cloneDialog.set_position(dialogRect.x - rect.x, dialogRect.y - rect.y); + } + + _onPositionChanged() { + this.actor.set_position(this.realWindow.x, this.realWindow.y); + } + + _disconnectSignals() { + this.actor.get_children().forEach(child => { + let realWindow = child.source; + + realWindow.disconnect(child._updateId); + realWindow.disconnect(child._destroyId); + }); + } + + _onDestroy() { + this._disconnectSignals(); + + this.actor._delegate = null; + + if (this.inDrag) { + this.emit('drag-end'); + this.inDrag = false; + } + + this.disconnectAll(); + } + + _onButtonRelease(actor, event) { + this.emit('selected', event.get_time()); + + return Clutter.EVENT_STOP; + } + + _onTouchEvent(actor, event) { + if (event.type() != Clutter.EventType.TOUCH_END || + !global.display.is_pointer_emulating_sequence(event.get_event_sequence())) + return Clutter.EVENT_PROPAGATE; + + this.emit('selected', event.get_time()); + return Clutter.EVENT_STOP; + } + + _onDragBegin(draggable, time) { + this.inDrag = true; + this.emit('drag-begin'); + } + + _onDragCancelled(draggable, time) { + this.emit('drag-cancelled'); + } + + _onDragEnd(draggable, time, snapback) { + this.inDrag = false; + + // We may not have a parent if DnD completed successfully, in + // which case our clone will shortly be destroyed and replaced + // with a new one on the target workspace. + if (this.actor.get_parent() != null) { + if (this._stackAbove == null) + this.actor.lower_bottom(); + else + this.actor.raise(this._stackAbove); + } + + + this.emit('drag-end'); + } +}; +Signals.addSignalMethods(WindowClone.prototype); + + +var ThumbnailState = { + NEW : 0, + ANIMATING_IN : 1, + NORMAL: 2, + REMOVING : 3, + ANIMATING_OUT : 4, + ANIMATED_OUT : 5, + COLLAPSING : 6, + DESTROYED : 7 +}; + +/** + * @metaWorkspace: a #Meta.Workspace + */ +var WorkspaceThumbnail = class { + constructor(metaWorkspace) { + this.metaWorkspace = metaWorkspace; + this.monitorIndex = Main.layoutManager.primaryIndex; + + this._removed = false; + + this.actor = new St.Widget({ clip_to_allocation: true, + style_class: 'workspace-thumbnail' }); + this.actor._delegate = this; + + this._contents = new Clutter.Actor(); + this.actor.add_child(this._contents); + + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._createBackground(); + + let workArea = Main.layoutManager.getWorkAreaForMonitor(this.monitorIndex); + this.setPorthole(workArea.x, workArea.y, workArea.width, workArea.height); + + let windows = global.get_window_actors().filter(actor => { + let win = actor.meta_window; + return win.located_on_workspace(metaWorkspace); + }); + + // Create clones for windows that should be visible in the Overview + this._windows = []; + this._allWindows = []; + this._minimizedChangedIds = []; + for (let i = 0; i < windows.length; i++) { + let minimizedChangedId = + windows[i].meta_window.connect('notify::minimized', + this._updateMinimized.bind(this)); + this._allWindows.push(windows[i].meta_window); + this._minimizedChangedIds.push(minimizedChangedId); + + if (this._isMyWindow(windows[i]) && this._isOverviewWindow(windows[i])) { + this._addWindowClone(windows[i]); + } + } + + // Track window changes + this._windowAddedId = this.metaWorkspace.connect('window-added', + this._windowAdded.bind(this)); + this._windowRemovedId = this.metaWorkspace.connect('window-removed', + this._windowRemoved.bind(this)); + this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', + this._windowEnteredMonitor.bind(this)); + this._windowLeftMonitorId = global.display.connect('window-left-monitor', + this._windowLeftMonitor.bind(this)); + + this.state = ThumbnailState.NORMAL; + this._slidePosition = 0; // Fully slid in + this._collapseFraction = 0; // Not collapsed + } + + _createBackground() { + this._bgManager = new Background.BackgroundManager({ monitorIndex: Main.layoutManager.primaryIndex, + container: this._contents, + vignette: false }); + } + + setPorthole(x, y, width, height) { + this.actor.set_size(width, height); + this._contents.set_position(-x, -y); + } + + _lookupIndex(metaWindow) { + return this._windows.findIndex(w => w.metaWindow == metaWindow); + } + + syncStacking(stackIndices) { + this._windows.sort((a, b) => { + let indexA = stackIndices[a.metaWindow.get_stable_sequence()]; + let indexB = stackIndices[b.metaWindow.get_stable_sequence()]; + return indexA - indexB; + }); + + for (let i = 0; i < this._windows.length; i++) { + let clone = this._windows[i]; + let metaWindow = clone.metaWindow; + if (i == 0) { + clone.setStackAbove(this._bgManager.backgroundActor); + } else { + let previousClone = this._windows[i - 1]; + clone.setStackAbove(previousClone.actor); + } + } + } + + set slidePosition(slidePosition) { + this._slidePosition = slidePosition; + this.actor.queue_relayout(); + } + + get slidePosition() { + return this._slidePosition; + } + + set collapseFraction(collapseFraction) { + this._collapseFraction = collapseFraction; + this.actor.queue_relayout(); + } + + get collapseFraction() { + return this._collapseFraction; + } + + _doRemoveWindow(metaWin) { + let clone = this._removeWindowClone(metaWin); + if (clone) + clone.destroy(); + } + + _doAddWindow(metaWin) { + if (this._removed) + return; + + let win = metaWin.get_compositor_private(); + + if (!win) { + // Newly-created windows are added to a workspace before + // the compositor finds out about them... + let id = Mainloop.idle_add(() => { + if (!this._removed && + metaWin.get_compositor_private() && + metaWin.get_workspace() == this.metaWorkspace) + this._doAddWindow(metaWin); + return GLib.SOURCE_REMOVE; + }); + GLib.Source.set_name_by_id(id, '[gnome-shell] this._doAddWindow'); + return; + } + + if (this._allWindows.indexOf(metaWin) == -1) { + let minimizedChangedId = metaWin.connect('notify::minimized', + this._updateMinimized.bind(this)); + this._allWindows.push(metaWin); + this._minimizedChangedIds.push(minimizedChangedId); + } + + // We might have the window in our list already if it was on all workspaces and + // now was moved to this workspace + if (this._lookupIndex(metaWin) != -1) + return; + + if (!this._isMyWindow(win)) + return; + + if (this._isOverviewWindow(win)) { + this._addWindowClone(win); + } else if (metaWin.is_attached_dialog()) { + let parent = metaWin.get_transient_for(); + while (parent.is_attached_dialog()) + parent = parent.get_transient_for(); + + let idx = this._lookupIndex(parent); + if (idx < 0) { + // parent was not created yet, it will take care + // of the dialog when created + return; + } + + let clone = this._windows[idx]; + clone.addAttachedDialog(metaWin); + } + } + + _windowAdded(metaWorkspace, metaWin) { + this._doAddWindow(metaWin); + } + + _windowRemoved(metaWorkspace, metaWin) { + let index = this._allWindows.indexOf(metaWin); + if (index != -1) { + metaWin.disconnect(this._minimizedChangedIds[index]); + this._allWindows.splice(index, 1); + this._minimizedChangedIds.splice(index, 1); + } + + this._doRemoveWindow(metaWin); + } + + _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { + if (monitorIndex == this.monitorIndex) { + this._doAddWindow(metaWin); + } + } + + _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { + if (monitorIndex == this.monitorIndex) { + this._doRemoveWindow(metaWin); + } + } + + _updateMinimized(metaWin) { + if (metaWin.minimized) + this._doRemoveWindow(metaWin); + else + this._doAddWindow(metaWin); + } + + destroy() { + if (this.actor) + this.actor.destroy(); + } + + workspaceRemoved() { + if (this._removed) + return; + + this._removed = true; + + this.metaWorkspace.disconnect(this._windowAddedId); + this.metaWorkspace.disconnect(this._windowRemovedId); + global.display.disconnect(this._windowEnteredMonitorId); + global.display.disconnect(this._windowLeftMonitorId); + + for (let i = 0; i < this._allWindows.length; i++) + this._allWindows[i].disconnect(this._minimizedChangedIds[i]); + } + + _onDestroy(actor) { + this.workspaceRemoved(); + + if (this._bgManager) { + this._bgManager.destroy(); + this._bgManager = null; + } + + this._windows = []; + this.actor = null; + } + + // Tests if @actor belongs to this workspace and monitor + _isMyWindow(actor) { + let win = actor.meta_window; + return win.located_on_workspace(this.metaWorkspace) && + (win.get_monitor() == this.monitorIndex); + } + + // Tests if @win should be shown in the Overview + _isOverviewWindow(win) { + return !win.get_meta_window().skip_taskbar && + win.get_meta_window().showing_on_its_workspace(); + } + + // Create a clone of a (non-desktop) window and add it to the window list + _addWindowClone(win) { + let clone = new WindowClone(win); + + clone.connect('selected', (clone, time) => { + this.activate(time); + }); + clone.connect('drag-begin', () => { + Main.overview.beginWindowDrag(clone.metaWindow); + }); + clone.connect('drag-cancelled', () => { + Main.overview.cancelledWindowDrag(clone.metaWindow); + }); + clone.connect('drag-end', () => { + Main.overview.endWindowDrag(clone.metaWindow); + }); + clone.actor.connect('destroy', () => { + this._removeWindowClone(clone.metaWindow); + }); + this._contents.add_actor(clone.actor); + + if (this._windows.length == 0) + clone.setStackAbove(this._bgManager.backgroundActor); + else + clone.setStackAbove(this._windows[this._windows.length - 1].actor); + + this._windows.push(clone); + + return clone; + } + + _removeWindowClone(metaWin) { + // find the position of the window in our list + let index = this._lookupIndex(metaWin); + + if (index == -1) + return null; + + return this._windows.splice(index, 1).pop(); + } + + activate(time) { + if (this.state > ThumbnailState.NORMAL) + return; + + // a click on the already current workspace should go back to the main view + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + if (this.metaWorkspace == activeWorkspace) + Main.overview.hide(); + else + this.metaWorkspace.activate(time); + } + + // Draggable target interface used only by ThumbnailsBox + handleDragOverInternal(source, time) { + if (source == Main.xdndHandler) { + this.metaWorkspace.activate(time); + return DND.DragMotionResult.CONTINUE; + } + + if (this.state > ThumbnailState.NORMAL) + return DND.DragMotionResult.CONTINUE; + + if (source.realWindow && !this._isMyWindow(source.realWindow)) + return DND.DragMotionResult.MOVE_DROP; + if (source.shellWorkspaceLaunch) + return DND.DragMotionResult.COPY_DROP; + + return DND.DragMotionResult.CONTINUE; + } + + acceptDropInternal(source, time) { + if (this.state > ThumbnailState.NORMAL) + return false; + + if (source.realWindow) { + let win = source.realWindow; + if (this._isMyWindow(win)) + return false; + + let metaWindow = win.get_meta_window(); + + // We need to move the window before changing the workspace, because + // the move itself could cause a workspace change if the window enters + // the primary monitor + if (metaWindow.get_monitor() != this.monitorIndex) + metaWindow.move_to_monitor(this.monitorIndex); + + metaWindow.change_workspace_by_index(this.metaWorkspace.index(), false); + return true; + } else if (source.shellWorkspaceLaunch) { + source.shellWorkspaceLaunch({ workspace: this.metaWorkspace ? this.metaWorkspace.index() : -1, + timestamp: time }); + return true; + } + + return false; + } +}; +Signals.addSignalMethods(WorkspaceThumbnail.prototype); + + +var ThumbnailsBox = GObject.registerClass( +class ThumbnailsBox extends St.Widget { + _init() { + super._init({ reactive: true, + style_class: 'workspace-thumbnails', + request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT }); + + this.actor = this; + this.actor._delegate = this; + + let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' }); + + // We don't want the indicator to affect drag-and-drop + Shell.util_set_hidden_from_pick(indicator, true); + + this._indicator = indicator; + this.add_actor(indicator); + + // The porthole is the part of the screen we're showing in the thumbnails + this._porthole = { width: global.stage.width, height: global.stage.height, + x: global.stage.x, y: global.stage.y }; + + this._dropWorkspace = -1; + this._dropPlaceholderPos = -1; + this._dropPlaceholder = new St.Bin({ style_class: 'placeholder' }); + this.add_actor(this._dropPlaceholder); + this._spliceIndex = -1; + + this._targetScale = 0; + this._scale = 0; + this._pendingScaleUpdate = false; + this._stateUpdateQueued = false; + this._animatingIndicator = false; + this._indicatorY = 0; // only used when _animatingIndicator is true + + this._stateCounts = {}; + for (let key in ThumbnailState) + this._stateCounts[ThumbnailState[key]] = 0; + + this._thumbnails = []; + + this.connect('button-press-event', () => Clutter.EVENT_STOP); + this.connect('button-release-event', this._onButtonRelease.bind(this)); + this.connect('touch-event', this._onTouchEvent.bind(this)); + + Main.overview.connect('showing', + this._createThumbnails.bind(this)); + Main.overview.connect('hidden', + this._destroyThumbnails.bind(this)); + + Main.overview.connect('item-drag-begin', + this._onDragBegin.bind(this)); + Main.overview.connect('item-drag-end', + this._onDragEnd.bind(this)); + Main.overview.connect('item-drag-cancelled', + this._onDragCancelled.bind(this)); + Main.overview.connect('window-drag-begin', + this._onDragBegin.bind(this)); + Main.overview.connect('window-drag-end', + this._onDragEnd.bind(this)); + Main.overview.connect('window-drag-cancelled', + this._onDragCancelled.bind(this)); + + this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA }); + this._settings.connect('changed::dynamic-workspaces', + this._updateSwitcherVisibility.bind(this)); + + Main.layoutManager.connect('monitors-changed', () => { + this._destroyThumbnails(); + if (Main.overview.visible) + this._createThumbnails(); + }); + + global.display.connect('workareas-changed', + this._updatePorthole.bind(this)); + + this._switchWorkspaceNotifyId = 0; + this._nWorkspacesNotifyId = 0; + this._syncStackingId = 0; + this._workareasChangedId = 0; + } + + _updateSwitcherVisibility() { + let workspaceManager = global.workspace_manager; + + this.visible = + this._settings.get_boolean('dynamic-workspaces') || + workspaceManager.n_workspaces > 1; + } + + _activateThumbnailAtPoint(stageX, stageY, time) { + let [r, x, y] = this.transform_stage_point(stageX, stageY); + + for (let i = 0; i < this._thumbnails.length; i++) { + let thumbnail = this._thumbnails[i] + let [w, h] = thumbnail.actor.get_transformed_size(); + if (y >= thumbnail.actor.y && y <= thumbnail.actor.y + h) { + thumbnail.activate(time); + break; + } + } + } + + _onButtonRelease(actor, event) { + let [stageX, stageY] = event.get_coords(); + this._activateThumbnailAtPoint(stageX, stageY, event.get_time()); + return Clutter.EVENT_STOP; + } + + _onTouchEvent(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_END && + global.display.is_pointer_emulating_sequence(event.get_event_sequence())) { + let [stageX, stageY] = event.get_coords(); + this._activateThumbnailAtPoint(stageX, stageY, event.get_time()); + } + + return Clutter.EVENT_STOP; + } + + _onDragBegin() { + this._dragCancelled = false; + this._dragMonitor = { + dragMotion: this._onDragMotion.bind(this) + }; + DND.addDragMonitor(this._dragMonitor); + } + + _onDragEnd() { + if (this._dragCancelled) + return; + + this._endDrag(); + } + + _onDragCancelled() { + this._dragCancelled = true; + this._endDrag(); + } + + _endDrag() { + this._clearDragPlaceholder(); + DND.removeDragMonitor(this._dragMonitor); + } + + _onDragMotion(dragEvent) { + if (!this.contains(dragEvent.targetActor)) + this._onLeave(); + return DND.DragMotionResult.CONTINUE; + } + + _onLeave() { + this._clearDragPlaceholder(); + } + + _clearDragPlaceholder() { + if (this._dropPlaceholderPos == -1) + return; + + this._dropPlaceholderPos = -1; + this.queue_relayout(); + } + + // Draggable target interface + handleDragOver(source, actor, x, y, time) { + if (!source.realWindow && !source.shellWorkspaceLaunch && source != Main.xdndHandler) + return DND.DragMotionResult.CONTINUE; + + let canCreateWorkspaces = Meta.prefs_get_dynamic_workspaces(); + let spacing = this.get_theme_node().get_length('spacing'); + + this._dropWorkspace = -1; + let placeholderPos = -1; + let targetBase; + if (this._dropPlaceholderPos == 0) + targetBase = this._dropPlaceholder.y; + else + targetBase = this._thumbnails[0].actor.y; + let targetTop = targetBase - spacing - WORKSPACE_CUT_SIZE; + let length = this._thumbnails.length; + for (let i = 0; i < length; i ++) { + // Allow the reorder target to have a 10px "cut" into + // each side of the thumbnail, to make dragging onto the + // placeholder easier + let [w, h] = this._thumbnails[i].actor.get_transformed_size(); + let targetBottom = targetBase + WORKSPACE_CUT_SIZE; + let nextTargetBase = targetBase + h + spacing; + let nextTargetTop = nextTargetBase - spacing - ((i == length - 1) ? 0: WORKSPACE_CUT_SIZE); + + // Expand the target to include the placeholder, if it exists. + if (i == this._dropPlaceholderPos) + targetBottom += this._dropPlaceholder.get_height(); + + if (y > targetTop && y <= targetBottom && source != Main.xdndHandler && canCreateWorkspaces) { + placeholderPos = i; + break; + } else if (y > targetBottom && y <= nextTargetTop) { + this._dropWorkspace = i; + break + } + + targetBase = nextTargetBase; + targetTop = nextTargetTop; + } + + if (this._dropPlaceholderPos != placeholderPos) { + this._dropPlaceholderPos = placeholderPos; + this.queue_relayout(); + } + + if (this._dropWorkspace != -1) + return this._thumbnails[this._dropWorkspace].handleDragOverInternal(source, time); + else if (this._dropPlaceholderPos != -1) + return source.realWindow ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.COPY_DROP; + else + return DND.DragMotionResult.CONTINUE; + } + + acceptDrop(source, actor, x, y, time) { + if (this._dropWorkspace != -1) { + return this._thumbnails[this._dropWorkspace].acceptDropInternal(source, time); + } else if (this._dropPlaceholderPos != -1) { + if (!source.realWindow && !source.shellWorkspaceLaunch) + return false; + + let isWindow = !!source.realWindow; + + let newWorkspaceIndex; + [newWorkspaceIndex, this._dropPlaceholderPos] = [this._dropPlaceholderPos, -1]; + this._spliceIndex = newWorkspaceIndex; + + Main.wm.insertWorkspace(newWorkspaceIndex); + + if (isWindow) { + // Move the window to our monitor first if necessary. + let thumbMonitor = this._thumbnails[newWorkspaceIndex].monitorIndex; + if (source.metaWindow.get_monitor() != thumbMonitor) + source.metaWindow.move_to_monitor(thumbMonitor); + source.metaWindow.change_workspace_by_index(newWorkspaceIndex, true); + } else if (source.shellWorkspaceLaunch) { + source.shellWorkspaceLaunch({ workspace: newWorkspaceIndex, + timestamp: time }); + // This new workspace will be automatically removed if the application fails + // to open its first window within some time, as tracked by Shell.WindowTracker. + // Here, we only add a very brief timeout to avoid the _immediate_ removal of the + // workspace while we wait for the startup sequence to load. + let workspaceManager = global.workspace_manager; + Main.wm.keepWorkspaceAlive(workspaceManager.get_workspace_by_index(newWorkspaceIndex), + WORKSPACE_KEEP_ALIVE_TIME); + } + + // Start the animation on the workspace (which is actually + // an old one which just became empty) + let thumbnail = this._thumbnails[newWorkspaceIndex]; + this._setThumbnailState(thumbnail, ThumbnailState.NEW); + thumbnail.slidePosition = 1; + + this._queueUpdateStates(); + + return true; + } else { + return false; + } + } + + _createThumbnails() { + let workspaceManager = global.workspace_manager; + + this._switchWorkspaceNotifyId = + global.window_manager.connect('switch-workspace', + this._activeWorkspaceChanged.bind(this)); + this._nWorkspacesNotifyId = + workspaceManager.connect('notify::n-workspaces', + this._workspacesChanged.bind(this)); + this._syncStackingId = + Main.overview.connect('windows-restacked', + this._syncStacking.bind(this)); + + this._targetScale = 0; + this._scale = 0; + this._pendingScaleUpdate = false; + this._stateUpdateQueued = false; + + this._stateCounts = {}; + for (let key in ThumbnailState) + this._stateCounts[ThumbnailState[key]] = 0; + + this.addThumbnails(0, workspaceManager.n_workspaces); + + this._updateSwitcherVisibility(); + } + + _destroyThumbnails() { + if (this._thumbnails.length == 0) + return; + + if (this._switchWorkspaceNotifyId > 0) { + global.window_manager.disconnect(this._switchWorkspaceNotifyId); + this._switchWorkspaceNotifyId = 0; + } + if (this._nWorkspacesNotifyId > 0) { + let workspaceManager = global.workspace_manager; + workspaceManager.disconnect(this._nWorkspacesNotifyId); + this._nWorkspacesNotifyId = 0; + } + + if (this._syncStackingId > 0) { + Main.overview.disconnect(this._syncStackingId); + this._syncStackingId = 0; + } + + for (let w = 0; w < this._thumbnails.length; w++) + this._thumbnails[w].destroy(); + this._thumbnails = []; + } + + _workspacesChanged() { + let validThumbnails = + this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL); + let workspaceManager = global.workspace_manager; + let oldNumWorkspaces = validThumbnails.length; + let newNumWorkspaces = workspaceManager.n_workspaces; + let active = workspaceManager.get_active_workspace_index(); + + if (newNumWorkspaces > oldNumWorkspaces) { + this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces); + } else { + let removedIndex; + let removedNum = oldNumWorkspaces - newNumWorkspaces; + for (let w = 0; w < oldNumWorkspaces; w++) { + let metaWorkspace = workspaceManager.get_workspace_by_index(w); + if (this._thumbnails[w].metaWorkspace != metaWorkspace) { + removedIndex = w; + break; + } + } + + this.removeThumbnails(removedIndex, removedNum); + } + + this._updateSwitcherVisibility(); + } + + addThumbnails(start, count) { + let workspaceManager = global.workspace_manager; + + for (let k = start; k < start + count; k++) { + let metaWorkspace = workspaceManager.get_workspace_by_index(k); + let thumbnail = new WorkspaceThumbnail(metaWorkspace); + thumbnail.setPorthole(this._porthole.x, this._porthole.y, + this._porthole.width, this._porthole.height); + this._thumbnails.push(thumbnail); + this.add_actor(thumbnail.actor); + + if (start > 0 && this._spliceIndex == -1) { + // not the initial fill, and not splicing via DND + thumbnail.state = ThumbnailState.NEW; + thumbnail.slidePosition = 1; // start slid out + this._haveNewThumbnails = true; + } else { + thumbnail.state = ThumbnailState.NORMAL; + } + + this._stateCounts[thumbnail.state]++; + } + + this._queueUpdateStates(); + + // The thumbnails indicator actually needs to be on top of the thumbnails + this._indicator.raise_top(); + + // Clear the splice index, we got the message + this._spliceIndex = -1; + } + + removeThumbnails(start, count) { + let currentPos = 0; + for (let k = 0; k < this._thumbnails.length; k++) { + let thumbnail = this._thumbnails[k]; + + if (thumbnail.state > ThumbnailState.NORMAL) + continue; + + if (currentPos >= start && currentPos < start + count) { + thumbnail.workspaceRemoved(); + this._setThumbnailState(thumbnail, ThumbnailState.REMOVING); + } + + currentPos++; + } + + this._queueUpdateStates(); + } + + _syncStacking(overview, stackIndices) { + for (let i = 0; i < this._thumbnails.length; i++) + this._thumbnails[i].syncStacking(stackIndices); + } + + set scale(scale) { + this._scale = scale; + this.queue_relayout(); + } + + get scale() { + return this._scale; + } + + set indicatorY(indicatorY) { + this._indicatorY = indicatorY; + this.queue_relayout(); + } + + get indicatorY() { + return this._indicatorY; + } + + _setThumbnailState(thumbnail, state) { + this._stateCounts[thumbnail.state]--; + thumbnail.state = state; + this._stateCounts[thumbnail.state]++; + } + + _iterateStateThumbnails(state, callback) { + if (this._stateCounts[state] == 0) + return; + + for (let i = 0; i < this._thumbnails.length; i++) { + if (this._thumbnails[i].state == state) + callback.call(this, this._thumbnails[i]); + } + } + + _tweenScale() { + Tweener.addTween(this, + { scale: this._targetScale, + time: RESCALE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: this._queueUpdateStates, + onCompleteScope: this }); + } + + _updateStates() { + this._stateUpdateQueued = false; + + // If we are animating the indicator, wait + if (this._animatingIndicator) + return; + + // Then slide out any thumbnails that have been destroyed + this._iterateStateThumbnails(ThumbnailState.REMOVING, thumbnail => { + this._setThumbnailState(thumbnail, ThumbnailState.ANIMATING_OUT); + + Tweener.addTween(thumbnail, + { slidePosition: 1, + time: SLIDE_ANIMATION_TIME, + transition: 'linear', + onComplete: () => { + this._setThumbnailState(thumbnail, ThumbnailState.ANIMATED_OUT); + this._queueUpdateStates(); + } + }); + }); + + // As long as things are sliding out, don't proceed + if (this._stateCounts[ThumbnailState.ANIMATING_OUT] > 0) + return; + + // Once that's complete, we can start scaling to the new size and collapse any removed thumbnails + this._iterateStateThumbnails(ThumbnailState.ANIMATED_OUT, thumbnail => { + this._setThumbnailState(thumbnail, ThumbnailState.COLLAPSING); + Tweener.addTween(thumbnail, + { collapseFraction: 1, + time: RESCALE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this._stateCounts[thumbnail.state]--; + thumbnail.state = ThumbnailState.DESTROYED; + + let index = this._thumbnails.indexOf(thumbnail); + this._thumbnails.splice(index, 1); + thumbnail.destroy(); + + this._queueUpdateStates(); + } + }); + }); + + if (this._pendingScaleUpdate) { + this._tweenScale(); + this._pendingScaleUpdate = false; + } + + // Wait until that's done + if (this._scale != this._targetScale || this._stateCounts[ThumbnailState.COLLAPSING] > 0) + return; + + // And then slide in any new thumbnails + this._iterateStateThumbnails(ThumbnailState.NEW, thumbnail => { + this._setThumbnailState(thumbnail, ThumbnailState.ANIMATING_IN); + Tweener.addTween(thumbnail, + { slidePosition: 0, + time: SLIDE_ANIMATION_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this._setThumbnailState(thumbnail, ThumbnailState.NORMAL); + } + }); + }); + } + + _queueUpdateStates() { + if (this._stateUpdateQueued) + return; + + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, + this._updateStates.bind(this)); + + this._stateUpdateQueued = true; + } + + vfunc_get_preferred_height(forWidth) { + // Note that for getPreferredWidth/Height we cheat a bit and skip propagating + // the size request to our children because we know how big they are and know + // that the actors aren't depending on the virtual functions being called. + let workspaceManager = global.workspace_manager; + let themeNode = this.get_theme_node(); + + let spacing = themeNode.get_length('spacing'); + let nWorkspaces = workspaceManager.n_workspaces; + let totalSpacing = (nWorkspaces - 1) * spacing; + + let naturalHeight = totalSpacing + nWorkspaces * this._porthole.height * MAX_THUMBNAIL_SCALE; + + return themeNode.adjust_preferred_height(totalSpacing, naturalHeight); + } + + vfunc_get_preferred_width(forHeight) { + let workspaceManager = global.workspace_manager; + let themeNode = this.get_theme_node(); + + forHeight = themeNode.adjust_for_height(forHeight); + + let spacing = themeNode.get_length('spacing'); + let nWorkspaces = workspaceManager.n_workspaces; + let totalSpacing = (nWorkspaces - 1) * spacing; + + let avail = forHeight - totalSpacing; + + let scale = (avail / nWorkspaces) / this._porthole.height; + scale = Math.min(scale, MAX_THUMBNAIL_SCALE); + + let width = Math.round(this._porthole.width * scale); + + return themeNode.adjust_preferred_width(width, width); + } + + _updatePorthole() { + if (!Main.layoutManager.primaryMonitor) + this._porthole = { width: global.stage.width, height: global.stage.height, + x: global.stage.x, y: global.stage.y }; + else + this._porthole = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); + + this.queue_relayout(); + } + + vfunc_allocate(box, flags) { + this.set_allocation(box, flags); + + let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL); + + if (this._thumbnails.length == 0) // not visible + return; + + let workspaceManager = global.workspace_manager; + let themeNode = this.get_theme_node(); + + box = themeNode.get_content_box(box); + + let portholeWidth = this._porthole.width; + let portholeHeight = this._porthole.height; + let spacing = themeNode.get_length('spacing'); + + // Compute the scale we'll need once everything is updated + let nWorkspaces = workspaceManager.n_workspaces; + let totalSpacing = (nWorkspaces - 1) * spacing; + let avail = (box.y2 - box.y1) - totalSpacing; + + let newScale = (avail / nWorkspaces) / portholeHeight; + newScale = Math.min(newScale, MAX_THUMBNAIL_SCALE); + + if (newScale != this._targetScale) { + if (this._targetScale > 0) { + // We don't do the tween immediately because we need to observe the ordering + // in queueUpdateStates - if workspaces have been removed we need to slide them + // out as the first thing. + this._targetScale = newScale; + this._pendingScaleUpdate = true; + } else { + this._targetScale = this._scale = newScale; + } + + this._queueUpdateStates(); + } + + let thumbnailHeight = portholeHeight * this._scale; + let thumbnailWidth = Math.round(portholeWidth * this._scale); + let roundedHScale = thumbnailWidth / portholeWidth; + + let slideOffset; // X offset when thumbnail is fully slid offscreen + if (rtl) + slideOffset = - (thumbnailWidth + themeNode.get_padding(St.Side.LEFT)); + else + slideOffset = thumbnailWidth + themeNode.get_padding(St.Side.RIGHT); + + let indicatorY1 = this._indicatorY; + let indicatorY2; + // when not animating, the workspace position overrides this._indicatorY + let activeWorkspace = workspaceManager.get_active_workspace(); + let indicatorWorkspace = !this._animatingIndicator ? activeWorkspace : null; + let indicatorThemeNode = this._indicator.get_theme_node(); + + let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP); + let indicatorBottomFullBorder = indicatorThemeNode.get_padding(St.Side.BOTTOM) + indicatorThemeNode.get_border_width(St.Side.BOTTOM); + let indicatorLeftFullBorder = indicatorThemeNode.get_padding(St.Side.LEFT) + indicatorThemeNode.get_border_width(St.Side.LEFT); + let indicatorRightFullBorder = indicatorThemeNode.get_padding(St.Side.RIGHT) + indicatorThemeNode.get_border_width(St.Side.RIGHT); + + let y = box.y1; + + if (this._dropPlaceholderPos == -1) { + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._dropPlaceholder.hide(); + }); + } + + let childBox = new Clutter.ActorBox(); + + for (let i = 0; i < this._thumbnails.length; i++) { + let thumbnail = this._thumbnails[i]; + + if (i > 0) + y += spacing - Math.round(thumbnail.collapseFraction * spacing); + + let x1, x2; + if (rtl) { + x1 = box.x1 + slideOffset * thumbnail.slidePosition; + x2 = x1 + thumbnailWidth; + } else { + x1 = box.x2 - thumbnailWidth + slideOffset * thumbnail.slidePosition; + x2 = x1 + thumbnailWidth; + } + + if (i == this._dropPlaceholderPos) { + let [minHeight, placeholderHeight] = this._dropPlaceholder.get_preferred_height(-1); + childBox.x1 = x1; + childBox.x2 = x1 + thumbnailWidth; + childBox.y1 = Math.round(y); + childBox.y2 = Math.round(y + placeholderHeight); + this._dropPlaceholder.allocate(childBox, flags); + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._dropPlaceholder.show(); + }); + y += placeholderHeight + spacing; + } + + // We might end up with thumbnailHeight being something like 99.33 + // pixels. To make this work and not end up with a gap at the bottom, + // we need some thumbnails to be 99 pixels and some 100 pixels height; + // we compute an actual scale separately for each thumbnail. + let y1 = Math.round(y); + let y2 = Math.round(y + thumbnailHeight); + let roundedVScale = (y2 - y1) / portholeHeight; + + if (thumbnail.metaWorkspace == indicatorWorkspace) { + indicatorY1 = y1; + indicatorY2 = y2; + } + + // Allocating a scaled actor is funny - x1/y1 correspond to the origin + // of the actor, but x2/y2 are increased by the *unscaled* size. + childBox.x1 = x1; + childBox.x2 = x1 + portholeWidth; + childBox.y1 = y1; + childBox.y2 = y1 + portholeHeight; + + thumbnail.actor.set_scale(roundedHScale, roundedVScale); + thumbnail.actor.allocate(childBox, flags); + + // We round the collapsing portion so that we don't get thumbnails resizing + // during an animation due to differences in rounded, but leave the uncollapsed + // portion unrounded so that non-animating we end up with the right total + y += thumbnailHeight - Math.round(thumbnailHeight * thumbnail.collapseFraction); + } + + if (rtl) { + childBox.x1 = box.x1; + childBox.x2 = box.x1 + thumbnailWidth; + } else { + childBox.x1 = box.x2 - thumbnailWidth; + childBox.x2 = box.x2; + } + childBox.x1 -= indicatorLeftFullBorder; + childBox.x2 += indicatorRightFullBorder; + childBox.y1 = indicatorY1 - indicatorTopFullBorder; + childBox.y2 = (indicatorY2 ? indicatorY2 : (indicatorY1 + thumbnailHeight)) + indicatorBottomFullBorder; + this._indicator.allocate(childBox, flags); + } + + _activeWorkspaceChanged(wm, from, to, direction) { + let thumbnail; + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + for (let i = 0; i < this._thumbnails.length; i++) { + if (this._thumbnails[i].metaWorkspace == activeWorkspace) { + thumbnail = this._thumbnails[i]; + break; + } + } + + this._animatingIndicator = true; + let indicatorThemeNode = this._indicator.get_theme_node(); + let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP); + this.indicatorY = this._indicator.allocation.y1 + indicatorTopFullBorder; + Tweener.addTween(this, + { indicatorY: thumbnail.actor.allocation.y1, + time: WorkspacesView.WORKSPACE_SWITCH_TIME, + transition: 'easeOutQuad', + onComplete() { + this._animatingIndicator = false; + this._queueUpdateStates(); + }, + onCompleteScope: this + }); + } +}); diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js new file mode 100644 index 0000000..fe06d9d --- /dev/null +++ b/js/ui/workspacesView.js @@ -0,0 +1,785 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi; +const Signals = imports.signals; + +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; +const WindowManager = imports.ui.windowManager; +const Workspace = imports.ui.workspace; + +var WORKSPACE_SWITCH_TIME = 0.25; + +var AnimationType = { + ZOOM: 0, + FADE: 1 +}; + +const MUTTER_SCHEMA = 'org.gnome.mutter'; + +var WorkspacesViewBase = class { + constructor(monitorIndex) { + this.actor = new St.Widget({ style_class: 'workspaces-view', + reactive: true }); + this.actor.connect('destroy', this._onDestroy.bind(this)); + global.focus_manager.add_group(this.actor); + + // The actor itself isn't a drop target, so we don't want to pick on its area + this.actor.set_size(0, 0); + + this._monitorIndex = monitorIndex; + + this._fullGeometry = null; + this._actualGeometry = null; + + this._inDrag = false; + this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this)); + this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this)); + } + + _onDestroy() { + this._dragEnd(); + + if (this._windowDragBeginId > 0) { + Main.overview.disconnect(this._windowDragBeginId); + this._windowDragBeginId = 0; + } + if (this._windowDragEndId > 0) { + Main.overview.disconnect(this._windowDragEndId); + this._windowDragEndId = 0; + } + } + + _dragBegin(overview, window) { + this._inDrag = true; + this._setReservedSlot(window); + } + + _dragEnd() { + this._inDrag = false; + this._setReservedSlot(null); + } + + destroy() { + this.actor.destroy(); + } + + setFullGeometry(geom) { + this._fullGeometry = geom; + this._syncFullGeometry(); + } + + setActualGeometry(geom) { + this._actualGeometry = geom; + this._syncActualGeometry(); + } +}; + +var WorkspacesView = class extends WorkspacesViewBase { + constructor(monitorIndex) { + let workspaceManager = global.workspace_manager; + + super(monitorIndex); + + this._animating = false; // tweening + this._scrolling = false; // swipe-scrolling + this._gestureActive = false; // touch(pad) gestures + this._animatingScroll = false; // programatically updating the adjustment + + let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); + this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, + lower: 0, + page_increment: 1, + page_size: 1, + step_increment: 0, + upper: workspaceManager.n_workspaces }); + this.scrollAdjustment.connect('notify::value', + this._onScroll.bind(this)); + + this._workspaces = []; + this._updateWorkspaces(); + this._updateWorkspacesId = + workspaceManager.connect('notify::n-workspaces', + this._updateWorkspaces.bind(this)); + + this._overviewShownId = + Main.overview.connect('shown', () => { + this.actor.set_clip(this._fullGeometry.x, this._fullGeometry.y, + this._fullGeometry.width, this._fullGeometry.height); + }); + + this._switchWorkspaceNotifyId = + global.window_manager.connect('switch-workspace', + this._activeWorkspaceChanged.bind(this)); + } + + _setReservedSlot(window) { + for (let i = 0; i < this._workspaces.length; i++) + this._workspaces[i].setReservedSlot(window); + } + + _syncFullGeometry() { + for (let i = 0; i < this._workspaces.length; i++) + this._workspaces[i].setFullGeometry(this._fullGeometry); + } + + _syncActualGeometry() { + for (let i = 0; i < this._workspaces.length; i++) + this._workspaces[i].setActualGeometry(this._actualGeometry); + } + + getActiveWorkspace() { + let workspaceManager = global.workspace_manager; + let active = workspaceManager.get_active_workspace_index(); + return this._workspaces[active]; + } + + animateToOverview(animationType) { + for (let w = 0; w < this._workspaces.length; w++) { + if (animationType == AnimationType.ZOOM) + this._workspaces[w].zoomToOverview(); + else + this._workspaces[w].fadeToOverview(); + } + this._updateWorkspaceActors(false); + } + + animateFromOverview(animationType) { + this.actor.remove_clip(); + + for (let w = 0; w < this._workspaces.length; w++) { + if (animationType == AnimationType.ZOOM) + this._workspaces[w].zoomFromOverview(); + else + this._workspaces[w].fadeFromOverview(); + } + } + + syncStacking(stackIndices) { + for (let i = 0; i < this._workspaces.length; i++) + this._workspaces[i].syncStacking(stackIndices); + } + + _scrollToActive() { + let workspaceManager = global.workspace_manager; + let active = workspaceManager.get_active_workspace_index(); + + this._updateWorkspaceActors(true); + this._updateScrollAdjustment(active); + } + + // Update workspace actors parameters + // @showAnimation: iff %true, transition between states + _updateWorkspaceActors(showAnimation) { + let workspaceManager = global.workspace_manager; + let active = workspaceManager.get_active_workspace_index(); + + this._animating = showAnimation; + + for (let w = 0; w < this._workspaces.length; w++) { + let workspace = this._workspaces[w]; + + Tweener.removeTweens(workspace.actor); + + let y = (w - active) * this._fullGeometry.height; + + if (showAnimation) { + let params = { y: y, + time: WORKSPACE_SWITCH_TIME, + transition: 'easeOutQuad' + }; + // we have to call _updateVisibility() once before the + // animation and once afterwards - it does not really + // matter which tween we use, so we pick the first one ... + if (w == 0) { + this._updateVisibility(); + params.onComplete = () => { + this._animating = false; + this._updateVisibility(); + }; + } + Tweener.addTween(workspace.actor, params); + } else { + workspace.actor.set_position(0, y); + if (w == 0) + this._updateVisibility(); + } + } + } + + _updateVisibility() { + let workspaceManager = global.workspace_manager; + let active = workspaceManager.get_active_workspace_index(); + + for (let w = 0; w < this._workspaces.length; w++) { + let workspace = this._workspaces[w]; + if (this._animating || this._scrolling || this._gestureActive) { + workspace.actor.show(); + } else { + if (this._inDrag) + workspace.actor.visible = (Math.abs(w - active) <= 1); + else + workspace.actor.visible = (w == active); + } + } + } + + _updateScrollAdjustment(index) { + if (this._scrolling || this._gestureActive) + return; + + this._animatingScroll = true; + + Tweener.addTween(this.scrollAdjustment, { + value: index, + time: WORKSPACE_SWITCH_TIME, + transition: 'easeOutQuad', + onComplete: () => { + this._animatingScroll = false; + } + }); + } + + _updateWorkspaces() { + let workspaceManager = global.workspace_manager; + let newNumWorkspaces = workspaceManager.n_workspaces; + + this.scrollAdjustment.upper = newNumWorkspaces; + + let needsUpdate = false; + for (let j = 0; j < newNumWorkspaces; j++) { + let metaWorkspace = workspaceManager.get_workspace_by_index(j); + let workspace; + + if (j >= this._workspaces.length) { /* added */ + workspace = new Workspace.Workspace(metaWorkspace, this._monitorIndex); + this.actor.add_actor(workspace.actor); + this._workspaces[j] = workspace; + } else { + workspace = this._workspaces[j]; + + if (workspace.metaWorkspace != metaWorkspace) { /* removed */ + workspace.destroy(); + this._workspaces.splice(j, 1); + } /* else kept */ + } + } + + if (this._fullGeometry) { + this._updateWorkspaceActors(false); + this._syncFullGeometry(); + } + if (this._actualGeometry) + this._syncActualGeometry(); + } + + _activeWorkspaceChanged(wm, from, to, direction) { + if (this._scrolling) + return; + + this._scrollToActive(); + } + + _onDestroy() { + super._onDestroy(); + + this.scrollAdjustment.run_dispose(); + Main.overview.disconnect(this._overviewShownId); + global.window_manager.disconnect(this._switchWorkspaceNotifyId); + let workspaceManager = global.workspace_manager; + workspaceManager.disconnect(this._updateWorkspacesId); + } + + startSwipeScroll() { + this._scrolling = true; + } + + endSwipeScroll() { + this._scrolling = false; + + // Make sure title captions etc are shown as necessary + this._scrollToActive(); + this._updateVisibility(); + } + + startTouchGesture() { + this._gestureActive = true; + } + + endTouchGesture() { + this._gestureActive = false; + + // Make sure title captions etc are shown as necessary + this._scrollToActive(); + this._updateVisibility(); + } + + // sync the workspaces' positions to the value of the scroll adjustment + // and change the active workspace if appropriate + _onScroll(adj) { + if (this._animatingScroll) + return; + + let workspaceManager = global.workspace_manager; + let active = workspaceManager.get_active_workspace_index(); + let current = Math.round(adj.value); + + if (active != current && !this._gestureActive) { + if (!this._workspaces[current]) { + // The current workspace was destroyed. This could happen + // when you are on the last empty workspace, and consolidate + // windows using the thumbnail bar. + // In that case, the intended behavior is to stay on the empty + // workspace, which is the last one, so pick it. + current = this._workspaces.length - 1; + } + + let metaWorkspace = this._workspaces[current].metaWorkspace; + metaWorkspace.activate(global.get_current_time()); + } + + let last = this._workspaces.length - 1; + let firstWorkspaceY = this._workspaces[0].actor.y; + let lastWorkspaceY = this._workspaces[last].actor.y; + let workspacesHeight = lastWorkspaceY - firstWorkspaceY; + + if (adj.upper == 1) + return; + + let currentY = firstWorkspaceY; + let newY = - adj.value / (adj.upper - 1) * workspacesHeight; + + let dy = newY - currentY; + + for (let i = 0; i < this._workspaces.length; i++) { + this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1; + this._workspaces[i].actor.y += dy; + } + } +}; +Signals.addSignalMethods(WorkspacesView.prototype); + +var ExtraWorkspaceView = class extends WorkspacesViewBase { + constructor(monitorIndex) { + super(monitorIndex); + this._workspace = new Workspace.Workspace(null, monitorIndex); + this.actor.add_actor(this._workspace.actor); + } + + _setReservedSlot(window) { + this._workspace.setReservedSlot(window); + } + + _syncFullGeometry() { + this._workspace.setFullGeometry(this._fullGeometry); + } + + _syncActualGeometry() { + this._workspace.setActualGeometry(this._actualGeometry); + } + + getActiveWorkspace() { + return this._workspace; + } + + animateToOverview(animationType) { + if (animationType == AnimationType.ZOOM) + this._workspace.zoomToOverview(); + else + this._workspace.fadeToOverview(); + } + + animateFromOverview(animationType) { + if (animationType == AnimationType.ZOOM) + this._workspace.zoomFromOverview(); + else + this._workspace.fadeFromOverview(); + } + + syncStacking(stackIndices) { + this._workspace.syncStacking(stackIndices); + } + + startSwipeScroll() { + } + + endSwipeScroll() { + } + + startTouchGesture() { + } + + endTouchGesture() { + } +}; + +var DelegateFocusNavigator = GObject.registerClass( +class DelegateFocusNavigator extends St.Widget { + vfunc_navigate_focus(from, direction) { + return this._delegate.navigateFocus(from, direction); + } +}); + +var WorkspacesDisplay = class { + constructor() { + this.actor = new DelegateFocusNavigator({ clip_to_allocation: true }); + this.actor._delegate = this; + this.actor.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this)); + this.actor.connect('parent-set', this._parentSet.bind(this)); + + let clickAction = new Clutter.ClickAction(); + clickAction.connect('clicked', action => { + // Only switch to the workspace when there's no application + // windows open. The problem is that it's too easy to miss + // an app window and get the wrong one focused. + let event = Clutter.get_current_event(); + let index = this._getMonitorIndexForEvent(event); + if ((action.get_button() == 1 || action.get_button() == 0) && + this._workspacesViews[index].getActiveWorkspace().isEmpty()) + Main.overview.hide(); + }); + Main.overview.addAction(clickAction); + this.actor.bind_property('mapped', clickAction, 'enabled', GObject.BindingFlags.SYNC_CREATE); + + let panAction = new Clutter.PanAction({ threshold_trigger_edge: Clutter.GestureTriggerEdge.AFTER }); + panAction.connect('pan', this._onPan.bind(this)); + panAction.connect('gesture-begin', () => { + if (this._workspacesOnlyOnPrimary) { + let event = Clutter.get_current_event(); + if (this._getMonitorIndexForEvent(event) != this._primaryIndex) + return false; + } + + this._startSwipeScroll(); + return true; + }); + panAction.connect('gesture-cancel', () => { + clickAction.release(); + this._endSwipeScroll(); + }); + panAction.connect('gesture-end', () => { + clickAction.release(); + this._endSwipeScroll(); + }); + Main.overview.addAction(panAction); + this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE); + + let allowedModes = Shell.ActionMode.OVERVIEW; + let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes); + switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this)); + switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this)); + switchGesture.connect('cancel', this._endTouchGesture.bind(this)); + Main.overview.addAction(switchGesture); + this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE); + + switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes); + switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this)); + switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this)); + switchGesture.connect('cancel', this._endTouchGesture.bind(this)); + this.actor.connect('notify::mapped', () => { + switchGesture.enabled = this.actor.mapped; + }); + + this._primaryIndex = Main.layoutManager.primaryIndex; + + this._workspacesViews = []; + this._primaryScrollAdjustment = null; + switchGesture.enabled = this.actor.mapped; + + this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA }); + this._settings.connect('changed::workspaces-only-on-primary', + this._workspacesOnlyOnPrimaryChanged.bind(this)); + this._workspacesOnlyOnPrimaryChanged(); + + this._switchWorkspaceNotifyId = 0; + + this._notifyOpacityId = 0; + this._restackedNotifyId = 0; + this._scrollEventId = 0; + this._keyPressEventId = 0; + + this._fullGeometry = null; + } + + _onPan(action) { + let [dist, dx, dy] = action.get_motion_delta(0); + let adjustment = this._scrollAdjustment; + adjustment.value -= (dy / this.actor.height) * adjustment.page_size; + return false; + } + + _startSwipeScroll() { + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].startSwipeScroll(); + } + + _endSwipeScroll() { + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].endSwipeScroll(); + } + + _startTouchGesture() { + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].startTouchGesture(); + } + + _endTouchGesture() { + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].endTouchGesture(); + } + + _onSwitchWorkspaceMotion(action, xRel, yRel) { + // We don't have a way to hook into start of touchpad actions, + // luckily this is safe to call repeatedly. + this._startTouchGesture(); + + let workspaceManager = global.workspace_manager; + let active = workspaceManager.get_active_workspace_index(); + let adjustment = this._scrollAdjustment; + adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size; + } + + _onSwitchWorkspaceActivated(action, direction) { + let workspaceManager = global.workspace_manager; + let activeWorkspace = workspaceManager.get_active_workspace(); + let newWs = activeWorkspace.get_neighbor(direction); + if (newWs != activeWorkspace) + newWs.activate(global.get_current_time()); + + this._endTouchGesture(); + } + + navigateFocus(from, direction) { + return this._getPrimaryView().actor.navigate_focus(from, direction, false); + } + + show(fadeOnPrimary) { + this._updateWorkspacesViews(); + for (let i = 0; i < this._workspacesViews.length; i++) { + let animationType; + if (fadeOnPrimary && i == this._primaryIndex) + animationType = AnimationType.FADE; + else + animationType = AnimationType.ZOOM; + this._workspacesViews[i].animateToOverview(animationType); + } + + this._restackedNotifyId = + Main.overview.connect('windows-restacked', + this._onRestacked.bind(this)); + if (this._scrollEventId == 0) + this._scrollEventId = Main.overview.connect('scroll-event', this._onScrollEvent.bind(this)); + + if (this._keyPressEventId == 0) + this._keyPressEventId = global.stage.connect('key-press-event', this._onKeyPressEvent.bind(this)); + } + + animateFromOverview(fadeOnPrimary) { + for (let i = 0; i < this._workspacesViews.length; i++) { + let animationType; + if (fadeOnPrimary && i == this._primaryIndex) + animationType = AnimationType.FADE; + else + animationType = AnimationType.ZOOM; + this._workspacesViews[i].animateFromOverview(animationType); + } + } + + hide() { + if (this._restackedNotifyId > 0){ + Main.overview.disconnect(this._restackedNotifyId); + this._restackedNotifyId = 0; + } + if (this._scrollEventId > 0) { + Main.overview.disconnect(this._scrollEventId); + this._scrollEventId = 0; + } + if (this._keyPressEventId > 0) { + global.stage.disconnect(this._keyPressEventId); + this._keyPressEventId = 0; + } + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].destroy(); + this._workspacesViews = []; + } + + _workspacesOnlyOnPrimaryChanged() { + this._workspacesOnlyOnPrimary = this._settings.get_boolean('workspaces-only-on-primary'); + + if (!Main.overview.visible) + return; + + this._updateWorkspacesViews(); + } + + _updateWorkspacesViews() { + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].destroy(); + + this._primaryIndex = Main.layoutManager.primaryIndex; + this._workspacesViews = []; + let monitors = Main.layoutManager.monitors; + for (let i = 0; i < monitors.length; i++) { + let view; + if (this._workspacesOnlyOnPrimary && i != this._primaryIndex) + view = new ExtraWorkspaceView(i); + else + view = new WorkspacesView(i); + + view.actor.connect('scroll-event', this._onScrollEvent.bind(this)); + if (i == this._primaryIndex) { + this._scrollAdjustment = view.scrollAdjustment; + this._scrollAdjustment.connect('notify::value', + this._scrollValueChanged.bind(this)); + } + + this._workspacesViews.push(view); + Main.layoutManager.overviewGroup.add_actor(view.actor); + } + + this._updateWorkspacesFullGeometry(); + this._updateWorkspacesActualGeometry(); + } + + _scrollValueChanged() { + for (let i = 0; i < this._workspacesViews.length; i++) { + if (i == this._primaryIndex) + continue; + + let adjustment = this._workspacesViews[i].scrollAdjustment; + if (!adjustment) + continue; + + // the adjustments work in terms of workspaces, so the + // values map directly + adjustment.value = this._scrollAdjustment.value; + } + } + + _getMonitorIndexForEvent(event) { + let [x, y] = event.get_coords(); + let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 }); + return global.display.get_monitor_index_for_rect(rect); + } + + _getPrimaryView() { + if (!this._workspacesViews.length) + return null; + return this._workspacesViews[this._primaryIndex]; + } + + activeWorkspaceHasMaximizedWindows() { + return this._getPrimaryView().getActiveWorkspace().hasMaximizedWindows(); + } + + _parentSet(actor, oldParent) { + if (oldParent && this._notifyOpacityId) + oldParent.disconnect(this._notifyOpacityId); + this._notifyOpacityId = 0; + + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + let newParent = this.actor.get_parent(); + if (!newParent) + return; + + // This is kinda hackish - we want the primary view to + // appear as parent of this.actor, though in reality it + // is added directly to Main.layoutManager.overviewGroup + this._notifyOpacityId = newParent.connect('notify::opacity', () => { + let opacity = this.actor.get_parent().opacity; + let primaryView = this._getPrimaryView(); + if (!primaryView) + return; + primaryView.actor.opacity = opacity; + primaryView.actor.visible = opacity != 0; + }); + }); + } + + // This geometry should always be the fullest geometry + // the workspaces switcher can ever be allocated, as if + // the sliding controls were never slid in at all. + setWorkspacesFullGeometry(geom) { + this._fullGeometry = geom; + this._updateWorkspacesFullGeometry(); + } + + _updateWorkspacesFullGeometry() { + if (!this._workspacesViews.length) + return; + + let monitors = Main.layoutManager.monitors; + for (let i = 0; i < monitors.length; i++) { + let geometry = (i == this._primaryIndex) ? this._fullGeometry : monitors[i]; + this._workspacesViews[i].setFullGeometry(geometry); + } + } + + _updateWorkspacesActualGeometry() { + if (!this._workspacesViews.length) + return; + + let [x, y] = this.actor.get_transformed_position(); + let allocation = this.actor.allocation; + let width = allocation.x2 - allocation.x1; + let height = allocation.y2 - allocation.y1; + let primaryGeometry = { x: x, y: y, width: width, height: height }; + + let monitors = Main.layoutManager.monitors; + for (let i = 0; i < monitors.length; i++) { + let geometry = (i == this._primaryIndex) ? primaryGeometry : monitors[i]; + this._workspacesViews[i].setActualGeometry(geometry); + } + } + + _onRestacked(overview, stackIndices) { + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].syncStacking(stackIndices); + } + + _onScrollEvent(actor, event) { + if (!this.actor.mapped) + return Clutter.EVENT_PROPAGATE; + + if (this._workspacesOnlyOnPrimary && + this._getMonitorIndexForEvent(event) != this._primaryIndex) + return Clutter.EVENT_PROPAGATE; + + let workspaceManager = global.workspace_manager; + let activeWs = workspaceManager.get_active_workspace(); + let ws; + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + ws = activeWs.get_neighbor(Meta.MotionDirection.UP); + break; + case Clutter.ScrollDirection.DOWN: + ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN); + break; + default: + return Clutter.EVENT_PROPAGATE; + } + Main.wm.actionMoveWorkspace(ws); + return Clutter.EVENT_STOP; + } + + _onKeyPressEvent(actor, event) { + if (!this.actor.mapped) + return Clutter.EVENT_PROPAGATE; + let workspaceManager = global.workspace_manager; + let activeWs = workspaceManager.get_active_workspace(); + let ws; + switch (event.get_key_symbol()) { + case Clutter.KEY_Page_Up: + ws = activeWs.get_neighbor(Meta.MotionDirection.UP); + break; + case Clutter.KEY_Page_Down: + ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN); + break; + default: + return Clutter.EVENT_PROPAGATE; + } + Main.wm.actionMoveWorkspace(ws); + return Clutter.EVENT_STOP; + } +}; +Signals.addSignalMethods(WorkspacesDisplay.prototype); diff --git a/js/ui/xdndHandler.js b/js/ui/xdndHandler.js new file mode 100644 index 0000000..c3b3b5e --- /dev/null +++ b/js/ui/xdndHandler.js @@ -0,0 +1,120 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const { Clutter, Meta } = imports.gi; +const Signals = imports.signals; + +const DND = imports.ui.dnd; +const Main = imports.ui.main; + +var XdndHandler = class { + constructor() { + // Used to display a clone of the cursor window when the + // window group is hidden (like it happens in the overview) + this._cursorWindowClone = null; + + // Used as a drag actor in case we don't have a cursor window clone + this._dummy = new Clutter.Actor({ width: 1, height: 1, opacity: 0 }); + Main.uiGroup.add_actor(this._dummy); + this._dummy.hide(); + + if (!Meta.is_wayland_compositor()) + global.init_xdnd(); + + var dnd = Meta.get_backend().get_dnd(); + dnd.connect('dnd-enter', this._onEnter.bind(this)); + dnd.connect('dnd-position-change', this._onPositionChanged.bind(this)); + dnd.connect('dnd-leave', this._onLeave.bind(this)); + + this._windowGroupVisibilityHandlerId = 0; + } + + // Called when the user cancels the drag (i.e release the button) + _onLeave() { + if (this._windowGroupVisibilityHandlerId != 0) { + global.window_group.disconnect(this._windowGroupVisibilityHandlerId); + this._windowGroupVisibilityHandlerId = 0; + } + if (this._cursorWindowClone) { + this._cursorWindowClone.destroy(); + this._cursorWindowClone = null; + } + + this.emit('drag-end'); + } + + _onEnter() { + this._windowGroupVisibilityHandlerId = + global.window_group.connect('notify::visible', + this._onWindowGroupVisibilityChanged.bind(this)); + + this.emit('drag-begin', global.get_current_time()); + } + + _onWindowGroupVisibilityChanged() { + if (!global.window_group.visible) { + if (this._cursorWindowClone) + return; + + let windows = global.get_window_actors(); + let cursorWindow = windows[windows.length - 1]; + + // FIXME: more reliable way? + if (!cursorWindow.get_meta_window().is_override_redirect()) + return; + + let constraint_position = new Clutter.BindConstraint({ coordinate : Clutter.BindCoordinate.POSITION, + source: cursorWindow}); + + this._cursorWindowClone = new Clutter.Clone({ source: cursorWindow }); + Main.uiGroup.add_actor(this._cursorWindowClone); + + // Make sure that the clone has the same position as the source + this._cursorWindowClone.add_constraint(constraint_position); + } else { + if (this._cursorWindowClone) { + this._cursorWindowClone.destroy(); + this._cursorWindowClone = null; + } + } + } + + _onPositionChanged(obj, x, y) { + let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); + + // Make sure that the cursor window is on top + if (this._cursorWindowClone) + this._cursorWindowClone.raise_top(); + + let dragEvent = { + x: x, + y: y, + dragActor: this._cursorWindowClone ? this._cursorWindowClone : this._dummy, + source: this, + targetActor: pickedActor + }; + + for (let i = 0; i < DND.dragMonitors.length; i++) { + let motionFunc = DND.dragMonitors[i].dragMotion; + if (motionFunc) { + let result = motionFunc(dragEvent); + if (result != DND.DragMotionResult.CONTINUE) + return; + } + } + + while (pickedActor) { + if (pickedActor._delegate && pickedActor._delegate.handleDragOver) { + let [r, targX, targY] = pickedActor.transform_stage_point(x, y); + let result = pickedActor._delegate.handleDragOver(this, + dragEvent.dragActor, + targX, + targY, + global.get_current_time()); + if (result != DND.DragMotionResult.CONTINUE) + return; + } + pickedActor = pickedActor.get_parent(); + } + } +}; +Signals.addSignalMethods(XdndHandler.prototype); diff --git a/man/gnome-shell.xml b/man/gnome-shell.xml new file mode 100644 index 0000000..b366e3f --- /dev/null +++ b/man/gnome-shell.xml @@ -0,0 +1,165 @@ + + + + + + + gnome-shell + gnome-shell + + + + wrote the original gnome-shell man page + Marcelo Jorge + Vieira + metal@alucinados.com + + + + + + + gnome-shell + 1 + + + + gnome-shell + Graphical shell for the GNOME desktop + + + + + gnome-shell OPTION + + + + + Description + + GNOME shell provides core user + interface functions for the GNOME 3 desktop, like switching + to windows and launching applications. GNOME shell takes + advantage of the capabilities of modern graphics hardware + and introduces innovative user interface concepts to provide + a visually attractive and easy to use experience. + + gnome-shell is a required component of + the GNOME desktop, i.e. it is listed in the + RequiredComponents field of + /usr/share/gnome-session/sessions/gnome.session. + It is started in the window manager phase of the session. + + + + + + Options + + + + + , + + Replace the running window manager + + + + + + Disable connection to the session manager + + + + + + Specify session management ID + + + + + + Initialize session from FILE + + + + + + X screen to use + + + + , + + X Display to use + + + + + + Make X calls synchronous + + + + + + Print version and exit + + + + + + Display help and exit + + + + + + Use a specific mode, e.g. "gdm" for login screen + + + + + + List possible modes and exit + + + + + + Clutter the option display (otherwise ignored) + + + + + + + + Files + + + /usr/share/gnome-session/sessions/gnome.session, + /usr/share/applications/org.gnome.Shell.desktop. + + + + Bugs + + The bug tracker can be reached by visiting the + website https://bugzilla.gnome.org/buglist.cgi?product=gnome-shell. + Before sending a bug report, please verify that you have + the latest version of gnome-shell. Many bugs (major and + minor) are fixed at each release, and if yours is out of + date, the problem may already have been solved. + + + + + Additional Information + + For further information, visit the website + https://wiki.gnome.org/Projects/GnomeShell. + + + diff --git a/man/meson.build b/man/meson.build new file mode 100644 index 0000000..9d39a38 --- /dev/null +++ b/man/meson.build @@ -0,0 +1,19 @@ +custom_target('man page', + input: 'gnome-shell.xml', + output: 'gnome-shell.1', + command: [ + xsltproc, + '-o', '@OUTPUT@', + '--nonet', + '--stringparam', 'man.output.quietly', '1', + '--stringparam', 'funcsynopsis.style', 'ansi', + '--stringparam', 'man.th.extra1.suppress', '1', + '--stringparam', 'man.authors.section.enabled', '0', + '--stringparam', 'man.copyright.section.enabled', '0', + 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl', + '@INPUT@' + ], + build_by_default: true, + install_dir: mandir + '/man1', + install: true +) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..21a80bc --- /dev/null +++ b/meson.build @@ -0,0 +1,202 @@ +project('gnome-shell', 'c', + version: '3.32.2', + meson_version: '>= 0.47.0', + license: 'GPLv2+' +) + +# We depend on a specific version of the libmutter API. The mutter variants of +# the Cogl and Clutter libraries also use this API version. +mutter_api_version = '4' + +clutter_pc = 'mutter-clutter-' + mutter_api_version +cogl_pc = 'mutter-cogl-' + mutter_api_version +cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version +libmutter_pc = 'libmutter-' + mutter_api_version + +croco_req = '>= 0.6.8' +ecal_req = '>= 3.5.3' +eds_req = '>= 3.17.2' +gcr_req = '>= 3.7.5' +gdesktop_req = '>= 3.7.90' +gio_req = '>= 2.56.0' +gi_req = '>= 1.49.1' +gjs_req = '>= 1.54.0' +gtk_req = '>= 3.15.0' +json_glib_req = '>= 0.13.2' +mutter_req = '>= 3.32.0' +polkit_req = '>= 0.100' +schemas_req = '>= 3.27.90' +startup_req = '>= 0.11' +ibus_req = '>= 1.5.2' + +bt_req = '>= 3.9.0' +gst_req = '>= 0.11.92' +nm_req = '>= 1.10.4' +secret_req = '>= 0.18' + +gnome = import('gnome') +i18n = import('i18n') + +prefix = get_option('prefix') + +bindir = join_paths(prefix, get_option('bindir')) +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()) + +autostartdir = join_paths(sysconfdir, 'xdg', 'autostart') +convertdir = join_paths(datadir, 'GConf', 'gsettings') +desktopdir = join_paths(datadir, 'applications') +ifacedir = join_paths(datadir, 'dbus-1', 'interfaces') +localedir = join_paths(datadir, 'locale') +portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals') +schemadir = join_paths(datadir, 'glib-2.0', 'schemas') +servicedir = join_paths(datadir, 'dbus-1', 'services') + +# XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can +# depend on this version, replace with something like: +# systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir', +# define_variable: ['prefix', prefix]) +# and uncomment systemd_dep below +systemduserunitdir = join_paths(prefix, 'lib', 'systemd', 'user') + +keybindings_dep = dependency('gnome-keybindings', required: false) +if keybindings_dep.found() + keysdir = keybindings_dep.get_pkgconfig_variable('keysdir') +else + keysdir = join_paths(datadir, 'gnome-control-center', 'keybindings') +endif + +atk_bridge_dep = dependency('atk-bridge-2.0') +ecal_dep = dependency('libecal-1.2', version: ecal_req) +eds_dep = dependency('libedataserver-1.2', version: eds_req) +gcr_dep = dependency('gcr-base-3', version: gcr_req) +gdk_x11_dep = dependency('gdk-x11-3.0') +gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0') +gi_dep = dependency('gobject-introspection-1.0', version: gi_req) +gio_dep = dependency('gio-2.0', version: gio_req) +gio_unix_dep = dependency('gio-unix-2.0', version: gio_req) +gjs_dep = dependency('gjs-1.0', version: gjs_req) +gtk_dep = dependency('gtk+-3.0', version: gtk_req) +libxml_dep = dependency('libxml-2.0') +croco_dep = dependency('libcroco-0.6', version: croco_req) +clutter_dep = dependency(clutter_pc, version: mutter_req) +cogl_dep = dependency(cogl_pc, version: mutter_req) +cogl_pango_dep = dependency(cogl_pango_pc, version: mutter_req) +mutter_dep = dependency(libmutter_pc, version: mutter_req) +polkit_dep = dependency('polkit-agent-1', version: polkit_req) +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) + +bt_dep = dependency('gnome-bluetooth-1.0', version: bt_req, required: false) +gst_dep = dependency('gstreamer-1.0', version: gst_req, required: false) +gst_base_dep = dependency('gstreamer-base-1.0', required: false) + +recorder_deps = [] +enable_recorder = gst_dep.found() and gst_base_dep.found() +if enable_recorder + recorder_deps += [gst_dep, gst_base_dep, gtk_dep, x11_dep] +endif + +nm_deps = [] +if get_option('networkmanager') + nm_deps += dependency('libnm', version: nm_req) + nm_deps += dependency('libsecret-1', version: secret_req) + + vpndir = nm_deps[0].get_pkgconfig_variable('vpnservicedir') + + have_networkmanager = true +else + vpndir = prefix + + have_networkmanager = false +endif + +if get_option('systemd') + libsystemd_dep = dependency('libsystemd') + # XXX: see systemduserunitdir + # systemd_dep = dependency('systemd') + have_systemd = true +else + libsystemd_dep = [] + have_systemd = false +endif + +if get_option('man') + xsltproc = find_program('xsltproc') + + subdir('man') +endif + +mutter_typelibdir = mutter_dep.get_pkgconfig_variable('typelibdir') +python = find_program('python3') +sassc = find_program('sassc') + +cc = meson.get_compiler('c') + +m_dep = cc.find_library('m', required: false) + +cdata = configuration_data() +cdata.set_quoted('GETTEXT_PACKAGE', meson.project_name()) +cdata.set_quoted('VERSION', meson.project_version()) +cdata.set_quoted('PACKAGE_VERSION', meson.project_version()) + +cdata.set('HAVE_NETWORKMANAGER', have_networkmanager) +cdata.set('HAVE_SYSTEMD', have_systemd) + +# New API added in glib-2.57.2 +cdata.set('HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS', + cc.has_function('g_desktop_app_info_launch_uris_as_manager_with_fds', + dependencies : gio_dep) +) +cdata.set('HAVE_FDWALK', cc.has_function('fdwalk')) +cdata.set('HAVE_MALLINFO', cc.has_function('mallinfo')) +cdata.set('HAVE_SYS_RESOURCE_H', cc.has_header('sys/resource.h')) +cdata.set('HAVE__NL_TIME_FIRST_WEEKDAY', + cc.has_header_symbol('langinfo.h', '_NL_TIME_FIRST_WEEKDAY') +) + +cdata.set('HAVE_FDWALK', + cc.has_function('fdwalk') +) + +config_h = configure_file( + input: 'config.h.meson', + output: 'config.h', + configuration: cdata +) + +conf_inc = include_directories('.') + +libgvc = subproject('gvc', + default_options: [ + 'package_name=' + meson.project_name(), + 'package_version=' + meson.project_version(), + 'pkgdatadir=' + pkgdatadir, + 'pkglibdir=' + pkglibdir, + 'static=false', + 'introspection=true', + 'alsa=false' + ] +) +libgvc_gir = libgvc.get_variable('libgvc_gir') + +subdir('js') +subdir('src') +subdir('po') +subdir('data') +subdir('tests') +subdir('tools') + +if get_option('gtk_doc') + subdir('docs/reference') +endif + +meson.add_install_script('meson/meson-postinstall.sh') diff --git a/meson/meson-postinstall.sh b/meson/meson-postinstall.sh new file mode 100755 index 0000000..4500dcb --- /dev/null +++ b/meson/meson-postinstall.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# Package managers set this so we don't need to run +if [ -z "$DESTDIR" ]; then + echo Compiling GSettings schemas... + glib-compile-schemas ${MESON_INSTALL_PREFIX}/share/glib-2.0/schemas + + echo Updating desktop database... + update-desktop-database -q ${MESON_INSTALL_PREFIX}/share/applications +fi diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..853ca98 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,23 @@ +option('gtk_doc', + type: 'boolean', + value: false, + description: 'Build API reference' +) + +option('man', + type: 'boolean', + value: true, + description: 'Generate man pages' +) + +option('networkmanager', + type: 'boolean', + value: true, + description: 'Enable NetworkManager support' +) + +option('systemd', + type: 'boolean', + value: true, + description: 'Enable systemd integration' +) diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..b8f3987 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,80 @@ +af +an +ar +as +ast +be +bg +bn +bn_IN +bs +ca +ca@valencia +cs +da +de +el +en_GB +eo +es +et +eu +fa +fi +fr +fur +ga +gd +gl +gu +he +hi +hr +hu +ia +id +is +it +ja +kk +km +kn +ko +ku +ky +lt +lv +ml +mk +mr +ms +nb +ne +nl +nn +oc +or +pa +pl +pt +pt_BR +ro +ru +si +sk +sl +sr +sr@latin +sv +ta +te +tg +th +tr +ug +uk +uz@cyrillic +vi +zh_CN +zh_HK +zh_TW diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..43ea408 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,82 @@ +# List of source files containing translatable strings. +# Please keep this file sorted alphabetically. +data/50-gnome-shell-system.xml +data/gnome-shell-extension-prefs.desktop.in.in +data/org.gnome.Shell.desktop.in.in +data/org.gnome.shell.gschema.xml.in +data/org.gnome.Shell.PortalHelper.desktop.in.in +js/extensionPrefs/main.js +js/gdm/authPrompt.js +js/gdm/loginDialog.js +js/gdm/util.js +js/misc/systemActions.js +js/misc/util.js +js/portalHelper/main.js +js/ui/accessDialog.js +js/ui/appDisplay.js +js/ui/appFavorites.js +js/ui/audioDeviceSelection.js +js/ui/backgroundMenu.js +js/ui/calendar.js +js/ui/closeDialog.js +js/ui/components/automountManager.js +js/ui/components/autorunManager.js +js/ui/components/keyring.js +js/ui/components/networkAgent.js +js/ui/components/polkitAgent.js +js/ui/components/telepathyClient.js +js/ui/ctrlAltTab.js +js/ui/dash.js +js/ui/dateMenu.js +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 +js/ui/messageList.js +js/ui/messageTray.js +js/ui/mpris.js +js/ui/notificationDaemon.js +js/ui/osdWindow.js +js/ui/overviewControls.js +js/ui/overview.js +js/ui/padOsd.js +js/ui/panel.js +js/ui/popupMenu.js +js/ui/runDialog.js +js/ui/screenShield.js +js/ui/search.js +js/ui/shellEntry.js +js/ui/shellMountOperation.js +js/ui/status/accessibility.js +js/ui/status/bluetooth.js +js/ui/status/brightness.js +js/ui/status/keyboard.js +js/ui/status/location.js +js/ui/status/network.js +js/ui/status/nightLight.js +js/ui/status/power.js +js/ui/status/remoteAccess.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 +js/ui/viewSelector.js +js/ui/windowAttentionHandler.js +js/ui/windowManager.js +js/ui/windowMenu.js +src/calendar-server/evolution-calendar.desktop.in +src/main.c +src/shell-app.c +src/shell-app-system.c +src/shell-global.c +src/shell-keyring-prompt.c +src/shell-polkit-authentication-agent.c +src/shell-util.c +# Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it. +subprojects/gvc/gvc-mixer-control.c diff --git a/po/af.po b/po/af.po new file mode 100644 index 0000000..6901842 --- /dev/null +++ b/po/af.po @@ -0,0 +1,2912 @@ +# Afrikaans translation for gnome-shell. +# Copyright (C) 2011 +# This file is distributed under the same license as the gnome-shell package. +# F Wolff , 2011, 2013, 2014, 2015, 2016. +# Dawid Loubser , 2013. +# Pieter Schoeman , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-01-16 00:12+0000\n" +"PO-Revision-Date: 2018-02-10 11:12+0200\n" +"Last-Translator: Pieter Schalk Schoeman \n" +"Language-Team: Afrikaans \n" +"Language: af\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-DamnedLies-Scope: partial\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Stelsel" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Wys die lys van kennisgewings" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokus op die aktiewe kennisgewing" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Wys die oorsig" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Wys alle toepassings" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Open die toepassingkieslys" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:150 +msgid "Shell Extensions" +msgstr "Shell uitbreidings" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Stel GNOME Shell-uitbreidings op" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Vensterbestuur en toepassinglansering" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Aktiveer interne gereedskap wat nuttig is vir ontwikkelaars en toetsers " +"vanaf Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Laat toegang na interne ontfout- en moniteringsgereedskap toe deur die Alt-" +"F2-dialoog te gebruik." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID's van uitbreidings om te aktiveer" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell-uitbreidings het elk 'n UUID-eienskap; hierdie sleutel lys " +"uitbreidings wat gelaai moet word. Enige uitbreiding wat gelaai wil word " +"moet in hierdie lys verskyn. U kan ook hierdie lys manipuleer met die " +"EnableExtension- en DisableExtension-DBus-metodes op org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Skakel gebruikers uitbreidings af" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Skakel alle uitbreidings wat die gebruiker aangeskakel het af sonder om die " +"\"aangeskakelde-uitbreiding\" instelling te verander." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Skakel die validasie van uitbreidings weergawe versoenbaarheid af" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell sal slegs uitbreidings laai wat die huidig geïnstalleerde " +"weergawe ondersteun. Deur die opsie te aktiveer sal die toets afgeskakel " +"word en alle uitbreidings sal gelaai kan word ongeag of hulle die weergawe " +"ondersteun of nie." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lys van werkarealêer-ID's vir gunstelingtoepassings" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Die toepassings wat ooreenstem met dié identifiseerders sal in die " +"gunstelinge-area vertoon word." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Toepassingkieser oorsig" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indeks van die huidige aansig in die toepassing kieser." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Geskiedenis vir die opdrag-dialoogvenster (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Geskiedenis vir die \"looking glass\"-dialoogvenster" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Wys altyd die 'Meld af' opsie in die gebruikerkieslys." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Hierdie sleutel oorheers die outomatiese wegsteek van die 'Meld af'-" +"kieslysitem in enkelgebruiker-, enkelsessie-situasies." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Of wagwoord onthou moet word vir die heg van geënkripteerde of afgeleë " +"lêerstelsels" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"'n Wagwoord sal versoek word wanneer 'n geënkripteerde toestel of afgeleë " +"lêerstelsel geheg word. As die wagwoord vir toekomstige gebruik gestoor kan " +"word sal 'n 'Onthou wagwoord'-keuseblokkie teenwoordig wees. Hierdie sleutel " +"stel die verstektoestand van die keuseblokkie stel." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Of die verstek Bluetooth verwerker opgestelde toestelle het wat daarmee " +"verband hou" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Die shell sal slegs 'n Bluetooth-kieslysitem wys as 'n Bluetooth-verwerker " +"aangeskakel is, of as daar toestelle ingestel is wat verband hou met die " +"verstekverwerker. Dit sal herstel word as die verstekverwerker ooit gesien " +"word om nie toestelle wat daarmee verband hou, te hê nie." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Sleutelbinding om die toepassingskieslys oop te maak" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Sleutelbinding om die toepassingskieslys oop te maak." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Sleutelkortpad om die \"Vertoon toepassings\"-aansig oop te maak" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Sleutelkortpad om die \"Vertoon toepassings\"-aansig van die Aktiwiteite-" +"oorsig oop te maak." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Sleutelbinding om die oorsig oop te maak" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Sleutelbinding om die Aktiwiteite-oorsig oop te maak." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Sleutelbinding om die sigbaarheid van die kennisgewinglys te swik" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Sleutelbinding om die sigbaarheid van die kennisgewinglys te swik." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Sleutelbinding om die aktiewe kennisgewing te fokus" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Sleutelbinding om die aktiewe kennisgewing te fokus." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Sleutelkortpaaie wat alle uitvoerende tweens stop en weer begin vir " +"ontvoutings doeleindes" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Watter sleutelbord om te gebruik" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Die tipe sleutelbord om te gebruik." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Beperk wisselaar tot huidige werkspasie." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"As waar sal slegs toepassings wat vensters in die huidige werkspasie het in " +"die wisselaar vertoon word. Anders sal alle toepassings ingesluit word." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Die toepassingsikoon-modus." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Stel op hoe die vensters vertoon word in die wisselaar. Geldige moontlikhede " +"is 'slegs-duimnaelskets' (wys 'n duimnaelskets van die venster), 'slegs-toep-" +"ikoon' (wys slegs die toepassing se ikoon), of 'altwee'." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"As waar sal slegs vensters van die huidige werkspasie in die wisselaar " +"vertoon word. Anders sal alle vensters ingesluit word." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Heg modale dialoogvenster vas aan die ouervenster" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Hierdie sleutel oorskryf die sleutel in org.gnome.mutter wanneer GNOME Shell " +"uitgevoer word." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Aktiveer rand-tilering wanneer vensters op skermrand laat val word" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Werkspasies word dinamies bestuur" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Werkspasies slegs op primêre monitor" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Vertraag fokusverandering in muismodus totdat die wyser ophou beweeg" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Netwerkaanmelding" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "" +"'n Fout het voorgekom tydens die lansering van die voorkeuredialoog vir %s:" + +#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 +#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 +#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:921 +msgid "Cancel" +msgstr "Kanselleer" + +#: js/gdm/authPrompt.js:166 js/gdm/authPrompt.js:209 js/gdm/authPrompt.js:441 +msgid "Next" +msgstr "Volgende" + +#: js/gdm/authPrompt.js:205 js/ui/shellMountOperation.js:347 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Sluit oop" + +#: js/gdm/authPrompt.js:207 +msgctxt "button" +msgid "Sign In" +msgstr "Meld aan" + +#: js/gdm/loginDialog.js:315 +msgid "Choose Session" +msgstr "Kies sessie" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "Nie op die lys nie?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:887 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(bv. gebruiker of %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Gebruikernaam: " + +#: js/gdm/loginDialog.js:1228 +msgid "Login Window" +msgstr "Aanmeldvenster" + +#: js/gdm/util.js:345 +msgid "Authentication error" +msgstr "Verifiëringsfout" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(of veeg vinger)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +#, fuzzy +#| msgid "Power Off" +msgctxt "search-result" +msgid "Power Off" +msgstr "Skakel af" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +#, fuzzy +#| msgid "power off;shutdown" +msgid "power off;shutdown;reboot;restart" +msgstr "skakel af;afskakel" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +#, fuzzy +#| msgctxt "search-result" +#| msgid "Lock screen" +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Sluit skerm" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +msgid "lock screen" +msgstr "sluit skerm" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +#, fuzzy +#| msgid "Log Out" +msgctxt "search-result" +msgid "Log Out" +msgstr "Meld af" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "meld af;teken af" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +msgctxt "search-result" +msgid "Suspend" +msgstr "Sluimer" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +msgid "suspend;sleep" +msgstr "suspend;sleep;sluimer;slaap" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:127 +#, fuzzy +#| msgid "Switch User" +msgctxt "search-result" +msgid "Switch User" +msgstr "Wissel gebruiker" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:130 +msgid "switch user" +msgstr "wissel gebruiker" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:134 +#, fuzzy +#| msgctxt "search-result" +#| msgid "Lock orientation" +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Sluit oriëntasie" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:137 +#, fuzzy +#| msgid "lock orientation" +msgid "lock orientation;screen;rotation" +msgstr "sluit oriëntasie" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Opdrag nie gevind nie" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Kon nie opdrag ontleed nie:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Uitvoer van “%s” het misluk:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Nounet" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuut gelede" +msgstr[1] "%d minute gelede" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d uur gelede" +msgstr[1] "%d ure gelede" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Gister" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag gelede" +msgstr[1] "%d dae gelede" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d week gelede" +msgstr[1] "%d weke gelede" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d maand gelede" +msgstr[1] "%d maande gelede" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d jaar gelede" +msgstr[1] "%d jaar gelede" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Gister, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%e %B %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%e %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Gister, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l:%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%e %B %l:%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%e %B %Y, %l:%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "Kuberkolaanmelding" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Jou verbinding met die kuberkolaanmelding is nie veilig nie. Wagwoorde en " +"ander inligting op die bladsy kan deur ander mense gesien word." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:393 +msgid "Deny Access" +msgstr "Wyer toegang" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:396 +msgid "Grant Access" +msgstr "Verleen toegang" + +#: js/ui/appDisplay.js:793 +msgid "Frequently used applications will appear here" +msgstr "Toepassings wat gereeld gebruik word sal hier verskyn" + +#: js/ui/appDisplay.js:914 +msgid "Frequent" +msgstr "Gereeldes" + +#: js/ui/appDisplay.js:921 +msgid "All" +msgstr "Almal" + +#: js/ui/appDisplay.js:1886 +msgid "New Window" +msgstr "Nuwe venster" + +#: js/ui/appDisplay.js:1900 +msgid "Launch using Dedicated Graphics Card" +msgstr "Begin met 'n Toegewyde Grafika Kaart" + +#: js/ui/appDisplay.js:1927 js/ui/dash.js:287 +msgid "Remove from Favorites" +msgstr "Verwyder uit gunstelinge" + +#: js/ui/appDisplay.js:1933 +msgid "Add to Favorites" +msgstr "Voeg by gunstelinge" + +#: js/ui/appDisplay.js:1943 +msgid "Show Details" +msgstr "Wys besonderhede" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s is by die gunstelinge gevoeg." + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s uit die gunstelinge verwyder." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Kies klanktoestel" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Klankinstellings" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Oorfone" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Kopstuk" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Mikrofoon" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Verander agtergrond…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Vertooninstellings" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:267 +msgid "Settings" +msgstr "Instellings" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:44 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:73 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:75 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:77 +msgctxt "grid tuesday" +msgid "T" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:79 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:81 +msgctxt "grid thursday" +msgid "T" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:83 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:85 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:379 +msgid "%OB" +msgstr "" + +#. * +#. * 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:389 +msgid "%OB %Y" +msgstr "" + +#: js/ui/calendar.js:446 +msgid "Previous month" +msgstr "Vorige maand" + +#: js/ui/calendar.js:456 +msgid "Next month" +msgstr "Volgende maand" + +#: js/ui/calendar.js:609 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:664 +msgid "Week %V" +msgstr "Week %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:733 +msgctxt "event list time" +msgid "All Day" +msgstr "Heel dag" + +#: js/ui/calendar.js:868 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A %e %B" + +#: js/ui/calendar.js:872 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A %e %B %Y" + +#: js/ui/calendar.js:1102 +msgid "No Notifications" +msgstr "Geen kennisgewings" + +#: js/ui/calendar.js:1105 +msgid "No Events" +msgstr "Geen gebeure" + +#: js/ui/calendar.js:1133 +msgid "Clear All" +msgstr "Maak als skoon" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” reageer nie." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Jy mag 'n wyle te wag vir die program om voort te gaan of jy kan die program " +"forseer om af te sluit." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Forseer afsluit" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Wag" + +#: js/ui/components/automountManager.js:90 +msgid "External drive connected" +msgstr "Eksterne skyf ingeprop" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Eksterne skyf uitgeprop" + +#: js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "Open met %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 +msgid "Password:" +msgstr "Wagwoord:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Tik weer:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245 +#: js/ui/status/network.js:336 js/ui/status/network.js:924 +msgid "Connect" +msgstr "Verbind" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Wagwoord: " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Sleutel: " + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Identiteit: " + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Private sleutel se wagwoord: " + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Diens: " + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659 +msgid "Authentication required by wireless network" +msgstr "Verifiëring vereis deur draadlose netwerk" + +#: 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 "" +"Wagwoorde of enkripsiesleutels is nodig om toegang te verkry tot die " +"draadlose netwerk “%s”." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663 +msgid "Wired 802.1X authentication" +msgstr "Verifiëring vir 802.1X met kabel" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Netwerknaam: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667 +msgid "DSL authentication" +msgstr "DSL-verifiëring" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673 +msgid "PIN code required" +msgstr "PIN-kode nodig" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN-kode is nodig vir die selfoonbreëbandtoestel" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680 +msgid "Mobile broadband network password" +msgstr "Selfoonbreëband se netwerkwagwoord" + +#: 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 "'n Wagwoord is nodig om te verbind aan “%s”." + +#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1693 +msgid "Network Manager" +msgstr "Netwerkbestuurder" + +#: js/ui/components/polkitAgent.js:48 +msgid "Authentication Required" +msgstr "Verifiëringsversoek" + +#: js/ui/components/polkitAgent.js:76 +msgid "Administrator" +msgstr "Administrateur" + +#: js/ui/components/polkitAgent.js:156 +msgid "Authenticate" +msgstr "Verifieer" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:327 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Jammer, dit het nie gewerk nie. Probeer gerus weer." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:795 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s staan nou bekend as %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Vensters" + +#: js/ui/dash.js:248 js/ui/dash.js:289 +msgid "Show Applications" +msgstr "Wys toepassings" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:445 +msgid "Dash" +msgstr "Toeps" + +#. 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:74 +msgid "%B %e %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "Voeg wêreldhorlosies by…" + +#: js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "Wêreldhorlosies" + +#: js/ui/dateMenu.js:227 +msgid "Weather" +msgstr "Weer" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:291 +#, javascript-format +msgid "%s all day." +msgstr "%s heeldag." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:297 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, dan %s later." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:303 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, dan %s, en later %s." + +#: js/ui/dateMenu.js:314 +msgid "Select a location…" +msgstr "Kies 'n ligging…" + +#: js/ui/dateMenu.js:317 +msgid "Loading…" +msgstr "Laai tans…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:323 +#, javascript-format +msgid "Feels like %s." +msgstr "Voel soos %s." + +#: js/ui/dateMenu.js:326 +msgid "Go online for weather information" +msgstr "Gaan aanlyn vir weer inligting" + +#: js/ui/dateMenu.js:328 +msgid "Weather information is currently unavailable" +msgstr "Weer inligting is nie tans beskikbaar nie" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Meld af as %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Meld af" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s sal outomaties afgemeld word oor %d sekonde." +msgstr[1] "%s sal outomaties afgemeld word oor %d sekondes." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "U sal outomaties afgemeld word oor %d sekonde." +msgstr[1] "U sal outomaties afgemeld word oor %d sekondes." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Meld af" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Skakel af" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Installeer bywerkings en skakel af" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Die stelsel sal outomaties afgeskakel word oor %d sekonde." +msgstr[1] "Die stelsel sal outomaties afgeskakel word oor %d sekondes." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Installeer wagtende sagtewarebywerkings" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Herbegin" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Skakel af" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Herbegin" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Die stelsel sal outomaties herbegin oor %d sekonde." +msgstr[1] "Die stelsel sal outomaties herbegin oor %d sekondes." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Herbegin en installeer bywerkings" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Die stelsel sal outomaties herbegin, en bywerkings sal geïnstalleer word oor " +"%d sekonde." +msgstr[1] "" +"Die stelsel sal outomaties herbegin, en bywerkings sal geïnstalleer word oor " +"%d sekondes." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Herbegin en installeer" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installeer en skakel af" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Skakel af nadat bywerkings geïnstalleer is" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Herbegin en installeer bywerkings" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s sal na die rekenaar herbegin het geïnstalleer word. Die installasie " +"van opgraderings kan lank neem: maak seker dat 'n rugsteen gemaak is en dat " +"die rekenaar ingeprop is." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Tans op batterykrag: prop in voordat bywerkings geïnstalleer word." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "Sommige toepassings is besig of het ongestoorde werk." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Ander gebruikers is aangemeld." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:666 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (afgeleë)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:669 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsole)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Installeer" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Wil u “%s” vanaf extensions.gnome.org aflaai en installeer?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s wil kortpaaie onderdruk" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Toepassing wil kortpaaie onderdruk" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Jy kan kortpaaie herstel deur %s te druk." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Weier" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Laat toe" + +#: js/ui/kbdA11yDialog.js:33 +#, fuzzy +#| msgid "Slow Keys" +msgid "Slow Keys Turned On" +msgstr "Stadige sleutels" + +#: js/ui/kbdA11yDialog.js:34 +#, fuzzy +#| msgid "Slow Keys" +msgid "Slow Keys Turned Off" +msgstr "Stadige sleutels" + +#: 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 "" + +#: js/ui/kbdA11yDialog.js:42 +#, fuzzy +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned On" +msgstr "Kleefsleutels" + +#: js/ui/kbdA11yDialog.js:43 +#, fuzzy +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned Off" +msgstr "Kleefsleutels" + +#: 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 "" + +#: 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 "" + +#: js/ui/kbdA11yDialog.js:59 +msgid "Leave On" +msgstr "" + +#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 +#: js/ui/status/network.js:1283 +msgid "Turn On" +msgstr "Skakel aan" + +#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143 +#: js/ui/status/network.js:154 js/ui/status/network.js:337 +#: js/ui/status/network.js:1283 js/ui/status/network.js:1398 +#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90 +#: js/ui/status/rfkill.js:117 +msgid "Turn Off" +msgstr "Skakel af" + +#: js/ui/kbdA11yDialog.js:67 +msgid "Leave Off" +msgstr "" + +#: js/ui/keyboard.js:198 +#, fuzzy +#| msgid "Region and Language Settings" +msgid "Region & Language Settings" +msgstr "Instellings vir streek en taal" + +#: js/ui/lookingGlass.js:644 +msgid "No extensions installed" +msgstr "Geen uitbreidings geïnstalleer nie" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:698 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s het nie enige foute uitgevoer nie." + +#: js/ui/lookingGlass.js:704 +msgid "Hide Errors" +msgstr "Versteek foute" + +#: js/ui/lookingGlass.js:708 js/ui/lookingGlass.js:768 +msgid "Show Errors" +msgstr "Wys foute" + +#: js/ui/lookingGlass.js:717 +msgid "Enabled" +msgstr "Geaktiveer" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:720 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Gedeaktiveer" + +#: js/ui/lookingGlass.js:722 +msgid "Error" +msgstr "Fout" + +#: js/ui/lookingGlass.js:724 +msgid "Out of date" +msgstr "Verouderd" + +#: js/ui/lookingGlass.js:726 +msgid "Downloading" +msgstr "Laai tans af" + +#: js/ui/lookingGlass.js:750 +msgid "View Source" +msgstr "Vertoon bronkode" + +#: js/ui/lookingGlass.js:759 +msgid "Web Page" +msgstr "Webblad" + +#: js/ui/messageTray.js:1495 +msgid "System Information" +msgstr "Stelselinligting" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Onbekende kunstenaar" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Onbekende titel" + +#: js/ui/overview.js:83 +msgid "Undo" +msgstr "Ontdoen" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:112 +msgid "Overview" +msgstr "Oorsig" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:239 +msgid "Type to search…" +msgstr "Tik om te soek…" + +#: js/ui/padOsd.js:105 +msgid "New shortcut…" +msgstr "Nuwe kortpad…" + +#: js/ui/padOsd.js:156 +msgid "Application defined" +msgstr "Toepassings gedefinieer" + +#: js/ui/padOsd.js:157 +msgid "Show on-screen help" +msgstr "Wys hulp op die skerm" + +#: js/ui/padOsd.js:158 +msgid "Switch monitor" +msgstr "Wissel skerms" + +#: js/ui/padOsd.js:159 +msgid "Assign keystroke" +msgstr "Ken steutel toe" + +#: js/ui/padOsd.js:226 +msgid "Done" +msgstr "Klaar" + +#: js/ui/padOsd.js:740 +msgid "Edit…" +msgstr "Redigeer…" + +#: js/ui/padOsd.js:782 js/ui/padOsd.js:887 +msgid "None" +msgstr "Geen" + +#: js/ui/padOsd.js:841 +msgid "Press a button to configure" +msgstr "Druk 'n knoppie om in te stel" + +#: js/ui/padOsd.js:842 +msgid "Press Esc to exit" +msgstr "Druk Esc om uit te gaan" + +#: js/ui/padOsd.js:845 +msgid "Press any key to exit" +msgstr "Druk enige knoppie om uit te gaan" + +#: js/ui/panel.js:355 +msgid "Quit" +msgstr "Sluit af" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:411 +msgid "Activities" +msgstr "Aktiwiteite" + +#: js/ui/panel.js:692 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Stelsel" + +#: js/ui/panel.js:812 +msgid "Top Bar" +msgstr "Boonste balk" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:300 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Tik 'n opdrag" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:174 +msgid "Close" +msgstr "Sluit" + +#: js/ui/runDialog.js:271 +msgid "Restart is not available on Wayland" +msgstr "Herbegin is nie op Wayland beskikbaar nie" + +#: js/ui/runDialog.js:276 +msgid "Restarting…" +msgstr "Herbegin tans…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A %e %B" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nuwe boodskap" +msgstr[1] "%d nuwe boodskappe" + +#: js/ui/screenShield.js:148 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nuwe kennisgewing" +msgstr[1] "%d nuwe kennisgewings" + +#: js/ui/screenShield.js:451 js/ui/status/system.js:286 +msgid "Lock" +msgstr "Sluit" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "GNOME moet die skerm sluit" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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:1309 +msgid "Unable to lock" +msgstr "Kan nie sluit nie" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1310 +msgid "Lock was blocked by an application" +msgstr "Sluit is gekeer deur 'n program" + +#: js/ui/search.js:660 +msgid "Searching…" +msgstr "Soek tans…" + +#: js/ui/search.js:662 +msgid "No results." +msgstr "Geen resultate nie." + +#: js/ui/search.js:786 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d meer" +msgstr[1] "%d meer" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Kopieer" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Plak" + +#: js/ui/shellEntry.js:96 +msgid "Show Text" +msgstr "Vertoon teks" + +#: js/ui/shellEntry.js:98 +msgid "Hide Text" +msgstr "Versteek teks" + +#: js/ui/shellMountOperation.js:314 +msgid "Password" +msgstr "Wagwoord" + +#: js/ui/shellMountOperation.js:335 +msgid "Remember Password" +msgstr "Onthou wagwoord" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Toeganklikheid" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Zoem" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Skermleser" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Skermsleutelbord" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Visuele waarskuwings" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Kleefsleutels" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Stadige sleutels" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Bonssleutels" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Muissleutels" + +#: js/ui/status/accessibility.js:165 +msgid "High Contrast" +msgstr "Hoë kontras" + +#: js/ui/status/accessibility.js:200 +msgid "Large Text" +msgstr "Groot teks" + +#: js/ui/status/bluetooth.js:48 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616 +msgid "Bluetooth Settings" +msgstr "Bluetooth-instellings" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:137 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d gekoppel" +msgstr[1] "%d gekoppel" + +#: js/ui/status/bluetooth.js:139 +msgid "Off" +msgstr "Af" + +#: js/ui/status/bluetooth.js:141 +msgid "On" +msgstr "Aan" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Helderheid" + +#: js/ui/status/keyboard.js:795 +msgid "Keyboard" +msgstr "Sleutelbord" + +#: js/ui/status/keyboard.js:818 +msgid "Show Keyboard Layout" +msgstr "Wys sleutelborduitleg" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Ligging geaktiveer" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Deaktiveer" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Instellings vir privaatheid" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Ligging in gebruik" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Ligging gedeaktiveer" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Aktiveer" + +#. Translators: %s is an application name +#: js/ui/status/location.js:386 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Gee %s toegang tot u ligging?" + +#: js/ui/status/location.js:387 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Toegang tot jou ligging kan enige tyd in privaatheid instellings verander " +"word." + +#: js/ui/status/network.js:90 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:443 js/ui/status/network.js:1312 +#, javascript-format +msgid "%s Off" +msgstr "%s Af" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:446 +#, javascript-format +msgid "%s Connected" +msgstr "%s Gekoppel" + +#. 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:451 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s Nie bestuur nie" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s Ontkoppel tans" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:461 js/ui/status/network.js:1304 +#, javascript-format +msgid "%s Connecting" +msgstr "%s Koppel tans" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:464 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s Benodig identifisering" + +#. 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:472 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Fermware ontbreek vir %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:476 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nie beskikbaar nie" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:479 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s-verbinding het misluk" + +#: js/ui/status/network.js:495 +msgid "Wired Settings" +msgstr "Kabelinstellings" + +#: js/ui/status/network.js:537 +msgid "Mobile Broadband Settings" +msgstr "Selfoonbreëband-instellings" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:580 js/ui/status/network.js:1309 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s deur hardeware gedeaktiveer" + +#. 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:584 +#, javascript-format +msgid "%s Disabled" +msgstr "%s gedeaktiveer" + +#: js/ui/status/network.js:624 +msgid "Connect to Internet" +msgstr "Koppel aan die internet" + +#: js/ui/status/network.js:818 +msgid "Airplane Mode is On" +msgstr "Vliegtuigmodus is aan" + +#: js/ui/status/network.js:819 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi word gedeaktiveer tydens vliegtuigmodus." + +#: js/ui/status/network.js:820 +msgid "Turn Off Airplane Mode" +msgstr "Skakel vlugmodus af" + +#: js/ui/status/network.js:829 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi is af" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi moet aangeskakel wees om aan 'n netwerk te koppel." + +#: js/ui/status/network.js:831 +msgid "Turn On Wi-Fi" +msgstr "Skakel Wi-Fi aan" + +#: js/ui/status/network.js:856 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi-netwerke" + +#: js/ui/status/network.js:858 +msgid "Select a network" +msgstr "Kies 'n netwerk" + +#: js/ui/status/network.js:888 +msgid "No Networks" +msgstr "Geen netwerke" + +#: js/ui/status/network.js:909 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Gebruik die hardewareskakelaar om mee af te skakel" + +#: js/ui/status/network.js:1175 +msgid "Select Network" +msgstr "Kies netwerk" + +#: js/ui/status/network.js:1181 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi-instellings" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1300 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s Kuberkol Aktief" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1315 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nie gekoppel nie" + +#: js/ui/status/network.js:1415 +msgid "connecting…" +msgstr "verbind tans…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1418 +msgid "authentication required" +msgstr "verifiëring benodig" + +#: js/ui/status/network.js:1420 +msgid "connection failed" +msgstr "verbinding het misluk" + +#: js/ui/status/network.js:1474 +msgid "VPN Settings" +msgstr "VPN-instellings" + +#: js/ui/status/network.js:1487 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1497 +msgid "VPN Off" +msgstr "VPN af" + +#: js/ui/status/network.js:1561 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Netwerkinstellings" + +#: js/ui/status/network.js:1590 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s Gekabelde verbinding" +msgstr[1] "%s Gekabelde verbindings" + +#: js/ui/status/network.js:1594 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi verbinding" +msgstr[1] "%s Wi-Fi verbindings" + +#: js/ui/status/network.js:1598 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s Modem verbinding" +msgstr[1] "%s Modem verbindings" + +#: js/ui/status/network.js:1730 +msgid "Connection failed" +msgstr "Verbinding het misluk" + +#: js/ui/status/network.js:1731 +msgid "Activation of network connection failed" +msgstr "Aktivering van netwerkverbinding het misluk" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "Naglig af" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Naglig aan" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Hervat" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Skakel af tot more" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Kraginstellings" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Volgelaai" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Skat tans…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d oor (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d tot vol (%d%%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Vlugmodus is aan" + +#: js/ui/status/system.js:230 +msgid "Switch User" +msgstr "Wissel gebruiker" + +#: js/ui/status/system.js:242 +msgid "Log Out" +msgstr "Meld af" + +#: js/ui/status/system.js:254 +msgid "Account Settings" +msgstr "Rekeningopstelling" + +#: js/ui/status/system.js:271 +msgid "Orientation Lock" +msgstr "Oriëntasieslot" + +#: js/ui/status/system.js:297 +msgid "Suspend" +msgstr "Sluimer" + +#: js/ui/status/system.js:307 +msgid "Power Off" +msgstr "Skakel af" + +#: js/ui/status/thunderbolt.js:294 +msgid "Thunderbolt" +msgstr "" + +#. we are done +#: js/ui/status/thunderbolt.js:350 +msgid "Unknown Thunderbolt device" +msgstr "" + +#: js/ui/status/thunderbolt.js:351 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" + +#: js/ui/status/thunderbolt.js:356 +msgid "Thunderbolt authorization error" +msgstr "" + +#: js/ui/status/thunderbolt.js:357 +#, javascript-format +msgid "Could not authorize the thunderbolt device: %s" +msgstr "" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "Volume het verander" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Volume" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Spieëlbeeld" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Koppel skerms" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Slegs ekstern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Slegs ingebou" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Meld aan as 'n ander gebruiker" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Onsluit venster" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Toepassings" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Soek" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” is gereed" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Wil u hierdie skerminstellings behou?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Stel instellings terug" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Behou wysigings" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Wysigings gaan teruggestel word oor %d sekonde" +msgstr[1] "Wysigings gaan teruggestel word oor %d sekondes" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Minimeer" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Onmaksimeer" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Maksimeer" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Skuif" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Verander grootte" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Skuif titelbalk na skerm" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Altyd bo-op" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Altyd op sigbare werkspasie" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Skuif na werkspasie links" + +#: js/ui/windowMenu.js:109 +msgid "Move to Workspace Right" +msgstr "Skuif na werkspasie regs" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Skuif na hoër werkspasie" + +#: js/ui/windowMenu.js:121 +msgid "Move to Workspace Down" +msgstr "Skuif na laer werkspasie" + +#: js/ui/windowMenu.js:139 +msgid "Move to Monitor Up" +msgstr "Skuif na hoër monitor" + +#: js/ui/windowMenu.js:148 +msgid "Move to Monitor Down" +msgstr "Skuif na laer monitor" + +#: js/ui/windowMenu.js:157 +msgid "Move to Monitor Left" +msgstr "Skuif na monitor links" + +#: js/ui/windowMenu.js:166 +msgid "Move to Monitor Right" +msgstr "Skuif na monitor regs" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution-kalender" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:432 +msgid "Print version" +msgstr "Druk weergawe" + +#: src/main.c:438 +msgid "Mode used by GDM for login screen" +msgstr "Modus deur GDM gebruik vir aanmeldskerm" + +#: src/main.c:444 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Gebruik 'n spesifieke modus, bv. \"gdm\" vir aanmeldskerm" + +#: src/main.c:450 +msgid "List possible modes" +msgstr "Lys van moontlike modusse" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Onbekend" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Kon nie “%s” lanseer nie" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Wagwoorde stem nie ooreen nie." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Wagwoord kan nie leeg wees nie" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Verifiëringsdialoog is gesluit deur gebruiker" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u Afvoer" +msgstr[1] "%u Afvoere" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u Toevoer" +msgstr[1] "%u Toevoere" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Stelselklanke" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Skakel af" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Meld af" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Wissel gebruiker" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Voorkeure vir GNOME Shell-uitbreidings" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Wys die weekdatum in die kalender" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Indien waar, vertoon die ISO-weekdatum in die kalender." + +#, fuzzy +#~| msgid "Authentication Required" +#~ msgid "Web Authentication Redirect" +#~ msgstr "Verifiëringsversoek" + +#~ msgid "Events" +#~ msgstr "Gebeure" + +#~ msgid "Notifications" +#~ msgstr "Kennisgewings" + +#~| msgid "Hide Text" +#~ msgid "Hide tray" +#~ msgstr "Versteek laai" + +#~ msgid "Status Icons" +#~ msgstr "Statusikone" + +#~ msgid "Media" +#~ msgstr "Media" + +#~| msgid "In Use" +#~ msgid "Not In Use" +#~ msgstr "Nie in gebruik nie" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s versoek toegang tot u ligging." + +#~ msgid "Use as Internet connection" +#~ msgstr "Gebruik as internetverbinding" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Invitation" +#~ msgstr "Uitnodiging" + +#~ msgid "Call" +#~ msgstr "Oproep" + +#~ msgid "File Transfer" +#~ msgstr "Lêeroordrag" + +#~ msgid "Chat" +#~ msgstr "Gesels" + +#~ msgid "Invitation to %s" +#~ msgstr "Uitnodiging na %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s nooi u uit om by %s aan te sluit" + +#~ msgid "Decline" +#~ msgstr "Nee, dankie" + +#~ msgid "Accept" +#~ msgstr "Aanvaar" + +#~ msgid "Video call from %s" +#~ msgstr "Video-oproep van %s" + +#~ msgid "Call from %s" +#~ msgstr "Oproep van %s" + +#~ msgid "Answer" +#~ msgstr "Antwoord" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s stuur %s aan u" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s vra toestemming om te sien wanneer u aanlyn is" + +#~ msgid "Authentication failed" +#~ msgstr "Verifiëring het misluk" + +#~ msgid "Encryption error" +#~ msgstr "Enkripsiefout" + +#~ msgid "Certificate not provided" +#~ msgstr "Sertifikaat nie voorsien nie" + +#~ msgid "Certificate untrusted" +#~ msgstr "Sertifikaat nie vertrou nie" + +#~ msgid "Certificate expired" +#~ msgstr "Sertifikaat het verval" + +#~ msgid "Certificate not activated" +#~ msgstr "Sertifikaat nie geaktiveer nie" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Sertifikaat se rekenaarnaam stem nie ooreen nie" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Sertifikaat se vingerafdruk stem nie ooreen nie" + +#~ msgid "Certificate self-signed" +#~ msgstr "Sertifikaat is self-onderteken" + +#~ msgid "Status is set to offline" +#~ msgstr "Status is nou vanlyn" + +#~ msgid "Certificate is invalid" +#~ msgstr "Sertifikaat is ongeldig" + +#~ msgid "Connection has been refused" +#~ msgstr "Verbinding is geweier" + +#~ msgid "Connection can't be established" +#~ msgstr "Verbinding kan nie gemaak word nie" + +#~ msgid "Connection has been lost" +#~ msgstr "Verbinding is verloor" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Die rekening is reeds verbind aan die bediener" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "Verbinding is vervang met 'n nuwe verbinding wat die selfde hulpbron " +#~ "gebruik" + +#~ msgid "The account already exists on the server" +#~ msgstr "Die rekening bestaan reeds op die bediener" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Die bediener is tans te besig om die verbinding te hanteer" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Die sertifikaat is opgehef" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Die sertifikaat gebruik 'n onveilige syferalgoritme of is kriptografies " +#~ "swak" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Die lengte van die bedienersertifikaat, of die diepte van die " +#~ "bedienersertifikaat-ketting, het die limiete van die kriptografie-" +#~ "biblioteek oorskry" + +#~ msgid "Internal error" +#~ msgstr "Interne fout" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Kan nie verbind aan %s nie" + +#~ msgid "View account" +#~ msgstr "Bekyk rekening" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d gekoppelde toestel" +#~ msgstr[1] "%d gekoppelde toestelle" + +#~ msgid "Authentication required" +#~ msgstr "Verifiëring benodig" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Battery" + +#~ msgid "Airplane Mode" +#~ msgstr "Vliegtuigmodus" + +#~ msgid "Show the message tray" +#~ msgstr "Wys die boodskaplaai" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "So" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "M" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Di" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "W" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Do" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "V" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Sa" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Niks geskeduleer nie" + +#~ msgid "Today" +#~ msgstr "Vandag" + +#~ msgid "Tomorrow" +#~ msgstr "Môre" + +#~ msgid "This week" +#~ msgstr "Dié week" + +#~ msgid "Next week" +#~ msgstr "Volgende week" + +#~ msgid "Removable Devices" +#~ msgstr "Verwyderbare toestelle" + +#~ msgid "Eject" +#~ msgstr "Skiet uit" + +#~ msgid "Unmute" +#~ msgstr "Hoor weer" + +#~ msgid "Mute" +#~ msgstr "Maak stil" + +#~ msgid "Open Calendar" +#~ msgstr "Maak kalender oop" + +#~ msgid "Date & Time Settings" +#~ msgstr "Instellings vir datum en tyd" + +#~ msgid "Open" +#~ msgstr "Open" + +#~ msgid "Remove" +#~ msgstr "Verwyder" + +#~ msgid "Clear Messages" +#~ msgstr "Maak boodskappe skoon" + +#~ msgid "Notification Settings" +#~ msgstr "Kennisgewingopstellings" + +#~ msgid "Tray Menu" +#~ msgstr "Laai-kieslys" + +#~ msgid "No Messages" +#~ msgstr "Geen boodskappe" + +#~ msgid "Message Tray" +#~ msgstr "Boodskaplaai" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Lys van kategorieë wat as gidse vertoon moet word." + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Elke kategorienaam in hierdie lys sal as gids in die toepassingsaansig " +#~ "voorgestel word, in plaas daarvan om inlyn in die hoofaansig vertoon te " +#~ "word." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Rangskikking van die knoppies op die titelbalk" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Hierdie sleutel oorskryf die sleutel in org.gnome.desktop.wm.preferences " +#~ "wanneer GNOME Shell uitgevoer word." + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Kies 'n uitbreiding om op te stel uit die kombinasiekas hierbo." + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%e %B %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%e %B %Y, %H:%M " + +#~ msgid "Authorization request from %s" +#~ msgstr "Magtigingversoek van %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Die toestel %s wil met hierdie rekenaar oppaar" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Toestel %s wil toegang hê tot die '%s'-diens" + +#~ msgid "Grant this time only" +#~ msgstr "Verleen slegs nou toegang" + +#~ msgid "Reject" +#~ msgstr "Weier" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Bevestig oppaar vir %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Bevestig asseblief of die wagkode '%06d' dieselfde is as die een op die " +#~ "toestel." + +#~ msgid "Matches" +#~ msgstr "Dit pas" + +#~ msgid "Does not match" +#~ msgstr "Dit pas nie" + +#~ msgid "Pairing request for %s" +#~ msgstr "Versoek om op te paar vanaf %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Tik die PIN wat op die toestel gewys word." + +#~ msgid "OK" +#~ msgstr "Regso" + +#~ msgid "unavailable" +#~ msgstr "onbeskikbaar" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Jammer, geen pêrels om voor die swyne te gooi vandag nie:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Die Orakel sê: %s" + +#~ msgid "Screenshots" +#~ msgstr "Skermkiekies" + +#~ msgid "Extension" +#~ msgstr "Uitbreiding" + +#~ msgid "Session" +#~ msgstr "Sessie" + +#~ msgid "Power" +#~ msgstr "Krag" + +#~ msgid "Restart" +#~ msgstr "Herbegin" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Klik 'Meld af' om dié toepassings af te sluit en af te meld van die " +#~ "stelsel." + +#~ msgid "Logging out of the system." +#~ msgstr "U meld nou van die stelsel af." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Klik 'Skakel af' om dié toepassings af te sluit en die stelsel af te " +#~ "skakel." + +#~ msgid "Powering off the system." +#~ msgstr "Die stelsel skakel nou af." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Klik 'Herbegin' om dié toepassings af te sluit en die stelsel weer te " +#~ "begin." + +#~ msgid "Restarting the system." +#~ msgstr "Die stelsel word nou herbegin." + +#~ msgid "Volume, network, battery" +#~ msgstr "Volume, netwerk, battery" + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Deur af te skakel, kan hulle ongestoorde werk verloor." + +#~ msgid "Show date in clock" +#~ msgstr "Wys die datum in die horlosie" + +#~ msgid "Show time with seconds" +#~ msgstr "Wys die tyd met sekondes" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Meld aan" + +#~ msgid "APPLICATIONS" +#~ msgstr "TOEPASSINGS" + +#~ msgid "SETTINGS" +#~ msgstr "INSTELLINGS" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Available" +#~ msgstr "Beskikbaar" + +#~ msgid "Away" +#~ msgstr "Weg" + +#~ msgid "Busy" +#~ msgstr "Besig" + +#~ msgid "CONTACTS" +#~ msgstr "KONTAKTE" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e %b %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e %b %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e %b %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ONLANGSE ITEMS" + +#~ msgid "Show password" +#~ msgstr "Wys wagwoord" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Kon nie '%s' ontheg nie" + +#~ msgid "Retry" +#~ msgstr "Herprobeer" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "PLEKKE EN TOESTELLE" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Verkeerde wagwoord. Probeer gerus weer." + +#~ msgid "Universal Access Settings" +#~ msgstr "Instellings vir universele toegang" + +#~ msgid "Set up a New Device..." +#~ msgstr "Stel 'n nuwe toestel op..." + +#~ msgid "Send Files..." +#~ msgstr "Stuur lêers..." + +#~ msgid "Browse Files..." +#~ msgstr "Blaai deur lêers..." + +#~ msgid "Error browsing device" +#~ msgstr "Fout met blaai deur toestel" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "" +#~ "Die aangevraagde toestel kan nie deurgeblaai word nie. Die fout is '%s'." + +#~ msgid "Keyboard Settings" +#~ msgstr "Sleutelbordinstellings" + +#~ msgid "disabled" +#~ msgstr "gedeaktiveer" + +#~ msgid "cable unplugged" +#~ msgstr "kabel uitgeprop" + +#~ msgid "More..." +#~ msgstr "Meer..." + +#~ msgid "Auto Ethernet" +#~ msgstr "Outo-Ethernet" + +#~ msgid "Auto broadband" +#~ msgstr "Outo-breëband" + +#~ msgid "Auto dial-up" +#~ msgstr "Outo-inbel" + +#~ msgid "Auto %s" +#~ msgstr "Outo-%s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Outo-Bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Outo-draadloos" + +#~ msgid "Wired" +#~ msgstr "Draad" + +#~ msgid "Wireless" +#~ msgstr "Draadloos" + +#~ msgid "VPN Connections" +#~ msgstr "VPN-verbindings" + +#~ msgid "Connectivity lost" +#~ msgstr "Verbinding verloor" + +#~ msgid "You're no longer connected to the network" +#~ msgstr "U is nie meer aan die netwerk verbind nie" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d uur bly oor" +#~ msgstr[1] "%d ure bly oor" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s en %d %s bly oor" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "uur" +#~ msgstr[1] "ure" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minuut" +#~ msgstr[1] "minute" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d minuut bly oor" +#~ msgstr[1] "%d minute bly oor" + +#~ msgid "AC adapter" +#~ msgstr "Muurkrag" + +#~ msgid "Laptop battery" +#~ msgstr "Skootrekenaarbattery" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgid "Mouse" +#~ msgstr "Muis" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Media player" +#~ msgstr "Mediaspeler" + +#~ msgid "Tablet" +#~ msgstr "Tablet" + +#~ msgid "Computer" +#~ msgstr "Rekenaar" + +#~ msgid "%s is online." +#~ msgstr "%s is aanlyn." + +#~ msgid "%s is offline." +#~ msgstr "%s is vanlyn." + +#~ msgid "%s is away." +#~ msgstr "%s is weg." + +#~ msgid "%s is busy." +#~ msgstr "%s is besig." + +#, fuzzy +#~ msgid "Sent at %X on %A" +#~ msgstr "Gestuur om %X op %A" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Gestuur op %A %e %B %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Verbinding na %s het misluk" + +#~ msgid "Reconnect" +#~ msgstr "Verbind weer" + +#~ msgid "Hidden" +#~ msgstr "Versteek" + +#~ msgid "Idle" +#~ msgstr "Ledig" + +#~ msgid "Power Off..." +#~ msgstr "Skakel af..." + +#~ msgid "Online Accounts" +#~ msgstr "Aanlynrekeninge" + +#~ msgid "System Settings" +#~ msgstr "Stelselinstellings" + +#~ msgid "Log Out..." +#~ msgstr "Meld af..." + +#~ msgid "%s has finished starting" +#~ msgstr "%s het sy aanvang geneem" + +#~ msgid "United Kingdom" +#~ msgstr "Verenigde Koninkryk" + +#~ msgid "Default" +#~ msgstr "Verstek" + +#~ msgid "Home Folder" +#~ msgstr "Tuisgids" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Localization Settings" +#~ msgstr "Lokaliseringsinstellings" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "U is nou verbind aan die verbinding vir selfoonbreëband '%s'" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "U is nou verbind aan die VPN-netwerk '%s'" + +#~ msgid "Less than a minute ago" +#~ msgstr "Minder as 'n minuut gelede" + +#~ msgid "Shut Down" +#~ msgstr "Skakel af" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "" +#~ "Klik 'Skakel af' om dié toepassings af te sluit en die stelsel af te " +#~ "skakel." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "Die stelsel sal outomaties afgeskakel word oor %d sekondes." + +#~ msgid "Shutting down the system." +#~ msgstr "Die stelsel word nou afgeskakel." + +#~ msgid "Confirm" +#~ msgstr "Bevestig" diff --git a/po/an.po b/po/an.po new file mode 100644 index 0000000..4bc0d70 --- /dev/null +++ b/po/an.po @@ -0,0 +1,2315 @@ +# Aragonese translation for gnome-shell. +# Copyright (C) 2011 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# FULL NAME , 2011. +# Daniel Martinez , 2011, 2014, 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2015-07-23 08:08+0000\n" +"PO-Revision-Date: 2015-04-28 08:40+0200\n" +"Last-Translator: Daniel \n" +"Language-Team: Aragonés \n" +"Language: an\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: Pootle 2.5.1.1\n" +"X-POOTLE-MTIME: 1430206804.000000\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "Sistema" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the notification list" +msgstr "Amostrar a lista de notificacions" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "Dar o foco a la notificación activa" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "Amostrar l'anvista cheneral" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "Amostrar todas as aplicacions" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "Ubrir o menú de l'aplicación" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Chestión de finestras y inicio d'aplicacions" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "Preferencias d'as extensions de GNOME Shell" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurar as extensions de GNOME Shell" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME Shell (composición wayland)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Activar as ferramientas internas, utils ta desembolicadors y probadores, " +"dende Alt+F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permitir accedir a las ferramientas internas de depuración monitorización " +"usando o dialogo Alt+F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "UUID d'as extensions que activar" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"As extensions de GNOME Shell tienen una propiedat UUID; ista clau lista as " +"extensions que s'han de cargar. Qualsiquier extensión que se quiera cargar " +"debe estar en ista lista. Tamién puetz manipular ista lista con os metodos " +"de DBus «EnableExtension» y «DisableExtension» en org.gnome.Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "Desactiva a validación d'a compatibilidat d'a versión d'a extensión" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell solament cargará as extensions que indiquen que suportan a " +"versión actual en execución. Activar ista opción desactivará ista " +"comprebación y intentará cargar todas as extensions, independientment d'as " +"versions que indiquen que suportan." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lista d'ID de fichers d'escritorio ta las aplicacions favoritas" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"As aplicacions correspondients con ixos identificadors s'amostrarán en " +"l'aria de favoritos." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "Anvista de selección d'aplicación" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "Indiz de l'anvista seleccionada actual en o selector d'aplicacion." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "Historico d'o dialogo de comandos (Alt+F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "History for the looking glass dialog" +msgstr "Historico d'o dialogo de \"looking glass\"" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "" +"Amostrar siempre l'elemento de menú \"Trancar sesión\" en o menú de " +"l'usuario." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"Ista clau sobrescribe a ocultación automatica de l'elemento de menú " +"\"Trancar sesión\" en situacions d'un solo usuario u d'una sola sesión." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Indica si se debe recordar a clau ta amontar sistemas de fichers remotos u " +"zifraus" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"A shell solicitará una clau quan s'amonte un dispositivo zifrau u un sistema " +"de fichers remoto. Si a clau se puede alzar ta usar-la en un futuro, " +"s'amostrará a caixeta \"Remerar clau\". Ista clau estableix a valor " +"predeterminada d'a caixeta." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "Show the week date in the calendar" +msgstr "Amostrar a calendata d'a semana en o calendario" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "If true, display the ISO week date in the calendar." +msgstr "Si ye cierta, amuestra a calendata de semana ISO en o calandario." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu" +msgstr "Asociación de teclas ta ubrir o menú de l'aplicación" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the application menu." +msgstr "Asociación de teclas ta ubrir o menú de l'aplicación." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "Asociación de teclas ta la vista \"Amostrar aplicacions\"" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"Asociación de teclas ta ubrir la vista \"Amostrar aplicacions\" de la vista " +"d'actividatz." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the overview" +msgstr "Asociación de teclas ta l'anvista cheneral" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to open the Activities Overview." +msgstr "Asociación de teclas ta ubrir l'anvista d'actividatz" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Asociación de teclas ta cambiar a visibilidat d'a lista de notificacions" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Asociación de teclas ta cambiar a visibilidat d'a lista de notificacions." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification" +msgstr "Asociación de teclas ta dar o foco a la notificación activa" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "Keybinding to focus the active notification." +msgstr "Asociación de teclas ta dar o foco a la notificación activa." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Asociación de teclas que pausan y continan todas as execucions de «tweens», " +"ta propositos de depuraci'on" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "Which keyboard to use" +msgstr "Que teclau usar" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "The type of keyboard to use." +msgstr "O tipo de teclau que usar." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "Limit switcher to current workspace." +msgstr "Selector de limite ta l'aria de treballo actual." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Si en ye verdadero, nomás s'amostrarán en o selector aplicacions que tiengan " +"finestras en l'aria de treballo actual. D'atra man, s'incluirán todas as " +"aplicacions." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "The application icon mode." +msgstr "O modo d'icono de l'aplicación." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only' " +"(shows only the application icon) or 'both'." +msgstr "" +"Configura cómo s'amuestran as finestras en o selector. Os valore posibles " +"son \"thumbnail-only\" (amuestra una miniatura d'a finestra), \"app-icon-" +"only\" (solament amuestra l'icono de l'aplicación) u \"both\"." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Si en ye verdadero, nomás s'amostrarán en o selector finestras de l'aria de " +"treballo actual. D'atra man, s'incluirán todas as finestras." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "Attach modal dialog to the parent window" +msgstr "Acoplar un dialogo modal a la finestra pai" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ista clau sobrescribe a clau en org.gnome.mutter en executar GNOME Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Activar o mosaico en os bordes en arrocegar finestras a os bordes d'a " +"finestra" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces are managed dynamically" +msgstr "As arias de treballo se chestionan dinámicamente" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Workspaces only on primary monitor" +msgstr "Arias de treballo solament en a pantalla prencipal" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Retardo en cambiar o foco d'o churi dica que o puntero deixa de mover-se" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Network Login" +msgstr "Encetar sesión en o rete" + +#: ../js/extensionPrefs/main.js:122 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "I habió una error en lanzar o diálogo de preferencias ta %s:" + +#: ../js/extensionPrefs/main.js:154 +msgid "GNOME Shell Extensions" +msgstr "Extensions de GNOME Shell" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:916 +msgid "Cancel" +msgstr "Cancelar" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215 +msgid "Next" +msgstr "Siguient" + +#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Desbloquiar" + +#: ../js/gdm/authPrompt.js:213 +msgctxt "button" +msgid "Sign In" +msgstr "Encetar sesión" + +#: ../js/gdm/loginDialog.js:281 +msgid "Choose Session" +msgstr "Esleyir a sesión" + +#: ../js/gdm/loginDialog.js:431 +msgid "Not listed?" +msgstr "No ye en a lista?" + +#: ../js/gdm/loginDialog.js:847 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(eix., usuario u %s)" + +#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Nombre d'usuario: " + +#: ../js/gdm/loginDialog.js:1180 +msgid "Login Window" +msgstr "Finestra d'inicio de sesión" + +#: ../js/gdm/util.js:341 +msgid "Authentication error" +msgstr "Error d'autenticación" + +#: ../js/gdm/util.js:473 +msgid "(or swipe finger)" +msgstr "(u pase o dido)" + +#: ../js/misc/util.js:119 +msgid "Command not found" +msgstr "No s'ha trobau lo comando" + +#: ../js/misc/util.js:152 +msgid "Could not parse command:" +msgstr "No s'ha puesto analizar o comando:" + +#: ../js/misc/util.js:160 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Ha fallau a execucion de \"%s\":" + +#. Translators: Time in 24h format */ +#: ../js/misc/util.js:191 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/misc/util.js:197 +msgid "Yesterday, %H∶%M" +msgstr "Ahiere, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/misc/util.js:203 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/misc/util.js:209 +msgid "%B %d, %H∶%M" +msgstr "%d de %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/misc/util.js:215 +msgid "%B %d %Y, %H∶%M" +msgstr "%d de %B de %Y, %H∶%M" + +#. Translators: Time in 12h format */ +#: ../js/misc/util.js:220 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/misc/util.js:226 +msgid "Yesterday, %l∶%M %p" +msgstr "Ahiere a las %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/misc/util.js:232 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/misc/util.js:238 +msgid "%B %d, %l∶%M %p" +msgstr "%d de %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/misc/util.js:244 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d de %B de %Y, %l∶%M %" + +#. TRANSLATORS: this is the title of the wifi captive portal login +#. * window, until we know the title of the actual login page */ +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "Rendrecera ta autentiación web" + +#: ../js/ui/appDisplay.js:789 +msgid "Frequently used applications will appear here" +msgstr "As aplicaciones usadas freqüentment amaneixerán aquí" + +#: ../js/ui/appDisplay.js:909 +msgid "Frequent" +msgstr "Freqüent" + +#: ../js/ui/appDisplay.js:916 +msgid "All" +msgstr "Todas" + +#: ../js/ui/appDisplay.js:1845 +msgid "New Window" +msgstr "Finestra nueva" + +#: ../js/ui/appDisplay.js:1873 ../js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Sacar d'os favoritos" + +#: ../js/ui/appDisplay.js:1879 +msgid "Add to Favorites" +msgstr "Anyadir a os favoritos" + +#: ../js/ui/appDisplay.js:1889 +msgid "Show Details" +msgstr "Amostrar detalles" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "S'ha anyadiu %s a os suyos favoritos." + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "S'ha sacau %s d'os suyos favoritos" + +#: ../js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Cambiar o fondo…" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Display Settings" +msgstr "Preferencias de pantalla" + +#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650 +#: ../js/ui/status/system.js:357 +msgid "Settings" +msgstr "Configuración" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */ +#: ../js/ui/calendar.js:53 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:82 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:84 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:86 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:88 +msgctxt "grid wednesday" +msgid "W" +msgstr "X" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:90 +msgctxt "grid thursday" +msgid "T" +msgstr "Ch" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:92 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:94 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:564 +msgid "Previous month" +msgstr "Mes anterior" + +#: ../js/ui/calendar.js:574 +msgid "Next month" +msgstr "Mes siguient" + +#: ../js/ui/calendar.js:781 +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:1187 +msgctxt "event list time" +msgid "All Day" +msgstr "Tot o diya" + +#: ../js/ui/calendar.js:1289 +msgid "Clear section" +msgstr "Limpiar a sección" + +#: ../js/ui/calendar.js:1516 +msgid "Events" +msgstr "Eventos" + +#: ../js/ui/calendar.js:1525 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %d de %B" + +#: ../js/ui/calendar.js:1529 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d de %B de %Y" + +#: ../js/ui/calendar.js:1614 +msgid "Notifications" +msgstr "Notificacions" + +#: ../js/ui/calendar.js:1765 +msgid "No Notifications" +msgstr "No i hai notificacions" + +#: ../js/ui/calendar.js:1768 +msgid "No Events" +msgstr "No i hai eventos" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Dispositivo externo enchegau" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Dispositivo externo desenchegau" + +#: ../js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "Ubrir con %s" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "Clau de paso:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "Escriba atra vegada:" + +#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919 +msgid "Connect" +msgstr "Connectar" + +#: ../js/ui/components/networkAgent.js:233 +#: ../js/ui/components/networkAgent.js:245 +#: ../js/ui/components/networkAgent.js:273 +#: ../js/ui/components/networkAgent.js:293 +#: ../js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Clau de paso: " + +#: ../js/ui/components/networkAgent.js:238 +msgid "Key: " +msgstr "Clau: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Identidat: " + +#: ../js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Clau d'a clau privada: " + +#: ../js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Servicio: " + +#: ../js/ui/components/networkAgent.js:320 +#: ../js/ui/components/networkAgent.js:658 +msgid "Authentication required by wireless network" +msgstr "O ret sin cordón requiere autenticación" + +#: ../js/ui/components/networkAgent.js:321 +#: ../js/ui/components/networkAgent.js:659 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network “" +"%s”." +msgstr "" +"S'amenesten claus u claus de zifrau ta accedir a o ret inalambrico\"%s\"." + +#: ../js/ui/components/networkAgent.js:325 +#: ../js/ui/components/networkAgent.js:662 +msgid "Wired 802.1X authentication" +msgstr "Autenticación 802.1X cableada" + +#: ../js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Nombre d'o ret: " + +#: ../js/ui/components/networkAgent.js:332 +#: ../js/ui/components/networkAgent.js:666 +msgid "DSL authentication" +msgstr "Autenticación DSL" + +#: ../js/ui/components/networkAgent.js:339 +#: ../js/ui/components/networkAgent.js:672 +msgid "PIN code required" +msgstr "Codigo PIN requeriu" + +#: ../js/ui/components/networkAgent.js:340 +#: ../js/ui/components/networkAgent.js:673 +msgid "PIN code is needed for the mobile broadband device" +msgstr "S'ameneste un codigo PIN ta o dispositivo de banda ampla mobil" + +#: ../js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:348 +#: ../js/ui/components/networkAgent.js:679 +msgid "Mobile broadband network password" +msgstr "Clau d'o ret de banda ampla mobil" + +#: ../js/ui/components/networkAgent.js:349 +#: ../js/ui/components/networkAgent.js:663 +#: ../js/ui/components/networkAgent.js:667 +#: ../js/ui/components/networkAgent.js:680 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Se requier una clau ta connectar-se a \"%s\"." + +#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1657 +msgid "Network Manager" +msgstr "Chestor d'o rete" + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "S'ameneste autenticación" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "Administrador" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "Autenticar" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "Prebe atra vegada." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:757 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Agora %s se dice %s" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:155 +msgid "Windows" +msgstr "Finestras" + +#: ../js/ui/dash.js:250 ../js/ui/dash.js:291 +msgid "Show Applications" +msgstr "Amostrar aplicacions" + +#: ../js/ui/dash.js:449 +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:73 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. */ +#: ../js/ui/dateMenu.js:80 +msgid "%A %B %e %Y" +msgstr "%A %e de %B de %Y" + +#: ../js/ui/dateMenu.js:160 +msgid "Add world clocks…" +msgstr "Adhibir reloches d'o mundo…" + +#: ../js/ui/dateMenu.js:161 +msgid "World Clocks" +msgstr "Reloches d'o mundo" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Trancar a sesión %s" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Trancar a sesión" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "se trancará automaticament a sesión de %s en %d segundo." +msgstr[1] "se trancará automaticament a sesión de %s en %d segundos." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "A suya sesión se trancará automaticament en %d segundo." +msgstr[1] "A suya sesión se trancará automaticament en %d segundos." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Trancar sesion" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Amortar" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalar actualizacions y amortar" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "O sistema se reiniciara automaticament en %d segundos." +msgstr[1] "O sistema se reiniciara automaticament en %d segundos." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalar as actualizacions de software pendients" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Reiniciar" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Amortar" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Reiniciar" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "O sistema se reiniciara automaticament en %d segundo." +msgstr[1] "O sistema se reiniciara automaticament en %d segundos." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reenchegar y instalar as actualizacions" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"O sistema se reenchegará y instalará as actualizacions automaticament en %d " +"segundo." +msgstr[1] "" +"O sistema se reenchegará y instalará as actualizacions automaticament en %d " +"segundos." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reenchegar y instalar" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalar y amortar" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Amortar dimpués d'instalar as actualizacions" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Funcionando con batería: se connecte antes d'instalar as actualizacions." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "Bellas aplicacions son ocupadas u tienen treballo sin alzar." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "I hai atros usuarios con a sesión encetada" + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remoto)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consola)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Instalar" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Descargar y instalar \"%s\" dende extensions.gnome.org?" + +#: ../js/ui/keyboard.js:747 ../js/ui/status/keyboard.js:713 +msgid "Keyboard" +msgstr "Teclau" + +#. translators: 'Hide' is a verb */ +#: ../js/ui/legacyTray.js:66 +msgid "Hide tray" +msgstr "Amagar servilla" + +#: ../js/ui/legacyTray.js:107 +msgid "Status Icons" +msgstr "Iconos d'estau" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "No bi ha extensions instaladas" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s no ha chenerau garra error." + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "Amagar errors" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "Amostrar errors" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "Activau" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "Desactivau" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "Error" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "Caducau" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "Descargando" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "Veyer fuent" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "Pachina web" + +#: ../js/ui/messageTray.js:1486 +msgid "System Information" +msgstr "Informacion d'o sistema" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "Desfer" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "Vista cheneral" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "Tecleyar ta mirar…" + +#: ../js/ui/panel.js:352 +msgid "Quit" +msgstr "Salir" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:404 +msgid "Activities" +msgstr "Actividatz" + +#: ../js/ui/panel.js:755 +msgid "Top Bar" +msgstr "Barra superior" + +#: ../js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Introducir un comando" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162 +msgid "Close" +msgstr "Trancar" + +#: ../js/ui/runDialog.js:281 +msgid "Restarting…" +msgstr "Reenchegando…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:85 +msgid "%A, %B %d" +msgstr "%A, %d de %B" + +#: ../js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d mensache nuevo" +msgstr[1] "%d mensaches nuevos" + +#: ../js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notificación nueva" +msgstr[1] "%d notificacions nuevas" + +#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:365 +msgid "Lock" +msgstr "Blocar" + +#: ../js/ui/screenShield.js:684 +msgid "GNOME needs to lock the screen" +msgstr "GNOME ameneste blocar a pantalla" + +#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271 +msgid "Unable to lock" +msgstr "No se podió blocar" + +#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272 +msgid "Lock was blocked by an application" +msgstr "Una aplicación impidió o bloqueyo" + +#: ../js/ui/search.js:617 +msgid "Searching…" +msgstr "Mirando…" + +#: ../js/ui/search.js:619 +msgid "No results." +msgstr "No se troboron resultaus." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Copiar" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Apegar" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Amostrar texto" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Amagar texto" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "Clau de paso:" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "Remerar clau de paso:" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Accesibilidat" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Ampliación" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Lector de pantalla" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Teclau en pantalla" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Alertas visuals" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Teclas persistents" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Teclas lentas" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Refuso de teclas" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Teclas d'o ratet" + +#: ../js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Contraste alto" + +#: ../js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Texto gran" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1282 +#: ../js/ui/status/network.js:1393 ../js/ui/status/rfkill.js:91 +#: ../js/ui/status/rfkill.js:118 +msgid "Turn Off" +msgstr "Desenchegar" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "Cofiguracion de Bluetooth" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d dispositivo connectau" +msgstr[1] "%d dispositivos connectaus" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1310 +msgid "Not Connected" +msgstr "No connectau" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Brilo" + +#: ../js/ui/status/keyboard.js:736 +msgid "Show Keyboard Layout" +msgstr "Amostrar a distribución d'o teclau" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "Ubicación" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "Desactivar" + +#: ../js/ui/status/location.js:73 +msgid "Privacy Settings" +msgstr "Configuracion de privacidat" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "En uso" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "Activar" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1308 +#: ../js/ui/status/network.js:1512 +msgid "Off" +msgstr "Desenchegau" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "Connectau" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "no chestionada" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "desconnectando" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1302 +msgid "Connecting" +msgstr "Connectando" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "S'amenista autenticación" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "Manca o \"firmware\"" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "No disponible" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1696 +msgid "Connection failed" +msgstr "Falló a connexión" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "Opcions inalambricas" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "Opcions de Banda ampla mobil" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1306 +msgid "Hardware Disabled" +msgstr "Hardware desactivau" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "Fer servir como una connexión a internet" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "O modo avión ye enchegau" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "O Wi-Fi ye desactivau quan o modo avión ye enchegau." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "Desenchegar o modo avión" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "O Wi-Fi ye desenchegau" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "O Wi-Fi ameniste estar enchegau ta connectar-se a un ret." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Enchegar o Wi-Fi" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Retz inalambricos" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "Selecciona un ret" + +#: ../js/ui/status/network.js:883 +msgid "No Networks" +msgstr "No bi ha retz" + +#: ../js/ui/status/network.js:904 ../js/ui/status/rfkill.js:116 +msgid "Use hardware switch to turn off" +msgstr "Fer servir o selector de hardware ta desenchegar-lo" + +#: ../js/ui/status/network.js:1174 +msgid "Select Network" +msgstr "Selecciona o ret" + +#: ../js/ui/status/network.js:1180 +msgid "Wi-Fi Settings" +msgstr "Opcions d'o Wi-Fi" + +#: ../js/ui/status/network.js:1282 +msgid "Turn On" +msgstr "Enchegar" + +#: ../js/ui/status/network.js:1299 +msgid "Hotspot Active" +msgstr "Punto d'acceso activo" + +#: ../js/ui/status/network.js:1410 +msgid "connecting..." +msgstr "conectando…" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1413 +msgid "authentication required" +msgstr "s'amenista autenticacion" + +#: ../js/ui/status/network.js:1415 +msgid "connection failed" +msgstr "falló a connexión" + +#: ../js/ui/status/network.js:1481 ../js/ui/status/rfkill.js:94 +msgid "Network Settings" +msgstr "Configuracion d'o rete" + +#: ../js/ui/status/network.js:1483 +msgid "VPN Settings" +msgstr "Configuración de VPN" + +#: ../js/ui/status/network.js:1502 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1697 +msgid "Activation of network connection failed" +msgstr "Falló l'activación d'a connexión de ret" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "Configuracion d'enerchia" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "Cargada de raso" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "Estimando…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "En queda %d∶%02d (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d ta la carga plena (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "SAI" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "Batería" + +#: ../js/ui/status/rfkill.js:88 +msgid "Airplane Mode" +msgstr "Modo avión" + +#: ../js/ui/status/rfkill.js:90 +msgid "On" +msgstr "Enchegau" + +#: ../js/ui/status/system.js:337 +msgid "Switch User" +msgstr "Cambear d'usuario" + +#: ../js/ui/status/system.js:342 +msgid "Log Out" +msgstr "Trancar sesion" + +#: ../js/ui/status/system.js:361 +msgid "Orientation Lock" +msgstr "Bloqueyo d'Orientación" + +#: ../js/ui/status/system.js:369 +msgid "Suspend" +msgstr "Suspender" + +#: ../js/ui/status/system.js:372 +msgid "Power Off" +msgstr "Amortar" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "Volumen modificau" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "Volumen" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "Microfono" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Encetar sesión como unatro usuario" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Desbloquiar finestra" + +#: ../js/ui/viewSelector.js:159 +msgid "Applications" +msgstr "Aplicacions" + +#: ../js/ui/viewSelector.js:163 +msgid "Search" +msgstr "Mirar" + +#: ../js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "\"%s\" ye parau" + +#: ../js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "Quiers mantener istas opcions de pantalla?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:82 +msgid "Revert Settings" +msgstr "Revertir as opcions" + +#: ../js/ui/windowManager.js:86 +msgid "Keep Changes" +msgstr "Mantener os cambeos" + +#: ../js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Os cambeos d'as opcions serán revertius en %d segundo" +msgstr[1] "Os cambeos d'as opcions serán revertius en %d segundos" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. */ +#: ../js/ui/windowManager.js:660 +#, javascript-format +msgid "%d x %d" +msgstr "%d x %d" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Minimizar" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Restaurar" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Maximizar" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Mover" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Redimensionar" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Mover abarra de titol adentro d'a pantalla" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Siempre veyible" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Siempre en l'aria de treballo veyible" + +#: ../js/ui/windowMenu.js:105 +#, fuzzy +#| msgid "Move to Workspace Up" +msgid "Move to Workspace Left" +msgstr "Mover a l'aria de treballo d'a cucha" + +#: ../js/ui/windowMenu.js:110 +#, fuzzy +#| msgid "Move to Workspace Up" +msgid "Move to Workspace Right" +msgstr "Mover a l'aria de treballo d'a dreita" + +#: ../js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Mover ta l'aria de treballo d'alto" + +#: ../js/ui/windowMenu.js:120 +msgid "Move to Workspace Down" +msgstr "Mover ta l'aria de treballo d'abaixo" + +#: ../js/ui/windowMenu.js:136 +#, fuzzy +#| msgid "Move to Workspace Up" +msgid "Move to Monitor Up" +msgstr "Mover a la pantalla d'alto" + +#: ../js/ui/windowMenu.js:142 +#, fuzzy +#| msgid "Move to Workspace Down" +msgid "Move to Monitor Down" +msgstr "Mover a la pantalla d'abaixo" + +#: ../js/ui/windowMenu.js:148 +#, fuzzy +msgid "Move to Monitor Left" +msgstr "Mover a la pantalla d'a cucha" + +#: ../js/ui/windowMenu.js:154 +#, fuzzy +msgid "Move to Monitor Right" +msgstr "Mover a la pantalla d'a dreita" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Calandario d'Evolution" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u surtida" +msgstr[1] "%u surtidas" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u dentrada" +msgstr[1] "%u dentradas" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "Sonius d'o sistema" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "Imprentar version" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "Modo usau por GDM ta la pantalla d'inicio" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "" +"Usar un modo especifico, por eixemplo, \"gdm\" ta la pantalla d'inicio de " +"sesión" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "Listar os modos posibles" + +#: ../src/shell-app.c:239 +msgctxt "program" +msgid "Unknown" +msgstr "Desconoxiu" + +#: ../src/shell-app.c:480 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Ha fallau en aventar \"%s\"" + +#: ../src/shell-keyring-prompt.c:742 +msgid "Passwords do not match." +msgstr "As claus de paso no coinciden." + +#: ../src/shell-keyring-prompt.c:750 +msgid "Password cannot be blank" +msgstr "A clau de paso no puede estar vueda" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "L'usuario refusó o dialogo d'autenticación" + +#~ msgid "Show the message tray" +#~ msgstr "Amostrar a servilla de mensaches" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Dom" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "L" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "M" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "X" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Ch" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "V" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "D" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Cosa programau" + +#~ msgid "Today" +#~ msgstr "Huei" + +#~ msgid "Tomorrow" +#~ msgstr "Maitin" + +#~ msgid "This week" +#~ msgstr "Ista semana" + +#~ msgid "Next week" +#~ msgstr "A semana vinient" + +#~ msgid "Removable Devices" +#~ msgstr "Dispositivos extraíbles" + +#~ msgid "Eject" +#~ msgstr "Fer fuera" + +#~ msgid "Invitation" +#~ msgstr "Convite" + +#~ msgid "Call" +#~ msgstr "Gritar" + +#~ msgid "File Transfer" +#~ msgstr "Transferencia de fichers" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "Unmute" +#~ msgstr "Dar voz" + +#~ msgid "Mute" +#~ msgstr "Silenciar" + +#~ msgid "Invitation to %s" +#~ msgstr "Invitación a %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s ye convidando-le a unir-se a %s" + +#~ msgid "Decline" +#~ msgstr "Refusar" + +#~ msgid "Accept" +#~ msgstr "Acceptar" + +#~ msgid "Video call from %s" +#~ msgstr "Videogritada de %s" + +#~ msgid "Call from %s" +#~ msgstr "Gritada de %s" + +#~ msgid "Answer" +#~ msgstr "Responder" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s ye ninviando-le %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s solicita permiso ta veyer quán ye enchegau" + +#~ msgid "Network error" +#~ msgstr "Error d'o ret" + +#~ msgid "Authentication failed" +#~ msgstr "Falló l'autenticación" + +#~ msgid "Encryption error" +#~ msgstr "Error de zifrau" + +#~ msgid "Certificate not provided" +#~ msgstr "Certificau no proporcionau" + +#~ msgid "Certificate untrusted" +#~ msgstr "No se confía en o certificau" + +#~ msgid "Certificate expired" +#~ msgstr "Certificau caducau" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificau no activau" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "O nombre d'o servidor d'o certificau no coincide" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "O sinyal d'o certificau no coincide" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificau autofirmau" + +#~ msgid "Status is set to offline" +#~ msgstr "O estau ye establiu a \"desconnectau\"" + +#~ msgid "Encryption is not available" +#~ msgstr "O zifrau no ye disponible" + +#~ msgid "Certificate is invalid" +#~ msgstr "O certificau no ye valido" + +#~ msgid "Connection has been refused" +#~ msgstr "S'ha refusau a connexión" + +#~ msgid "Connection can't be established" +#~ msgstr "No se puede establir a connexión" + +#~ msgid "Connection has been lost" +#~ msgstr "S'ha perdiu a conexión" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Ista cuenta ya ye connectada a o servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "S'ha substituiu a connexión por una nueva connexión usando o mesmo recurso" + +#~ msgid "The account already exists on the server" +#~ msgstr "A cuenta ya existe en o servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "" +#~ "Actualment o servidor ye muit aqueferau intentando chestionar a connexión" + +#~ msgid "Certificate has been revoked" +#~ msgstr "S'ha revocau o certificau" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "O certificau usa un algorismo de zifrau inseguro u ye criptograficament " +#~ "feble" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "A longaria d'o certificau d'o servidor u a profundidat d'a cadena d'o " +#~ "certificau d'o servidor exceden os limites imposaus por a biblioteca de " +#~ "criptografía" + +#~ msgid "Internal error" +#~ msgstr "Error interna" + +#~ msgid "Unable to connect to %s" +#~ msgstr "No se podió connectar a %s" + +#~ msgid "View account" +#~ msgstr "Veyer cuenta" + +#~ msgid "Unknown reason" +#~ msgstr "Razón desconoixida" + +#~ msgid "Open Calendar" +#~ msgstr "Ubrir calendario" + +#~ msgid "Date & Time Settings" +#~ msgstr "Achustes de calendata y hora" + +#~ msgid "Open" +#~ msgstr "Ubrir" + +#~ msgid "Remove" +#~ msgstr "Sacar" + +#~ msgid "Clear Messages" +#~ msgstr "Escoscar mensaches" + +#~ msgid "Notification Settings" +#~ msgstr "Configuración d'as notificacions" + +#~ msgid "Tray Menu" +#~ msgstr "Servilla d'o menú" + +#~ msgid "No Messages" +#~ msgstr "No i hai mensaches" + +#~ msgid "Message Tray" +#~ msgstr "Servilla de mensaches" + +#~ msgid "Captive Portal" +#~ msgstr "Portal captivo" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "O maximo libel de precisión d'ubicación." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Configura o ran maximo de precisión d'ubicación que as aplicacions " +#~ "pueden veyer. As opcions validas son 'off' (seguimiento d'ubicación " +#~ "desenchegau), 'country', 'city', 'neighborhood', 'street', and 'exact' " +#~ "(typicament requier GPS " + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Orden d'os botons en a barra de titol" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Ista clau sobrescribe a clau en org.gnome.desktop.wm.preferences en " +#~ "executar GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Extensión" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Seleccione una extensión que configurar usando a caixa combinada d'alto." + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d de %B , %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d de %B %Y, %H:%M " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Lista de categorías que s'han d'amostrar como carpetas" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Cada nombre de categoría d'ista lista se representará como una carpeta en " +#~ "a vista d'aplicacions, en cuenta d'amostrar-se en linia en la vista " +#~ "prencipal." + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screenshots" +#~ msgstr "Capturas de pantalla" + +#~ msgid "Record a screencast" +#~ msgstr "Gravar una captura de pantalla" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "" +#~ "Indica si s'han de recullir estatisticas sobre l'uso d'as aplicacions" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "A \"shell\" normalment monitoriza todas as aplicacions activas ta " +#~ "presentar as mas usadas (eix. en os lanzadors). Encara que istos datos se " +#~ "mantienen de forma privada, puede querer desactivar-lo por razons de " +#~ "privacidat. Note que fendo-lo no eliminará os datos ya alzaus." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Usau internament ta alzar o zaguer IM de presencia establiu explicitament " +#~ "por l'usuario. A valor aquí ye d'a enumeración TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Usau internament ta alzar o zaguer estau de presencia d'a sesión de " +#~ "l'usuario. A valor aquí ye d'a GsmPresenceStatus." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Asociación de teclas ta cambiar o gravador de pantalla" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Asociación de teclas ta encetar/aturar o gravador de pantalla." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Taxa de fotogramas usada ta gravar \"screencast\"." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "A taxa de fotogramas d'a gravación resultant gravada por o gravador de " +#~ "\"screencast\" de GNOME Shell, en fotogramas por segundo." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "A canyería de gstreamer usada ta codificar o \"screencast\"" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Estableix a canyería GStreamer usada ta codificar gravacions. Sigue a " +#~ "sintaxi usada ta gst-launch. A canyería habría de tener un sumidero " +#~ "(«sink») desconnectau an gravar o video que se ye gravando. Cheneralment " +#~ "tendrá un punto d'orichen desconnectau; a salida d'ixe punto s'escribirá " +#~ "en o fichero de salida. Manimenos, a canyería tamién puede prener parte " +#~ "en a suya propia salida; isto se puede usar ta ninviar a salida a un " +#~ "servidor «icecast» a traviés de shout2send u semellant. Quan no ye " +#~ "establiu u lo ye a una valor vueda, s'usará a canyería predeterminada. " +#~ "Actualment ye «'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 " +#~ "deadline=1000000 threads=%T ! queue ! webmmux» y grava en WEBM usando o " +#~ "códec VP8. S'usa %T como marcador de posición ta o numero de filos " +#~ "optimos en o sistema." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Extensión de fichero que usar ta almagazenar os \"screencast\"" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "O nombre de fichero ta os \"screencast\" será un nombre de fichero solo " +#~ "basau en a calendata actual y usará ista extensión. S'habría de cambiar " +#~ "en gravar en unatro formato contenedor diferent." + +#~ msgid "Session…" +#~ msgstr "Sesión…" + +#~ msgid "Power" +#~ msgstr "Enerchía" + +#~ msgid "Restart" +#~ msgstr "Reiniciar" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Screencast dende %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Prete \"Trancar sesion\" ta salir de ixas aplicacions y trancar a sesion " +#~ "d'o sistema." + +#~ msgid "Logging out of the system." +#~ msgstr "Trancando a sesion." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "Prete \"Amortar\" ta salir d'ixas aplicacions y amortar o sistema." + +#~ msgid "Powering off the system." +#~ msgstr "Amortando o sistema." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Prete \"Reiniciar\" ta salir d'ixas aplicacions y reiniciar o sistema." + +#~ msgid "Restarting the system." +#~ msgstr "Reiniciando lo sistema." + +#~ msgid "Universal Access Settings" +#~ msgstr "Configuración de l'acceso universal" + +#~ msgid "Visibility" +#~ msgstr "Visibilidat" + +#~ msgid "Send Files to Device…" +#~ msgstr "Ninviar fichers a o dispositivo…" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Configurar un dispositivo nuevo…" + +#~ msgid "Send Files…" +#~ msgstr "Ninviar fichers…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Configuración d'o teclau" + +#~ msgid "Mouse Settings" +#~ msgstr "Configuración d'o ratet…" + +#~ msgid "Sound Settings" +#~ msgstr "Configuración d'o son" + +#~ msgid "Authorization request from %s" +#~ msgstr "Solicitut d'autorización de %s" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "O dispositivo %s quiere accedir a o servicio \"%s\"" + +#~ msgid "Always grant access" +#~ msgstr "Conceder acceso siempre" + +#~ msgid "Grant this time only" +#~ msgstr "Conceder solament ista vegada" + +#~ msgid "Reject" +#~ msgstr "Refusar" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Confirmación d'emparellamiento ta \"%s\"" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "O dispositivo \"%s\" quiere emparellar-se con iste equipo" + +#~ msgid "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgstr "" +#~ "Confirme que o PIN amostrau en \"%06d\" coincide con o d'o dispositivo." + +#~ msgid "Matches" +#~ msgstr "Coincide" + +#~ msgid "Does not match" +#~ msgstr "No coincide" + +#~ msgid "Pairing request for %s" +#~ msgstr "Solicitut d'emparejamiento ta \"%s\"" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Introduzca o PIN mencionau en o dispositivo." + +#~ msgid "OK" +#~ msgstr "Aceptar" + +#~ msgid "Region & Language Settings" +#~ msgstr "Configuración de rechión y luenga" + +#~ msgid "Volume, network, battery" +#~ msgstr "Volumen, ret, batería" + +#~ msgid "disabled" +#~ msgstr "desactivada" + +#~ msgid "cable unplugged" +#~ msgstr "cordon desenchegau" + +#~ msgid "More…" +#~ msgstr "Más…" + +#~ msgid "Wired" +#~ msgstr "Cableada" + +#~ msgid "Auto Ethernet" +#~ msgstr "Ethernet automatica" + +#~ msgid "Auto broadband" +#~ msgstr "Banda ampla automatica" + +#~ msgid "Auto dial-up" +#~ msgstr "Marcau automatico" + +#~ msgid "Auto %s" +#~ msgstr "%s automatica" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth automatico" + +#~ msgid "Auto wireless" +#~ msgstr "Sin cordón automatica" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "Networking is disabled" +#~ msgstr "O rete ye desactivau" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "Manca %d hora" +#~ msgstr[1] "Mancan %d horas" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "Mancan %d %s %d %s" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "hora" +#~ msgstr[1] "horas" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minuto" +#~ msgstr[1] "minutos" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "Manca %d minuto" +#~ msgstr[1] "Mancan %d minutos" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~ msgid "AC Adapter" +#~ msgstr "Adaptador de corrient" + +#~ msgid "Laptop Battery" +#~ msgstr "Bateria d'o portatil" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgid "Mouse" +#~ msgstr "Ratet" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "Telefono movil" + +#~ msgid "Media Player" +#~ msgstr "Reproductor multimeya" + +#~ msgid "Tablet" +#~ msgstr "Tablet" + +#~ msgid "Computer" +#~ msgstr "Equipo" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Desconoxiu" + +#~ msgid "Available" +#~ msgstr "Disponible" + +#~ msgid "Busy" +#~ msgstr "Aqueferau" + +#~ msgid "Invisible" +#~ msgstr "Invisible" + +#~ msgid "Away" +#~ msgstr "Ausent" + +#~ msgid "Idle" +#~ msgstr "Inactivo" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "O suyo estau d'o chat s'establirá a \"Aqueferau\"" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "As notificacions son agora desactivadas, incluindo os mensaches de chat. " +#~ "O suyo estau en linia s'ha achustau ta que atros saban que puede no leyer " +#~ "os suyos mensaches." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Amortar puede fer que pierdan o treballo que no haigan alzau." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Hue no tiene garra mensache:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "L'oráculo %s diz" + +#~ msgid "Show date in clock" +#~ msgstr "Amostrar a calendata en o reloch" + +#~ msgid "Show time with seconds" +#~ msgstr "Amostrar a hora con segundos" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "proveedors OpenSearch desactivaus" + +#~ msgid "APPLICATIONS" +#~ msgstr "APLICACIONS" + +#~ msgid "SETTINGS" +#~ msgstr "CONFIGURACION" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e de %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e de %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e de %b, %H:%M:%S" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %H:%M:%S" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ELEMENTOS RECIENTZ" + +#~ msgid "Retry" +#~ msgstr "Prebar atra vegada" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "PUESTOS Y DISPOSITIVOS" + +#~ msgid "Power Off..." +#~ msgstr "Amortar..." + +#~ msgid "System Settings" +#~ msgstr "Configuracion d'o sistema" + +#~ msgid "Lock Screen" +#~ msgstr "Bloqueyar a pantalla" + +#~ msgid "Log Out..." +#~ msgstr "Trancar a sesion..." + +#~ msgid "More..." +#~ msgstr "Mas..." + +#~ msgid "%s is online." +#~ msgstr "%s ye enchegau/da." + +#~ msgid "%s is away." +#~ msgstr "%s ye ausent." + +#~ msgid "%s is busy." +#~ msgstr "%s ye aqueferau/da." + +#~ msgid "Sent at %X on %A" +#~ msgstr "Ninviau a las %X o %A" + +#~ msgid "United Kingdom" +#~ msgstr "Reino Uniu" + +#~ msgid "Default" +#~ msgstr "Predeterminada" + +#~ msgid "Home Folder" +#~ msgstr "Carpeta presonal" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 0000000..346a1e9 --- /dev/null +++ b/po/ar.po @@ -0,0 +1,3168 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Khaled Hosny , 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# Muhammed Abd-ulaziz Abd-ullah , 2012. +# Abderrahim Kitouni , 2012, 2014. +# Ibrahim Saed , 2012. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-03-18 14:28+0200\n" +"PO-Revision-Date: 2019-03-18 14:37+0200\n" +"Last-Translator: Khaled Hosny \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "النظام" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "اعرض قائمة التنبيهات" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "ركّز على التنبيه النشط" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "اعرض النظرة العامة" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "أظهر كل التطبيقات" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "افتح قائمة التطبيقات" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "امتدادات الصدفة" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "اضبط امتدادات صدفة جنوم" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "صدفة جنوم" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "إدارة النوافذ وإطلاق التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "تمكين الأدوات الداخلية المفيدة للمطورين والمختبرين من Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"السماح بالوصول إلى التنقيح الداخلي ومراقبة الأدوات باستخدام نافذة حوار Alt-" +"F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "معرّفات الامتدادات التي ستُفعّل" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "عطّل امتدادات المستخدمين" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "منظور منتقي التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "التأريخ لنافذة حوار الأمر (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "التأريخ لنافذة المرآة" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "اختصار فتح قائمة التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "اختصار فتح قائمة التطبيقات." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "اختصار منظور ”اعرض التطبيقات“" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "اختصار منظور ”اعرض التطبيقات“ في النظرة العامة للتطبيقات." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "اختصار فتح النظرة العامة" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "اختصار فتح النظرة العامة للأنشطة" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "اختصار تبديل حالة ظهور قائمة التنبيهات" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "اختصار تبديل حالة ظهور قائمة التنبيهات." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "اختصار التركيز على التنبيه النشط" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "اختصار التركيز على التنبيه النشط." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:150 +#, fuzzy +msgid "Switch to application 1" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:154 +#, fuzzy +msgid "Switch to application 2" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:158 +#, fuzzy +msgid "Switch to application 3" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:162 +#, fuzzy +msgid "Switch to application 4" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:166 +#, fuzzy +msgid "Switch to application 5" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:170 +#, fuzzy +msgid "Switch to application 6" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:174 +#, fuzzy +msgid "Switch to application 7" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:178 +#, fuzzy +msgid "Switch to application 8" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:182 +#, fuzzy +msgid "Switch to application 9" +msgstr "أظهر التطبيقات" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "أي لوحة مفاتيح ترغب باستخدامها" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "نوع لوحة المفاتيح التي ترغب باستخدامها." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "مساحات عمل على الشاشة الرئيسية فقط" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "ولوج الشّبكة" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "حدثت مشكلة" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"نأسف جدا لهذا، لكن هناك مشكلة: لا يمكن عرض إعدادات هذا الامتداد. ننصح بإبلاغ " +"مطوري هذا الامتداد عن هذه المشكلة." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "التفاصيل التقنية" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "انسخ الخطأ" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "الصفحة الرئيسية" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "اذهب إلى صفحة الامتداد الرئيسية" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "لا امتدادات مثبّتة" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"يمكن تثبيت الامتدادات من تطبيق «البرمجيات» أو من extensions.gnome.org " + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "تصفح في «البرمجيات»" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "ألغِ" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "التالي" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "فك القفل" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "ادخل" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "أغلق الجلسة" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "غير مدرج؟" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(مثلا مستخدم أو %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "اسم المستخدم: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "نافذة الولوج" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "خطأ في الاستيثاق" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(أو مرر إصبع)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "أطفئ" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "أطفئ;أغلق;أعد التشغيل" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "أوصد الشاشة" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "أوصد الشاشة" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "اخرج" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "اخرج" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "علّق" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "علّق" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "غيّر المستخدم" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "بدّل المستخدم" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "أوصد الاتجاه" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "أوصد الاتجاه;شاشة;تدوير" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "لم يُعثَر على الأمر" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "تعذّر تحليل الأمر:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "فشل تنفيذ ”%s“:‏" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "الآن" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "منذ أقل من دقيقة" +msgstr[1] "منذ دقيقة" +msgstr[2] "منذ دقيقتين" +msgstr[3] "منذ %d دقائق" +msgstr[4] "منذ %d دقيقة" +msgstr[5] "منذ %d دقيقة" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "منذ أقل من ساعة" +msgstr[1] "منذ ساعة" +msgstr[2] "منذ ساعتين" +msgstr[3] "منذ %d ساعات" +msgstr[4] "منذ %d ساعة" +msgstr[5] "منذ %d ساعة" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "أمس" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "منذ أقل من يوم" +msgstr[1] "منذ يوم" +msgstr[2] "منذ يومين" +msgstr[3] "منذ %d أيام" +msgstr[4] "منذ %d يوما" +msgstr[5] "منذ %d يوم" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "منذ أقل من أسبوع" +msgstr[1] "منذ أسبوع" +msgstr[2] "منذ أسبوعين" +msgstr[3] "منذ %d أسابيع" +msgstr[4] "منذ %d أسبوعا" +msgstr[5] "منذ %d أسبوع" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "منذ أقل من شهر" +msgstr[1] "منذ شهر واحد" +msgstr[2] "منذ شهرين" +msgstr[3] "منذ %d أشهر" +msgstr[4] "منذ %d شهرًا" +msgstr[5] "منذ %d شهر" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "منذ أقل من سنة" +msgstr[1] "منذ سنة واحدة" +msgstr[2] "منذ سنتين" +msgstr[3] "منذ %d سنوات" +msgstr[4] "منذ %d سنة" +msgstr[5] "منذ %d سنة" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "بالأمس، %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A، %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B، %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y، %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "بالأمس، %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A، %l:%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B، %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y، %l:%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "ولوج نقطة البث" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"اتصالك بنقطة الاتصال هذه غير آمن. كلمات السر أو أي معلومات تُدخلها في هذه " +"الصفحة يمكن أن يطلع عليها الآخرون." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "ارفض منح الصلاحية" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "امنح الصلاحية" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "التطبيقات شائعة الاستخدام ستظهر هنا" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "شائعة" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "الكل" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "نافذة جديدة" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "شغل باستخدام بطاقة الرسوميات المنفصلة" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "أزِل من المفضّلة" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "أضِف إلى المفضّلة" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "أظهر التفاصيل" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "أُضيف %s إلى مفضلتك." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "أُزيل %s من مفضّلتك." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "اختر جهاز صوت" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "إعدادات الصوت" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "سماعات أذن" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "سماعة رأس" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "ميكروفون" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "غيّر الخلفية…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "إعدادات العرض" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "الإعدادات" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "56" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "ح" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "ن" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "ث" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "ر" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "خ" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "ج" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "س" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "الشهر السابق" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "الشهر التالي" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "أسبوع %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "طوال اليوم" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A، %-d %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A، %-d %B، %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "لا تنبيهات" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "لا أحداث" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "امسح" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "”‏%s“ لا يستجيب." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "ربما ترغب في الانتظار قليلا ليُكمِل أو إجبار التطبيق على الإنهاء كُلّية." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "أجبر الإنهاء" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "انتظر" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "وُصّل قرص خارجي" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "فُصل القرص الخارجي" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "افتح باستخدام %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "كلمة السرّ:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "أدخلها ثانية:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "اتصل" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "كلمة السرّ: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "المفتاح: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "كلمة سرّ المفتاح الخاص: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "التعريف: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "الخدمة: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "تتطلب الشبكة اللاسلكية الاستيثاق" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "كلمات السر أو مفاتيح التعمية مطلوبة للوصول إلى الشبكة اللاسلكية ”%s“." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "استيثاق 802.1X سلكي" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "اسم الشبكة: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "استيثاق اتصال DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "رمز PIN مطلوب" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "جهاز شبكة الهاتف المحمول يتطلب رمز PIN" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "كلمة سرّ شبكة الهاتف المحمول" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "كلمة السرّ مطلوبة للاتصال ب‍ ”%s“." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "مدير الشبكة" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "الاستيثاق مطلوب" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "المدير" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "استوثق" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "للأسف لم يُفلح هذا. أعِد المحاولة." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "غيّر %s اسمه إلى %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "النوافذ" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "أظهر التطبيقات" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "الشريط" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "أضف ساعات عالمية…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "ساعات عالمية" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "الطقس" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "اختر موقعا…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "يحمّل…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "اتصل بالإنترنت لمعلومات الطقس" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "معلومات الطقس غير متاحة حاليًا" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "خروج %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "خروج" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "سيُخرج %s تلقائيا الآن." +msgstr[1] "سيُخرج %s تلقائيا بعد ثانية." +msgstr[2] "سيُخرج %s تلقائيا بعد ثانيتين." +msgstr[3] "سيُخرج %s تلقائيا بعد %d ثوان." +msgstr[4] "سيُخرج %s تلقائيا بعد %d ثانية." +msgstr[5] "سيُخرج %s تلقائيا بعد %d ثانية." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "ستُخرج تلقائيا الآن." +msgstr[1] "ستُخرج تلقائيا بعد ثانية." +msgstr[2] "ستُخرج تلقائيا بعد ثانيتين." +msgstr[3] "ستُخرج تلقائيا بعد %d ثوان." +msgstr[4] "ستُخرج تلقائيا بعد %d ثانية." +msgstr[5] "ستُخرج تلقائيا بعد %d ثانية." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "اخرج" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "إطفاء الحاسوب" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "ثبّت التحديثات ثم أطفئ" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "سيُطفأ النظام تلقائيا الآن." +msgstr[1] "سيُطفأ النظام تلقائيا بعد ثانية." +msgstr[2] "سيُطفأ النظام تلقائيا بعد ثانيتين." +msgstr[3] "سيُطفأ النظام تلقائيا بعد %d ثوان." +msgstr[4] "سيُطفأ النظام تلقائيا بعد %d ثانية." +msgstr[5] "سيُطفأ النظام تلقائيا بعد %d ثانية." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "ثبّت تحديثات البرمجيات المعلّقة" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "أعِد التشغيل" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "أطفئ" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "إعادة التشغيل" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "سيُعاد تشغيل النظام تلقائيا الآن." +msgstr[1] "سيُعاد تشغيل النظام تلقائيا بعد ثانية." +msgstr[2] "سيُعاد تشغيل النظام تلقائيا بعد ثانيتين." +msgstr[3] "سيُعاد تشغيل النظام تلقائيا بعد %d ثوان." +msgstr[4] "سيُعاد تشغيل النظام تلقائيا بعد %d ثانية." +msgstr[5] "سيُعاد تشغيل النظام تلقائيا بعد %d ثانية." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "أعد التشغيل و ثبّت التحديثات" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "سيُعاد تشغيل النظام تلقائيا و تُثبت التحديثات الآن." +msgstr[1] "سيُعاد تشغيل النظام تلقائيا و تُثبت التحديثات بعد ثانية." +msgstr[2] "سيُعاد تشغيل النظام تلقائيا و تُثبت التحديثات بعد ثانيتين." +msgstr[3] "سيُعاد تشغيل النظام تلقائيا و تُثبت التحديثات بعد %d ثوان." +msgstr[4] "سيُعاد تشغيل النظام تلقائيا و تُثبت التحديثات بعد %d ثانية." +msgstr[5] "سيُعاد تشغيل النظام تلقائيا و تُثبت التحديثات بعد %d ثانية." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "أعد التشغيل ثم ثبّت" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ثبّت ثم أطفئ" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "أطفئ بعد تثبيت التحديثات" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "أعد التشغيل و ثبّت الترقية" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"ستُثبّت %s %s بعد إعادة التشغيل. قد يستغرق تثبيت الترقية بعض الوقت: تأكد من " +"الحفظ الاحتياطي، و توصيل الحاسوب بمقبس الطاقة." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "يعمل على طاقة البطارية: رجاءً وصّل بمقبس التيار قبل تثبيت التحديثات." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "بعض التطبيقات مشغولة أو تحتوي عملًا لم يُحفظ." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "مستخدمون آخرون والِجون" + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (عن بعد)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (طرفية)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "ثبت" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "هل تريد تنزيل و تثبيت ”%s“ من extensions.gnome.org؟" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "يريد %s تعطيل الاختصارات" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "يريد التطبيق تعطيل الاختصارات" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "يمكنك استعادة الاختصارات بضغط %s." + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "ارفض" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "اسمح" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "المفاتيح البطيئة مفعلة" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "المفاتيح البطيئة معطّلة" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"لقد ضغطت مفتاح Shift لثمان ثوان. هذا اختصار ميزة المفاتيح البطيئة المؤثّر على " +"طريقة عمل لوحة مفاتيحك." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "المفاتيح اللاصقة مفعلة" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "المفاتيح اللاصقة معطّلة" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"لقد نقرت مفتاح Shift خمس مرات متتالية. هذا اختصار ميزة المفاتيح اللاصقة " +"المؤثّر على طريقة عمل لوحة مفاتيحك." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"لقد ضغطت على مفتاحان في آن واحد أو نقرت مفتاح Shift خمس مرّات متتالية. يعطّل " +"هذا ميزة المفاتيح اللاصقة المؤثّر على طريقة عمل لوحة مفاتيحك." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "اتركه مفعّلا" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "شغّل" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "أوقف" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "اتركه معطّلا" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "إعدادات الإقليم و اللغة" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "لا امتدادات مثبّتة" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "لم يصدر %s أي خطأ." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "أخفِ الأخطاء" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "اظهر الأخطاء" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "مفعّل" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "معطّل" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "خطأ" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "قديم" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "ينزّل" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "اعرض المصدر" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "صفحة الوب" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "معلومات النظام" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "فنان غير معروف" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "عنوان غير معروف" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "شدة الصوت" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "تراجع" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "نظرة عامة" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "اكتب نصا للبحث عنه…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "اختصار جديد…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "التطبيقات معرّفة" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "اعرض المساعدة على الشاشة" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "بدّل الشاشة" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "أسند ضغطة مفتاح" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "تم" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "حرّر…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "لا شيء" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "اضغط زر للضبط" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "اضغط Esc للخروج" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "اضغط أي زر للخروج" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "أنْهِ" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "الأنشطة" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "النظام" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "الشريط العلوي" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "اكتب أمرًا" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "أغلِق" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "إعادة التشغيل غير متاحة على وايلاند" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "يُعيد التشغيل…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A، %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "لا رسائل جديدة" +msgstr[1] "رسالة جديدة" +msgstr[2] "رسالتين جديدتين" +msgstr[3] "%d رسائل جديدة" +msgstr[4] "%d رسالة جديدة" +msgstr[5] "%d رسالة جديدة" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "لا تنبيهات جديدة" +msgstr[1] "تنبيه جديد" +msgstr[2] "تنبيهين جديدين" +msgstr[3] "%d تنبيهات جديدة" +msgstr[4] "%d تنبيها جديدا" +msgstr[5] "%d تنبيه جديد" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "أوصِد" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "تحتاج جنوم إلى إيصاد الشاشة" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "تعذّر الإيصاد" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "منع تطبيق الإيصاد" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "يبحث…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "لا نتائج." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "لا مزيد" +msgstr[1] "%d أكثر" +msgstr[2] "%d أكثر" +msgstr[3] "%d أكثر" +msgstr[4] "%d أكثر" +msgstr[5] "%d أكثر" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "انسخ" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "ألصق" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "أظهر النص" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "أخفِ النص" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "كلمة السر" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "تذكر كلمة السر" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "الإتاحة" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "تقريب" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "قارئ الشاشة" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "لوحة مفاتيح على الشاشة" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "تنبيهات بصرية" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "مفاتيح لاصقة" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "مفاتيح بطيئة" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "مفاتيح لها صوت" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "مفاتيح الفأرة" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "تباين عال" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "نص كبير" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "بلوتوث" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "إعدادات بلوتوث" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d مُتصل" +msgstr[1] "%d مُتصل" +msgstr[2] "%d مُتصل" +msgstr[3] "%d مُتصل" +msgstr[4] "%d مُتصل" +msgstr[5] "%d مُتصل" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "مغلق" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "مفعّل" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "السطوع" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "لوحة المفاتيح" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "أظهر تخطيط لوحة المفاتيح" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "التموضع مفعّل" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "عطّل" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "إعدادات الخصوصية" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "التموضع مستخدم" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "التموضع غير مفعّل" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "فعّل" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "أتريد إعطاء %s صلاحية معرفة مكانك؟" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "يمكن تغيير صلاحيات الوصول لمكانك في أي وقت من إعدادات الخصوصية." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "<غير معروفة>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "‏%s مغلق" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "‏%s مُتصل" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "‏%s غير مُدار" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "‏%s يقطع الاتّصال" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "‏%s يتّصل" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "يتطلب %s استيثاق" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "برمجيات %s المغروسة (Firmware) غير متاحة" + +#. 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "‏%s غير متاح" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "فشل اتصال %s" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "إعدادات الاتصال السلكي" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "إعدادات شبكة الهاتف المحمول" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "عتاد %s مُعَطَّل" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "‏%s معطّل" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "اتصل بالإنترنت" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "وضع الطائرة مُفعّل" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "الاتصال اللاسلكي مُعطّل في وضع الطائرة." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "عطّل وضع الطائرة" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "الاتصال اللاسلكي مغلق" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "تحتاج إلى تشغيل الاتصال اللاسلكي للاتصال بالشبكة." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "شغّل الاتصال اللاسلكي" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "الشبكات اللاسلكية" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "اختر شبكة" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "لا شبكات" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "استخدم زر العتاد للإغلاق" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "اختر شبكة" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "إعدادات الاتصال اللاسلكي" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "نقطة اتصال %s نشطة" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "‏%s غير متّصل" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "يتّصل…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "الاستيثاق مطلوب" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "فشل الاتصال" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "إعدادات VPN" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "‏VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "‏VPN مُطفأ" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "إعدادات الشّبكة" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "اتصال سلكي" +msgstr[1] "اتصال سلكي" +msgstr[2] "اتصاليْن سلكيِّيْن" +msgstr[3] "%s اتصالات سلكية" +msgstr[4] "%s اتصالًا سلكيًا" +msgstr[5] "%s اتصال سلكي" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "اتصال لاسكلي" +msgstr[1] "اتصال لاسكلي" +msgstr[2] "اتصاليْن لاسكليِّيْن" +msgstr[3] "%s اتصالات لاسكلية" +msgstr[4] "%s اتصالًا لاسكليًا" +msgstr[5] "%s اتصال لاسكلي" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "اتصال مودم" +msgstr[1] "اتصال مودم" +msgstr[2] "اتصاليْ مودم" +msgstr[3] "‏%s اتصالات مودم" +msgstr[4] "‏%s اتصال مودم" +msgstr[5] "‏%s اتصال مودم" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "فشل الاتصال" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "فشل تفعيل اتصال الشبكة" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "الإضاءة الليلية موقفة" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "الإضاءة الليلية مفعّلة" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "استكمل" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "أوقف حتى الغد" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "إعدادات الطاقة" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "مشحونة بالكامل" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "لا تُشحن" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "يَحسِب…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "بقي %d:%02d ‏(%d٪)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "بقي على الاكتمال %d:%02d ‏(%d٪)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d ٪" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "تجري مشاركة الشاشة" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "أوقف" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "وضع الطائرة مُفعّل" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "بدّل المستخدم" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "اخرج" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "إعدادات الحساب" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "قفل الاتجاه" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "علّق" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "أطفئ الحاسوب" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "ثندربُلت" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "جهاز ثندربُلت غير معروف" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"وصّل جهاز جديد و أنت غير موجود. رجاء أفصل الجهاز ثم أوصله لتستطيع استخدامه." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "جهاز ثندربُلت غير مخوّل" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "اكتُشف جهاز جديد وعلى مدير النظام تخويله." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "عطل أثناء تخويل ثندربُلت" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "تعذّر تخويل جهاز ثندربُلت: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "تغيّرت شدة الصوت" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "طابق" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "ضم الشاشات" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "الخارجية فقط" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "المدمجة فقط" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "لِج كمستخدم آخر" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "افتح قفل النافذة" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "التطبيقات" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "ابحث" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "‏”%s“ جاهز" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "أتريد الإبقاء على هذه الإعدادات؟" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "تراجع عن الإعدادات" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "أبق على التغييرات" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "سيُتراجع عن التغييرات الآن" +msgstr[1] "سيُتراجع عن التغييرات بعد ثانية" +msgstr[2] "سيُتراجع عن التغييرات بعد ثانيتين" +msgstr[3] "سيُتراجع عن التغييرات بعد %d ثوان" +msgstr[4] "سيُتراجع عن التغييرات بعد %d ثانية" +msgstr[5] "سيُتراجع عن التغييرات بعد %d ثانية" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "صغّر" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "ألغِ التكبير" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "كبّر" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "انقل" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "غيّر الحجم" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "انقل شريط العنوان على الشاشة" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "دائما في القمّة" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "دائما على مساحة العمل المرئية" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "انقل لمساحة العمل على اليسار" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "انقل لمساحة العمل على اليمين" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "انقل لمساحة العمل لأعلى" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "انقل لمساحة العمل لأسفل" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "انقل للشاشة الأعلى" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "انقل للشاشة الأسفل" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "انقل للشاشة اليسرى" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "انقل للشاشة اليمنى" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "تقويم إيفُليوشِن" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "اطبع الإصدارة" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "الوضع الذي يستخدمه مدير ولوج جنوم لشاشة الولوج" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "استخدم طورا معينا، مثلا: ”gdm“ لشاشة الولوج" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "اسرد كل الأطوار الممكنة" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "غير معروف" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "فشل تشغيل ”%s“" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "لا تتطابق كلمتا السر." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "لا يمكن أن تكون كلمة السرّ فارغة" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "أغلق المستخدم مربع الاستيثاق الحِواري" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "لا مخرَج" +msgstr[1] "مخرَج واحد" +msgstr[2] "مخرَجين" +msgstr[3] "%u مخارج" +msgstr[4] "%u مخرجا" +msgstr[5] "%u مخرج" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "لا مدخل" +msgstr[1] "مدخل واحد" +msgstr[2] "مدخلين" +msgstr[3] "%u مداخل" +msgstr[4] "%u مدخلا" +msgstr[5] "%u مدخل" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "أصوات النظام" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "حدث خطأ أثناء تشغيل حوار تفضيلات %s‏:" + +#~ msgid "%s all day." +#~ msgstr "%s طوال اليوم." + +#~ msgid "%s, then %s later." +#~ msgstr "%s، ثم %s فيما بعد." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s، ثم %s، و بعدها %s." + +#~ msgid "Feels like %s." +#~ msgstr "تبدو مثل %s." + +#~ 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 "أخفِ الصينية" + +#~ msgid "Status Icons" +#~ msgstr "أيقونات الحالة" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "تفضيلات امتدادات صدفة جنوم" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "إعادة توجيه استيثاق عبر الوب" + +#~ msgid "Events" +#~ msgstr "الأحداث" + +#~ msgid "Notifications" +#~ msgstr "التنبيهات" + +#~ msgid "Clear section" +#~ msgstr "امسح القسم" + +#~ msgid "Media" +#~ msgstr "وسائط" + +#~ msgid "Not In Use" +#~ msgstr "غير مستخدم" + +#~ msgid "%d x %d" +#~ msgstr "%d × %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "اعرض تاريخ الأسبوع في التقويم" + +#~ msgid "Use as Internet connection" +#~ msgstr "استخدمه اتّصالًا بالإنترنت" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "يطلب %s صلاحية معرفة مكانك." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "صدفة جنوم (وايلاند)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "لا أجهزة موصّلة" +#~ msgstr[1] "جهاز واحد موصّل" +#~ msgstr[2] "جهازين موصّلين" +#~ msgstr[3] "%d أجهزة موصّلة" +#~ msgstr[4] "%d جهازًا موصّلا" +#~ msgstr[5] "%d جهاز موصّل" + +#~ msgid "Authentication required" +#~ msgstr "الاستيثاق مطلوب" + +#~ msgid "UPS" +#~ msgstr "مزود طاقة لا منقطعة (UPS)" + +#~ msgid "Battery" +#~ msgstr "البطارية" + +#~ msgid "Airplane Mode" +#~ msgstr "وضع الطائرة" + +#~ msgid "Show the message tray" +#~ msgstr "أظهر لوحة الرسائل" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l:%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "الأحد" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "الاثنين" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "الثلاثاء" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "الأربعاء" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "الخميس" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "الجمعة" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "السبت" + +#~ msgid "Nothing Scheduled" +#~ msgstr "الجدول خال" + +#~ msgid "Today" +#~ msgstr "اليوم" + +#~ msgid "Tomorrow" +#~ msgstr "غدا" + +#~ msgid "This week" +#~ msgstr "هذا الأسبوع" + +#~ msgid "Next week" +#~ msgstr "الأسبوع القادم" + +#~ msgid "Removable Devices" +#~ msgstr "الأجهزة المنفصلة" + +#~ msgid "Eject" +#~ msgstr "أخرج" + +#~ msgid "Invitation" +#~ msgstr "دعوة" + +#~ msgid "Call" +#~ msgstr "اتصال" + +#~ msgid "File Transfer" +#~ msgstr "نقل ملفات" + +#~ msgid "Chat" +#~ msgstr "دردشة" + +#~ msgid "Unmute" +#~ msgstr "أطلِق الصوت" + +#~ msgid "Mute" +#~ msgstr "أصمِت" + +#~ msgid "Invitation to %s" +#~ msgstr "دعوة إلى %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "يدعوك %s للانضمام إلى %s" + +#~ msgid "Decline" +#~ msgstr "أرفُض" + +#~ msgid "Accept" +#~ msgstr "أقْبَل" + +#~ msgid "Video call from %s" +#~ msgstr "مكالمة فيديو من %s" + +#~ msgid "Call from %s" +#~ msgstr "مكالمة من %s" + +#~ msgid "Answer" +#~ msgstr "أجب" + +#~ msgid "%s is sending you %s" +#~ msgstr "‏%s يرسل لك %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "يريد %s الإذن ليعرف عندما تكون متصلا" + +#~ msgid "Authentication failed" +#~ msgstr "فشل الاستيثاق" + +#~ msgid "Encryption error" +#~ msgstr "فشل التعمية" + +#~ msgid "Certificate not provided" +#~ msgstr "الشهادة غير متوفرة" + +#~ msgid "Certificate untrusted" +#~ msgstr "الشهادة غير موثوقة" + +#~ msgid "Certificate expired" +#~ msgstr "الشهادة منتهية الصلاحية" + +#~ msgid "Certificate not activated" +#~ msgstr "الشهادة غير مفعلة" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "الشهادة غير متوافقة مع اسم المستضيف" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "بصمة الشهادة غير متطابقة" + +#~ msgid "Certificate self-signed" +#~ msgstr "الشهادة موقعة ذاتيا" + +#~ msgid "Status is set to offline" +#~ msgstr "الحالة مضبوطة إلى غير متصل" + +#~ msgid "Certificate is invalid" +#~ msgstr "الشهادة غير صالحة" + +#~ msgid "Connection has been refused" +#~ msgstr "رُفض الاتصال" + +#~ msgid "Connection can't be established" +#~ msgstr "تعذر إنشاء الاتصال" + +#~ msgid "Connection has been lost" +#~ msgstr "فُقد الاتصال" + +#~ msgid "This account is already connected to the server" +#~ msgstr "هذا الحساب متصل بالخادوم بالفعل" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "تم تبديل الاتصال باتصال جديد باستخدام نفس المورد" + +#~ msgid "The account already exists on the server" +#~ msgstr "الحساب موجود بالفعل في الخادوم" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "الخادوم مشغول للغاية حاليًا ولا يستطيع التعامل مع الاتصال" + +#~ msgid "Certificate has been revoked" +#~ msgstr "نُقِضت الشهادة" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "تستخدم الشهادة خوارزمية تعمية غير آمنة أو ضعيفة" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "طول شهادة الخادم أو طول سلسلة الشهادات إلى الخادم تجاوز الحد الذي تفرضه " +#~ "مكتبة التعمية" + +#~ msgid "Internal error" +#~ msgstr "خطأ داخلي" + +#~ msgid "Unable to connect to %s" +#~ msgstr "تعذّر الاتصال مع %s" + +#~ msgid "View account" +#~ msgstr "أظهر الحساب" + +#~ msgid "Open Calendar" +#~ msgstr "افتح التقويم" + +#~ msgid "Date & Time Settings" +#~ msgstr "إعدادات الوقت و التّاريخ" + +#~ msgid "Open" +#~ msgstr "افتح" + +#~ msgid "Remove" +#~ msgstr "أزِل" + +#~ msgid "Clear Messages" +#~ msgstr "امسح الرسائل" + +#~ msgid "Notification Settings" +#~ msgstr "إعدادات التنبيهات" + +#~ msgid "Tray Menu" +#~ msgstr "قائمة الصينية" + +#~ msgid "No Messages" +#~ msgstr "لا رسائل" + +#~ msgid "Message Tray" +#~ msgstr "لوحة الرسائل" + +#~ msgid "Extension" +#~ msgstr "امتداد" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "اختر امتدادا لضبطه من القائمة أعلاه." + +#~ msgid "unavailable" +#~ msgstr "غير متاح" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l:%M\\u2009%p" + +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgid "%A, %H\\u2236%M" +#~ msgstr "%A، %H\\u2236%M" + +#~ msgid "%B %d, %H\\u2236%M" +#~ msgstr "%d %B، %H\\u2236%M" + +#~ msgid "%B %d %Y, %H\\u2236%M" +#~ msgstr "%d %B %Y، %H\\u2236%M" + +#~ msgid "%l\\u2236%M %p" +#~ msgstr "%H\\u2236%M" + +#~ msgid "%A, %l\\u2236%M %p" +#~ msgstr "%A، %l\\u2236%M %p" + +#~ msgid "%B %d, %l\\u2236%M %p" +#~ msgstr "%d %B، %l\\u2236%M %p" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A، %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d %B، %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d %B %Y، %H:%M " + +#~ msgid "Settings Menu" +#~ msgstr "قائمة الإعدادات" + +#~ msgid "Authorization request from %s" +#~ msgstr "طلب تخويل من %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "يريد الجهاز %s المزاوجة مع هذا الحاسوب" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "يريد الجهاز %s صلاحية الوصول للخدمة '%s'" + +#~ msgid "Grant this time only" +#~ msgstr "امنح هذه المرة فقط" + +#~ msgid "Reject" +#~ msgstr "ارفض" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "تأكيد مزاوجة %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "من فضلك أكد تطابق مفتاح السر '%06d' مع الموجود على الجهاز." + +#~ msgid "Matches" +#~ msgstr "مطابق" + +#~ msgid "Does not match" +#~ msgstr "غير مطابق" + +#~ msgid "Pairing request for %s" +#~ msgstr "طلب مزاوجة من %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "من فضلك أدخل الرقم المذكور على الجهاز." + +#~ msgid "OK" +#~ msgstr "حسنا" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "عذرًا, لا حكمة لك اليوم:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "يقول الحكيم %s" + +#~ msgid "Screenshots" +#~ msgstr "لقطات الشاشة" + +#~ msgid "Record a screencast" +#~ msgstr "سجّل فديو للشاشة" + +#~ msgid "Session" +#~ msgstr "الجلسة" + +#~ msgid "Power" +#~ msgstr "الطاقة" + +#~ msgid "Restart" +#~ msgstr "أعِد التشغيل" + +#~ msgid "Screencast from %d %t" +#~ msgstr "تسجيل شاشة من %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "انقر على \"اخرج\" لغلق هذه التطبيقات والخروج من النظام." + +#~ msgid "Logging out of the system." +#~ msgstr "يخرج من النظام." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "انقر على \"أطفئ\" لغلق هذه التطبيقات وإطفاء النظام." + +#~ msgid "Powering off the system." +#~ msgstr "يُطفأ النظام." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "انقر على \"أعِد التشغيل\" لغلق هذه التطبيقات وإعادة تشغيل النظام." + +#~ msgid "Restarting the system." +#~ msgstr "يُعاد تشغيل النظام." + +#~ msgid "Volume, network, battery" +#~ msgstr "الصوت، الشبكة، البطارية" + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "إغلاق الحاسوب قد يتسبب في فقدانهم للعمل غير المحفوظ." + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "ما إذا كنت ترغب في تجميع الحالات عن استخدام التطبيقات" + +#~ msgid "Universal Access Settings" +#~ msgstr "إعدادات الإتاحة" + +#~ msgid "Visibility" +#~ msgstr "الرؤية" + +#~ msgid "Set Up a New Device…" +#~ msgstr "اضبط جهازًا جديدًا…" + +#~ msgid "Send Files…" +#~ msgstr "أرسل ملفات…" + +#~ msgid "Keyboard Settings" +#~ msgstr "إعدادات لوحة المفاتيح" + +#~ msgid "Mouse Settings" +#~ msgstr "إعدادات الفأرة" + +#~ msgid "disabled" +#~ msgstr "مُعَطَّل" + +#~ msgid "cable unplugged" +#~ msgstr "الكبل مفصول" + +#~ msgid "More…" +#~ msgstr "المزيد…" + +#~ msgid "Wired" +#~ msgstr "سلكي" + +#~ msgid "Auto Ethernet" +#~ msgstr "إيثرنت تلقائي" + +#~ msgid "Auto broadband" +#~ msgstr "شبكة هاتف محمول تلقائية" + +#~ msgid "Auto dial-up" +#~ msgstr "اتصال هاتفي تلقائي" + +#~ msgid "Auto %s" +#~ msgstr "‏%s تلقائي" + +#~ msgid "Auto bluetooth" +#~ msgstr "بلوتوث تلقائي" + +#~ msgid "Auto wireless" +#~ msgstr "لاسلكي تلقائي" + +#~ msgid "Wi-Fi" +#~ msgstr "واي فاي" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "بقي أقل من ساعة" +#~ msgstr[1] "بقيت ساعة" +#~ msgstr[2] "بقيت ساعتان" +#~ msgstr[3] "بقيت %d ساعات" +#~ msgstr[4] "بقيت %d ساعة" +#~ msgstr[5] "بقيت %d ساعة" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "بقي %d %s و%d %s" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ساعة" +#~ msgstr[1] "ساعة" +#~ msgstr[2] "ساعتان" +#~ msgstr[3] "ساعات" +#~ msgstr[4] "ساعة" +#~ msgstr[5] "ساعة" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "دقيقة" +#~ msgstr[1] "دقيقة" +#~ msgstr[2] "دقيقتان" +#~ msgstr[3] "دقائق" +#~ msgstr[4] "دقيقة" +#~ msgstr[5] "دقيقة" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "بقي أقل من دقيقة" +#~ msgstr[1] "بقيت دقيقة" +#~ msgstr[2] "بقيت دقيقتان" +#~ msgstr[3] "بقيت %d دقائق" +#~ msgstr[4] "بقيت %d دقيقة" +#~ msgstr[5] "بقيت %d دقيقة" + +#~ msgid "AC Adapter" +#~ msgstr "مقبس طاقة" + +#~ msgid "Laptop Battery" +#~ msgstr "بطارية حاسوب" + +#~ msgid "Monitor" +#~ msgstr "شاشة" + +#~ msgid "Mouse" +#~ msgstr "فأرة" + +#~ msgid "PDA" +#~ msgstr "مساعد رقمي (PDA)" + +#~ msgid "Cell Phone" +#~ msgstr "هاتف محمول" + +#~ msgid "Media Player" +#~ msgstr "مشغل وسائط" + +#~ msgid "Tablet" +#~ msgstr "لوحي" + +#~ msgid "Computer" +#~ msgstr "حاسوب" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "غير معروف" + +#~ msgid "Available" +#~ msgstr "متفرّغ" + +#~ msgid "Busy" +#~ msgstr "مشغول" + +#~ msgid "Invisible" +#~ msgstr "خفي" + +#~ msgid "Away" +#~ msgstr "غائب" + +#~ msgid "Idle" +#~ msgstr "ساكن" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "ستُجعل حالة اتصالك ”مشغول“" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "التنبيهات معطلة الآن، بما فيها رسائل المحادثة. حالة اتصالك تغيرت حتى يعلم " +#~ "الآخرون أنك قد لا ترى رسائلهم." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "ادخل" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "tray" +#~ msgstr "لوحة النظام" + +#~ msgid "More..." +#~ msgstr "المزيد..." + +#~ msgid "United Kingdom" +#~ msgstr "المملكة المتحدة" + +#~ msgid "Default" +#~ msgstr "المبدئي" + +#~ msgid "APPLICATIONS" +#~ msgstr "التطبيقات" + +#~ msgid "SETTINGS" +#~ msgstr "الإعدادات" + +#~ msgid "Subscription request" +#~ msgstr "طلب اشتراك" + +#~ msgid "Sent at %X on %A" +#~ msgstr "أُرسلت يوم %A الساعة %l:%M" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "أُرْسِلت يوم %A، %d %B، %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "فشل الاتصال ب‍ %s" + +#~ msgid "Reconnect" +#~ msgstr "أعد الاتصال" + +#~ msgid "Browse Files..." +#~ msgstr "تصفح الملفات..." + +#~ msgid "Error browsing device" +#~ msgstr "حدث عطل أثناء تصفّح الجهاز" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "تعذّر تصفح الجهاز، رسالة العطل '%s'" + +#~ msgid "Wireless" +#~ msgstr "لاسلكي" + +#~ msgid "VPN Connections" +#~ msgstr "اتصالات VPN" + +#~ msgid "System Settings" +#~ msgstr "إعدادات النظام" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "فشل فصْل '%s'" + +#~ msgid "Retry" +#~ msgstr "أعد المحاولة" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "الأماكن والأجهزة" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "اتّصل ب‍..." + +#~ msgid "Passphrase" +#~ msgstr "عبارة السر" + +#~ msgid "%s is online." +#~ msgstr "‏%s متّصل." + +#~ msgid "%s is offline." +#~ msgstr "‏%s غير متّصل." + +#~ msgid "%s is away." +#~ msgstr "‏%s غائب." + +#~ msgid "%s is busy." +#~ msgstr "‏%s مشغول." + +#~ msgctxt "contact" +#~ msgid "Unknown" +#~ msgstr "غير معروف" + +#~ msgid "CONTACTS" +#~ msgstr "المتراسلون" + +#~ msgid "Show time with seconds" +#~ msgstr "اعرض الوقت بالثواني" + +#~ msgid "If true, display seconds in time." +#~ msgstr "إذا كان صحيحًا، ستعرض الثواني في الوقت." + +#~ msgid "Show date in clock" +#~ msgstr "اعرض التاريخ في الساعة" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "إذا كان صحيحًا، سيعرض في الساعة التاريخ بالإضافة إلى الوقت." + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%A %e %B، %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%A %e %B، %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%A %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%A %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%A %e %B، %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%A %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "كلمة السرّ خاطئة، من فضلك أعد المحاولة" + +#~ msgid "Hidden" +#~ msgstr "مخفي" + +#~ msgid "Power Off..." +#~ msgstr "أطفئ..." + +#~ msgid "Online Accounts" +#~ msgstr "الحسابات المتصلة" + +#~ msgid "Log Out..." +#~ msgstr "اخرج..." + +#~ msgid "RECENT ITEMS" +#~ msgstr "العناصر الحديثة" + +#~ msgid "Localization Settings" +#~ msgstr "إعدادات اللغة" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "صرت الآن متّصلا بشبكة الهاتف المحمول '%s'" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "صرت الآن متّصلا بالشبكة اللاسلكية '%s'" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "صرت الآن متّصلا بالشبكة السلكية '%s'" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "صرت الآن متّصلا بشبكة ش‌خ‌ف '%s'" + +#~ msgid "%s has finished starting" +#~ msgstr "انتهى %s من البدء" + +#~ msgid "Less than a minute ago" +#~ msgstr "منذ أقل من دقيقة" + +#~ msgid "Home Folder" +#~ msgstr "مجلد المنزل" + +#~ msgid "Shut Down" +#~ msgstr "أطفئ" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "انقر على \"أطفئ\" لغلق هذه التطبيقات وإطفاء النظام." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "سيُطفأ النظام تلقائيا خلال %d ثوان." + +#~ msgid "Shutting down the system." +#~ msgstr "يُغلق النظام." + +#~ msgid "Confirm" +#~ msgstr "أكّد" + +#~ msgid "PREFERENCES" +#~ msgstr "التفضيلات" + +#~ msgid "Shut Down..." +#~ msgstr "أطفئ..." + +#~ msgid "Search your computer" +#~ msgstr "ابحث في حاسوبك" + +#~ msgid "Bluetooth Agent" +#~ msgstr "عميل بلوتوث" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "تعذّر إضافة مساحة عمل جديدة، لتجاوز أقصى عدد من مساحات العمل." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "لا يمكن حذف مساحة العمل الأولى." + +#~ msgid "Customize the panel clock" +#~ msgstr "طوّع ساعة اللوحة" + +#~ msgid "Clock Preferences" +#~ msgstr "تفضيلات الساعة" + +#~ msgid "_12 hour format" +#~ msgstr "نسق _12 ساعة" + +#~ msgid "_24 hour format" +#~ msgstr "نسق _24 ساعة" + +#~ msgid "Drag here to add favorites" +#~ msgstr "اسحب إلى هنا ليضاف إلى المفضّلة" + +#~ msgid "Find" +#~ msgstr "ابحث" + +#~ msgid "Preferences" +#~ msgstr "التفضيلات" + +#~ msgid "System Preferences..." +#~ msgstr "تفضيلات النظام..." + +#~ msgid "Recent Documents" +#~ msgstr "المستندات الحديثة" + +#~ msgid "(see all)" +#~ msgstr "(انظر الكل)" + +#~ msgid "PLACES" +#~ msgstr "الأماكن" + +#~ msgid "SEARCH RESULTS" +#~ msgstr "نتائج البحث" + +#~ msgid "Can't lock screen: %s" +#~ msgstr "تعذّر إيصاد الشاشة: %s" + +#~ msgid "Can't temporarily set screensaver to blank screen: %s" +#~ msgstr "تعذّر ضبك حافظة الشاشة مؤقتا لتكون شاشة خالية: %s" + +#~ msgid "Can't logout: %s" +#~ msgstr "تعذّر الخروج: %s" + +#~ msgid "Sidebar" +#~ msgstr "الشريط الجانبي" + +#~ msgid "Browse" +#~ msgstr "استعرض" diff --git a/po/as.po b/po/as.po new file mode 100644 index 0000000..157499a --- /dev/null +++ b/po/as.po @@ -0,0 +1,2396 @@ +# Assamese translation for gnome-shell. +# Copyright (C) 2011 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# ngoswami , 2011. +# Nilamdyuti Goswami , 2011, 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-15 07:36+0000\n" +"PO-Revision-Date: 2014-09-15 14:59+0530\n" +"Last-Translator: Nilamdyuti Goswami \n" +"Language-Team: Assamese \n" +"Language: as\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: Lokalize 1.5\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "চিস্টেম" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "বাৰ্তা ট্ৰে দেখুৱাওক" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "সক্ৰিয় অধিসূচনাত ফকাচ কৰক" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "অভাৰভিউ দেখুৱাওক" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "সকলো এপ্লিকেচন দেখুৱাওক" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "এপ্লিকেচন মেনু খোলক" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME শ্বেল" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "উইন্ডো ব্যৱস্থাপনা আৰু এপ্লিকেচনৰ লঞ্চ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME শ্বেল সম্প্ৰসাৰন পছন্দসমূহ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME শ্বেল সম্প্ৰসাৰনসমূহ সংৰূপণ কৰক" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME শ্বেল (wayland compositor)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Alt-F2 ৰ পৰা উন্নয়নকাৰী আৰু পৰীক্ষকসমূহৰ কাৰণে লাভদায়ক অভ্যন্তৰীক সঁজুলিসমূহ " +"সামৰ্থবান " +"কৰক" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 ডাইলগ ব্যৱহাৰ কৰি অভ্যন্তৰীক ডিবাগিং আৰু মনিটৰিং সঁজুলিসমূহলে অভিগমৰ " +"অনুমতি " +"দিয়ে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "সামৰ্থবান কৰিব লগিয়া সম্প্ৰসাৰণসমূহৰ UUIDs" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME শ্বেল সম্প্ৰসাৰণসমূহৰ এটা UUID বৈশিষ্ট্য আছে; এই কি'য়ে ল'ড হব লগিয়া " +"সমপ্ৰসাৰণসমূহ তালিকাভুক্ত কৰে। যিকোনো সম্প্ৰসাৰন যি ল'ড হব বিচাৰে এই তালিকাত " +"থাকিব " +"লাগিব। আপুনি এই তালিকাক org.gnome.Shell ত EnableExtension আৰু " +"DisableExtension " +"D-Bus পদ্ধতিৰ সৈতে সলনি কৰিব পাৰিব।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "সম্প্ৰসাৰন সংস্কৰণ সংগতাৰ বৈধতাক অসামৰ্থবান কৰে" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME শ্বেলে কেৱল বৰ্তমান চলি থকা সংস্কৰণক সমৰ্থন কৰা সম্প্ৰসাৰনসমূহ ল'ড " +"কৰিব। এই " +"বিকল্প সামৰ্থবান কৰিলে এই নিৰীক্ষণ অসামৰ্থবান কৰা হব আৰু সিহতে সমৰ্থন কৰা " +"সংস্কৰণসমূহৰ নিৰপেক্ষে সকলো সম্প্ৰসাৰন ল'ড কৰিব।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "পছন্দৰ এপ্লিকেচনসমূহৰ কাৰণে ডেস্কটপ ফাইল IDসমূহৰ তালিকা" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"এই পৰিচয়কসমূহৰ লগত আনুষংগিক এপ্লিকেচনসমূহ পছন্দৰ স্থানত প্ৰদৰ্শীত কৰা হব।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "এপ পিকাৰ দৰ্শন" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "এপ্লিকেচন পিকাৰত বৰ্তমানে নিৰ্বাচিত দৰ্শনৰ সূচী।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "কমান্ড (Alt-F2) ডাইলগৰ কাৰণে ইতিহাস" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "চোৱা কাঁচ ডাইলগৰ কাৰণে ইতিহাস" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "ব্যৱহাৰকাৰী মেনুত 'লগ আউট' মেনু আইটেম সদায় দেখুৱাব।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"এই কি'য়ে এটা-ব্যৱহাৰকাৰী, এটা-অধিবেশন অৱস্থাবোৰত 'লগ আউট' মেনুআইটেম " +"স্বচালিতভাৱে " +"লুকুৱা অভাৰৰাইড কৰে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"ইনক্ৰিপ্টেড অথবা দূৰৱৰ্তী ফাইলচিস্টেমসমূহ মাউণ্ট কৰাৰ বাবে পাছৱৰ্ড মনত ৰখা হব " +"নে" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"শ্বেলে এটা পাছৱৰ্ড অনুৰোধ কৰিব যেতিয়া এটা ইনক্ৰিপ্টেড ডিভাইচ অথবা এটা " +"দূৰৱৰ্তী " +"ফাইলচিস্টেম মাউণ্ট কৰা হয়। যদি পাছৱৰ্ডক ভৱিষ্যত ব্যৱহাৰৰ বাবে সংৰক্ষণ কৰিব " +"পাৰি " +"তেন্তে এটা 'পাছৱৰ্ড মনত ৰাখক' চেকবাকচ উপস্থিত থাকিব। এই কি'য়ে চেকবাকচৰ " +"অবিকল্পিত " +"অৱস্থা সংহতি কৰে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "কেলেন্ডাৰত সপ্তাহৰ তাৰিখ দেখুৱাওক" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "যদি সত্য, ISO সপ্তাহ তাৰিখক কেলেণ্ডাৰত দেখুৱাওক।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "এপ্লিকেচন মেনু খোলিবলে Keybinding" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "এপ্লিকেচন মেনু খোলিবলে Keybinding।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"এপ্লিকেচনসমূহ দেখুৱাওক\" দৰ্শন খোলিবলে কি'বাইণ্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"কাৰ্য্যসমূহ অভাৰভিউৰ \"এপ্লিকেচনসমূহ দেখুৱাওক\" দৰ্শন খোলিবলে কি'বাইণ্ডিং।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "অভাৰভিউ খোলিবলে কি'বাইণ্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "কাৰ্য্যসমূহ অভাৰভিউ খোলিবলে কি'বাইণ্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "বাৰ্তা ট্ৰেৰ দৃশ্যমানতা টগ'ল কৰিবলে Keybinding" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "বাৰ্তা ট্ৰেৰ দৃশ্যমানতা টগ'ল কৰিবলে Keybinding।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "সক্ৰিয় অধিসূচনা ফকাচ কৰিবলে কি'বাইণ্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "সক্ৰিয় অধিসূচনা ফকাচ কৰিবলে কি'বাইণ্ডিং।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"কিবাইন্ডিং যি সকলো চলি থকা টুইনক বিৰাম দিয়ে আৰু চলায়, ডিবাগিং কাৰণসমূহৰ বাবে " + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "কোনটো কিবৰ্ড ব্যৱহাৰ কৰা হব" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "ব্যৱহাৰ কৰিব লগিয়া কিবৰ্ডৰ ধৰণ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "চুইচাৰক বৰ্তমান কাৰ্য্যস্থানলৈ সীমিত ৰাখক।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"যদি সত্য, কেৱল বৰ্তমান কাৰ্য্যস্থানক উইন্ডো থকা এপ্লিকেচনসমূক চুইচাৰত দেখুৱা " +"হব। নহলে, " +"সকলো এপ্লিকেচন অন্তৰ্ভুক্ত কৰা হয়।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "এপ্লিকেচন আইকন অৱস্থা।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"চুইচাৰত উইন্ডোসমূহ কেনেধৰণে দেখুৱা হয় সংৰূপণ কৰে। বৈধ সম্ভাবনাসমূহ হল " +"'thumbnail-" +"only' (উইন্ডোৰ এটা থাম্বনেইল দেখুৱায়), 'app-icon-only' (কেৱল এপ্লিকেচন আইকন " +"দেখুৱায়) অথবা 'both'।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"যদি সত্য, কেৱল বৰ্তমান কাৰ্য্যস্থানৰ পৰা উইন্ডোসমূহক চুইচাৰত দেখুৱা হব। নহলে, " +"সকলো " +"উইন্ডো অন্তৰ্ভুক্ত কৰা হব।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "মডাল ডাইলগ উপধায়ক উইন্ডোৰ সৈতে সংলগ্ন কৰক" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "GNOME শ্বেল চলাওতে এই কি'য়ে org.gnome.mutter ত থকা কি' অভাৰৰাইড কৰে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "উইন্ডোসমূহক পৰ্দাৰ প্ৰান্তসমূহত এৰোতে প্ৰান্ত টাইলিং সামৰ্থবান কৰক" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "কাৰ্য্যস্থানসমূহক চলমানভাৱে ব্যৱস্থাপনা কৰা হয়" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "কাৰ্য্যস্থানসমূহ কেৱল প্ৰাথমিক মনিটৰত" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"বিলম্বৰ ফকাচ মাউছ অৱস্থাত পৰিবৰ্তন হয় যেতিয়ালৈকে পইন্টাৰে গমন কৰা বন্ধ নকৰে" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "কেপটিভ পৰ্টেল" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s ৰ বাবে পছন্দসমূহ ডাইলগ ল'ড কৰোতে এটা ত্ৰুটি হৈছিল:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "GNOME শ্বেল সম্প্ৰসাৰনসমূহ" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "বাতিল কৰক" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "পৰৱৰ্তী" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "আনলক কৰক" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "ছাইন ইন কৰক" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "অধিবেশন বাছক" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "তালিকাভুক্ত নহয়?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(উদাহৰণ, ব্যৱহাৰকাৰী অথবা %s)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "ব্যৱহাৰকাৰীৰ নাম: " + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "লগিন উইন্ডো" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "প্ৰমাণীকৰণ ত্ৰুটি" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(অথবা আঙুলি স্বাইপ কৰক)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "কমান্ড পোৱা নগল" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "কমান্ড বিশ্লেষন কৰিব নোৱাৰি:" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” ৰ প্ৰেৰণ ব্যৰ্থ হল:" + +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "ৱেব প্ৰমাণীকৰণৰ পুনৰনিৰ্দেশ" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "সঘনে ব্যৱহাৰ কৰা এপ্লিকেচনসমূহ ইয়াত উপস্থিত হব" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "সঘন" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "সকলো" + +#: ../js/ui/appDisplay.js:1789 +msgid "New Window" +msgstr "নতুন উইন্ডো" + +#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "পছন্দৰ পৰা আতৰাওক" + +#: ../js/ui/appDisplay.js:1821 +msgid "Add to Favorites" +msgstr "পছন্দলে যোগ কৰক" + +#: ../js/ui/appDisplay.js:1830 +msgid "Show Details" +msgstr "বিৱৰণসমূহ দেখুৱাওক" + +#: ../js/ui/appFavorites.js:124 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ক আপোনাৰ পছন্দলে যোগ কৰা হৈছে।" + +#: ../js/ui/appFavorites.js:158 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s ক আপোনাৰ পছন্দৰ পৰা আতৰোৱা হৈছে।" + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "সংহতিসমূহ" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "পটভূমি পৰিবৰ্তন কৰক…" + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "গোটেই দিনটো" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "Su" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "M" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "T" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "W" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "Th" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "F" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "যোৱা মাহ" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "অহা মাহ" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "একো অনুসূচীত কৰা হোৱা নাই" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "আজি" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "কালি" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "এই সপ্তাহ" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "অহা সপ্তাহ" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "বহিৰ্তম ড্ৰাইভ সংযোগ কৰা হৈছে" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "বহিৰ্তম ড্ৰাইভ বিচ্ছিন্ন কৰা হৈছে" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "আতৰাব পৰা ডিভাইচসমূহ" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s ৰ সৈতে খোলক" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "উলিৱাওক" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "পাছৱৰ্ড:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "আকৌ টাইপ কৰক:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "সংযোগ কৰক" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "পাছৱৰ্ড: " + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "কি': " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "পৰিচয়: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "ব্যক্তিগত কি' পাছৱৰ্ড: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "সেৱা: " + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "বেতাঁৰ নেটৱৰ্কৰ দ্বাৰা প্ৰমাণীকৰণৰ প্ৰয়োজন" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"বেতাঁৰ নেটৱৰ্ক “%s” অভিগম কৰিবলে পাছৱৰ্ডসমূহ অথবা ইনক্ৰিপষণ কি'সমূহৰ প্ৰয়োজন।" + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "তাঁৰযুক্ত 802.1X প্ৰমাণীকৰণ" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "নেটৱৰ্কৰ নাম: " + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL প্ৰমাণীকৰণ" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "PIN ক'ডৰ প্ৰয়োজন" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "মবাইল ব্ৰডবেণ্ড সেৱাৰ বাবে PIN ক'ডৰ প্ৰয়োজন" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "মবাইল ব্ৰডবেণ্ড নেটৱৰ্ক পাছৱৰ্ড" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s” লে সংযোগ কৰিবলে এটা পাছৱৰ্ডৰ প্ৰয়োজন।" + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "প্ৰমাণীকৰণৰ প্ৰয়োজন" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "প্ৰশাসক" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "প্ৰমাণীত কৰক" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "ক্ষমা কৰিব, সেয়া কাম নকৰিলে। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।" + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "নিমন্ত্ৰণ" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "কল" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "ফাইল স্থানান্তৰ" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "চেট" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "অমৌন কৰক" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "মোন কৰক" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "যোৱাকালী, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "যোৱাকালী, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s এতিয়া %s হিচাপে জনাজাত" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s লে নিমন্ত্ৰণ" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s এ আপোনাক %s ত অংশগ্ৰহণ কৰিবলে আমন্ত্ৰণ জনাইছে" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "নাকচ কৰক" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "গ্ৰহন কৰক" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s ৰ পৰা ভিডিঅ' কল" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s ৰ পৰা কল" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "উত্তৰ দিয়ক" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s এ আপোনাক %s পঠাই আছে" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "আপুনি কেতিয়া অনলাইন আছে চাবলে %s এ অনুমতি বিচাৰিব" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "নেটৱৰ্ক ত্ৰুটি" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "প্ৰমাণীকৰণ ব্যৰ্থ" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "ইনক্ৰিপষণ ত্ৰুটি" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "প্ৰমাণপত্ৰ প্ৰদান কৰা হোৱা নাই" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "প্ৰমাণপত্ৰক ভৰষা কৰিব নোৱাৰি" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "প্ৰমাণপত্ৰৰ অৱসান ঘটিছে" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "প্ৰমাণপত্ৰ সক্ৰিয় কৰা হোৱা নাই" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "প্ৰমাণপত্ৰ হস্টনাম অমিল" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰিণ্ট অমিল" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "প্ৰমাণপত্ৰ স্ব-স্বাক্ষৰীত" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "অৱস্থা অফলাইনলে সংহতি কৰা হৈছে" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "ইনক্ৰিপষণ উপলব্ধ নহয়" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "প্ৰমাণপত্ৰ অবৈধ" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "সংযোগ নাকচ কৰা হৈছে" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "সংযোগ স্থাপন কৰিব নোৱাৰি" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "সংযোগ হেৰাইছে" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "এই একাওণ্ট ইতিমধ্যে চাৰ্ভাৰৰ সৈতে সংযোগিত" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "সংযোগক একে সম্পদ ব্যৱহাৰ কৰি এটা নতুন সংযোগৰে প্ৰতিস্থাপন কৰা হৈছে" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "একাওণ্ট ইতিমধ্যে চাৰ্ভাৰত উপস্থিত" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "চাৰ্ভাৰ সংযোগ ব্যৱস্থাপনা কৰিবলে বৰ্তমানে অতি ব্যস্ত" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "প্ৰমাণপত্ৰ প্ৰত্যাহাৰ কৰা হৈছে" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"প্ৰমাণপত্ৰয় এটা অসুৰক্ষিত চিফাৰ এলগৰিথম ব্যৱহাৰ কৰে অথবা ক্ৰিপ্টোগ্ৰাফিয়ভাৱে " +"দুৰ্বল" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"চাৰ্ভাৰ প্ৰমাণপত্ৰৰ দৈৰ্ঘ, অথবা চাৰ্ভাৰ প্ৰমাণপত্ৰ শৃংখলৰ গভীৰতা, " +"ক্ৰিপ্টোগ্ৰাফী " +"লাইব্ৰেৰীয়ে প্ৰণয়ন কৰা সীমাসমূহত অতিক্ৰম কৰে" + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "অভ্যন্তৰীক ত্ৰুটি" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s ৰ সৈতে সংযোগ কৰিবলে অক্ষম" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "একাওণ্ট দৰ্শন কৰক" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "অজ্ঞাত কাৰণ" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "উইন্ডোসমূহ" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "এপ্লিকেচনসমূহ দেখুৱাওক" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "ডেশ" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "কেলেন্ডাৰ খোলক" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "ঘড়ীবোৰ খোলক" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "তাৰিখ আৰু সময সংহতিসমূহ" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s ক লগ আউট কৰক" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "লগ আউট কৰক" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s স্বচালিতভাৱে %d ছেকেণ্ডৰ পিছত লগ আউট হৈ যাব।" +msgstr[1] "%s স্বচালিতভাৱে %d ছেকেণ্ডৰ পিছত লগ আউট হৈ যাব।" + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "আপুনি স্বচালিতভাৱে %d ছেকেণ্ড পিছত লগ আউট হৈ যাব।" +msgstr[1] "আপুনি স্বচালিতভাৱে %d ছেকেণ্ড পিছত লগ আউট হৈ যাব।" + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "লগ আউট কৰক" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "বন্ধ কৰক" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "আপডেইটসমূহ ইনস্টল কৰি চিস্টেম বন্ধ কৰক" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "চিস্টেম %d ছেকেণ্ড পিছত স্বচালিতভাৱে বন্ধ কৰক হব। " +msgstr[1] "চিস্টেম %d ছেকেণ্ডৰ পিছত স্বচালিতভাৱে বন্ধ হব। " + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "বাকি থকা চফ্টৱেৰ আপডেইটসমূহ ইনস্টল কৰক" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "পুনৰাম্ভ কৰক" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "বন্ধ কৰক" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "পুনৰাম্ভ কৰক" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব।" +msgstr[1] "চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব।" + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "পুনাৰম্ভ কৰক আৰু আপডেইটসমূহ ইনস্টল কৰক" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব আৰু আপডেইটসমূহ ইনস্টল কৰিব।" +msgstr[1] "" +"চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব আৰু আপডেইটসমূহ ইনস্টল কৰিব।" + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "পুনৰাম্ভ কৰক & ইনস্টল কৰক" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ইনস্টল কৰক & চিস্টেম বন্ধ কৰক" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "আপডেইটসমূহ ইনস্টল কৰাৰ পিছত চিস্টেম বন্ধ কৰক" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"বেটাৰি শক্তিত চলি আছে: অনুগ্ৰহ কৰি আপডেইটসমূহ ইনস্টল কৰাৰ আগত চাৰ্জাৰ লগাওক।" + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"কিছুমান এপ্লিকেচন ব্যস্ত হব পাৰে অথবা সিহতৰ কিছুমান অসংৰক্ষিত কাৰ্য্য থাকিব " +"পাৰে।" + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "অন্য ব্যৱহাৰকাৰীসকল লগ্ড ইন আছে।" + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (দূৰৱৰ্তী)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (কনচৌল)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "ইনস্টল কৰক" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org ৰ পৰা “%s” ক ডাউনল'ড আৰু ইনস্টল কৰিব নে?" + +#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "কিবৰ্ড" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "কোনো সম্প্ৰসাৰন ইনস্টল কৰা হোৱা নাই" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s এ কোনো ত্ৰুটি প্ৰেৰণ কৰা নাই।" + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "ত্ৰুটিসমূহ লুকুৱাওক" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "ত্ৰুটিসমূহ দেখুৱাওক" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "সামৰ্থবান কৰা আছে" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "অসামৰ্থবান কৰা আছে" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "ত্ৰুটি" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "পুৰনি" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "ডাউনল'ড কৰা হৈছে" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "উৎস দৰ্শন কৰক" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "ৱেব পৃষ্ঠা" + +#: ../js/ui/messageTray.js:1326 +msgid "Open" +msgstr "খোলক" + +#: ../js/ui/messageTray.js:1333 +msgid "Remove" +msgstr "আতৰাওক" + +#: ../js/ui/messageTray.js:1630 +msgid "Notifications" +msgstr "অধিসূচনাসমূহ" + +#: ../js/ui/messageTray.js:1637 +msgid "Clear Messages" +msgstr "বাৰ্তাসমূহ পৰিষ্কাৰ কৰক" + +#: ../js/ui/messageTray.js:1656 +msgid "Notification Settings" +msgstr "অধিসূচনা সংহতিসমূহ" + +#: ../js/ui/messageTray.js:1709 +msgid "Tray Menu" +msgstr "ট্ৰে মেনু" + +#: ../js/ui/messageTray.js:1926 +msgid "No Messages" +msgstr "কোনো বাৰ্তা নাই" + +#: ../js/ui/messageTray.js:1968 +msgid "Message Tray" +msgstr "বাৰ্তা ট্ৰে" + +#: ../js/ui/messageTray.js:2971 +msgid "System Information" +msgstr "চিস্টেম তথ্য" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "অজ্ঞাত" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d নতুন বাৰ্তা" +msgstr[1] "%d নতুন বাৰ্তাসমূহ" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "কাৰ্য্য বাতিল কৰক" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "অভাৰভিউ" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "সন্ধান কৰিবলে টাইপ কৰক…" + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "প্ৰস্থান কৰক" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "কাৰ্য্যসমূহ" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "উপৰৰ বাৰ" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "এটা কমান্ড সুমুৱাওক" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "বন্ধ কৰক" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "পুনাৰম্ভ কৰা হৈছে…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d নতুন অধিসূচনা" +msgstr[1] "%d নতুন অধিসূচনাসমূহ" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "লক কৰক" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "GNOME এ পৰ্দা লক কৰিব লাগিব" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "লক কৰিবলে অক্ষম" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "লক কাৰ্য্য এটা এপ্লিকেচন দ্বাৰা প্ৰতিৰোধ কৰা হৈছিল" + +#: ../js/ui/search.js:594 +msgid "Searching…" +msgstr "সন্ধান কৰা হৈছে…" + +#: ../js/ui/search.js:596 +msgid "No results." +msgstr "কোনো ফলাফল নাই।" + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "কপি কৰক" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "পেইস্ট কৰক" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "লিখনি দেখুৱাওক" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "লিখনি লুকুৱাওক" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "পাছৱৰ্ড" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "পাছৱৰ্ড মনত ৰাখক" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "অভিগম্যতা" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "জুম কৰক" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "পৰ্দা ৰিডাৰ" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "পৰ্দা কিবৰ্ড" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "চক্ষ সতৰ্কবাৰ্তাসমূহ" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "স্টিকি কি'সমূহ" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "মন্থৰ কি'সমূহ" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "বাউঞ্চ কি'সমূহ" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "মাউছ কি'সমূহ" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "উচ্চ কন্ট্ৰাস্ট" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "ডাঙৰ লিখনি" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ব্লুটুথ" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "বন্ধ কৰক" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ব্লুটুথ সংহতিসমূহ" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d সংযুক্ত ডিভাইচ" +msgstr[1] "%d সংযুক্ত ডিভাইচসমূহ" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +msgid "Not Connected" +msgstr "সংযুক্ত নহয়" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "উজ্জ্বলতা" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "কিবৰ্ড বিন্যাস দেখুৱাওক" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "অবস্থান" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "অসামৰ্থবান কৰক" + +#: ../js/ui/status/location.js:73 +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "গোপনীয়তা সংহতিসমূহ" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "ব্যৱহৃত" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "সামৰ্থবান কৰক" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +msgid "Off" +msgstr "অফ" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "সংযুক্ত" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "অব্যৱস্থাপিত" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "বিচ্ছিনিত কৰা হৈছে" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +msgid "Connecting" +msgstr "সংযোগ কৰা হৈছে" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "প্ৰমাণীকৰণৰ প্ৰয়োজন" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "ফাৰ্মৱেৰ সন্ধানহীন" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "উপলব্ধ নাই" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "সংযোগ ব্যৰ্থ" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "তাঁৰযুক্ত সংহতিসমূহ" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "মবাইল ব্ৰডবেণ্ড সংহতিসমূহ" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +msgid "Hardware Disabled" +msgstr "হাৰ্ডৱেৰ অসামৰ্থবান কৰা আছে" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "ইন্টাৰনেট সংযোগ ৰূপে ব্যৱহাৰ কৰক" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "বিমান অৱস্থা অন আছে" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "বিমান অৱস্থা অন থকা অৱস্থাত Wi-Fi অসামৰ্থবান থাকে।" + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "বিমান অৱস্থা বন্ধ কৰক" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi অফ আছে" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "এটা নেটৱৰ্কৰ সৈতে সংযোগ কৰিবলে Wi-Fi অন কৰিব লাগিব।" + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi অন কৰক" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi নেটৱৰ্কসমূহ" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "এটা নেটৱৰ্ক বাছক" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "কোনো নেটৱৰ্ক নাই" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "বন্ধ কৰিবলে হাৰ্ডৱেৰ চুইচ ব্যৱহাৰ কৰক" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "নেটৱৰ্ক বাছক" + +#: ../js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi সংহতিসমূহ" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "অন কৰক" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "হটস্পট সক্ৰিয়" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "সংযোগ কৰা হৈছে..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "প্ৰমাণীকৰণৰ প্ৰয়োজন" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "সংযোগ ব্যৰ্থ" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "নেটৱৰ্ক সংহতিসমূহ" + +#: ../js/ui/status/network.js:1482 +msgid "VPN Settings" +msgstr "VPN সংহতিসমূহ" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "নেটৱৰ্ক ব্যৱস্থাপক" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "নেটৱৰ্ক সংযোগ সক্ৰিয়কৰণ ব্যৰ্থ হল" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "শক্তি সংহতিসমূহ" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "সম্পূৰ্ণভাৱে চাৰ্জড্" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "অনুমান কৰা হৈছে…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d অৱশিষ্ট (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d সম্পূৰ্ণ হোৱালৈ (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "বেটাৰি" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "বিমান অৱস্থা" + +#: ../js/ui/status/rfkill.js:85 +msgid "On" +msgstr "অন" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "ব্যৱহাৰকাৰী পৰিবৰ্তন কৰক" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "লগ আউট কৰক" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "দিশনিৰ্ণয় লক" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "বাতিল কৰক" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "বন্ধ কৰক" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ভলিউম পৰিবৰ্তন কৰা হৈছে" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "ভলিউম" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "মাইক্ৰোফোন" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "অন্য ব্যৱহাৰকাৰী হিচাপে লগিন কৰক" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "উইন্ডো আনলক কৰক" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "এপ্লিকেচনসমূহ" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "সন্ধান কৰক" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” প্ৰস্তুত" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "আপুনি এই প্ৰদৰ্শন সংহতিসমূহ ৰাখিব বিচাৰে নে?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "সংহতিসমূহক পূৰ্ব অৱস্থালৈ নিয়ক" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "পৰিৱৰ্তনসমূহ ৰাখক" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "সংহতিসমূহৰ পৰিবৰ্তন %d ছেকেণ্ডত পূৰ্ব অৱস্থালৈ যাব" +msgstr[1] "সংহতিসমূহৰ পৰিবৰ্তন %d ছেকেণ্ডত পূৰ্ব অৱস্থালৈ যাব" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "সৰু কৰক" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "স্বাভাৱিক আকাৰ দিয়ক" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "ডাঙৰ কৰক" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "স্থানান্তৰ কৰক" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "পুনৰআকাৰ দিয়ক" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "অনস্ক্ৰিন শীৰ্ষকবাৰক স্থানান্তৰ কৰক" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "সদায় ওপৰত" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "সদায় দৃশ্যমান কাৰ্য্যস্থানত" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "ওপৰৰ কাৰ্য্যস্থানলৈ স্থানান্তৰ কৰক" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "তলৰ কাৰ্য্যস্থানলৈ স্থানান্তৰ কৰক" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution কেলেন্ডাৰ" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u আউটপুট" +msgstr[1] "%u আউটপুটসমূহ" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ইনপুট" +msgstr[1] "%u ইনপুটসমূহ" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "চিস্টেম শব্দসমূহ" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "প্ৰিণ্ট সংস্কৰণ" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "লগিন স্ক্ৰিনৰ বাবে GDM দ্বাৰা ব্যৱহাৰ কৰা অৱস্থা" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "লগিন পৰ্দাৰ বাবে এটা বিশেষ অৱস্থা, উদাহৰণস্বৰূপ \"gdm\" ব্যৱহাৰ কৰক" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "সম্ভাব্য অৱস্থাসমূহ তালিকাভুক্ত কৰক" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” লঞ্চ কৰিবলে ব্যৰ্থ" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "পাছৱৰ্ডসমূহ মিল নাখায়।" + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "পাছৱৰ্ড ৰিক্ত হব নোৱাৰিব" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰকাৰী দ্বাৰা নাকচ কৰা হৈছিল" + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "শীৰ্ষকবাৰত বুটামসমূহ সজোঁৱা" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "GNOME শ্বেল চলাওতে এই কি'য়ে org.gnome.desktop.wm.preferences ত থকা কি' " +#~ "অভাৰৰাইড কৰে।" + +#~ msgid "Extension" +#~ msgstr "প্ৰসাৰন" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "উপৰত দিয়া কম্বোবাকচ ব্যৱহাৰ কৰি সংৰূপণ কৰিবলে এটা সম্প্ৰসাৰন বাছক।" + +#~ msgid "calendar:MY" +#~ msgstr "কেলেন্ডাৰ:MY" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "unavailable" +#~ msgstr "উপলব্ধ নাই" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "ফোল্ডাৰ হিচাপে প্ৰদৰ্শন কৰিব লগিয়া বিভাগসমূহ তালিকাৰ" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "এই তালিকাৰ প্ৰতিটো বিভাগ নামক এপ্লিকেচন দৰ্শনত ফোল্ডাৰ হিচাপে প্ৰতিনিদ্ধিত্ব কৰা " +#~ "হব, মূখ্য দৰ্শনত ইনলাইন হিচাপে প্ৰদৰ্শন কৰাৰ পৰিৱৰ্তে।" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s ৰ পৰা প্ৰমাণীকৰণ অনুৰোধ" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "ডিভাইচ %s এ এই কমপিউটাৰৰ লগত সংযোগ কৰিব বিচাৰে" + +#~ msgid "Allow" +#~ msgstr "অনুমতি দিয়ক" + +#~ msgid "Deny" +#~ msgstr "নাকচ কৰক" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "ডিভাইচ %s এ সেৱা '%s' লে অভিগম বিচাৰে" + +#~ msgid "Always grant access" +#~ msgstr "সদায় অভিগম প্ৰদান কৰক" + +#~ msgid "Grant this time only" +#~ msgstr "কেৱল এইবাৰৰ কাৰণে প্ৰদান কৰক" + +#~ msgid "Reject" +#~ msgstr "নাকচ কৰক" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s ৰ কাৰণে যোৰ প্ৰতিশ্ৰুতি" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "অনুগ্ৰহ কৰি সুনিশ্চিত কৰক যে পাছকি '%06d' ডিভাইচত থকাটোৰ সৈতে মিল খায়।" + +#~ msgid "Matches" +#~ msgstr "মিলসমূহ" + +#~ msgid "Does not match" +#~ msgstr "মিল নাখায়" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s ৰ কাৰণে যোৰ অনুৰোধ" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "অনুগ্ৰহ কৰি ডিভাইচত উল্লেখ কৰা PIN সুমুৱাওক।" + +#~ msgid "OK" +#~ msgstr "ঠিক আছে" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "ক্ষমা কৰিব, আপোনাৰ বাবে আজি কোনো জ্ঞান নাই:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s Oracle এ ক'য়" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Settings Menu" +#~ msgstr "সংহতিসমূহ মেনু" + +#~ msgid "Screenshots" +#~ msgstr "স্ক্ৰিনশ্বটসমূহ" + +#~ msgid "Record a screencast" +#~ msgstr "এটা স্ক্ৰিনশ্বট ৰেকৰ্ড কৰক" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "এপ্লিকেচন ব্যৱহাৰ বিষয়ে পৰিসংখ্যা সংগ্ৰহ কৰা হব নে" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "শ্বেলে সাধাৰণত সক্ৰিয় এপ্লিকেচনসমূহ মনিটৰ কৰে যাতে সকলোতকৈ অধিক ব্যৱহৃতসমূহ " +#~ "(উদাহৰনস্বৰুপে লঞ্চাৰসমূহত) ক দেখুৱাব পাৰে। যত এই তথ্য গোপন ৰখা হব, আপুনি ইয়াক " +#~ "গোপনীয়তা কাৰণসমূহৰ কাৰণে অসামৰ্থবান কৰিব পাৰে। অনুগ্ৰহ কৰি মন কৰিব যে এনেকুৱা " +#~ "কৰাত ইতিমধ্যে সংৰক্ষীত তথ্য আতৰি নাযায়।" + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "ব্যৱহাৰকাৰী দ্বাৰা স্পষ্টভাৱে সংহতি কৰা সৰ্বশেষ IM উপস্থিতি সংৰক্ষণ কৰাৰ বাবে " +#~ "অভ্যন্তৰীয় বাবে ব্যৱহৃত। ইয়াত থকা মান TpConnectionPresenceType ইনুমাৰেষণৰ পৰা।" + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "ব্যৱহাৰকাৰীৰ বাবে সৰ্বশেষ অধিবেশন উপস্থিতি অৱস্থা সংৰক্ষণ কৰাৰ বাবে " +#~ "অভ্যন্তৰীয়ভাৱে ব্যৱহৃত। ইয়াত থকা মান GsmPresenceStatus ইনুমাৰেষণৰ পৰা উপলব্ধ।" + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "পৰ্দা ৰেকৰ্ডাৰ অদল বদল কৰিবলে Keybinding" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "বিল্টইন পৰ্দা ৰেকৰ্ডাৰ আৰম্ভ/বন্ধ কৰিবলে Keybinding।" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "screencasts ৰেকৰ্ড কৰাৰ কাৰণে ব্যৱহৃত Framerate" + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "GNOME শ্বেলৰ screencast ৰেকৰ্ডাৰে ফ্ৰেইম-প্ৰতি ছেকেণ্ডত ৰেকৰ্ড কৰা পৰিণাম " +#~ "screencast ৰ framerate।" + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "screencast এনক'ড কৰিবলে ব্যৱহাৰ কৰা gstreamer পাইপলাইন" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "ৰেকৰ্ডিংসমূহ এনক'ড কৰোতে ব্যৱহৃত GStreamer পাইপলাইন সংহতি কৰে। ই gst-launch ৰ " +#~ "কাৰণে ব্যৱহৃত বাক্যবিন্যাস অনুকৰন কৰে। পাইপলাইনৰ এটা অসংযোগিত চিঙ্ক পেড থাকিব " +#~ "লাগে যত ৰেকৰ্ড কৰা ভিডিঅ' ৰেকৰ্ড কৰা হয়। ইয়াৰ সাধাৰণত এটা অসংযোগিত উৎস পেড " +#~ "থাকিব; সেই পেডৰ পৰা আউটপুট এটা আউটপুট ফাইললে লিখা হব। যি কি নহওক পাইপলাইনে " +#~ "নিজৰ আউটপুটৰ যত্ন লব পাৰে - ইয়াৰ হওতো আউটপুটক shout2send অথবা সমসাময়িকৰে এটা " +#~ "icecast চাৰ্ভাৰত পঠাবলে ব্যৱহাৰ হব পাৰে। যেতিয়া এটা ৰিক্ত মানলে অসংহিত বা " +#~ "সংহিত, অবিকল্পিত পাইপলাইন ব্যৱহাৰ কৰা হব। এইটো বৰ্তমানত 'vp8enc " +#~ "min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=" +#~ "%T ! queue ! webmmux' আৰু VP8 কডেক ব্যৱহাৰ কৰি WEBM ত ৰেকৰ্ড কৰে। %T ক " +#~ "চিস্টেমত অনুকূলিত থ্ৰেড কাওণ্টত এটা অনুমানৰ প্লেইচহল্ডাৰ হিচাপে ব্যৱহাৰ কৰা হয়।" + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "screencast সংৰক্ষণ কৰাৰ কাৰণে লথিপত্ৰ সম্প্ৰসাৰন" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "ৰেকৰ্ড কৰা screencasts ৰ কাৰণে ফাইল নাম বৰ্তমান তাৰিখৰ উপৰত ভিত্তি কৰি এটা " +#~ "অবিকল্প ফাইল নাম হব, আৰু এই সম্প্ৰসাৰন ব্যৱহাৰ কৰিব। ইয়াক এটা ভিন্ন অন্তৰ্ভুক্তক " +#~ "বিন্যাসত ৰেকৰ্ড কৰোতে পৰিবৰ্তন কৰিব লাগিব।" + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "অধিবেশন…" + +#~ msgid "Power" +#~ msgstr "শক্তি" + +#~ msgid "Restart" +#~ msgstr "পুনৰাম্ভ কৰক" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t ৰ পৰা স্ক্ৰিনকাস্ট দেখুৱাওক" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "এই এপ্লিকেচনসমূহ প্ৰস্থান কৰি চিস্টেমৰ পৰা লগ আউট হবলে লগ আউট ক্লিক কৰক।" + +#~ msgid "Logging out of the system." +#~ msgstr "চিস্টেমৰ পৰা লগ আউট কৰা হৈছে।" + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "এই এপ্লিকেচনসমূহক প্ৰস্থান কৰি চিস্টেম বন্ধ কৰিবলে বন্ধ কৰক ক্লিক কৰক।" + +#~ msgid "Powering off the system." +#~ msgstr "চিস্টেম বন্ধ কৰা হৈছে।" + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "এই এপ্লিকেচনসমূহক প্ৰস্থান কৰি চিস্টেম পুনৰাম্ভ কৰিবলে পুনৰাম্ভ ক্লিক কৰক।" + +#~ msgid "Restarting the system." +#~ msgstr "চিস্টেম পুনৰাম্ভ কৰা হৈছে।" + +#~ msgid "Universal Access Settings" +#~ msgstr "সাৰ্বভৈমক অভিগম সংহতিসমূহ" + +#~ msgid "Visibility" +#~ msgstr "দৃশ্যমানতা" + +#~| msgid "Send Files to Device..." +#~ msgid "Send Files to Device…" +#~ msgstr "ফাইলসমূহক ডিভাইচলে পঠাওক…" + +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "এটা নতুন ডিভাইচ সংহতি কৰক…" + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "ফাইলসমূহ পঠাওক…" + +#~ msgid "Keyboard Settings" +#~ msgstr "কিবৰ্ড সংহতিসমূহ" + +#~ msgid "Mouse Settings" +#~ msgstr "মাউছ আৰু টাচপেড সংহতিসমূহ" + +#~ msgid "Sound Settings" +#~ msgstr "শব্দ সংহতিসমূহ" + +#~| msgid "Region and Language Settings" +#~ msgid "Region & Language Settings" +#~ msgstr "অঞ্চল আৰু ভাষা সংহতিসমূহ" + +#~ msgid "Volume, network, battery" +#~ msgstr "ভলিউম, নেটৱৰ্ক, বেটাৰি" + +#~ msgid "disabled" +#~ msgstr "অসামৰ্থবান" + +#~ msgid "cable unplugged" +#~ msgstr "কেবুল আনপ্লাগ্গড" + +#~ msgid "More…" +#~ msgstr "অধিক…" + +#~ msgid "Wired" +#~ msgstr "তাৰঁযুক্ত" + +#~ msgid "Auto Ethernet" +#~ msgstr "স্বচালিত ইথাৰনেট" + +#~ msgid "Auto broadband" +#~ msgstr "স্বচালিত ব্ৰডবেণ্ড" + +#~ msgid "Auto dial-up" +#~ msgstr "স্বচালিত ডায়েল-আপ" + +#~ msgid "Auto %s" +#~ msgstr "স্বচালিত %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "স্বচালিত ব্লুটুথ" + +#~ msgid "Auto wireless" +#~ msgstr "স্বচালিত বেতাঁৰ" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "Networking is disabled" +#~ msgstr "নেটৱাৰ্কিং অসামৰ্থবান কৰা আছে" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d ঘন্টা অৱশিষ্ট" +#~ msgstr[1] "%d ঘন্টা অৱশিষ্ট" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s অৱশিষ্ট" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ঘন্টা" +#~ msgstr[1] "ঘন্টা" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "মিনিট" +#~ msgstr[1] "মিনিট" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d মিনিট অৱশিষ্ট" +#~ msgstr[1] "%d মিনিট অৱশিষ্ট" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~| msgid "AC adapter" +#~ msgid "AC Adapter" +#~ msgstr "AC এডাপ্টাৰ" + +#~| msgid "Laptop battery" +#~ msgid "Laptop Battery" +#~ msgstr "লেপটপ বেটাৰি" + +#~ msgid "Monitor" +#~ msgstr "মনিটৰ" + +#~ msgid "Mouse" +#~ msgstr "মাউছ" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~| msgid "Cell phone" +#~ msgid "Cell Phone" +#~ msgstr "চেল ফোন" + +#~| msgid "Media player" +#~ msgid "Media Player" +#~ msgstr "মিডিয়া প্লেয়াৰ" + +#~ msgid "Tablet" +#~ msgstr "টেবলেট" + +#~ msgid "Computer" +#~ msgstr "কমপিউটাৰ" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "অজ্ঞাত" + +#~ msgid "Available" +#~ msgstr "উপলব্ধ" + +#~ msgid "Busy" +#~ msgstr "ব্যস্থ" + +#~ msgid "Invisible" +#~ msgstr "অদৃশ্য" + +#~ msgid "Away" +#~ msgstr "আতৰত" + +#~ msgid "Idle" +#~ msgstr "অলস" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "আপোনাৰ চেট অৱস্থা ব্যস্থলে সংহতি কৰা হব" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "অধিসূচনাসমূহ এতিয়া অসামৰ্থবান কৰা হৈছে, চেট বাৰ্তাসমূহ অন্তৰ্ভুক্ত কৰাকৈ। আপোনাৰ " +#~ "অনলাইন অৱস্থা ঠিক কৰা হৈছে যাতে আনে জানিব পাৰে যে আপুনি সিহতৰ বাৰ্তা চাব " +#~ "নোৱাৰিবও পাৰে।" + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "বন্ধ কৰিলে তেওঁলোকৰ অসংৰক্ষিত কাৰ্য্য হেৰাব পাৰে।" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "ছাইন ইন কৰক" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "tray" +#~ msgstr "ট্ৰে" + +#~ msgid "More..." +#~ msgstr "অধিক..." + +#~ msgid "United Kingdom" +#~ msgstr "ইংলেণ্ড" + +#~ msgid "Default" +#~ msgstr "অবিকল্পিত" + +#~ msgid "Show full name in the user menu" +#~ msgstr "ব্যৱহাৰকাৰী মেনুত সম্পূৰ্ণ নাম দেখুৱাওক" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "ব্যৱহাৰকাৰী মেনুত ব্যৱহাৰকাৰীসকলৰ সম্পূৰ্ণ নাম দেখুৱা হয় নে নহয়।" + +#~ msgid "APPLICATIONS" +#~ msgstr "APPLICATIONS" + +#~ msgid "SETTINGS" +#~ msgstr "SETTINGS" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "আপোনাৰ পছন্দৰ Easter Egg" + +#~ msgid "%H:%M on Yesterday" +#~ msgstr "%H:%M যোৱাকালী" + +#~ msgid "%H:%M on %A, %B %d, %Y" +#~ msgstr "%A%H:%M, %B %d, %Y" + +#~ msgid "Subscription request" +#~ msgstr "স্বাক্ষৰণ অনুৰোধ" + +#~ msgid "Connection error" +#~ msgstr "সংযোগ ত্ৰুটি" + +#~ msgid "Connection to %s failed" +#~ msgstr "%s লে সংযোগ ব্যৰ্থ" + +#~ msgid "Reconnect" +#~ msgstr "পুনৰ সংযোগ কৰক" + +#~ msgid "Browse Files..." +#~ msgstr "ফাইলসমূহ ব্ৰাউছ কৰক..." + +#~ msgid "Error browsing device" +#~ msgstr "ডিভাইচ ব্ৰাউছ কৰোতে ত্ৰুটি" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "অনুৰোধিত ডিভাইচ ব্ৰাউছ কৰিব নোৱাৰি, ত্ৰুটি '%s'" + +#~ msgid "Wireless" +#~ msgstr "বেতাঁৰ" + +#~ msgid "VPN Connections" +#~ msgstr "VPN সংযোগসমূহ" + +#~ msgid "System Settings" +#~ msgstr "চিস্টেম সংহতিসমূহ" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "'%s' আনমাউণ্ট কৰিবলে ব্যৰ্থ" + +#~ msgid "Retry" +#~ msgstr "পুনৰ চেষ্টা কৰক" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "PLACES & DEVICES" + +#~ msgid "Home" +#~ msgstr "ঘৰ" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "অসামৰ্থবান কৰা OpenSearch প্ৰদানকাৰীসমূহ" + +#~ msgid "Connect to..." +#~ msgstr "লে সংযোগ কৰক..." + +#~ msgid "Passphrase" +#~ msgstr "পাচফ্ৰেইছ" + +#~ msgid "%s is online." +#~ msgstr "%s অনলাইন আছে।" + +#~ msgid "%s is offline." +#~ msgstr "%s অফলাইন আছে।" + +#~ msgid "%s is away." +#~ msgstr "%s আতৰত আছে।" + +#~ msgid "%s is busy." +#~ msgstr "%s ব্যস্ত আছে।" + +#~ msgid "Show time with seconds" +#~ msgstr "সময়ক ছেকেণ্ডসমূহৰ সৈতে দেখুৱাওক" + +#~ msgid "If true, display seconds in time." +#~ msgstr "যদি সত্য, ছেকেণ্ডসমূহ সময়ত দেখুৱাওক।" + +#~ msgid "Show date in clock" +#~ msgstr "ঘড়িত তাৰিখ দেখুৱাওক" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "যদি সত্য, ঘড়িত তাৰিখ প্ৰদৰ্শন কৰক, সময়ৰ অতিৰিক্তভাৱে।" + +#~ msgid "CONTACTS" +#~ msgstr "CONTACTS" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "ভুল পাছৱৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।" + +#~ msgid "Hidden" +#~ msgstr "লুকাই থকা" + +#~ msgid "Power Off..." +#~ msgstr "বন্ধ কৰক" + +#~ msgid "Online Accounts" +#~ msgstr "অনলাইন একাওণ্টসমূহ" + +#~ msgid "Lock Screen" +#~ msgstr "পৰ্দা লক কৰক" + +#~ msgid "Log Out..." +#~ msgstr "লগ আউট কৰক..." + +#~ msgid "RECENT ITEMS" +#~ msgstr "RECENT ITEMS" + +#~ msgid "Show password" +#~ msgstr "পাছৱৰ্ড দেখুৱাওক" + +#~ msgid "%s has finished starting" +#~ msgstr "%s এ আৰম্ভ কৰা সমাপ্ত কৰিছে" + +#~ msgid "Home Folder" +#~ msgstr "ঘৰ ফোল্ডাৰ" diff --git a/po/ast.po b/po/ast.po new file mode 100644 index 0000000..72f49e9 --- /dev/null +++ b/po/ast.po @@ -0,0 +1,1630 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Xandru Armesto , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-30 18:14+0000\n" +"PO-Revision-Date: 2011-09-30 20:56+0200\n" +"Last-Translator: Xandru Armesto \n" +"Language-Team: Softastur \n" +"Language: ast\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: Virtaal 0.5.2\n" +"X-Poedit-Language: asturian\n" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Xestión de ventanes y aniciu d'aplicaciones" + +#: ../data/org.gnome.shell.gschema.xml.in.h:1 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permitir acceder a les ferramientes internes de depuración y monitorización " +"usando'l diálogu Alt+F2" + +#: ../data/org.gnome.shell.gschema.xml.in.h:2 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Activar les ferramientes internes, útiles pa desendolcadores y probadores, " +"dende Alt+F2" + +#: ../data/org.gnome.shell.gschema.xml.in.h:3 +msgid "File extension used for storing the screencast" +msgstr "Estensión de ficheru qu'usar p'almacenar los «screencast»" + +#: ../data/org.gnome.shell.gschema.xml.in.h:4 +msgid "Framerate used for recording screencasts." +msgstr "Tasa de fotogrames usada pa grabar «screencast»." + +#: ../data/org.gnome.shell.gschema.xml.in.h:5 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. disabled-extensions overrides this setting for extensions " +"that appear in both lists." +msgstr "" +"Les estensiones de GNOME Shell tienen una propiedá uuid; esta contraseña " +"llista les estensiones que nun se deben cargar. «disabled-extensions» " +"sobrescribe esti axuste pa les estensiones qu'aparecen en dambes llistes." + +#: ../data/org.gnome.shell.gschema.xml.in.h:6 +msgid "History for command (Alt-F2) dialog" +msgstr "Históricu del diálogu de comandos (Alt+F2)" + +#: ../data/org.gnome.shell.gschema.xml.in.h:7 +msgid "History for the looking glass dialog" +msgstr "Históricu del diálogu de «looking glass»" + +#: ../data/org.gnome.shell.gschema.xml.in.h:8 +msgid "If true, display date in the clock, in addition to time." +msgstr "Si ye cierta, amuesa la data nel reló, arriendes de la hora." + +#: ../data/org.gnome.shell.gschema.xml.in.h:9 +msgid "If true, display seconds in time." +msgstr "Si ye cierta, amuesa los segundos na hora." + +#: ../data/org.gnome.shell.gschema.xml.in.h:10 +msgid "If true, display the ISO week date in the calendar." +msgstr "Si ye cierta, amuesa la data de selmana ISO nel calendariu." + +#: ../data/org.gnome.shell.gschema.xml.in.h:11 +msgid "List of desktop file IDs for favorite applications" +msgstr "Llista de ID de ficheros d'escritoriu pa les aplicaciones favorites" + +#: ../data/org.gnome.shell.gschema.xml.in.h:13 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and " +"records to WEBM using the VP8 codec. %T is used as a placeholder for a guess " +"at the optimal thread count on the system." +msgstr "" +"Afita la tubería GStreamer usada pa codificar grabaciones. Sigue la sintaxis " +"usada pa gst-launch. La tubería tendría tener un sumideru («sink») " +"d'ensamblaxe/desensamblaxe au'l videu que se ta grabando, se graba. " +"Xeneralmente tendrá un orixe d'ensambláu/desensambláu; la salida d'esi puntu " +"escribiráse nel ficheru de salida. Sicasí, la tubería tamién pue tomar " +"parte na so propia salida; esto pue usase pa unviar la salida a un sirvidor " +"«icecast» a traviés de shout2send o similar. Cuando nun ta afitáu o lo ta a " +"un valor baleru, va usase la tubería predeterminada. Anguaño te «videorate ! " +"vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux» y graba en WEBM " +"usando'l códec VP8. Úsase %T como suposición pal númberu de filos óptimos " +"nel sistema." + +#: ../data/org.gnome.shell.gschema.xml.in.h:14 +msgid "Show date in clock" +msgstr "Amosar la data nel reló" + +#: ../data/org.gnome.shell.gschema.xml.in.h:15 +msgid "Show the week date in the calendar" +msgstr "Amosar la data de la selmana nel calendariu" + +#: ../data/org.gnome.shell.gschema.xml.in.h:16 +msgid "Show time with seconds" +msgstr "Amosar la hora con segundos" + +#: ../data/org.gnome.shell.gschema.xml.in.h:17 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Les aplicaciones correspondientes con esos identificadores van amosase nel " +"área de favoritos." + +#: ../data/org.gnome.shell.gschema.xml.in.h:18 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" +"El nome de ficheru pa los «screencast» sedrá un nome de ficheru únicu basáu " +"na data actual y usará esta estensión. Tendría de camudase al grabar n'otru " +"formatu contenedor distintu." + +#: ../data/org.gnome.shell.gschema.xml.in.h:19 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" +"La tasa de fotogrames de la grabación resultante grabada pol grabador de " +"«screencast» de GNOME Shell, en fotogrames per segundu." + +#: ../data/org.gnome.shell.gschema.xml.in.h:20 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "La tubería de gstreamer usada pa codificar el «screencast»" + +#: ../data/org.gnome.shell.gschema.xml.in.h:21 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" +"La «shell» normalmente monitoriza toles aplicaciones actives pa presentar " +"les más usaes (ex. nos lanzadores). Magar qu'estos datos se caltienen de " +"forma privada, pues querer desactivalo por razones de privacidá. Nota que " +"faciéndolo nun desanicies los datos yá guardaos." + +#: ../data/org.gnome.shell.gschema.xml.in.h:22 +msgid "The type of keyboard to use." +msgstr "La triba de tecláu qu'usar." + +#: ../data/org.gnome.shell.gschema.xml.in.h:23 +msgid "Uuids of extensions to enable" +msgstr "Uuid de les estensiones qu'activar" + +#: ../data/org.gnome.shell.gschema.xml.in.h:24 +msgid "Whether to collect stats about applications usage" +msgstr "" +"Indica si hai de recolectar estadístiques tocante al usu de les aplicaciones" + +#: ../data/org.gnome.shell.gschema.xml.in.h:25 +msgid "Which keyboard to use" +msgstr "Qué tecláu usar" + +#: ../data/org.gnome.shell.gschema.xml.in.h:26 +msgid "disabled OpenSearch providers" +msgstr "fornidores OpenSearch desactivaos" + +#: ../js/gdm/loginDialog.js:617 +msgid "Session..." +msgstr "Sesión…" + +#: ../js/gdm/loginDialog.js:785 +msgctxt "title" +msgid "Sign In" +msgstr "Entamar sesión" + +#. translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/loginDialog.js:830 +msgid "(or swipe finger)" +msgstr "(o pasa'l deu)" + +#: ../js/gdm/loginDialog.js:848 +msgid "Not listed?" +msgstr "¿Nun ta llistáu?" + +#: ../js/gdm/loginDialog.js:1004 ../js/ui/endSessionDialog.js:426 +#: ../js/ui/extensionSystem.js:477 ../js/ui/networkAgent.js:165 +#: ../js/ui/polkitAuthenticationAgent.js:171 ../js/ui/status/bluetooth.js:480 +msgid "Cancel" +msgstr "Encaboxar" + +#: ../js/gdm/loginDialog.js:1009 +msgctxt "button" +msgid "Sign In" +msgstr "Entamar sesión" + +#: ../js/gdm/loginDialog.js:1358 +msgid "Login Window" +msgstr "Ventana d'aniciu de sesión" + +#: ../js/gdm/powerMenu.js:116 ../js/ui/userMenu.js:514 +#: ../js/ui/userMenu.js:516 ../js/ui/userMenu.js:585 +msgid "Suspend" +msgstr "Suspender" + +#: ../js/gdm/powerMenu.js:121 ../js/ui/endSessionDialog.js:89 +#: ../js/ui/endSessionDialog.js:97 ../js/ui/endSessionDialog.js:106 +msgid "Restart" +msgstr "Reaniciar" + +#: ../js/gdm/powerMenu.js:126 ../js/ui/endSessionDialog.js:80 +#: ../js/ui/endSessionDialog.js:91 +msgid "Power Off" +msgstr "Apagar" + +#: ../js/misc/util.js:92 +msgid "Command not found" +msgstr "Comandu non alcontráu" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:119 +msgid "Could not parse command:" +msgstr "Nun pudo analizase'l comandu:" + +#: ../js/misc/util.js:127 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "Falló la execución de «%s»:" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:255 +msgid "All" +msgstr "Toes" + +#: ../js/ui/appDisplay.js:319 +msgid "APPLICATIONS" +msgstr "APLICACIONES" + +#: ../js/ui/appDisplay.js:377 +msgid "SETTINGS" +msgstr "CONFIGURACIÓN" + +#: ../js/ui/appDisplay.js:684 +msgid "New Window" +msgstr "Ventana nueva" + +#: ../js/ui/appDisplay.js:687 +msgid "Remove from Favorites" +msgstr "Quitar de los favoritos" + +#: ../js/ui/appDisplay.js:688 +msgid "Add to Favorites" +msgstr "Amestar a los favoritos" + +#: ../js/ui/appFavorites.js:89 +#, c-format +msgid "%s has been added to your favorites." +msgstr "Amestóse %s a los favoritos." + +#: ../js/ui/appFavorites.js:120 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "Desanicióse %s de los favoritos." + +#: ../js/ui/autorunManager.js:280 +msgid "Removable Devices" +msgstr "Preseos extraíbles" + +#: ../js/ui/autorunManager.js:590 +#, c-format +msgid "Open with %s" +msgstr "Abrir con %s" + +#: ../js/ui/autorunManager.js:616 +msgid "Eject" +msgstr "Espulsar" + +#. 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:63 +msgctxt "event list time" +msgid "All Day" +msgstr "Tol día" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:68 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H:%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:75 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:115 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:117 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:119 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:121 +msgctxt "grid wednesday" +msgid "W" +msgstr "m" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:123 +msgctxt "grid thursday" +msgid "T" +msgstr "X" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:125 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:127 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:140 +msgctxt "list sunday" +msgid "Su" +msgstr "Dom" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:142 +msgctxt "list monday" +msgid "M" +msgstr "Llu" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:144 +msgctxt "list tuesday" +msgid "T" +msgstr "Mar" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:146 +msgctxt "list wednesday" +msgid "W" +msgstr "Mié" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:148 +msgctxt "list thursday" +msgid "Th" +msgstr "Xue" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:150 +msgctxt "list friday" +msgid "F" +msgstr "Vie" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:152 +msgctxt "list saturday" +msgid "S" +msgstr "Sáb" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:687 +msgid "Nothing Scheduled" +msgstr "Res programáu" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:703 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %d de %B" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:706 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d de %B de %Y" + +#: ../js/ui/calendar.js:716 +msgid "Today" +msgstr "Güei" + +#: ../js/ui/calendar.js:720 +msgid "Tomorrow" +msgstr "Mañana" + +#: ../js/ui/calendar.js:729 +msgid "This week" +msgstr "Esta selmana" + +#: ../js/ui/calendar.js:737 +msgid "Next week" +msgstr "La selmana que vien" + +#: ../js/ui/contactDisplay.js:59 ../js/ui/notificationDaemon.js:444 +#: ../js/ui/status/power.js:223 ../src/shell-app.c:355 +msgid "Unknown" +msgstr "Desconocíu" + +#: ../js/ui/contactDisplay.js:80 ../js/ui/userMenu.js:139 +msgid "Available" +msgstr "Disponible" + +#: ../js/ui/contactDisplay.js:85 ../js/ui/userMenu.js:148 +msgid "Away" +msgstr "Ausente" + +#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:142 +msgid "Busy" +msgstr "Ocupáu" + +#: ../js/ui/contactDisplay.js:93 +msgid "Offline" +msgstr "Desconeutáu" + +#: ../js/ui/contactDisplay.js:140 +msgid "CONTACTS" +msgstr "CONTAUTOS" + +#: ../js/ui/dash.js:172 ../js/ui/messageTray.js:1204 +msgid "Remove" +msgstr "Desaniciar" + +#: ../js/ui/dateMenu.js:99 +msgid "Date and Time Settings" +msgstr "Axustes d'hora y data" + +#: ../js/ui/dateMenu.js:125 +msgid "Open Calendar" +msgstr "Abrir calendariu" + +#. Translators: This is the time format with date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:183 +msgid "%a %b %e, %R:%S" +msgstr "%a %e de %b, %R:%S" + +#: ../js/ui/dateMenu.js:184 +msgid "%a %b %e, %R" +msgstr "%a %e de %b, %R" + +#. Translators: This is the time format without date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:188 +msgid "%a %R:%S" +msgstr "%a %R:%S" + +#: ../js/ui/dateMenu.js:189 +msgid "%a %R" +msgstr "%a %R" + +#. Translators: This is a time format with date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:196 +msgid "%a %b %e, %l:%M:%S %p" +msgstr "%a %e de %b, %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:197 +msgid "%a %b %e, %l:%M %p" +msgstr "%a %e de %b, %l:%M %p" + +#. Translators: This is a time format without date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:201 +msgid "%a %l:%M:%S %p" +msgstr "%a %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:202 +msgid "%a %l:%M %p" +msgstr "%a %l:%M %p" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). +#. +#: ../js/ui/dateMenu.js:213 +msgid "%A %B %e, %Y" +msgstr "%A, %e de %B de %Y" + +#: ../js/ui/docDisplay.js:16 +msgid "RECENT ITEMS" +msgstr "ELEMENTOS RECIENTES" + +#: ../js/ui/endSessionDialog.js:60 +#, c-format +msgid "Log Out %s" +msgstr "Zarrar la sesión %s" + +#: ../js/ui/endSessionDialog.js:61 ../js/ui/endSessionDialog.js:75 +msgid "Log Out" +msgstr "Zarrar la sesión" + +#: ../js/ui/endSessionDialog.js:62 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "" +"Calca «Zarrar la sesión» pa colar d'eses aplicaciones y zarrar la sesión del " +"sistema." + +#: ../js/ui/endSessionDialog.js:64 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "va zarrase automáticamente la sesión de %s en %d segundu." +msgstr[1] "va zarrase automáticamente la sesión de %s en %d segundos." + +#: ../js/ui/endSessionDialog.js:69 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "La sesión va zarrase automáticamente en %d segundu." +msgstr[1] "La sesión va zarrase automáticamente en %d segundos." + +#: ../js/ui/endSessionDialog.js:73 +msgid "Logging out of the system." +msgstr "Zarrando la sesión." + +#: ../js/ui/endSessionDialog.js:81 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "Calca «Apagar» pa colar d'eses aplicaciones y apagar el sistema." + +#: ../js/ui/endSessionDialog.js:83 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "El sistema va apagase automáticamente en %d segundu." +msgstr[1] "El sistema va apagase automáticamente en %d segundos." + +#: ../js/ui/endSessionDialog.js:87 +msgid "Powering off the system." +msgstr "Apagando'l sistema." + +#: ../js/ui/endSessionDialog.js:98 +msgid "Click Restart to quit these applications and restart the system." +msgstr "Calca «Reaniciar» pa colar d'eses aplicaciones y reaniciar el sistema." + +#: ../js/ui/endSessionDialog.js:100 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "El sistema va reaniciase automáticamente en %d segundu." +msgstr[1] "El sistema va reaniciase automáticamente en %d segundos." + +#: ../js/ui/endSessionDialog.js:104 +msgid "Restarting the system." +msgstr "Reaniciando'l sistema." + +#: ../js/ui/extensionSystem.js:481 +msgid "Install" +msgstr "Instalar" + +#: ../js/ui/extensionSystem.js:485 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "¿Baxar ya instalar «%s» dende extensions.gnome.org?" + +#: ../js/ui/keyboard.js:529 ../js/ui/status/power.js:211 +msgid "Keyboard" +msgstr "Tecláu" + +#: ../js/ui/lookingGlass.js:645 +msgid "No extensions installed" +msgstr "Nun hai estensiones instalaes" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:700 +#, c-format +msgid "%s has not emitted any errors." +msgstr "%s nun emitió error nengún." + +#: ../js/ui/lookingGlass.js:706 +msgid "Hide Errors" +msgstr "Anubrir Errores" + +#: ../js/ui/lookingGlass.js:710 ../js/ui/lookingGlass.js:760 +msgid "Show Errors" +msgstr "Amosar Errores" + +#: ../js/ui/lookingGlass.js:719 +msgid "Enabled" +msgstr "Activáu" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:721 ../src/gvc/gvc-mixer-control.c:1093 +msgid "Disabled" +msgstr "Desactiváu" + +#: ../js/ui/lookingGlass.js:723 +msgid "Error" +msgstr "Fallu" + +#: ../js/ui/lookingGlass.js:725 +msgid "Out of date" +msgstr "Caducáu" + +#: ../js/ui/lookingGlass.js:727 +msgid "Downloading" +msgstr "Descargando" + +#: ../js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "Ver fonte" + +#: ../js/ui/lookingGlass.js:754 +msgid "Web Page" +msgstr "Páxina web" + +#: ../js/ui/messageTray.js:1197 +msgid "Open" +msgstr "Abrir" + +#: ../js/ui/messageTray.js:2406 +msgid "System Information" +msgstr "Información del sistema" + +#: ../js/ui/networkAgent.js:145 +msgid "Show password" +msgstr "Amosar contraseña" + +#: ../js/ui/networkAgent.js:160 +msgid "Connect" +msgstr "Coneutar" + +#. Cisco LEAP +#: ../js/ui/networkAgent.js:255 ../js/ui/networkAgent.js:267 +#: ../js/ui/networkAgent.js:294 ../js/ui/networkAgent.js:314 +#: ../js/ui/networkAgent.js:324 +msgid "Password: " +msgstr "Contraseña: " + +#. static WEP +#: ../js/ui/networkAgent.js:260 +msgid "Key: " +msgstr "Contraseña:" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/ui/networkAgent.js:292 ../js/ui/networkAgent.js:310 +msgid "Username: " +msgstr "Nome d'usuariu:" + +#: ../js/ui/networkAgent.js:298 +msgid "Identity: " +msgstr "Identidá:" + +#: ../js/ui/networkAgent.js:300 +msgid "Private key password: " +msgstr "Clave de la contraseña privada:" + +#: ../js/ui/networkAgent.js:312 +msgid "Service: " +msgstr "Serviciu:" + +#: ../js/ui/networkAgent.js:341 +msgid "Authentication required by wireless network" +msgstr "La rede inalámbrica requier autenticación" + +#: ../js/ui/networkAgent.js:342 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network '%" +"s'." +msgstr "" +"Necesítense contraseñes o claves de cifráu p'acceder a la rede inalámbrica «" +"%s»." + +#: ../js/ui/networkAgent.js:346 +msgid "Wired 802.1X authentication" +msgstr "Autenticación 802.1X cableada" + +#: ../js/ui/networkAgent.js:348 +msgid "Network name: " +msgstr "Nome de la rede" + +#: ../js/ui/networkAgent.js:353 +msgid "DSL authentication" +msgstr "Autenticación DSL" + +#: ../js/ui/networkAgent.js:360 +msgid "PIN code required" +msgstr "Códigu PIN requeríu" + +#: ../js/ui/networkAgent.js:361 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Necesítase un códigu PIN pal preséu de banda ancha móvil" + +#: ../js/ui/networkAgent.js:362 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/networkAgent.js:368 +msgid "Mobile broadband network password" +msgstr "Contraseña de la rede de banda ancha móvil" + +#: ../js/ui/networkAgent.js:369 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "Requierse una contraseña pa coneutar a «%s»." + +#: ../js/ui/overview.js:91 +msgid "Undo" +msgstr "Desfacer" + +#: ../js/ui/overview.js:205 +msgid "Windows" +msgstr "Ventanes" + +#: ../js/ui/overview.js:208 +msgid "Applications" +msgstr "Aplicaciones" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:230 +msgid "Dash" +msgstr "Tableru" + +#. TODO - _quit() doesn't really work on apps in state STARTING yet +#: ../js/ui/panel.js:539 +#, c-format +msgid "Quit %s" +msgstr "Colar de %s" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:575 +msgid "Activities" +msgstr "Actividaes" + +#: ../js/ui/panel.js:967 +msgid "Top Bar" +msgstr "Barra superior" + +#: ../js/ui/placeDisplay.js:120 +#, c-format +msgid "Failed to unmount '%s'" +msgstr "Falló al desmontar «%s»" + +#: ../js/ui/placeDisplay.js:123 +msgid "Retry" +msgstr "Reintentar" + +#: ../js/ui/placeDisplay.js:163 +msgid "Connect to..." +msgstr "Coneutar a…" + +#: ../js/ui/placeDisplay.js:375 +msgid "PLACES & DEVICES" +msgstr "LLUGARES Y PRESEOS" + +#: ../js/ui/polkitAuthenticationAgent.js:72 +msgid "Authentication Required" +msgstr "Necesítase autenticación" + +#: ../js/ui/polkitAuthenticationAgent.js:106 +msgid "Administrator" +msgstr "Alministrador" + +#: ../js/ui/polkitAuthenticationAgent.js:175 +msgid "Authenticate" +msgstr "Autenticar" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/polkitAuthenticationAgent.js:256 +msgid "Sorry, that didn't work. Please try again." +msgstr "Inténtalo de nueves," + +#: ../js/ui/polkitAuthenticationAgent.js:268 +msgid "Password:" +msgstr "Contraseña:" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:731 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:208 +msgid "Please enter a command:" +msgstr "Introduz un comandu:" + +#: ../js/ui/searchDisplay.js:340 +msgid "Searching..." +msgstr "Guetando…" + +#: ../js/ui/searchDisplay.js:363 +msgid "No matching results." +msgstr "Nun s'atopó dengún resultáu coincidente." + +#: ../js/ui/shellMountOperation.js:285 +msgid "Wrong password, please try again" +msgstr "Contraseña incorreuta; inténtalo de nueves" + +#: ../js/ui/status/accessibility.js:60 +msgid "Zoom" +msgstr "Ampliación" + +#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, +#. 'screen-reader-enabled'); +#. this.menu.addMenuItem(screenReader); +#: ../js/ui/status/accessibility.js:71 +msgid "Screen Keyboard" +msgstr "Tecláu en pantalla" + +#: ../js/ui/status/accessibility.js:75 +msgid "Visual Alerts" +msgstr "Alertes visuales" + +#: ../js/ui/status/accessibility.js:78 +msgid "Sticky Keys" +msgstr "Tecles persistentes" + +#: ../js/ui/status/accessibility.js:81 +msgid "Slow Keys" +msgstr "Tecles lentes" + +#: ../js/ui/status/accessibility.js:84 +msgid "Bounce Keys" +msgstr "Refugu de tecles" + +#: ../js/ui/status/accessibility.js:87 +msgid "Mouse Keys" +msgstr "Tecles del mur" + +#: ../js/ui/status/accessibility.js:91 +msgid "Universal Access Settings" +msgstr "Configuración del accesu universal" + +#: ../js/ui/status/accessibility.js:141 +msgid "High Contrast" +msgstr "Contraste altu" + +#: ../js/ui/status/accessibility.js:178 +msgid "Large Text" +msgstr "Testu grande" + +#: ../js/ui/status/bluetooth.js:39 ../js/ui/status/bluetooth.js:261 +#: ../js/ui/status/bluetooth.js:347 ../js/ui/status/bluetooth.js:381 +#: ../js/ui/status/bluetooth.js:421 ../js/ui/status/bluetooth.js:454 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:52 +msgid "Visibility" +msgstr "Visibilidá" + +#: ../js/ui/status/bluetooth.js:66 +msgid "Send Files to Device..." +msgstr "Unviar ficheros al preséu…" + +#: ../js/ui/status/bluetooth.js:67 +msgid "Set up a New Device..." +msgstr "Configurar un preséu nuevu…" + +#: ../js/ui/status/bluetooth.js:91 +msgid "Bluetooth Settings" +msgstr "Configuración de Bluetooth" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:111 +msgid "hardware disabled" +msgstr "hardware desactiváu" + +#: ../js/ui/status/bluetooth.js:208 +msgid "Connection" +msgstr "Conexón" + +#: ../js/ui/status/bluetooth.js:217 ../js/ui/status/network.js:486 +msgid "disconnecting..." +msgstr "desconeutando…" + +#: ../js/ui/status/bluetooth.js:230 ../js/ui/status/network.js:492 +msgid "connecting..." +msgstr "coneutando…" + +#: ../js/ui/status/bluetooth.js:248 +msgid "Send Files..." +msgstr "Unviar ficheros…" + +#: ../js/ui/status/bluetooth.js:253 +msgid "Browse Files..." +msgstr "Desaminar ficheros…" + +#: ../js/ui/status/bluetooth.js:262 +msgid "Error browsing device" +msgstr "Fallu al desaminar el preséu" + +#: ../js/ui/status/bluetooth.js:263 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "Nun se pue desaminar el preséu solicitáu, el fallu ye «%s»" + +#: ../js/ui/status/bluetooth.js:271 +msgid "Keyboard Settings" +msgstr "Configuración del tecláu" + +#: ../js/ui/status/bluetooth.js:274 +msgid "Mouse Settings" +msgstr "Axustes del mur…" + +#: ../js/ui/status/bluetooth.js:279 ../js/ui/status/volume.js:62 +msgid "Sound Settings" +msgstr "Configuración del soníu" + +#: ../js/ui/status/bluetooth.js:382 +#, c-format +msgid "Authorization request from %s" +msgstr "Solicitú d'autorización de %s" + +#: ../js/ui/status/bluetooth.js:388 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "El preséu %s quier acceder al serviciu «%s»" + +#: ../js/ui/status/bluetooth.js:390 +msgid "Always grant access" +msgstr "Conceder accesu siempre" + +#: ../js/ui/status/bluetooth.js:391 +msgid "Grant this time only" +msgstr "Conceder namái esta vegada" + +#: ../js/ui/status/bluetooth.js:392 ../js/ui/telepathyClient.js:1200 +msgid "Reject" +msgstr "Refugar" + +#: ../js/ui/status/bluetooth.js:422 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "Confirmación d'emparexamientu pa «%s»" + +#: ../js/ui/status/bluetooth.js:428 ../js/ui/status/bluetooth.js:462 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "El preséu «%s» quier emparexase con esti equipu" + +#: ../js/ui/status/bluetooth.js:429 +#, c-format +msgid "Please confirm whether the PIN '%s' matches the one on the device." +msgstr "Confirma que'l PIN amosáu en «%s» concasa col del preséu." + +#: ../js/ui/status/bluetooth.js:431 +msgid "Matches" +msgstr "Concasa" + +#: ../js/ui/status/bluetooth.js:432 +msgid "Does not match" +msgstr "Nun concasa" + +#: ../js/ui/status/bluetooth.js:455 +#, c-format +msgid "Pairing request for %s" +msgstr "Solicitú d'emparexamientu pa «%s»" + +#: ../js/ui/status/bluetooth.js:463 +msgid "Please enter the PIN mentioned on the device." +msgstr "Introduz el PIN mencionáu nel preséu." + +#: ../js/ui/status/bluetooth.js:479 +msgid "OK" +msgstr "Aceutar" + +#: ../js/ui/status/keyboard.js:73 +msgid "Show Keyboard Layout" +msgstr "Amosar la distribución del tecláu" + +#: ../js/ui/status/keyboard.js:78 +msgid "Region and Language Settings" +msgstr "Configuración de rexón y llingua" + +#: ../js/ui/status/network.js:97 +msgid "" +msgstr "" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:285 +msgid "disabled" +msgstr "desactivada" + +#. 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) +#: ../js/ui/status/network.js:484 +msgid "unmanaged" +msgstr "non xestionada" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:495 +msgid "authentication required" +msgstr "necesítase autenticación" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:505 +msgid "firmware missing" +msgstr "falta'l «firmware»" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:512 +msgid "cable unplugged" +msgstr "cable desconeutáu" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:517 +msgid "unavailable" +msgstr "non disponible" + +#: ../js/ui/status/network.js:519 +msgid "connection failed" +msgstr "falló la conexón" + +#: ../js/ui/status/network.js:575 ../js/ui/status/network.js:1523 +msgid "More..." +msgstr "Más…" + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:611 ../js/ui/status/network.js:1458 +msgid "Connected (private)" +msgstr "Coneutada (privada)" + +#: ../js/ui/status/network.js:689 +msgid "Auto Ethernet" +msgstr "Ethernet automática" + +#: ../js/ui/status/network.js:753 +msgid "Auto broadband" +msgstr "Banda ancha automática" + +#: ../js/ui/status/network.js:756 +msgid "Auto dial-up" +msgstr "Marcáu automáticu" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:878 ../js/ui/status/network.js:1470 +#, c-format +msgid "Auto %s" +msgstr "%s automática" + +#: ../js/ui/status/network.js:880 +msgid "Auto bluetooth" +msgstr "Bluetooth automáticu" + +#: ../js/ui/status/network.js:1472 +msgid "Auto wireless" +msgstr "Inalámbrica automática" + +#: ../js/ui/status/network.js:1566 +msgid "Enable networking" +msgstr "Activar rede" + +#: ../js/ui/status/network.js:1578 +msgid "Wired" +msgstr "Cableada" + +#: ../js/ui/status/network.js:1589 +msgid "Wireless" +msgstr "Inalámbrica" + +#: ../js/ui/status/network.js:1599 +msgid "Mobile broadband" +msgstr "Banda ancha móvil" + +#: ../js/ui/status/network.js:1609 +msgid "VPN Connections" +msgstr "Conexones VPN" + +#: ../js/ui/status/network.js:1620 +msgid "Network Settings" +msgstr "Configuración de la rede" + +#: ../js/ui/status/network.js:1757 +msgid "Connection failed" +msgstr "Falló la conexón" + +#: ../js/ui/status/network.js:1758 +msgid "Activation of network connection failed" +msgstr "Falló l'activación de la conexón de rede" + +#: ../js/ui/status/network.js:2008 +msgid "Networking is disabled" +msgstr "La rede ta desactivada" + +#: ../js/ui/status/network.js:2133 +msgid "Network Manager" +msgstr "Xestor de la rede" + +#: ../js/ui/status/power.js:82 +msgid "Power Settings" +msgstr "Configuración d'enerxía" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:103 +msgid "Estimating..." +msgstr "Estimando…" + +#: ../js/ui/status/power.js:110 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "Queda %d hora" +msgstr[1] "Queden %d hores" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:113 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "Queden %d %s %d %s" + +#: ../js/ui/status/power.js:115 +msgid "hour" +msgid_plural "hours" +msgstr[0] "hora" +msgstr[1] "hores" + +#: ../js/ui/status/power.js:115 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "minutu" +msgstr[1] "minutos" + +#: ../js/ui/status/power.js:118 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "Queda %d minutu" +msgstr[1] "Queden %d minutos" + +#: ../js/ui/status/power.js:121 ../js/ui/status/power.js:194 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d%%" + +#: ../js/ui/status/power.js:201 +msgid "AC adapter" +msgstr "Adautador de corriente" + +#: ../js/ui/status/power.js:203 +msgid "Laptop battery" +msgstr "Batería del portátil" + +#: ../js/ui/status/power.js:205 +msgid "UPS" +msgstr "SAI" + +#: ../js/ui/status/power.js:207 +msgid "Monitor" +msgstr "Monitor" + +#: ../js/ui/status/power.js:209 +msgid "Mouse" +msgstr "Mur" + +#: ../js/ui/status/power.js:213 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:215 +msgid "Cell phone" +msgstr "Teléfonu móvil" + +#: ../js/ui/status/power.js:217 +msgid "Media player" +msgstr "Reproductor multimedia" + +#: ../js/ui/status/power.js:219 +msgid "Tablet" +msgstr "Tableta" + +#: ../js/ui/status/power.js:221 +msgid "Computer" +msgstr "Equipu" + +#: ../js/ui/status/volume.js:42 +msgid "Volume" +msgstr "Volume" + +#: ../js/ui/status/volume.js:54 +msgid "Microphone" +msgstr "Micrófonu" + +#. We got the TpContact +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/telepathyClient.js:259 +msgid "Invitation" +msgstr "Invitación" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:327 +msgid "Call" +msgstr "Llamar" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:357 +msgid "File Transfer" +msgstr "Tresferencia de ficheros" + +#: ../js/ui/telepathyClient.js:438 +msgid "Subscription request" +msgstr "Solicitú de suscripción" + +#: ../js/ui/telepathyClient.js:474 +msgid "Connection error" +msgstr "Fally de conexón" + +#: ../js/ui/telepathyClient.js:737 +#, c-format +msgid "%s is online." +msgstr "%s ta coneutáu/ada." + +#: ../js/ui/telepathyClient.js:742 +#, c-format +msgid "%s is offline." +msgstr "%s ta desconeutáu/ada." + +#: ../js/ui/telepathyClient.js:745 +#, c-format +msgid "%s is away." +msgstr "%s ta ausente." + +#: ../js/ui/telepathyClient.js:748 +#, c-format +msgid "%s is busy." +msgstr "%s ta ocupáu/ada." + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/telepathyClient.js:982 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "Unviáu el %A a les %H:%M" + +#. Translators: this is a time format in the style of "Wednesday, May 25", +#. shown when you get a chat message in the same year. +#: ../js/ui/telepathyClient.js:988 +#, no-c-format +msgid "Sent on %A, %B %d" +msgstr "Unviáu el %A, %d de %B" + +#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", +#. shown when you get a chat message in a different year. +#: ../js/ui/telepathyClient.js:993 +#, no-c-format +msgid "Sent on %A, %B %d, %Y" +msgstr "Unviáu el %A, %d de %B de %Y" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/telepathyClient.js:1035 +#, c-format +msgid "%s is now known as %s" +msgstr "Agora %s llámase %s" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/telepathyClient.js:1144 +#, c-format +msgid "Invitation to %s" +msgstr "Invitación a %s" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/telepathyClient.js:1152 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "%s ta invitándote a xunite a %s" + +#: ../js/ui/telepathyClient.js:1154 ../js/ui/telepathyClient.js:1243 +#: ../js/ui/telepathyClient.js:1347 +msgid "Decline" +msgstr "Refugar" + +#: ../js/ui/telepathyClient.js:1155 ../js/ui/telepathyClient.js:1244 +#: ../js/ui/telepathyClient.js:1348 +msgid "Accept" +msgstr "Aceutar" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1188 +#, c-format +msgid "Video call from %s" +msgstr "Videullamada de %s" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1191 +#, c-format +msgid "Call from %s" +msgstr "Llamada de %s" + +#: ../js/ui/telepathyClient.js:1201 +msgid "Answer" +msgstr "Retrucar" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/telepathyClient.js:1237 +#, c-format +msgid "%s is sending you %s" +msgstr "%s ta unviándote %s" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/telepathyClient.js:1312 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "%s solicita permisu pa ver cuándo tas en llinia" + +#: ../js/ui/telepathyClient.js:1410 +msgid "Network error" +msgstr "Fallu de la rede" + +#: ../js/ui/telepathyClient.js:1412 +msgid "Authentication failed" +msgstr "Falló l'autenticación" + +#: ../js/ui/telepathyClient.js:1414 +msgid "Encryption error" +msgstr "Fallu de cifráu" + +#: ../js/ui/telepathyClient.js:1416 +msgid "Certificate not provided" +msgstr "Certificáu non proporcionáu" + +#: ../js/ui/telepathyClient.js:1418 +msgid "Certificate untrusted" +msgstr "Nun se confía nel certificáu" + +#: ../js/ui/telepathyClient.js:1420 +msgid "Certificate expired" +msgstr "Certificáu caducáu" + +#: ../js/ui/telepathyClient.js:1422 +msgid "Certificate not activated" +msgstr "Certificáu non activáu" + +#: ../js/ui/telepathyClient.js:1424 +msgid "Certificate hostname mismatch" +msgstr "El nome del sirvidor del certificáu no concasa" + +#: ../js/ui/telepathyClient.js:1426 +msgid "Certificate fingerprint mismatch" +msgstr "La buelga del certificáu nun concasa" + +#: ../js/ui/telepathyClient.js:1428 +msgid "Certificate self-signed" +msgstr "Certificáu autofirmáu" + +#: ../js/ui/telepathyClient.js:1430 +msgid "Status is set to offline" +msgstr "L'estáu ta afitáu a «desconeutáu»" + +#: ../js/ui/telepathyClient.js:1432 +msgid "Encryption is not available" +msgstr "El cifráu nun ta disponible" + +#: ../js/ui/telepathyClient.js:1434 +msgid "Certificate is invalid" +msgstr "El certificáu nun ye válidu" + +#: ../js/ui/telepathyClient.js:1436 +msgid "Connection has been refused" +msgstr "Refugóse la conexón" + +#: ../js/ui/telepathyClient.js:1438 +msgid "Connection can't be established" +msgstr "Nun pue afitase la conexón" + +#: ../js/ui/telepathyClient.js:1440 +msgid "Connection has been lost" +msgstr "Perdióse la conexón" + +#: ../js/ui/telepathyClient.js:1442 +msgid "This resource is already connected to the server" +msgstr "Esti recursu yá ta coneutáu al sirvidor" + +#: ../js/ui/telepathyClient.js:1444 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "Sustituyóse la conexón por una nueva conexón usando'l mesmu recursu" + +#: ../js/ui/telepathyClient.js:1446 +msgid "The account already exists on the server" +msgstr "La cuenta yá esiste nel sirvidor" + +#: ../js/ui/telepathyClient.js:1448 +msgid "Server is currently too busy to handle the connection" +msgstr "Anguaño, el sirvidor ta mui ocupáu intentando xestionar la conexón" + +#: ../js/ui/telepathyClient.js:1450 +msgid "Certificate has been revoked" +msgstr "Revocóse'l certificáu" + +#: ../js/ui/telepathyClient.js:1452 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"El certificáu usa un algoritmu de cifráu inseguru o ye criptográficamente " +"feble" + +#: ../js/ui/telepathyClient.js:1454 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"El llargor del certificáu del sirvidor o la profundidá de la cadena del " +"certificáu del sirvidor perpasa llímites impuestos pola biblioteca de " +"criptografía" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/telepathyClient.js:1463 +#, c-format +msgid "Connection to %s failed" +msgstr "Falló la conexón a %s" + +#: ../js/ui/telepathyClient.js:1472 +msgid "Reconnect" +msgstr "Reconeutar" + +#: ../js/ui/telepathyClient.js:1473 +msgid "Edit account" +msgstr "Editar cuenta" + +#: ../js/ui/telepathyClient.js:1519 +msgid "Unknown reason" +msgstr "Razón desconocida" + +#: ../js/ui/userMenu.js:145 +msgid "Hidden" +msgstr "Ocultu" + +#: ../js/ui/userMenu.js:151 +msgid "Idle" +msgstr "Inactivu" + +#: ../js/ui/userMenu.js:154 +msgid "Unavailable" +msgstr "Non disponible" + +#: ../js/ui/userMenu.js:512 ../js/ui/userMenu.js:516 ../js/ui/userMenu.js:586 +msgid "Power Off..." +msgstr "Apagar…" + +#: ../js/ui/userMenu.js:548 +msgid "Notifications" +msgstr "Notificaciones" + +#: ../js/ui/userMenu.js:556 +msgid "Online Accounts" +msgstr "Cuentes en llinia" + +#: ../js/ui/userMenu.js:560 +msgid "System Settings" +msgstr "Configuración del sistema" + +#: ../js/ui/userMenu.js:567 +msgid "Lock Screen" +msgstr "Bloquiar la pantalla" + +#: ../js/ui/userMenu.js:572 +msgid "Switch User" +msgstr "Camudar d'usuariu" + +#: ../js/ui/userMenu.js:577 +msgid "Log Out..." +msgstr "Zarrar la sesión…" + +#: ../js/ui/userMenu.js:605 +msgid "Your chat status will be set to busy" +msgstr "El to estáu del chat va afitase a «ocupáu»" + +#: ../js/ui/userMenu.js:606 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" +"Les notificaciones tán agora desactivaes, incluyendo los mensaxes de chat. " +"El to estáu en llinia axustóse pa qu'otros sepan que nun pues lleer los sos " +"mensaxes." + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/viewSelector.js:120 +msgid "Type to search..." +msgstr "Escribi pa guetar…" + +#: ../js/ui/viewSelector.js:140 ../src/shell-util.c:261 +msgid "Search" +msgstr "Guetar" + +#: ../js/ui/windowAttentionHandler.js:35 +#, c-format +msgid "'%s' is ready" +msgstr "«%s» ta preparáu" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1100 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u salida" +msgstr[1] "%u salides" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1110 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entraes" + +#: ../src/gvc/gvc-mixer-control.c:1408 +msgid "System Sounds" +msgstr "Soníos del sistema" + +#: ../src/main.c:480 +msgid "Print version" +msgstr "Imprentar versión" + +#: ../src/main.c:486 +msgid "Mode used by GDM for login screen" +msgstr "Mou usáu por GDM na pantalla d'aniciu" + +#: ../src/shell-app.c:581 +#, c-format +msgid "Failed to launch '%s'" +msgstr "Falló al llanzar «%s»" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "Reinu Xuníu" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "Predeterminada" + +#: ../src/shell-polkit-authentication-agent.c:334 +msgid "Authentication dialog was dismissed by the user" +msgstr "L'usuariu refugó'l diálogu d'autenticación" + +#: ../src/shell-util.c:100 +msgid "Home Folder" +msgstr "Carpeta personal" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:115 +msgid "File System" +msgstr "Sistema de ficheros" + +#. Translators: the first string is the name of a gvfs +#. * method, and the second string is a path. For +#. * example, "Trash: some-directory". It means that the +#. * directory called "some-directory" is in the trash. +#. +#: ../src/shell-util.c:311 +#, c-format +msgid "%1$s: %2$s" +msgstr "%1$s: %2$s" + +#, c-format +#~ msgid "%s has finished starting" +#~ msgstr "%s finó'l so llanzamientu" diff --git a/po/be.po b/po/be.po new file mode 100644 index 0000000..3d36b3b --- /dev/null +++ b/po/be.po @@ -0,0 +1,2539 @@ +# Ihar Hrachyshka , 2011, 2013, 2014. +# Kasia Bondarava , 2012. +# Yuras Shumovich , 2017 +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell.master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2018-09-30 09:11+0000\n" +"PO-Revision-Date: 2018-10-03 14:38+0300\n" +"Last-Translator: Yuras Shumovich \n" +"Language-Team: Belarusian \n" +"Language: be\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Poedit 2.1.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Сістэма" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Паказаць спіс апавяшчэнняў" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Перанесці фокус на актыўнае апавяшчэнне" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Уключыць агляд" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Паказаць усе праграмы" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Адкрыць праграмнае меню" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:142 +msgid "Shell Extensions" +msgstr "Пашырэнні абалонкі" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Настройкі пашырэнняў абалонкі GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Абалонка GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Кіраванне вокнамі і пуск праграм" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Уключыць унутраныя прылады, прыдатныя для распрацоўшчыкаў і тэстараў, для " +"Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Дазваляе доступ да ўнутраных адладачных і маніторынгавых прылад для дыялогу " +"Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID-значэнні пашырэнняў, якія трэба ўключыць" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Пашырэнні абалонкі GNOME маюць уласцівасць uuid; у гэтым ключы пералічаны " +"пашырэнні, якія неабходна загрузіць. Усе пашырэнні, якія вы хочаце " +"загрузіць, трэба ўпісаць у гэты спіс. Вы таксама можаце кіраваць гэтым " +"спісам метадамі DBus EnableExtension і DisableExtension паслугі org.gnome." +"Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Выключыць пашырэнні, уключаныя карыстальнікам" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Выключыць усе пашырэнні, якія карыстальнік уключыў, але пакінуць настройку " +"\"enabled-extension\"." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Выключае спраўджванне сумяшчальнасці версій пашырэнняў" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Абалонка GNOME запусціць толькі тыя пашырэнні, аўтары якіх сцвярджаюць, што " +"яны працуюць з бягучай версіяй абалонкі. Уключэнне гэтай настройкі выключыць " +"гэту праверку, і для ўсіх пашырэнняў будзе ажыццёўлена спроба загрузкі " +"незалежна ад сцвярджэнняў іх аўтараў." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Спіс ідэнтыфікатараў артыкульных файлаў стала для ўпадабаных праграм" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Праграмы з адпаведнымі ідэнтыфікатарамі будуць паказаны ў абшары ўпадабаных " +"праграм." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Рэжым выбару праграм" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Індэкс абранага рэжыму выбару праграм." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Журнал загаднага дыялогу (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Журнал дыялогу Looking Glass" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Заўсёды паказваць элемент \"Выйсці з сеанса\" ў меню карыстальніка." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Гэты ключ падмяняе аўтаматычнае хаванне элемента меню \"Выйсці з сеанса\" ў " +"выпадку аднаго карыстальніка з адным сеансам." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Ці трэба запамінаць пароль для прымацавання зашыфраваных і аддаленых " +"файлавых сістэм" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Абалонка запатрабуе пароль пры прымацавані зашыфраванага прыстасавання або " +"аддаленай файлавай сістэмы. Калі пароль можна будзе захаваць на будучыню, " +"будзе паказаны пераключальнік \"Запомніць пароль\". Гэты ключ вызначае " +"прадвызначанае становішча гэтага пераключальніка." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Ці наладжваў прадвызначаны адаптар Bluetooth павязаныя з ім прыстасаванні" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Абалонка паказвае пункт меню Bluetooth толькі калі адаптар Bluetooth " +"прыведзены ў дзеянне або не меў наладжаных прыстасаванняў, павязаных з ім. " +"Параметр будзе скінуты, калі прадвызначаны адаптар не будзе мець павязаных " +"прыстасаванняў." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Клавіятурны скарот для адкрыцця праграмнага меню" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Клавіятурны скарот для адкрыцця праграмнага меню." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Клавіятурны скарот для рэжыму \"Паказаць праграмы\"" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Клавіятурны скарот для рэжыму \"Паказаць праграмы\" у Аглядзе Заняткаў." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Клавіятурны скарот для ўключэння агляду" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Клавіятурны скарот для Агляду Заняткаў." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Клавіятурны скарот для пераключэння бачнасці спіса апавяшчэнняў" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Клавіятурны скарот для пераключэння бачнасці спіса апавяшчэнняў." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Клавіятурны скарот для пераносу фокусу на актыўнае апавяшчэнне" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Клавіятурны скарот для пераносу фокусу на актыўнае апавяшчэнне." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Клавіятурны скарот, які прыпыняе або аднаўляе ўсе запушчаныя анімацыі, для " +"мэт адладкі." + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Ужываная клавіятура" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Від ужыванай клавіятуры." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Абмежаваць пераключальнік дзейнай прасторай працы." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Калі ўключана, у пераключальніку будуць бачныя толькі праграмы, якія маюць " +"вокны на дзейнай прасторы працы. Іначай усе праграмы будуць улучаны." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Рэжым значкоў праграм." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Настройка паказу вокнаў у пераключальніку. Магчымыя значэнні: \"thumbnail-" +"only\" (паказваць мініяцюры вокнаў), \"app-icon-only\" (паказваць толькі " +"значкі праграм) і \"both\" (адразу ўсё)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Калі ўключана, у пераключальніку будуць бачныя толькі вокны на дзейнай " +"прасторы працы. Іначай усе вокны будуць улучаны." + +#: data/org.gnome.shell.gschema.xml.in:198 +msgid "Attach modal dialog to the parent window" +msgstr "Чапляць мадальныя дыялогавыя акенцы да бацькоўскіх вокнаў" + +#: data/org.gnome.shell.gschema.xml.in:199 +#: data/org.gnome.shell.gschema.xml.in:208 +#: data/org.gnome.shell.gschema.xml.in:216 +#: data/org.gnome.shell.gschema.xml.in:224 +#: data/org.gnome.shell.gschema.xml.in:232 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Гэты ключ падмяняе ключ у org.gnome.mutter пры запуску Абалонкі GNOME." + +#: data/org.gnome.shell.gschema.xml.in:207 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Уключыць парадкаванне на краі экрана пры перацягванні туды вокнаў" + +#: data/org.gnome.shell.gschema.xml.in:215 +msgid "Workspaces are managed dynamically" +msgstr "Дынамічнае кіраванне прасторамі працы" + +#: data/org.gnome.shell.gschema.xml.in:223 +msgid "Workspaces only on primary monitor" +msgstr "Прасторы працы толькі для асноўнага манітора" + +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Затрымліваць змяненне фокусу ў рэжыме мышы да спынення руху яе паказальніка" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Сеткавы ўваход" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:112 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "" +"Падчас спробы загрузкі дыялогавага акенца настроек для %s адбылася памылка:" + +#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:62 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 +#: js/ui/endSessionDialog.js:442 js/ui/extensionDownloader.js:197 +#: js/ui/shellMountOperation.js:345 js/ui/status/network.js:905 +msgid "Cancel" +msgstr "Скасаваць" + +#: js/gdm/authPrompt.js:166 js/gdm/authPrompt.js:209 js/gdm/authPrompt.js:441 +msgid "Next" +msgstr "Далей" + +#: js/gdm/authPrompt.js:205 js/ui/shellMountOperation.js:349 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Разблакіраваць" + +#: js/gdm/authPrompt.js:207 +msgctxt "button" +msgid "Sign In" +msgstr "Увайсці" + +#: js/gdm/loginDialog.js:319 +msgid "Choose Session" +msgstr "Выбар сеанса" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:462 +msgid "Not listed?" +msgstr "Няма ў спісе?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:891 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(напр., карыстальнік ці %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Імя карыстальніка: " + +#: js/gdm/loginDialog.js:1234 +msgid "Login Window" +msgstr "Акно ўваходу" + +#: js/gdm/util.js:345 +msgid "Authentication error" +msgstr "Памылка ідэнтыфікацыі" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:485 +msgid "(or swipe finger)" +msgstr "(або правядзіце пальцам)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:97 +msgctxt "search-result" +msgid "Power Off" +msgstr "Выключыць камп'ютар" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:100 +msgid "power off;shutdown;reboot;restart" +msgstr "выключыць;перазапусціць" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:104 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Заблакіраваць экран" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:107 +msgid "lock screen" +msgstr "заблакіраваць экран" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:111 +msgctxt "search-result" +msgid "Log Out" +msgstr "Выйсці з сеанса" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:114 +msgid "logout;sign off" +msgstr "выйсці з сеанса" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:118 +msgctxt "search-result" +msgid "Suspend" +msgstr "Прыпыніць камп'ютар" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:121 +msgid "suspend;sleep" +msgstr "прыпыніць камп'ютар;заснуць" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:125 +msgctxt "search-result" +msgid "Switch User" +msgstr "Перамяніць карыстальніка" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:128 +msgid "switch user" +msgstr "перамяніць карыстальніка" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:132 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Блакіраваць арыентацыю" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:135 +msgid "lock orientation;screen;rotation" +msgstr "блакіраваць арыентацыю;экран;павярнуць" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Загад не знойдзены" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Не ўдалося разабраць загад:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Не ўдалося выканаць \"%s\":" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Толькі што" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d хвіліну таму" +msgstr[1] "%d хвіліны таму" +msgstr[2] "%d хвілін таму" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d гадзіну таму" +msgstr[1] "%d гадзіны таму" +msgstr[2] "%d гадзін таму" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Учора" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d дзень таму" +msgstr[1] "%d дні таму" +msgstr[2] "%d дзён таму" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d тыдзень таму" +msgstr[1] "%d тыдні таму" +msgstr[2] "%d тыдняў таму" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d месяц таму" +msgstr[1] "%d месяцы таму" +msgstr[2] "%d месяцаў таму" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d год таму" +msgstr[1] "%d гады таму" +msgstr[2] "%d гадоў таму" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Учора, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Учора, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:49 +msgid "Hotspot Login" +msgstr "Хотспот уваход" + +#: js/portalHelper/main.js:95 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Злучэнне з гэтым хотспотам не бяспечнае. Людзі вакол могуць атрымаць паролі " +"або іншую інфармацыю, якую вы ўводзіце на старонцы." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:46 js/ui/status/location.js:376 +msgid "Deny Access" +msgstr "Адмовіць у доступе." + +#: js/ui/accessDialog.js:47 js/ui/status/location.js:379 +msgid "Grant Access" +msgstr "Дазволіць доступ" + +#: js/ui/appDisplay.js:790 +msgid "Frequently used applications will appear here" +msgstr "Тут размешчаныя часта ўжываныя праграмы" + +#: js/ui/appDisplay.js:911 +msgid "Frequent" +msgstr "Часта" + +#: js/ui/appDisplay.js:918 +msgid "All" +msgstr "Усе" + +#: js/ui/appDisplay.js:1887 +msgid "New Window" +msgstr "Новае акно" + +#: js/ui/appDisplay.js:1901 +msgid "Launch using Dedicated Graphics Card" +msgstr "Запусціць з выкарыстаннем дыскрэтнай відэакарты" + +#: js/ui/appDisplay.js:1928 js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "Выдаліць са спіса ўпадабанага" + +#: js/ui/appDisplay.js:1934 +msgid "Add to Favorites" +msgstr "Дадаць у спіс упадабанага" + +#: js/ui/appDisplay.js:1944 +msgid "Show Details" +msgstr "Паказваць падрабязнасці" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s дададзены ў ваш спіс упадабанага." + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s выдалены з вашага спіса ўпадабанага." + +#: js/ui/audioDeviceSelection.js:50 +msgid "Select Audio Device" +msgstr "Абраць аўдыёпрыладу" + +#: js/ui/audioDeviceSelection.js:60 +msgid "Sound Settings" +msgstr "Настройкі гуку" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headphones" +msgstr "Навушнікі" + +#: js/ui/audioDeviceSelection.js:71 +msgid "Headset" +msgstr "Аўдыягарнітура" + +#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:255 +msgid "Microphone" +msgstr "Мікрафон" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Змяніць фон..." + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:47 +msgid "Display Settings" +msgstr "Паказаць настройкі" + +#: js/ui/backgroundMenu.js:22 +msgid "Settings" +msgstr "Настройкі" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:44 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:73 +msgctxt "grid sunday" +msgid "S" +msgstr "Н" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:75 +msgctxt "grid monday" +msgid "M" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:77 +msgctxt "grid tuesday" +msgid "T" +msgstr "А" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:79 +msgctxt "grid wednesday" +msgid "W" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:81 +msgctxt "grid thursday" +msgid "T" +msgstr "Ч" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:83 +msgctxt "grid friday" +msgid "F" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:85 +msgctxt "grid saturday" +msgid "S" +msgstr "С" + +#. * +#. * 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:380 +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:390 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:447 +msgid "Previous month" +msgstr "Папярэдні месяц" + +#: js/ui/calendar.js:457 +msgid "Next month" +msgstr "Наступны месяц" + +#: js/ui/calendar.js:610 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:665 +msgid "Week %V" +msgstr "Тыдзень %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:734 +msgctxt "event list time" +msgid "All Day" +msgstr "Увесь дзень" + +#: js/ui/calendar.js:869 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/calendar.js:873 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d %B, %Y" + +#: js/ui/calendar.js:1103 +msgid "No Notifications" +msgstr "Няма апавяшчэнняў" + +#: js/ui/calendar.js:1106 +msgid "No Events" +msgstr "Няма падзей" + +#: js/ui/calendar.js:1134 +msgid "Clear All" +msgstr "Ачысціць усё" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "\"%s\" не адказвае." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Вы можаце альбо крыху пачакаць адказу, альбо змусіць праграму да выхаду." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Змусіць да выхаду" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Пачакаць" + +#: js/ui/components/automountManager.js:90 +msgid "External drive connected" +msgstr "Далучаны знешні прывод" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Адлучаны знешні прывод" + +#: js/ui/components/autorunManager.js:348 +#, javascript-format +msgid "Open with %s" +msgstr "Адкрыць у %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 +msgid "Password:" +msgstr "Пароль:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Паўтарыце пароль:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:229 +#: js/ui/status/network.js:320 js/ui/status/network.js:908 +msgid "Connect" +msgstr "Злучыць" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Пароль: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Ключ: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Пароль да прыватнага ключа: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Ідэнтычнасць: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Паслуга: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:688 +msgid "Authentication required by wireless network" +msgstr "Для бесправадной сеткі патрэбная ідэнтыфікацыя" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:689 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Для доступу да бесправадной сеткі \"%s\" патрэбны пароль або ключы " +"шыфравання." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:692 +msgid "Wired 802.1X authentication" +msgstr "Правадная ідэнтыфікацыя 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Назва сеткі: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:696 +msgid "DSL authentication" +msgstr "DSL-ідэнтыфікацыя" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:702 +msgid "PIN code required" +msgstr "Патрэбны PIN-код" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:703 +msgid "PIN code is needed for the mobile broadband device" +msgstr "" +"Для прыстасавання для доступу да шырокапалоснай мабільнай сеткі патрэбны PIN-" +"код" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN-код: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:709 +msgid "Mobile broadband network password" +msgstr "Пароль да шырокапалоснай мабільнай сеткі" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:693 +#: js/ui/components/networkAgent.js:697 js/ui/components/networkAgent.js:710 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Каб злучыцца з \"%s\", патрэбны пароль." + +#: js/ui/components/networkAgent.js:677 js/ui/status/network.js:1690 +msgid "Network Manager" +msgstr "Сеткавы кіраўнік" + +#: js/ui/components/polkitAgent.js:48 +msgid "Authentication Required" +msgstr "Патрэбная ідэнтыфікацыя" + +#: js/ui/components/polkitAgent.js:76 +msgid "Administrator" +msgstr "Адміністратар" + +#: js/ui/components/polkitAgent.js:156 +msgid "Authenticate" +msgstr "Ідэнтыфікаваць" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:329 +msgid "Sorry, that didn’t work. Please try again." +msgstr "На жаль, ідэнтыфікацыя не адбылася. Паўтарыце спробу." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:795 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s змяніў імя на %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Вокны" + +#: 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:444 +msgid "Dash" +msgstr "Прыборная дошка" + +#. 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:74 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "Дадаць сусветныя гадзіннікі..." + +#: js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "Сусветныя гадзіннікі" + +#: js/ui/dateMenu.js:227 +msgid "Weather" +msgstr "Надвор'е" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:291 +#, javascript-format +msgid "%s all day." +msgstr "%s увесь дзень." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:297 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, пасля %s." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:303 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, пасля %s, далей %s." + +#: js/ui/dateMenu.js:314 +msgid "Select a location…" +msgstr "Выбраць месцазнаходжанне..." + +#: js/ui/dateMenu.js:317 +msgid "Loading…" +msgstr "Загрузка..." + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:323 +#, javascript-format +msgid "Feels like %s." +msgstr "Адчуваецца як %s." + +#: js/ui/dateMenu.js:326 +msgid "Go online for weather information" +msgstr "Злучыцеся з сеткай каб атрымаць інфармацыю пра надвор'е" + +#: js/ui/dateMenu.js:328 +msgid "Weather information is currently unavailable" +msgstr "Інфармацыя пра надвор'е недаступная" + +#: js/ui/endSessionDialog.js:51 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Заканчэнне сеанса (%s)" + +#: js/ui/endSessionDialog.js:52 +msgctxt "title" +msgid "Log Out" +msgstr "Заканчэнне сеанса" + +#: js/ui/endSessionDialog.js:54 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s аўтаматычна скончыць сеанс працы з сістэмай праз %d секунду." +msgstr[1] "%s аўтаматычна скончыць сеанс працы з сістэмай праз %d секунды." +msgstr[2] "%s аўтаматычна скончыць сеанс працы з сістэмай праз %d секунд." + +#: js/ui/endSessionDialog.js:59 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Вы аўтаматычна скончыце сеанс працы з сістэмай праз %d секунду." +msgstr[1] "Вы аўтаматычна скончыце сеанс працы з сістэмай праз %d секунды." +msgstr[2] "Вы аўтаматычна скончыце сеанс працы з сістэмай праз %d секунд." + +#: js/ui/endSessionDialog.js:65 +msgctxt "button" +msgid "Log Out" +msgstr "Скончыць сеанс" + +#: js/ui/endSessionDialog.js:71 +msgctxt "title" +msgid "Power Off" +msgstr "Выключэнне камп'ютара" + +#: js/ui/endSessionDialog.js:72 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Усталяваць абноўкі і выключыць камп'ютар" + +#: js/ui/endSessionDialog.js:74 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Сістэма аўтаматычна выключыцца праз %d секунду." +msgstr[1] "Сістэма аўтаматычна выключыцца праз %d секунды." +msgstr[2] "Сістэма аўтаматычна выключыцца праз %d секунд." + +#: js/ui/endSessionDialog.js:78 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Усталяваць наяўныя праграмныя абноўкі" + +#: js/ui/endSessionDialog.js:81 js/ui/endSessionDialog.js:98 +msgctxt "button" +msgid "Restart" +msgstr "Перазапусціць сістэму" + +#: js/ui/endSessionDialog.js:83 +msgctxt "button" +msgid "Power Off" +msgstr "Выключыць камп'ютар" + +#: js/ui/endSessionDialog.js:90 +msgctxt "title" +msgid "Restart" +msgstr "Перазапуск сістэмы" + +#: js/ui/endSessionDialog.js:92 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Сістэма аўтаматычна перазапусціцца праз %d секунду." +msgstr[1] "Сістэма аўтаматычна перазапусціцца праз %d секунды." +msgstr[2] "Сістэма аўтаматычна перазапусціцца праз %d секунд." + +#: js/ui/endSessionDialog.js:106 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Перазапуск і ўсталяванне абнаўленняў" + +#: js/ui/endSessionDialog.js:108 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Сістэма аўтаматычна перазапусціцца і ўсталюе абнаўленні праз %d секунду." +msgstr[1] "" +"Сістэма аўтаматычна перазапусціцца і ўсталюе абнаўленні праз %d секунды." +msgstr[2] "" +"Сістэма аўтаматычна перазапусціцца і ўсталюе абнаўленні праз %d секунд." + +#: js/ui/endSessionDialog.js:114 js/ui/endSessionDialog.js:134 +msgctxt "button" +msgid "Restart & Install" +msgstr "Перазапусціць і ўсталяваць" + +#: js/ui/endSessionDialog.js:115 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Усталяваць і выключыць камп'ютар" + +#: js/ui/endSessionDialog.js:116 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Выключыць камп'ютар пасля ўсталявання абновак" + +#: js/ui/endSessionDialog.js:124 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Перазапуск і ўсталяванне абнаўленняў" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:129 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s будзе ўсталявана пасля перазапуску. Усталяванне абнаўленняў можа " +"заняць шмат часу, праверце, што вы маеце запасныя копіі, і камп'ютар " +"падключаны да сілкавання." + +#: js/ui/endSessionDialog.js:321 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Камп'ютар сілкуецца ад акумулятара: падлучыце да знешняй крыніцы энергіі " +"перад усталяваннем абновак." + +#: js/ui/endSessionDialog.js:338 +msgid "Some applications are busy or have unsaved work." +msgstr "Некаторыя праграмы занятыя або маюць незахаваныя вынікі працы." + +#: js/ui/endSessionDialog.js:345 +msgid "Other users are logged in." +msgstr "Іншыя карыстальнікі ў сістэме." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:626 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (аддалены сеанс)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:629 +#, javascript-format +msgid "%s (console)" +msgstr "%s (кансоль)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Усталяваць" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s жадае заблакаваць клавіятурныя скароты " + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Праграма жадае заблакаваць клавіятурныя скароты" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Каб аднавіць працу клавіятурных скаротаў, націсніце %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Забараніць" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Дазволіць" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned On" +msgstr "Марудныя клавішы ўключаны" + +#: js/ui/kbdA11yDialog.js:34 +msgid "Slow Keys Turned Off" +msgstr "Марудныя клавішы выключаны" + +#: 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 "" +"Вы пратрымалі клавішу Shift націснутай цягам 8 секунд. Гэты скарот уключае " +"функцыю марудных клавіш, што ўплывае на паводзіны клавіятуры." + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned On" +msgstr "Грузкія клавішы ўключаны" + +#: js/ui/kbdA11yDialog.js:43 +msgid "Sticky Keys Turned Off" +msgstr "Грузкія клавішы выключаны" + +#: 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 "" +"Вы націснулі клавішу Shift 5 разоў запар. Гэты скарот уключае функцыю " +"грузкіх клавіш, што ўплывае на паводзіны клавіятуры." + +#: 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 "" +"Вы націснулі дзве клавішы адначасова або клавішу Shift 5 разоў запар. Гэты " +"скарот выключае функцыю грузкіх клавіш, што ўплывае на паводзіны клавіятуры." + +#: js/ui/kbdA11yDialog.js:59 +msgid "Leave On" +msgstr "Пакінуць уключаным" + +#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:138 +#: js/ui/status/network.js:1280 +msgid "Turn On" +msgstr "Уключыць" + +#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:138 +#: js/ui/status/network.js:138 js/ui/status/network.js:321 +#: js/ui/status/network.js:1280 js/ui/status/network.js:1395 +#: js/ui/status/nightLight.js:43 js/ui/status/rfkill.js:85 +#: js/ui/status/rfkill.js:112 +msgid "Turn Off" +msgstr "Выключыць" + +#: js/ui/kbdA11yDialog.js:67 +msgid "Leave Off" +msgstr "Пакінуць выключаным" + +#: js/ui/keyboard.js:198 +msgid "Region & Language Settings" +msgstr "Настройкі рэгіёну і мовы" + +#: js/ui/lookingGlass.js:644 +msgid "No extensions installed" +msgstr "Няма ўсталяваных пашырэнняў" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:698 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s не зрабіў ніякіх памылак." + +#: js/ui/lookingGlass.js:704 +msgid "Hide Errors" +msgstr "Хаваць памылкі" + +#: js/ui/lookingGlass.js:708 js/ui/lookingGlass.js:768 +msgid "Show Errors" +msgstr "Паказваць памылкі" + +#: js/ui/lookingGlass.js:717 +msgid "Enabled" +msgstr "Уключана" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:720 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Выключана" + +#: js/ui/lookingGlass.js:722 +msgid "Error" +msgstr "Памылка" + +#: js/ui/lookingGlass.js:724 +msgid "Out of date" +msgstr "Састарэла" + +#: js/ui/lookingGlass.js:726 +msgid "Downloading" +msgstr "Сцягванне" + +#: js/ui/lookingGlass.js:750 +msgid "View Source" +msgstr "Паглядзець выточны код" + +#: js/ui/lookingGlass.js:759 +msgid "Web Page" +msgstr "Сеціўная старонка" + +#: js/ui/messageTray.js:1495 +msgid "System Information" +msgstr "Сістэмная інфармацыя" + +#: js/ui/mpris.js:185 +msgid "Unknown artist" +msgstr "Невядомы выканаўца" + +#: js/ui/mpris.js:186 +msgid "Unknown title" +msgstr "Невядомая назва" + +#: js/ui/osdWindow.js:32 js/ui/status/volume.js:204 +msgid "Volume" +msgstr "Гучнасць" + +#: js/ui/overview.js:83 +msgid "Undo" +msgstr "Адрабіць" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:112 +msgid "Overview" +msgstr "Агляд" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:239 +msgid "Type to search…" +msgstr "Увядзіце тэкст для пошуку..." + +#: js/ui/padOsd.js:107 +msgid "New shortcut…" +msgstr "Новы скарот..." + +#: js/ui/padOsd.js:158 +msgid "Application defined" +msgstr "Праграма вызначана" + +#: js/ui/padOsd.js:159 +msgid "Show on-screen help" +msgstr "Паказаць даведку на экране" + +#: js/ui/padOsd.js:160 +msgid "Switch monitor" +msgstr "Перамяніць манітор" + +#: js/ui/padOsd.js:161 +msgid "Assign keystroke" +msgstr "Прызначыць клавішу" + +#: js/ui/padOsd.js:228 +msgid "Done" +msgstr "Гатова" + +#: js/ui/padOsd.js:744 +msgid "Edit…" +msgstr "Рэдагаваць..." + +#: js/ui/padOsd.js:786 js/ui/padOsd.js:891 +msgid "None" +msgstr "Нічога" + +#: js/ui/padOsd.js:845 +msgid "Press a button to configure" +msgstr "Націсніце кнопку каб настроіць." + +#: js/ui/padOsd.js:846 +msgid "Press Esc to exit" +msgstr "Націсніце Esc каб выйсці" + +#: js/ui/padOsd.js:849 +msgid "Press any key to exit" +msgstr "Націсніце любую клавішу каб выйсці" + +#: js/ui/panel.js:359 +msgid "Quit" +msgstr "Выйсці" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:415 +msgid "Activities" +msgstr "Заняткі" + +#: js/ui/panel.js:696 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Сістэма" + +#: js/ui/panel.js:820 +msgid "Top Bar" +msgstr "Верхняя панэль" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:300 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:74 +msgid "Enter a Command" +msgstr "Увядзіце загад" + +#: js/ui/runDialog.js:114 js/ui/windowMenu.js:174 +msgid "Close" +msgstr "Закрыць" + +#: js/ui/runDialog.js:276 +msgid "Restart is not available on Wayland" +msgstr "Перазапусціць, калі недаступна на Wayland" + +#: js/ui/runDialog.js:281 +msgid "Restarting…" +msgstr "Перазапуск..." + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d новае паведамленне" +msgstr[1] "%d новыя паведамленні" +msgstr[2] "%d новых паведамленняў" + +#: js/ui/screenShield.js:148 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d новае апавяшчэнне" +msgstr[1] "%d новыя апавяшчэнні" +msgstr[2] "%d новых апавяшчэнняў" + +#: js/ui/screenShield.js:451 js/ui/status/system.js:294 +msgid "Lock" +msgstr "Заблакіраваць" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "GNOME патрабуе блакіравання экрана" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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:1309 +msgid "Unable to lock" +msgstr "Не ўдалося заблакіраваць" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1310 +msgid "Lock was blocked by an application" +msgstr "Блакіраванне стрымана праграмай" + +#: js/ui/search.js:660 +msgid "Searching…" +msgstr "Пошук..." + +#: js/ui/search.js:662 +msgid "No results." +msgstr "Нічога не знойдзена." + +#: js/ui/search.js:786 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "яшчэ %d" +msgstr[1] "яшчэ %d" +msgstr[2] "яшчэ %d" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Скапіраваць" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Уставіць" + +#: js/ui/shellEntry.js:96 +msgid "Show Text" +msgstr "Паказваць тэкст" + +#: js/ui/shellEntry.js:98 +msgid "Hide Text" +msgstr "Хаваць тэкст" + +#: js/ui/shellMountOperation.js:316 +msgid "Password" +msgstr "Пароль" + +#: js/ui/shellMountOperation.js:337 +msgid "Remember Password" +msgstr "Запомніць пароль" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Даступнасць" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Маштабаванне" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Чытальнік з экрана" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Экранная клавіятура" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Візуальныя сігналы" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Грузкія клавішы" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Марудныя клавішы" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Рыкашэтныя клавішы" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Мышыныя клавішы" + +#: js/ui/status/accessibility.js:165 +msgid "High Contrast" +msgstr "Высокая кантраснасць" + +#: js/ui/status/accessibility.js:200 +msgid "Large Text" +msgstr "Буйны тэкст" + +#: js/ui/status/bluetooth.js:43 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:52 js/ui/status/network.js:600 +msgid "Bluetooth Settings" +msgstr "Настройкі Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:132 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d злучаны" +msgstr[1] "%d злучана" +msgstr[2] "%d злучана" + +#: js/ui/status/bluetooth.js:134 +msgid "Off" +msgstr "Выключана" + +#: js/ui/status/bluetooth.js:136 +msgid "On" +msgstr "Укл." + +#: js/ui/status/brightness.js:41 +msgid "Brightness" +msgstr "Яркасць" + +#: js/ui/status/keyboard.js:781 +msgid "Keyboard" +msgstr "Клавіятура" + +#: js/ui/status/keyboard.js:804 +msgid "Show Keyboard Layout" +msgstr "Паказаць клавіятурную раскладку" + +#: js/ui/status/location.js:72 js/ui/status/location.js:180 +msgid "Location Enabled" +msgstr "Месцапалажэнне ўключана" + +#: js/ui/status/location.js:73 js/ui/status/location.js:181 +msgid "Disable" +msgstr "Выключыць" + +#: js/ui/status/location.js:74 +msgid "Privacy Settings" +msgstr "Настройкі прыватнасці" + +#: js/ui/status/location.js:179 +msgid "Location In Use" +msgstr "Месцапалажэнне выкарыстоўваецца" + +#: js/ui/status/location.js:183 +msgid "Location Disabled" +msgstr "Месцапалажэнне не выкарыстоўваецца" + +#: js/ui/status/location.js:184 +msgid "Enable" +msgstr "Уключыць" + +#. Translators: %s is an application name +#: js/ui/status/location.js:369 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Даць %s доступ да вашага месцапалажэннея?" + +#: js/ui/status/location.js:370 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Доступ да месцапалажэння можна змяніць праз настройкі прыватнасці." + +#: js/ui/status/network.js:74 +msgid "" +msgstr "<невядома>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 js/ui/status/network.js:1309 +#, javascript-format +msgid "%s Off" +msgstr "%s выключана" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:430 +#, javascript-format +msgid "%s Connected" +msgstr "%s злучана" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:435 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s непадкантрольна" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:438 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s адлучэнне" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:445 js/ui/status/network.js:1301 +#, javascript-format +msgid "%s Connecting" +msgstr "%s злучэнне" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:448 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s патрабуе ідэнтыфікацыі" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:456 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Няма апаратнага апраграмавання для %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:460 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s недаступна" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:463 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Не ўдалося злучыць %s" + +#: js/ui/status/network.js:479 +msgid "Wired Settings" +msgstr "Настройкі праваднога злучэння" + +#: js/ui/status/network.js:521 +msgid "Mobile Broadband Settings" +msgstr "Настройкі мабільнага злучэння" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:564 js/ui/status/network.js:1306 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s прыстасаванне выключана" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:568 +#, javascript-format +msgid "%s Disabled" +msgstr "%s выключана" + +#: js/ui/status/network.js:608 +msgid "Connect to Internet" +msgstr "Злучыцца з інтэрнэтам" + +#: js/ui/status/network.js:802 +msgid "Airplane Mode is On" +msgstr "Рэжым самалёта ўключаны" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "У рэжыме самалёта выключаецца Wi-Fi." + +#: js/ui/status/network.js:804 +msgid "Turn Off Airplane Mode" +msgstr "Выключыць рэжым самалёта" + +#: js/ui/status/network.js:813 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi выключаны" + +#: js/ui/status/network.js:814 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Каб злучыцца з сеткай, спачатку трэба ўключыць Wi-Fi." + +#: js/ui/status/network.js:815 +msgid "Turn On Wi-Fi" +msgstr "Уключыць Wi-Fi" + +#: js/ui/status/network.js:840 +msgid "Wi-Fi Networks" +msgstr "Сеткі Wi-Fi" + +#: js/ui/status/network.js:842 +msgid "Select a network" +msgstr "Выберыце сетку" + +#: js/ui/status/network.js:872 +msgid "No Networks" +msgstr "Няма сетак" + +#: js/ui/status/network.js:893 js/ui/status/rfkill.js:110 +msgid "Use hardware switch to turn off" +msgstr "Задзейнічаць апаратны выключальнік" + +#: js/ui/status/network.js:1172 +msgid "Select Network" +msgstr "Выбраць сетку" + +#: js/ui/status/network.js:1178 +msgid "Wi-Fi Settings" +msgstr "Настройкі Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1297 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s хотспот уключаны" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1312 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s не злучэнна" + +#: js/ui/status/network.js:1412 +msgid "connecting…" +msgstr "усталяванне злучэння..." + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1415 +msgid "authentication required" +msgstr "патрэбная ідэнтыфікацыя" + +#: js/ui/status/network.js:1417 +msgid "connection failed" +msgstr "не ўдалося злучыцца" + +#: js/ui/status/network.js:1471 +msgid "VPN Settings" +msgstr "Настройкі VPN" + +#: js/ui/status/network.js:1484 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1494 +msgid "VPN Off" +msgstr "VPN выключаны" + +#: js/ui/status/network.js:1558 js/ui/status/rfkill.js:88 +msgid "Network Settings" +msgstr "Сеткавыя настройкі" + +#: js/ui/status/network.js:1587 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s правадное злучэнне" +msgstr[1] "%s правадных злучэння" +msgstr[2] "%s правадных злучэнняў" + +#: js/ui/status/network.js:1591 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi злучэнне" +msgstr[1] "%s Wi-Fi злучэння" +msgstr[2] "%s Wi-Fi злучэнняў" + +#: js/ui/status/network.js:1595 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s мадэмнае злучэнне" +msgstr[1] "%s мадэмных злучэння" +msgstr[2] "%s мадэмных злучэнняў" + +#: js/ui/status/network.js:1727 +msgid "Connection failed" +msgstr "Не ўдалося злучыцца" + +#: js/ui/status/network.js:1728 +msgid "Activation of network connection failed" +msgstr "Не ўдалося ўключыць сеткавае злучэнне" + +#: js/ui/status/nightLight.js:64 +msgid "Night Light Disabled" +msgstr "Начное святло выключана" + +#: js/ui/status/nightLight.js:65 +msgid "Night Light On" +msgstr "Начное святло уключана" + +#: js/ui/status/nightLight.js:66 +msgid "Resume" +msgstr "Узнавіць" + +#: js/ui/status/nightLight.js:67 +msgid "Disable Until Tomorrow" +msgstr "Выключыць да заўтра" + +#: js/ui/status/power.js:52 +msgid "Power Settings" +msgstr "Настройкі сілкавання" + +#: js/ui/status/power.js:68 +msgid "Fully Charged" +msgstr "Поўны зарад" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:75 js/ui/status/power.js:81 +msgid "Estimating…" +msgstr "Прыблізная ацэнка..." + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Засталося: %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:94 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Да поўнага зараду: %d∶%02d (%d %%)" + +#: js/ui/status/power.js:122 js/ui/status/power.js:124 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:46 +msgid "Screen is Being Shared" +msgstr "Экран супольна даступны" + +#: js/ui/status/remoteAccess.js:48 +msgid "Turn off" +msgstr "Выключыць" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:83 +msgid "Airplane Mode On" +msgstr "Рэжым самалёта ўключаны" + +#: js/ui/status/system.js:227 +msgid "Switch User" +msgstr "Перамяніць карыстальніка" + +#: js/ui/status/system.js:239 +msgid "Log Out" +msgstr "Выйсці з сеанса" + +#: js/ui/status/system.js:251 +msgid "Account Settings" +msgstr "Настройкі конта" + +#: js/ui/status/system.js:279 +msgid "Orientation Lock" +msgstr "Блакіраванне арыентацыі" + +#: js/ui/status/system.js:305 +msgid "Suspend" +msgstr "Прыпыніць камп'ютар" + +#: js/ui/status/system.js:315 +msgid "Power Off" +msgstr "Выключыць камп'ютар" + +#: js/ui/status/thunderbolt.js:268 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#. we are done +#: js/ui/status/thunderbolt.js:324 +msgid "Unknown Thunderbolt device" +msgstr "Невядомае прыстасаванне Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Падчас вашай адсутнасці было выяўлена новае прыстасаванне. Каб пачаць ім " +"карыстацца, адлучыце і зноў падлучыце яго." + +#: js/ui/status/thunderbolt.js:330 +msgid "Thunderbolt authorization error" +msgstr "Памылка ўпаўнаважання Thunderbolt" + +#: js/ui/status/thunderbolt.js:331 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Не ўдалося ўпаўнаважыць прыстасаванне Thunderbolt: %s" + +#: js/ui/status/volume.js:135 +msgid "Volume changed" +msgstr "Гучнасць зменена" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Адлюстроўваць" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Аб'яднаць маніторы" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Толькі знешні" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Толькі ўбудаваны" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Увайсці іншым карыстальнікам" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Акно блакіравання" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Праграмы" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Пошук" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "\"%s\" гатова" + +#: js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "Захаваць гэтыя настройкі дысплея?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:75 +msgid "Revert Settings" +msgstr "Вярнуць былыя настройкі" + +#: js/ui/windowManager.js:78 +msgid "Keep Changes" +msgstr "Захаваць змены" + +#: js/ui/windowManager.js:96 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Змены настроек будуць скасаваныя праз %d секунду" +msgstr[1] "Змены настроек будуць скасаваныя праз %d секунды" +msgstr[2] "Змены настроек будуць скасаваныя праз %d секунд" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:681 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Мінімалізаваць" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Скасаваць максімалізацыю" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Максімалізаваць" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Перамясціць" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Змяніць памер" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Перамясціць загалоўную стужку на экран" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Заўсёды зверху" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Заўсёды на бачнай прасторы працы" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Перамясціць на прастору працы лявей" + +#: js/ui/windowMenu.js:109 +msgid "Move to Workspace Right" +msgstr "Перамясціць на прастору працы правей" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Перамясціць на прастору працы вышэй" + +#: js/ui/windowMenu.js:121 +msgid "Move to Workspace Down" +msgstr "Перамясціць на прастору працы ніжэй" + +#: js/ui/windowMenu.js:139 +msgid "Move to Monitor Up" +msgstr "Перамясціць на манітор вышэй" + +#: js/ui/windowMenu.js:148 +msgid "Move to Monitor Down" +msgstr "Перамясціць на манітор ніжэй" + +#: js/ui/windowMenu.js:157 +msgid "Move to Monitor Left" +msgstr "Перамясціць на манітор лявей" + +#: js/ui/windowMenu.js:166 +msgid "Move to Monitor Right" +msgstr "Перамясціць на манітор правей" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Каляндар Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:410 +msgid "Print version" +msgstr "Вывесці нумар версіі праграмы" + +#: src/main.c:416 +msgid "Mode used by GDM for login screen" +msgstr "Рэжым, які выкарыстоўвае GDM для экрана ўваходу" + +#: src/main.c:422 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Ужыць вызначаны рэжым, напрыклад, \"gdm\" для экрана ўваходу" + +#: src/main.c:428 +msgid "List possible modes" +msgstr "Вывесці спіс магчымых рэжымаў" + +#: src/shell-app.c:272 +msgctxt "program" +msgid "Unknown" +msgstr "Невядомая" + +#: src/shell-app.c:523 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Не ўдалося запусціць \"%s\"" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Паролі адрозніваюцца." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Пароль не можа быць пустым" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Карыстальнік праігнараваў дыялогавае акенца ідэнтыфікацыі" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u выхад" +msgstr[1] "%u выхады" +msgstr[2] "%u выхадаў" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u уваход" +msgstr[1] "%u уваходы" +msgstr[2] "%u уваходаў" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +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 "Хаваць трэй" + +#~ msgid "Status Icons" +#~ msgstr "Значкі стану" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Настройкі пашырэння абалонкі GNOME" + +#~ msgid "Events" +#~ msgstr "Падзеі" + +#~ msgid "Notifications" +#~ msgstr "Апавяшчэнні" + +#~ msgid "Clear section" +#~ msgstr "Ачысціць раздзел" + +#~ msgid "Media" +#~ msgstr "Медыя" + +#~ msgid "%d x %d" +#~ msgstr "%d на %d" + +#~ msgid "Show the message tray" +#~ msgstr "Паказаць абшар апавяшчэнняў" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Абалонка GNOME (Wayland-кампазіцыя)" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Паказваць тыдзень у календары" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Калі ўключана, паказваць тыдзень у календары ў ISO-фармаце." + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Максімальная дакладнасць месцапалажэння." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Настройка максімальнай дакладнасці вызначэння месцапалажэння, даступнай " +#~ "праграмам. Магчымыя значэнні: \"off\" (выключыць вызначэнне " +#~ "месцапалажэння), \"country\" (краіна), \"city\" (горад), \"neighborhood" +#~ "\" (раён), \"street\" (вуліца) і \"exact\" (дэталёва, звычайна патрабуе " +#~ "GPS-прыёмнік). Увага: гэта настройка вызначае толькі тое, што даступна " +#~ "праграмам з дапамогай службы GeoClue, але яны могуць самастойна вызначаць " +#~ "месцапалажэнне з дапамогай спецыяльных сеціўных рэсурсаў (праўда, " +#~ "максімальная дакладнасць такіх рэсурсаў - назва вуліцы)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Парадак кнопак у загалоўку акна" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Гэты ключ падмяняе ключ у org.gnome.desktop.wm.preferences пры запуску " +#~ "Абалонкі GNOME." + +#~ msgid "Extension" +#~ msgstr "Пашырэнне" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Абярыце пашырэнне, каб настроіць графу з выплыўным спісам, якая " +#~ "знаходзіцца вышэй." + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Н" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Пн" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "А" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Ср" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Ч" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Пт" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Сб" + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Нічога не прымеркавана" + +#~ msgid "Today" +#~ msgstr "Сёння" + +#~ msgid "Tomorrow" +#~ msgstr "Заўтра" + +#~ msgid "This week" +#~ msgstr "На гэтым тыдні" + +#~ msgid "Next week" +#~ msgstr "На наступным тыдні" + +#~ msgid "Removable Devices" +#~ msgstr "Зменныя прыстасаванні" + +#~ msgid "Eject" +#~ msgstr "Выняць" + +#~ msgid "Invitation" +#~ msgstr "Запрашэнне" + +#~ msgid "Call" +#~ msgstr "Званок" + +#~ msgid "File Transfer" +#~ msgstr "Перадача файла" + +#~ msgid "Chat" +#~ msgstr "Чат" + +#~ msgid "Unmute" +#~ msgstr "Вярнуць гук" + +#~ msgid "Mute" +#~ msgstr "Абязгучыць" + +#~ msgid "Invitation to %s" +#~ msgstr "Запрашэнне ў %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "Удзельнік %s запрашае вас далучыцца да %s" + +#~ msgid "Decline" +#~ msgstr "Адмовіцца" + +#~ msgid "Accept" +#~ msgstr "Прыняць" + +#~ msgid "Video call from %s" +#~ msgstr "Відэазванок ад %s" + +#~ msgid "Call from %s" +#~ msgstr "Званок ад %s" + +#~ msgid "Answer" +#~ msgstr "Адказаць" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s пасылае вам %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s просіць дазволу на прагляд вашага сеткавага стану" + +#~ msgid "Authentication failed" +#~ msgstr "Няўдалая ідэнтыфікацыя" + +#~ msgid "Encryption error" +#~ msgstr "Памылка шыфравання" + +#~ msgid "Certificate not provided" +#~ msgstr "Сертыфікат не пададзены" + +#~ msgid "Certificate untrusted" +#~ msgstr "Сертыфікат не заслугоўвае даверу" + +#~ msgid "Certificate expired" +#~ msgstr "Сертыфікат састарэў" + +#~ msgid "Certificate not activated" +#~ msgstr "Сертыфікат не актывізаваны" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Назва камп'ютара ў сертыфікаце не адпавядае патрэбнай" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Адбітак сертыфіката не адпавядае патрэбнаму" + +#~ msgid "Certificate self-signed" +#~ msgstr "Сертыфікат уласнаручна падпісаны" + +#~ msgid "Status is set to offline" +#~ msgstr "Уключаны рэжым па-за сеткай" + +#~ msgid "Certificate is invalid" +#~ msgstr "Хібны сертыфікат" + +#~ msgid "Connection has been refused" +#~ msgstr "Адмоўлена ў злучэнні" + +#~ msgid "Connection can't be established" +#~ msgstr "Не ўдалося ўсталяваць злучэнне" + +#~ msgid "Connection has been lost" +#~ msgstr "Злучэнне страчана" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Гэты конт ужо злучаны з серверам" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Злучэнне заменена новым для таго ж самага рэсурсу" + +#~ msgid "The account already exists on the server" +#~ msgstr "Такі конт ужо існуе на серверы" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Сервер надта заняты і не можа абслужыць гэта злучэнне" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Сертыфікат быў адкліканы" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Для сертыфіката выкарыстаны слабы або небяспечны алгарытм шыфравання" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Даўжыня сертыфіката сервера або глыбіня яго ланцуга перавышае " +#~ "абмежаванне, выстаўленае крыптаграфічнай бібліятэкай" + +#~ msgid "Internal error" +#~ msgstr "Унутраная памылка" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Не ўдалося злучыцца з %s" + +#~ msgid "View account" +#~ msgstr "Праглядзець конт" + +#~ msgid "Open Calendar" +#~ msgstr "Адкрыць каляндар" + +#~ msgid "Open" +#~ msgstr "Адкрыць" + +#~ msgid "Remove" +#~ msgstr "Выдаліць" + +#~ msgid "Clear Messages" +#~ msgstr "Ачысціць спіс апавяшчэнняў" + +#~ msgid "Notification Settings" +#~ msgstr "Настройкі апавяшчэння" + +#~ msgid "Tray Menu" +#~ msgstr "Меню трэя" + +#~ msgid "No Messages" +#~ msgstr "Апавяшчэнні адсутнічаюць" + +#~ msgid "Message Tray" +#~ msgstr "Абшар апавяшчэнняў" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d злучанае прыстасаванне" +#~ msgstr[1] "%d злучаныя прыстасаванні" +#~ msgstr[2] "%d злучаных прыстасаванняў" + +#~ msgid "In Use" +#~ msgstr "Ужыта" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Батарэя" + +#~ msgid "Airplane Mode" +#~ msgstr "Рэжым самалёта" diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..de66d22 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,2102 @@ +# Bulgarian translation of gnome-shell po-file. +# Copyright (C) 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. +# Copyright (C) 2015, 2016, 2017 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Ivaylo Valkov , 2010, 2011, 2012, 2013, 2014. +# Alexander Shopov , 2012, 2015, 2016, 2017. +# +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-09-04 23:54+0300\n" +"Last-Translator: Alexander Shopov \n" +"Language-Team: Bulgarian \n" +"Language: bg\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" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Системни" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Показване на списъка с известия" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Фокусиране на активното известие" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Показване на програмите" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Показване на всички програми" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Отваряне на менюто с програми" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "Разширения на обвивката" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Настройки на разширенията на обвивката" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Обвивка на GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Управление на прозорци и стартиране на програми" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Включване на вътрешни инструменти полезни за разработчици и изпитатели чрез " +"Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Разрешаване на достъпа до вътрешни инструменти за наблюдение и изчистване " +"грешки чрез Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Идентификатори на разширенията за включване" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Разширенията на „Обвивката на GNOME“ имат идентификатор (UUID). Този ключ " +"съдържа списък на разширенията, които да се зареждат. Само разширения " +"включени в списъка ще бъдат заредени. Можете да променяте този списък с " +"методите на D-Bus — „EnableExtension“ и „DisableExtension“ на org.gnome." +"Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Изключване на потребителските разширения" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Изключване на всички включени от потребителя разширения без промяна на " +"настройката „enabled-extension“." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Изключване на проверката за съвместимостта на версиите на разширенията" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Обвивката на GNOME ще зарежда само разширения, които изрично са заявили, че " +"поддържат текущата версия. Избирането на тази функция изключва проверката за " +"съвместимост и зарежда разширенията независимо от версията." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Списък на идентификаторите на файловете във формат „.desktop“ за любими " +"програми" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Програмите, които отговарят на тези идентификатор, ще бъдат показани в " +"областта „Любими“." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Изглед за избор на програми" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Индексът на избрания обект в изгледа за избор на програми." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "История на командата Alt-F2" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "История на прозореца на дебъгера" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Винаги да се показва „Изход“ в менюто на потребителя" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Този ключ предефинира автоматичното скриване на обекта „Изход“ от менюто в " +"режими с един потребител или единична сесия." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Дали да се запазват пароли за монтиране на шифрирани или отдалечени файлови " +"системи" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Обвивката ще поиска парола, когато се монтира шифрирано устройство или " +"отдалечена файлова система. Ще се предостави отметка „Запомняне на " +"паролата“, ако е възможно запазването на паролата за по-късно използване." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Дали има асоциирани устройства по Bluetooth към стандартното" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Менюто за Bluetooth ще се показва при включен адаптер или при асоциирани към " +"стандартното устройства. Ако в някой момент няма асоциирани към стандартното " +"устройство, състоянието се занулява." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Клавишна комбинация за менюто за програми" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Клавишна комбинация за отваряне на менюто за програми." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Клавишна комбинация за отваряне на изгледа „Показване на програмите“" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Клавишна комбинация за отваряне на изгледа „Показване на програмите“ за " +"прегледа на дейностите." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Клавишна комбинация за отваряне на изгледа „Показване на програмите“" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Клавишна комбинация за отваряне на изгледа „Показване на програмите“." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Клавишна комбинация за показване/скриване на областта за известия" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Клавишна комбинация за показване/скриване на областта за известия." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Клавишна комбинация за фокусиране на текущото известие" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Клавишна комбинация за фокусиране на текущото известие." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Клавишна комбинация, която поставя на пауза и възстановява всички активни " +"анимации. Използва се за отстраняване на грешки." + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Коя клавиатура да се ползва" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Видът на клавиатурата, която да се ползва." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Ограничаване на превключването до текущия работен плот." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ако е истина, само програмите с прозорци на текущият работен плот се " +"превключват. В противен случай се превключва между всички програми." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Режим на иконите." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Определя как бутоните да се показват в областта за превключване. Възможните " +"стойности са: „thumbnail-only“ (показване на миниатюра на прозореца), „app-" +"icon-only“ (показване само на иконата на приложението) и „both“ (и двете)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ако е истина, само програмите с прозорци на текущият работен плот се " +"превключват. В противен случай се превключва между всички програми." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Прилепени модални диалогови прозорци" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Този ключ е с предимство пред ключа org.gnome.mutter, когато се използва " +"GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Включване на прилепването и максимизирането на прозорците по границите на " +"екрана" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Работните плотове се управляват динамично" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Работните плотове са само на основния монитор" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Отлагане на промените за фокусирането докато показалецът на мишката спре да " +"се движи." + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Мрежов вход" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Грешка при зареждане на прозореца с настройки за „%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 +msgid "Cancel" +msgstr "Отказване" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "Напред" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Отключване" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "Вписване" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "Избор на сесия" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "Липсва в списъка?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(напр. потребител или %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Потребител: " + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "Екран за идентификация" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "Грешка при удостоверяване" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +msgid "(or swipe finger)" +msgstr "(или се регистрирайте с пръстов отпечатък)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +msgctxt "search-result" +msgid "Power off" +msgstr "Изключване" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +msgid "power off;shutdown" +msgstr "power off;shutdown;изключване;спиране" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +msgctxt "search-result" +msgid "Lock screen" +msgstr "Заключване на екрана" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +msgid "lock screen" +msgstr "lock screen;заключване" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +msgctxt "search-result" +msgid "Log out" +msgstr "Изход" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "logout;sign off;излизане" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +msgctxt "search-result" +msgid "Suspend" +msgstr "Приспиване" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +msgid "suspend;sleep" +msgstr "приспиване" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:127 +msgctxt "search-result" +msgid "Switch user" +msgstr "Смяна на потребител" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:130 +msgid "switch user" +msgstr "смяна на потребител" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:134 +msgctxt "search-result" +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 "заключване на завъртането на екрана" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Командата не беше открита" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Неуспешно анализиране на командата:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Неуспешно изпълнение на „%s“:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Сега" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "преди %d минута" +msgstr[1] "преди %d минути" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "преди %d час" +msgstr[1] "преди %d часа" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Вчера" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "преди %d ден" +msgstr[1] "преди %d дни" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "преди %d седмица" +msgstr[1] "преди %d седмици" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "преди %d месец" +msgstr[1] "преди %d месеца" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "преди %d година" +msgstr[1] "преди %d години" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Вчера, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%e %B, %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%e %B %Y, %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Вчера, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l:%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%e %B, %l:%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%e %B %Y, %l:%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "Вход в безжична мрежа" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Връзката към тази безжична мрежа не е шифрирана. Информацията и паролите, " +"които въведете на тази страница, са потенциално видими за всички наоколо." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "Отказване на достъп" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "Позволяване на достъп" + +#: js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "Списък с често използваните програми" + +#: js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "Често стартирани" + +#: js/ui/appDisplay.js:937 +msgid "All" +msgstr "Всички" + +#: js/ui/appDisplay.js:1915 +msgid "New Window" +msgstr "Нов прозорец" + +#: js/ui/appDisplay.js:1929 +msgid "Launch using Dedicated Graphics Card" +msgstr "Стартиране на определена графична карта" + +#: js/ui/appDisplay.js:1956 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Премахване от „Любими“" + +#: js/ui/appDisplay.js:1962 +msgid "Add to Favorites" +msgstr "Добавяне в „Любими“" + +#: js/ui/appDisplay.js:1972 +msgid "Show Details" +msgstr "Показване на подробности" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Програмата „%s“ беше добавена в „Любими“" + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Програмата „%s“ беше премахната от „Любими“" + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Избор на устройство за аудио" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Настройки на звука" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Слушалки" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Малки слушалки" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Микрофон" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Смяна на фона…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Настройки на екрана" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:265 +msgid "Settings" +msgstr "Настройки" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "Н" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "В" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "Ч" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "С" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "Предния месец" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr "Следващия месец" + +#: js/ui/calendar.js:605 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:660 +msgid "Week %V" +msgstr "%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 +msgctxt "event list time" +msgid "All Day" +msgstr "Цял ден" + +#: js/ui/calendar.js:862 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %e %B" + +#: js/ui/calendar.js:866 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %e %B %Y" + +#: js/ui/calendar.js:1086 +msgid "No Notifications" +msgstr "Няма известия" + +#: js/ui/calendar.js:1089 +msgid "No Events" +msgstr "Няма събития" + +#: js/ui/calendar.js:1117 +msgid "Clear All" +msgstr "Изчистване на всичко" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "Програмата „%s“ не отговаря." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Може да изчакате известно време за отговор или принудително да спрете " +"програмата." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Принудително спиране" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Изчакване" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Закачен е външен диск" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Отдалеченият диск е разкачен" + +#: js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "Отваряне с „%s“" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "Парола:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Въведете отново:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261 +#: js/ui/status/network.js:355 js/ui/status/network.js:939 +msgid "Connect" +msgstr "Свързване" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Парола: " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Ключ: " + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Самоличност: " + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Парола за частния ключ: " + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Услуга: " + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638 +msgid "Authentication required by wireless network" +msgstr "Изисква се удостоверяване за безжична мрежа" + +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"За достъп до безжичната мрежа „%s“ са необходими пароли или криптирани " +"ключове." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "Жична идентификация 802.1Х" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Име на мрежата: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "Удостоверяване за DSL" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "Необходим е ПИН" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Мобилното устройство изисква ПИН" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "ПИН: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659 +msgid "Mobile broadband network password" +msgstr "Парола за мобилна широколентова връзка" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643 +#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "За свързване към „%s“ се изисква парола." + +#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720 +msgid "Network Manager" +msgstr "Управление на мрежата" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "Необходимо е удостоверяване" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "Администратор" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "Удостоверяване" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Неуспешно действие. Опитайте отново." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "„%s“ в момента е познат като „%s“" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Прозорци" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +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 +msgid "Dash" +msgstr "Най-ползвани" + +#. 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 +msgid "%B %e %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:82 +msgid "%A %B %e %Y" +msgstr "%A, %e %B %Y" + +#: js/ui/dateMenu.js:144 +msgid "Add world clocks…" +msgstr "Добавяне на световен часовник…" + +#: js/ui/dateMenu.js:145 +msgid "World Clocks" +msgstr "Световен часовник" + +#: js/ui/dateMenu.js:224 +msgid "Weather" +msgstr "Прогноза за времето" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:286 +#, javascript-format +msgid "%s all day." +msgstr "%s цял ден." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:292 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s. След това — %s." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:298 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s. След това — %s и %s по-късно." + +#: js/ui/dateMenu.js:309 +msgid "Select a location…" +msgstr "Избор на местоположение…" + +#: js/ui/dateMenu.js:312 +msgid "Loading…" +msgstr "Зареждане…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:318 +#, javascript-format +msgid "Feels like %s." +msgstr "Усеща се като %s." + +#: js/ui/dateMenu.js:321 +msgid "Go online for weather information" +msgstr "За метеорологичната обстановка трябва да сте онлайн." + +#: js/ui/dateMenu.js:323 +msgid "Weather information is currently unavailable" +msgstr "В момента метеорологичната информация не е налична." + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Изход на „%s“" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Изход" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "" +"Потребителят „%s“ ще излезе от системата автоматично след %d секунда." +msgstr[1] "" +"Потребителят „%s“ ще излезе от системата автоматично след %d секунди." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Ще излезете от системата автоматично след %d секунда." +msgstr[1] "Ще излезете от системата автоматично след %d секунди." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Изход" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Изключване" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Инсталиране на обновленията и изключване" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Системата ще се изключи автоматично след %d секунда." +msgstr[1] "Системата ще се изключи автоматично след %d секунди." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Инсталиране на изчакващите обновления" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Рестартиране" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Изключване" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Рестартиране" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Системата ще се рестартира автоматично след %d секунда." +msgstr[1] "Системата ще се рестартира автоматично след %d секунди." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Рестартиране и инсталиране на обновленията" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Системата ще се рестартира автоматично и ще инсталира обновления след %d " +"секунда." +msgstr[1] "" +"Системата ще се рестартира автоматично и ще инсталира обновления след %d " +"секунди." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Рестартиране и инсталиране" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Инсталиране и изключване" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Изключване на компютъра след инсталиране на обновленията" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Рестартиране и инсталиране на обновленията" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"След рестартиране ще се инсталира %s %s. Обновяването отнема доста време, " +"проверете дали имате резервно копие на данните си и дали компютърът има " +"надежден източник на захранване." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Компютърът работи на батерии — включете захранването, преди да инсталирате " +"обновленията" + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "Някои програми са заети или имат неприключена работа." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Има други влезли потребители." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (отдалечен)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (конзола)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Инсталиране" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Да се изтегли и инсталира ли „%s“ от from extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "„%s“ иска временно да изключи клавишните комбинации" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Програмата иска временно да изключи клавишните комбинации" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Може да ги възстановите като натиснете комбинацията %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Забраняване" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Позволяване" + +#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "Клавиатура" + +#: js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "Няма инсталирани разширения" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "Разширението %s не е обозначило никакви грешки." + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "Скриване на грешките" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "Показване на грешките" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "Включено" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Изключено" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "Грешка" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "Остаряло" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "Изтегляне" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "Преглед на изходния код" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "Домашна страница" + +#: js/ui/messageTray.js:1493 +msgid "System Information" +msgstr "Информация за системата" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Неизвестен изпълнител" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Неизвестно заглавие" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Отмяна" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Преглед" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Търсене на написаното…" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "Нова комбинация…" + +#: js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "Налични програми" + +#: js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "Извеждане на помощта" + +#: js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "Смяна на екран" + +#: js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "Задаване на клавишна комбинация" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "Готово" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "Редактиране…" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "Няма" + +#: js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "Натиснете клавиш за настройване" + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "Натиснете Esc за отмяна" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "Натиснете произволен клавиш за изход" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Спиране на програмата" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Дейности" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Системни" + +#: js/ui/panel.js:812 +msgid "Top Bar" +msgstr "Горна лента" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Въведете команда" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "Затваряне" + +#: js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "Рестартирането не е налично в Wayland" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "Рестартиране…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d ново съобщение" +msgstr[1] "%d нови съобщения" + +#: js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ново известие" +msgstr[1] "%d нови известия" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:284 +msgid "Lock" +msgstr "Заключване" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "Екранът трябва да бъде заключен от GNOME" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr "Неуспешно заключване" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 +msgid "Lock was blocked by an application" +msgstr "Заключването беше блокирано от програма" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "Търсене…" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "Няма съвпадения." + +#: js/ui/search.js:777 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "още %d" +msgstr[1] "още %d" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Копиране" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Поставяне" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Показване на текста" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Скриване на текста" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "Парола" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "Запомняне на паролата" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Достъпност" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Увеличаване" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Четец на екрана" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Екранна клавиатура" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Визуална помощ" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Лепкави клавиши" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Бавни клавиши" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Подскачащи клавиши" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Клавиши за мишка" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Висок контраст" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Едър текст" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627 +msgid "Bluetooth Settings" +msgstr "Настройки на Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d свързано" +msgstr[1] "%d свързани" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "Изключен" + +#: js/ui/status/bluetooth.js:140 +msgid "On" +msgstr "Включено" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299 +msgid "Turn On" +msgstr "Включване" + +#: 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 "Изключване" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Яркост" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "Показване на клавиатурната подредба" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Местоположението е включено" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Изключване" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Настройки за поверителност" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Текущо местоположение" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Местоположението е изключено" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Включване" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Да се сподели ли местоположението с „%s“?" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Може да промените правата за достъп до местоположението през настройките за " +"лични данни." + +#: js/ui/status/network.js:104 +msgid "" +msgstr "<неизвестно>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 js/ui/status/network.js:1328 +#, javascript-format +msgid "%s Off" +msgstr "„%s“: изключен" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:457 +#, javascript-format +msgid "%s Connected" +msgstr "„%s“: свързан" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:462 +#, javascript-format +msgid "%s Unmanaged" +msgstr "„%s“: без управление" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:465 +#, javascript-format +msgid "%s Disconnecting" +msgstr "„%s“: прекъсване на връзката" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:472 js/ui/status/network.js:1320 +#, javascript-format +msgid "%s Connecting" +msgstr "„%s“: свързване" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:475 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "„%s“: изисква идентификация" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:483 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Липсва фърмуер за „%s“" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:487 +#, javascript-format +msgid "%s Unavailable" +msgstr "„%s“: недостъпен" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:490 +#, javascript-format +msgid "%s Connection Failed" +msgstr "„%s“: неуспешна връзка" + +#: js/ui/status/network.js:506 +msgid "Wired Settings" +msgstr "Настройки на жична връзка" + +#: js/ui/status/network.js:548 +msgid "Mobile Broadband Settings" +msgstr "Настройки на мобилна широколентова връзка" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:591 js/ui/status/network.js:1325 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "„%s“: изключено устройство" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:595 +#, javascript-format +msgid "%s Disabled" +msgstr "„%s“: изключено" + +#: js/ui/status/network.js:635 +msgid "Connect to Internet" +msgstr "Свързване към Интернет" + +#: js/ui/status/network.js:833 +msgid "Airplane Mode is On" +msgstr "Самолетният режим е включен" + +#: js/ui/status/network.js:834 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Безжичната връзка е изключена при самолетен режим." + +#: js/ui/status/network.js:835 +msgid "Turn Off Airplane Mode" +msgstr "Изключване на самолетен режим" + +#: js/ui/status/network.js:844 +msgid "Wi-Fi is Off" +msgstr "Безжичната връзка е изключена" + +#: js/ui/status/network.js:845 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Безжичната връзка трябва да е включена, за да се свържете към мрежа." + +#: js/ui/status/network.js:846 +msgid "Turn On Wi-Fi" +msgstr "Включване на безжичната връзка" + +#: js/ui/status/network.js:871 +msgid "Wi-Fi Networks" +msgstr "Безжични мрежи" + +#: js/ui/status/network.js:873 +msgid "Select a network" +msgstr "Избор на мрежата" + +#: js/ui/status/network.js:903 +msgid "No Networks" +msgstr "Липсват мрежи" + +#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Изключване чрез физически бутон" + +#: js/ui/status/network.js:1191 +msgid "Select Network" +msgstr "Избор на мрежа" + +#: js/ui/status/network.js:1197 +msgid "Wi-Fi Settings" +msgstr "Настройки на безжична връзка" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1316 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "„%s“: включена безжична точка за достъп" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1331 +#, javascript-format +msgid "%s Not Connected" +msgstr "„%s“: няма връзка" + +#: js/ui/status/network.js:1435 +msgid "connecting…" +msgstr "свързване…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1438 +msgid "authentication required" +msgstr "изисква се удостоверяване" + +#: js/ui/status/network.js:1440 +msgid "connection failed" +msgstr "връзката е неуспешна" + +#: js/ui/status/network.js:1494 +msgid "VPN Settings" +msgstr "Настройки на ВЧМ (VPN)" + +#: js/ui/status/network.js:1498 +msgid "VPN" +msgstr "ВЧМ" + +#: js/ui/status/network.js:1508 +msgid "VPN Off" +msgstr "Без ВЧМ" + +#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Настройки на мрежата" + +#: js/ui/status/network.js:1603 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s жична връзка" +msgstr[1] "%s жични връзки" + +#: js/ui/status/network.js:1607 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s безжична връзка" +msgstr[1] "%s безжични връзки" + +#: js/ui/status/network.js:1611 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s връзка по модем" +msgstr[1] "%s връзки по модем" + +#: js/ui/status/network.js:1759 +msgid "Connection failed" +msgstr "Връзката е неуспешна" + +#: js/ui/status/network.js:1760 +msgid "Activation of network connection failed" +msgstr "Неуспешна връзка към мрежата" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "Нощният режим е изключен" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Нощният режим е включен" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Включване наново" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Изключване до утре сутрин" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Настройки на захранването" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Пълно зареждане" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Приблизително…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d:%02d до разреждане (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d до зареждане (%d %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Самолетният режим е включен" + +#: js/ui/status/system.js:228 +msgid "Switch User" +msgstr "Смяна на потребител" + +#: js/ui/status/system.js:240 +msgid "Log Out" +msgstr "Изход" + +#: js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "Настройки на регистрацията" + +#: js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "Заключване на завъртането на екрана" + +#: js/ui/status/system.js:295 +msgid "Suspend" +msgstr "Приспиване" + +#: js/ui/status/system.js:305 +msgid "Power Off" +msgstr "Изключване" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "Променена сила на звука" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Сила на звука" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Еднакво изображение" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Обединяване на екраните" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Външни екрани" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Вградени екрани" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Влизане като друг потребител" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Отключване на прозореца" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Програми" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Търсене" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "Програмата „%s“ е готова за употреба" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Желаете ли да запазите настройките на екрана?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Връщане на първоначалните настройки" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Запазване на промените" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Настройките ще се възстановят след %d секунда" +msgstr[1] "Настройките ще се възстановят след %d секунди" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Минимизиране" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Демаксимизиране" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Максимизиране" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Преместване" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Оразмеряване" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Преместване на лентата за заглавието по екрана" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Винаги отгоре" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Винаги на видимия работен плот" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Преместване на левия работен плот" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "Преместване на десния работен плот" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "Преместване на горния работен плот" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "Преместване на долния работен плот" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Преместване на горния монитор" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Преместване на долния монитор" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "Преместване на левия монитор" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "Преместване на десния монитор" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Календар на Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:380 +msgid "Print version" +msgstr "Показване на версията" + +#: src/main.c:386 +msgid "Mode used by GDM for login screen" +msgstr "Режим на GDM за екрана за влизане" + +#: src/main.c:392 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Използване на определен режим за екрана за идентификация, напр. „gdm“" + +#: src/main.c:398 +msgid "List possible modes" +msgstr "Списък на достъпните режими" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Неизвестна" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Неуспешно стартиране на „%s“" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Паролите не съвпадат." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Не може да не попълнете паролата" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Прозорецът за упълномощаване беше затворен от потребителя" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u изход" +msgstr[1] "%u изхода" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u вход" +msgstr[1] "%u входа" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Системни звуци" diff --git a/po/bn.po b/po/bn.po new file mode 100644 index 0000000..98e7728 --- /dev/null +++ b/po/bn.po @@ -0,0 +1,1203 @@ +msgid "" +msgstr "" +"Project-Id-Version: bn\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-04-04 02:20+0000\n" +"PO-Revision-Date: 2011-04-04 11:04+0600\n" +"Last-Translator: Israt Jahan \n" +"Language-Team: Bengali \n" +"Language: bn\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: Translate Toolkit 1.8.0\n" +"X-Language: bn_BD\n" +"X-DamnedLies-Scope: partial\n" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "জিনোম সেল" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "উইন্ডো ব্যবস্থাপনা এবং অ্যাপ্লিকেশন চালু" + +#: ../data/org.gnome.shell.gschema.xml.in.h:1 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:2 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:3 +msgid "File extension used for storing the screencast" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:4 +msgid "Framerate used for recording screencasts." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:5 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should not be loaded." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:6 +msgid "History for command (Alt-F2) dialog" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:7 +msgid "History for the looking glass dialog" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:8 +msgid "If true, display date in the clock, in addition to time." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:9 +msgid "If true, display seconds in time." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:10 +msgid "If true, display the ISO week date in the calendar." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:11 +msgid "List of desktop file IDs for favorite applications" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:13 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and " +"records to WEBM using the VP8 codec. %T is used as a placeholder for a guess " +"at the optimal thread count on the system." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:14 +msgid "Show date in clock" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:15 +msgid "Show the week date in the calendar" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:16 +msgid "Show time with seconds" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:17 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:18 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:19 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:20 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:21 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:22 +#, fuzzy +msgid "Uuids of extensions to disable" +msgstr "কোনো এক্সটেনশন ইনস্টল করা হয়নি" + +#: ../data/org.gnome.shell.gschema.xml.in.h:23 +msgid "Whether to collect stats about applications usage" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:24 +msgid "disabled OpenSearch providers" +msgstr "" + +#: ../js/misc/util.js:71 +msgid "Command not found" +msgstr "কমান্ড পাওয়া যায়নি" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:98 +msgid "Could not parse command:" +msgstr "কমান্ড পার্স করা যায়নি:" + +#: ../js/misc/util.js:106 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "'%s' কার্যকর করা ব্যর্থ:" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:230 +msgid "All" +msgstr "সব" + +#: ../js/ui/appDisplay.js:328 +msgid "APPLICATIONS" +msgstr "অ্যাপ্লিকেশন" + +#: ../js/ui/appDisplay.js:354 +msgid "SETTINGS" +msgstr "সেটিংস" + +#: ../js/ui/appDisplay.js:625 +msgid "New Window" +msgstr "নতুন উইন্ডো" + +#: ../js/ui/appDisplay.js:628 +msgid "Remove from Favorites" +msgstr "পছন্দ থেকে অপসারণ" + +#: ../js/ui/appDisplay.js:629 +msgid "Add to Favorites" +msgstr "পছন্দে যোগ" + +#: ../js/ui/appFavorites.js:91 +#, c-format +msgid "%s has been added to your favorites." +msgstr "আপনার পছন্দে %s যোগ করা হয়েছে।" + +#: ../js/ui/appFavorites.js:122 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "আপনার পছন্দ থেকে %s বাদ হয়েছে।" + +#. 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:66 +msgctxt "event list time" +msgid "All Day" +msgstr "পুরো দিন" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:71 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H:%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:78 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:118 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:120 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:122 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:124 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:126 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:128 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:130 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:143 +msgctxt "list sunday" +msgid "Su" +msgstr "Su" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:145 +msgctxt "list monday" +msgid "M" +msgstr "M" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:147 +msgctxt "list tuesday" +msgid "T" +msgstr "T" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:149 +msgctxt "list wednesday" +msgid "W" +msgstr "W" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:151 +msgctxt "list thursday" +msgid "Th" +msgstr "Th" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:153 +msgctxt "list friday" +msgid "F" +msgstr "F" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:155 +msgctxt "list saturday" +msgid "S" +msgstr "S" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:704 +msgid "Nothing Scheduled" +msgstr "কোনো কিছুর সময় ঠিক করা হয়নি" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:720 ../js/ui/telepathyClient.js:490 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:723 ../js/ui/telepathyClient.js:493 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:733 +msgid "Today" +msgstr "আজ" + +#: ../js/ui/calendar.js:737 +msgid "Tomorrow" +msgstr "আগামীকাল" + +#: ../js/ui/calendar.js:746 +msgid "This week" +msgstr "এ সপ্তাহ" + +#: ../js/ui/calendar.js:754 +msgid "Next week" +msgstr "পরবর্তী সপ্তাহ" + +#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1007 +msgid "Remove" +msgstr "অপসারণ" + +#: ../js/ui/dateMenu.js:91 +msgid "Date and Time Settings" +msgstr "তারিখ ও সময় এর সেটিং" + +#: ../js/ui/dateMenu.js:111 +msgid "Open Calendar" +msgstr "ক্যালেন্ডার খুলুন" + +#. Translators: This is the time format with date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:164 +msgid "%a %b %e, %R:%S" +msgstr "%a %b %e, %R:%S" + +#: ../js/ui/dateMenu.js:165 +msgid "%a %b %e, %R" +msgstr "%a %b %e, %R" + +#. Translators: This is the time format without date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:169 +msgid "%a %R:%S" +msgstr "%a %R:%S" + +#: ../js/ui/dateMenu.js:170 +msgid "%a %R" +msgstr "%a %R" + +#. Translators: This is a time format with date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:177 +msgid "%a %b %e, %l:%M:%S %p" +msgstr "%a %b %e, %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:178 +msgid "%a %b %e, %l:%M %p" +msgstr "%a %b %e, %l:%M %p" + +#. Translators: This is a time format without date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:182 +msgid "%a %l:%M:%S %p" +msgstr "%a %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:183 +msgid "%a %l:%M %p" +msgstr "%a %l:%M %p" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). +#. +#: ../js/ui/dateMenu.js:194 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/docDisplay.js:19 +msgid "RECENT ITEMS" +msgstr "সাম্প্রতিক আইটেম" + +#: ../js/ui/endSessionDialog.js:63 +#, c-format +msgid "Log Out %s" +msgstr "লগআউট %s" + +#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70 +msgid "Log Out" +msgstr "লগআউট" + +#: ../js/ui/endSessionDialog.js:65 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "লগআউট ক্লিক করে অ্যাপ্লিকেশন বন্ধ এবং সিস্টেম থেকে লগআউট।" + +#: ../js/ui/endSessionDialog.js:66 +#, c-format +msgid "%s will be logged out automatically in %d seconds." +msgstr "%s থেকে স্বয়ংক্রিয়ভাবে %d সেকেন্ডের মধ্যে লগআউট।" + +#: ../js/ui/endSessionDialog.js:67 +#, c-format +msgid "You will be logged out automatically in %d seconds." +msgstr "আপনি স্বয়ংক্রিয়ভাবে %d সেকেন্ডের মধ্যে লগআউট হবেন।" + +#: ../js/ui/endSessionDialog.js:68 +msgid "Logging out of the system." +msgstr "সিস্টেম থেকে লগ আউট।" + +#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82 +#, fuzzy +msgid "Power Off" +msgstr "পাওয়ার বন্ধ..." + +#: ../js/ui/endSessionDialog.js:76 +#, fuzzy +msgid "Click Power Off to quit these applications and power off the system." +msgstr "লগআউট ক্লিক করে অ্যাপ্লিকেশন বন্ধ এবং সিস্টেম থেকে লগআউট।" + +#: ../js/ui/endSessionDialog.js:77 +#, fuzzy, c-format +msgid "The system will power off automatically in %d seconds." +msgstr "সিস্টেম %d সেকেন্ডে স্বয়ংক্রিয়ভাবে রিস্টার্ট হবে।" + +#: ../js/ui/endSessionDialog.js:78 +#, fuzzy +msgid "Powering off the system." +msgstr "সিস্টেম থেকে লগ আউট।" + +#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88 +#: ../js/ui/endSessionDialog.js:93 +msgid "Restart" +msgstr "রিস্টার্ট" + +#: ../js/ui/endSessionDialog.js:89 +msgid "Click Restart to quit these applications and restart the system." +msgstr "এ অ্যাপ্লিকেশন বন্ধ করার জন্য রিস্টার্ট ক্লিক করে সিস্টেম রিস্টার্ট।" + +#: ../js/ui/endSessionDialog.js:90 +#, c-format +msgid "The system will restart automatically in %d seconds." +msgstr "সিস্টেম %d সেকেন্ডে স্বয়ংক্রিয়ভাবে রিস্টার্ট হবে।" + +#: ../js/ui/endSessionDialog.js:91 +msgid "Restarting the system." +msgstr "সিস্টেম রিস্টার্ট করা হচ্ছে।" + +#: ../js/ui/endSessionDialog.js:417 ../js/ui/polkitAuthenticationAgent.js:172 +#: ../js/ui/status/bluetooth.js:466 +msgid "Cancel" +msgstr "বাতিল" + +#: ../js/ui/lookingGlass.js:588 +msgid "No extensions installed" +msgstr "কোনো এক্সটেনশন ইনস্টল করা হয়নি" + +#: ../js/ui/lookingGlass.js:625 +msgid "Enabled" +msgstr "সক্রিয়" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091 +msgid "Disabled" +msgstr "নিস্ক্রিয়" + +#: ../js/ui/lookingGlass.js:629 +msgid "Error" +msgstr "ত্রুটি" + +#: ../js/ui/lookingGlass.js:631 +msgid "Out of date" +msgstr "সময় শেষ" + +#: ../js/ui/lookingGlass.js:656 +msgid "View Source" +msgstr "সোর্স দেখুন" + +#: ../js/ui/lookingGlass.js:662 +msgid "Web Page" +msgstr "ওয়েব পেজ" + +#: ../js/ui/messageTray.js:1000 +msgid "Open" +msgstr "খুলুন" + +#: ../js/ui/messageTray.js:2164 +msgid "System Information" +msgstr "সিস্টেম তথ্য" + +#: ../js/ui/overview.js:91 +msgid "Undo" +msgstr "পূর্বাবস্থায় ফিরিয়ে নেয়া" + +#: ../js/ui/overview.js:186 +msgid "Windows" +msgstr "উইন্ডো" + +#: ../js/ui/overview.js:189 +msgid "Applications" +msgstr "অ্যাপ্লিকেশন" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:205 +msgid "Dash" +msgstr "ড্যাশ" + +#. TODO - _quit() doesn't really work on apps in state STARTING yet +#: ../js/ui/panel.js:524 +#, c-format +msgid "Quit %s" +msgstr "%s বন্ধ" + +#. Button on the left side of the panel. +#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:902 +msgid "Activities" +msgstr "অ্যাক্টিভিটিজ" + +#: ../js/ui/panel.js:1003 +msgid "Top Bar" +msgstr "শীর্ষ বার" + +#: ../js/ui/placeDisplay.js:122 +#, c-format +msgid "Failed to unmount '%s'" +msgstr "'%s' আনমাউন্ট করতে ব্যর্থ" + +#: ../js/ui/placeDisplay.js:125 +msgid "Retry" +msgstr "পুনরায় চেষ্টা" + +#: ../js/ui/placeDisplay.js:165 +msgid "Connect to..." +msgstr "সংযুক্ত..." + +#: ../js/ui/placeDisplay.js:380 +msgid "PLACES & DEVICES" +msgstr "স্থান এবং ডিভাইস" + +#: ../js/ui/polkitAuthenticationAgent.js:74 +#, fuzzy +msgid "Authentication Required" +msgstr "প্রমাণীকরণ আবশ্যক" + +#: ../js/ui/polkitAuthenticationAgent.js:108 +msgid "Administrator" +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:176 +#, fuzzy +msgid "Authenticate" +msgstr "প্রমাণীকরণ আবশ্যক" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/polkitAuthenticationAgent.js:264 +msgid "Sorry, that didn't work. Please try again." +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:276 +msgid "Password:" +msgstr "" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:679 +msgid "toggle-switch-us" +msgstr "টগল-পরিবর্তন-আমাদের" + +#: ../js/ui/runDialog.js:205 +msgid "Please enter a command:" +msgstr "অনুগ্রহ করে একটি কমান্ড দিন:" + +#: ../js/ui/searchDisplay.js:311 +msgid "Searching..." +msgstr "অনুসন্ধান..." + +#: ../js/ui/searchDisplay.js:325 +msgid "No matching results." +msgstr "মিলযুক্ত কোনো ফলাফল নেই।" + +#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:163 +#: ../js/ui/statusMenu.js:228 +msgid "Power Off..." +msgstr "পাওয়ার বন্ধ..." + +#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227 +msgid "Suspend" +msgstr "বাতিল" + +#: ../js/ui/statusMenu.js:184 +msgid "Available" +msgstr "বিদ্যমান" + +#: ../js/ui/statusMenu.js:189 +msgid "Busy" +msgstr "ব্যস্ত" + +#: ../js/ui/statusMenu.js:197 +msgid "My Account" +msgstr "আমার অ্যাকাউন্ট" + +#: ../js/ui/statusMenu.js:201 +msgid "System Settings" +msgstr "সিস্টেম সেটিং" + +#: ../js/ui/statusMenu.js:208 +msgid "Lock Screen" +msgstr "লক স্ক্রিন" + +#: ../js/ui/statusMenu.js:213 +msgid "Switch User" +msgstr "ব্যবহারকারী পরিবর্তন" + +#: ../js/ui/statusMenu.js:218 +msgid "Log Out..." +msgstr "লগআউট..." + +#: ../js/ui/status/accessibility.js:62 +msgid "Zoom" +msgstr "বড় আকারে প্রদর্শন" + +#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, +#. 'screen-reader-enabled'); +#. this.menu.addMenuItem(screenReader); +#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA, +#. 'screen-keyboard-enabled'); +#. this.menu.addMenuItem(screenKeyboard); +#: ../js/ui/status/accessibility.js:77 +msgid "Visual Alerts" +msgstr "দৃষ্টিনির্ভর সতর্কবানী" + +#: ../js/ui/status/accessibility.js:80 +msgid "Sticky Keys" +msgstr "স্টিকি কী" + +#: ../js/ui/status/accessibility.js:83 +msgid "Slow Keys" +msgstr "ধীর গতির কী" + +#: ../js/ui/status/accessibility.js:86 +msgid "Bounce Keys" +msgstr "বাউন্স কী" + +#: ../js/ui/status/accessibility.js:89 +msgid "Mouse Keys" +msgstr "মাউস কী" + +#: ../js/ui/status/accessibility.js:93 +msgid "Universal Access Settings" +msgstr "সার্বজনীন ব্যবহার করার সেটিং" + +#: ../js/ui/status/accessibility.js:146 +msgid "High Contrast" +msgstr "উচ্চ বৈশাদৃশ্য" + +#: ../js/ui/status/accessibility.js:183 +msgid "Large Text" +msgstr "বড় টেক্সট" + +#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237 +#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367 +#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440 +msgid "Bluetooth" +msgstr "ব্লুটুথ" + +#: ../js/ui/status/bluetooth.js:55 +msgid "Visibility" +msgstr "দৃশ্যমানতা" + +#: ../js/ui/status/bluetooth.js:69 +msgid "Send Files to Device..." +msgstr "ডিভাইসে ফাইল প্রেরণ..." + +#: ../js/ui/status/bluetooth.js:70 +msgid "Setup a New Device..." +msgstr "নতুন ডিভাইস সেটআপ..." + +#: ../js/ui/status/bluetooth.js:95 +msgid "Bluetooth Settings" +msgstr "ব্লুটুথ সেটিং" + +#: ../js/ui/status/bluetooth.js:188 +msgid "Connection" +msgstr "সংযোগ" + +#: ../js/ui/status/bluetooth.js:224 +msgid "Send Files..." +msgstr "ফাইল প্রেরণ..." + +#: ../js/ui/status/bluetooth.js:229 +msgid "Browse Files..." +msgstr "ফাইল ব্রাউজ..." + +#: ../js/ui/status/bluetooth.js:238 +msgid "Error browsing device" +msgstr "ডিভাইস ব্রাউজিং ত্রুটি" + +#: ../js/ui/status/bluetooth.js:239 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "অনুরোধকৃত ডিভাইস ব্রাউজ করা যায়না, ত্রুটি '%s'" + +#: ../js/ui/status/bluetooth.js:247 +msgid "Keyboard Settings" +msgstr "কীবোর্ড সেটিং" + +#: ../js/ui/status/bluetooth.js:252 +msgid "Mouse Settings" +msgstr "মাউস সেটিং" + +#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66 +msgid "Sound Settings" +msgstr "শব্দ সেটিং" + +#: ../js/ui/status/bluetooth.js:368 +#, c-format +msgid "Authorization request from %s" +msgstr "%s হতে প্রমানীকরণের জন্য অনুরোধ" + +#: ../js/ui/status/bluetooth.js:374 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "সার্ভিস '%s' ডিভাইস %s ব্যবহার করতে চায়" + +#: ../js/ui/status/bluetooth.js:376 +msgid "Always grant access" +msgstr "সর্বদা ব্যবহারের অনুমোদন" + +#: ../js/ui/status/bluetooth.js:377 +msgid "Grant this time only" +msgstr "কেবল এইবার অনুমোদন" + +#: ../js/ui/status/bluetooth.js:378 +msgid "Reject" +msgstr "বাতিল" + +#: ../js/ui/status/bluetooth.js:408 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "%s এ র জন্য নিশ্চিতকরণ মিলানো হচ্ছে" + +#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "ডিভাইস %s কম্পিউটারের এর সাথে পেয়ার করতে চায়" + +#: ../js/ui/status/bluetooth.js:415 +#, c-format +msgid "Please confirm whether the PIN '%s' matches the one on the device." +msgstr "অনুগ্রহ করে নিশ্চিত হোন যে পিন '%s' ডিভাইসের পিনের সাথে মিলে কিনা।" + +#: ../js/ui/status/bluetooth.js:417 +msgid "Matches" +msgstr "মিল" + +#: ../js/ui/status/bluetooth.js:418 +msgid "Does not match" +msgstr "মিলে না" + +#: ../js/ui/status/bluetooth.js:441 +#, c-format +msgid "Pairing request for %s" +msgstr "%s এর সাথে পেয়ার করার অনুরোধ" + +#: ../js/ui/status/bluetooth.js:449 +msgid "Please enter the PIN mentioned on the device." +msgstr "ডিভাইসে উল্লেখিত পিন দিন।" + +#: ../js/ui/status/bluetooth.js:465 +msgid "OK" +msgstr "ঠিক আছে" + +#: ../js/ui/status/keyboard.js:73 +msgid "Show Keyboard Layout..." +msgstr "কীবোর্ডের লেআউট প্রদর্শন..." + +#: ../js/ui/status/keyboard.js:76 +msgid "Localization Settings" +msgstr "স্থানীয়করণ সেটিং" + +#: ../js/ui/status/network.js:105 ../js/ui/status/network.js:1467 +msgid "" +msgstr "" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:319 +msgid "disabled" +msgstr "নিস্ক্রিয়" + +#: ../js/ui/status/network.js:502 +msgid "connecting..." +msgstr "সংযুক্ত করা হচ্ছে..." + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:505 +msgid "authentication required" +msgstr "প্রমাণীকরণ আবশ্যক" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:515 +msgid "firmware missing" +msgstr "" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:522 +msgid "cable unplugged" +msgstr "ক্যাবল আনপ্লাগকৃত" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:527 +msgid "unavailable" +msgstr "বিদ্যমান নয়" + +#: ../js/ui/status/network.js:529 +msgid "connection failed" +msgstr "সংযোগ ব্যর্থ" + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:609 ../js/ui/status/network.js:1415 +msgid "Connected (private)" +msgstr "সংযুক্ত (ব্যক্তিগত)" + +#: ../js/ui/status/network.js:690 +msgid "Auto Ethernet" +msgstr "স্বয়ংক্রিয় ইথারনেট" + +#: ../js/ui/status/network.js:765 +msgid "Auto broadband" +msgstr "স্বয়ংক্রিয় ব্রডব্যান্ড" + +#: ../js/ui/status/network.js:768 +msgid "Auto dial-up" +msgstr "স্বয়ংক্রিয় ডায়াল-আপ" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:911 ../js/ui/status/network.js:1427 +#, c-format +msgid "Auto %s" +msgstr "স্বয়ংক্রিয় %s" + +#: ../js/ui/status/network.js:913 +msgid "Auto bluetooth" +msgstr "স্বয়ংক্রিয় ব্লুটুথ" + +#: ../js/ui/status/network.js:1429 +msgid "Auto wireless" +msgstr "স্বয়ংক্রিয় ওয়ারলেস" + +#: ../js/ui/status/network.js:1487 +msgid "More..." +msgstr "আরও..." + +#: ../js/ui/status/network.js:1510 +msgid "Enable networking" +msgstr "নেটওয়ার্কিং সক্রিয়" + +#: ../js/ui/status/network.js:1522 +msgid "Wired" +msgstr "সংযুক্ত" + +#: ../js/ui/status/network.js:1533 +msgid "Wireless" +msgstr "ওয়ারলেস" + +#: ../js/ui/status/network.js:1543 +msgid "Mobile broadband" +msgstr "মোবাইল ব্রডব্যান্ড" + +#: ../js/ui/status/network.js:1553 +msgid "VPN Connections" +msgstr "VPN সংযোগ" + +#: ../js/ui/status/network.js:1565 +msgid "Network Settings" +msgstr "নেটওয়ার্ক সেটিং" + +#: ../js/ui/status/network.js:1855 +#, c-format +msgid "You're now connected to mobile broadband connection '%s'" +msgstr "আপনি এখন মোবাইল ব্রডব্যান্ড সংযোগ '%s' এ সংযুক্ত" + +#: ../js/ui/status/network.js:1859 +#, c-format +msgid "You're now connected to wireless network '%s'" +msgstr "আপনি এখন ওয়ারলেস নেটওয়ার্ক সংযোগে '%s' এ সংযুক্ত" + +#: ../js/ui/status/network.js:1863 +#, c-format +msgid "You're now connected to wired network '%s'" +msgstr "আপনি এখন তারযুক্ত সংযোগে '%s' এ সংযুক্ত" + +#: ../js/ui/status/network.js:1867 +#, c-format +msgid "You're now connected to VPN network '%s'" +msgstr "আপনি এখন VPN নেটওয়ার্ক সংযোগ '%s' এ সংযুক্ত" + +#: ../js/ui/status/network.js:1872 +#, c-format +msgid "You're now connected to '%s'" +msgstr "আপনি এখন '%s' এ সংযুক্ত" + +#: ../js/ui/status/network.js:1880 +msgid "Connection established" +msgstr "সংযোগ প্রতিষ্ঠিত" + +#: ../js/ui/status/network.js:2006 +msgid "Networking is disabled" +msgstr "নেটওয়ার্কিং বিচ্ছিন্ন" + +#: ../js/ui/status/network.js:2131 +msgid "Network Manager" +msgstr "নেটওয়ার্ক ব্যবস্থাপক" + +#: ../js/ui/status/power.js:85 +msgid "Power Settings" +msgstr "পাওয়ার সেটিং" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:111 +msgid "Estimating..." +msgstr "গণনা করা হচ্ছে..." + +#: ../js/ui/status/power.js:118 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "%d ঘন্টা বাকি" +msgstr[1] "%d ঘন্টা বাকি" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:121 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "%d %s %d %s বাকি" + +#: ../js/ui/status/power.js:123 +msgid "hour" +msgid_plural "hours" +msgstr[0] "ঘন্টা" +msgstr[1] "ঘন্টা" + +#: ../js/ui/status/power.js:123 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "মিনিট" +msgstr[1] "মিনিট" + +#: ../js/ui/status/power.js:126 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "%d মিনিট বাকি" +msgstr[1] "%d মিনিট বাকি" + +#: ../js/ui/status/power.js:228 +msgid "AC adapter" +msgstr "AC অ্যাডাপ্টার" + +#: ../js/ui/status/power.js:230 +msgid "Laptop battery" +msgstr "ল্যাপটপ ব্যাটারি" + +#: ../js/ui/status/power.js:232 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:234 +msgid "Monitor" +msgstr "মনিটর" + +#: ../js/ui/status/power.js:236 +msgid "Mouse" +msgstr "মাউস" + +#: ../js/ui/status/power.js:238 +msgid "Keyboard" +msgstr "কীবোর্ড" + +#: ../js/ui/status/power.js:240 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:242 +msgid "Cell phone" +msgstr "সেল ফোন" + +#: ../js/ui/status/power.js:244 +msgid "Media player" +msgstr "মিডিয়া প্লেয়ার" + +#: ../js/ui/status/power.js:246 +msgid "Tablet" +msgstr "ট্যাবলেট" + +#: ../js/ui/status/power.js:248 +msgid "Computer" +msgstr "কম্পিউটার" + +#: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088 +msgid "Unknown" +msgstr "অজানা" + +#: ../js/ui/status/volume.js:45 +msgid "Volume" +msgstr "ভলিউম" + +#: ../js/ui/status/volume.js:58 +msgid "Microphone" +msgstr "মাইক্রোফোন" + +#: ../js/ui/telepathyClient.js:335 +#, c-format +msgid "%s is online." +msgstr "%s অনলাইনে।" + +#: ../js/ui/telepathyClient.js:340 +#, c-format +msgid "%s is offline." +msgstr "%s অফলাইনে।" + +#: ../js/ui/telepathyClient.js:343 +#, c-format +msgid "%s is away." +msgstr "%s কাছে নেই।" + +#: ../js/ui/telepathyClient.js:346 +#, c-format +msgid "%s is busy." +msgstr "%s ব্যস্ত।" + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/telepathyClient.js:482 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "%A এ %X প্রেরণ" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/viewSelector.js:122 +msgid "Type to search..." +msgstr "অনুসন্ধান করতে লিখুন..." + +#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250 +msgid "Search" +msgstr "অনুসন্ধান" + +#: ../js/ui/windowAttentionHandler.js:42 +#, c-format +msgid "%s has finished starting" +msgstr "%s শুরু করা শেষ" + +#: ../js/ui/windowAttentionHandler.js:44 +#, c-format +msgid "'%s' is ready" +msgstr "'%s' প্রস্তুত" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1098 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u আউটপুট" +msgstr[1] "%u আউটপুট" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1108 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ইনপুট" +msgstr[1] "%u ইনপুট" + +#: ../src/gvc/gvc-mixer-control.c:1406 +msgid "System Sounds" +msgstr "সিস্টেমের শব্দ" + +#: ../src/main.c:446 +msgid "Print version" +msgstr "মুদ্রণ সংস্করণ" + +#: ../src/shell-app.c:454 +#, c-format +msgid "Failed to launch '%s'" +msgstr "'%s' চালু করতে ব্যর্থ" + +#: ../src/shell-global.c:1395 +msgid "Less than a minute ago" +msgstr "এক মিনিটেরও কম সময় আগে" + +#: ../src/shell-global.c:1399 +#, c-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d মিনিট আগে" +msgstr[1] "%d মিনিট আগে" + +#: ../src/shell-global.c:1404 +#, c-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ঘন্টা আগে" +msgstr[1] "%d ঘন্টা আগে" + +#: ../src/shell-global.c:1409 +#, c-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d দিন আগে" +msgstr[1] "%d দিন আগে" + +#: ../src/shell-global.c:1414 +#, c-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d সপ্তাহ আগে" +msgstr[1] "%d সপ্তাহ আগে" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "যুক্তরাজ্য" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "পূর্বনির্ধারিত" + +#: ../src/shell-polkit-authentication-agent.c:334 +msgid "Authentication dialog was dismissed by the user" +msgstr "ব্যবহারকারী কর্তৃক প্রমাণীকরণ ডায়ালগ বাতিল" + +#: ../src/shell-util.c:89 +msgid "Home Folder" +msgstr "হোম ফোল্ডার" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:104 +msgid "File System" +msgstr "ফাইল সিস্টেম" + +#. Translators: the first string is the name of a gvfs +#. * method, and the second string is a path. For +#. * example, "Trash: some-directory". It means that the +#. * directory called "some-directory" is in the trash. +#. +#: ../src/shell-util.c:300 +#, c-format +msgid "%1$s: %2$s" +msgstr "%1$s: %2$s" + +#~ msgid "Shut Down" +#~ msgstr "বন্ধ" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "এ অ্যাপ্লিকেশন বন্ধ করার জন্য বন্ধ করায় ক্লিক করে সিস্টেম বন্ধ।" + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "সিস্টেম %d সেকেন্ডে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।" + +#~ msgid "Shutting down the system." +#~ msgstr "সিস্টেম বন্ধ করা হচ্ছে।" + +#~ msgid "Confirm" +#~ msgstr "নিশ্চিত" diff --git a/po/bn_IN.po b/po/bn_IN.po new file mode 100644 index 0000000..440822a --- /dev/null +++ b/po/bn_IN.po @@ -0,0 +1,1825 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# , 2014. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-12-29 01:14+0000\n" +"PO-Revision-Date: 2014-12-30 16:45+0000\n" +"Last-Translator: \n" +"Language-Team: American English \n" +"Language: bn_IN\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: Lokalize 1.5\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "সিস্টেম" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "বার্তা ট্রে দেখান" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "বর্তমান বিজ্ঞপ্তিতে নজর দিন" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "পূর্বরূপ দেখান" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "সমস্ত অ্যাপ্লিকেশন দেখান" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "অ্যাপ্লিকেশন মেনু খুলুন" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME সেল" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "উইন্ডো পরিচালনা ও অ্যাপ্লিকেশন প্রারম্ভ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME সেল এক্সটেনশন অগ্রাধিকার" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME সেল এক্সটেনশন কনফিগার করুন" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME সেল (ওয়েল্যান্ড কম্পোজিটর)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"ডেভেলপার এবং টেস্টারদের কাজের সহায়ক অভ্যন্তরীণ সরঞ্জাম Alt-F2 থেকে চালু করুন" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 ডায়ালগ ব্যবহার করে অভ্যন্তরীণ ডিবাগিং এবং নিয়ন্ত্রণ সরঞ্জামে অ্যাক্সেস " +"দেয়" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "চালুর করার UUID এক্সটেনশন" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME সেল এক্সটেনশনের রয়েছে UUID বিশিষ্টতা; লোড করা উচিত এমন এক্সটেনশনগুলি এই " +"কী তালিকাভুক্ত করে। লোড হতে চাওয়া যেকোনো এক্সটেনশনকে এই তালিকায় থাকতে হবে। " +"অাপনি org.gnome.Shell-এ EnableExtension এবং DisableExtension D-Bus পদ্ধতি " +"দিয়ে এই তালিকা ব্যবহার করতে পারবেন।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "এক্সটেনশন সংস্করণের সুসংগততার যাচাইকরণ নিষ্ক্রিয় করে" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell শুধুমাত্র সেই এক্সটেনশনগুলি লোড করবে যা বর্তমান চলা সংস্করণ " +"সমর্থন করে বলে জানাচ্ছে। এই বিকল্প চালু করলে তা এই টিক চিহ্ন নিষ্ক্রিয় করবে " +"এবং যে সংস্করণগুলিই সমর্থন করছে বলে জানাক না কেন তা সমস্ত এক্সটেনশনই লোড করার " +"চেষ্টা করবে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "পছন্দসই অ্যাপ্লিকেশনগুলির জন্য ডেস্কটপ ফাইল ID-গুলির তালিকা" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"এই চিহ্নিতকারীর সাথে সংশ্লিষ্ট অ্যাপ্লিকেশনগুলি পছন্দসই অংশে দেখানো হবে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "অ্যাপ চয়নকারীর রূপ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "অ্যাপ্লিকেশন চয়নকারীতে বর্তমানে নির্বাচিত রূপের সূচি।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "(Alt-F2) কম্যান্ড ডায়ালগের ইতিহাস" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "লুকিং গ্লাস ডায়ালগের ইতিহাস" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "ব্যবহারকারী মেনুতে সর্বদা 'লগ অাউট' মেনু অাইটেম দেখান।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"এই কীটি একক-ব্যবহারকারী, একক-সেশন পরিস্থিতিতে 'লগ অাউট' মেনুর স্বয়ংক্রিয় " +"লুকানো ওভাররাইড করে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"এনক্রিপ্ট করা বা রিমোট ফাইলসিস্টেম মাউন্ট করার জন্য পাসওয়ার্ড মনে রাখা হবে " +"কিনা" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"একটি এনক্রিপ্ট করা ডিভাইস বা রিমোট ফাইলসিস্টেম মাউন্ট করা হলে সেল একটি " +"পাসওয়ার্ডের অনুরোধ করবে। অাগামী দিনে ব্যবহারের জন্য পাসওয়ার্ড সংরক্ষণ করা " +"গেলে 'পাসওয়ার্ড মনে রাখুন' নামক একটি টিক বাক্স উপস্থিত হবে। এই কীটি টিক " +"বাক্সের ডিফল্ট অবস্থা সেট করে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "ক্যালেন্ডারে সপ্তাহের তারিখ দেখান" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "সত্য হলে, ক্যালেন্ডারে ISO সপ্তাহ তারিখ দেখান।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "অ্যাপ্লিকেশন মেনু খুলতে কীবাইন্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "অ্যাপ্লিকেশন মেনু খুলতে কীবাইন্ডিং।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"অ্যাপ্লিকেশনগুলি দেখান\" রূপ খুলতে কীবাইন্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"ক্রিয়াকলাপের পূর্বরূপের \"অ্যাপ্লিকেশনগুলি দেখান\" রূপ খুলতে কীবাইন্ডিং।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "পূর্বরূপ খুলতে কীবাইন্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "ক্রিয়াকলাপের পূর্বরূপ খুলতে কীবাইন্ডিং।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "বার্তা ট্রে'র দৃশ্যমানতা টগল করতে কীবাইন্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "বার্তা ট্রে'র দৃশ্যমানতা টগল করতে কীবাইন্ডিং।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "সক্রিয় বিজ্ঞপ্তি ফোকাস করতে কীবাইন্ডিং" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "সক্রিয় বিজ্ঞপ্তি ফোকাস করতে কীবাইন্ডিং।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"সকল চলা জোড়া সাময়িক থামানো এবং অাবার শুরু করার কীবাইন্ডিং, ডিবাগিং করার জন্য" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "কোন কীবোর্ড ব্যবহার করা হবে" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "যে ধরনের কীবোর্ড ব্যবহার করা হবে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "বর্তমান কাজেরস্থানে স্যুইচার সীমাবদ্ধ করুন।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"সত্য হলে, বর্তমান কাজেরস্থানে উইন্ডো থাকা অ্যাপ্লিকেশনগুলিই শুধুমাত্র " +"স্যুইচারে দেখানো হয়। অন্যথায়, সকল অ্যাপ্লিকেশন অন্তর্ভুক্ত।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "অ্যাপ্লিকেশন অাইকন মোড।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"স্যুইচারে কীভাবে উইন্ডোগুলি দেখানো হয় তা কনফিগার করে। বৈধ সম্ভাব্যতাগুলি হল " +"'শুধুমাত্র-থাম্বনেইল' (উইন্ডোর একটি থাম্বনেইল দেখায়), 'শুধুমাত্র-অ্যাপ-অাইকন' " +"(শুধুমাত্র অ্যাপ্লিকেশন অাইকন দেখায়) বা 'উভয়ই'।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"সত্য হলে, শুধুমাত্র বর্তমান ওয়ার্কস্পেসের উইন্ডোগুলি স্যুইচারে দেখানো হয়। " +"অন্যথায়, সমস্ত উইন্ডো অন্তর্ভুক্ত করা হয়।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "প্রধান উইন্ডোতে মোডেল ডায়ালগ সংযুক্ত করুন" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"GNOME সেল চালানোর ক্ষেত্রে এই কী in org.gnome.mutter এর কী ওভাররাইড করে।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "উইন্ডো স্ক্রীন কিনারায় রাখার সময়ে কিনারা টাইলিং সক্রিয় করুন" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "ওয়ার্কস্পেসগুলি ডায়নামিক ভাবে ব্যবস্থাপিত হয়" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "শুধুমাত্র প্রধান মনিটরে ওয়ার্কস্পেস" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"পয়েন্টার অবস্থান পরিবর্তন না থামানো পর্যন্ত মাউস মোডে ফোকাস পরিবর্তন বিলম্বিত " +"করুন" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Network Login" +msgstr "নেটওয়ার্ক লগিন" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s -এর অগ্রাধিকার ডায়ালগ লোড করতে একটি সমস্যা দেখা দিয়েছে:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "GNOME Shell এক্সটেনশনগুলি" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:916 +msgid "Cancel" +msgstr "বাতিল" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "পরবর্তী" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "অান-লক" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "সাইন ইন" + +#: ../js/gdm/loginDialog.js:276 +msgid "Choose Session" +msgstr "সেশন বাছুন" + +#: ../js/gdm/loginDialog.js:428 +msgid "Not listed?" +msgstr "তালিকায় নেই?" + +#: ../js/gdm/loginDialog.js:814 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(উদাঃ, ব্যবহারকারী বা %s)" + +#: ../js/gdm/loginDialog.js:819 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "ব্যবহারকারীর নাম:" + +#: ../js/gdm/loginDialog.js:1151 +msgid "Login Window" +msgstr "লগিন উইন্ডো" + +#: ../js/gdm/util.js:341 +msgid "Authentication error" +msgstr "অনুমোদন সংক্রান্ত সমস্যা" + +#: ../js/gdm/util.js:473 +msgid "(or swipe finger)" +msgstr "(অাঙুল চালানো)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "কম্যান্ড পাওয়া যায়নি" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "কম্যান্ড পার্জ করা যায়নি:" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” -এর সম্পাদনা ব্যর্থ হয়েছে:" + +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "ওয়েব প্রমাণীকরণ পুনঃনির্দেশ" + +#: ../js/ui/appDisplay.js:770 +msgid "Frequently used applications will appear here" +msgstr "প্রায়ই ব্যবহৃত অ্যাপ্লিকেশনগুলি এখানে দেখা যাবে" + +#: ../js/ui/appDisplay.js:881 +msgid "Frequent" +msgstr "প্রায়ই" + +#: ../js/ui/appDisplay.js:888 +msgid "All" +msgstr "সকল" + +#: ../js/ui/appDisplay.js:1789 +msgid "New Window" +msgstr "নতুন উইন্ডো" + +#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "পছন্দসই থেকে সরান" + +#: ../js/ui/appDisplay.js:1821 +msgid "Add to Favorites" +msgstr "পছন্দসইতে যোগ করুন" + +#: ../js/ui/appDisplay.js:1830 +msgid "Show Details" +msgstr "বিবরণ প্রদর্শন করা হবে" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s অাপনার পছন্দসইতে যোগ করা হয়েছে।" + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "অাপনার পছন্দসই থেকে %s সরানো হয়েছে।" + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:819 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "সেটিং" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "ব্যাকগ্রাউন্ড পরিবর্তন করুন…" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */ +#: ../js/ui/calendar.js:39 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. 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:68 +msgctxt "event list time" +msgid "All Day" +msgstr "সারাদিন" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:75 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%ঘ∶%মি" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:84 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:98 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:100 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:102 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:104 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:106 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:108 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:110 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:123 +msgctxt "list sunday" +msgid "Su" +msgstr "রবি" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:125 +msgctxt "list monday" +msgid "M" +msgstr "সোম" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:127 +msgctxt "list tuesday" +msgid "T" +msgstr "মঙ্গল" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:129 +msgctxt "list wednesday" +msgid "W" +msgstr "বুধ" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:131 +msgctxt "list thursday" +msgid "Th" +msgstr "বৃহ" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:133 +msgctxt "list friday" +msgid "F" +msgstr "শুক্র" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:135 +msgctxt "list saturday" +msgid "S" +msgstr "শনি" + +#: ../js/ui/calendar.js:460 +msgid "Previous month" +msgstr "পূর্ববর্তী মাস" + +#: ../js/ui/calendar.js:470 +msgid "Next month" +msgstr "পরবর্তী মাস" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:805 +msgid "Nothing Scheduled" +msgstr "কিছু পরিকল্পিত নেই" + +#: ../js/ui/calendar.js:824 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/calendar.js:828 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:840 +msgid "Today" +msgstr "আজ" + +#: ../js/ui/calendar.js:844 +msgid "Tomorrow" +msgstr "আগামী কাল" + +#: ../js/ui/calendar.js:855 +msgid "This week" +msgstr "এই সপ্তাহ" + +#: ../js/ui/calendar.js:863 +msgid "Next week" +msgstr "পরবর্তী সপ্তাহ" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "বাহ্যিক ড্রাইভ সংযুক্ত" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "বাহ্যিক ড্রাইভ সংযোগ বিচ্ছিন্ন" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "অপসারণযোগ্য ডিভাইসগুলি" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s সহযোগে খুলুন" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "ইজেক্ট" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "পাসওয়ার্ড:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "অাবার লিখুন:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919 +msgid "Connect" +msgstr "সংযোগ করুন" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "পাসওয়ার্ড:" + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "কি:" + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "পরিচয়:" + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "ব্যক্তিগত কী পাসওয়ার্ড:" + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "পরিষেবা:" + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "বেতার নেটওয়ার্ক দ্বারা প্রমাণীকরণ প্রয়োজন" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"“%s” বেতার নেটওয়ার্ক অ্যাক্সেস করতে পাসওয়ার্ড বা এনক্রিপশন কী'র প্রয়োজন।" + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "তারযুক্ত 802.1X প্রমাণীকরণ" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "নেটওয়ার্কের নাম:" + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL প্রমাণীকরণ" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "PIN কোড প্রয়োজনীয়" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "মোবাইল ব্রডব্যান্ড ডিভাইসের জন্য PIN কোড প্রয়োজন" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN:" + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "মোবাইল ব্রডব্যান্ড নেটওয়ার্ক পাসওয়ার্ড" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s” -এ সংযোগ করতে একটি পাসওয়ার্ডের প্রয়োজন" + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "পরিচয় প্রমাণ করা আবশ্যক" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "প্রশাসক" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "প্রমাণীকরণ" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "দুঃখিত, কাজে অাসেনি। দয়া করে অাবার চেষ্টা করুন।" + +#: ../js/ui/components/telepathyClient.js:242 +msgid "Invitation" +msgstr "আমন্ত্রণ" + +#: ../js/ui/components/telepathyClient.js:302 +msgid "Call" +msgstr "কল" + +#: ../js/ui/components/telepathyClient.js:318 +msgid "File Transfer" +msgstr "ফাইল স্থানান্তর" + +#: ../js/ui/components/telepathyClient.js:422 +msgid "Chat" +msgstr "চ্যাট" + +#: ../js/ui/components/telepathyClient.js:485 +msgid "Unmute" +msgstr "সরব" + +#: ../js/ui/components/telepathyClient.js:485 +msgid "Mute" +msgstr "নীরব" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:955 +msgid "%H∶%M" +msgstr "%ঘ∶%মি" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:962 +msgid "Yesterday, %H∶%M" +msgstr "গতকাল, %ঘ∶%মি" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:969 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:976 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:982 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:988 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:995 +msgid "Yesterday, %l∶%M %p" +msgstr "গতকাল, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1002 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1009 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1015 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1047 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s %s হিসাবে পরিচিত" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1151 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s -এ অামন্ত্রণ" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1159 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s আপনাকে %s-এ আমন্ত্রণ জানাচ্ছেন" + +#: ../js/ui/components/telepathyClient.js:1161 +#: ../js/ui/components/telepathyClient.js:1196 +#: ../js/ui/components/telepathyClient.js:1230 +#: ../js/ui/components/telepathyClient.js:1287 +msgid "Decline" +msgstr "প্রত্যাখ্যান করুন" + +#: ../js/ui/components/telepathyClient.js:1167 +#: ../js/ui/components/telepathyClient.js:1236 +#: ../js/ui/components/telepathyClient.js:1292 +msgid "Accept" +msgstr "গ্রহণ করুন" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1186 +#, javascript-format +msgid "Video call from %s" +msgstr "%s থেকে ভিডিও কল" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1189 +#, javascript-format +msgid "Call from %s" +msgstr "%s থেকে কল" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1203 +msgid "Answer" +msgstr "উত্তর দিন" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1224 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s অাপনাকে %s পাঠাচ্ছেন" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1253 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "%s অাপনি অনলাইনে থাকলে তা দেখার অনুমতি চায়" + +#: ../js/ui/components/telepathyClient.js:1338 +msgid "Network error" +msgstr "নেটওয়ার্ক সংক্রান্ত ত্রুটি" + +#: ../js/ui/components/telepathyClient.js:1340 +msgid "Authentication failed" +msgstr "অনুমোদন ব্যর্থ" + +#: ../js/ui/components/telepathyClient.js:1342 +msgid "Encryption error" +msgstr "এনক্রিপশন সংক্রান্ত ত্রুটি" + +#: ../js/ui/components/telepathyClient.js:1344 +msgid "Certificate not provided" +msgstr "সার্টিফিকেট উপলব্ধ করা হয়নি" + +#: ../js/ui/components/telepathyClient.js:1346 +msgid "Certificate untrusted" +msgstr "সার্টিফিকেট বিশ্বস্ত নয়" + +#: ../js/ui/components/telepathyClient.js:1348 +msgid "Certificate expired" +msgstr "সার্টিফিকেটের মেয়াদ উত্তীর্ণ হয়েছে" + +#: ../js/ui/components/telepathyClient.js:1350 +msgid "Certificate not activated" +msgstr "সার্টিফিকেট সক্রিয় করা হয়নি" + +#: ../js/ui/components/telepathyClient.js:1352 +msgid "Certificate hostname mismatch" +msgstr "সার্টিফিকেটের হোস্টনেম-এ গরমিল" + +#: ../js/ui/components/telepathyClient.js:1354 +msgid "Certificate fingerprint mismatch" +msgstr "সার্টিফিকেটের ফিনঙ্গারপ্রিন্ট-এ গরমিল" + +#: ../js/ui/components/telepathyClient.js:1356 +msgid "Certificate self-signed" +msgstr "স্বয়ং স্বাক্ষরিত সার্টিফিকেট" + +#: ../js/ui/components/telepathyClient.js:1358 +msgid "Status is set to offline" +msgstr "স্ট্যাটাস অফলাইনে সেট করা হয়েছে" + +#: ../js/ui/components/telepathyClient.js:1360 +msgid "Encryption is not available" +msgstr "এনক্রিপশন উপলব্ধ নয়" + +#: ../js/ui/components/telepathyClient.js:1362 +msgid "Certificate is invalid" +msgstr "সার্টিফিকেট অবৈধ" + +#: ../js/ui/components/telepathyClient.js:1364 +msgid "Connection has been refused" +msgstr "সংযোগ প্রত্যাখ্যান করা হয়েছে" + +#: ../js/ui/components/telepathyClient.js:1366 +msgid "Connection can't be established" +msgstr "সংযোগ স্থাপন করা যাচ্ছে না" + +#: ../js/ui/components/telepathyClient.js:1368 +msgid "Connection has been lost" +msgstr "সংযোগ হারিয়ে গেছে" + +#: ../js/ui/components/telepathyClient.js:1370 +msgid "This account is already connected to the server" +msgstr "এই অ্যাকাউন্ট সার্ভারের সংগে ইতিমধ্যেই সংযুক্ত" + +#: ../js/ui/components/telepathyClient.js:1372 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" +"একই রিসোর্স ব্যবহার করে একটি নতুন সংযোগ দ্বারা সংযোগ প্রতিস্থাপন করা হয়েছে" + +#: ../js/ui/components/telepathyClient.js:1374 +msgid "The account already exists on the server" +msgstr "অ্যাকাউন্ট ইতিমধ্যেই সার্ভারে উপস্থিত" + +#: ../js/ui/components/telepathyClient.js:1376 +msgid "Server is currently too busy to handle the connection" +msgstr "সংযোগ ব্যবস্থাপনা করার দিক থেকে সার্ভার বর্তমানে অত্যন্ত ব্যস্ত" + +#: ../js/ui/components/telepathyClient.js:1378 +msgid "Certificate has been revoked" +msgstr "সার্টিফিকেট তুলে নেওয়া হয়েছে" + +#: ../js/ui/components/telepathyClient.js:1380 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"সার্টিফিকেট এক অনিরাপদ cipher অ্যালগরিদম ব্যবহার করে বা ক্রিপটোগ্র্যাফিক দিক " +"থেকে " +"দুর্বল" + +#: ../js/ui/components/telepathyClient.js:1382 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"সার্ভার সার্টিফিকেটের দৈর্ঘ্য, বা সার্ভার সার্টিফিকেট চেনের গভীরতা, " +"ক্রিপটোগ্র্যাফি " +"লাইব্রেরি দ্বারা নির্দিষ্ট সীমা ছাড়িয়ে গেছে" + +#: ../js/ui/components/telepathyClient.js:1384 +msgid "Internal error" +msgstr "অভ্যন্তরীণ ত্রুটি" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1394 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s -এ সংযোগ স্থাপন করতে ব্যর্থ" + +#: ../js/ui/components/telepathyClient.js:1399 +msgid "View account" +msgstr "অ্যাকাউন্ট দেখুন" + +#: ../js/ui/components/telepathyClient.js:1436 +msgid "Unknown reason" +msgstr "অজানা কারণ" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:155 +msgid "Windows" +msgstr "Windows" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "অ্যাপ্লিকেশনগুলি দেখান" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "ড্যাশ" + +#: ../js/ui/dateMenu.js:97 +msgid "Open Calendar" +msgstr "ক্যালেন্ডার খুলুন" + +#: ../js/ui/dateMenu.js:101 +msgid "Open Clocks" +msgstr "ঘড়ি খুলুন" + +#: ../js/ui/dateMenu.js:108 +msgid "Date & Time Settings" +msgstr "তারিখ ও সময় সেটিং" + +#. 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:132 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s লগ অাউট করুন" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "লগ অাউট করুন" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s %d -এর মধ্যে স্বয়ংক্রিয় ভাবে লগ অাউট হবে।" +msgstr[1] "%s %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে লগ অাউট হবে।" + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "অাপনি %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে লগ অাউট হবেন।" +msgstr[1] "অাপনি %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে লগ অাউট হবেন।" + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "লগ অাউট করুন" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "পাওয়ার বন্ধ" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "অাপডেট ইনস্টল করুন এবং পাওয়ার বন্ধ করুন" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "সিস্টেমের পাওয়ার %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে বন্ধ হয়ে যাবে।" +msgstr[1] "সিস্টেমের পাওয়ার %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে বন্ধ হয়ে যাবে।" + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "বাকি থাকা সফ্টওয়্যার অাপডেট ইনস্টল করুন" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "পুনরায় আরম্ভ করুন" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "পাওয়ার বন্ধ" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "পুনরায় আরম্ভ করুন" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "সিস্টেম %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে শুরু হবে।" +msgstr[1] "সিস্টেম %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে শুরু হবে।" + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "অাবার চালু করুন ও অাপডেটগুলি ইনস্টল করুন" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"সিস্টেম %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে চালু হবে এবং অাপডেট ইনস্টল করবে।" +msgstr[1] "" +"সিস্টেম %d সেকেন্ডের মধ্যে স্বয়ংক্রিয় ভাবে চালু হবে এবং অাপডেট ইনস্টল করবে।" + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "অাবার চালু করুন ও ইনস্টল করুন" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ইনস্টল করুন ও পাওয়ার বন্ধ করুন" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "অাপডেটগুলি ইনস্টল হয়ে যাওয়ার পরে পাওয়ার বন্ধ করুন" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "ব্যাটারির পাওয়ারে চলছে: অাপডেট ইনস্টল করার অাগে দয়া করে প্লাগ ইন করুন।" + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "কিছু অ্যাপ্লিকেশন ব্যস্ত বা অসংরক্ষিত কাজ অাছে।" + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "অন্যান্য ব্যবহারকারীরা লগ ইন অাছে।" + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (দূরবর্তী)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (কনসোল)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "ইনস্টল করুন" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "“%s” extensions.gnome.org থেকে ডাউনলোড এবং ইনস্টল করবেন?" + +#: ../js/ui/keyboard.js:706 ../js/ui/status/keyboard.js:539 +msgid "Keyboard" +msgstr "কীবোর্ড" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "কোনো এক্সটেনশন ইনস্টল নেই" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s থেকে কোনো ত্রুটি অাসেনি।" + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "ত্রুটি লুকান" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "ত্রুটি দেখান" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "সক্রিয়" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "নিষ্ক্রিয়" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "ত্রুটি" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "মেয়াদ উত্তীর্ণ" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "ডাউনলোড হচ্ছে" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "উৎস দেখুন" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "ওয়েব পেজ" + +#: ../js/ui/messageTray.js:1332 +msgid "Open" +msgstr "খুলুন" + +#: ../js/ui/messageTray.js:1339 +msgid "Remove" +msgstr "মুছে ফেলুন" + +#: ../js/ui/messageTray.js:1636 +msgid "Notifications" +msgstr "সূচনাবার্তা" + +#: ../js/ui/messageTray.js:1643 +msgid "Clear Messages" +msgstr "বার্তাগুলি সাফ করুন" + +#: ../js/ui/messageTray.js:1662 +msgid "Notification Settings" +msgstr "বিজ্ঞপ্তি সেটিং" + +#: ../js/ui/messageTray.js:1715 +msgid "Tray Menu" +msgstr "ট্রে মেনু" + +#: ../js/ui/messageTray.js:1939 +msgid "No Messages" +msgstr "কোনো বার্তা নেই" + +#: ../js/ui/messageTray.js:1986 +msgid "Message Tray" +msgstr "বার্তা ট্রে" + +#: ../js/ui/messageTray.js:2443 ../js/ui/overviewControls.js:483 +#: ../js/ui/screenShield.js:152 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d টি নতুন বার্তা" +msgstr[1] "%d টি নতুন বার্তা" + +#: ../js/ui/messageTray.js:3013 +msgid "System Information" +msgstr "সিস্টেম তথ্য" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:439 +msgctxt "program" +msgid "Unknown" +msgstr "অজানা" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "পূর্বাবস্থা" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "সংক্ষিপ্ত বর্ণনা" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "অনুসন্ধান করতে লিখুন…" + +#: ../js/ui/panel.js:521 +msgid "Quit" +msgstr "প্রস্থান" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:573 +msgid "Activities" +msgstr "ক্রিয়াকলাপ" + +#: ../js/ui/panel.js:924 +msgid "Top Bar" +msgstr "শীর্ষ দন্ড" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "একটি কম্যান্ড দিন" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "বন্ধ করুন" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "পুনরায় আরম্ভ করা হচ্ছে…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:154 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d টি নতুন বিজ্ঞপ্তি" +msgstr[1] "%d টি নতুন বিজ্ঞপ্তি" + +#: ../js/ui/screenShield.js:473 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "লক" + +#: ../js/ui/screenShield.js:709 +msgid "GNOME needs to lock the screen" +msgstr "GNOME কে স্ক্রীন লক করতে হবে" + +#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1312 +msgid "Unable to lock" +msgstr "লক করা যায়নি" + +#: ../js/ui/screenShield.js:837 ../js/ui/screenShield.js:1313 +msgid "Lock was blocked by an application" +msgstr "লক করা একটি অ্যাপ্লিকেশন দ্বারা অাটকানো হয়েছে" + +#: ../js/ui/search.js:611 +msgid "Searching…" +msgstr "অনুসন্ধান করা হচ্ছে..." + +#: ../js/ui/search.js:613 +msgid "No results." +msgstr "কোনো ফলাফল নেই।" + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "প্রতিলিপি" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "লেপন" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "টেক্সট দেখান" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "টেক্সট লুকান" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "পাসওয়ার্ড" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "পাসওয়ার্ড মনে রাখুন" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "অ্যাক্সেসযোগ্যতা" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "জুম" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "স্ক্রীন রিডার" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "স্ক্রীন কীবোর্ড" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "ভিজ্যুয়াল সর্তকর্তা" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "স্টিকি কী" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "মন্থর কী" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "বাউন্স কী" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "মাউস কী" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "উচ্চ বৈপরীত্য" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "অপেক্ষাকৃত বড় টেক্সট" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ব্লুটুথ" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1282 +#: ../js/ui/status/network.js:1393 ../js/ui/status/rfkill.js:91 +#: ../js/ui/status/rfkill.js:118 +msgid "Turn Off" +msgstr "বন্ধ করুন" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ব্লুটুথ সেটিং" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d টি সংযুক্ত ডিভাইস" +msgstr[1] "%d টি সংযুক্ত ডিভাইস" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1310 +msgid "Not Connected" +msgstr "সংযুক্ত নয়" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "উজ্জ্বলতা" + +#: ../js/ui/status/keyboard.js:563 +msgid "Show Keyboard Layout" +msgstr "কীবোর্ড সজ্জা দেখান" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "অবস্থান" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "নিষ্ক্রিয় করুন" + +#: ../js/ui/status/location.js:73 +msgid "Privacy Settings" +msgstr "গোপনীয়তা সেটিং" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "ব্যবহৃত হচ্ছে" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "সক্রিয় করুন" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1308 +#: ../js/ui/status/network.js:1512 +msgid "Off" +msgstr "বন্ধ" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "সংযুক্ত" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "অপরিচালিত" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "সংযোগ বিচ্ছিন্ন করা হচ্ছে" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1302 +msgid "Connecting" +msgstr "সংযোগ করা হচ্ছে" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "পরিচয় প্রমাণ করা আবশ্যক" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "ফায়ারওয়াল অনুপস্থিত" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "অনুপলব্ধ" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1696 +msgid "Connection failed" +msgstr "সংযোগ ব্যর্থ হয়েছে" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "তারযুক্ত সেটিং" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "মোবাইল ব্রডব্যান্ড সেটিং" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1306 +msgid "Hardware Disabled" +msgstr "হার্ডওয়্যার নিষ্ক্রিয়" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "ইন্টারনেট সংযোগ হিসাবে ব্যবহার করুন" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "বিমান মোড চালু অাছে" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "বিমান মোড চালু অবস্থায় Wi-Fi নিষ্ক্রিয় করা হয়।" + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "বিমান মোড বন্ধ করুন" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi বন্ধ" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "একটি নেটওয়ার্কের সাথে সংযুক্ত হতে Wi-Fi চালু করতে হবে।" + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi চালু করুন" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi নেটওয়ার্ক" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "একটি নেটওয়ার্ক নির্বাচন করুন" + +#: ../js/ui/status/network.js:883 +msgid "No Networks" +msgstr "কোনো নেটওয়ার্ক নেই" + +#: ../js/ui/status/network.js:904 ../js/ui/status/rfkill.js:116 +msgid "Use hardware switch to turn off" +msgstr "বন্ধ করতে হার্ডওয়্যার স্যুইচ ব্যবহার করুন" + +#: ../js/ui/status/network.js:1174 +msgid "Select Network" +msgstr "একটি নেটওয়ার্ক নির্বাচন করুন" + +#: ../js/ui/status/network.js:1180 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi সেটিং" + +#: ../js/ui/status/network.js:1282 +msgid "Turn On" +msgstr "চালু করুন" + +#: ../js/ui/status/network.js:1299 +msgid "Hotspot Active" +msgstr "Hotspot সক্রিয়" + +#: ../js/ui/status/network.js:1410 +msgid "connecting..." +msgstr "সংযোগ করা হচ্ছে..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1413 +msgid "authentication required" +msgstr "পরিচয় প্রমাণ করা আবশ্যক" + +#: ../js/ui/status/network.js:1415 +msgid "connection failed" +msgstr "সংযোগ ব্যর্থ হয়েছে" + +#: ../js/ui/status/network.js:1481 ../js/ui/status/rfkill.js:94 +msgid "Network Settings" +msgstr "নেটওয়ার্ক সেটিং" + +#: ../js/ui/status/network.js:1483 +msgid "VPN Settings" +msgstr "VPN সেটিং" + +#: ../js/ui/status/network.js:1502 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1657 +msgid "Network Manager" +msgstr "নেটওয়ার্ক ম্যানেজার" + +#: ../js/ui/status/network.js:1697 +msgid "Activation of network connection failed" +msgstr "নেটওয়ার্ক সংযোগের সক্রিয়করণ ব্যর্থ হয়েছে" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "পাওয়ার সেটিং" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "পুরোপুরি চার্জ রয়েছে" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "নির্ধারণ করা হচ্ছে…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d বাকি অাছে (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d ভর্তি পর্যন্ত (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "ব্যাটারি" + +#: ../js/ui/status/rfkill.js:88 +msgid "Airplane Mode" +msgstr "বিমান মোড" + +#: ../js/ui/status/rfkill.js:90 +msgid "On" +msgstr "চালু" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "ব্যবহারকারী পাল্টান" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "লগ অাউট করুন" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "সজ্জা লক" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "থামানো" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "পাওয়ার বন্ধ" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ভলিউম পরিবর্তিত" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "ভলিউম" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "মাইক্রোফোন" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "অপর ব্যবহারকারী হিসাবে লগ ইন করুন" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "উইন্ডো অান-লক করুন" + +#: ../js/ui/viewSelector.js:159 +msgid "Applications" +msgstr "অ্যাপ্লিকেশন" + +#: ../js/ui/viewSelector.js:163 +msgid "Search" +msgstr "অনুসন্ধান" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” প্রস্তুত" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "অাপনি কি এই প্রদর্শন সেটিংগুলি রাখতে চান?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "সেটিং পাল্টান" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "পরিবর্তনগুলি রাখুন" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "সেটিং পরিবর্তন %d সেকেন্ডের মধ্যে পূর্বাবস্থা করা হবে" +msgstr[1] "সেটিং পরিবর্তন %d সেকেন্ডের মধ্যে পূর্বাবস্থা করা হবে" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "ছোট করুন" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "অান-ম্যাক্সিমাইজ" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "বড় করুন" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "স্থানান্তরণ" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "মাপ পরিবর্তন" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "টাইটেল-বার অন-স্ক্রীন সরান" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "সর্বদা উপরে" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "সর্বদা দৃশ্যমান ওয়ার্কস্পেসে" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "উপরের কর্মক্ষেত্রে স্থানান্তরণ" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "নীচের কর্মক্ষেত্রে স্থানান্তরণ" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution বর্ষপঞ্জি" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u অাউটপুট" +msgstr[1] "%u অাউটপুট" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ইনপুট" +msgstr[1] "%u ইনপুট" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "সিস্টেম সাউন্ড" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "মুদ্রণ সংস্করণ" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "লগিন স্ক্রীনের জন্য GDM দ্বারা ব্যবহৃত মোড" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "লগিন স্ক্রীনের জন্য বিশেষ মোড ব্যবহার করুন, যেমন \"gdm\"" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "সম্ভাব্য মোডগুলির তালিকা করুন" + +#: ../src/shell-app.c:680 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s\" লঞ্চ করা গেল না" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "পাসওয়ার্ডগুলি মিলছে না।" + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "পাসওয়ার্ড খালি থাকলে চলবে না" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "প্রমাণীকরণের ডায়ালগ ব্যবহারকারী দ্বারা বাতিল করা হয়েছে" + + diff --git a/po/bs.po b/po/bs.po new file mode 100644 index 0000000..d2471f1 --- /dev/null +++ b/po/bs.po @@ -0,0 +1,1735 @@ +# Bosnian translation for bosnianuniversetranslation +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the bosnianuniversetranslation package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: bosnianuniversetranslation\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2015-02-27 03:04+0000\n" +"PO-Revision-Date: 2015-03-01 23:13+0100\n" +"Last-Translator: Samir Ribić \n" +"Language-Team: Bosnian \n" +"Language: bs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Launchpad-Export-Date: 2015-02-05 07:05+0000\n" +"X-Generator: Poedit 1.7.4\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "Sistem" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message list" +msgstr "Prikaži listu poruka" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "Fokusirati se na aktivnu obavijest" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "Pokaži pregled" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "Prikaži sve aplikacije" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "Otvorite izbornik aplikacije" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME školjka" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Upravljanje prozorima i pokretanje programa" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME Shell postavke proširenja" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "Podesi GNOME Shell proširenja" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME školjka (wayland compositor)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Omogućite interne alate korisne za programere i testere iz Alt-F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Omogućava pristup internom ispravljanju grešaka i praćenje alata pomoću " +"dijaloga Alt-F2." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "UUID nastavci za omogućavanje" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell ekstenzije imaju UUID osobinu; ovaj ključ prikazuje nastavke " +"koji bi trebali biti učitani. Svaka se ekstenzija koja želi da se učita " +"treba biti na ovom popisu. Također možete manipulirati ovim popisom sa " +"OmogućiNastavke i OnemogućiNastavke D - Bus metodama na org.gnome.Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "Onemogućava validaciju kompatibilnosti verzije nastavaka" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell će učitati samo ekstenzije koje podržavaju trenutno pokrenutu " +"verziju. Uključivanje ove opcije će onemogućiti ovu provjeru i pokušati " +"učitati sve nastavke bez obzira na verzije koje podržavaju." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "Popis ID-desktop datoteke za omiljene aplikacije" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Aplikacije koje odgovaraju ovim identifikatorima će biti prikazane u " +"omiljenom području." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "Pregled birača aplikacije" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "Indeks trenutno odabranog pregleda u biraču aplikacija." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "Historija za dijalog komande (Alt-F2)." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "Historija za ogledalo dijalog." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "Uvijek prikaži 'Odjavi se' stavku menija u korisničkom meniju." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"Ovaj ključ nadjačava automatsko skrivanje 'Odjava' stavke izbornika jednog " +"korisnika, u situacijama jedne sesije." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "Bilo da zapamti lozinku šifrovanog ili udaljenog fajl sistema." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Ljuska će zahtijevati lozinku kad je postavljen uređaj za šifrovanje ili " +"udaljeni fajl sistem. Ako lozinka mozi biti spašena, u budućnosti će vam se " +"prikazati kvadratić da oznacčte Zapamti lozinku. Ova tipka postavlja osnovno " +"stanje kvadratića za označavanje." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "Prikaži datum sedmice u kalendaru." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "Ako je tačno, prikazi ISO datum sedmice u kalendaru." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "Prečica za otvaranje aplikacijskog menija." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "Prečica za otvaranje aplikacijskog menija." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "Prečica za otvaranje \"Prikaži aplikacije\" prikaza." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"Prečica za otvaranje \"Prikaži aplikacije\" prikaza u pregledu aktivnosti." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "Prečica za otvaranje pregleda." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "Prečica za otvaranje pregleda aktivnosti." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "Prečica za mijenjanje prikaza poruke." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "Prečica za mijenjanje prikaza poruke." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "Precica za fokusiranje aktivne obavijesti." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "Precica za fokusiranje aktivne obavijesti." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Kratice tipkovnice koje pauziraju i nastavljaju sve pokrenute tweens, što za " +"svrhu ima ispravljanje pogrešaka" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "Koju tastaturu koristiti" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "Tip tastature za koristenje." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "Ograničite prebacivanje na trenutnom radnom prostoru." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ako je tačno, samo aplikacije koje imaju prozore na trenutnom radnom " +"prostoru su prikazane u prekidaču. Inače, sve alpikacije su uključene." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "Mod aplikacijske ikone." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"Konfigurise kako su prozori prikazani u preklopniku. Ispravne mogucnosti su " +"'slicicica-–samo' (prikazuje slicicu prozora), 'app-icon- samo' (prikazuje " +"samo aplikaciju) ili 'oboje'." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ako je tačno, samo forme na trenutnom radnom prostoru su prikazane u " +"prekidaču. Inače, svi prozori su uključeni." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "Pričvrstite modalni dijalog na izvornom prozoru" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ovaj ključ nadjačava ključ u org.gnome.mutter kada se izvodi GNOME školjka." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Omogući poravnanje rubova prilikom spuštanja prozora na rubove ekrana" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "Radni prostor je upravljan dinamički" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "Radni prostori samo na glavnom monitoru" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Kašnjenje fokusa rezultuje promjenama u načinu miša dok pokazivač prestaje " +"s kretanjem" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Network Login" +msgstr "Mrežna prijava" + +#: ../js/extensionPrefs/main.js:123 +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Postoji greška koja se javila pri učitanju dijaloga postavki za %s:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "GNOME Shell Nastavci" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:916 +msgid "Cancel" +msgstr "Otkaži" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "Sljedeći" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Otključaj" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "Prijava" + +#: ../js/gdm/loginDialog.js:276 +msgid "Choose Session" +msgstr "Odaberite sesiju" + +#: ../js/gdm/loginDialog.js:417 +msgid "Not listed?" +msgstr "Nije izlistano?" + +#: ../js/gdm/loginDialog.js:826 +msgid "(e.g., user or %s)" +msgstr "(npr., korisnik ili %s)" + +#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "Korisničko ime: " + +#: ../js/gdm/loginDialog.js:1166 +msgid "Login Window" +msgstr "Prozor za prijavu" + +#: ../js/gdm/util.js:341 +msgid "Authentication error" +msgstr "Greška pri prijavljivanju" + +#: ../js/gdm/util.js:473 +msgid "(or swipe finger)" +msgstr "(ili pređi prstom)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "Naredba nije pronađena" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "Nije moguće analizirati naredbu:" + +#: ../js/misc/util.js:156 +msgid "Execution of “%s” failed:" +msgstr "Završavanje \"%s\" nije uspjelo:" + +#. TRANSLATORS: this is the title of the wifi captive portal login +#. * window, until we know the title of the actual login page */ +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "Preusmjerenje web provjere autentičnosti" + +#: ../js/ui/appDisplay.js:785 +msgid "Frequently used applications will appear here" +msgstr "Često korištene aplikacije će se pojaviti ovdje" + +#: ../js/ui/appDisplay.js:905 +msgid "Frequent" +msgstr "Često" + +#: ../js/ui/appDisplay.js:912 +msgid "All" +msgstr "Svi" + +#: ../js/ui/appDisplay.js:1840 +msgid "New Window" +msgstr "Novi prozor" + +#: ../js/ui/appDisplay.js:1868 ../js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Ukloni iz omiljenih" + +#: ../js/ui/appDisplay.js:1874 +msgid "Add to Favorites" +msgstr "Dodaj u omiljene" + +#: ../js/ui/appDisplay.js:1884 +msgid "Show Details" +msgstr "Prikaži detalje" + +#: ../js/ui/appFavorites.js:132 +msgid "%s has been added to your favorites." +msgstr "%s je dodan u vaše favorite." + +#: ../js/ui/appFavorites.js:166 +msgid "%s has been removed from your favorites." +msgstr "%s je uklonjen iz vaših favorita." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:649 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "Podešavanja" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "Promjeni pozadinu" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */ +#: ../js/ui/calendar.js:52 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Shown in calendar event list for all day events +#. * Keep it short, best if you can usi less then 10 characters +#. */ +#: ../js/ui/calendar.js:81 +msgctxt "event list time" +msgid "All Day" +msgstr "Cijeli dan" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:88 ../js/ui/calendar.js:1562 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:97 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:111 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:113 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid tuesday" +msgid "T" +msgstr "U" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid wednesday" +msgid "W" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid thursday" +msgid "T" +msgstr "Č" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:590 +msgid "Previous month" +msgstr "Prethodni mjesec" + +#: ../js/ui/calendar.js:600 +msgid "Next month" +msgstr "Sljedeći mjesec" + +#: ../js/ui/calendar.js:1245 +msgid "Clear section" +msgstr "Očisti sekciju" + +#: ../js/ui/calendar.js:1423 +msgid "Events" +msgstr "Događaji" + +#: ../js/ui/calendar.js:1431 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/calendar.js:1435 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:1528 +msgid "Notifications" +msgstr "Obavijesti" + +#: ../js/ui/calendar.js:1665 +msgid "No Notifications" +msgstr "Nema obavijesti" + +#: ../js/ui/calendar.js:1668 +msgid "No Events" +msgstr "Nema događaja" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Vanjski disk povezan" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Vanjski disk iskopčan" + +#: ../js/ui/components/autorunManager.js:354 +msgid "Open with %s" +msgstr "Otvori pomoću %s" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "Lozinka:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "Upišite ponovo:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919 +msgid "Connect" +msgstr "Povezati" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "Lozinka: " + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "Kljuc: " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "Identitet: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "Osobni kljuc šifrovanja: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "Održavati: " + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "Bežična mreža zahtjeva provjeru vjerodostojnosti" + +#: ../js/ui/components/networkAgent.js:319 +msgid "" +"Passwords or encryption keys are required to access the wireless network “%" +"s”." +msgstr "" +"Lozinke ili kriptografski ključevi su potrebni za pristup bežičnoj mreži \"%s" +"\"." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "Žičana 802.1X provjera vjerodostojnosti" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "Naziv mreže: " + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL provjera vjerodostojnosti" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "Potreban je PIN kod" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Potreban je PIN kod za povezivanje mobilnog širokopojasnog uređaja" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "Lozinka mobilne širokopojasne mreže" + +#: ../js/ui/components/networkAgent.js:346 +msgid "A password is required to connect to “%s”." +msgstr "Potrebna je lozinka za povezivanje sa \"%s\"." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "Neophodna provjera vjerodostojnosti" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "Administrator" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "Dokaži autentičnost" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (liki invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "Žao nam je, nije uspjelo. Molimo pokušajte ponovno." + +#: ../js/ui/components/telepathyClient.js:243 +msgid "Invitation" +msgstr "Pozivnica" + +#: ../js/ui/components/telepathyClient.js:303 +msgid "Call" +msgstr "Poziv" + +#: ../js/ui/components/telepathyClient.js:319 +msgid "File Transfer" +msgstr "Prijenos podataka" + +#: ../js/ui/components/telepathyClient.js:423 +msgid "Chat" +msgstr "Ćaskanje" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:936 ../js/ui/dateMenu.js:209 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:943 +msgid "Yesterday, %H∶%M" +msgstr "Jučer, %H∶%M" + +#. Translators: this is the week day nami followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:950 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month nami and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:957 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month nami, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:963 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format */ +#: ../js/ui/components/telepathyClient.js:969 ../js/ui/dateMenu.js:212 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:976 +msgid "Yesterday, %l∶%M %p" +msgstr "Jučer, %l∶%M %p" + +#. Translators: this is the week day nami followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:983 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month nami and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:990 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month nami, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:996 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM nami to their new +#. IM nami. */ +#: ../js/ui/components/telepathyClient.js:1028 +msgid "%s is now known as %s" +msgstr "%s je sada poznat kao %s" + +#. translators: argument is a room nami liki +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1132 +msgid "Invitation to %s" +msgstr "Poziv za %s" + +#. translators: first argument is the nami of a contact and the second +#. * one the nami of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1136 +msgid "%s is inviting you to join %s" +msgstr "%s vas poziva da se pridružite %s" + +#: ../js/ui/components/telepathyClient.js:1140 +#: ../js/ui/components/telepathyClient.js:1175 +#: ../js/ui/components/telepathyClient.js:1207 +#: ../js/ui/components/telepathyClient.js:1273 +msgid "Decline" +msgstr "Odbij" + +#: ../js/ui/components/telepathyClient.js:1146 +#: ../js/ui/components/telepathyClient.js:1213 +#: ../js/ui/components/telepathyClient.js:1278 +msgid "Accept" +msgstr "Prihvati" + +#. translators: argument is a contact nami liki Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1165 +msgid "Video call from %s" +msgstr "Video poziv od %s" + +#. translators: argument is a contact nami liki Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1168 +msgid "Call from %s" +msgstr "Poziv od %s" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1182 +msgid "Answer" +msgstr "Odgovor" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file nami. The string will bje something +#. * liki: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1203 +msgid "%s is sending you %s" +msgstr "%s vam šalje %s" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1230 +msgid "%s would like permission to see when you are online" +msgstr "%s želi dozvolu da vidi kada ste na mreži" + +#: ../js/ui/components/telepathyClient.js:1321 +msgid "Network error" +msgstr "Mrežna greška" + +#: ../js/ui/components/telepathyClient.js:1323 +msgid "Authentication failed" +msgstr "Provjera vjerodostojnosti nije uspjela" + +#: ../js/ui/components/telepathyClient.js:1325 +msgid "Encryption error" +msgstr "Greška pri šifrovanju" + +#: ../js/ui/components/telepathyClient.js:1327 +msgid "Certificate not provided" +msgstr "Certifikat nije priložen" + +#: ../js/ui/components/telepathyClient.js:1329 +msgid "Certificate untrusted" +msgstr "Nepovjerljiv certifikat" + +#: ../js/ui/components/telepathyClient.js:1331 +msgid "Certificate expired" +msgstr "Certifikat je istekao" + +#: ../js/ui/components/telepathyClient.js:1333 +msgid "Certificate not activated" +msgstr "Certifikat nije aktiviran" + +#: ../js/ui/components/telepathyClient.js:1335 +msgid "Certificate hostname mismatch" +msgstr "Ime domaćina certifikata ne odgovara" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Certificate fingerprint mismatch" +msgstr "Otisak certifikata ne odgovara" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Certificate self-signed" +msgstr "Certifikat je potpisao sam sebe" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Status is set to offline" +msgstr "Status je postavljen na odjavljen" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Encryption is not available" +msgstr "Šifrovanje nije dostupno" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate is invalid" +msgstr "Certifikat nije ispravan" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Connection has been refused" +msgstr "Veza je odbijena" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Connection can't be established" +msgstr "Veza ne može biti uspostavljena" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Connection has been lost" +msgstr "Veza je izgubljena" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "This account is already connected to the server" +msgstr "Ovaj nalog je već povezan sa serverom" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "Veza je zamijenjena novom vezom koristeći isti resurs" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "The account already exists on the server" +msgstr "Ovaj nalog već postoji na serveru" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Server is currently too busy to handle the connection" +msgstr "Server je trenutno previše zauzet da bi uspostavio vezu" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate has been revoked" +msgstr "Certifikat je opozvan" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"Certifikat koristi nebezbjedni algoritam šifrovanja ili je kriptografski slab" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"Dužina certifikata servera, ili dubina lanca certifikata servera premašuje " +"granice biblioteke za šifrovanje" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Internal error" +msgstr "Greška unutar programa" + +#. translators: argument is the account nami, liki +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Unable to connect to %s" +msgstr "Nemoguće se povezati na %s" + +#: ../js/ui/components/telepathyClient.js:1382 +msgid "View account" +msgstr "Pogledaj nalog" + +#: ../js/ui/components/telepathyClient.js:1419 +msgid "Unknown reason" +msgstr "Nepoznat razlog" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:155 +msgid "Windows" +msgstr "Prozori" + +#: ../js/ui/dash.js:250 ../js/ui/dash.js:291 +msgid "Show Applications" +msgstr "Prikaži aplikacije" + +#: ../js/ui/dash.js:451 +msgid "Dash" +msgstr "Crta" + +#. Translators: This is the date format to usi 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:72 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible nami of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. */ +#: ../js/ui/dateMenu.js:79 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: ../js/ui/dateMenu.js:159 +msgid "Add world clocks…" +msgstr "Dodaj svjetske satove.." + +#: ../js/ui/dateMenu.js:160 +msgid "World Clocks" +msgstr "Svjetski časovnik" + +#: ../js/ui/endSessionDialog.js:64 +msgctxt "title" +msgid "Log Out %s" +msgstr "Odjavi %s" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Odjavi se" + +# translations. +#: ../js/ui/endSessionDialog.js:67 +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s će biti automatski odjavljen u %d sekundi." +msgstr[1] "%s će biti automatski odjavljen u %d sekunde." +msgstr[2] "%s će biti automatski odjavljen u %d sekundi." + +# translations. +#: ../js/ui/endSessionDialog.js:72 +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Bit ćete automatski odjavljeni u %d sekundi." +msgstr[1] "Bit ćete automatski odjavljeni u %d sekunde." +msgstr[2] "Bit ćete automatski odjavljeni u %d sekundi." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Odjavi se" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Ugasi" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instaliraj ažuriranja i ugasi" + +# translations. +#: ../js/ui/endSessionDialog.js:87 +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistem će biti automatski ugašen u %d sekundi." +msgstr[1] "Sistem će biti automatski ugašen u %d sekunde." +msgstr[2] "Sistem će biti automatski ugašen u %d sekundi." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instaliraj tekuća ažuriranja softvera" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Ponovno pokretanje" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Gašenje" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Ponovo pokreni" + +# translations. +#: ../js/ui/endSessionDialog.js:105 +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistem će biti automatski ponovo pokrenut u %d sekundi." +msgstr[1] "Sistem će biti automatski ponovo pokrenut u %d sekunde." +msgstr[2] "Sistem će biti automatski ponovo pokrenut u %d sekundi." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Ponovo pokreni i instaliraj ažuriranja" + +# translations. +#: ../js/ui/endSessionDialog.js:121 +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sistem će biti automatski ponovo pokrenut i instalirati ažuriranja u %d " +"sekundi." +msgstr[1] "" +"Sistem će biti automatski ponovo pokrenut i instalirati ažuriranja u %d " +"sekunde." +msgstr[2] "" +"Sistem će biti automatski ponovo pokrenut i instalirati ažuriranja u %d " +"sekundi." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "Ponovo pokreni & instaliraj" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instaliraj & ugasi" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Ugasi nakon instaliranja ažuriranja" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Pokrenuto na baterije; molimo uključite prije instaliranja ažuriranja." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "Neke aplikacije su zauzete ili imaju nesačuvanih poslova." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "Drugi korisnici su prijavljeni." + +#. Translators: Remote here refers to a remote session, liki a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +msgid "%s (remote)" +msgstr "%s (udaljen)" + +#. Translators: Console here refers to a tty liki a VT console */ +#: ../js/ui/endSessionDialog.js:643 +msgid "%s (console)" +msgstr "%s (konzola)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Instaliraj" + +#: ../js/ui/extensionDownloader.js:204 +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Preuzeti i instalirati \"%s\" iz extensions.gnome.org?" + +#: ../js/ui/keyboard.js:706 ../js/ui/status/keyboard.js:576 +msgid "Keyboard" +msgstr "Tastatura" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "Nema instaliranih nastavaka" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +msgid "%s has not emitted any errors." +msgstr "%s nije emitovao nikakve greške." + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "Sakrij greške" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "Prikaži greške" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "Omogućeno" + +#. Translators: this is for a network djevice that cannot bje activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The djevice has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "Onemogućeno" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "Greška" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "Isteklo" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "Preuzimanje" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "Pogledaj Izvor" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "Web stranica" + +#: ../js/ui/messageTray.js:2091 +msgid "System Information" +msgstr "Informacije o sistemu" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "Poništi" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "Pregled" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "Utipkajte za pretragu…" + +#: ../js/ui/panel.js:351 +msgid "Quit" +msgstr "Izlaz" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can usi the word for "Overview". */ +#: ../js/ui/panel.js:403 +msgid "Activities" +msgstr "Aktivnosti" + +#: ../js/ui/panel.js:754 +msgid "Top Bar" +msgstr "Top bar" + +#: ../js/ui/popupMenu.js:288 +msgid "toggle-switch-us" +msgstr "mijenjati-zamijeniti-nas" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Unesi naredbu" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "Zatvori" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "Ponovno pokretanje…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:85 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: ../js/ui/screenShield.js:144 +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nova poruka" +msgstr[1] "%d nove poruke" +msgstr[2] "%d novih poruka" + +#: ../js/ui/screenShield.js:146 +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nova obavijest" +msgstr[1] "%d nove obavijesti" +msgstr[2] "%d novih obavijesti" + +#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "Zaključavanje" + +#: ../js/ui/screenShield.js:668 +msgid "GNOME needs to lock the screen" +msgstr "GNOME treba zaključavanje ekrana" + +#: ../js/ui/screenShield.js:795 ../js/ui/screenShield.js:1271 +msgid "Unable to lock" +msgstr "U nemogućnosti zaključati" + +#: ../js/ui/screenShield.js:796 ../js/ui/screenShield.js:1272 +msgid "Lock was blocked by an application" +msgstr "Zaključavanje je blokirano od strane neke aplikacije" + +#: ../js/ui/search.js:609 +msgid "Searching…" +msgstr "Tražim…" + +#: ../js/ui/search.js:611 +msgid "No results." +msgstr "Nema rezultata." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Kopiranje" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Ubaci" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Prikaži tekst" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Sakrij tekst" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "Loznka" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "Zapamti loziku" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Pristupačnost" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Uvećanje" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Čitač ekrana" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Ekranska Tastatura" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Vizualna upozorenja" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Upareni tasteri" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Spori tasteri" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Odskočni tasteri" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Tipke miša" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "Veliki kontrast" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "Veliki Tekst" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1282 +#: ../js/ui/status/network.js:1393 ../js/ui/status/rfkill.js:91 +#: ../js/ui/status/rfkill.js:118 +msgid "Turn Off" +msgstr "Isključi" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "Bluetooth postavke" + +#: ../js/ui/status/bluetooth.js:104 +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d povezan uređaj" +msgstr[1] "%d povezana uređaja" +msgstr[2] "%d povezanih uređaja" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1310 +msgid "Not Connected" +msgstr "Nije spojen" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Osvjetljenje" + +#: ../js/ui/status/keyboard.js:599 +msgid "Show Keyboard Layout" +msgstr "Prikaži raspored Tastature" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "Lokacija" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "Onemogući" + +#: ../js/ui/status/location.js:73 +msgid "Privacy Settings" +msgstr "Postavke privatnosti" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "U upotrebi" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "Omogući" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1308 +#: ../js/ui/status/network.js:1512 +msgid "Off" +msgstr "Isključen" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "Povezano" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot bje used in the mijenu) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "Neupravljivo" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "Prekidam vezu" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1302 +msgid "Connecting" +msgstr "Povezivanje" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "Autentifikacija potrebna" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "Nedostaje firmver" + +#. Translators: this is for a network djevice that cannot bje activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "Nedostupno" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1696 +msgid "Connection failed" +msgstr "Veza nije uspjela" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "Wired Postavke" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "Mobilne širokopojasne postavke" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1306 +msgid "Hardware Disabled" +msgstr "Hardware onemogućen" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "Koristi internet vezu" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "Režim U avionu uključen" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi je onemogućen kada je režim U avionu uključen." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "Isključi režim U avionu" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi je isključen" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi treba da bude uključen da bi se povezali na mrežu." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Uključi Wi-Fi" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi mreže" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "Odaberite mrežu" + +#: ../js/ui/status/network.js:883 +msgid "No Networks" +msgstr "Nema mreže" + +#: ../js/ui/status/network.js:904 ../js/ui/status/rfkill.js:116 +msgid "Use hardware switch to turn off" +msgstr "Koristi hardver prekidač za isključenje" + +#: ../js/ui/status/network.js:1174 +msgid "Select Network" +msgstr "Odaberite mrežu" + +#: ../js/ui/status/network.js:1180 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi podešavanja" + +#: ../js/ui/status/network.js:1282 +msgid "Turn On" +msgstr "Uključi" + +#: ../js/ui/status/network.js:1299 +msgid "Hotspot Active" +msgstr "Hotspot Aktivan" + +#: ../js/ui/status/network.js:1410 +msgid "connecting..." +msgstr "konektovanje..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1413 +msgid "authentication required" +msgstr "potvrda vjerodostojnosti neophodna" + +#: ../js/ui/status/network.js:1415 +msgid "connection failed" +msgstr "konekcija nije uspjela" + +#: ../js/ui/status/network.js:1481 ../js/ui/status/rfkill.js:94 +msgid "Network Settings" +msgstr "Mrežne postavke" + +#: ../js/ui/status/network.js:1483 +msgid "VPN Settings" +msgstr "VPN Postavke" + +#: ../js/ui/status/network.js:1502 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1657 +msgid "Network Manager" +msgstr "Upravitelj mreže" + +#: ../js/ui/status/network.js:1697 +msgid "Activation of network connection failed" +msgstr "Aktivacija mrežne veze nije uspješna" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "Postavke napajanja" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "Potpuno napunjeno" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "Procjena" + +#: ../js/ui/status/power.js:86 +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d Preostalo (%d%%)" + +#: ../js/ui/status/power.js:91 +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d Do potpunog (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "Baterija" + +#: ../js/ui/status/rfkill.js:88 +msgid "Airplane Mode" +msgstr "Režim u avionu" + +#: ../js/ui/status/rfkill.js:90 +msgid "On" +msgstr "Uključeno" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "Promijeni korisnika" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "Odjavite se" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "Orjentaciju zaključati" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "Suspenduj" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "Ugasi" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "Promjena jačine" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "Jačina" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "Mikrofon" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Prijavite se kao drugi korisnik" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Otključaj prozor" + +#: ../js/ui/viewSelector.js:159 +msgid "Applications" +msgstr "Aplikacije" + +#: ../js/ui/viewSelector.js:163 +msgid "Search" +msgstr "Pretraži" + +#: ../js/ui/windowAttentionHandler.js:19 +msgid "“%s” is ready" +msgstr "\"%s\" je spreman" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "Da li želite zadržati ove postavke prikaza?" + +#. Translators: this and the following message should bje limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Vraćanje postavki" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "Sačuvaj promjene" + +#: ../js/ui/windowManager.js:107 +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Promjene postavki će se vratiti u %d sekundi" +msgstr[1] "Promjene postavki će se vratiti u %d sekunde" +msgstr[2] "Promjene postavki će se vratiti u %d sekundi" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. */ +#: ../js/ui/windowManager.js:599 +msgid "%d x %d" +msgstr "%d x %d" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Umanji" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Poništi uvećavanje" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Uvećaj" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Premjesti" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Promijeni veličinu" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Pomjeri Titlebar Onscreen" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Uvijek na vrhu" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Uvijek na vidnom radnom mjestu" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "Premjesti na radni prostor gore" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "Premjesti na radni prostor dole" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Kalendar evolucije" + +#. translators: +#. * The number of sound outputs on a particular djevice +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u izlaz" +msgstr[1] "%u izlaza" +msgstr[2] "%u izlaza" + +#. translators: +#. * The number of sound inputs on a particular djevice +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ulaz" +msgstr[1] "%u ulaza" +msgstr[2] "%u ulaza" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "Sistemski zvuci" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "Ispiši izdanje" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "Mod koristen od strane GDM za prozor prijave." + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "Koristi specifični mod, npr. “\"gdm”\" za prozor prijave." + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "Spisak mogućih modova." + +#: ../src/shell-app.c:247 +msgctxt "program" +msgid "Unknown" +msgstr "Nepoznato" + +#: ../src/shell-app.c:488 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Nisam uspio pokrenuti \"%s\"" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "Lozinke se ne poklapaju." + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "Lozinka ne može biti prazna" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "Autentifikacijski dijalog ugašen od strane korisnika" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the notification list" +msgstr "Prikaži listu obavijesti" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Taster za izmjenu vidljivosti liste obavijesti" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Taster za izmjenu vidljivosti liste obavijesti" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..2c20b6c --- /dev/null +++ b/po/ca.po @@ -0,0 +1,2609 @@ +# Catalan gnome-shell translation. +# Copyright (C) 2009 Siegfried-Angel Gevatter Pujals +# This file is distributed under the same license as the gnome-shell package. +# Siegfried-Angel Gevatter Pujals , 2009. +# Jordi Serratosa , 2012, 2017. +# Gil Forcada , 2010, 2011, 2013, 2014, 2016, 2018. +# Jordi Mas i Hernàndez , 2017-2019 +# +msgid "" +msgstr "" +"Project-Id-Version: HEAD\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-06 13:41+0000\n" +"PO-Revision-Date: 2018-03-10 21:24+0100\n" +"Last-Translator: Robert Antoni Buj Gelonch \n" +"Language-Team: Catalan \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.4\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Mostra la llista de notificacions" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Posa el focus en la notificació activa" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Mostra la vista general" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Mostra totes les aplicacions" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Obre el menú d'aplicació" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:221 +msgid "Shell Extensions" +msgstr "Extensions del Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configureu les extensions del GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gestor de finestres i llançador d'aplicacions" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Habilita les eines internes en el diàleg de l'Alt+F2 que són útils per als " +"desenvolupadors i provadors" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permet l'accés a les eines de depuració i de seguiment internes a través del " +"diàleg de l'Alt+F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "" +"Identificadors universals únics de les extensions que s'han d'habilitar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Les extensions del GNOME Shell tenen un identificador universal. Aquesta " +"clau conté una llista de les extensions que s'han de carregar. Qualsevol " +"extensió que s'hagi de carregar ha de ser a la llista. Podeu modificar " +"aquesta llista amb els mètodes de D-Bus «EnableExtension» (activa una " +"extensió) i «DisableExtension» (desactiva una extensió) a org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Inhabilita les extensions d'usuari" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Inhabilita totes les extensions que l'usuari ha habilitat sense afectar el " +"paràmetre «enabled-extension»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Desactiva la validació de la compatibilitat de versió d'extensions" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"El GNOME Shell només carregarà extensions que afirmin ser compatibles amb la " +"versió en execució. Si s'activa aquesta opció, es desactivarà la comprovació " +"i es provarà de carregar totes les extensions sense tenir en compte les " +"versions amb què afirmin ser compatibles." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Llista d'identificadors de fitxers d'escriptori de les aplicacions preferides" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Es mostraran, a l'àrea de preferits, les aplicacions que corresponguin a " +"aquests identificadors." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Vista del seleccionador d'aplicacions" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Índex de la vista seleccionada actualment en el seleccionador d'aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historial de les ordres utilitzades en el diàleg de l'Alt+F2" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historial del depurador del GNOME Shell" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Mostra sempre l'element de menú «Surt» al menú d'usuari." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Aquesta clau sobreescriu l'ocultació automàtica de l'element de menú «Surt» " +"quan només hi ha un usuari i un sol tipus de sessió." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Si s'han de recordar les contrasenyes dels punts de muntatge encriptats o " +"els sistemes de fitxers remots" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"El GNOME Shell us demanarà la contrasenya quan es munti un dispositiu " +"encriptat o un sistema de fitxers remot. Si es pot desar la contrasenya per " +"utilitzar-lo en el futur, es mostrarà la casella de verificació «Recorda la " +"contrasenya». Aquesta clau estableix el valor per defecte d'aquesta casella " +"de verificació." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Si l'adaptador de Bluetooth predeterminat té dispositius configurats " +"associats" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +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 " +"té dispositius associats." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Habilita l'API d'introspecció" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Habilita una API D-BUS que permet la introspecció de l'estat de l'aplicació " +"del Shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Vinculació per obrir el menú d'aplicació" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "La vinculació per obrir el menú d'aplicació." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Vinculació de tecles per obrir la vista «Mostra les aplicacions»" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Vinculació de tecles per obrir la vista «Mostra les aplicacions» de les " +"activitats de la vista general." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Vinculació per obrir la vista general" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Vinculació per obrir la vista general d'activitats." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"La vinculació per commutar la visibilitat de la llista de notificacions" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"La vinculació per commutar la visibilitat de la llista de notificacions." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Vinculació per posar el focus a la notificació activa" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Vinculació per posar el focus a la notificació activa." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Vinculació que fa una pausa i continua tots els «tweens» en execució, per " +"motius de depuració" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Commuta a l'aplicació 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Commuta a l'aplicació 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Commuta a l'aplicació 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Commuta a l'aplicació 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Commuta a l'aplicació 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Commuta a l'aplicació 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Commuta a l'aplicació 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Commuta a l'aplicació 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Commuta a l'aplicació 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Quin tipus de teclat s'ha d'utilitzar" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "El tipus de teclat que s'utilitzarà." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limita el canviador a l'espai de treball actual." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Si és «true» (cert), només les aplicacions que tinguin finestres en l'espai " +"de treball actual es mostren en el canviador. En cas contrari es mostren " +"totes les aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "El mode d'icona de les aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configureu com es mostren les finestres en l'intercanviador. Els valors " +"possibles són: «thumbnail-only» (mostra una miniatura de la finestra), «app-" +"icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Si és «true» (cert), només les finestres de l'espai de treball actual es " +"mostren en el canviador. En cas contrari, es mostren totes les finestres." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Adjunta el diàleg modal a la finestra pare" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau «org.gnome." +"mutter»." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"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:259 +msgid "Workspaces are managed dynamically" +msgstr "Els espais de treball es gestionen dinàmicament" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Només en el monitor principal hi ha espais de treball" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Retarda el canvi del focus, quan s'està en mode ratolí, fins que el punter " +"no estigui quiet" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Inici de sessió de xarxa" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:121 +msgid "Something’s gone wrong" +msgstr "Alguna cosa ha anat malament" + +#: js/extensionPrefs/main.js:128 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Hi ha un problema: no es poden mostrar els paràmetres per a aquesta extensió. " +"Us recomanem que informeu del problema als autors de l'extensió." + +#: js/extensionPrefs/main.js:135 +msgid "Technical Details" +msgstr "Detalls tècnics" + +#: js/extensionPrefs/main.js:170 +msgid "Copy Error" +msgstr "Copia l'error" + +#: js/extensionPrefs/main.js:190 +msgid "Homepage" +msgstr "Pàgina d'inici" + +#: js/extensionPrefs/main.js:191 +msgid "Visit extension homepage" +msgstr "Visiteu la pàgina d'inici de l'extensió" + +#: js/extensionPrefs/main.js:454 +msgid "No Extensions Installed" +msgstr "No hi ha cap extensió instal·lada" + +#: js/extensionPrefs/main.js:464 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Les extensions es poden instal·lar amb el Programari o a extensions.gnome.org." + +#: js/extensionPrefs/main.js:479 +msgid "Browse in Software" +msgstr "Navega al Programari" + +#: js/gdm/authPrompt.js:144 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:437 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:330 js/ui/status/network.js:894 +msgid "Cancel" +msgstr "Cancel·la" + +#: js/gdm/authPrompt.js:163 js/gdm/authPrompt.js:206 js/gdm/authPrompt.js:438 +msgid "Next" +msgstr "Següent" + +#: js/gdm/authPrompt.js:202 js/ui/shellMountOperation.js:334 +#: js/ui/unlockDialog.js:55 +msgid "Unlock" +msgstr "Desbloqueja" + +#: js/gdm/authPrompt.js:204 +msgctxt "button" +msgid "Sign In" +msgstr "Entra" + +#: js/gdm/loginDialog.js:311 +msgid "Choose Session" +msgstr "Trieu la sessió" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:455 +msgid "Not listed?" +msgstr "No esteu llistat?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:889 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(p. ex. l'usuari o %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:894 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Nom d'usuari:" + +#: js/gdm/loginDialog.js:1232 +msgid "Login Window" +msgstr "Finestra d'entrada" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "Error d'autenticació" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(o passeu el dit)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "Apaga" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +msgid "power off;shutdown;reboot;restart" +msgstr "apaga;atura;reinicia" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:101 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Bloqueja la pantalla" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:104 +msgid "lock screen" +msgstr "bloca la pantalla" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "Surt" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "desconnecta;sortida" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "Atura temporalment" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "atura temporalment;dorm" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +msgid "Switch User" +msgstr "Canvia d'usuari" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:125 +msgid "switch user" +msgstr "canvia d'usuari" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +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:132 +msgid "lock orientation;screen;rotation" +msgstr "bloqueja l'orientació;pantalla;rotació" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "No s'ha trobat l'ordre" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "No s'ha pogut analitzar l'ordre:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "No s'ha pogut executar «%s»:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Ara mateix" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "fa %d minut" +msgstr[1] "fa %d minuts" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "fa %d hora" +msgstr[1] "fa %d hores" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Ahir" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "fa %d dia" +msgstr[1] "fa %d dies" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "fa %d setmana" +msgstr[1] "fa %d setmanes" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "fa %d mes" +msgstr[1] "fa %d mesos" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "fa %d any" +msgstr[1] "fa %d anys" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%-H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ahir, a les %-H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A a les %-H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, a les %-H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B de %Y, a les %-H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ahir, a les %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, a les %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, a les %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B de %Y, a les %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "Inici de sessió al punt d'accés Wi-Fi" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"La connexió a aquest punt d'accés no és segura. Contrasenyes o altra " +"informació que introduïu en aquesta pàgina pot ser vista per persones " +"properes." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "Denega l'accés" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "Permet l'accés" + +#: js/ui/appDisplay.js:671 +msgid "Frequently used applications will appear here" +msgstr "Les aplicacions utilitzades freqüentment apareixeran aquí" + +#: js/ui/appDisplay.js:786 +msgid "Frequent" +msgstr "Freqüent" + +#: js/ui/appDisplay.js:793 +msgid "All" +msgstr "Totes" + +#: js/ui/appDisplay.js:1748 +msgid "New Window" +msgstr "Finestra nova" + +#: js/ui/appDisplay.js:1762 +msgid "Launch using Dedicated Graphics Card" +msgstr "Inicia usant una targeta gràfica dedicada" + +#: js/ui/appDisplay.js:1789 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "Suprimeix dels preferits" + +#: js/ui/appDisplay.js:1795 +msgid "Add to Favorites" +msgstr "Afegeix als preferits" + +#: js/ui/appDisplay.js:1805 +msgid "Show Details" +msgstr "Mostra els detalls" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "S'ha afegit %s als preferits." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "S'ha suprimit %s dels preferits." + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "Seleccioneu dispositiu d'àudio" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "Paràmetres del so" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "Auriculars" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "Auriculars amb micròfon" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "Micròfon" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "Canvia el fons de l'escriptori…" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Paràmetres de la pantalla" + +#: js/ui/backgroundMenu.js:18 +msgid "Settings" +msgstr "Paràmetres" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:42 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:71 +msgctxt "grid sunday" +msgid "S" +msgstr "Dg" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:73 +msgctxt "grid monday" +msgid "M" +msgstr "Dl" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:75 +msgctxt "grid tuesday" +msgid "T" +msgstr "Dt" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:77 +msgctxt "grid wednesday" +msgid "W" +msgstr "Dc" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:79 +msgctxt "grid thursday" +msgid "T" +msgstr "Dj" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:81 +msgctxt "grid friday" +msgid "F" +msgstr "Dv" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:83 +msgctxt "grid saturday" +msgid "S" +msgstr "Ds" + +#. * +#. * 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:346 +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:356 +msgid "%OB %Y" +msgstr "%OB de %Y" + +#: js/ui/calendar.js:413 +msgid "Previous month" +msgstr "Mes anterior" + +#: js/ui/calendar.js:424 +msgid "Next month" +msgstr "Mes següent" + +#: js/ui/calendar.js:578 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:633 +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:701 +msgctxt "event list time" +msgid "All Day" +msgstr "Tot el dia" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A %-d %B" + +#: js/ui/calendar.js:837 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A %d %B de %Y" + +#: js/ui/calendar.js:1060 +msgid "No Notifications" +msgstr "Cap notificació" + +#: js/ui/calendar.js:1063 +msgid "No Events" +msgstr "Cap cita" + +#: js/ui/calendar.js:1089 +msgid "Clear" +msgstr "Neteja-ho" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» no està responent." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Podeu esperar un moment perquè continuï o podeu forçar-ne la sortida " +"completa." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Força la sortida" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Espera" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "S'ha connectat un dispositiu extern" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "S'ha desconnectat un dispositiu extern" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "Obre amb %s" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "Contrasenya:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "Torneu a escriure-la:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "També us podeu connectar prement el botó «WPS» del vostre encaminador." + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:225 +#: js/ui/status/network.js:315 js/ui/status/network.js:897 +msgid "Connect" +msgstr "Connecta" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Contrasenya:" + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "Clau:" + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Contrasenya de la clau privada:" + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Identitat:" + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Servei:" + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "La xarxa sense fil requereix autenticació" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus " +"d'encriptació." + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "Autenticació 802.1X amb fil" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Nom de la xarxa: " + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "Autenticació DSL" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "Cal que introduïu el codi PIN" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +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" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "Contrasenya de la xarxa de banda ampla mòbil" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, 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:682 js/ui/status/network.js:1671 +msgid "Network Manager" +msgstr "Gestor de connexions de xarxa" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "Cal autenticació" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "Administrador" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "Autentica" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:314 +msgid "Sorry, that didn’t work. Please try again." +msgstr "No ha funcionat. Torneu-ho a provar." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:785 +#, javascript-format +msgid "%s is now known as %s" +msgstr "En/na %s ara es diu %s" + +#: js/ui/ctrlAltTab.js:25 js/ui/viewSelector.js:176 +msgid "Windows" +msgstr "Finestres" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +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:397 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:74 +msgid "%B %-d %Y" +msgstr "%-d %B de %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A, %-e %B de %Y" + +#: js/ui/dateMenu.js:143 +msgid "Add world clocks…" +msgstr "Afegeix rellotges del món…" + +#: js/ui/dateMenu.js:144 +msgid "World Clocks" +msgstr "Rellotges del món" + +#: js/ui/dateMenu.js:234 +msgid "Weather" +msgstr "El temps" + +#: js/ui/dateMenu.js:317 +msgid "Select a location…" +msgstr "Trieu una ubicació…" + +#: js/ui/dateMenu.js:325 +msgid "Loading…" +msgstr "S'està carregant…" + +#: js/ui/dateMenu.js:335 +msgid "Go online for weather information" +msgstr "Vés en línia per a informació sobre el temps" + +#: js/ui/dateMenu.js:337 +msgid "Weather information is currently unavailable" +msgstr "La informació sobre el temps no està disponible" + +#: js/ui/endSessionDialog.js:49 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Sortida %s" + +#: js/ui/endSessionDialog.js:50 +msgctxt "title" +msgid "Log Out" +msgstr "Sortida" + +#: js/ui/endSessionDialog.js:52 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s sortirà de la sessió automàticament d'aquí %d segon." +msgstr[1] "%s sortirà de la sessió automàticament d'aquí %d segons." + +#: js/ui/endSessionDialog.js:57 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Sortireu automàticament d'aquí %d segon." +msgstr[1] "Sortireu automàticament d'aquí %d segons." + +#: js/ui/endSessionDialog.js:63 +msgctxt "button" +msgid "Log Out" +msgstr "Surt" + +#: js/ui/endSessionDialog.js:69 +msgctxt "title" +msgid "Power Off" +msgstr "Apagada" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instal·la les actualitzacions i apaga" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "S'apagarà l'ordinador automàticament d'aquí %d segon." +msgstr[1] "S'apagarà l'ordinador automàticament d'aquí %d segons." + +#: js/ui/endSessionDialog.js:76 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instal·la les actualitzacions pendents" + +#: js/ui/endSessionDialog.js:79 js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Restart" +msgstr "Reinicia" + +#: js/ui/endSessionDialog.js:81 +msgctxt "button" +msgid "Power Off" +msgstr "Apaga" + +#: js/ui/endSessionDialog.js:88 +msgctxt "title" +msgid "Restart" +msgstr "Reinici" + +#: js/ui/endSessionDialog.js:90 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Es reiniciarà l'ordinador automàticament d'aquí %d segon." +msgstr[1] "Es reiniciarà l'ordinador automàticament d'aquí %d segons." + +#: js/ui/endSessionDialog.js:104 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reinicia i instal·la les actualitzacions" + +#: js/ui/endSessionDialog.js:106 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Es reiniciarà l'ordinador automàticament i s'instal·laran les " +"actualitzacions d'aquí %d segon." +msgstr[1] "" +"Es reiniciarà l'ordinador automàticament i s'instal·laran les " +"actualitzacions d'aquí %d segons." + +#: js/ui/endSessionDialog.js:112 js/ui/endSessionDialog.js:132 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reinicia i instal·la" + +#: js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instal·la i apaga" + +#: js/ui/endSessionDialog.js:114 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Apaga després d'instal·lar les actualitzacions" + +#: js/ui/endSessionDialog.js:122 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reinicia i instal·la l'actualització" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:127 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s s'instal·larà després del reinici. Una actualització de la " +"instal·lació pot trigar força temps. Assegureu-vos que heu fet còpia de " +"seguretat i que l'ordinador està connectat al corrent." + +#: js/ui/endSessionDialog.js:316 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"S'està utilitzant la bateria: connecteu l'ordinador a la xarxa elèctrica " +"abans d'instal·lar les actualitzacions." + +#: js/ui/endSessionDialog.js:333 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Hi ha algunes aplicacions que estan ocupades o que tenen documents sense " +"desar." + +#: js/ui/endSessionDialog.js:340 +msgid "Other users are logged in." +msgstr "Altres usuaris tenen la sessió oberta." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:621 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remot)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:624 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consola)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "Instal·la" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Voleu baixar i instal·lar «%s» d'extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vol inhabilitar les dreceres" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "L'aplicació vol inhabilitar les dreceres" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Podeu restaurar les dreceres si premeu %s." + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "Denega" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "Permet" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "Tecles lentes actives" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "Tecles lentes inactives" + +#: js/ui/kbdA11yDialog.js:34 +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:41 +msgid "Sticky Keys Turned On" +msgstr "Tecles enganxoses actives" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "Tecles enganxoses inactives" + +#: js/ui/kbdA11yDialog.js:44 +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:46 +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:58 +msgid "Leave On" +msgstr "Deixa-ho actiu" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1270 +msgid "Turn On" +msgstr "Activa" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:134 js/ui/status/network.js:316 +#: js/ui/status/network.js:1270 js/ui/status/network.js:1382 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Desactiva" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "Deixa-ho desactivat" + +#: js/ui/keyboard.js:209 +msgid "Region & Language Settings" +msgstr "Configuració de regió i idioma" + +#: js/ui/lookingGlass.js:627 +msgid "No extensions installed" +msgstr "No hi ha cap extensió instal·lada" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:681 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s no ha emès cap error." + +#: js/ui/lookingGlass.js:687 +msgid "Hide Errors" +msgstr "Amaga els errors" + +#: js/ui/lookingGlass.js:691 js/ui/lookingGlass.js:751 +msgid "Show Errors" +msgstr "Mostra els errors" + +#: js/ui/lookingGlass.js:700 +msgid "Enabled" +msgstr "Habilitat" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:703 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Inhabilitat" + +#: js/ui/lookingGlass.js:705 +msgid "Error" +msgstr "Error" + +#: js/ui/lookingGlass.js:707 +msgid "Out of date" +msgstr "Fora d'hora" + +#: js/ui/lookingGlass.js:709 +msgid "Downloading" +msgstr "S'està baixant" + +#: js/ui/lookingGlass.js:733 +msgid "View Source" +msgstr "Mostra el codi font" + +#: js/ui/lookingGlass.js:742 +msgid "Web Page" +msgstr "Pàgina web" + +#: js/ui/messageTray.js:1483 +msgid "System Information" +msgstr "Informació de l'ordinador" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "Artista desconegut" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "Títol desconegut" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "Volum" + +#: js/ui/overview.js:78 +msgid "Undo" +msgstr "Desfés" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:105 +msgid "Overview" +msgstr "Vista general" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:231 +msgid "Type to search…" +msgstr "Teclegeu per cercar…" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "Drecera de teclat nova…" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "Definit per l'aplicació" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "Mostra l'ajuda en pantalla" + +#: js/ui/padOsd.js:153 +msgid "Switch monitor" +msgstr "Commuta el monitor " + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "Assigna la pulsació de tecla" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "Fet" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "Edita…" + +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "Cap" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "Premeu un botó per a configurar" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "Premeu Esc per sortir" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "Premeu qualsevol tecla per sortir" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Surt" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:410 +msgid "Activities" +msgstr "Activitats" + +#: js/ui/panel.js:685 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:806 +msgid "Top Bar" +msgstr "Barra superior" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Introduïu una ordre" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:169 +msgid "Close" +msgstr "Tanca" + +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "El reinici no està disponible en Wayland" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "S'està reiniciant…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A %-d %B" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d missatge nou" +msgstr[1] "%d missatges nous" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notificació nova" +msgstr[1] "%d notificacions noves" + +#: js/ui/screenShield.js:458 js/ui/status/system.js:291 +msgid "Lock" +msgstr "Bloqueja" + +#: js/ui/screenShield.js:722 +msgid "GNOME needs to lock the screen" +msgstr "El GNOME necessita bloquejar la pantalla" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:843 js/ui/screenShield.js:1316 +msgid "Unable to lock" +msgstr "No es pot blocar" + +#: js/ui/screenShield.js:844 js/ui/screenShield.js:1317 +msgid "Lock was blocked by an application" +msgstr "Una aplicació està bloquejant el bloqueig" + +#: js/ui/search.js:644 +msgid "Searching…" +msgstr "S'està cercant…" + +#: js/ui/search.js:646 +msgid "No results." +msgstr "No s'ha trobat cap resultat." + +#: js/ui/search.js:770 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d més" +msgstr[1] "%d més" + +#: js/ui/shellEntry.js:21 +msgid "Copy" +msgstr "Copia" + +#: js/ui/shellEntry.js:26 +msgid "Paste" +msgstr "Enganxa" + +#: js/ui/shellEntry.js:92 +msgid "Show Text" +msgstr "Mostra el text" + +#: js/ui/shellEntry.js:94 +msgid "Hide Text" +msgstr "Oculta el text" + +#: js/ui/shellMountOperation.js:301 +msgid "Password" +msgstr "Contrasenya" + +#: js/ui/shellMountOperation.js:322 +msgid "Remember Password" +msgstr "Recorda la contrasenya" + +#: js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Accessibilitat" + +#: js/ui/status/accessibility.js:54 +msgid "Zoom" +msgstr "Amplia" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Reader" +msgstr "Lector de pantalla" + +#: js/ui/status/accessibility.js:65 +msgid "Screen Keyboard" +msgstr "Teclat en pantalla" + +#: js/ui/status/accessibility.js:69 +msgid "Visual Alerts" +msgstr "Avisos visuals" + +#: js/ui/status/accessibility.js:72 +msgid "Sticky Keys" +msgstr "Tecles enganxoses" + +#: js/ui/status/accessibility.js:75 +msgid "Slow Keys" +msgstr "Tecles lentes" + +#: js/ui/status/accessibility.js:78 +msgid "Bounce Keys" +msgstr "Tecles de salt" + +#: js/ui/status/accessibility.js:81 +msgid "Mouse Keys" +msgstr "Tecles del ratolí" + +#: js/ui/status/accessibility.js:155 +msgid "High Contrast" +msgstr "Alt contrast" + +#: js/ui/status/accessibility.js:186 +msgid "Large Text" +msgstr "Text gran" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:591 +msgid "Bluetooth Settings" +msgstr "Paràmetres del Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d connectat" +msgstr[1] "%d connectats" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "Desactivat" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "Activat" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "Brillantor" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "Teclat" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "Mostra la disposició del teclat" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "Ubicació habilitada" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "Inhabilita" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "Paràmetres de privacitat" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "Ubicació en ús" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "Ubicació inhabilitada" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "Habilita" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Voleu donar a %s accés a la vostra ubicació?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu " +"des de la configuració de la privacitat." + +#: js/ui/status/network.js:72 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:422 js/ui/status/network.js:1299 +#, 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:425 +#, javascript-format +msgid "%s Connected" +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:430 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s no gestionat" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:433 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s s'està desconnectant" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:440 js/ui/status/network.js:1291 +#, 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:443 +#, 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:451 +#, 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:455 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s no disponible" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:458 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s ha fallat la connexió" + +#: js/ui/status/network.js:470 +msgid "Wired Settings" +msgstr "Paràmetres de la xarxa amb fil" + +#: js/ui/status/network.js:512 +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:559 js/ui/status/network.js:1296 +#, 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:563 +#, javascript-format +msgid "%s Disabled" +msgstr "%s Inhabilitat" + +#: js/ui/status/network.js:603 +msgid "Connect to Internet" +msgstr "Connecta a Internet" + +#: js/ui/status/network.js:792 +msgid "Airplane Mode is On" +msgstr "El mode d'avió és actiu" + +#: js/ui/status/network.js:793 +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:794 +msgid "Turn Off Airplane Mode" +msgstr "Desactiva el mode d'avió" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is Off" +msgstr "La xarxa sense fil està desactivada" + +#: js/ui/status/network.js:804 +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:805 +msgid "Turn On Wi-Fi" +msgstr "Activa la xarxa sense fil" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi Networks" +msgstr "Xarxes sense fil" + +#: js/ui/status/network.js:832 +msgid "Select a network" +msgstr "Trieu una xarxa" + +#: js/ui/status/network.js:861 +msgid "No Networks" +msgstr "Cap xarxa" + +#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Utilitza l'interruptor de maquinari per desactivar-la" + +#: js/ui/status/network.js:1158 +msgid "Select Network" +msgstr "Trieu una xarxa" + +#: js/ui/status/network.js:1164 +msgid "Wi-Fi Settings" +msgstr "Paràmetres de la xarxa sense fil" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1287 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hostpot %s actiu" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s no està connectat" + +#: js/ui/status/network.js:1399 +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:1402 +msgid "authentication required" +msgstr "cal autenticació" + +#: js/ui/status/network.js:1404 +msgid "connection failed" +msgstr "ha fallat la connexió" + +#: js/ui/status/network.js:1454 +msgid "VPN Settings" +msgstr "Paràmetres de la VPN" + +#: js/ui/status/network.js:1471 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1481 +msgid "VPN Off" +msgstr "VPN apagada" + +#: js/ui/status/network.js:1542 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Paràmetres de xarxa" + +#: js/ui/status/network.js:1571 +#, 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:1575 +#, 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:1579 +#, 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:1708 +msgid "Connection failed" +msgstr "Ha fallat la connexió" + +#: js/ui/status/network.js:1709 +msgid "Activation of network connection failed" +msgstr "Ha fallat l'activació de la connexió de xarxa" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Llum nocturna inhabilitada" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Llum nocturna habilitada" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Reprèn" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Inhabilita fins demà" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "Paràmetres d'energia" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "Totalment carregada" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "No s'està carregant" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "S'està estimant la durada…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Queden %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d per completar la càrrega (%d %%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Es comparteix la pantalla" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Desactiva" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "El mode d'avió és actiu" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "Canvia d'usuari" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "Surt" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "Paràmetres del compte" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "Bloqueja l'orientació" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "Atura temporalment" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "Apaga" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "Dispostiu Thunderbolt desconegut" + +#: js/ui/status/thunderbolt.js:326 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"El nou dispositiu s'ha detectat mentre estàveu absents. Desconnecteu i " +"torneu a connectar el dispositiu per a començar a utilitzar-lo." + +#: js/ui/status/thunderbolt.js:329 +msgid "Unauthorized Thunderbolt device" +msgstr "Dispostiu Thunderbolt no autoritzat" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"S'ha detectat un dispositiu nou i cal que sigui autoritzat per " +"l'administrador." + +#: js/ui/status/thunderbolt.js:336 +msgid "Thunderbolt authorization error" +msgstr "S'ha produït un error d'autorització a Thunderbolt" + +#: js/ui/status/thunderbolt.js:337 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "No s'ha pogut autoritzar el dispositiu Thunderbolt: %s" + +#: js/ui/status/volume.js:136 +msgid "Volume changed" +msgstr "S'ha canviat el volum" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "Mirall" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "Uneix pantalles" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "Només extern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "Només l'integrat" + +#: js/ui/unlockDialog.js:63 +msgid "Log in as another user" +msgstr "Entra amb un altre usuari" + +#: js/ui/unlockDialog.js:80 +msgid "Unlock Window" +msgstr "Desbloqueja la finestra" + +#: js/ui/viewSelector.js:180 +msgid "Applications" +msgstr "Aplicacions" + +#: js/ui/viewSelector.js:184 +msgid "Search" +msgstr "Cerca" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» ja està a punt" + +#: js/ui/windowManager.js:60 +msgid "Do you want to keep these display settings?" +msgstr "Voleu mantenir aquesta configuració de la pantalla?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:72 +msgid "Revert Settings" +msgstr "Descarta els canvis" + +#: js/ui/windowManager.js:75 +msgid "Keep Changes" +msgstr "Mantén els canvis" + +#: js/ui/windowManager.js:93 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Es descartaran els canvis d'aquí %d segon" +msgstr[1] "Es descartaran els canvis d'aquí %d segons" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:669 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:29 +msgid "Minimize" +msgstr "Minimitza" + +#: js/ui/windowMenu.js:36 +msgid "Unmaximize" +msgstr "Desmaximitza" + +#: js/ui/windowMenu.js:40 +msgid "Maximize" +msgstr "Maximitza" + +#: js/ui/windowMenu.js:47 +msgid "Move" +msgstr "Mou" + +#: js/ui/windowMenu.js:53 +msgid "Resize" +msgstr "Reajusta" + +#: js/ui/windowMenu.js:60 +msgid "Move Titlebar Onscreen" +msgstr "Mou la barra de títol a la pantalla" + +#: js/ui/windowMenu.js:65 +msgid "Always on Top" +msgstr "Sempre per damunt" + +#: js/ui/windowMenu.js:84 +msgid "Always on Visible Workspace" +msgstr "Sempre a l'espai de treball visible" + +#: js/ui/windowMenu.js:98 +msgid "Move to Workspace Left" +msgstr "Mou a l'espai de treball esquerre" + +#: js/ui/windowMenu.js:104 +msgid "Move to Workspace Right" +msgstr "Mou a l'espai de treball dret" + +#: js/ui/windowMenu.js:110 +msgid "Move to Workspace Up" +msgstr "Mou a l'espai de treball superior" + +#: js/ui/windowMenu.js:116 +msgid "Move to Workspace Down" +msgstr "Mou a l'espai de treball inferior" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Mou a la pantalla de dalt" + +#: js/ui/windowMenu.js:143 +msgid "Move to Monitor Down" +msgstr "Mou a la pantalla de baix" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Left" +msgstr "Mou a la pantalla de l'esquerra" + +#: js/ui/windowMenu.js:161 +msgid "Move to Monitor Right" +msgstr "Mou a la pantalla de la dreta" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendari de l'Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Mostra la versió" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "El mode que utilitzarà el GDM per a la pantalla d'entrada" + +#: src/main.c:420 +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:426 +msgid "List possible modes" +msgstr "Llista els modes possibles" + +#: src/shell-app.c:266 +msgctxt "program" +msgid "Unknown" +msgstr "Desconegut" + +#: src/shell-app.c:517 +#, c-format +msgid "Failed to launch “%s”" +msgstr "No s'ha pogut iniciar «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Les contrasenyes no coincideixen." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "La contrasenya no pot ser buida" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "L'usuari ha descartat el diàleg d'autenticació" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u sortida" +msgstr[1] "%u sortides" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entrades" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sons del sistema" + +#~ msgid "%s all day." +#~ msgstr "%s tot el dia." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, llavors %s més tard." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, llavors %s, seguit per %s més tard." + +#~ msgid "Feels like %s." +#~ msgstr "Sensació tèrmica de %s." + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:" + +#~ 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" + +#~ msgid "Status Icons" +#~ msgstr "Icones d'estat" + +#~ msgid "Events" +#~ msgstr "Cites" + +#~ msgid "Notifications" +#~ msgstr "Notificacions" + +#~ msgid "Clear section" +#~ msgstr "Neteja la secció" + +#~ msgid "Media" +#~ msgstr "Multimèdia" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Redirecció per l'autenticació web" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Not In Use" +#~ msgstr "No s'usa" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferències de les extensions del GNOME Shell" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Mostra el número de la setmana al calendari" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Si és «true» (cert) es mostra el número de la setmana al calendari." + +#~ msgid "Use as Internet connection" +#~ msgstr "Utilitza com a connexió a Internet" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s està demanant accés a la vostra ubicació." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (composició mitjançant Wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d dispositiu connectat" +#~ msgstr[1] "%d dispositius connectats" + +#~ msgid "Authentication required" +#~ msgstr "Cal autenticació" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Bateria" + +#~ msgid "Airplane Mode" +#~ msgstr "Mode d'avió" + +#~ msgid "Show the message tray" +#~ msgstr "Mostra la safata de missatges" + +#~ msgid "Captive Portal" +#~ msgstr "Portal captiu" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Dg." + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Dl." + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Dt." + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Dc." + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Dj." + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Dv." + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Ds." + +#~ msgid "Nothing Scheduled" +#~ msgstr "No hi ha res apuntat" + +#~ msgid "Today" +#~ msgstr "Avui" + +#~ msgid "Tomorrow" +#~ msgstr "Demà" + +#~ msgid "This week" +#~ msgstr "Aquesta setmana" + +#~ msgid "Next week" +#~ msgstr "La setmana que ve" + +#~ msgid "Removable Devices" +#~ msgstr "Dispositius extraïbles" + +#~ msgid "Eject" +#~ msgstr "Expulsa" + +#~ msgid "Invitation" +#~ msgstr "Invitació" + +#~ msgid "Call" +#~ msgstr "Trucada" + +#~ msgid "File Transfer" +#~ msgstr "Transferència de fitxers" + +#~ msgid "Chat" +#~ msgstr "Xat" + +#~ msgid "Unmute" +#~ msgstr "Amb so" + +#~ msgid "Mute" +#~ msgstr "Silencia" + +#~ msgid "Invitation to %s" +#~ msgstr "Us han convidat a entrar a %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "En/na %s us convida a entrar a %s" + +#~ msgid "Decline" +#~ msgstr "Declina" + +#~ msgid "Accept" +#~ msgstr "Accepta" + +#~ msgid "Video call from %s" +#~ msgstr "Videotrucada de %s" + +#~ msgid "Call from %s" +#~ msgstr "Trucada de %s" + +#~ msgid "Answer" +#~ msgstr "Contesta" + +#~ msgid "%s is sending you %s" +#~ msgstr "En/na %s us envia %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s vol poder saber quan esteu en línia" + +#~ msgid "Authentication failed" +#~ msgstr "Ha fallat l'autenticació" + +#~ msgid "Encryption error" +#~ msgstr "Error d'encriptació" + +#~ msgid "Certificate not provided" +#~ msgstr "No s'ha proporcionat el certificat" + +#~ msgid "Certificate untrusted" +#~ msgstr "El certificat no és de confiança" + +#~ msgid "Certificate expired" +#~ msgstr "El certificat ha vençut" + +#~ msgid "Certificate not activated" +#~ msgstr "El certificat no està activat" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "No coincideix el nom de la màquina del certificat" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "No coincideix l'empremta digital del certificat" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificat signat per un mateix" + +#~ msgid "Status is set to offline" +#~ msgstr "S'ha establert l'estat a fora de línia" + +#~ msgid "Certificate is invalid" +#~ msgstr "El certificat no és vàlid" + +#~ msgid "Connection has been refused" +#~ msgstr "S'ha rebutjat la connexió" + +#~ msgid "Connection can't be established" +#~ msgstr "No es pot establir la connexió" + +#~ msgid "Connection has been lost" +#~ msgstr "S'ha perdut la connexió" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Aquest compte ja està connectat al servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "S'ha reemplaçat la connexió per una altra de nova fent servir el mateix " +#~ "recurs" + +#~ msgid "The account already exists on the server" +#~ msgstr "Ja existeix aquest compte al servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "El servidor està massa ocupat per gestionar la connexió" + +#~ msgid "Certificate has been revoked" +#~ msgstr "S'ha revocat el certificat" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "El certificat utilitza un algorisme criptogràfic no segur o la seva " +#~ "fortalesa criptogràfica és feble" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "La llargada del certificat del servidor o la profunditat de la cadena de " +#~ "certificació excedeix els límits de la biblioteca criptogràfica" + +#~ msgid "Internal error" +#~ msgstr "S'ha produït un error intern" + +#~ msgid "Unable to connect to %s" +#~ msgstr "No es pot connectar a %s" + +#~ msgid "View account" +#~ msgstr "Mostra el compte" + +#~ msgid "Open Calendar" +#~ msgstr "Obre el calendari" + +#~ msgid "Open" +#~ msgstr "Obre" + +#~ msgid "Remove" +#~ msgstr "Suprimeix" + +#~ msgid "Clear Messages" +#~ msgstr "Neteja els missatges" + +#~ msgid "Notification Settings" +#~ msgstr "Configuració de les notificacions" + +#~ msgid "Tray Menu" +#~ msgstr "Menú de la safata" + +#~ msgid "No Messages" +#~ msgstr "No hi ha cap missatge" + +#~ msgid "Message Tray" +#~ msgstr "Safata de missatges" diff --git a/po/ca@valencia.po b/po/ca@valencia.po new file mode 100644 index 0000000..20e7dee --- /dev/null +++ b/po/ca@valencia.po @@ -0,0 +1,2395 @@ +# Catalan gnome-shell translation. +# Copyright (C) 2009 Siegfried-Angel Gevatter Pujals +# This file is distributed under the same license as the gnome-shell package. +# Siegfried-Angel Gevatter Pujals , 2009. +# Jordi Serratosa , 2012, 2017. +# Gil Forcada , 2010, 2011, 2013, 2014, 2016. +# Jordi Mas i Hernàndez , 2017 +# +msgid "" +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-09-10 06:17+0000\n" +"PO-Revision-Date: 2017-08-23 09:48+0200\n" +"Last-Translator: Xavi Ivars \n" +"Language-Team: Catalan \n" +"Language: ca-valencia\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" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Mostra la llista de notificacions" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Posa el focus en la notificació activa" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Mostra la vista general" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Mostra totes les aplicacions" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Obri el menú d'aplicació" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "Extensions del Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configureu les extensions del GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gestor de finestres i llançador d'aplicacions" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Habilita les eines internes en el diàleg de l'Alt+F2 que són útils per als " +"desenvolupadors i provadors" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permet l'accés a les eines de depuració i de seguiment internes a través del " +"diàleg de l'Alt+F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "" +"Identificadors universals únics de les extensions que s'han d'habilitar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Les extensions del GNOME Shell tenen un identificador universal. Esta " +"clau conté una llista de les extensions que s'han de carregar. Qualsevol " +"extensió que s'haja de carregar ha de ser a la llista. Podeu modificar " +"esta llista amb els mètodes de D-Bus «EnableExtension» (activa una " +"extensió) i «DisableExtension» (desactiva una extensió) a org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Inhabilita les extensions d'usuari" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Inhabilita totes les extensions que l'usuari ha habilitat sense afectar el " +"paràmetre «enabled-extension»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Desactiva la validació de la compatibilitat de versió d'extensions" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"El GNOME Shell només carregarà extensions que afirmin ser compatibles amb la " +"versió en execució. Si s'activa esta opció, es desactivarà la comprovació " +"i es provarà de carregar totes les extensions sense tindre en compte les " +"versions amb què afirmin ser compatibles." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Llista d'identificadors de fitxers d'escriptori de les aplicacions preferides" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Es mostraran, a l'àrea de preferits, les aplicacions que corresponguin a " +"estos identificadors." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Vista del seleccionador d'aplicacions" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Índex de la vista seleccionada actualment en el seleccionador d'aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historial de les ordes utilitzades en el diàleg de l'Alt+F2" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historial del depurador del GNOME Shell" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Mostra sempre l'element de menú «Ix» al menú d'usuari." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Esta clau sobreescriu l'ocultació automàtica de l'element de menú «Ix» " +"quan només hi ha un usuari i un sol tipus de sessió." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Si s'han de recordar les contrasenyes dels punts de muntatge encriptats o " +"els sistemes de fitxers remots" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"El GNOME Shell vos demanarà la contrasenya quan es munti un dispositiu " +"encriptat o un sistema de fitxers remot. Si es pot guardar la contrasenya per " +"utilitzar-lo en el futur, es mostrarà la casella de verificació «Recorda la " +"contrasenya». Esta clau estableix el valor per defecte d'esta casella " +"de verificació." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Si l'adaptador de Bluetooth predeterminat té dispositius configurats " +"associats" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +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 " +"té dispositius associats." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Vinculació per obrir el menú d'aplicació" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "La vinculació per obrir el menú d'aplicació." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Vinculació de tecles per obrir la vista «Mostra les aplicacions»" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Vinculació de tecles per obrir la vista «Mostra les aplicacions» de les " +"activitats de la vista general." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Vinculació per obrir la vista general" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Vinculació per obrir la vista general d'activitats." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"La vinculació per commutar la visibilitat de la llista de notificacions" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"La vinculació per commutar la visibilitat de la llista de notificacions." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Vinculació per posar el focus a la notificació activa" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Vinculació per posar el focus a la notificació activa." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Vinculació que fa una pausa i continua tots els «tweens» en execució, per " +"motius de depuració" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Quin tipus de teclat s'ha d'utilitzar" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "El tipus de teclat que s'utilitzarà." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Limita el canviador a l'espai de treball actual." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Si és «true» (cert), només les aplicacions que tinguen finestres en l'espai " +"de treball actual es mostren en el canviador. En cas contrari es mostren " +"totes les aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "El mode d'icona de les aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configureu com es mostren les finestres en l'intercanviador. Els valors " +"possibles són: «thumbnail-only» (mostra una miniatura de la finestra), «app-" +"icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Si és «true» (cert), només les finestres de l'espai de treball actual es " +"mostren en el canviador. En cas contrari, es mostren totes les finestres." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Adjunta el diàleg modal a la finestra pare" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Si s'executa el GNOME Shell, esta clau sobreescriu la clau «org.gnome." +"mutter»." + +#: 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" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Els espais de treball es gestionen dinàmicament" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Només en el monitor principal hi ha espais de treball" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Retarda el canvi del focus, quan s'està en mode ratolí, fins que el punter " +"no estiga quiet" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Inici de sessió de xarxa" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:" + +#: js/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 +msgid "Cancel" +msgstr "Cancel·la" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "Següent" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Desbloqueja" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "Entra" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "Trieu la sessió" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "No esteu llistat?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(p. ex. l'usuari o %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Nom d'usuari:" + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "Finestra d'entrada" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "Error d'autenticació" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +msgid "(or swipe finger)" +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" +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" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +msgctxt "search-result" +msgid "Lock screen" +msgstr "Bloqueja la pantalla" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +msgid "lock screen" +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" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "desconnecta;eixida" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +msgctxt "search-result" +msgid "Suspend" +msgstr "Atura temporalment" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +msgid "suspend;sleep" +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" +msgstr "Canvia d'usuari" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:130 +msgid "switch user" +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" +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ó" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "No s'ha trobat l'orde" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "No s'ha pogut analitzar l'orde:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "No s'ha pogut executar «%s»:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Ara mateix" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "fa %d minut" +msgstr[1] "fa %d minuts" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "fa %d hora" +msgstr[1] "fa %d hores" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Ahir" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "fa %d dia" +msgstr[1] "fa %d dies" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "fa %d setmana" +msgstr[1] "fa %d setmanes" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "fa %d mes" +msgstr[1] "fa %d mesos" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "fa %d any" +msgstr[1] "fa %d anys" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ahir, a les %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A a les %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr " %d de %B, a les %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d de %B de %Y, a les %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ahir, a les %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, a les %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d de %B, a les %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d de %B de %Y, a les %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "Inici de sessió al punt d'accés Wi-Fi" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"La connexió a este punt d'accés no és segura. Contrasenyes o altra " +"informació que introduïu en esta pàgina pot ser vista per persones " +"properes." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "Denega l'accés" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "Permet l'accés" + +#: js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "Les aplicacions utilitzades freqüentment apareixeran ací" + +#: js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "Freqüent" + +#: js/ui/appDisplay.js:937 +msgid "All" +msgstr "Totes" + +#: js/ui/appDisplay.js:1915 +msgid "New Window" +msgstr "Finestra nova" + +#: js/ui/appDisplay.js:1929 +msgid "Launch using Dedicated Graphics Card" +msgstr "Inicia usant una targeta gràfica dedicada" + +#: js/ui/appDisplay.js:1956 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Suprimeix dels preferits" + +#: js/ui/appDisplay.js:1962 +msgid "Add to Favorites" +msgstr "Afig als preferits" + +#: js/ui/appDisplay.js:1972 +msgid "Show Details" +msgstr "Mostra els detalls" + +#: 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:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "S'ha suprimit %s dels preferits." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Seleccioneu dispositiu d'àudio" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Paràmetres del so" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Auriculars" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Auriculars amb micròfon" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Micròfon" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Canvia el fons de l'escriptori…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Paràmetres de la pantalla" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:265 +msgid "Settings" +msgstr "Paràmetres" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "Dg" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "Dl" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "Dt" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "Dc" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "Dj" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "Dv" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "Ds" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "Mes anterior" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr "Mes següent" + +#: js/ui/calendar.js:605 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:660 +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 +msgctxt "event list time" +msgid "All Day" +msgstr "Tot el dia" + +#: js/ui/calendar.js:862 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A %d de %B" + +#: js/ui/calendar.js:866 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A %d de %B de %Y" + +#: js/ui/calendar.js:1086 +msgid "No Notifications" +msgstr "Cap notificació" + +#: js/ui/calendar.js:1089 +msgid "No Events" +msgstr "Cap cita" + +#: js/ui/calendar.js:1117 +msgid "Clear All" +msgstr "Neteja-ho tot" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» no està responent." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Podeu esperar un moment perquè continue o podeu forçar-ne l'eixida " +"completa." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Força l'eixida" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Espera" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "S'ha connectat un dispositiu extern" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "S'ha desconnectat un dispositiu extern" + +#: js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "Obri amb %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "Contrasenya:" + +#: js/ui/components/keyring.js:140 +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 +msgid "Connect" +msgstr "Connecta" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Contrasenya:" + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Clau:" + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Identitat:" + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Contrasenya de la clau privada:" + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Servei:" + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638 +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 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus " +"d'encriptació." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "Autenticació 802.1X amb fil" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Nom de la xarxa: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "Autenticació DSL" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "Cal que introduïu el codi PIN" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653 +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" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659 +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 +#, 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 +msgid "Network Manager" +msgstr "Gestor de connexions de xarxa" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "Cal autenticació" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "Administrador" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "Autentica" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "No ha funcionat. Torneu-ho a provar." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "En/na %s ara es diu %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Finestres" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +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 +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 +msgid "%B %e %Y" +msgstr "%e de %B de %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:82 +msgid "%A %B %e %Y" +msgstr "%A, %e de %B de %Y" + +#: js/ui/dateMenu.js:144 +msgid "Add world clocks…" +msgstr "Afig rellotges del món…" + +#: js/ui/dateMenu.js:145 +msgid "World Clocks" +msgstr "Rellotges del món" + +#: js/ui/dateMenu.js:224 +msgid "Weather" +msgstr "El temps" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:286 +#, javascript-format +msgid "%s all day." +msgstr "%s tot el dia." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:292 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, llavors %s més tard." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:298 +#, 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 +msgid "Select a location…" +msgstr "Trieu una ubicació…" + +#: js/ui/dateMenu.js:312 +msgid "Loading…" +msgstr "S'està carregant…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:318 +#, javascript-format +msgid "Feels like %s." +msgstr "Sensació tèrmica de %s." + +#: js/ui/dateMenu.js:321 +msgid "Go online for weather information" +msgstr "Vés en línia per a informació sobre el temps" + +#: js/ui/dateMenu.js:323 +msgid "Weather information is currently unavailable" +msgstr "La informació sobre el temps no està disponible" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Eixida %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Eixida" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s eixirà de la sessió automàticament d'ací %d segon." +msgstr[1] "%s eixirà de la sessió automàticament d'ací %d segons." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Eixireu automàticament d'ací %d segon." +msgstr[1] "Eixireu automàticament d'ací %d segons." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Ix" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Apagada" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instal·la les actualitzacions i apaga" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "S'apagarà l'ordinador automàticament d'ací %d segon." +msgstr[1] "S'apagarà l'ordinador automàticament d'ací %d segons." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instal·la les actualitzacions pendents" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Reinicia" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Apaga" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Reinici" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Es reiniciarà l'ordinador automàticament d'ací %d segon." +msgstr[1] "Es reiniciarà l'ordinador automàticament d'ací %d segons." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reinicia i instal·la les actualitzacions" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Es reiniciarà l'ordinador automàticament i s'instal·laran les " +"actualitzacions d'ací %d segon." +msgstr[1] "" +"Es reiniciarà l'ordinador automàticament i s'instal·laran les " +"actualitzacions d'ací %d segons." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reinicia i instal·la" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instal·la i apaga" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Apaga després d'instal·lar les actualitzacions" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reinicia i instal·la l'actualització" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s s'instal·larà després del reinici. Una actualització de la " +"instal·lació pot trigar força temps. Assegureu-vos que heu fet còpia de " +"seguretat i que l'ordinador està connectat al corrent." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"S'està utilitzant la bateria: connecteu l'ordinador a la xarxa elèctrica " +"abans d'instal·lar les actualitzacions." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Hi ha algunes aplicacions que estan ocupades o que tenen documents sense " +"guardar." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Altres usuaris tenen la sessió oberta." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remot)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consola)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Instal·la" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Voleu baixar i instal·lar «%s» d'extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vol inhabilitar les dreceres" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "L'aplicació vol inhabilitar les dreceres" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Podeu restaurar les dreceres si premeu %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Denega" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Permet" + +#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "Teclat" + +#: js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "No hi ha cap extensió instal·lada" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s no ha emés cap error." + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "Amaga els errors" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "Mostra els errors" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "Habilitat" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Inhabilitat" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "Error" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "Fora d'hora" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "S'està baixant" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "Mostra el codi font" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "Pàgina web" + +#: js/ui/messageTray.js:1493 +msgid "System Information" +msgstr "Informació de l'ordinador" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Artista desconegut" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Títol desconegut" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Desfés" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Vista general" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Teclegeu per buscar…" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "Drecera de teclat nova…" + +#: js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "Definit per l'aplicació" + +#: js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "Mostra l'ajuda en pantalla" + +#: js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "Commuta el monitor " + +#: js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "Assigna la pulsació de tecla" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "Fet" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "Edita…" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "Cap" + +#: js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "Premeu un botó per a configurar" + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "Premeu Esc per eixir" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "Premeu qualsevol tecla per eixir" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Ix" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Activitats" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:812 +msgid "Top Bar" +msgstr "Barra superior" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Introduïu una orde" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "Tanca" + +#: js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "El reinici no està disponible en Wayland" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "S'està reiniciant…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A %d de %B" + +#: js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d missatge nou" +msgstr[1] "%d missatges nous" + +#: js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notificació nova" +msgstr[1] "%d notificacions noves" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:284 +msgid "Lock" +msgstr "Bloqueja" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "El GNOME necessita bloquejar la pantalla" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr "No es pot blocar" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 +msgid "Lock was blocked by an application" +msgstr "Una aplicació està bloquejant el bloqueig" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "S'està cercant…" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "No s'ha trobat cap resultat." + +#: js/ui/search.js:777 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d més" +msgstr[1] "%d més" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Copia" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Enganxa" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Mostra el text" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Oculta el text" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "Contrasenya" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "Recorda la contrasenya" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Accessibilitat" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Amplia" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Lector de pantalla" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Teclat en pantalla" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Avisos visuals" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Tecles enganxoses" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Tecles lentes" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Tecles de salt" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Tecles del ratolí" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Alt contrast" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Text gran" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627 +msgid "Bluetooth Settings" +msgstr "Paràmetres del Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d connectat" +msgstr[1] "%d connectats" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "Desactivat" + +#: js/ui/status/bluetooth.js:140 +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 +msgid "Show Keyboard Layout" +msgstr "Mostra la disposició del teclat" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Ubicació habilitada" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Inhabilita" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Paràmetres de privacitat" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Ubicació en ús" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Ubicació inhabilitada" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Habilita" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Voleu donar a %s accés a la vostra ubicació?" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu " +"des de la configuració de la privacitat." + +#: js/ui/status/network.js:104 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 js/ui/status/network.js:1328 +#, 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 +#, javascript-format +msgid "%s Connected" +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 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s no gestionat" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:465 +#, 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 +#, 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 +#, 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 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Falta 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 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s no disponible" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:490 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s ha fallat la connexió" + +#: js/ui/status/network.js:506 +msgid "Wired Settings" +msgstr "Paràmetres de la xarxa amb fil" + +#: js/ui/status/network.js:548 +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 +#, 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 +#, javascript-format +msgid "%s Disabled" +msgstr "%s Inhabilitat" + +#: js/ui/status/network.js:635 +msgid "Connect to Internet" +msgstr "Connecta a Internet" + +#: js/ui/status/network.js:833 +msgid "Airplane Mode is On" +msgstr "El mode d'avió és actiu" + +#: js/ui/status/network.js:834 +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 +msgid "Turn Off Airplane Mode" +msgstr "Desactiva el mode d'avió" + +#: js/ui/status/network.js:844 +msgid "Wi-Fi is Off" +msgstr "La xarxa sense fil està desactivada" + +#: js/ui/status/network.js:845 +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 +msgid "Turn On Wi-Fi" +msgstr "Activa la xarxa sense fil" + +#: js/ui/status/network.js:871 +msgid "Wi-Fi Networks" +msgstr "Xarxes sense fil" + +#: js/ui/status/network.js:873 +msgid "Select a network" +msgstr "Trieu una xarxa" + +#: js/ui/status/network.js:903 +msgid "No Networks" +msgstr "Cap xarxa" + +#: js/ui/status/network.js:924 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 +msgid "Select Network" +msgstr "Trieu una xarxa" + +#: js/ui/status/network.js:1197 +msgid "Wi-Fi Settings" +msgstr "Paràmetres de la xarxa sense fil" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1316 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hostpot %s actiu" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1331 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s no està connectat" + +#: js/ui/status/network.js:1435 +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 +msgid "authentication required" +msgstr "cal autenticació" + +#: js/ui/status/network.js:1440 +msgid "connection failed" +msgstr "ha fallat la connexió" + +#: js/ui/status/network.js:1494 +msgid "VPN Settings" +msgstr "Paràmetres de la VPN" + +#: js/ui/status/network.js:1498 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1508 +msgid "VPN Off" +msgstr "VPN apagada" + +#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Paràmetres de xarxa" + +#: js/ui/status/network.js:1603 +#, 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 +#, 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 +#, 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 +msgid "Connection failed" +msgstr "Ha fallat la connexió" + +#: js/ui/status/network.js:1760 +msgid "Activation of network connection failed" +msgstr "Ha fallat l'activació de la connexió de xarxa" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "Llum nocturna inhabilitada" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Llum nocturna habilitada" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Reprén" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Inhabilita fins demà" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Paràmetres d'energia" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Totalment carregada" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "S'està estimant la duració…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Queden %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d per completar la càrrega (%d %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "El mode d'avió és actiu" + +#: js/ui/status/system.js:228 +msgid "Switch User" +msgstr "Canvia d'usuari" + +#: js/ui/status/system.js:240 +msgid "Log Out" +msgstr "Ix" + +#: js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "Paràmetres del compte" + +#: js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "Bloqueja l'orientació" + +#: js/ui/status/system.js:295 +msgid "Suspend" +msgstr "Atura temporalment" + +#: js/ui/status/system.js:305 +msgid "Power Off" +msgstr "Apaga" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "S'ha canviat el volum" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Volum" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Mirall" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Uneix pantalles" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Només extern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Només l'integrat" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Entra amb un altre usuari" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Desbloqueja la finestra" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Aplicacions" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Busca" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» ja està a punt" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Voleu mantindre esta configuració de la pantalla?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Descarta els canvis" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Mantén els canvis" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Es descartaran els canvis d'ací %d segon" +msgstr[1] "Es descartaran els canvis d'ací %d segons" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Minimitza" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Desmaximitza" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Maximitza" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Mou" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Reajusta" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Mou la barra de títol a la pantalla" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Sempre per damunt" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Sempre a l'espai de treball visible" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Mou a l'espai de treball esquerre" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "Mou a l'espai de treball dret" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "Mou a l'espai de treball superior" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "Mou a l'espai de treball inferior" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Mou a la pantalla de dalt" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Mou a la pantalla de baix" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "Mou a la pantalla de l'esquerra" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "Mou a la pantalla de la dreta" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendari de l'Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:380 +msgid "Print version" +msgstr "Mostra la versió" + +#: src/main.c:386 +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 +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 +msgid "List possible modes" +msgstr "Llista els modes possibles" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Desconegut" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "No s'ha pogut iniciar «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Les contrasenyes no coincideixen." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "La contrasenya no pot ser buida" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "L'usuari ha descartat el diàleg d'autenticació" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u eixida" +msgstr[1] "%u eixides" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entrades" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sons del sistema" + +#~ msgid "Hide tray" +#~ msgstr "Oculta la Safata" + +#~ msgid "Status Icons" +#~ msgstr "Icones d'estat" + +#~ msgid "Events" +#~ msgstr "Cites" + +#~ msgid "Notifications" +#~ msgstr "Notificacions" + +#~ msgid "Clear section" +#~ msgstr "Neteja la secció" + +#~ msgid "Media" +#~ msgstr "Multimèdia" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Redirecció per l'autenticació web" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Not In Use" +#~ msgstr "No s'usa" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferències de les extensions del GNOME Shell" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Mostra el número de la setmana al calendari" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Si és «true» (cert) es mostra el número de la setmana al calendari." + +#~ msgid "Use as Internet connection" +#~ msgstr "Utilitza com a connexió a Internet" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s està demanant accés a la vostra ubicació." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (composició mitjançant Wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d dispositiu connectat" +#~ msgstr[1] "%d dispositius connectats" + +#~ msgid "Authentication required" +#~ msgstr "Cal autenticació" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Bateria" + +#~ msgid "Airplane Mode" +#~ msgstr "Mode d'avió" + +#~ msgid "Show the message tray" +#~ msgstr "Mostra la safata de missatges" + +#~ msgid "Captive Portal" +#~ msgstr "Portal captiu" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Dg." + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Dl." + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Dt." + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Dc." + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Dj." + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Dv." + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Ds." + +#~ msgid "Nothing Scheduled" +#~ msgstr "No hi ha res apuntat" + +#~ msgid "Today" +#~ msgstr "Avui" + +#~ msgid "Tomorrow" +#~ msgstr "Demà" + +#~ msgid "This week" +#~ msgstr "Aquesta setmana" + +#~ msgid "Next week" +#~ msgstr "La setmana que ve" + +#~ msgid "Removable Devices" +#~ msgstr "Dispositius extraïbles" + +#~ msgid "Eject" +#~ msgstr "Expulsa" + +#~ msgid "Invitation" +#~ msgstr "Invitació" + +#~ msgid "Call" +#~ msgstr "Trucada" + +#~ msgid "File Transfer" +#~ msgstr "Transferència de fitxers" + +#~ msgid "Chat" +#~ msgstr "Xat" + +#~ msgid "Unmute" +#~ msgstr "Amb so" + +#~ msgid "Mute" +#~ msgstr "Silencia" + +#~ msgid "Invitation to %s" +#~ msgstr "Us han convidat a entrar a %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "En/na %s us convida a entrar a %s" + +#~ msgid "Decline" +#~ msgstr "Declina" + +#~ msgid "Accept" +#~ msgstr "Accepta" + +#~ msgid "Video call from %s" +#~ msgstr "Videotrucada de %s" + +#~ msgid "Call from %s" +#~ msgstr "Trucada de %s" + +#~ msgid "Answer" +#~ msgstr "Contesta" + +#~ msgid "%s is sending you %s" +#~ msgstr "En/na %s us envia %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s vol poder saber quan esteu en línia" + +#~ msgid "Authentication failed" +#~ msgstr "Ha fallat l'autenticació" + +#~ msgid "Encryption error" +#~ msgstr "Error d'encriptació" + +#~ msgid "Certificate not provided" +#~ msgstr "No s'ha proporcionat el certificat" + +#~ msgid "Certificate untrusted" +#~ msgstr "El certificat no és de confiança" + +#~ msgid "Certificate expired" +#~ msgstr "El certificat ha vençut" + +#~ msgid "Certificate not activated" +#~ msgstr "El certificat no està activat" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "No coincideix el nom de la màquina del certificat" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "No coincideix l'empremta digital del certificat" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificat signat per un mateix" + +#~ msgid "Status is set to offline" +#~ msgstr "S'ha establert l'estat a fora de línia" + +#~ msgid "Certificate is invalid" +#~ msgstr "El certificat no és vàlid" + +#~ msgid "Connection has been refused" +#~ msgstr "S'ha rebutjat la connexió" + +#~ msgid "Connection can't be established" +#~ msgstr "No es pot establir la connexió" + +#~ msgid "Connection has been lost" +#~ msgstr "S'ha perdut la connexió" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Aquest compte ja està connectat al servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "S'ha reemplaçat la connexió per una altra de nova fent servir el mateix " +#~ "recurs" + +#~ msgid "The account already exists on the server" +#~ msgstr "Ja existeix aquest compte al servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "El servidor està massa ocupat per gestionar la connexió" + +#~ msgid "Certificate has been revoked" +#~ msgstr "S'ha revocat el certificat" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "El certificat utilitza un algorisme criptogràfic no segur o la seva " +#~ "fortalesa criptogràfica és feble" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "La llargada del certificat del servidor o la profunditat de la cadena de " +#~ "certificació excedeix els límits de la biblioteca criptogràfica" + +#~ msgid "Internal error" +#~ msgstr "S'ha produït un error intern" + +#~ msgid "Unable to connect to %s" +#~ msgstr "No es pot connectar a %s" + +#~ msgid "View account" +#~ msgstr "Mostra el compte" + +#~ msgid "Open Calendar" +#~ msgstr "Obre el calendari" + +#~ msgid "Date & Time Settings" +#~ msgstr "Configuració de la data i de l'hora" + +#~ msgid "Open" +#~ msgstr "Obre" + +#~ msgid "Remove" +#~ msgstr "Suprimeix" + +#~ msgid "Clear Messages" +#~ msgstr "Neteja els missatges" + +#~ msgid "Notification Settings" +#~ msgstr "Configuració de les notificacions" + +#~ msgid "Tray Menu" +#~ msgstr "Menú de la safata" + +#~ msgid "No Messages" +#~ msgstr "No hi ha cap missatge" + +#~ msgid "Message Tray" +#~ msgstr "Safata de missatges" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..e3d86d1 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,2316 @@ +# Czech translation of gnome-shell. +# Copyright (C) 2009, 2010, 2011 the author(s) of gnome-shell. +# This file is distributed under the same license as the gnome-shell package. +# +# Andre Klapper , 2009. +# Petr Kovar , 2009, 2010, 2011, 2012, 2014, 2015. +# Adam Matoušek , 2012, 2013. +# Marek Černocký , 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-05 11:40+0000\n" +"PO-Revision-Date: 2019-02-06 12:01+0100\n" +"Last-Translator: Marek Černocký \n" +"Language-Team: čeština \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Gtranslator 2.91.7\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Systém" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Zobrazit seznam upozornění" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Zaměřovat aktivní upozornění" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Zobrazit přehled" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Zobrazit všechny aplikace" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Otevřít nabídku aplikací" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:221 +msgid "Shell Extensions" +msgstr "Rozšíření pro Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Nastavit rozšíření pro GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Správa oken a spouštění aplikací" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Povolit přes Alt-F2 vnitřní nástroje určené pro vývojáře a testery" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Poskytuje přístup k vnitřním ladicím a monitorovacím nástrojům pomocí okna " +"ovládaného přes Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID rozšíření, která se mají zapnout" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Rozšíření GNOME Shell mají vlastnost UUID; tento klíč je seznamem rozšíření, " +"která by měla být načítána. Každé rozšíření, které má být načítáno, musí být " +"na tomto seznamu. S tímto seznamem můžete pracovat také pomocí metod " +"EnableExtension a DisableExtension sběrnice DBus na org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Zakázat uživatelská rozšíření" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Zakázat všechna rozšíření, která uživatel zapnul, bez vlivu na nastavení " +"„enabled-extension“." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Vypíná kontrolu kompatibility verze rozšíření" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell načítá pouze rozšíření, která propagují podporu právě běžící " +"verze. Zapnutím této volby zakážete tuto kontrolu a rozšíření se budou " +"zkoušet načíst bez ohledu na to, jakou verzi podporují." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Seznam ID souborů desktop oblíbených aplikací" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Aplikace odpovídající těmto identifikátorům budou zobrazeny oblasti " +"oblíbených." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Stránka ve výběru aplikace" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Číslo aktuálně zvolené stránky ve výběru aplikací." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historie příkazového dialogového okna (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historie dialogového okna „looking glass“ (Alt-F2)" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "V nabídce uživatele vždy zobrazovat položku „Odhlásit“." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Tento klíč ruší automatické skrývání položky nabídky „Odhlásit“ v situacích " +"s jedním uživatelem a jedním sezením." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Zdali si pamatovat heslo k připojování šifrovaných či vzdálených souborových " +"systémů" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Shell požaduje heslo při připojování šifrovaných či vzdálených souborových " +"systémů. Může-li být heslo uloženo pro budoucí použití, zobrazí se " +"zaškrtávací pole „Pamatovat si heslo“. Tento klíč určuje výchozí stav této " +"volby." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Zda měl adaptér Bluetooth nastavená zařízení pro spolupráci s ním" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Shell zobrazuje nabídku Bluetooth jen v případě, že je adaptér Bluetooth " +"zapnutý, nebo když existují nějaká zařízení nastavená pro spolupráci s " +"výchozím adaptérem. Nabídka zmizí, když se zjistí, že výchozí adaptér nemá " +"přiřazená žádná zařízení." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Povolit API introspekce" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Povolit API na sběrnici D-Bus, které umožňuje introspekci stavu aplikace v " +"shellu." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Klávesová zkratka otevírající nabidku aplikací" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Klávesová zkratka sloužící k otevření nabídky aplikací." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Klávesová zkratka otevírající zobrazení aplikací" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Klávesová zkratka sloužící k otevření seznamu aplikací v Přehledu činností." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Klávesová zkratka otevírající přehled" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Klávesová zkratka sloužící k otevření přehledu činností" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Klávesová zkratka přepínající viditelnost seznamu upozornění" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Klávesová zkratka sloužící k přepnutí viditelnosti seznamu upozornění." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Klávesová zkratka zaměřující aktivního upozornění" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Klávesová zkratka sloužící k zaměření aktivního upozornění." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Klávesová zkratka k pozastavení a opětovnému spuštění všech běžících animací " +"tweens; pro účely ladění" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Přepnout do aplikace 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Přepnout do aplikace 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Přepnout do aplikace 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Přepnout do aplikace 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Přepnout do aplikace 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Přepnout do aplikace 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Přepnout do aplikace 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Přepnout do aplikace 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Přepnout do aplikace 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Která klávesnice se má používat" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Typ klávesnice, který se má používat." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Omezit přepínání jen na aktuální plochu" + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Je-li zapnuto, objeví se v přepínači aplikací jen ty, co jsou na aktuální " +"pracovní ploše. V opačném případě jsou zahrnuty všechny aplikace." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Režim ikon aplikací" + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Nastavuje, jak jsou okna zobrazena v přepínači. Možnostmi jsou „thumbnail-" +"only“ (zobrazí náhled okna), „app-icon-only“ (zobrazí pouze ikonu aplikace) " +"a „both“ (zobrazí náhled i ikonu)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Je-li zapnuto, objeví se v přepínači oken jen ty, co jsou na aktuální " +"pracovní ploše. V opačném případě jsou zahrnuta všechna okna." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Modální dialogová okna připojovat k rodičovskému oknu" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.mutter" + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Okna upuštěná u okraje obrazovky nechat řadit jako dlaždice" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Pracovní plochy jsou spravovány dynamicky" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Pracovní plochy jen na hlavním monitoru" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Se změnou zaměření v režimu myši čekat na zastavení pohybu ukazatele" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Přihlášení do sítě" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:121 +msgid "Something’s gone wrong" +msgstr "Něco se stalo špatně" + +#: js/extensionPrefs/main.js:128 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Omlouváme se, ale vyskytl se problém: nastavení pro toto rozšíření nelze " +"zobrazit. Doporučujeme problém nahlásit autorovi rozšíření." + +#: js/extensionPrefs/main.js:135 +msgid "Technical Details" +msgstr "Technické podrobnosti" + +#: js/extensionPrefs/main.js:170 +msgid "Copy Error" +msgstr "Zkopírovat chybu" + +#: js/extensionPrefs/main.js:190 +msgid "Homepage" +msgstr "Domovská stránka" + +#: js/extensionPrefs/main.js:191 +msgid "Visit extension homepage" +msgstr "Navštívit domovskou stránku rozšíření" + +#: js/extensionPrefs/main.js:454 +msgid "No Extensions Installed" +msgstr "Nejsou nainstalována žádná rozšíření" + +#: js/extensionPrefs/main.js:464 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Rozšíření je možné instalovat pomocí aplikace Software nebo přes extensions.gnome.org." + +#: js/extensionPrefs/main.js:479 +msgid "Browse in Software" +msgstr "Procházet v Softwaru" + +#: js/gdm/authPrompt.js:143 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:437 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:330 js/ui/status/network.js:894 +msgid "Cancel" +msgstr "Zrušit" + +#: js/gdm/authPrompt.js:162 js/gdm/authPrompt.js:205 js/gdm/authPrompt.js:437 +msgid "Next" +msgstr "Další" + +#: js/gdm/authPrompt.js:201 js/ui/shellMountOperation.js:334 +#: js/ui/unlockDialog.js:55 +msgid "Unlock" +msgstr "Odemknout" + +#: js/gdm/authPrompt.js:203 +msgctxt "button" +msgid "Sign In" +msgstr "Přihlásit se" + +#: js/gdm/loginDialog.js:311 +msgid "Choose Session" +msgstr "Vybrat sezení" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:454 +msgid "Not listed?" +msgstr "Nejste na seznamu?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(např. uživatel nebo %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Uživatelské jméno: " + +#: js/gdm/loginDialog.js:1231 +msgid "Login Window" +msgstr "Přihlašovací okno" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "Chyba ověření" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(nebo otiskněte prst)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "Vypnout" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"vypnout;vypnutí;restart;restartování;restartovat;reboot;znovu zavést systém;" +"zavedení systému;natažení systému;" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:101 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Zamknout obrazovku" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:104 +msgid "lock screen" +msgstr "" +"zamknout obrazovku;zamknout počítač;uzamknout obrazovku;uzamknout počítač;" +"zamčít obrazovku;zamčít počítač;uzamčít obrazovku;uzamčít počítač;zamknutí " +"obrazovky;zamknutí počítače;uzamknutí obrazovky;uzamknutí počítače;zamčení " +"obrazovky;zamčení počítače;uzamčení obrazovky;uzamčení počítače;" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "Odhlásit se" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "odhlásit se;odhlášení;odlogovat se;odlogování;" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "Uspat do paměti" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "uspat do paměti;režim spánku;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +msgid "Switch User" +msgstr "Přepnout uživatele" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:125 +msgid "switch user" +msgstr "přepnout uživatele;přepnutí uživatele;" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Zamknout otočení" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:132 +msgid "lock orientation;screen;rotation" +msgstr "" +"zamknout otočení;zamknout orientaci;uzamknout otočení;uzamknout orientaci;" +"zamčít otočení;zamčít orientaci;uzamčít otočení;uzamčít orientaci;zamknutí " +"otočení;zamknutí orientace;uzamknutí otočení;uzamknutí orientace;zamčení " +"otočení;zamčení orientace;uzamčení otočení;uzamčení orientace;" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Příkaz nenalezen" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Nelze analyzovat příkaz:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Vykonání „%s“ selhalo:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "právě teď" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "před minutou" +msgstr[1] "před %d minutami" +msgstr[2] "před %d minutami" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "před hodinou" +msgstr[1] "před %d hodinami" +msgstr[2] "před %d hodinami" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "včera" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "před %d dnem" +msgstr[1] "před %d dny" +msgstr[2] "před %d dny" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "před týdnem" +msgstr[1] "před %d týdny" +msgstr[2] "před %d týdny" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "před měsícem" +msgstr[1] "před %d měsíci" +msgstr[2] "před %d měsíci" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "před rokem" +msgstr[1] "před %d roky" +msgstr[2] "před %d lety" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%k∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "včera, %k∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A %k∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%e. %B %k∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%e. %B %Y, %k∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "včera %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%e. %B %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%e. %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "Přihlášení k přístupovému bodu" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Vaše připojení k tomuto přístupovému bodu není bezpečné. Hesla a další " +"informace, které zadáte na této stránce mohou vidět ostatní lidé v okolí." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "Zamítnout přístup" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "Schválit přístup" + +#: js/ui/appDisplay.js:780 +msgid "Frequently used applications will appear here" +msgstr "Zde se objeví často používané aplikace" + +#: js/ui/appDisplay.js:895 +msgid "Frequent" +msgstr "Časté" + +#: js/ui/appDisplay.js:902 +msgid "All" +msgstr "Všechny" + +#: js/ui/appDisplay.js:1857 +msgid "New Window" +msgstr "Nové okno" + +#: js/ui/appDisplay.js:1871 +msgid "Launch using Dedicated Graphics Card" +msgstr "Spustit pomocí vyhrazené grafické karty" + +#: js/ui/appDisplay.js:1898 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "Odstranit z oblíbených" + +#: js/ui/appDisplay.js:1904 +msgid "Add to Favorites" +msgstr "Přidat mezi oblíbené" + +#: js/ui/appDisplay.js:1914 +msgid "Show Details" +msgstr "Zobrazit podrobnosti" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s byl přidán mezi oblíbené." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s byl odstraněn z oblíbených." + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "Výběr zvukového zařízení" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "Nastavení zvuku" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "Sluchátka" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "Sluchátka s mikrofonem" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "Změnit pozadí…" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Nastavení displeje" + +#: js/ui/backgroundMenu.js:18 +msgid "Settings" +msgstr "Nastavení" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:42 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:71 +msgctxt "grid sunday" +msgid "S" +msgstr "Ne" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:73 +msgctxt "grid monday" +msgid "M" +msgstr "Po" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:75 +msgctxt "grid tuesday" +msgid "T" +msgstr "Út" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:77 +msgctxt "grid wednesday" +msgid "W" +msgstr "St" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:79 +msgctxt "grid thursday" +msgid "T" +msgstr "Čt" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:81 +msgctxt "grid friday" +msgid "F" +msgstr "Pá" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:83 +msgctxt "grid saturday" +msgid "S" +msgstr "So" + +#. * +#. * 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:346 +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:356 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:413 +msgid "Previous month" +msgstr "Předchozí měsíc" + +#: js/ui/calendar.js:424 +msgid "Next month" +msgstr "Následující měsíc" + +#: js/ui/calendar.js:578 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%e" + +#: js/ui/calendar.js:633 +msgid "Week %V" +msgstr "%V. týden" + +#. 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:701 +msgctxt "event list time" +msgid "All Day" +msgstr "Celý den" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %e. %B" + +#: js/ui/calendar.js:837 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %e. %B %Y" + +#: js/ui/calendar.js:1060 +msgid "No Notifications" +msgstr "Nejsou žádná upozornění" + +#: js/ui/calendar.js:1063 +msgid "No Events" +msgstr "Nejsou žádné události" + +#: js/ui/calendar.js:1089 +msgid "Clear" +msgstr "Vymazat" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "Aplikace „%s“ neodpovídá." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Můžete si vybrat, jestli chvilku počkat, zda bude normálně pokračovat, nebo " +"ji násilně celou ukončit." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Vynutit ukončení" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Počkat" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "Externí svazek připojen" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Externí svazek odpojen" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "Otevřít pomocí %s" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "Heslo:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "Napište znovu:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "Případně se můžete připojit zmáčknutím tlačítka „WPS“ na směrovači." + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:225 +#: js/ui/status/network.js:315 js/ui/status/network.js:897 +msgid "Connect" +msgstr "Připojit" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Heslo: " + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "Klíč: " + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Heslo soukromého klíče: " + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Indentita: " + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Služba: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "K bezdrátové síti je vyžadováno ověření" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Pro přístup k bezdrátové síti „%s“ jsou vyžadována hesla nebo šifrovací " +"klíče." + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "Ověření připojení po drátu 802.1X" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Název sítě: " + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "Ověření DSL" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "Požadován kód PIN" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Pro mobilní širokopásmové zařízení je vyžadován kód PIN" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "Heslo k mobilní širokopásmové síti" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Pro připojení k „%s“ je vyžadováno heslo." + +#: js/ui/components/networkAgent.js:682 js/ui/status/network.js:1671 +msgid "Network Manager" +msgstr "Network Manager" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "Je vyžadováno ověření" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "Správce" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "Ověřit" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:314 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:785 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s je teď znám jako %s" + +#: js/ui/ctrlAltTab.js:25 js/ui/viewSelector.js:176 +msgid "Windows" +msgstr "Okna" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +msgid "Show Applications" +msgstr "Zobrazit aplikace" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:397 +msgid "Dash" +msgstr "Oblíbené" + +# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A". +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:74 +msgid "%B %-d %Y" +msgstr "%e. %B %Y" + +# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A". +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A, %e. %B %Y" + +#: js/ui/dateMenu.js:143 +msgid "Add world clocks…" +msgstr "Přidat světový čas…" + +#: js/ui/dateMenu.js:144 +msgid "World Clocks" +msgstr "Světové hodiny" + +#: js/ui/dateMenu.js:234 +msgid "Weather" +msgstr "Počasí" + +#: js/ui/dateMenu.js:317 +msgid "Select a location…" +msgstr "Vybrat místo…" + +#: js/ui/dateMenu.js:325 +msgid "Loading…" +msgstr "Načítá se…" + +#: js/ui/dateMenu.js:335 +msgid "Go online for weather information" +msgstr "Připojit se kvůli informacím o počasí" + +#: js/ui/dateMenu.js:337 +msgid "Weather information is currently unavailable" +msgstr "Informace o počasí nejsou nyní dostupné" + +#: js/ui/endSessionDialog.js:49 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Odhlásit uživatele %s" + +#: js/ui/endSessionDialog.js:50 +msgctxt "title" +msgid "Log Out" +msgstr "Odhlášení" + +#: js/ui/endSessionDialog.js:52 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Uživatel %s bude automaticky odhlášen za %d sekundu." +msgstr[1] "Uživatel %s bude automaticky odhlášen za %d sekundy." +msgstr[2] "Uživatel %s bude automaticky odhlášen za %d sekund." + +#: js/ui/endSessionDialog.js:57 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Budete automaticky odhlášeni za %d sekundu." +msgstr[1] "Budete automaticky odhlášeni za %d sekundy." +msgstr[2] "Budete automaticky odhlášeni za %d sekund." + +#: js/ui/endSessionDialog.js:63 +msgctxt "button" +msgid "Log Out" +msgstr "Odhlásit" + +#: js/ui/endSessionDialog.js:69 +msgctxt "title" +msgid "Power Off" +msgstr "Vypnutí" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Nainstalovat aktualizace a vypnout" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Systém bude automaticky vypnut za %d sekundu." +msgstr[1] "Systém bude automaticky vypnut za %d sekundy." +msgstr[2] "Systém bude automaticky vypnut za %d sekund." + +#: js/ui/endSessionDialog.js:76 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Nainstalovat čekající aktualizace softwaru" + +#: js/ui/endSessionDialog.js:79 js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Restart" +msgstr "Restartovat" + +#: js/ui/endSessionDialog.js:81 +msgctxt "button" +msgid "Power Off" +msgstr "Vypnout" + +#: js/ui/endSessionDialog.js:88 +msgctxt "title" +msgid "Restart" +msgstr "Restart" + +#: js/ui/endSessionDialog.js:90 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Systém bude automaticky restartován za %d sekundu." +msgstr[1] "Systém bude automaticky restartován za %d sekundy." +msgstr[2] "Systém bude automaticky restartován za %d sekund." + +#: js/ui/endSessionDialog.js:104 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Restartovat a nainstalovat aktualizace" + +#: js/ui/endSessionDialog.js:106 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Systém bude automaticky restartován za %d sekundu a poté se nainstalují " +"aktualizace." +msgstr[1] "" +"Systém bude automaticky restartován za %d sekundy a poté se nainstalují " +"aktualizace." +msgstr[2] "" +"Systém bude automaticky restartován za %d sekund a poté se nainstalují " +"aktualizace." + +#: js/ui/endSessionDialog.js:112 js/ui/endSessionDialog.js:132 +msgctxt "button" +msgid "Restart & Install" +msgstr "Restartovat a nainstalovat" + +#: js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Nainstalovat a vypnout" + +#: js/ui/endSessionDialog.js:114 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Po nainstalování aktualizací vypnout" + +#: js/ui/endSessionDialog.js:122 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Restartovat a nainstalovat povýšení" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:127 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"Verze %2s distribuce %1s bude nainstalována po restartu. Instalace povýšení " +"může zabrat hodně času: zkontrolujte, že máte vše zazálohováno a že počítač " +"je připojen do elektriky." + +#: js/ui/endSessionDialog.js:316 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Počítač běží na baterii: před instalací jej prosím připojte k napájení." + +#: js/ui/endSessionDialog.js:333 +msgid "Some applications are busy or have unsaved work." +msgstr "Některé aplikace jsou zaneprázdněny nebo obsahují neuloženou práci." + +#: js/ui/endSessionDialog.js:340 +msgid "Other users are logged in." +msgstr "Jsou přihlášeni jiní uživatelé." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:621 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (vzdálený)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:624 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konzola)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "Instalovat" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s chce znemožnit klávesové zkratky" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplikace chce znemožnit klávesové zkratky" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Obnovit klávesové zkratky můžete zmáčknutím %s." + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "Zamítnout" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "Umožnit" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "Pomalé klávesy zapnuty" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "Pomalé klávesy vypnuty" + +#: js/ui/kbdA11yDialog.js:34 +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 "" +"Stačí podržet klávesu Shift po dobu 8 sekund. Jedná se o klávesovou zkratku " +"pro funkci Pomalé klávesy, která ovlivňuje způsob, jakým funguje vaše " +"klávesnice." + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned On" +msgstr "Kombinace kláves jedním prstem zapnuty" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "Kombinace kláves jedním prstem vypnuty" + +#: js/ui/kbdA11yDialog.js:44 +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 "" +"Stačí zmáčknout Shift pětkrát po sobě. Jedná se o klávesovou zkratku pro " +"funkci Kombinace kláves jedním prstem, která ovlivňuje způsob, jakým funguje " +"vaše klávesnice." + +#: js/ui/kbdA11yDialog.js:46 +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 "" +"Stačí zmáčknout dvě klávesy naráz, nebo Shift pětkrát po sobě. Tím se vypne " +"funkce Kombinace kláves jedním prstem, která ovlivňuje způsob, jakým funguje " +"vaše klávesnice." + +#: js/ui/kbdA11yDialog.js:58 +msgid "Leave On" +msgstr "Ponechat zapnuté" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1270 +msgid "Turn On" +msgstr "Zapnout" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:134 js/ui/status/network.js:316 +#: js/ui/status/network.js:1270 js/ui/status/network.js:1382 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Vypnout" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "Ponechat vypnuté" + +#: js/ui/keyboard.js:190 +msgid "Region & Language Settings" +msgstr "Nastavení regionu a jazyka" + +#: js/ui/lookingGlass.js:627 +msgid "No extensions installed" +msgstr "Nejsou nainstalována žádná rozšíření" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:681 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "Rozšíření %s nevyvolalo žádné chyby." + +#: js/ui/lookingGlass.js:687 +msgid "Hide Errors" +msgstr "Skrývat chyby" + +#: js/ui/lookingGlass.js:691 js/ui/lookingGlass.js:751 +msgid "Show Errors" +msgstr "Zobrazovat chyby" + +#: js/ui/lookingGlass.js:700 +msgid "Enabled" +msgstr "Povoleno" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:703 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Zakázáno" + +#: js/ui/lookingGlass.js:705 +msgid "Error" +msgstr "Chyba" + +#: js/ui/lookingGlass.js:707 +msgid "Out of date" +msgstr "Neaktuální" + +#: js/ui/lookingGlass.js:709 +msgid "Downloading" +msgstr "Stahování" + +#: js/ui/lookingGlass.js:733 +msgid "View Source" +msgstr "Zobrazit zdroj" + +#: js/ui/lookingGlass.js:742 +msgid "Web Page" +msgstr "Webová stránka" + +#: js/ui/messageTray.js:1483 +msgid "System Information" +msgstr "Informace o systému" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "Neznámý umělec" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "Neznámý název" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "Hlasitost" + +#: js/ui/overview.js:78 +msgid "Undo" +msgstr "Zpět" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:105 +msgid "Overview" +msgstr "Přehled" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:231 +msgid "Type to search…" +msgstr "Vyhledávejte psaním…" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "Nová klávesová zkratka…" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "Definováno aplikací" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "Zobrazit nápovědu na obrazovce" + +#: js/ui/padOsd.js:153 +msgid "Switch monitor" +msgstr "Přepnout monitor" + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "Přířadit klávesu" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "Hotovo" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "Upravit…" + +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "Źádná" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "Zmáčkněte tlačítko pro nastavení" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "Zmáčknutím Esc ukončíte" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "Zmáčknutím klávesy ukončíte" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Ukončit" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:410 +msgid "Activities" +msgstr "Činnosti" + +#: js/ui/panel.js:685 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Systém" + +#: js/ui/panel.js:808 +msgid "Top Bar" +msgstr "Horní lišta" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Zadejte příkaz:" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:169 +msgid "Close" +msgstr "Zavřít" + +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "Restart není na Waylandu k dispozici" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "Restartuje se…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %e. %B" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nová zpráva" +msgstr[1] "%d nové zprávy" +msgstr[2] "%d nových zpráv" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nové upozornění" +msgstr[1] "%d nová upozornění" +msgstr[2] "%d nových upozornění" + +#: js/ui/screenShield.js:458 js/ui/status/system.js:291 +msgid "Lock" +msgstr "Uzamknout" + +#: js/ui/screenShield.js:722 +msgid "GNOME needs to lock the screen" +msgstr "GNOME potřebuje uzamknout obrazovku" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:843 js/ui/screenShield.js:1316 +msgid "Unable to lock" +msgstr "Nelze uzamknout obrazovku" + +#: js/ui/screenShield.js:844 js/ui/screenShield.js:1317 +msgid "Lock was blocked by an application" +msgstr "Zamknutí bylo zablokováno některou z aplikací" + +#: js/ui/search.js:644 +msgid "Searching…" +msgstr "Hledá se…" + +#: js/ui/search.js:646 +msgid "No results." +msgstr "Žádné výsledky." + +#: js/ui/search.js:770 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d další" +msgstr[1] "%d další" +msgstr[2] "%d dalších" + +#: js/ui/shellEntry.js:20 +msgid "Copy" +msgstr "Kopírovat" + +#: js/ui/shellEntry.js:25 +msgid "Paste" +msgstr "Vložit" + +#: js/ui/shellEntry.js:91 +msgid "Show Text" +msgstr "Zobrazit text" + +#: js/ui/shellEntry.js:93 +msgid "Hide Text" +msgstr "Skrýt text" + +#: js/ui/shellMountOperation.js:301 +msgid "Password" +msgstr "Heslo" + +#: js/ui/shellMountOperation.js:322 +msgid "Remember Password" +msgstr "Pamatovat si heslo" + +#: js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Zpřístupnění" + +#: js/ui/status/accessibility.js:54 +msgid "Zoom" +msgstr "Zvětšení" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Reader" +msgstr "Čtečka obrazovky" + +#: js/ui/status/accessibility.js:65 +msgid "Screen Keyboard" +msgstr "Klávesnice na obrazovce" + +#: js/ui/status/accessibility.js:69 +msgid "Visual Alerts" +msgstr "Vizuální upozornění" + +#: js/ui/status/accessibility.js:72 +msgid "Sticky Keys" +msgstr "Lepící klávesy" + +#: js/ui/status/accessibility.js:75 +msgid "Slow Keys" +msgstr "Pomalé klávesy" + +#: js/ui/status/accessibility.js:78 +msgid "Bounce Keys" +msgstr "Vícenásobné stisky kláves" + +#: js/ui/status/accessibility.js:81 +msgid "Mouse Keys" +msgstr "Myš klávesnicí" + +#: js/ui/status/accessibility.js:155 +msgid "High Contrast" +msgstr "Vysoký kontrast" + +#: js/ui/status/accessibility.js:186 +msgid "Large Text" +msgstr "Styl velkého textu" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:591 +msgid "Bluetooth Settings" +msgstr "Nastavení Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d připojené" +msgstr[1] "%d připojená" +msgstr[2] "%d připojených" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "Vypnuto" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "Zapnuto" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "Jas" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "Klávesnice" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "Zobrazit rozložení klávesnice" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "Zjišťování polohy je povoleno" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "Zakázát" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "Nastavení ochrany osobních údajů" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "Zjišťování polohy se používá" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "Zjišťování polohy je zakázáno" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "Povolit" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Schválit pro %s přístup k vaší poloze?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Přístup ke službám pro určování polohy lze kdykoliv změnit v nastavení " +"soukromí." + +#: js/ui/status/network.js:72 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:422 js/ui/status/network.js:1299 +#, javascript-format +msgid "%s Off" +msgstr "%s je vypnuto" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:425 +#, javascript-format +msgid "%s Connected" +msgstr "%s je připojeno" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:430 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s není spravováno" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:433 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s se odpojuje" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:440 js/ui/status/network.js:1291 +#, javascript-format +msgid "%s Connecting" +msgstr "%s se připojuje" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:443 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s požaduje ověření" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:451 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Schází firmware pro %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:455 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s je nedostupné" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:458 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s selhalo připojení" + +#: js/ui/status/network.js:470 +msgid "Wired Settings" +msgstr "Nastavení připojení po drátu" + +#: js/ui/status/network.js:512 +msgid "Mobile Broadband Settings" +msgstr "Nastavení mobilní širokopásmové sítě" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:559 js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s je hardwarově zakázáno" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:563 +#, javascript-format +msgid "%s Disabled" +msgstr "%s je zakázáno" + +#: js/ui/status/network.js:603 +msgid "Connect to Internet" +msgstr "Připojit k Internetu" + +#: js/ui/status/network.js:792 +msgid "Airplane Mode is On" +msgstr "Režim „letadlo“ je zapnutý" + +#: js/ui/status/network.js:793 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Když je zapnutý režim „letadlo“, je WiFi zakázána." + +#: js/ui/status/network.js:794 +msgid "Turn Off Airplane Mode" +msgstr "Vypnout režim „letadlo“" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is Off" +msgstr "WiFi je vypnutá" + +#: js/ui/status/network.js:804 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Abyste se připojili k síti, je zapotřebí zapnout WiFi." + +#: js/ui/status/network.js:805 +msgid "Turn On Wi-Fi" +msgstr "Zapnout WiFi" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi Networks" +msgstr "Sítě WiFi" + +#: js/ui/status/network.js:832 +msgid "Select a network" +msgstr "Vyberte síť" + +#: js/ui/status/network.js:861 +msgid "No Networks" +msgstr "Žádné sítě" + +#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "K vypnutí použijte fyzický vypínač" + +#: js/ui/status/network.js:1158 +msgid "Select Network" +msgstr "Vybrat síť" + +#: js/ui/status/network.js:1164 +msgid "Wi-Fi Settings" +msgstr "Nastavení WiFi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1287 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s je aktivní přístupový bod" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s není připojeno" + +#: js/ui/status/network.js:1399 +msgid "connecting…" +msgstr "připojuje se…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1402 +msgid "authentication required" +msgstr "je požadováno ověření" + +#: js/ui/status/network.js:1404 +msgid "connection failed" +msgstr "připojení selhalo" + +#: js/ui/status/network.js:1454 +msgid "VPN Settings" +msgstr "Nastavení VPN" + +#: js/ui/status/network.js:1471 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1481 +msgid "VPN Off" +msgstr "VPN je vypnuta" + +#: js/ui/status/network.js:1542 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Nastavení sítě" + +#: js/ui/status/network.js:1571 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s drátové připojení" +msgstr[1] "%s drátová připojení" +msgstr[2] "%s drátových připojení" + +#: js/ui/status/network.js:1575 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s bezdrátové připojení" +msgstr[1] "%s bezdrátová připojení" +msgstr[2] "%s bezdrátových připojení" + +#: js/ui/status/network.js:1579 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemové připojení" +msgstr[1] "%s modemová připojení" +msgstr[2] "%s modemových připojení" + +#: js/ui/status/network.js:1708 +msgid "Connection failed" +msgstr "Připojení selhalo" + +#: js/ui/status/network.js:1709 +msgid "Activation of network connection failed" +msgstr "Aktivace síťového připojení selhala" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Noční osvětlení vypnuto" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Noční osvětlení zapnuto" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Pokračovat" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Vypnout do zítřka" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "Nastavení napájení" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "Plně nabito" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "Nedobíjí se" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "Odhaduje se…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Zbývá %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d do nabití (%d %%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Obrazovka je sdílena" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Vypnout" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Režim „letadlo“ je zapnutý" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "Přepnout uživatele" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "Odhlásit se" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "Nastavení účtu" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "Zámek otočení" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "Uspat do paměti" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "Vypnout" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "Neznámé zařízení Thunderbolt" + +#: js/ui/status/thunderbolt.js:326 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Zatímco jste byli pryč, bylo nalezeno nové zařízení. Odpojte jej prosím a " +"znovu připojte, abyste jej mohli používat." + +#: js/ui/status/thunderbolt.js:329 +msgid "Unauthorized Thunderbolt device" +msgstr "Neověřené zařízení Thunderbolt" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Bylo zjištěno nové zařízení a je třeba jej ověřit správcem." + +#: js/ui/status/thunderbolt.js:336 +msgid "Thunderbolt authorization error" +msgstr "Chyba ověření Thunderbolt" + +#: js/ui/status/thunderbolt.js:337 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nezdařilo se provést ověření zařízení Thunderbolt: %s" + +#: js/ui/status/volume.js:136 +msgid "Volume changed" +msgstr "Hlasitost změněna" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "Duplikovat" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "Sloučit displeje" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "Jen externí" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "Jen vestavěné" + +#: js/ui/unlockDialog.js:63 +msgid "Log in as another user" +msgstr "Přihlásit se jako jiný uživatel" + +#: js/ui/unlockDialog.js:80 +msgid "Unlock Window" +msgstr "Odemykací okno" + +#: js/ui/viewSelector.js:180 +msgid "Applications" +msgstr "Aplikace" + +#: js/ui/viewSelector.js:184 +msgid "Search" +msgstr "Hledat" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "Připraveno „%s“" + +#: js/ui/windowManager.js:60 +msgid "Do you want to keep these display settings?" +msgstr "Chcete zachovat nastavení displeje?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:72 +msgid "Revert Settings" +msgstr "Obnovit původní" + +#: js/ui/windowManager.js:75 +msgid "Keep Changes" +msgstr "Zachovat" + +#: js/ui/windowManager.js:93 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Nastavení se obnoví na původní za %d sekundu" +msgstr[1] "Nastavení se obnoví na původní za %d sekundy" +msgstr[2] "Nastavení se obnoví na původní za %d sekund" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:669 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:29 +msgid "Minimize" +msgstr "Minimalizovat" + +#: js/ui/windowMenu.js:36 +msgid "Unmaximize" +msgstr "Zrušit maximalizaci" + +#: js/ui/windowMenu.js:40 +msgid "Maximize" +msgstr "Maximalizovat" + +#: js/ui/windowMenu.js:47 +msgid "Move" +msgstr "Přesunout" + +#: js/ui/windowMenu.js:53 +msgid "Resize" +msgstr "Změnit velikost" + +#: js/ui/windowMenu.js:60 +msgid "Move Titlebar Onscreen" +msgstr "Posunout záhlaví na obrazovku" + +#: js/ui/windowMenu.js:65 +msgid "Always on Top" +msgstr "Vždy nahoře" + +#: js/ui/windowMenu.js:84 +msgid "Always on Visible Workspace" +msgstr "Vždy na viditelné ploše" + +#: js/ui/windowMenu.js:98 +msgid "Move to Workspace Left" +msgstr "Přesunout o plochu doleva" + +#: js/ui/windowMenu.js:104 +msgid "Move to Workspace Right" +msgstr "Přesunout o plochu doprava" + +#: js/ui/windowMenu.js:110 +msgid "Move to Workspace Up" +msgstr "Přesunout o plochu výš" + +#: js/ui/windowMenu.js:116 +msgid "Move to Workspace Down" +msgstr "Přesunout o plochu níž" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Přesunout o monitor výš" + +#: js/ui/windowMenu.js:143 +msgid "Move to Monitor Down" +msgstr "Přesunout o monitor níž" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Left" +msgstr "Přesunout o monitor doleva" + +#: js/ui/windowMenu.js:161 +msgid "Move to Monitor Right" +msgstr "Přesunout o monitor doprava" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Kalendář Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Vypsat verzi" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Režim použitý GDM pro přihlašovací obrazovku" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Použít pro přihlašovací obrazovku zadaný režim, např. „gdm“." + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Vypsat možné režimy" + +#: src/shell-app.c:266 +msgctxt "program" +msgid "Unknown" +msgstr "Neznámé" + +#: src/shell-app.c:517 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Nelze spustit „%s“" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Hesla si neodpovídají." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Heslo nemůže být prázdné." + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Dialogové okno ověření bylo uživatelem zrušeno" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u výstup" +msgstr[1] "%u výstupy" +msgstr[2] "%u výstupů" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u vstup" +msgstr[1] "%u vstupy" +msgstr[2] "%u vstupů" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Systémové zvuky" diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..633d23e --- /dev/null +++ b/po/da.po @@ -0,0 +1,3248 @@ +# Danish translation of gnome-shell +# Copyright (C) 2010-2011, 2014-2016, 2018 gnome-shell +# This file is distributed under the same license as the gnome-shell package. +# +# Kenneth Nielsen , 2012. +# Kris Thomsen , 2009-2014, 2016-2017. +# Ask Hjorth Larsen , 2014-2016, 2018. +# Alan Mortensen , 2018-19. +# +# Konventioner: +# +# pipeline => datakanal +# screencast => skærmoptagelse +# dash => favoritområde +# tray => statusfelt +# overview => overblik +# tween => animation (It's short for inbetween and means the process of +# filling in intermediate frames in an animated cartoon) +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-21 18:43+0000\n" +"PO-Revision-Date: 2019-02-27 00:00+0200\n" +"Last-Translator: scootergrisen\n" +"Language-Team: Danish\n" +"Language: da\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" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "System" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Vis påmindelseslisten" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokusér på den aktive påmindelse" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Vis oversigten" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Vis alle programmer" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Åbn programmenuen" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell-udvidelser" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Konfigurér udvidelsesmoduler til GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Vindueshåndtering og åbning af programmer" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Aktivér interne værktøjer, som er nyttige for udviklere og testere fra Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Tillad adgang til interne fejlsøgnings- og overvågningsværktøjer med brug af " +"dialogen Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Uuid'er for udvidelser, der aktiveres" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Udvidelser til GNOME Shell har en uuid-indstilling; denne nøgle oplister " +"udvidelser som skal indlæses. Alle udvidelser som ønsker at blive indlæst " +"skal være i denne liste. Du kan også redigere denne liste med D-Bus-" +"metoderne EnableExtension og DisableExtension ved org.shell.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Deaktivér brugerudvidelser" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Deaktivér alle udvidelser, som brugeren har aktiveret uden at ændre på " +"“enabled-extension”-indstillingen." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Deaktiverer godkendelsen af udvidelsesversionskompatibilitet" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell vil kun indlæse udvidelser, som påstår at understøtte den i " +"øjeblikket kørende version. Dette tilvalg vil deaktivere denne kontrol, og " +"forsøge at indlæse alle udvidelser uanset hvilken version, de påstår at " +"understøtte." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Liste over skrivebordsfil-id'er til favoritprogrammer" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programmerne som passer til disse identifikatorer vil blive vist i " +"favoritområdet." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Programvælger-visning" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indeks for den valgte visning i programvælgeren." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historik for kommandodialogen (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historik for looking glass-dialogen" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Vis altid “Log ud”-menupunktet i brugermenuen." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Denne nøgle overstyrer den automatiske skjulning af menupunktet “Log ud” i " +"enkelt bruger, enkelt session-situationer." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Om adgangskoder skal huskes for montering af krypterede eller fjern-" +"filsystemer" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Shell'en vil spørge efter en adgangskode når en krypteret enhed eller et " +"fjern-filsystem bliver monteret. Hvis adgangskoden kan gemmes til fremtidig " +"brug, vil et “Husk adgangskode”-afkrydsningsfelt være synlig. Denne nøgle " +"angiver standardværdien af dette afkrydsningsfelt." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Om standard Bluetooth-adapteren er indstillet til at have enheder tilknyttet" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Shell'en vil kun vise menupunktet Bluetooth, hvis en Bluetooth-adapter er " +"tændt, eller hvis der er enheder tilknyttet standard adapteren. Dette vil " +"kun blive nulstillet hvis standard adapteren på et tidspunkt, ikke længere " +"har enheder tilknyttet." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Aktivér introspektions-API" + +# shell er andre steder ikke oversat +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Aktiverer et D-Bus-API, som tillader introspektion af shell'ens " +"programtilstand." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Genvejstast til at åbne programmenuen" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Genvejstast til at åbne programmenuen." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Genvejstast til at åbne “Vis programmer”-visningen" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Genvejstast til at åbne “Vis programmer”-visningen i Aktivitetsoversigten." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Genvejstast til at åbne oversigten" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Genvejstast til at åbne Aktivitetsoversigten." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Genvejstast til at slå synligheden af påmindelseslisten til eller fra" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Genvejstast til at slå synligheden af påmindelseslisten til eller fra." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Genvejstast til at fokusere på den aktive påmindelse" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Genvejstast til at fokusere på den aktive påmindelse." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Genvejstast, som pauser og genstarter alle kørende animationer, til " +"fejlsøgningsformål" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Skift til program 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Skift til program 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Skift til program 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Skift til program 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Skift til program 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Skift til program 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Skift til program 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Skift til program 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Skift til program 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Hvilket tastatur bruges" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Tastaturtypen som bruges." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Begræns skifteren til det nuværende arbejdsområde." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Hvis sand, vises kun programmer, som har vinduer på det nuværende " +"arbejdsområde, i skifteren. Ellers er alle programmer inkluderet." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Ikon-tilstanden for programmet." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Konfigurerer hvordan vinduer bliver vist i omskifteren. Gyldige muligheder " +"er “thumbnail-only” (viser forhåndsvisning af vinduet), “app-icon-" +"only” (viser kun programikonet) eller “both” (begge)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Hvis sand, vises kun vinduer fra det nuværende arbejdsområde i skifteren. " +"Ellers er alle programmer inkluderet." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Hæft modal dialog til overliggende vindue" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Denne nøgle overstyrer nøglen i org.gnome.mutter, når du kører GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Aktivér kant-fliselægning, når vinduer placeres ved skærmkanter" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Arbejdsområder er håndteret dynamisk" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Arbejdsområder kun på den primære skærm" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Forsink fokusændringer i musetilstand indtil pegeren holder op med at bevæge " +"sig" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Netværksindlogning" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Noget gik galt" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Vi er kede af det, men der er opstået et problem: Denne udvidelses " +"indstillinger kan ikke vises. Vi anbefaler, at du rapporterer problemet til " +"udvidelsens forfattere." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Tekniske detaljer" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Kopieringsfejl" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Hjemmeside" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Besøg udvidelsens hjemmeside" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Ingen udvidelser er installeret" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Udvidelser kan installeres fra Software eller extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Gennemse i Software" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Annullér" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Næste" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Lås op" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Log ind" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Vælg session" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Ikke listet?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(f.eks. bruger eller %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Brugernavn: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Indlogningsvindue" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Godkendelsesfejl" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(eller indlæs fingeraftryk)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Sluk" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "sluk;luk ned;genstart" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Lås skærm" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "lås skærm" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Log ud" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "log ud;log af" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Hviletilstand" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "hviletilstand" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Skift bruger" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "skift bruger" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Lås orientering" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "lås orientering;skærm;rotation" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Kommando ikke fundet" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Kunne ikke fortolke kommando:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Kørsel af “%s” mislykkedes:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Lige nu" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minut siden" +msgstr[1] "%d minutter siden" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d time siden" +msgstr[1] "%d timer siden" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "I går" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag siden" +msgstr[1] "%d dage siden" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d uge siden" +msgstr[1] "%d uger siden" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d måned siden" +msgstr[1] "%d måneder siden" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d år siden" +msgstr[1] "%d år siden" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "I går, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d. %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d. %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "I går, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d. %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d. %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Hotspot-login" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Din forbindelse til dette hotspot-login er ikke sikkert. Adgangskoder eller " +"anden information du indtaster på denne side, kan ses af personer i " +"nærheden." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Forbyd adgang" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Giv adgang" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Ofte brugte programmer vil blive vist her" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Ofte" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Alle" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Nyt vindue" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Start med dedikeret grafikkort" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Fjern fra favoritter" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Føj til favoritter" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Vis detaljer" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s er blevet føjet til dine favoritter." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s er blevet fjernet fra dine favoritter." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Vælg lydenhed" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Indstillinger for lyd" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Hovedtelefoner" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Headset" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Skift baggrund …" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Skærmindstillinger" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Indstillinger" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "O" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "L" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Forrige måned" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Næste måned" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Uge %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Hele dagen" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d. %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d. %B %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Ingen påmindelser" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Ingen begivenheder" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Ryd" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” svarer ikke." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Du kan vælge at vente et øjeblik på at det fortsætter eller tvinge " +"programmet til at lukke ned." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Tving lukning" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Vent" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Eksternt drev tilkoblet" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Eksternt drev frakoblet" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Åbn med %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Adgangskode:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Indtast igen:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Du kan også oprette forbindelse ved at trykke på “WPS”-knappen på din router." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Forbind" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Adgangskode: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Nøgle: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Privatnøgle-adgangskode: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identitet: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Tjeneste: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Godkendelse er påkrævet af trådløst netværk" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Adgangskoder eller krypteringsnøgler er påkrævet for at få adgang til det " +"trådløse netværk “%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Trådet 802.1X-godkendelse" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Netværksnavn: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL-godkendelse" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN-kode er påkrævet" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN-kode er nødvendig for den mobile bredbåndsenhed" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Adgangskode til mobilt bredbåndsnetværk" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Der kræves en adgangskode for at forbinde til “%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Netværkshåndtering" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Godkendelse er påkrævet" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Godkend" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Beklager, det fungerede ikke. Prøv igen." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s kalder sig nu %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Vinduer" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Vis programmer" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Favoritområde" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d. %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %-d. %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Tilføj verdensure …" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Verdensure" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Vejr" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Vælg en placering …" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Indlæser …" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Gå online for at se information om vejret" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Vejrinformation er ikke tilgængelig i øjeblikket" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Log %s ud" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Log ud" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s vil blive logget ud automatisk om %d sekund." +msgstr[1] "%s vil blive logget ud automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Du vil blive logget ud automatisk om %d sekund." +msgstr[1] "Du vil blive logget ud automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Log ud" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Sluk" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Installér opdateringer og sluk" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Systemet vil lukke ned automatisk om %d sekund." +msgstr[1] "Systemet vil lukke ned automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Installér ventende softwareopdateringer" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Genstart" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Sluk" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Genstart" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Systemet vil genstarte automatisk om %d sekund." +msgstr[1] "Systemet vil genstarte automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Genstart og installér opdateringer" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Systemet vil genstarte og installere opdateringer automatisk om %d sekund." +msgstr[1] "" +"Systemet vil genstarte og installere opdateringer automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Genstart og installér" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installér og sluk" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Sluk efter opdateringerne er installeret" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Genstart og installér opgradering" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s vil blive installeret efter genstart. Installering af opgradering kan " +"vare længe: Sikr dig, at du har sikkerhedskopier, og at computeren er " +"tilsluttet elnettet." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Kører på batteridrift: tilslut strøm før installation af opdateringer." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Nogen programmer er optagede eller indeholder arbejde, der ikke er gemt." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Andre brugere er logget ind." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (fjern)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsol)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Installér" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Hent og installér “%s” fra extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vil forhindre genveje" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Programmet vil forhindre genveje" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Du kan gendanne genveje ved at trykke %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Nægt" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Tillad" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Langsomme taster slået til" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Langsomme taster slået fra" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Du har lige holdt skift-tasten nede i otte sekunder. Dette er genvejen til " +"langsomme taster, som påvirker, hvordan dit tastatur virker." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Klæbetaster slået til" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Klæbetaster slået fra" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Du har lige trykket på skift-tasten fem gange i træk. Dette er genvejen til " +"klæbetaster, som påvirker, hvordan dit tastatur virker." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Du har lige trykket på to taster samtidigt eller trykket på skift-tasten fem " +"gange i træk. Dette slår klæbetaster fra, hvilket påvirker, hvordan dit " +"tastatur virker." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Lad være tændt" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Tænd" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Sluk" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Lad være slukket" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Indstillinger for område og sprog" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Ingen udvidelser er installeret" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s er ikke kommet med nogen fejl." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Skjul fejl" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Vis fejl" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Aktiveret" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Deaktiveret" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Fejl" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Udløbet" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Henter" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Vis kilde" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Webside" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Systeminformation" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Ukendt kunstner" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Ukendt titel" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Lydstyrke" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Fortryd" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Oversigt" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Skriv for at søge …" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Ny genvej …" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Program defineret" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Vis hjælp på skærmen" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Skift skærm" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Tildel tastekombination" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Færdig" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Redigér …" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Ingen" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Tryk på en knap for at konfigurere" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Tryk Esc for at afslutte" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Tryk en vilkårlig tast for at afslutte" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Afslut" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Aktiviteter" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "System" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Toppanel" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Indtast en kommando" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Luk" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Genstart er ikke tilgængelig på Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Genstarter …" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %-d. %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d ny besked" +msgstr[1] "%d nye beskeder" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ny påmindelse" +msgstr[1] "%d nye påmindelser" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Lås" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME er nødt til at låse skærmen" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Kunne ikke låse" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Lås blev blokeret af et program" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Søger …" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Ingen resultater." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d mere" +msgstr[1] "%d mere" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopiér" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Indsæt" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Vis tekst" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Skjul tekst" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Adgangskode" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Husk adgangskode" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Tilgængelighed" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zoom" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Skærmlæser" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Skærmtastatur" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Visuelle alarmer" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Klæbetaster" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Langsomme taster" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Hoppende taster" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Musetaster" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Høj kontrast" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Stor tekst" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Indstillinger for Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d forbundet" +msgstr[1] "%d forbundet" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Slukket" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Tændt" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Lysstyrke" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Tastatur" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Vis tastaturlayout" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Placering aktiveret" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Slå fra" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Indstillinger for privatliv" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Placering i brug" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Placering deaktiveret" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Slå til" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Giv %s adgang til din placering?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Placeringsadgang kan ændres når som helst via privatlivsindstillingerne." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s er slukket" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s er forbundet" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s er ikke håndteret" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s frakobler" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s forbinder" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s kræver godkendelse" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware mangler til %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s utilgængelig" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Forbindelse til %s mislykkedes" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Indstillinger for trådet netværk" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Indstillinger for mobilbredbånd" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Hardwaren %s er deaktiveret" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s er deaktiveret" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Forbind til internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Flytilstand er slået til" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Trådløs er deaktiveret når flytilstand er slået til." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Slå flytilstand fra" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Trådløs er slået fra" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Trådløs skal tændes for at kunne forbinde til et netværk." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Slå trådløs til" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Trådløse netværk" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Vælg et netværk" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Ingen netværk" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Brug hardwareknap til at slukke" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Vælg netværk" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Indstillinger for trådløs" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspottet %s er aktivt" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s er ikke forbundet" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "forbinder …" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "godkendelse er påkrævet" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "forbindelse mislykkedes" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Indstillinger for VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN slukket" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Netværksindstillinger" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s kablet forbindelse" +msgstr[1] "%s kablede forbindelser" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s trådløs forbindelse" +msgstr[1] "%s trådløse forbindelser" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemforbindelse" +msgstr[1] "%s modemforbindelser" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Forbindelse mislykkedes" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Aktivering af netværksforbindelse mislykkedes" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Nattelys deaktiveret" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Nattelys tændt" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Genoptag" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Deaktivér indtil i morgen" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Indstillinger for strømstyring" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Fuldt opladet" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Oplader ikke" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Udregner …" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d tilbage (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d indtil fuld (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Skærmen er delt" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Sluk" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Flytilstand er slået til" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Skift bruger" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Log ud" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Indstillinger for konti" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Orienteringslås" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Hviletilstand" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Sluk" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Ukendt Thunderbolt-enhed" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"En ny enhed blev fundet, mens du var væk. Frakobl og tilkobl enheden igen " +"for at kunne bruge den." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Ikkegodkendt Thunderbolt-enhed" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Ny enhed er fundet og skal godkendes af en administrator." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt-godkendelsesfejl" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Kunne ikke godkende Thunderbolt-enheden: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Lydstyrke ændret" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Filspejl" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Sammenføj skærme" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Kun ekstern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Kun indbygget" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Log ind som en anden bruger" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Lås vindue op" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Programmer" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Søg" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” er klar" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Vil du beholde disse skærmindstillinger?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Forkast indstillinger" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Behold ændringer" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Indstillingsændringer vil forkastes om %d sekund" +msgstr[1] "Indstillingsændringer vil forkastes om %d sekunder" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimér" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Afmaksimér" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maksimér" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Flyt" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Ændr størrelse" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Flyt titellinjen på skærmen" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Altid øverst" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Altid på synligt arbejdsområde" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Flyt til venstre arbejdsområde" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Flyt til højre arbejdsområde" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Flyt til arbejdsområdet ovenover" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Flyt til arbejdsområdet nedenunder" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Flyt til skærmen ovenover" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Flyt til skærmen nedenunder" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Flyt til venstre skærm" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Flyt til højre skærm" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution kalender" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Udskriv version" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Tilstand brugt af GDM til indlogningsskærm" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Brug en specifik tilstand, f.eks. “gdm” til indlogningsskærm" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Vis mulige tilstande" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Ukendt" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Kunne ikke køre “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Adgangskoder er ikke ens." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Adgangskode må ikke være tom" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Godkendelsesdialogen blev afvist af brugeren" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u output" +msgstr[1] "%u outputs" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u input" +msgstr[1] "%u inputs" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Systemlyde" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Der opstod in fejl ved indlæsning af indstillingsdialogen for %s:" + +#~ msgid "%s all day." +#~ msgstr "%s hele dagen." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, derefter %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, derefter %s, efterfulgt af %s." + +#~ msgid "Feels like %s." +#~ msgstr "Føles som %s." + +#~| msgid "Power Off" +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Sluk" + +#~| msgid "Log Out" +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Log ud" + +#~| msgid "Switch User" +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Skift bruger" + +#~ msgid "Hide tray" +#~ msgstr "Skjul statusfelt" + +#~ msgid "Status Icons" +#~ msgstr "Statusikoner" + +#~ msgid "Events" +#~ msgstr "Begivenheder" + +#~ msgid "Notifications" +#~ msgstr "Beskeder" + +#~ msgid "Clear section" +#~ msgstr "Ryd afsnit" + +#~ msgid "Media" +#~ msgstr "Medier" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Udvidelsesmodulindstillinger for GNOME Shell" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Omdirigering af webgodkendelse" + +#~ msgid "Not In Use" +#~ msgstr "Ikke i brug" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Vis ugenummer i kalenderen" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Hvis sand vises ISO-ugenummeret i kalenderen." + +#~ msgid "Use as Internet connection" +#~ msgstr "Brug som internetforbindelse" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s spørger efter adgang til din placering." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (wayland-sammensætter)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d forbundet enhed" +#~ msgstr[1] "%d forbundne enheder" + +#~ msgid "Authentication required" +#~ msgstr "Godkendelse påkrævet" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Batteri" + +#~ msgid "Airplane Mode" +#~ msgstr "Flytilstand" + +#~ msgid "Show the message tray" +#~ msgstr "Vis besked-statusfeltet" + +#~ msgid "Captive Portal" +#~ msgstr "Fangeportal" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "S" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "M" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Ti" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "O" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "To" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "F" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "L" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Intet planlagt" + +#~ msgid "Today" +#~ msgstr "I dag" + +#~ msgid "Tomorrow" +#~ msgstr "I morgen" + +#~ msgid "This week" +#~ msgstr "Denne uge" + +#~ msgid "Next week" +#~ msgstr "Næste uge" + +#~ msgid "Removable Devices" +#~ msgstr "Flytbare enheder" + +#~ msgid "Eject" +#~ msgstr "Skub ud" + +#~ msgid "Invitation" +#~ msgstr "Invitation" + +#~ msgid "Call" +#~ msgstr "Opkald" + +#~ msgid "File Transfer" +#~ msgstr "Filoverførsel" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "Unmute" +#~ msgstr "Slå lyd til" + +#~ msgid "Mute" +#~ msgstr "Slå lyd fra" + +#~ msgid "Invitation to %s" +#~ msgstr "Invitation til %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s inviterer dig til at deltage i %s" + +#~ msgid "Decline" +#~ msgstr "Afvis" + +#~ msgid "Accept" +#~ msgstr "Acceptér" + +#~ msgid "Video call from %s" +#~ msgstr "Videoopkald fra %s" + +#~ msgid "Call from %s" +#~ msgstr "Opkald fra %s" + +#~ msgid "Answer" +#~ msgstr "Svar" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s sender dig %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s vil gerne have tilladelse til at se, når du er online" + +#~ msgid "Authentication failed" +#~ msgstr "Godkendelse mislykkedes" + +#~ msgid "Encryption error" +#~ msgstr "Krypteringsfejl" + +#~ msgid "Certificate not provided" +#~ msgstr "Certifikat ikke angivet" + +#~ msgid "Certificate untrusted" +#~ msgstr "Utroværdigt certifikat" + +#~ msgid "Certificate expired" +#~ msgstr "Certifikat udløbet" + +#~ msgid "Certificate not activated" +#~ msgstr "Certifikat ikke aktiveret" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Certifikat-værtsnavn stemmer ikke" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Certifikat-fingeraftryk stemmer ikke" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certifikat selv-underskrevet" + +#~ msgid "Status is set to offline" +#~ msgstr "Status er angivet til offline" + +#~ msgid "Certificate is invalid" +#~ msgstr "Ugyldigt certifikat" + +#~ msgid "Connection has been refused" +#~ msgstr "Forbindelse er blevet afvist" + +#~ msgid "Connection can't be established" +#~ msgstr "Forbindelse kan ikke oprettes" + +#~ msgid "Connection has been lost" +#~ msgstr "Forbindelse er mistet" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Denne konto er allerede forbundet til serveren" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "Forbindelsen er blevet erstattet af en ny forbindelse, som bruger samme " +#~ "ressource" + +#~ msgid "The account already exists on the server" +#~ msgstr "Kontoen findes allerede på serveren" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Serveren er i øjeblikket for travl til at behandle forbindelsen" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Certifikat er blevet påberåbt" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Certifikat bruger en usikker cipher-algoritme eller er kryptografisk svag" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Længden på servercertifikatet, eller dybden af servercertifikat-kæden, " +#~ "overskrider grænsen, som er fastsat af det kryptografiske-programbibliotek" + +#~ msgid "Internal error" +#~ msgstr "Intern fejl" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Kunne ikke forbinde til %s" + +#~ msgid "View account" +#~ msgstr "Vis konto" + +#~ msgid "Open Calendar" +#~ msgstr "Åbn kalender" + +#~ msgid "Date & Time Settings" +#~ msgstr "Indstillinger for dato og tid" + +#~ msgid "Open" +#~ msgstr "Åbn" + +#~ msgid "Remove" +#~ msgstr "Fjern" + +#~ msgid "Clear Messages" +#~ msgstr "Ryd beskeder" + +#~ msgid "Notification Settings" +#~ msgstr "Indstillinger for påmindelser" + +#~ msgid "Tray Menu" +#~ msgstr "Menu for statusfelt" + +#~ msgid "No Messages" +#~ msgstr "Ingen beskeder" + +#~ msgid "Message Tray" +#~ msgstr "Besked-statusfelt" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Det maksimale nøjagtighedsniveau for placering." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Konfigurerer det maksimale nøjagtighedsniveau for placering, som det er " +#~ "tilladt programmer at se. Mulighederne er “off” (deaktivér sporing), " +#~ "“country”, “city”, “neighborhood”, “street” og “exact” (kræver typisk GPS-" +#~ "modtager). Bemærk at dette kun styrer hvad GeoClue vil tillade " +#~ "programmerne at se - disse kan selv finde brugerens placering ved brug af " +#~ "netværksressourcer (dog højst ned til gadepræcision)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Placering af knapper i titel-linjen" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Denne nøgle overstyrer nøglen i org.gnome.desktop.wm.preferences, når du " +#~ "kører GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Udvidelse" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Vælg en udvidelse at konfigurere ved hjælp af kombinationsboksen ovenfor." + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "unavailable" +#~ msgstr "utilgængelig" + +# Dette her er kode for at skrive måned før år jvf. kommentar for samme streng i gtk+: +# +# Translate to calendar:YM if you want years to be displayed +# before months; otherwise translate to calendar:MY. +# Do *not* translate it to anything else, if it +# it isn't calendar:YM or calendar:MY it will not work. +# +# Note that the ordering described here is logical order, which is +# further influenced by BIDI ordering. Thus, if you have a default +# text direction of RTL and specify "calendar:YM", then the year +# will appear to the right of the month. +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Liste over kategorier, som skal vises som mapper" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Hvert kategorinavn i denne liste vil blive repræsenteret som mappe i " +#~ "programoversigten, i stedet for at blive vist inden i hovedoversigten." + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d. %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d. %B %Y, %H:%M " + +#~ msgid "Authorization request from %s" +#~ msgstr "Godkendelsesforespørgsel fra %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Enheden %s ønsker at blive parret med denne computer" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Enheden %s ønsker adgang til tjenesten “%s”" + +#~ msgid "Grant this time only" +#~ msgstr "Giv kun lov denne gang" + +#~ msgid "Reject" +#~ msgstr "Afvis" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Bekræftelse af parring for %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Bekræft om adgangsnøglen “%06d” stemmer overens med den, som vises på " +#~ "enheden." + +#~ msgid "Matches" +#~ msgstr "Stemmer" + +#~ msgid "Does not match" +#~ msgstr "Stemmer ikke" + +#~ msgid "Pairing request for %s" +#~ msgstr "Forespørgsel om parring for %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Indtast PIN-koden nævnt på enheden." + +#~ msgid "OK" +#~ msgstr "O.k." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Beklager, ingen visdom til dig i dag:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Oraklet %s siger" + +#~ msgid "Settings Menu" +#~ msgstr "Menu for indstillinger" + +#~ msgid "Screenshots" +#~ msgstr "Skærmbilleder" + +#~ msgid "Record a screencast" +#~ msgstr "Optag en skærmoptagelse" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Om der skal indsamles statistik om programmers brug" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "Shell'ens overvåger normalt aktive programmer for at kunne vise de mest " +#~ "brugte (f.eks. i genveje). Selvom disse data er holdt private, vil du " +#~ "muligvis ønske at deaktivere dem af private grunde. Bemærk at selvom du " +#~ "gør dette, vil det ikke fjerne de allerede gemte data." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Brugt internt til at gemme den seneste IM-tilstedeværelse angivet direkte " +#~ "af brugeren. Værdien er fra tællingen TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Brugt internt til at gemme den seneste tilstand for " +#~ "sessionstilstedeværelse for brugeren. Værdien her er fra tællingen " +#~ "GsmPresenceStatus." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Genvejstast til at slå skærmoptager til eller fra" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Genvejstast til at starte/stoppe den indbyggede skærmoptager." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Billedfrekvens brugt til skærmoptagelser." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Billedfrekvensen på den endelige skærmoptagelse, optaget af GNOME-Shells " +#~ "skærmoptager i billeder-per-sekund." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "Datakanalen for Gstreamer bruges til indkodning af skærmoptagelsen" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Angiver datakanalen for GStreamer som bruges til at indkode optagelser. " +#~ "Dette følger syntaksen brugt af gst-launch. Datakanalen bør have et " +#~ "afkoblet sink-område hvor den optagede video gemmes. Den vil sædvanligvis " +#~ "have et afkoblet kildeområde; outputtet fra det område vil blive skrevet " +#~ "til outputfilen. Dog kan datakanalen også tage sig af sit eget output - " +#~ "dette kan bruges til at sende outputtet til en icecast-server via " +#~ "shout2send eller lignende. Når der ændres til en tom værdi, vil " +#~ "standarddatakanalen blive brugt. Dette er i øjeblikket “vp8enc " +#~ "min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=" +#~ "%T ! queue ! webmmux” og optager i WEBM-formatet med VP8-codec'et. %T " +#~ "bruges som pladsholder for et gæt om det optimale trådantal på systemet." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Filendelse til at gemme skærmoptagelser" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Filnavnet på skærmoptagelser vil være et unikt filnavn baseret på dags " +#~ "dato og bruge denne endelse. Det skal ændres når der optages i et andet " +#~ "containerformat." + +#~ msgid "Session…" +#~ msgstr "Session …" + +#~ msgid "Power" +#~ msgstr "Strøm" + +#~ msgid "Restart" +#~ msgstr "Genstart" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Skærmoptagelse fra %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Tryk Log ud for at afslutte disse programmer og logge ud af systemet." + +#~ msgid "Logging out of the system." +#~ msgstr "Logger ud af systemet." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "Tryk Sluk for at afslutte disse programmer og lukke systemet ned." + +#~ msgid "Powering off the system." +#~ msgstr "Lukker systemet ned." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Tryk Genstart for at afslutte disse programmer og genstarte systemet." + +#~ msgid "Restarting the system." +#~ msgstr "Genstarter systemet." + +#~ msgid "Universal Access Settings" +#~ msgstr "Indstillinger for universel adgang" + +#~ msgid "Visibility" +#~ msgstr "Synlighed" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Indstil en ny enhed …" + +#~ msgid "Send Files…" +#~ msgstr "Send filer …" + +#~ msgid "Keyboard Settings" +#~ msgstr "Indstillinger for tastatur" + +#~ msgid "Mouse Settings" +#~ msgstr "Indstillinger for mus" + +#~ msgid "Volume, network, battery" +#~ msgstr "Lydniveau, netværk, batteri" + +#~ msgid "disabled" +#~ msgstr "deaktiveret" + +#~ msgid "cable unplugged" +#~ msgstr "kabel er ikke sat i" + +#~ msgid "More…" +#~ msgstr "Flere …" + +#~ msgid "Wired" +#~ msgstr "Trådet" + +#~ msgid "Auto Ethernet" +#~ msgstr "Auto ethernet" + +#~ msgid "Auto broadband" +#~ msgstr "Auto bredbånd" + +#~ msgid "Auto dial-up" +#~ msgstr "Auto opringning" + +#~ msgid "Auto %s" +#~ msgstr "Auto %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Auto bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Auto trådløs" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d time tilbage" +#~ msgstr[1] "%d timer tilbage" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s tilbage" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "time" +#~ msgstr[1] "timer" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minut" +#~ msgstr[1] "minutter" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d minut tilbage" +#~ msgstr[1] "%d minutter tilbage" + +#~ msgid "AC Adapter" +#~ msgstr "AC-adapter" + +#~ msgid "Laptop Battery" +#~ msgstr "Batteri" + +#~ msgid "Monitor" +#~ msgstr "Skærm" + +#~ msgid "Mouse" +#~ msgstr "Mus" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "Mobiltelefon" + +#~ msgid "Media Player" +#~ msgstr "Medieafspiller" + +#~ msgid "Tablet" +#~ msgstr "Tavle-pc" + +#~ msgid "Computer" +#~ msgstr "Computer" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Ukendt" + +#~ msgid "Available" +#~ msgstr "Tilgængelig" + +#~ msgid "Busy" +#~ msgstr "Optaget" + +#~ msgid "Invisible" +#~ msgstr "Usynlig" + +#~ msgid "Away" +#~ msgstr "Ikke tilstede" + +#~ msgid "Idle" +#~ msgstr "Tomgang" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Din chat-status vil blive angivet som optaget" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Meddelelser er nu deaktiveret, inklusiv chat-beskeder. Din online-status " +#~ "er blevet justeret, for at fortælle andre, at du muligvis ikke ser deres " +#~ "beskeder." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Nedlukning kan resultere i tab af arbejde, som ikke er gemt." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Log ind" + +#~ msgid "APPLICATIONS" +#~ msgstr "PROGRAMMER" + +#~ msgid "SETTINGS" +#~ msgstr "INDSTILLINGER" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Subscription request" +#~ msgstr "Godkendelsesforespørgsel" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Sendt %A kl. %H:%M" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Sendt %A den %e. %B, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Forbindelse til %s mislykkedes" + +#~ msgid "Reconnect" +#~ msgstr "Forbind igen" + +#~ msgid "tray" +#~ msgstr "statusfelt" + +#~ msgid "Browse Files..." +#~ msgstr "Gennemse filer …" + +#~ msgid "Error browsing device" +#~ msgstr "Fejl under læsning af enhed" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Den forespurgte enhed kan ikke læses, fejlen er “%s”" + +#~ msgid "More..." +#~ msgstr "Mere …" + +#~ msgid "Wireless" +#~ msgstr "Trådløs" + +#~ msgid "VPN Connections" +#~ msgstr "VPN-forbindelser" + +#~ msgid "System Settings" +#~ msgstr "Systemindstillinger" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Dit yndlingspåskeæg" + +#~ msgid "United Kingdom" +#~ msgstr "Storbritannien" + +#~ msgid "Default" +#~ msgstr "Standard" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Kunne ikke afmontere “%s”" + +#~ msgid "Retry" +#~ msgstr "Forsøg igen" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "STEDER & ENHEDER" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "deaktiverede OpenSearch-udbydere" + +#~ msgid "Show time with seconds" +#~ msgstr "Vis tid med sekunder" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Hvis sand vises sekunder i klokkeslæt." + +#~ msgid "Show date in clock" +#~ msgstr "Vis dato i uret" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Hvis sand vises datoen i uret, som tillæg til tiden." + +#~ msgid "CONTACTS" +#~ msgstr "KONTAKTER" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e. %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e. %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e. %b, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Connect to..." +#~ msgstr "Forbind til …" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Forkert adgangskode, forsøg venligst igen" + +#~ msgid "%s is online." +#~ msgstr "%s er online." + +#~ msgid "%s is offline." +#~ msgstr "%s er offline." + +#~ msgid "%s is away." +#~ msgstr "%s er ikke til stede." + +#~ msgid "%s is busy." +#~ msgstr "%s er optaget." + +#~ msgid "Hidden" +#~ msgstr "Skjult" + +#~ msgid "Power Off..." +#~ msgstr "Sluk …" + +#~ msgid "Online Accounts" +#~ msgstr "Online konti" + +#~ msgid "Log Out..." +#~ msgstr "Log ud …" + +#~ msgid "RECENT ITEMS" +#~ msgstr "SENESTE ELEMENTER" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. disabled-extensions overrides this setting for " +#~ "extensions that appear in both lists." +#~ msgstr "" +#~ "GNOME-skallens udvidelser har en uuid-indstilling; denne nøgle oplister " +#~ "udvidelser som ikke skal indlæses. disabled-extensions overskriver denne " +#~ "indstilling for udvidelser, som vises i begge lister." + +#~ msgid "Show password" +#~ msgstr "Vis adgangskode" + +#~ msgid "%s has finished starting" +#~ msgstr "%s er færdig med at starte" + +#~ msgid "Home Folder" +#~ msgstr "Hjemmemappe" + +#~ msgid "If true, display onscreen keyboard." +#~ msgstr "Hvis sand vises skærmtastatur." + +#~ msgid "Connectivity lost" +#~ msgstr "Forbindelse mistet" + +#~ msgid "You're no longer connected to the network" +#~ msgstr "Du er ikke længere forbundet til netværket" + +#~ msgid "Uuids of extensions to disable" +#~ msgstr "Uuid'er for udvidelser der deaktiveres" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "Du er nu forbundet til den mobile bredbåndsforbindelse “%s”" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "Du er nu forbundet til det trådløse netværk “%s”" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "Du er nu forbundet til VPN-netværket “%s”" + +#~ msgid "Localization Settings" +#~ msgstr "Indstillinger for sprog" + +#~ msgid "Less than a minute ago" +#~ msgstr "Mindre end et minut siden" + +#~ msgid "Shut Down" +#~ msgstr "Luk ned" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "" +#~ "Tryk Luk ned for at afslutte disse programmer og lukke systemet ned." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "System lukker automatisk ned om %d sekunder." + +#~ msgid "Shutting down the system." +#~ msgstr "Lukker systemet ned." + +#~ msgid "Confirm" +#~ msgstr "Bekræft" + +#~ msgid "PREFERENCES" +#~ msgstr "INDSTILLINGER" + +#~ msgid "Drag here to add favorites" +#~ msgstr "Træk hertil for at tilføje til favoritter" + +#~ msgid "Find..." +#~ msgstr "Find …" + +#~ msgid "Sidebar" +#~ msgstr "Sidebjælke" + +#~ msgid "System Preferences..." +#~ msgstr "Systemindstillinger …" + +#~ msgid "Recent Documents" +#~ msgstr "Seneste dokumenter" + +#~ msgid "(see all)" +#~ msgstr "(se alle)" + +#~ msgid "PLACES" +#~ msgstr "STEDER" + +#~ msgid "SEARCH RESULTS" +#~ msgstr "SØGERESULTATER" + +#~ msgid "Can't lock screen: %s" +#~ msgstr "Kan ikke låse skærm: %s" + +#~ msgid "Can't temporarily set screensaver to blank screen: %s" +#~ msgstr "Kan ikke midlertidigt sætte pauseskærm til blank skærm: %s" + +#~ msgid "Can't logout: %s" +#~ msgstr "Kan ikke logge ud: %s" + +#~ msgid "Browse" +#~ msgstr "Gennemse" + +#~ msgid "Find apps or documents" +#~ msgstr "Find programmer eller dokumenter" + +#~ msgid "The user manager object this user is controlled by." +#~ msgstr "Brugerhåndteringsobjektet, denne bruger er styret af." diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..437a483 --- /dev/null +++ b/po/de.po @@ -0,0 +1,2330 @@ +# German gnome-shell translation. +# Copyright (C) 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# +# workspace - Arbeitsfläche +# +# Hendrik Brandt , 2009. +# Hendrik Richter , 2009-2011. +# Mario Blättermann , 2009-2013, 2015-2018. +# Mario Klug , 2010. +# Jakob Kramer , 2010. +# Paul Seyfert , 2010-2011. +# Wolfgang Stöggl , 2012, 2014, 2017-2018. +# Christian Kirbach , 2009-2013. +# Tobias Endrigkeit , 2012-2013. +# Benjamin Steinwender , 2013-2014. +# Bernd Homuth , 2014-2015, 2016, 2019. +# Franco Della-Monica , 2016. +# Tim Sabsch , 2018-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-05-08 10:16+0000\n" +"PO-Revision-Date: 2019-05-12 12:36+0200\n" +"Last-Translator: Tim Sabsch \n" +"Language-Team: Deutsch \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.2.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "System" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Benachrichtigungsliste anzeigen" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Auf aktive Benachrichtigungen ausrichten" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Die Übersicht anzeigen" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Alle Anwendungen anzeigen" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Das Anwendungsmenü öffnen" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell-Erweiterungen" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME-Shell-Erweiterungen einrichten" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME-Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Fenster verwalten und Anwendungen starten" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Interne Werkzeuge für Entwickler und Tester mit Alt+F2 einschalten" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "Erlaubt Zugriff auf interne Fehlerdiagnose- und Überwachungswerkzeuge" + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs der zu aktivierenden Erweiterungen" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Die Erweiterungen der GNOME-Shell besitzen eine UUID-Eigenschaft. Dieser " +"Schlüssel listet Erweiterungen auf, welche geladen werden sollen. Jede zu " +"ladende Erweiterung muss in dieser Liste erscheinen. Sie können diese Liste " +"auch mit den D-Bus-Methoden EnableExtension und DisableExtension in org." +"gnome.Shell bearbeiten." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Shell-Erweiterungen deaktivieren" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Alle Shell-Erweiterungen, die der Benutzer aktiviert hat, deaktivieren. " +"Beeinflusst nicht die Einstellung »enabled-extension«." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" +"Legt fest, ob die Überprüfung der Versionskompatibilität der Erweiterung " +"deaktiviert werden soll" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME-Shell lädt nur Erweiterungen, die die aktuelle Version unterstützen. " +"Durch Einschalten dieser Option wird die interne Kompatibilitätsprüfung " +"deaktiviert und alle Erweiterungen werden versucht zu laden, unabhängig von " +"der Version, die die Erweiterung offiziell unterstützt." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Liste von Desktop-Dateikennungen und deren bevorzugte Anwendungen" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programme, welche auf diese Bezeichner zutreffen, werden im Favoriten-" +"Bereich angezeigt." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Anwendungsauswahlanzeige" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Index der aktuell gewählten Ansicht in der Anwendungsauswahl." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Verlauf des Befehlsdialogs (Alt+F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Chronik des Dialogs »looking glass«" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Immer den Eintrag »Abmelden« im Benutzermenü anzeigen." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Dieser Schlüssel überschreibt das automatische Verbergen des Menüeintrags " +"»Abmelden« in Einzelbenutzer, Einzelsitzungssituationen." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Legt fest, ob Passwörter für eingehängte, verschlüsselte oder entfernte " +"Dateisysteme gespeichert werden" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Die Shell wird ein Passwort anfragen, sobald ein verschlüsseltes Gerät oder " +"ein entferntes Dateisystem eingehängt wird. Falls das Passwort für die " +"Zukunft gespeichert werden kann, wird ein Ankreuzfeld »An Passwort erinnern« " +"angeboten. Dieser Schlüssel stellt den Standardstatus für dieses Ankreuzfeld " +"ein." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Legt fest, ob der Standard-Bluetooth-Adapter zugeordnete Geräte hat" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Die Shell zeigt nur dann ein Bluetooth-Menü an, wenn ein Bluetooth-Adapter " +"betriebsbereit ist, oder wenn dem Standard-Bluetooth-Adapter in der " +"Vergangenheit Geräte zugeordnet waren. Sollte keine Gerätezuordnung mehr " +"vorhanden sein, so wird das Menü ausgeblendet." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Introspection-API aktivieren" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Aktiviert eine D_Bus-API, die Einblicke in den Anwendungsstatus der Shell " +"gewährt." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Tastenkombination zum Öffnen der »Anwendungen anzeigen«-Ansicht" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Tastenkombination zum Öffnen der »Anwendungen anzeigen«-Ansicht der " +"Aktivitätenübersicht." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Tastenkombination zum Öffnen der Übersicht" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Tastenkombination zum Öffnen der »Aktivitäten«-Übersicht" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Tastenkombination zum Umschalten der Sichtbarkeit der Benachrichtigungsliste" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Tastenkombination zum Umschalten der Sichtbarkeit der Benachrichtigungsliste." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Tastenkombination, die alle laufenden Zwischenbilder anhält und fortsetzt. " +"Zur Fehlerdiagnose." + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Zu Anwendung 1 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Zu Anwendung 2 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Zu Anwendung 3 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Zu Anwendung 4 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Zu Anwendung 5 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Zu Anwendung 6 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Zu Anwendung 7 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Zu Anwendung 8 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Zu Anwendung 9 wechseln" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Zu verwendende Tastatur" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Der Typ der zu verwendenden Tastatur" + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Fensterwechsler auf aktuelle Arbeitsfläche einschränken." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Legt fest, ob nur Anwendungen im Fensterwechsler aufgeführt werden, die " +"Fenster auf der aktuellen Arbeitsfläche haben. Andernfalls sind alle " +"Anwendungen enthalten." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Der Modus der Anwendungssymbole." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Legt fest, wie Fenster im Fensterwechsler dargestellt werden. Mögliche Werte " +"sind »thumbnail-only« (Vorschaubilder der Fenster werden angezeigt), »app-" +"icon-only« (Nur das Anwendungssymbol wird angezeigt) oder »both« (beides)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Legt fest, ob Fenster der aktuellen Arbeitsfläche im Fensterwechsler " +"aufgeführt werden. Andernfalls sind alle Fenster enthalten." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Modalen Dialog an übergeordnetes Fenster binden" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Dieser Schlüssel überschreibt den Schlüssel in org.gnome.mutter, wenn die " +"GNOME-Shell läuft." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Größenanpassung einschalten, wenn ein Fenster an die Bildschirmkante " +"verschoben wird" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Arbeitsflächen dynamisch verwalten" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Arbeitsflächen nur auf dem primären Bildschirm" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Fokuswechsel im Mausmodus verzögern, bis sich der Zeiger nicht mehr bewegt" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Netzwerkanmeldung" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Etwas ist schiefgelaufen" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Es tut uns leid, aber es gibt ein Problem: Die Einstellungen für diese " +"Erweiterung können nicht angezeigt werden. Wir empfehlen, dass Sie diesen " +"Fehler den Autoren der Erweiterung melden." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Technische Details" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Fehler kopieren" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Homepage" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Webseite der Erweiterung besuchen" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Keine Erweiterungen installiert" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Erweiterungen können mit »Software« oder über extensions.gnome.org installiert werden." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "»Software« durchsuchen" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Abbrechen" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Weiter" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Entsperren" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Anmelden" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Sitzung wählen" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Nicht aufgeführt?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(z.B. Benutzer oder %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Benutzername: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Anmeldefenster" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Anmeldung fehlgeschlagen" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(oder wischen Sie mit einem Finger)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Ausschalten" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "ausschalten;herunterfahren;neustarten" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Bildschirm sperren" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "Bildschirm sperren" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Abmelden" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "abmelden;verlassen" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Bereitschaft" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "Bereitschaft;Schlafen" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Benutzer wechseln" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "Benutzer wechseln" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +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:126 +msgid "lock orientation;screen;rotation" +msgstr "Hochformat;Querformat;sperren;Bildschirm;Drehung;drehen" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Befehl nicht gefunden" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Befehl konnte nicht verarbeitet werden:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Ausführung von »%s« ist gescheitert:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Gerade eben" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "vor %d Minute" +msgstr[1] "vor %d Minuten" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "vor %d Stunde" +msgstr[1] "vor %d Stunden" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Gestern" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "vor %d Tag" +msgstr[1] "vor %d Tagen" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "vor %d Woche" +msgstr[1] "vor %d Wochen" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "vor %d Monat" +msgstr[1] "vor %d Monaten" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "vor %d Jahr" +msgstr[1] "vor %d Jahren" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Gestern, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%e. %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%e. %B %Y, %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Gestern, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%e. %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%e. %B %Y, %l:%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Hotspot-Anmeldung" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Ihre Verbindung zum Anmeldefenster dieses Hotspots ist nicht sicher. " +"Passwörter oder andere Daten, die Sie auf dieser Seite eingeben, können von " +"anderen in unmittelbarer Umgebung ausgelesen werden." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Zugriff verhindern" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Zugriff gewähren" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Häufig genutzte Anwendungen erscheinen hier" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Häufig" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Alle" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Neues Fenster" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Mit dedizierter Grafikkarte starten" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Aus Favoriten entfernen" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Zu Favoriten hinzufügen" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Details anzeigen" + +#: js/ui/appFavorites.js:149 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s wurde zu Ihren Favoriten hinzugefügt" + +#: js/ui/appFavorites.js:183 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s wurde aus Ihren Favoriten entfernt" + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Audio-Gerät wählen" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Klangeinstellungen" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Kopfhörer" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Headset" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Hintergrund ändern …" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Anzeigeeinstellungen" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Einstellungen" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Vorheriger Monat" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Nächster Monat" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Ganztägig" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %d. %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %d. %B %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Keine Benachrichtigungen" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Keine Termine" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Leeren" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "»%s« antwortet nicht." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Sie können der Anwendung noch etwas Zeit geben oder ein sofortiges Beenden " +"erzwingen." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Beenden erzwingen" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Warten" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Externes Laufwerk verbunden" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Externes Laufwerk getrennt" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Öffnen mit %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Passwort:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Erneut eingeben:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Alternativ können Sie sich verbinden, indem Sie den »WPS«-Knopf an Ihrem " +"Router drücken." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Verbinden" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Passwort: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Schlüssel: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Passwort für geheimen Schlüssel: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identität: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Dienst: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Anmeldung für Drahtlosnetzwerk wird benötigt" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Passwörter oder Schlüssel sind erforderlich, um auf das Drahtlosnetzwerk " +"»%s« zuzugreifen." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Kabelgebundene 802.1X-Anmeldung" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Netzwerkname: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL-Anmeldung" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN-Code ist erforderlich" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Für das mobile Breitbandgerät wird ein PIN-Code benötigt." + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Passwort der mobilen Breitbandverbindung" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, 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:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Netzwerk-Verwaltung" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Anmeldung erforderlich" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Systemverwalter" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Anmelden" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "" +"Entschuldigung, das hat nicht funktioniert. Bitte versuchen Sie es erneut." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s heißt jetzt %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Fenster" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +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:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%e. %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %e. %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Weltuhren hinzufügen …" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Weltuhren" + +#: js/ui/dateMenu.js:228 +msgid "Weather" +msgstr "Wetter" + +#: js/ui/dateMenu.js:311 +msgid "Select a location…" +msgstr "Ort auswählen …" + +#: js/ui/dateMenu.js:319 +msgid "Loading…" +msgstr "Wird geladen …" + +#: js/ui/dateMenu.js:329 +msgid "Go online for weather information" +msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können" + +#: js/ui/dateMenu.js:331 +msgid "Weather information is currently unavailable" +msgstr "Wetterinformationen sind momentan nicht verfügbar" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s abmelden" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Abmelden" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s wird automatisch in %d Sekunde abgemeldet." +msgstr[1] "%s wird automatisch in %d Sekunden abgemeldet." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Sie werden automatisch in %d Sekunde abgemeldet." +msgstr[1] "Sie werden automatisch in %d Sekunden abgemeldet." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Abmelden" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Ausschalten" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Aktualisierungen installieren und ausschalten" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Das System schaltet sich automatisch in %d Sekunde ab." +msgstr[1] "Das System schaltet sich automatisch in %d Sekunden ab." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Ausstehende Softwareaktualisierungen installieren" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Neu starten" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Ausschalten" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Neu starten" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Das System wird automatisch in %d Sekunde neu gestartet." +msgstr[1] "Das System wird automatisch in %d Sekunden neu gestartet." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Neu starten und Aktualisierungen installieren" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Das System wird automatisch in %d Sekunde neu gestartet und aktualisiert." +msgstr[1] "" +"Das System wird automatisch in %d Sekunden neu gestartet und aktualisiert." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Neu starten und installieren" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installieren und ausschalten" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Ausschalten nachdem Aktualisierungen installiert wurden" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Neu starten und Aktualisierung installieren" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s wird nach dem Neustart installiert, was möglicherweise viel Zeit " +"beanspruchen kann. Vergewissern Sie sich, zuvor eine Sicherungskopie des " +"Systems erstellt zu haben und dass eine zuverlässige Stromzufuhr besteht." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Akkubetrieb: Bitte schließen Sie Ihr Gerät an das Stromnetz an, bevor Sie " +"Aktualisierungen installieren." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Einige Anwendungen sind beschäftigt oder haben ungesicherte Änderungen." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Andere Benutzer sind angemeldet." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (Entfernt)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (Konsole)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Installieren" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "»%s« von extensions.gnome.org herunterladen und installieren?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s möchte Tastenkombinationen sperren" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "Die Anwendung möchte Tastenkombinationen sperren" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Sie können Tastenkombinationen durch Drücken von %s wiederherstellen." + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "Ablehnen" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "Zulassen" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Tastenverzögerung eingeschaltet" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Tastenverzögerung ausgeschaltet" + +#: js/ui/kbdA11yDialog.js:33 +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:40 +msgid "Sticky Keys Turned On" +msgstr "Einrastfunktion eingeschaltet" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Einrastfunktion ausgeschaltet" + +#: js/ui/kbdA11yDialog.js:43 +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:45 +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:57 +msgid "Leave On" +msgstr "Eingeschaltet lassen" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Einschalten" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Ausschalten" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Ausgeschaltet lassen" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "Regions- und Spracheinstellungen" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Keine Erweiterungen installiert" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s hat keine Fehler ausgegeben." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Fehler verbergen" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Fehler anzeigen" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Eingeschaltet" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Ausgeschaltet" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Fehler" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Veraltet" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Herunterladen" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Quelle zeigen" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Webseite" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Systeminformationen" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Unbekannter Künstler" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Unbekannter Titel" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Lautstärke" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Rückgängig" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Übersicht" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Suchbegriff eingeben …" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Neue Tastenkombination …" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Anwendung festgelegt" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Bildschirmhilfe anzeigen" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Bildschirm wechseln" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Tastenkombination zuweisen" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Erledigt" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Bearbeiten …" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Keine" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Klicken Sie auf einen Knopf zum Einrichten" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Drücken Sie Esc zum Abbrechen." + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Drücken Sie eine beliebige Taste zum Beenden" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Beenden" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:470 +msgid "Activities" +msgstr "Aktivitäten" + +#: js/ui/panel.js:745 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "System" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "Oberes Panel" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Bitte geben Sie einen Befehl ein" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Schließen" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Neu Starten ist unter Wayland nicht verfügbar" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Neustart …" + +# %A - ausgeschriebener Name des Wochentages, abhängig von der gesetzten Umgebung +# %d - Tag des Monats als Zahl (Bereich 01 bis 31) +# %B - ausgeschriebener Name des Monats, abhängig von der gesetzten Umgebung +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d neue Nachricht" +msgstr[1] "%d neue Nachrichten" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d neue Benachrichtigung" +msgstr[1] "%d neue Benachrichtigungen" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:271 +msgid "Lock" +msgstr "Sperren" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME muss den Bildschirm sperren" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "Sperrung fehlgeschlagen" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "Sperrung wurde von einer Anwendung blockiert" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Suche läuft …" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Keine Ergebnisse." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d weiteres" +msgstr[1] "%d weitere" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopieren" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Einfügen" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Text anzeigen" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Text verbergen" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Passwort" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "An Passwort erinnern" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Barrierefreiheit" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Vergrößern" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Bildschirmleser" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Bildschirmtastatur" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Visuelle Warnungen" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Einrastfunktion" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Tastenverzögerung" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Tastenanschlagfunktion" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Tastaturmaus" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Hoher Kontrast" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Große Schrift" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth-Einstellungen" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d verbunden" +msgstr[1] "%d verbunden" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Aus" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "An" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Helligkeit" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Tastatur" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Tastaturbelegung anzeigen" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Standort eingeschaltet" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Ausschalten" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Einstellungen zur Privatsphäre" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Verwendeter Standort" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Standort ausgeschaltet" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Einschalten" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "%s Zugriff auf Ihren Standort geben?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Standortzugriff kann in den Einstellungen zur Privatsphäre jederzeit " +"geändert werden." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s ausgeschaltet" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s nicht verwaltet" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s wird getrennt" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, 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:437 +#, 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:445 +#, 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nicht verfügbar" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Verbindung von %s gescheitert" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "LAN-Einstellungen" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Einstellungen der mobilen Breitbandverbindung" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s ausgeschaltet" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Mit dem Internet verbinden" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Flugmodus ist eingeschaltet" + +#: js/ui/status/network.js:787 +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:788 +msgid "Turn Off Airplane Mode" +msgstr "Flugmodus ausschalten" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Drahtlosnetzwerk ist ausgeschaltet" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "" +"Drahtlosnetzwerk muss eingeschaltet werden, um eine Netzwerkverbindung " +"herzustellen." + +# Wi-Fi einschalten +# oder +# Schalten sie Wi-Fi ein +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Drahtlosnetzwerk einschalten" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Drahtlosnetzwerke" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Wählen Sie ein Netzwerk" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Keine Netzwerke" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Benutzen Sie zum Ausschalten den Gehäuseschalter" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Wählen Sie ein Netzwerk aus" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Drahtlosnetzwerk-Einstellungen" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspot %s eingeschaltet" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nicht verbunden" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "Verbindungsaufbau …" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "Anmeldung erforderlich" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "Verbindung gescheitert" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "VPN-Einstellungen" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN ausgeschaltet" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Netzwerkeinstellungen" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s Kabelverbindung" +msgstr[1] "%s Kabelverbindungen" + +#: js/ui/status/network.js:1568 +#, 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:1572 +#, 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:1705 +msgid "Connection failed" +msgstr "Verbindung gescheitert" + +#: js/ui/status/network.js:1706 +msgid "Activation of network connection failed" +msgstr "Aktivierung der Netzwerkverbindung ist gescheitert" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Nachtmodus deaktiviert" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Nachtmodus an" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Fortsetzen" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Bis morgen deaktivieren" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Energieeinstellungen" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Vollständig geladen" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Lädt nicht" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Schätzung …" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d verbleibend (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d bis geladen (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Bildschirm wird zur Zeit geteilt" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Ausschalten" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Flugmodus ist eingeschaltet" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Benutzer wechseln" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Abmelden" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Kontoeinstellungen" + +#: js/ui/status/system.js:256 +msgid "Orientation Lock" +msgstr "Hoch-/Querformats-Fixierung" + +#: js/ui/status/system.js:282 +msgid "Suspend" +msgstr "Bereitschaft" + +#: js/ui/status/system.js:292 +msgid "Power Off" +msgstr "Ausschalten" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Unbekanntes Thunderbolt-Gerät" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Ein neues Gerät ist in der Zwischenzeit erkannt worden. Bitte trennen Sie " +"die Verbindung des Gerätes und schließen es wieder an, um es zu verwenden." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Nicht legitimiertes Thunderbolt-Gerät" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Neue Geräte wurden entdeckt und müssen durch einen Administrator legitimiert " +"werden." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt-Legitimierungsfehler" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Das Thunderbolt-Gerät %s konnte nicht legitimiert werden" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Lautstärke geändert" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Spiegeln" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Bildschirme verketten" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Nur extern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Nur eingebaut" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Als anderer Benutzer anmelden" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Fenster entsperren" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Anwendungen" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Suchen" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "»%s« ist bereit" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Wollen Sie diese Anzeigeeinstellungen beibehalten?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Zurücksetzen" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Beibehalten" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Die Änderungen der Einstellungen werden in %d Sekunde zurückgesetzt" +msgstr[1] "" +"Die Änderungen der Einstellungen werden in %d Sekunden zurückgesetzt" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:677 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimieren" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Maximieren aufheben" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximieren" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Verschieben" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Größe verändern" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Titelleiste auf den Bildschirm verschieben" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Immer im Vordergrund" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Immer auf der sichtbaren Arbeitsfläche" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Eine Arbeitsfläche nach links bewegen" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Eine Arbeitsfläche nach rechts bewegen" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Eine Arbeitsfläche nach oben verschieben" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Eine Arbeitsfläche nach unten verschieben" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Auf den Bildschirm nach oben verschieben" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Auf den Bildschirm nach unten verschieben" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Auf den Bildschirm nach links verschieben" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Auf den Bildschirm nach rechts verschieben" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution-Kalender" + +#: src/main.c:408 +msgid "Print version" +msgstr "Version ausgeben" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Der durch GDM im Anmeldefenster verwendete Modus" + +#: src/main.c:420 +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:426 +msgid "List possible modes" +msgstr "Die möglichen Modi auflisten" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "Unbekannt" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "»%s« konnte nicht gestartet werden" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Passwörter stimmen nicht überein." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Es muss ein Passwort angegeben werden" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Der Dialog zur Anmeldung wurde vom Benutzer geschlossen" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u Ausgang" +msgstr[1] "%u Ausgänge" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u Eingang" +msgstr[1] "%u Eingänge" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Systemklänge" + +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "toggle-switch-us" +#~ msgstr "toggle-switch-intl" + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "" +#~ "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:" + +#~ msgid "%s all day." +#~ msgstr "Ganztägig %s." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, später %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, später %s, gefolgt von %s." + +#~ msgid "Feels like %s." +#~ msgstr "Gefühlt wie %s." diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..c822608 --- /dev/null +++ b/po/el.po @@ -0,0 +1,3035 @@ +# Kostas Papadimas , 2012. +# Dimitris Spingos (Δημήτρης Σπίγγος) , 2013, 2014, 2015. +# Vangelis Skarmoutsos , 2013. +# Efstathios Iosifidis , 2013. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell.po.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-09-09 12:14+0200\n" +"Last-Translator: Efstathios Iosifidis \n" +"Language-Team: www.gnome.gr\n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.7\n" +"X-DamnedLies-Scope: partial\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Σύστημα" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Εμφάνιση της λίστας ειδοποιήσεων" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Εστίαση στην ενεργή ειδοποίηση" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Εμφάνιση της επισκόπησης" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Εμφάνιση όλων των εφαρμογών" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Άνοιγμα του μενού εφαρμογών" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "Επεκτάσεις κελύφους" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Ρύθμιση επεκτάσεων του GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Διαχείριση παραθύρων και εκκίνηση εφαρμογών" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Ενεργοποίηση εσωτερικών εργαλείων χρήσιμων για τους προγραμματιστές και τους " +"δοκιμαστές, με το Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Επιτρέπει την πρόσβαση σε εσωτερικά εργαλεία αποσφαλμάτωσης και " +"παρακολούθησης, με τη χρήση του διαλόγου Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Τα UUID των επεκτάσεων που θα ενεργοποιηθούν" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Οι επεκτάσεις του GNOME Shell έχουν μια ιδιότητα UUID. Αυτό το κλειδί " +"εμφανίζει τις επεκτάσεις που πρέπει να φορτωθούν. Οποιαδήποτε επέκταση που " +"επιθυμεί να φορτωθεί πρέπει να είναι στον κατάλογο. Μπορείτε ακόμη να " +"χειρισθείτε αυτόν τον κατάλογο με τις μεθόδους διαύλου δεδομένων " +"EnableExtension και DisableExtension στο org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Απενεργοποίηση επεκτάσεων χρήστη" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Απενεργοποίηση όλων των ενεργοποιημένων επεκτάσεων του χρήστη χωρίς να " +"επηρεαστεί η ρύθμιση «enabled-extension»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Απενεργοποιεί την επικύρωση της συμβατότητας έκδοσης επέκτασης" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Το GNOME Shell θα φορτώσει μόνο τις επεκτάσεις που απαιτούνται να " +"υποστηρίξουν την τρέχουσα εκτελούμενη έκδοση. Η ενεργοποίηση αυτής της " +"επιλογής θα απενεργοποιήσει αυτόν τον έλεγχο και θα προσπαθήσει να φορτώσει " +"όλες τις επεκτάσεις ανεξάρτητα από τις εκδόσεις που απαιτούν υποστήριξη." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Κατάλογος αναγνωριστικών αρχείων επιφάνειας εργασίας για προτιμώμενες " +"εφαρμογές" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Οι εφαρμογές που αντιστοιχούν σε αυτά τα αναγνωριστικά θα εμφανισθούν στην " +"περιοχή αγαπημένων." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Προβολή επιλογέα εφαρμογών" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Ευρετήριο της τρέχουσας επιλεγμένης προβολής του επιλογέα εφαρμογών." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Ιστορικό του διαλόγου εντολών (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Ιστορικό του διαλόγου looking glass" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Να εμφανίζεται πάντα το στοιχείο μενού «Αποσύνδεση» στο μενού χρήστη." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Αυτό το κλειδί υπερισχύει της αυτόματης απόκρυψης του στοιχείου μενού " +"«Αποσύνδεση'»σε μεμονωμένο χρήστη, σε καταστάσεις μεμονωμένης συνεδρίας." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Αν θα θυμάται τον κωδικό πρόσβασης για προσάρτηση κρυπτογραφημένων ή " +"απομακρυσμένων συστημάτων αρχείων" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Το κέλυφος θα ζητήσει έναν κωδικό πρόσβασης όταν προσαρτάται μια " +"κρυπτογραφημένη συσκευή ή ένα απομακρυσμένο σύστημα αρχείων. Εάν ο κωδικός " +"πρόσβασης μπορεί να αποθηκευθεί για μελλοντική χρήση, θα παρουσιάζεται ένα " +"πλαίσιο ελέγχου «Απομνημόνευση κωδικού πρόσβασης». Αυτό το κλειδί ορίζει την " +"προεπιλεγμένη κατάσταση του πλαισίου επιλογής." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Αν ο προεπιλεγμένος προσαρμογέας Bluetooth έχει ρυθμιστεί με συσχετισμένες " +"συσκευές" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Το κέλυφος θα εμφανίσει ένα μενού Bluetooth αν είναι ενεργός ο προσαρμογέας, " +"ή αν υπάρχουν συσχετισμένες συσκευές με αυτόν. Αυτό θα επαναφερθεί αν δεν " +"υπάρχουν συσχετισμένες συσκευές με τον προσαρμογέα." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Συνδυασμός πλήκτρων για το άνοιγμα του μενού εφαρμογών" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Συνδυασμός πλήκτρων για το άνοιγμα του μενού εφαρμογών." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Συνδυασμός πλήκτρων για το άνοιγμα της προβολής «Εμφάνιση εφαρμογών»" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Συνδυασμός πλήκτρων για το άνοιγμα της προβολής «Εμφάνιση εφαρμογών» της " +"επισκόπησης δραστηριοτήτων." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Συνδυασμός πλήκτρων για το άνοιγμα της επισκόπησης" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Συνδυασμός πλήκτρων για το άνοιγμα της επισκόπησης Δραστηριοτήτων." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Συνδυασμός πλήκτρων για εναλλαγή ορατότητας της λίστας ειδοποιήσεων" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Συνδυασμός πλήκτρων για εναλλαγή ορατότητας της λίστας ειδοποιήσεων." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Συνδυασμός πλήκτρων για εστίαση της ενεργής ειδοποίησης" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Συνδυασμός πλήκτρων για εστίαση της ενεργής ειδοποίησης." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Συνδυασμός πλήκτρων που κάνει παύση και συνέχιση όλων των tween που " +"εκτελούνται, για σκοπούς αποσφαλμάτωσης" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Ποιο πληκτρολόγιο θα χρησιμοποιηθεί" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Ο τύπος του πληκτρολογίου που θα χρησιμοποιηθεί." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Περιορισμός εναλλαγής παραθύρων στον τρέχοντα χώρο εργασίας." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Αν είναι αληθές, μόνο εφαρμογές που έχουν παράθυρα στον τρέχοντα χώρο " +"εργασίας εμφανίζονται κατά την εναλλαγή παραθύρων. Αλλιώς, θα " +"περιλαμβάνονται όλες οι εφαρμογές." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Η λειτουργία εικονιδίου εφαρμογής." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Διαμορφώνει πώς θα εμφανίζονται τα παράθυρα κατά την εναλλαγή των παραθύρων. " +"Έγκυρες ρυθμίσεις είναι «thumbnail-only» (εμφανίζει μια μικρογραφία του " +"παραθύρου), «app-icon-only» (εμφανίζει μόνο το εικονίδιο της εφαρμογής) ή " +"«both» - και τα δύο." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Αν είναι αληθές, μόνο παράθυρα του τρέχοντα χώρου εργασίας εμφανίζονται κατά " +"την εναλλαγή παραθύρων. Αλλιώς, θα περιλαμβάνονται όλα τα παράθυρα." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Προσάρτηση αποκλειστικού διαλόγου στο γονικό παράθυρο" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Αυτό το κλειδί υπερισχύει του κλειδιού που υπάρχει στο org.gnome.mutter όταν " +"εκτελείται το GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Ενεργοποίηση της προσάρτησης άκρων, όταν αφήνετε παράθυρα στις άκρες της " +"οθόνης" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Η διαχείριση των χώρων γίνεται δυναμικά" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Χώροι εργασίας μόνο στην κύρια οθόνη" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Καθυστέρηση εστίασης αλλαγών στην λειτουργία ποντικιού μέχρι να σταματήσει " +"να κινείται ο δείκτης" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Σύνδεση δικτύου" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +msgid "There was an error loading the preferences dialog for %s:" +msgstr "" +"Προέκυψε ένα σφάλμα κατά τη φόρτωση του παραθύρου διαλόγου των προτιμήσεων " +"για %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 +msgid "Cancel" +msgstr "Ακύρωση" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "Επόμενο" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Ξεκλείδωμα" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "Σύνδεση" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "Επιλογή συνεδρίας" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "Δεν είστε στη λίστα;" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +msgid "(e.g., user or %s)" +msgstr "(π.χ, χρήστης ή %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Όνομα χρήστη: " + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "Παράθυρο σύνδεσης" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "Σφάλμα πιστοποίησης" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +msgid "(or swipe finger)" +msgstr "(ή περάστε το δάκτυλο σας)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +#| msgid "Power Off" +msgctxt "search-result" +msgid "Power off" +msgstr "Τερματισμός" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +msgid "power off;shutdown" +msgstr "απενεργοποίηση;τερματισμός;power off;shutdown" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +#| msgid "Lock Screen" +msgctxt "search-result" +msgid "Lock screen" +msgstr "Κλείδωμα οθόνης" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +#| msgid "Lock Screen" +msgid "lock screen" +msgstr "κλείδωμα οθόνης" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +#| msgid "Log Out" +msgctxt "search-result" +msgid "Log out" +msgstr "Αποσύνδεση" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "αποσύνδεση;αποσύνδεση;logout;sign off" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +#| msgid "Suspend" +msgctxt "search-result" +msgid "Suspend" +msgstr "Αναστολή" + +#. 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" +msgstr "Αλλαγή χρήστη" + +#. 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 "αλλαγή χρήστη" + +#. 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 "Κλείδωμα προσανατολισμού" + +#. 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 "κλείδωμα προσανατολισμού" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Δε βρέθηκε η εντολή" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Δεν ήταν δυνατό να γίνει ανάλυση της εντολής:" + +#: js/misc/util.js:163 +msgid "Execution of “%s” failed:" +msgstr "Απέτυχε η εκτέλεση του «%s»:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Μόλις τώρα" + +#: js/misc/util.js:182 +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d λεπτό πριν" +msgstr[1] "%d λεπτά πριν" + +#: js/misc/util.js:185 +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ώρα πριν" +msgstr[1] "%d ώρες πριν" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Χθες" + +#: js/misc/util.js:190 +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d ημέρα πριν" +msgstr[1] "%d ημέρες πριν" + +#: js/misc/util.js:193 +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d εβδομάδα πριν" +msgstr[1] "%d εβδομάδες πριν" + +#: js/misc/util.js:196 +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d μήνας πριν" +msgstr[1] "%d μήνες πριν" + +#: js/misc/util.js:198 +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d χρόνο πριν" +msgstr[1] "%d χρόνια πριν" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Χθες, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Χθες %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "Σύνδεση σημείου πρόσβασης" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Η σύνδεσή σας σε αυτό το σημείο πρόσβασης δεν είναι ασφαλής. Κωδικοί " +"πρόσβασης ή άλλες πληροφορίες που εισάγετε σε αυτή τη σελίδα είναι ορατά από " +"τους ανθρώπους που βρίσκονται κοντά σας." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "Άρνηση πρόσβασης" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "Παραχώρηση πρόσβασης" + +#: js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "Οι πιο συχνά χρησιμοποιούμενες εφαρμογές θα εμφανιστούν εδώ" + +#: js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "Συχνά" + +#: js/ui/appDisplay.js:937 +msgid "All" +msgstr "Όλα" + +#: js/ui/appDisplay.js:1915 +msgid "New Window" +msgstr "Νέο παράθυρο" + +#: js/ui/appDisplay.js:1929 +msgid "Launch using Dedicated Graphics Card" +msgstr "Εκκίνηση χρησιμοποιώντας αποκλειστικής κάρτας γραφικών" + +#: js/ui/appDisplay.js:1956 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Αφαίρεση από τα αγαπημένα" + +#: js/ui/appDisplay.js:1962 +msgid "Add to Favorites" +msgstr "Προσθήκη στα αγαπημένα" + +#: js/ui/appDisplay.js:1972 +msgid "Show Details" +msgstr "Εμφάνιση λεπτομερειών" + +#: js/ui/appFavorites.js:140 +msgid "%s has been added to your favorites." +msgstr "Το %s προστέθηκε στα αγαπημένα σας." + +#: js/ui/appFavorites.js:174 +msgid "%s has been removed from your favorites." +msgstr "Το %s αφαιρέθηκε από τα αγαπημένα σας." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Επιλογή συσκευής εισόδου ήχου" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Ρυθμίσεις ήχου" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Ακουστικά" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Ακουστικά ανοιχτής συνομιλίας" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Μικρόφωνο" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Αλλαγή παρασκηνίου…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Ρυθμίσεις οθόνης" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:265 +msgid "Settings" +msgstr "Ρυθμίσεις" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "Κυ" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "Δε" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "Τρ" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "Τε" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "Πε" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "Πα" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "Σα" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "Προηγούμενος μήνας" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr "Επόμενος μήνας" + +#: js/ui/calendar.js:605 +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:660 +msgid "Week %V" +msgstr "Εβδομάδα %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 +msgctxt "event list time" +msgid "All Day" +msgstr "Όλη μέρα" + +#: js/ui/calendar.js:862 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:866 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d %B, %Y" + +#: js/ui/calendar.js:1086 +msgid "No Notifications" +msgstr "Καμία ειδοποίηση" + +#: js/ui/calendar.js:1089 +msgid "No Events" +msgstr "Κανένα συμβάν" + +#: js/ui/calendar.js:1117 +msgid "Clear All" +msgstr "Εκκαθάριση όλων" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#| msgid "“%s” is ready" +msgid "“%s” is not responding." +msgstr "Το «%s» δεν ανταποκρίνεται." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Μπορείτε να επιλέξετε να περιμένετε λίγο για να συνεχίσει ή να αναγκάσει την " +"εφαρμογή να τερματίσει τελείως." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Εξαναγκασμός εξόδου" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Αναμονή" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Συνδέθηκε εξωτερικός δίσκος" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Αποσυνδέθηκε εξωτερικός δίσκος" + +#: js/ui/components/autorunManager.js:354 +msgid "Open with %s" +msgstr "Άνοιγμα με %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "Κωδικός πρόσβασης:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Πληκτρολογήστε ξανά:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261 +#: js/ui/status/network.js:355 js/ui/status/network.js:939 +msgid "Connect" +msgstr "Σύνδεση" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Κωδικός πρόσβασης: " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Κλειδί: " + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Ταυτότητα: " + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Κωδικός πρόσβασης ιδιωτικού κλειδιού: " + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Υπηρεσία: " + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638 +msgid "Authentication required by wireless network" +msgstr "Απαιτείται πιστοποίηση από το ασύρματο δίκτυο" + +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639 +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Απαιτούνται κωδικοί πρόσβασης ή κλειδιά κρυπτογράφησης για πρόσβαση στο " +"ασύρματο δίκτυο “%s”." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "Πιστοποίηση ενσύρματου 802.1X" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Όνομα δικτύου: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "Πιστοποίηση DSL" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "Απαιτείται κωδικός PIN" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Ο κωδικός PIN απαιτείται για τη συσκευή κινητής ευρυζωνικής σύνδεσης" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659 +msgid "Mobile broadband network password" +msgstr "Κωδικός πρόσβασης δικτύου κινητής ευρυζωνικής σύνδεσης" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643 +#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660 +msgid "A password is required to connect to “%s”." +msgstr "Απαιτείται κωδικός πρόσβασης για σύνδεση στο «%s»." + +#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720 +msgid "Network Manager" +msgstr "Διαχειριστής δικτύου" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "Απαιτείται πιστοποίηση" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "Διαχειριστής" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "Πιστοποίηση" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Συγγνώμη, αυτό δεν λειτούργησε. Παρακαλούμε προσπαθήστε ξανά." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +msgid "%s is now known as %s" +msgstr "Ο %s είναι τώρα γνωστός ως %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Παράθυρα" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +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 +msgid "Dash" +msgstr "Ταμπλό" + +#. 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 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:82 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:144 +msgid "Add world clocks…" +msgstr "Προσθήκη παγκόσμιων ρολογιών…" + +#: js/ui/dateMenu.js:145 +msgid "World Clocks" +msgstr "Παγκόσμια ρολόγια" + +#: js/ui/dateMenu.js:224 +msgid "Weather" +msgstr "Καιρός" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:286 +msgid "%s all day." +msgstr "Όλη μέρα %s." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:292 +msgid "%s, then %s later." +msgstr "%s, αργότερα %s." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:298 +msgid "%s, then %s, followed by %s later." +msgstr "%s, αργότερα %s, στη συνέχεια %s." + +#: js/ui/dateMenu.js:309 +msgid "Select a location…" +msgstr "Επιλογή τοποθεσίας…" + +#: js/ui/dateMenu.js:312 +msgid "Loading…" +msgstr "Φορτώνεται…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:318 +msgid "Feels like %s." +msgstr "Αισθητή θερμοκρασία %s." + +#: js/ui/dateMenu.js:321 +msgid "Go online for weather information" +msgstr "Συνδεθείτεγια πληροφορίες καιρού" + +#: js/ui/dateMenu.js:323 +msgid "Weather information is currently unavailable" +msgstr "Οι πληροφορίες καιρού είναι προσωρινά μη διαθέσιμες" + +#: js/ui/endSessionDialog.js:64 +msgctxt "title" +msgid "Log Out %s" +msgstr "Αποσύνδεση %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Αποσύνδεση" + +#: js/ui/endSessionDialog.js:67 +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Ο %s θα αποσυνδεθεί αυτόματα σε %d δευτερόλεπτο." +msgstr[1] "Ο %s θα αποσυνδεθεί αυτόματα σε %d δευτερόλεπτα." + +#: js/ui/endSessionDialog.js:72 +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Θα αποσυνδεθείτε αυτόματα σε %d δευτερόλεπτο." +msgstr[1] "Θα αποσυνδεθείτε αυτόματα σε %d δευτερόλεπτα." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Αποσύνδεση" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Τερματισμός" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Εγκατάσταση ενημερώσεων & τερματισμός" + +#: js/ui/endSessionDialog.js:87 +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Το σύστημα θα τερματισθεί αυτόματα σε %d δευτερόλεπτο." +msgstr[1] "Το σύστημα θα τερματισθεί αυτόματα σε %d δευτερόλεπτα." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Εγκατάσταση εκκρεμών ενημερώσεων λογισμικού" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Επανεκκίνηση" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Τερματισμός" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Επανεκκίνηση" + +#: js/ui/endSessionDialog.js:105 +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Το σύστημα θα επανεκκινήσει αυτόματα σε %d δευτερόλεπτο." +msgstr[1] "Το σύστημα θα επανεκκινήσει αυτόματα σε %d δευτερόλεπτα." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Επανεκκίνηση & εγκατάσταση ενημερώσεων" + +#: js/ui/endSessionDialog.js:121 +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Το σύστημα θα επανεκκινήσει αυτόματα και θα εγκαταστήσει ενημερώσεις σε %d " +"δευτερόλεπτο." +msgstr[1] "" +"Το σύστημα θα επανεκκινήσει αυτόματα και θα εγκαταστήσει ενημερώσεις σε %d " +"δευτερόλεπτα." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Επανεκκίνηση & εγκατάσταση" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Εγκατάσταση & τερματισμός" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Τερματισμός μετά την εγκατάσταση ενημερώσεων" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Επανεκκίνηση & εγκατάσταση ενημερώσεων" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"Το %s %s θα εγκατασταθεί μετά την επανεκκίνηση. Η διαδικασία αναβάθμισης " +"μπορεί να πάρει αρκετή ώρα: σιγουρευτείτε ότι έχετε αντίγραφα ασφαλείας και " +"πως ο υπολογιστής σας είναι συνδεδεμένος στην παροχή ρεύματος." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Εκτέλεση με μπαταρία: παρακαλούμε συνδεθείτε πριν την εγκατάσταση των " +"ενημερώσεων." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Κάποιες εφαρμογές είναι απασχολημένες ή έχουν δεδομένα που δεν αποθηκεύτηκαν." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Είναι συνδεδεμένοι άλλοι χρήστες." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +msgid "%s (remote)" +msgstr "%s (απομακρυσμένο)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +msgid "%s (console)" +msgstr "%s (κονσόλα)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Εγκατάσταση" + +#: js/ui/extensionDownloader.js:206 +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Λήψη και εγκατάσταση του «%s» από το extensions.gnome.org;" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +msgid "%s wants to inhibit shortcuts" +msgstr "Η εφαρομογή %s θέλει να παρεμποδίσει τις συντομεύσεις" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Η εφαρμογή θέλει να παρεμποδίσει τις συντομεύσεις" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +msgid "You can restore shortcuts by pressing %s." +msgstr "Μπορείτε να επαναφέρετε τις συντομεύσεις πιέζοντας το %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Απόρριψη" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Αποδοχή" + +#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "Πληκτρολόγιο" + +#: js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "Δεν υπάρχουν εγκατεστημένες επεκτάσεις" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +msgid "%s has not emitted any errors." +msgstr "Το %s δεν έδωσε σφάλματα." + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "Απόκρυψη σφαλμάτων" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "Εμφάνιση σφαλμάτων" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "Ενεργοποιημένο" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Απενεργοποιημένο" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "Σφάλμα" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "Μη ενημερωμένο" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "Γίνεται λήψη" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "Προβολή πηγής" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "Ιστοσελίδα" + +#: js/ui/messageTray.js:1493 +msgid "System Information" +msgstr "Πληροφορίες συστήματος" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Άγνωστος καλλιτέχνης" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Άγνωστος τίτλος" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Αναίρεση" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Επισκόπηση" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Πληκτρολογήστε για αναζήτηση…" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "Νέα συντόμευση…" + +#: js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "Καθορισμένη εφαρμογή" + +#: js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "Εμφάνιση βοήθειας στην οθόνη" + +#: js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "Εναλλαγή οθόνης" + +#: js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "Αντιστοίχη πλήκτρων" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "Έτοιμο" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "Επεξεργασία…" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "Κανένα" + +#: js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "Πατήστε ένα κουμπί για ρύθμιση" + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "Πατήστε Esc για έξοδο" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "Πατήστε οποιοδήποτε πλήκτρο για έξοδο" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Έξοδος" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Δραστηριότητες" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Σύστημα" + +#: js/ui/panel.js:812 +msgid "Top Bar" +msgstr "Πάνω μπάρα" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Πληκτρολογήστε μια εντολή" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "Κλείσιμο" + +#: js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "Η επανεκκίνηση δεν είναι διαθέσιμη στο Wayland" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "Επανεκκίνηση…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:147 +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d νέο μήνυμα" +msgstr[1] "%d νέα μηνύματα" + +#: js/ui/screenShield.js:149 +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d νέα ειδοποίηση" +msgstr[1] "%d νέες ειδοποιήσεις" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:284 +msgid "Lock" +msgstr "Κλείδωμα" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "Το GNOME χρειάζεται να κλειδώσει την οθόνη" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr "Αδυναμία κλειδώματος" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 +msgid "Lock was blocked by an application" +msgstr "Το κλείδωμα εμποδίσθηκε από μια εφαρμογή" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "Αναζήτηση…" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "Δε βρέθηκαν αποτελέσματα." + +#: js/ui/search.js:777 +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d περισσότερο" +msgstr[1] "%d περισσότερες" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Αντιγραφή" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Επικόλληση" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Εμφάνιση κειμένου" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Απόκρυψη κειμένου" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "Κωδικός πρόσβασης" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "Απομνημόνευση κωδικού πρόσβασης" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Προσιτότητα" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Εστίαση" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Αναγνώστης οθόνης" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Πληκτρολόγιο οθόνης" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Οπτικές ειδοποιήσεις" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Κολλώδη πλήκτρα" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Αργά πλήκτρα" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Πλήκτρα αναπήδησης" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Πλήκτρα ποντικιού" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Υψηλή αντίθεση" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Μεγάλο κείμενο" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627 +msgid "Bluetooth Settings" +msgstr "Ρυθμίσεις Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "Συνδέθηκε %d" +msgstr[1] "Συνδέθηκαν %d" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "Εκτός σύνδεσης" + +#: js/ui/status/bluetooth.js:140 +msgid "On" +msgstr "Ενεργοποίηση" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299 +msgid "Turn On" +msgstr "Ενεργοποίηση" + +#: 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 "Σβήσιμο" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Φωτεινότητα" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "Εμφάνιση διάταξης πληκτρολογίου" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Ενεργοποιήθηκε η τοποθεσία" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Απενεργοποίηση" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Ρυθμίσεις ιδιωτικότητας" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Τοποθεσία σε χρήση" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Απενεργοποιήθηκε η τοποθεσία" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Ενεργοποίηση" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +msgid "Give %s access to your location?" +msgstr "Παραχώρηση της τοποθεσίας σας στο %s;" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Η πρόσβαση τοποθεσίες μπορεί να αλλαχθεί οπιαδήποτε στιγμή από τις ρυθμίσεις " +"ιδιωτικότητας." + +#: js/ui/status/network.js:104 +msgid "" +msgstr "<άγνωστο>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 js/ui/status/network.js:1328 +msgid "%s Off" +msgstr "Απενεργοποιημένο %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:457 +msgid "%s Connected" +msgstr "%s συνδεδεμένο" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:462 +msgid "%s Unmanaged" +msgstr "Χωρίς διαχείριση %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:465 +msgid "%s Disconnecting" +msgstr "Γίνεται αποσύνδεση %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:472 js/ui/status/network.js:1320 +msgid "%s Connecting" +msgstr "Γίνεται σύνδεση %s" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:475 +msgid "%s Requires Authentication" +msgstr "Το %s απαιτεί πιστοποίηση" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:483 +msgid "Firmware Missing For %s" +msgstr "Λείπει υλικολογισμικό για το %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:487 +msgid "%s Unavailable" +msgstr "Το %s δεν είναι διαθέσιμο" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:490 +msgid "%s Connection Failed" +msgstr "Αποτυχία σύνδεσης του %s" + +#: js/ui/status/network.js:506 +msgid "Wired Settings" +msgstr "Ενσύρματες ρυθμίσεις" + +#: js/ui/status/network.js:548 +msgid "Mobile Broadband Settings" +msgstr "Ρυθμίσεις ευρυζωνικής σύνδεσης" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:591 js/ui/status/network.js:1325 +msgid "%s Hardware Disabled" +msgstr "Το υλικό απενεργοποιήθηκε για το %s" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:595 +msgid "%s Disabled" +msgstr "Απενεργοποιήθηκε το %s" + +#: js/ui/status/network.js:635 +msgid "Connect to Internet" +msgstr "Σύνδεση στο διαδίκτυο" + +#: js/ui/status/network.js:833 +msgid "Airplane Mode is On" +msgstr "Η λειτουργία αεροπλάνου είναι ενεργή" + +#: js/ui/status/network.js:834 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "" +"Η ασύρματη σύνδεση είναι ανενεργή όταν η λειτουργία αεροπλάνου είναι ενεργή." + +#: js/ui/status/network.js:835 +msgid "Turn Off Airplane Mode" +msgstr "Απενεργοποίηση της λειτουργίας αεροπλάνου" + +#: js/ui/status/network.js:844 +msgid "Wi-Fi is Off" +msgstr "Το Wi-Fi είναι ανενεργό" + +#: js/ui/status/network.js:845 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Το Wi-Fi χρειάζεται να ενεργοποιηθεί για να συνδεθείτε σε ένα δίκτυο." + +#: js/ui/status/network.js:846 +msgid "Turn On Wi-Fi" +msgstr "Ενεργοποίηση Wi-Fi" + +#: js/ui/status/network.js:871 +msgid "Wi-Fi Networks" +msgstr "Ασύρματα δίκτυα" + +#: js/ui/status/network.js:873 +msgid "Select a network" +msgstr "Επιλογή δικτύου" + +#: js/ui/status/network.js:903 +msgid "No Networks" +msgstr "Χωρίς δίκτυα" + +#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Χρήση διακόπτη υλικού για απενεργοποίηση" + +#: js/ui/status/network.js:1191 +msgid "Select Network" +msgstr "Επιλογή δικτύου" + +#: js/ui/status/network.js:1197 +msgid "Wi-Fi Settings" +msgstr "Ρυθμίσεις Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1316 +msgid "%s Hotspot Active" +msgstr "Ενεργό σημείο πρόσβασης %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1331 +msgid "%s Not Connected" +msgstr "Χωρίς σύνδεση το %s" + +#: js/ui/status/network.js:1435 +msgid "connecting…" +msgstr "Γίνεται σύνδεση…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1438 +msgid "authentication required" +msgstr "απαιτείται πιστοποίηση" + +#: js/ui/status/network.js:1440 +msgid "connection failed" +msgstr "αποτυχία σύνδεσης" + +#: js/ui/status/network.js:1494 +msgid "VPN Settings" +msgstr "Ρυθμίσεις VPN" + +#: js/ui/status/network.js:1498 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1508 +msgid "VPN Off" +msgstr "Απενεργοποιημένο VPN" + +#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Ρυθμίσεις δικτύου" + +#: js/ui/status/network.js:1603 +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s ενσύρματη σύνδεση" +msgstr[1] "%s ενσύρματη συνδέσεις" + +#: js/ui/status/network.js:1607 +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi σύνδεση" +msgstr[1] "%s Wi-Fi συνδέσεις" + +#: js/ui/status/network.js:1611 +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s σύνδεση μόντεμ" +msgstr[1] "%s συνδέσεις μόντεμ" + +#: js/ui/status/network.js:1759 +msgid "Connection failed" +msgstr "Αποτυχία σύνδεσης" + +#: js/ui/status/network.js:1760 +msgid "Activation of network connection failed" +msgstr "Απέτυχε η ενεργοποίηση της σύνδεσης δικτύου" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "Λειτουργία νυχτός ανενεργή" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Λειτουργία νυχτός ενεργή" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Συνέχιση" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Απενεργοποίηση έως αύριο" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Ρυθμίσεις τροφοδοσίας" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Πλήρως φορτισμένη" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Εκτίμηση…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d Απομένει (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d Πλήρης μέχρι (%d %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Λειτουργία αεροπλάνου ενεργή" + +#: js/ui/status/system.js:228 +msgid "Switch User" +msgstr "Αλλαγή χρήστη" + +#: js/ui/status/system.js:240 +msgid "Log Out" +msgstr "Αποσύνδεση" + +#: js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "Ρυθμίσεις λογαριασμού" + +#: js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "Κλείδωμα προσανατολισμού" + +#: js/ui/status/system.js:295 +msgid "Suspend" +msgstr "Αναστολή" + +#: js/ui/status/system.js:305 +msgid "Power Off" +msgstr "Τερματισμός" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "Άλλαξε η ένταση" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Ένταση" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +#| msgid "Error" +msgid "Mirror" +msgstr "Κατοπτρισμός" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Ένωση οθονών" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Μόνο εξωτερικό" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Μόνο ενσωματωμένο" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Σύνδεση ως άλλος χρήστης" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Ξεκλείδωμα παραθύρου" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Εφαρμογές" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Αναζήτηση" + +#: js/ui/windowAttentionHandler.js:20 +msgid "“%s” is ready" +msgstr "Το «%s» είναι έτοιμο" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Θέλετε να κρατήσετε αυτές τις ρυθμίσεις οθόνης;" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Επαναφορά ρυθμίσεων" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Διατήρηση αλλαγών" + +#: js/ui/windowManager.js:105 +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Οι αλλαγές ρυθμίσεων θα επανέλθουν σε %d δευτερόλεπτο" +msgstr[1] "Οι αλλαγές ρυθμίσεων θα επανέλθουν σε %d δευτερόλεπτα" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Ελαχιστοποίηση" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Απομεγιστοποίηση" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Μεγιστοποίηση" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Μετακίνηση" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Αλλαγή μεγέθους" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Μετακίνηση μπάρας τίτλου στην οθόνη" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Πάντα στην κορυφή" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Πάντα σε ορατό χώρο εργασίας" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Μετακίνηση στο χώρο εργασίας αριστερά" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "Μετακίνηση στο χώρο εργασίας δεξιά" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "Μετακίνηση στο χώρο εργασίας πάνω" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "Μετακίνηση στο χώρο εργασίας κάτω" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Μετακίνηση στην πάνω οθόνη" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Μετακίνηση στην κάτω οθόνη" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "Μετακίνηση στην αριστερή οθόνη" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "Μετακίνηση στη δεξιά οθόνη" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Ημερολόγιο Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:380 +msgid "Print version" +msgstr "Εμφάνιση έκδοσης" + +#: src/main.c:386 +msgid "Mode used by GDM for login screen" +msgstr "Λειτουργία που χρησιμοποιείται από το GDM για την οθόνη σύνδεσης" + +#: src/main.c:392 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "" +"Χρήση μιας συγκεκριμένης λειτουργίας, π.χ. «gdm» για την οθόνη σύνδεσης" + +#: src/main.c:398 +msgid "List possible modes" +msgstr "Λίστα πιθανών λειτουργιών" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Άγνωστο" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Αποτυχία εκκίνησης του «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Το παράθυρο πιστοποίησης έκλεισε από τον χρήστη" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u έξοδος" +msgstr[1] "%u έξοδοι" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u είσοδος" +msgstr[1] "%u είσοδοι" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Ήχοι συστήματος" + +#~ msgid "Hide tray" +#~ msgstr "Απόκρυψη περιοχής ειδοποιήσεων" + +#~ msgid "Status Icons" +#~ msgstr "Εικονίδια κατάστασης" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Προτιμήσεις επεκτάσεων του GNOME Shell" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Ανακατεύθυνση πιστοποίησης ιστού" + +#~ msgid "Events" +#~ msgstr "Συμβάντα" + +#~ msgid "Notifications" +#~ msgstr "Ειδοποιήσεις" + +#~ msgid "Clear section" +#~ msgstr "Εκκαθάριση περιοχής" + +#~ msgid "Media" +#~ msgstr "Πολυμέσα" + +#~ msgid "Not In Use" +#~ msgstr "Εκτός χρήσης" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Εμφάνιση του αριθμού εβδομάδας στο ημερολόγιο" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "" +#~ "Αν είναι αληθές, εμφανίζει τον αριθμό εβδομάδας κατά ISO στο ημερολόγιο." + +#~ msgid "Use as Internet connection" +#~ msgstr "Χρήση ως σύνδεση διαδικτύου" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "Το %s ζητά πρόσβαση στην τοποθεσία σας." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (συνθετητής wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d συνδεδεμένη συσκευή" +#~ msgstr[1] "%d συνδεδεμένες συσκευές" + +#~ msgid "Authentication required" +#~ msgstr "Απαιτείται πιστοποίηση" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Μπαταρία" + +#~ msgid "Airplane Mode" +#~ msgstr "Λειτουργία αεροπλάνου" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Πρόσκληση" + +#~ msgid "Call" +#~ msgstr "Κλήση" + +#~ msgid "File Transfer" +#~ msgstr "Μεταφορά αρχείου" + +#~ msgid "Chat" +#~ msgstr "Συνομιλία" + +#~ msgid "Invitation to %s" +#~ msgstr "Πρόσκληση στο %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "Ο %s σας προσκαλεί να μπείτε στο %s" + +#~ msgid "Decline" +#~ msgstr "Απόρριψη" + +#~ msgid "Accept" +#~ msgstr "Αποδοχή" + +#~ msgid "Video call from %s" +#~ msgstr "Βιντεοκλήση από %s" + +#~ msgid "Call from %s" +#~ msgstr "Κλήση από %s" + +#~ msgid "Answer" +#~ msgstr "Απάντηση" + +#~ msgid "%s is sending you %s" +#~ msgstr "Ο %s σας στέλνει το %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "Ο %s ζητάει άδεια για να βλέπει πότε είστε συνδεδεμένος" + +#~ msgid "Authentication failed" +#~ msgstr "Απέτυχε η πιστοποίηση" + +#~ msgid "Encryption error" +#~ msgstr "Σφάλμα κρυπτογράφησης" + +#~ msgid "Certificate not provided" +#~ msgstr "Δεν υπάρχει πιστοποιητικό" + +#~ msgid "Certificate untrusted" +#~ msgstr "Μη έμπιστο πιστοποιητικό" + +#~ msgid "Certificate expired" +#~ msgstr "Ληγμένο πιστοποιητικό" + +#~ msgid "Certificate not activated" +#~ msgstr "Το πιστοποιητικό δεν ενεργοποιήθηκε" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Αναντιστοιχία ονόματος κεντρικού υπολογιστή στο πιστοποιητικό" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Αναντιστοιχία αποτυπώματος πιστοποιητικού" + +#~ msgid "Certificate self-signed" +#~ msgstr "Αυτο-υπογεγραμμένο πιστοποιητικό" + +#~ msgid "Status is set to offline" +#~ msgstr "Η κατάσταση έχει ορισθεί σε εκτός σύνδεσης" + +#~ msgid "Certificate is invalid" +#~ msgstr "Μη έγκυρο πιστοποιητικό" + +#~ msgid "Connection has been refused" +#~ msgstr "Άρνηση σύνδεσης" + +#~ msgid "Connection can't be established" +#~ msgstr "Δεν είναι δυνατή η σύνδεση" + +#~ msgid "Connection has been lost" +#~ msgstr "Χάθηκε η σύνδεση" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Αυτός ο λογαριασμός είναι ήδη συνδεδεμένος στον διακομιστή" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "Η σύνδεση έχει αντικατασταθεί από μια νέα σύνδεση που χρησιμοποιεί τον " +#~ "ίδιο πόρο" + +#~ msgid "The account already exists on the server" +#~ msgstr "Ο λογαριασμός υπάρχει ήδη στον διακομιστή" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Ο διακομιστής είναι πολύ απασχολημένος ώστε να χειριστεί τη σύνδεση" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Το πιστοποιητικό έχει ανακληθεί" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Το πιστοποιητικό χρησιμοποιεί έναν μη ασφαλή αλγόριθμο αποκρυπτογράφησης " +#~ "αποτυπώματος ή είναι κρυπτογραφικά ασθενές" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Το μέγεθος πιστοποιητικού του διακομιστή, ή το βάθος της αλυσίδας " +#~ "πιστοποιητικού του διακομιστή υπερβαίνει τα όρια που επιτρέπει η " +#~ "βιβλιοθήκη κρυπτογραφίας" + +#~ msgid "Internal error" +#~ msgstr "Εσωτερικό σφάλμα" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Αδυναμία σύνδεσης με %s" + +#~ msgid "View account" +#~ msgstr "Προβολή λογαριασμού" + +#~ msgid "Unknown reason" +#~ msgstr "Άγνωστος λόγος" + +#~ msgid "Show the message list" +#~ msgstr "Εμφάνιση της λίστας μηνυμάτων" + +#~ msgid "Captive Portal" +#~ msgstr "Πύλη υποδοχής" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Κυ" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Δε" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Τρ" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Τε" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Πε" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Πα" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Σα" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Τίποτα προγραμματισμένο" + +#~ msgid "Today" +#~ msgstr "Σήμερα" + +#~ msgid "Tomorrow" +#~ msgstr "Αύριο" + +#~ msgid "This week" +#~ msgstr "Αυτή η εβδομάδα" + +#~ msgid "Next week" +#~ msgstr "Επόμενη εβδομάδα" + +#~ msgid "Removable Devices" +#~ msgstr "Αφαιρούμενες συσκευές" + +#~ msgid "Eject" +#~ msgstr "Εξαγωγή" + +#~ msgid "Unmute" +#~ msgstr "Άρση σίγασης" + +#~ msgid "Mute" +#~ msgstr "Σίγαση" + +#~ msgid "Open Calendar" +#~ msgstr "Άνοιγμα ημερολογίου" + +#~ msgid "Date & Time Settings" +#~ msgstr "Ρυθμίσεις ημερομηνίας & ώρας" + +#~ msgid "Open" +#~ msgstr "Άνοιγμα" + +#~ msgid "Remove" +#~ msgstr "Αφαίρεση" + +#~ msgid "Clear Messages" +#~ msgstr "Εκκαθάριση μηνυμάτων" + +#~ msgid "Notification Settings" +#~ msgstr "Ρυθμίσεις ειδοποιήσεων" + +#~ msgid "Tray Menu" +#~ msgstr "Μενού περιοχής ειδοποιήσεων" + +#~ msgid "No Messages" +#~ msgstr "Χωρίς μηνύματα" + +#~ msgid "Message Tray" +#~ msgstr "Περιοχή ειδοποιήσεων μηνυμάτων" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Το μέγιστο επίπεδο ακρίβειας της θέσης." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Ρυθμίζει το μέγιστο επίπεδο ακρίβειας στην εντόπιση θέσης το οποίο " +#~ "επιτρέπεται να βλέπουν οι εφαρμογές. Οι έγκυρες επιλογές είναι " +#~ "'όχι' (απενεργοποίηση εντοπισμού θέσης), 'χώρα', 'πόλη', 'γειτονιά', " +#~ "'οδός' και 'ακριβώς' (τυπικά, απαιτεί δέκτη GPS). Παρακαλούμε να θυμάστε " +#~ "ότι αυτό ελέγχει μόνο τι θα επιτρέπει το Geoclue να βλέπουν οι εφαρμογές, " +#~ "ενώ αυτές μπορούν να βρουν τη θέση του χρήστη και από μόνες τους, " +#~ "χρησιμοποιώντας πόρους δικτύου (αν και, στην καλύτερη περίπτωση, με " +#~ "ακρίβεια επιπέδου οδού)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Διάταξη των κουμπιών στη γραμμή τίτλου" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Αυτό το κλειδί υπερισχύει του κλειδιού που υπάρχει στο org.gnome.desktop." +#~ "wm.preferences όταν εκτελείται το GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Επέκταση" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Επιλέξτε μια επέκταση για να την ρυθμίσετε χρησιμοποιώντας το σύνθετο " +#~ "πλαίσιο παραπάνω." + +#~ msgid "calendar:MY" +#~ msgstr "ημερολόγιο:MY" + +#~ msgid "unavailable" +#~ msgstr "μη διαθέσιμο" + +#~ msgid "%A, %H:%M" +#~ msgstr "%ΗΗΗΗ, %Ω:%Λ" + +#~ msgid "%B %d, %H:%M" +#~ msgstr " %ΜΜΜΜ, %Ω:%Λ" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr " %ΜΜΜΜ %ΕΕΕΕ, %Ω:%Λ " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Η λίστα των κατηγοριών που πρέπει να εμφανίζονται ως φάκελοι" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Το όνομα κάθε κατηγορίας σε αυτή τη λίστα θα αναπαριστάται ως φάκελος " +#~ "στην προβολή εφαρμογής, αντί να εμφανίζεται ενσωματωμένο στην κύρια " +#~ "προβολή." + +#~ msgid "Authorization request from %s" +#~ msgstr "Αίτηση εξουσιοδότησης από %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Η συσκευή %s επιθυμεί να συζευχθεί με αυτόν τον υπολογιστή" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Η συσκευή %s επιθυμεί πρόσβαση στην υπηρεσία '%s'" + +#~ msgid "Always grant access" +#~ msgstr "Να επιτρέπεται πάντα η πρόσβαση" + +#~ msgid "Grant this time only" +#~ msgstr "Μόνο για αυτή τη φορά" + +#~ msgid "Reject" +#~ msgstr "Απόρριψη" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Επιβεβαίωση σύζευξης για %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Παρακαλώ επιβεβαιώστε αν το κλειδί πρόσβασης '%06d' ταιριάζει με αυτό της " +#~ "συσκευής." + +#~ msgid "Matches" +#~ msgstr "Ταιριάζει" + +#~ msgid "Does not match" +#~ msgstr "Δεν ταιριάζει" + +#~ msgid "Pairing request for %s" +#~ msgstr "Αίτηση σύζευξης για %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Παρακαλώ εισάγετε το PIN που αναφέρεται στη συσκευή." + +#~ msgid "OK" +#~ msgstr "Εντάξει" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Συγγνώμη, κανένα απόφθεγμα για εσάς σήμερα:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s ο Προφήτης λέει" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%Ω\\u2236%Λ" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screenshots" +#~ msgstr "Στιγμιότυπα οθόνης" + +#~ msgid "Record a screencast" +#~ msgstr "Καταγραφή ενός βίντεο οθόνης" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Εάν θα συλλέγονται στατιστικά χρήσης των εφαρμογών" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "Το κέλυφος κανονικά παρακολουθεί τις ενεργές εφαρμογές για να παρουσιάσει " +#~ "τις πιο συχνά χρησιμοποιούμενες (π.χ. στους εκκινητές). Παρόλο που αυτά " +#~ "τα δεδομένα θα παραμείνουν ιδιωτικά, μπορεί να επιθυμείτε να " +#~ "απενεργοποιήσετε αυτή τη λειτουργία για λόγους απορρήτου. Παρακαλούμε " +#~ "έχετε υπ' όψιν ότι η απενεργοποίηση δεν θα αφαιρέσει τα ήδη αποθηκευμένα " +#~ "δεδομένα." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Χρησιμοποιείται εσωτερικά για την αποθήκευση της συνομιλίας που έχει " +#~ "ορισθεί από τον χρήστη. Η τιμή εδώ είναι από την απαρίθμηση του " +#~ "TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Χρησιμοποιείται εσωτερικά για την αποθήκευση της κατάστασης παρουσίας της " +#~ "τελευταίας συνόδου του χρήστη. Η τιμή εδώ είναι από την απαρίθμηση του " +#~ "GsmPresenceStatus." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Συνδυασμός πλήκτρων για την εναλλαγή της μαγνητοσκόπησης οθόνης" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "" +#~ "Συνδυασμός πλήκτρων για το άνοιγμα/κλείσιμο της ενσωματωμένης " +#~ "μαγνητοσκόπησης οθόνης." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "" +#~ "Ο ρυθμός καρέ που θα χρησιμοποιηθεί για την καταγραφή του βίντεο οθόνης." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Ο ρυθμός καρέ του στιγμιότυπου που παράγεται από τον εγγραφέα βίντεο " +#~ "οθόνης του GNOME Shell σε καρέ ανά δευτερόλεπτο." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "" +#~ "Ο δίαυλος του gstreamer που χρησιμοποιήθηκε για την κωδικοποίηση του " +#~ "βίντεο οθόνης" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Ορίζει το δίαυλο του GStreamer που θα χρησιμοποιηθεί για την κωδικοποίηση " +#~ "των εγγραφών. Ακολουθεί το συντακτικό που χρησιμοποιείται για το gst-" +#~ "launch. Ο δίαυλος θα πρέπει να έχει έναν μη συνδεδεμένο απαγωγέα όπου θα " +#~ "εγγράφεται το καταγραφέα βίντεο. Φυσιολογικά θα έχει μια μη συνδεδεμένη " +#~ "πηγή· η έξοδος της πηγής θα εγγράφεται στο αρχείο εξόδου. Όμως, ο δίαυλος " +#~ "μπορεί να επιληφθεί της δικής του εξόδου - αυτό μπορεί να χρησιμοποιηθεί " +#~ "για την αποστολή της εξόδου σε έναν διακομιστή icecast μέσω του " +#~ "shout2send ή κάποιου παρόμοιου. Όταν δεν έχει ορισθεί ή έχει ορισθεί σε " +#~ "κενή τιμή, θα χρησιμοποιηθεί ο προεπιλεγμένος δίαυλος. Αυτός είναι αυτή " +#~ "τη στιγμή ο 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 " +#~ "deadline=1000000 threads=%T ! queue ! webmmux' και γράφει σε WEBM με " +#~ "κωδικοποίηση VP8. Το %T χρησιμοποιείται ως παράδειγμα για το πιθανό " +#~ "βέλτιστο αριθμό πυρήνων του συστήματος." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "" +#~ "Επέκταση αρχείου που θα χρησιμοποιηθεί για την αποθήκευση του βίντεο " +#~ "οθόνης" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Το όνομα αρχείου για τα καταγεγραμμένα βίντεο οθόνης θα είναι μοναδικό, " +#~ "βασισμένο στην τρέχουσα ημερομηνία και θα χρησιμοποιεί αυτή την επέκταση. " +#~ "Θα πρέπει να αλλάζει όταν γίνεται εγγραφή σε διαφορετικό πρότυπο περιέκτη." + +#~ msgid "Session…" +#~ msgstr "Συνεδρία…" + +#~ msgid "Power" +#~ msgstr "Ενέργεια" + +#~ msgid "Restart" +#~ msgstr "Επανεκκίνηση" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Βίντεο οθόνης από %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Πατήστε Αποσύνδεση για να κλείσετε αυτές τις εφαρμογές και να " +#~ "αποσυνδεθείτε από το σύστημα." + +#~ msgid "Logging out of the system." +#~ msgstr "Αποσύνδεση από το σύστημα." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Πατήστε Απενεργοποίηση για να κλείσετε αυτές τις εφαρμογές και να " +#~ "τερματίσετε το σύστημα." + +#~ msgid "Powering off the system." +#~ msgstr "Απενεργοποίηση του συστήματος." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Πατήστε Επανεκκίνηση για να κλείσετε αυτές τις εφαρμογές και να " +#~ "επανεκκινήσετε το σύστημα." + +#~ msgid "Restarting the system." +#~ msgstr "Επανεκκινείται το σύστημα." + +#~ msgid "Universal Access Settings" +#~ msgstr "Ρυθμίσεις καθολικής πρόσβασης" + +#~ msgid "Visibility" +#~ msgstr "Ορατότητα" + +#~ msgid "Send Files to Device…" +#~ msgstr "Αποστολή αρχείων σε συσκευή…" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Ρύθμιση νέας συσκευής…" + +#~ msgid "Send Files…" +#~ msgstr "Αποστολή αρχείων…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Ρυθμίσεις πληκτρολογίου" + +#~ msgid "Mouse Settings" +#~ msgstr "Ρυθμίσεις ποντικιού" + +#~ msgid "Region & Language Settings" +#~ msgstr "Ρυθμίσεις περιοχής και γλώσσας" + +#~ msgid "Volume, network, battery" +#~ msgstr "Ένταση, δίκτυο, μπαταρία" + +#~ msgid "disabled" +#~ msgstr "απενεργοποιημένο" + +#~ msgid "cable unplugged" +#~ msgstr "το καλώδιο αποσυνδέθηκε" + +#~ msgid "More…" +#~ msgstr "Περισσότερα…" + +#~ msgid "Wired" +#~ msgstr "Ενσύρματο" + +#~ msgid "Auto Ethernet" +#~ msgstr "Αυτόματα Ethernet" + +#~ msgid "Auto broadband" +#~ msgstr "Αυτόματα ευρυζωνική" + +#~ msgid "Auto dial-up" +#~ msgstr "Αυτόματα dial-up" + +#~ msgid "Auto %s" +#~ msgstr "Αυτόματα %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Αυτόματα bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Αυτόματα ασύρματο" + +#~ msgid "Wi-Fi" +#~ msgstr "Ασύρματη πιστότητα" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d ώρα απομένει" +#~ msgstr[1] "%d ώρες απομένουν" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "Απομένουν %d %s %d %s" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ώρα" +#~ msgstr[1] "ώρες" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "λεπτό" +#~ msgstr[1] "λεπτά" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d λεπτό απομένει" +#~ msgstr[1] "%d λεπτά απομένουν" + +#~ msgid "AC Adapter" +#~ msgstr "Μετασχηματιστής εναλλασσόμενου" + +#~ msgid "Laptop Battery" +#~ msgstr "Μπαταρία φορητού" + +#~ msgid "Monitor" +#~ msgstr "Οθόνη" + +#~ msgid "Mouse" +#~ msgstr "Ποντίκι" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "Κινητό τηλέφωνο" + +#~ msgid "Media Player" +#~ msgstr "Αναπαραγωγή πολυμέσων" + +#~ msgid "Tablet" +#~ msgstr "Ταμπλέτα" + +#~ msgid "Computer" +#~ msgstr "Υπολογιστής" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Άγνωστο" + +#~ msgid "Available" +#~ msgstr "Διαθέσιμος-η" + +#~ msgid "Busy" +#~ msgstr "Απασχολημένος-η" + +#~ msgid "Invisible" +#~ msgstr "Αόρατος-η" + +#~ msgid "Away" +#~ msgstr "Απουσιάζει" + +#~ msgid "Idle" +#~ msgstr "Αδρανής" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Η κατάσταση συνομιλίας σας θα ορισθεί σε απασχολημένος" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Οι ειδοποιήσεις είναι απενεργοποιημένες, όπως και τα μηνύματα συζητήσεων. " +#~ "Η κατάσταση σας έχει ορισθεί έτσι ώστε να γίνεται γνωστό ότι πιθανόν να " +#~ "μην δείτε τα μηνύματα τους." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "" +#~ "Κλείνοντας μπορεί να τους προκαλέσετε την απώλεια αναποθήκευτης εργασίας." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Σύνδεση" + +#~ msgid "tray" +#~ msgstr "περιοχή" + +#~ msgid "More..." +#~ msgstr "Περισσότερα..." + +#~ msgid "APPLICATIONS" +#~ msgstr "ΕΦΑΡΜΟΓΕΣ" + +#~ msgid "SETTINGS" +#~ msgstr "ΡΥΘΜΙΣΕΙΣ" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Subscription request" +#~ msgstr "Αίτηση συνδρομής" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Στάλθηκε στις %A και ώρα %X" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Στάλθηκε την %A, %d %B, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Απέτυχε η σύνδεση στο %s" + +#~ msgid "Reconnect" +#~ msgstr "Επανασύνδεση" + +#~ msgid "Browse Files..." +#~ msgstr "Περιήγηση αρχείων..." + +#~ msgid "Error browsing device" +#~ msgstr "Σφάλμα περιήγησης συσκευής" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "" +#~ "Δεν είναι δυνατή η περιήγηση στην αιτούμενη συσκευή, το σφάλμα είναι '%s'" + +#~ msgid "Wireless" +#~ msgstr "Ασύρματο" + +#~ msgid "VPN Connections" +#~ msgstr "Συνδέσεις VPN" + +#~ msgid "System Settings" +#~ msgstr "Ρυθμίσεις συστήματος" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Το αγαπημένο σας Easter Egg" + +#~ msgid "United Kingdom" +#~ msgstr "Ηνωμένο Βασίλειο" + +#~ msgid "Default" +#~ msgstr "Προεπιλογή" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "απενεργοποιημένοι πάροχοι OpenSearch" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Αποτυχία αποπροσάρτησης '%s'" + +#~ msgid "Retry" +#~ msgstr "Προσπάθεια ξανά" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ΤΟΠΟΘΕΣΙΕΣ & ΣΥΣΚΕΥΕΣ" + +#~ msgid "Home" +#~ msgstr "Προσωπικός φάκελος" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "Σύνδεση σε..." + +#~ msgid "Passphrase" +#~ msgstr "Συνθηματική φράση" + +#~ msgctxt "contact" +#~ msgid "Unknown" +#~ msgstr "Άγνωστο" + +#~ msgid "CONTACTS" +#~ msgstr "ΕΠΑΦΕΣ" + +#~ msgid "%s is online." +#~ msgstr "Ο/η %s είναι συνδεδεμένος" + +#~ msgid "%s is offline." +#~ msgstr "Ο/η %s είναι αποσυνδεδεμένος" + +#~ msgid "%s is away." +#~ msgstr "Ο/η '%s' είναι εκτός. " + +#~ msgid "%s is busy." +#~ msgstr "%s είναι απασχολημένος/η" + +#~ msgid "Show time with seconds" +#~ msgstr "Εμφάνιση ώρας με δευτερόλεπτα" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Αν αληθές, εμφανίζει δευτερόλεπτα στην ώρα." + +#~ msgid "Show date in clock" +#~ msgstr "Εμφάνιση ημερομηνίας στο ρολόι" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Αν αληθές, εμφανίζει την ημερομηνία στο ρολόι επιπλέον της ώρας." + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e %b, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Hidden" +#~ msgstr "Αόρατος" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Εσφαλμένος κωδικός, προσπαθήστε ξανά" + +#~ msgid "Power Off..." +#~ msgstr "Απενεργοποίηση..." + +#~ msgid "Online Accounts" +#~ msgstr "Διαδικτυακοί λογαριασμοί" + +#~ msgid "Log Out..." +#~ msgstr "Αποσύνδεση..." + +#~ msgid "RECENT ITEMS" +#~ msgstr "ΠΡΟΣΦΑΤΑ ΑΝΤΙΚΕΙΜΕΝΑ" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should not be loaded." +#~ msgstr "" +#~ "Οι επεκτάσεις του GNOME Shell έχουν μια ιδιότητα uuid. Αυτό το κλειδί " +#~ "απαριθμεί ποιες επεκτάσεις δεν θα πρέπει να φορτωθούν." + +#~ msgid "Localization Settings" +#~ msgstr "Ρυθμίσεις γλώσσας" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "Είστε συνδεμένοι στο δίκτυο κινητής ευρυζωνικής '%s'" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "Είστε συνδεμένοι στο ασύρματο δίκτυο '%s'" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "Είστε συνδεμένοι στο ενσύρματο δίκτυο '%s'" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "Είστε συνδεμένοι στο VPN δίκτυο '%s'" + +#~ msgid "%s has finished starting" +#~ msgstr "Το %s ολοκλήρωσε την εκκίνηση " + +#~ msgid "Less than a minute ago" +#~ msgstr "Λιγότερο από ένα λεπτό πριν" + +#~ msgid "Home Folder" +#~ msgstr "Προσωπικός φάκελος" + +#, fuzzy +#~ msgid "Shut Down" +#~ msgstr "Τερματισμός..." + +#~ msgid "Clip the crosshairs at the center" +#~ msgstr "Περικοπή του σκοπεύτρου στο κέντρο" + +#~ msgid "Color of the crosshairs" +#~ msgstr "Χρώμα του σκόπευτρου" + +#~ msgid "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." +#~ msgstr "" +#~ "Καθορίζει το μήκος των κάθετων και οριζόντιων γραμμών που απαρτίζουν το " +#~ "σκόπευτρο" + +#~ msgid "Enable lens mode" +#~ msgstr "Ενεργοποίηση λειτουργίας φακού" + +#~ msgid "" +#~ "Enables/disables display of crosshairs centered on the magnified mouse " +#~ "sprite." +#~ msgstr "" +#~ "Ενεργοποιεί/απενεργοποιεί την εμφάνιση σκοπεύτρου στο δείκτη μεγέθυνσης " +#~ "του ποντικιού" + +#~ msgid "Length of the crosshairs" +#~ msgstr "Μήκος του σκοπεύτρου" + +#~ msgid "Magnification factor" +#~ msgstr "Παράγοντας μεγέθυνσης" + +#~ msgid "Mouse Tracking Mode" +#~ msgstr "Λειτουργία Mouse Tracking " + +#~ msgid "Opacity of the crosshairs" +#~ msgstr "Αδιαφάνεια του σκοπεύτρου" + +#~ msgid "Scroll magnified contents beyond the edges of the desktop" +#~ msgstr "" +#~ "Κύλιση σε μεγεθυμένα περιεχόμενα που βρίσκονται έξω από την επιφάνεια" + +#~ msgid "Show or hide crosshairs" +#~ msgstr "Προβολή ή απόκρυψη του σκοπεύτρου" + +#~ msgid "Show or hide the magnifier" +#~ msgstr "Προβολή ή απόκρυψη του μεγεθυντή" + +#~ msgid "Show or hide the magnifier and all of its zoom regions." +#~ msgstr "Προβολή ή απόκρυψη του μεγεθυντή και όλων των περιοχών μεγέθυνσης" + +#~ msgid "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." +#~ msgstr "" +#~ "Το χρώμα των κάθετων και οριζόντιων γραμμών που απαρτίζουν το σκόπευτρο" + +#~ msgid "Thickness of the crosshairs" +#~ msgstr "Πάχος των γραμμών σκοπεύτρου" + +#~ msgid "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." +#~ msgstr "" +#~ " Το πάχος των κάθετων και οριζόντιων γραμμών που απαρτίζουν το σκόπευτρο" + +#~ msgid "PREFERENCES" +#~ msgstr "ΠΡΟΤΙΜΗΣΕΙΣ" + +#~ msgid "Shut Down..." +#~ msgstr "Τερματισμός..." + +#~ msgid "Bluetooth Agent" +#~ msgstr "Υποστήριξη Bluetooth" + +#~ msgid "Search your computer" +#~ msgstr "Αναζήτηση στον υπολογιστή σας" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "" +#~ "Αδυναμία προσθήκης νέου χώρου εργασίας επειδή έχετε φτάσει το μέγιστο " +#~ "αριθμό χώρων εργασίας." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "Δεν είναι δυνατή η αφαίρεση του πρώτου χώρου εργασίας." diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..e4c525f --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,3286 @@ +# British English translation for gnome-shell. +# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Philip Withnall , 2009, 2010, 2014. +# Chris Leonard , 2012. +# Bruce Cowan , 2010-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-02 10:57+0000\n" +"PO-Revision-Date: 2019-03-16 11:19+0000\n" +"Last-Translator: Bruce Cowan \n" +"Language-Team: British English \n" +"Language: en_GB\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: Gtranslator 3.30.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "System" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Show the notification list" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Focus the active notification" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Show the overview" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Show all applications" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Open the application menu" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell Extensions" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configure GNOME Shell Extensions" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Window management and application launching" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Enable internal tools useful for developers and testers from Alt+F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Allows access to internal debugging and monitoring tools using the Alt+F2 " +"dialogue." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs of extensions to enable" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Disable user extensions" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Disables the validation of extension version compatibility" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "List of desktop file IDs for favourite applications" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"The applications corresponding to these identifiers will be displayed in the " +"favourites area." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "App Picker View" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Index of the currently selected view in the application picker." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "History for command (Alt+F2) dialogue" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "History for the looking glass dialogue" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Always show the “Log out” menu item in the user menu." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Whether to remember password for mounting encrypted or remote filesystems" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” tickbox will be present. This key sets the default state " +"of the tickbox." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Whether the default Bluetooth adapter had set up devices associated to it" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Enable introspection API" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Keybinding to open the application menu" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Keybinding to open the application menu." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Keybinding to open the “Show Applications” view" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Keybinding to open the “Show Applications” view of the Activities Overview." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Keybinding to open the overview" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Keybinding to open the Activities Overview." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Keybinding to toggle the visibility of the notification list" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Keybinding to toggle the visibility of the notification list." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Keybinding to focus the active notification" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Keybinding to focus the active notification." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" + +#: data/org.gnome.shell.gschema.xml.in:150 +#| msgid "Show Applications" +msgid "Switch to application 1" +msgstr "Switch to application 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Switch to application 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Switch to application 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Switch to application 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Switch to application 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Switch to application 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Switch to application 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Switch to application 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Switch to application 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Which keyboard to use" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "The type of keyboard to use." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limit switcher to current workspace." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "The application icon mode." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Attach modal dialogue to the parent window" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Enable edge tiling when dropping windows on screen edges" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Workspaces are managed dynamically" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Workspaces only on primary monitor" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Delay focus changes in mouse mode until the pointer stops moving" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Network Login" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Something’s gone wrong" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." + +#: js/extensionPrefs/main.js:130 +#| msgid "Show Details" +msgid "Technical Details" +msgstr "Technical Details" + +#: js/extensionPrefs/main.js:165 +#| msgid "Show Errors" +msgid "Copy Error" +msgstr "Copy Error" + +#: js/extensionPrefs/main.js:185 +#| msgid "Home" +msgid "Homepage" +msgstr "Homepage" + +#: js/extensionPrefs/main.js:186 +#| msgid "UUIDs of extensions to enable" +msgid "Visit extension homepage" +msgstr "Visit extension homepage" + +#: js/extensionPrefs/main.js:449 +#| msgid "No extensions installed" +msgid "No Extensions Installed" +msgstr "No Extensions Installed" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Extensions can be installed through Software or extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Browse in Software" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Cancel" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Next" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Unlock" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Sign In" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Choose Session" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Not listed?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(e.g., user or %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Username: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Login Window" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Authentication error" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(or swipe finger)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Power Off" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "power off;shutdown;reboot;restart" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Lock Screen" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "lock screen" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Log Out" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Suspend" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Switch User" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "switch user" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Lock Orientation" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "lock orientation;screen;rotation" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Command not found" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Could not parse command:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Execution of “%s” failed:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Just now" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minute ago" +msgstr[1] "%d minutes ago" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d hour ago" +msgstr[1] "%d hours ago" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Yesterday" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d day ago" +msgstr[1] "%d days ago" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d week ago" +msgstr[1] "%d weeks ago" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d month ago" +msgstr[1] "%d months ago" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d year ago" +msgstr[1] "%d years ago" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Yesterday, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Yesterday, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l:%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Hotspot Login" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Deny Access" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Grant Access" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Frequently used applications will appear here" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Frequent" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "All" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "New Window" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Launch using Dedicated Graphics Card" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Remove from Favourites" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Add to Favourites" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Show Details" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s has been added to your favourites." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s has been removed from your favourites." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Select Audio Device" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Sound Settings" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Headphones" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Headset" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Microphone" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Change Background…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Display Settings" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Settings" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Previous month" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Next month" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Week %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "All Day" + +#: js/ui/calendar.js:819 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %d %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %d %B, %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "No Notifications" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "No Events" + +#: js/ui/calendar.js:1075 +#| msgid "Clear All" +msgid "Clear" +msgstr "Clear" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” is not responding." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Force Quit" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Wait" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "External drive connected" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "External drive disconnected" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Open with %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Password:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Type again:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Alternatively you can connect by pushing the “WPS” button on your router." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Connect" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Password: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Key: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Private key password: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identity: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Service: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Authentication required by wireless network" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Wired 802.1X authentication" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Network name: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL authentication" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN code required" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN code is needed for the mobile broadband device" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mobile broadband network password" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "A password is required to connect to “%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Network Manager" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Authentication Required" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Authenticate" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Sorry, that didn’t work. Please try again." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s is now known as %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Windows" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Show Applications" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Add world clocks…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "World Clocks" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Weather" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Select a location…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Loading…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Go online for weather information" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Weather information is currently unavailable" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Log Out %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Log Out" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s will be logged out automatically in %d second." +msgstr[1] "%s will be logged out automatically in %d seconds." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "You will be logged out automatically in %d second." +msgstr[1] "You will be logged out automatically in %d seconds." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Log Out" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Power Off" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Install Updates & Power Off" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "The system will power off automatically in %d second." +msgstr[1] "The system will power off automatically in %d seconds." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Install pending software updates" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Restart" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Power Off" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Restart" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "The system will restart automatically in %d second." +msgstr[1] "The system will restart automatically in %d seconds." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Restart & Install Updates" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"The system will automatically restart and install updates in %d second." +msgstr[1] "" +"The system will automatically restart and install updates in %d seconds." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Restart & Install" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Install & Power Off" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Power off after updates are installed" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Restart & Install Upgrade" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Running on battery power: please plug in before installing updates." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Some applications are busy or have unsaved work." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Other users are logged in." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remote)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (console)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Install" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Download and install “%s” from extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s wants to inhibit shortcuts" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Application wants to inhibit shortcuts" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "You can restore shortcuts by pressing %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Deny" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Allow" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Slow Keys Turned On" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Slow Keys Turned Off" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"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." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Sticky Keys Turned On" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Sticky Keys Turned Off" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"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." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"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." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Leave On" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Turn On" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Turn Off" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Leave Off" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Region & Language Settings" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "No extensions installed" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s has not emitted any errors." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Hide Errors" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Show Errors" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Enabled" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Disabled" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Error" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Out of date" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Downloading" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "View Source" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Web Page" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "System Information" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Unknown artist" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Unknown title" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volume" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Undo" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Overview" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Type to search…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "New shortcut…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Application defined" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Show on-screen help" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Switch monitor" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Assign keystroke" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Done" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Edit…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "None" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Press a button to configure" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Press Esc to exit" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Press any key to exit" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Quit" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Activities" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "System" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Top Bar" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Enter a Command" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Close" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Restart is not available on Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Restarting…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d new message" +msgstr[1] "%d new messages" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d new notification" +msgstr[1] "%d new notifications" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Lock" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME needs to lock the screen" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Unable to lock" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Lock was blocked by an application" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Searching…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "No results." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d more" +msgstr[1] "%d more" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Copy" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Paste" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Show Text" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Hide Text" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Password" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Remember Password" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Accessibility" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zoom" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Screen Reader" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Screen Keyboard" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Visual Alerts" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Sticky Keys" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Slow Keys" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Bounce Keys" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Mouse Keys" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "High Contrast" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Large Text" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth Settings" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d Connected" +msgstr[1] "%d Connected" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Off" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "On" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Brightness" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Keyboard" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Show Keyboard Layout" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Location Enabled" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Disable" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Privacy Settings" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Location In Use" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Location Disabled" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Enable" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Give %s access to your location?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Location access can be changed at any time from the privacy settings." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s Off" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s Connected" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s Unmanaged" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s Disconnecting" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s Connecting" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s Requires Authentication" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware Missing For %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s Unavailable" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s Connection Failed" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Wired Settings" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Mobile Broadband Settings" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s Hardware Disabled" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s Disabled" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Connect to Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Aeroplane Mode is On" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi is disabled when aeroplane mode is on." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Turn Off Aeroplane Mode" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi is Off" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi needs to be turned on in order to connect to a network." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Turn On Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi Networks" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Select a network" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "No Networks" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Use hardware switch to turn off" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Select Network" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi Settings" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s Hotspot Active" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s Not Connected" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "connecting…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "authentication required" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "connection failed" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPN Settings" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN Off" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Network Settings" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s Wired Connection" +msgstr[1] "%s Wired Connections" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi Connection" +msgstr[1] "%s Wi-Fi Connections" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s Modem Connection" +msgstr[1] "%s Modem Connections" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Connection failed" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Activation of network connection failed" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Night Light Disabled" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Night Light On" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Resume" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Disable Until Tomorrow" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Power Settings" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Fully Charged" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Not Charging" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Estimating…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d Remaining (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d Until Full (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Screen is Being Shared" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Turn off" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Aeroplane Mode On" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Switch User" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Log Out" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Account Settings" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Orientation Lock" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Suspend" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Power Off" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Unknown Thunderbolt device" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." + +#: js/ui/status/thunderbolt.js:326 +#| msgid "Unknown Thunderbolt device" +msgid "Unauthorized Thunderbolt device" +msgstr "Unauthorised Thunderbolt device" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"New device has been detected and needs to be authorised by an administrator." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt authorisation error" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Could not authorise the Thunderbolt device: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volume changed" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Mirror" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Join Displays" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "External Only" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Built-in Only" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Log in as another user" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Unlock Window" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Applications" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Search" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” is ready" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Do you want to keep these display settings?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Revert Settings" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Keep Changes" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Settings changes will revert in %d second" +msgstr[1] "Settings changes will revert in %d seconds" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimise" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Unmaximise" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximise" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Move" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Resize" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Move Titlebar Onscreen" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Always on Top" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Always on Visible Workspace" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Move to Workspace Left" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Move to Workspace Right" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Move to Workspace Up" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Move to Workspace Down" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Move to Monitor Up" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Move to Monitor Down" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Move to Monitor Left" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Move to Monitor Right" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution Calendar" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Print version" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Mode used by GDM for login screen" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Use a specific mode, e.g. “gdm” for login screen" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "List possible modes" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Unknown" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Failed to launch “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Passwords do not match." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Password cannot be blank" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Authentication dialogue was dismissed by the user" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u Output" +msgstr[1] "%u Outputs" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u Input" +msgstr[1] "%u Inputs" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "System Sounds" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "There was an error loading the preferences dialogue for %s:" + +#~ msgid "%s all day." +#~ msgstr "%s all day." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, then %s later." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, then %s, followed by %s later." + +#~ msgid "Feels like %s." +#~ msgstr "Feels like %s." + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Shell Extension Preferences" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Web Authentication Redirect" + +#~ msgid "Events" +#~ msgstr "Events" + +#~ msgid "Notifications" +#~ msgstr "Notifications" + +#~ msgid "Hide tray" +#~ msgstr "Hide tray" + +#~ msgid "Status Icons" +#~ msgstr "Status Icons" + +#~ msgid "Clear section" +#~ msgstr "Clear section" + +#~ msgid "Media" +#~ msgstr "Media" + +#~ msgid "Not In Use" +#~ msgstr "Not In Use" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Show the week date in the calendar" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "If true, display the ISO week date in the calendar." + +#~ msgid "Use as Internet connection" +#~ msgstr "Use as Internet connection" + +#~ msgid "Show the message tray" +#~ msgstr "Show the message tray" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (Wayland compositor)" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "The maximum accuracy level of location." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Su" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "M" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Tu" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "W" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Th" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "F" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Sa" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nothing Scheduled" + +#~ msgid "Today" +#~ msgstr "Today" + +#~ msgid "Tomorrow" +#~ msgstr "Tomorrow" + +#~ msgid "This week" +#~ msgstr "This week" + +#~ msgid "Next week" +#~ msgstr "Next week" + +#~ msgid "Removable Devices" +#~ msgstr "Removable Devices" + +#~ msgid "Eject" +#~ msgstr "Eject" + +#~ msgid "Invitation" +#~ msgstr "Invitation" + +#~ msgid "Call" +#~ msgstr "Call" + +#~ msgid "File Transfer" +#~ msgstr "File Transfer" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "Unmute" +#~ msgstr "Unmute" + +#~ msgid "Mute" +#~ msgstr "Mute" + +#~ msgid "Invitation to %s" +#~ msgstr "Invitation to %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s is inviting you to join %s" + +#~ msgid "Decline" +#~ msgstr "Decline" + +#~ msgid "Accept" +#~ msgstr "Accept" + +#~ msgid "Video call from %s" +#~ msgstr "Video call from %s" + +#~ msgid "Call from %s" +#~ msgstr "Call from %s" + +#~ msgid "Answer" +#~ msgstr "Answer" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s is sending you %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s would like permission to see when you are online" + +#~ msgid "Authentication failed" +#~ msgstr "Authentication failed" + +#~ msgid "Encryption error" +#~ msgstr "Encryption error" + +#~ msgid "Certificate not provided" +#~ msgstr "Certificate not provided" + +#~ msgid "Certificate untrusted" +#~ msgstr "Certificate untrusted" + +#~ msgid "Certificate expired" +#~ msgstr "Certificate expired" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificate not activated" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Certificate hostname mismatch" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Certificate fingerprint mismatch" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificate self-signed" + +#~ msgid "Status is set to offline" +#~ msgstr "Status is set to offline" + +#~ msgid "Certificate is invalid" +#~ msgstr "Certificate is invalid" + +#~ msgid "Connection has been refused" +#~ msgstr "Connection has been refused" + +#~ msgid "Connection can't be established" +#~ msgstr "Connection can't be established" + +#~ msgid "Connection has been lost" +#~ msgstr "Connection has been lost" + +#~ msgid "This account is already connected to the server" +#~ msgstr "This account is already connected to the server" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "Connection has been replaced by a new connection using the same resource" + +#~ msgid "The account already exists on the server" +#~ msgstr "The account already exists on the server" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Server is currently too busy to handle the connection" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Certificate has been revoked" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Certificate uses an insecure cypher algorithm or is cryptographically weak" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" + +#~ msgid "Internal error" +#~ msgstr "Internal error" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Unable to connect to %s" + +#~ msgid "View account" +#~ msgstr "View account" + +#~ msgid "Open Calendar" +#~ msgstr "Open Calendar" + +#~ msgid "Date & Time Settings" +#~ msgstr "Date & Time Settings" + +#~ msgid "Open" +#~ msgstr "Open" + +#~ msgid "Remove" +#~ msgstr "Remove" + +#~ msgid "Clear Messages" +#~ msgstr "Clear Messages" + +#~ msgid "Notification Settings" +#~ msgstr "Notification Settings" + +#~ msgid "Tray Menu" +#~ msgstr "Tray Menu" + +#~ msgid "No Messages" +#~ msgstr "No Messages" + +#~ msgid "Message Tray" +#~ msgstr "Message Tray" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d Connected Device" +#~ msgstr[1] "%d Connected Devices" + +#~ msgid "Authentication required" +#~ msgstr "Authentication required" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Battery" + +#~ msgid "Airplane Mode" +#~ msgstr "Aeroplane Mode" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "List of categories that should be displayed as folders" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Arrangement of buttons on the titlebar" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Extension" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Select an extension to configure using the combobox above." + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d %B %Y, %H:%M " + +#~| msgid "Settings" +#~ msgid "Settings Menu" +#~ msgstr "Settings Menu" + +#~ msgid "Authorization request from %s" +#~ msgstr "Authorisation request from %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Device %s wants to pair with this computer" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Device %s wants access to the service '%s'" + +#~ msgid "Grant this time only" +#~ msgstr "Grant this time only" + +#~ msgid "Reject" +#~ msgstr "Reject" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Pairing confirmation for %s" + +#~| msgid "" +#~| "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." + +#~ msgid "Matches" +#~ msgstr "Matches" + +#~ msgid "Does not match" +#~ msgstr "Does not match" + +#~ msgid "Pairing request for %s" +#~ msgstr "Pairing request for %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Please enter the PIN mentioned on the device." + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "unavailable" +#~ msgstr "unavailable" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s the Oracle says" + +#~ msgid "Screenshots" +#~ msgstr "Screenshots" + +#~ msgid "Record a screencast" +#~ msgstr "Record a screencast" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Whether to collect statistics about application usage" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove existing data." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Keybinding to toggle the screen recorder" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Keybinding to start/stop the builtin screen recorder." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Framerate used for recording screencasts." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames per second." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "The GStreamer pipeline used to encode the screencast" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "File extension used for storing the screencast" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "Session…" + +#~ msgid "Power" +#~ msgstr "Power" + +#~ msgid "Restart" +#~ msgstr "Restart" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Screencast from %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "Click Log Out to quit these applications and log out of the system." + +#~ msgid "Logging out of the system." +#~ msgstr "Logging out of the system." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Click Power Off to quit these applications and power off the system." + +#~ msgid "Powering off the system." +#~ msgstr "Powering off the system." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "Click Restart to quit these applications and restart the system." + +#~ msgid "Restarting the system." +#~ msgstr "Restarting the system." + +#~ msgid "Universal Access Settings" +#~ msgstr "Universal Access Settings" + +#~ msgid "Visibility" +#~ msgstr "Visibility" + +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "Set Up a New Device…" + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "Send Files…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Keyboard Settings" + +#~ msgid "Mouse Settings" +#~ msgstr "Mouse Settings" + +#~ msgid "Volume, network, battery" +#~ msgstr "Volume, network, battery" + +#~ msgid "disabled" +#~ msgstr "disabled" + +#~ msgid "cable unplugged" +#~ msgstr "cable unplugged" + +#~ msgid "More…" +#~ msgstr "More…" + +#~ msgid "Wired" +#~ msgstr "Wired" + +#~ msgid "Auto Ethernet" +#~ msgstr "Auto Ethernet" + +#~ msgid "Auto broadband" +#~ msgstr "Auto broadband" + +#~ msgid "Auto dial-up" +#~ msgstr "Auto dial-up" + +#~ msgid "Auto %s" +#~ msgstr "Auto %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Auto bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Auto wireless" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d hour remaining" +#~ msgstr[1] "%d hours remaining" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s remaining" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "hour" +#~ msgstr[1] "hours" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minute" +#~ msgstr[1] "minutes" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d minute remaining" +#~ msgstr[1] "%d minutes remaining" + +#~| msgid "AC adapter" +#~ msgid "AC Adapter" +#~ msgstr "AC Adapter" + +#~| msgid "Laptop battery" +#~ msgid "Laptop Battery" +#~ msgstr "Laptop Battery" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgid "Mouse" +#~ msgstr "Mouse" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~| msgid "Cell phone" +#~ msgid "Cell Phone" +#~ msgstr "Mobile Phone" + +#~| msgid "Media player" +#~ msgid "Media Player" +#~ msgstr "Media Player" + +#~ msgid "Tablet" +#~ msgstr "Tablet" + +#~ msgid "Computer" +#~ msgstr "Computer" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Unknown" + +#~ msgid "Available" +#~ msgstr "Available" + +#~ msgid "Busy" +#~ msgstr "Busy" + +#~ msgid "Invisible" +#~ msgstr "Invisible" + +#~ msgid "Away" +#~ msgstr "Away" + +#~ msgid "Idle" +#~ msgstr "Idle" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Your chat status will be set to busy" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Shutting down might cause them to lose unsaved work." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Sign In" + +#~ msgid "APPLICATIONS" +#~ msgstr "APPLICATIONS" + +#~ msgid "SETTINGS" +#~ msgstr "SETTINGS" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Subscription request" +#~ msgstr "Subscription request" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Sent at %X on %A" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Sent on %A, %d %B, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Connection to %s failed" + +#~ msgid "Reconnect" +#~ msgstr "Reconnect" + +#~ msgid "tray" +#~ msgstr "tray" + +#~ msgid "Browse Files..." +#~ msgstr "Browse Files…" + +#~ msgid "Error browsing device" +#~ msgstr "Error browsing device" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "The requested device cannot be browsed, error is '%s'" + +#~ msgid "More..." +#~ msgstr "More…" + +#~ msgid "Wireless" +#~ msgstr "Wireless" + +#~ msgid "VPN Connections" +#~ msgstr "VPN Connections" + +#~ msgid "System Settings" +#~ msgstr "System Settings" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Your favourite Easter Egg" + +#~ msgid "United Kingdom" +#~ msgstr "United Kingdom" + +#~ msgid "Default" +#~ msgstr "Default" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "disabled OpenSearch providers" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Failed to unmount '%s'" + +#~ msgid "Retry" +#~ msgstr "Retry" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "PLACES & DEVICES" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Show time with seconds" +#~ msgstr "Show time with seconds" + +#~ msgid "If true, display seconds in time." +#~ msgstr "If true, display seconds in time." + +#~ msgid "Show date in clock" +#~ msgstr "Show date in clock" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "If true, display date in the clock, in addition to time." + +#~ msgid "CONTACTS" +#~ msgstr "CONTACTS" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e %b, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Connect to..." +#~ msgstr "Connect to…" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Wrong password, please try again" + +#~ msgid "%s is online." +#~ msgstr "%s is online." + +#~ msgid "%s is offline." +#~ msgstr "%s is offline." + +#~ msgid "%s is away." +#~ msgstr "%s is away." + +#~ msgid "%s is busy." +#~ msgstr "%s is busy." + +#~ msgid "Hidden" +#~ msgstr "Hidden" + +#~ msgid "Power Off..." +#~ msgstr "Power Off…" + +#~ msgid "Online Accounts" +#~ msgstr "Online Accounts" + +#~ msgid "Log Out..." +#~ msgstr "Log Out…" + +#~ msgid "RECENT ITEMS" +#~ msgstr "RECENT ITEMS" + +#~ msgid "Home Folder" +#~ msgstr "Home Folder" + +#~ msgid "Show password" +#~ msgstr "Show password" + +#~ msgid "If true, display onscreen keyboard." +#~ msgstr "If true, display on-screen keyboard." + +#~ msgid "Connectivity lost" +#~ msgstr "Connectivity lost" + +#~ msgid "You're no longer connected to the network" +#~ msgstr "You're no longer connected to the network" + +#~ msgid "%s has finished starting" +#~ msgstr "%s has finished starting" + +#~ msgid "Localization Settings" +#~ msgstr "Localisation Settings" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "You're now connected to mobile broadband connection '%s'" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "You're now connected to wireless network '%s'" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "You're now connected to VPN network '%s'" + +#~ msgid "Less than a minute ago" +#~ msgstr "Less than a minute ago" + +#~ msgid "Shut Down" +#~ msgstr "Shut Down" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "" +#~ "Click Shut Down to quit these applications and shut down the system." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "The system will shut down automatically in %d seconds." + +#~ msgid "Shutting down the system." +#~ msgstr "Shutting down the system." + +#~ msgid "Confirm" +#~ msgstr "Confirm" + +#~ msgid "Panel" +#~ msgstr "Panel" + +#~ msgid "Customize the panel clock" +#~ msgstr "Customise the panel clock" + +#~ msgid "Custom format of the clock" +#~ msgstr "Custom format of the clock" + +#~ msgid "Hour format" +#~ msgstr "Hour format" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." +#~ msgstr "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." + +#~ msgid "Overview workspace view mode" +#~ msgstr "Overview workspace view mode" + +#~ msgid "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." +#~ msgstr "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." + +#~ msgid "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." +#~ msgstr "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." + +#~ msgid "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." +#~ msgstr "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." + +#~ msgid "Clock Format" +#~ msgstr "Clock Format" + +#~ msgid "Clock Preferences" +#~ msgstr "Clock Preferences" + +#~ msgid "Show seco_nds" +#~ msgstr "Show seco_nds" + +#~ msgid "_12 hour format" +#~ msgstr "_12 hour format" + +#~ msgid "_24 hour format" +#~ msgstr "_24 hour format" + +#~ msgid "PREFERENCES" +#~ msgstr "PREFERENCES" + +#~ msgid "Drag here to add favorites" +#~ msgstr "Drag here to add favourites" + +#~ msgid "Find" +#~ msgstr "Find" + +#~ msgid "Preferences" +#~ msgstr "Preferences" + +#~ msgid "ON" +#~ msgstr "ON" + +#~ msgid "OFF" +#~ msgstr "OFF" + +#~ msgid "System Preferences..." +#~ msgstr "System Preferences…" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "Can't remove the first workspace." + +#~ msgid "Sidebar" +#~ msgstr "Sidebar" + +#~ msgid "Recent Documents" +#~ msgstr "Recent Documents" + +#~ msgid "Browse" +#~ msgstr "Browse" + +#~ msgid "(see all)" +#~ msgstr "(see all)" + +#~ msgid "PLACES" +#~ msgstr "PLACES" + +#~ msgid "SEARCH RESULTS" +#~ msgstr "SEARCH RESULTS" + +#~ msgid "Can't lock screen: %s" +#~ msgstr "Can't lock screen: %s" + +#~ msgid "Can't temporarily set screensaver to blank screen: %s" +#~ msgstr "Can't temporarily set screensaver to blank screen: %s" + +#~ msgid "Can't logout: %s" +#~ msgstr "Can't logout: %s" diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 0000000..6e8b0a5 --- /dev/null +++ b/po/eo.po @@ -0,0 +1,2719 @@ +# Esperanto translation for gnome-shell. +# Copyright (C) 2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Tiffany ANTOPOLSKI , 2011, 2012. +# Ryan LORTIE , 2013. +# Daniel PUENTES , 2015. +# Nicolas MAIA < >, 2015. +# Kristjan SCHMIDT , 2011, 2012, 2015, 2016, 2018. +# Carmen Bianca BAKKER , 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-24 17:37+0000\n" +"PO-Revision-Date: 2019-03-31 00:14+0100\n" +"Last-Translator: Carmen Bianca Bakker \n" +"Language-Team: Esperanto \n" +"Language: eo\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.2.1\n" +"X-DamnedLies-Scope: partial\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistemo" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Montri la sciig-liston" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokusi la aktivan sciigon" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Montri la superrigardon" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Montri ĉiujn aplikaĵojn" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Malfermi la aplikaĵo-menuon" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Ŝelaj kromprogramoj" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Agordi GNOME-ŝelajn kromprogramojn" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME-ŝelo" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Fenestroadministrado kaj aplikaĵo-lanĉado" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Ŝalti internajn ilojn por programistoj kaj testantoj per Alt+F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permesas aliron al interna sencimigaj kaj kontroladaj iloj uzante la Alt+F2-" +"dialogon." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID-oj de ŝaltendaj kromprogramoj" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME-ŝelaj kromprogramoj havas UUID-atributon; ĉi tiu ŝlosilo listigas " +"kromprogramojn kiuj devus ŝargitiĝi. Iu ajn kromprogramo kiu volas esti " +"ŝargita devas esti en ĉi tiu listo. Vi povas ankaŭ ŝanĝi ĉi tiun liston per " +"la ‘EnableExtension’- kaj ‘DisableExtension’ D-Bus-metodoj sur org.gnome." +"Shell." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Malŝaltas la validigadon de kromprogramversia kongrueco" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME-ŝelo nur ŝargos kromprogramojn, kiuj asertas subteni la aktualan " +"rulantan version. Ŝaltante tiun ĉi opcion, oni malŝaltas tiun kontrolon kaj " +"ŝargos ĉiujn kromprogramojn, sendepende de la versioj, ke tiuj kromprogramoj " +"asertas subteni." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Listo de la identiloj de la labortablaj dosieroj por preferataj aplikaĵoj" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"La aplikaĵoj kiuj korespondas al tiuj identigiloj estos montrita en la areo " +"de la preferataj aplikaĵoj." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Aplikaĵa elektila vido" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indekso de aktuala elektita vido ĉe la aplikaĵa elektilo." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historio de la komando-dialogo (Alt+F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historio de la dialogo de ‘looking glass’" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Ĉiam montri la “Adiaŭi”-menuero en la uzanto-menuo." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Ĉi ŝlosilo transpasas la aŭtomatan kaŝon de la “Adiaŭi”-menuero por sola-" +"uzanto, sola-seanco situacioj." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "Ĉu memorigi pasvorton por surmeti ĉifritajn aŭ forajn dosiersistemojn" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"La ŝelo petos pasvorton kiam ĉifrita aparato aŭ defora dosiersistemo estas " +"surmetata. Se la pasvorto konserveblas por estonta uzo, “Memorigi pasvorton” " +"markobutono montritos. Ĉi ŝlosilo agordas la implicitan staton de la " +"markobutono." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Klavkombino por malfermi la aplikaĵo-menuon" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Klavkombino por malfermi la aplikaĵo-menuon." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Klavkombino por malfermi la “Montri aplikaĵojn”-vidon" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la Aktivecoj-" +"Superrigardo." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Klavkombino por malfermi la superrigardon" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Klavkombino por malfermi la Aktivecoj-Superrigardon." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Klavkombino por baskuligi la videblecon de la sciigolisto" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Klavkombino por baskuligi la videblecon de la sciigolisto." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Klavkombino por fokusi la aktivan sciigon" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Klavkombino por fokusi la aktivan sciigon." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Klavkombino, kiu paŭzigas kaj malpaŭzigas ĉiujn rulantajn “tween”-oj, por " +"sencimigaj aferoj" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Ŝanĝi al aplikaĵo 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Ŝanĝi al aplikaĵo 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Ŝanĝi al aplikaĵo 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Ŝanĝi al aplikaĵo 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Ŝanĝi al aplikaĵo 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Ŝanĝi al aplikaĵo 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Ŝanĝi al aplikaĵo 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Ŝanĝi al aplikaĵo 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Ŝanĝi al aplikaĵo 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Uzenda klavaro" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "La uzenda klavarspeco." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limigi ŝaltilon al aktuala laborspaco." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Se vera, nur aplikaĵoj, kiuj havas fenestrojn en la aktuala laborspaco, " +"estas montritaj en la ŝaltilo. Alimaniere, ĉiuj aplikaĵoj estas inkluzivitaj." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "La aplikaĵo bildsimbola reĝimo." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Agordas kiel la fenestro montritas en la ŝaltilo. Eblaj valoroj estas " +"“thumbnail-only” (nur bildeto), “app-icon-only” (nur aplikaĵa bildsimbolo) " +"aŭ “both” (ambaŭ)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Se vera, nur fenestroj de la nuna laborspaco estas montrataj en la ŝaltilo. " +"Alimaniere, ĉiuj fenestroj estas inkluzivitaj." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Kunligi modalan dialogon al la patra fenestro" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ĉi ŝlosilo transpasas la ŝlosilon en org.gnome.mutter kiam uzanta GNOME-" +"ŝelon." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Aktivigi kahelan aranĝon kiam demetante fenestrojn sur ekranaj borderoj" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Laborspacoj administratas dinamike" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Laborspacoj nur sur la ĉefa ekrano" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "En musa reĝimo, prokrasti ŝanĝi fokuson ĝis la musmontrilo haltas" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Reta saluto" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Io fiaskis" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Ni pardonpetas, sed estis problemo: la agordoj de ĉi tiu etendaĵo ne " +"montreblas. Ni rekomendas, ke vi raportu la problemon al la aŭtoroj de la " +"etendaĵo." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Teĥnikaj detaloj" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Kopii eraron" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Hejmpaĝo" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Viziti hejmpaĝon de etendaĵo" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Neniu etendaĵo instalita" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Oni povas instali etendaĵoj per Programaro aŭ extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Foliumi en Programaro" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Nuligi" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Sekva" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Malŝlosi" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Saluti" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Elekti seancon" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Ĉu ne en listo?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ekzemple, uzanto aŭ %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Uzantonomo: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Salutfenestro" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Aŭtentigo-eraro" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(aŭ pasu fingron)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Malŝalti" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "malŝalti;sistemfermo;restartigi;reŝargi" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Ŝlosa ekrano" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "ŝlosa ekrano" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Adiaŭi" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "adiaŭi" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Halteti" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "halteti;dormi;dormeti" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Ŝanĝi uzanton" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "ŝanĝi uzanton" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Ŝlosa orientiĝo" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "ŝlosa orientiĝo;ekrano;turno;rotacio" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Komando ne trovita" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Ne eblis analizi komandon:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Plenumo de “%s” malsukcesis:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Ĵus" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Antaŭ %d minuto" +msgstr[1] "Antaŭ %d minutoj" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Antaŭ %d horo" +msgstr[1] "Antaŭ %d horoj" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Hieraŭ" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Antaŭ %d tago" +msgstr[1] "Antaŭ %d tagoj" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Antau %d semajno" +msgstr[1] "Antau %d semajnoj" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Antaŭ %d monato" +msgstr[1] "Antaŭ %d monatoj" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Antaŭ %d jaro" +msgstr[1] "Antaŭ %d jaroj" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Hieraŭ, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d-a de %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d-a de %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Hieraŭ, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d-a de %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d-a de %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Retkapteja salutado" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Via konekto al ĉi tiu retkapetja salutado ne estas sekura. Pasvortojn kaj " +"aliajn informojn, kiujn vi enigas en ĉi tiu paĝo, apudaj aliuloj povas vidi." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Rifuzi aliron" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Konsenti aliron" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Ofte uzataj aplikaĵoj aperos ĉi tie" + +# Oftaj aplikaĵoj --Carmen +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Oftaj" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Ĉiuj" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Nova fenestro" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Lanĉi uzante dediĉitan vidkarton" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Forigi el preferataj" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Aldoni al preferataj" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Montri detalojn" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s estas aldonita de via preferataj aplikaĵoj." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s estas forigita de via preferataj aplikaĵoj." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Elekti sonaparaton" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Sonagordoj" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Kapaŭskultilo" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Kaptelefono" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofono" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Ŝanĝi ekranfonon…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Ekran-agordoj" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Agordoj" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "d" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "l" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "m" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "m" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "ĵ" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "v" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "s" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Antaŭa monato" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Sekva monato" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%-d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Semajno %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Tuttaga" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d-a de %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d-a de %B %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Neniu sciigo" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Neniu evento" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Vakigi" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” ne respondas." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "Vi povas atendi por ke ĝi daŭrigu aŭ devigi ke la aplikaĵo ĉesu." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Devige ĉesigi" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Atendi" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Ekstera disko konektitas" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Ekstera disko malkonektitas" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Malfermi per %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Pasvorto:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Tajpu denove:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Konekti" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Pasvorto: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Ŝlosilo: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Pasvorto por privata ŝlosilo: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identeco: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Servo: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Aŭtentigo estas bezonata de sendrata reto" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Pasvortoj aŭ ĉifro-ŝlosiloj estas necesaj por aliro al sendrata reto “%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Dratita 802.1X aŭtentokontrolo" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Reta nomo: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL-a aŭtentokontrolo" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN-kodo bezonata" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN-kodo estas bezonata por la portebla larĝkapacita aparato" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Portebla larĝkapacita retopasvorto" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Pasvorto estas bezonata por konekti al “%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Retadministrilo" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Aŭtentigo bezonata" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administranto" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Aŭtentigi" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Pardonon, tio ne funkciis. Bonvolu provi denove." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s estas nun konata kiel %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Fenestroj" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Montri aplikaĵojn" + +# Kiel macOS «dock”. --Carmen +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Doko" + +# Komento por tradukantoj estas neĝusta? --Carmen +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d-a de %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %-d-a de %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Aldoni mondajn horloĝojn…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Mondaj horloĝoj" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Vetero" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Elekti lokon…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Ŝargante…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Enretigi por veterinformoj" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Veterinformoj ĉimomente nehaveblas" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Adiaŭi %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Adiaŭi" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s aŭtomate adiaŭos post %d sekundo." +msgstr[1] "%s aŭtomate adiaŭos post %d sekundoj." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Vi aŭtomate adiaŭos post %d sekundo." +msgstr[1] "Vi aŭtomate adiaŭos post %d sekundoj." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Adiaŭi" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Malŝalti" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instali ĝisdatigojn & malŝalti" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "La sistemo aŭtomate malŝaltiĝos post %d sekundo." +msgstr[1] "La sistemo aŭtomate malŝaltiĝos post %d sekundoj." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instali okazontajn ĝisdatigojn" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Restartigi" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Malŝalti" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Restartigi" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "La sistemo aŭtomate restartiĝos post %d sekundo." +msgstr[1] "La sistemo aŭtomate restartiĝos post %d sekundoj." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Restartigi & instali ĝisdatigojn" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"La sistemo aŭtomate restartiĝos kaj instalos ĝisdatigojn post %d sekundo." +msgstr[1] "" +"La sistemo aŭtomate restartiĝos kaj instalos ĝisdatigojn post %d sekundoj." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Restartigi & instali" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instali & malŝalti" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Malŝalti post instalado de ĝisdatigoj" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Restarti & instali ĝisdatigon" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s instaliĝos post restarto. Instalado de tiu ĝisdatigo povas daŭri " +"longe: certigu, ke viaj datumoj sekurkopiiĝis kaj via komputilo konektiĝis." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Uzante baterielektron: bonvolu konekti antaŭ ol instali ĝisdatigojn." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Iuj aplikaĵoj okupitas aŭ havas nekonservitan laboron." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Aliaj uzantoj estas salutitaj." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (defora)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konzolo)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Instali" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s volas malebligi klavkombinojn" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplikaĵo volas malebligi klavkombinojn" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Vi povas restaŭri klavkombinojn per premi %s." + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "Rifuzi" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "Akcepti" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Malrapidaj klavoj ŝaltitaj" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Malrapidaj klavoj malŝaltitaj" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Vi premis la majuskligan klavon por 8 sekundoj. Ĉi tiu estas la klavkombino " +"por la malrapidaj klavoj funkcio, kiu ŝanĝas la konduton de via klavaro." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Fiksaj klavoj ŝaltitaj" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Fiksaj klavoj malŝaltitaj" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Vi premis la majuskligan klavon kvinfoje. Ĉi tiu estas la klavkombino por la " +"fiksaj klavoj funkcio, kiu ŝanĝas la konduton de via klavaro." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Vi premis du klavojn samtempe, aŭ premis la majuskligan klavon kvinfoje. Ĉi " +"tiu malŝaltas la fiksaj klavoj funkcion, kiu ŝanĝas la konduton de via " +"klavaro." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Lasi ŝaltita" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Ŝalti" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Malŝalti" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Lasi malŝaltita" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "Regiono & lingvo agordoj" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Neniu kromprogramo instalita" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ne eligintaj ajnaj eraroj." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Kaŝi erarojn" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Montri erarojn" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Enŝaltita" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Elŝaltita" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Eraro" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Neaktuala" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Elŝutante" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Montri fonton" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Retpaĝo" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Sisteminformoj" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Nekonata artisto" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Nekonata titolo" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Laŭteco" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Malfari" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Superrigardo" + +# Imperativo +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Tajpu por serĉi…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Nova klavkombino…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Aplikaĵo difinita" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Montri surekranan helpon" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Ŝanĝi ekranon" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Asigni klavpremon" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Plenumita" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Redakti…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Neniu" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Premu klavon por agordi" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Premu Esk-klavon por ĉesi" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Premu iun ajn klavon por ĉesi" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Ĉesi" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Aktivecoj" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistemo" + +#: js/ui/panel.js:867 +msgid "Top Bar" +msgstr "Supra breto" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Enigu komandon" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Fermi" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Restartigado ne disponeblas sur Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Restartante…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %-d-a de %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nova mesaĝo" +msgstr[1] "%d novaj mesaĝoj" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nova sciigo" +msgstr[1] "%d novaj sciigoj" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:271 +msgid "Lock" +msgstr "Ŝlosi" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME bezonas ŝlosi la ekranon" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "Ne eblas ŝlosi" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "Ŝloso estis blokita de aplikaĵo" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Serĉante…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Neniuj rezultoj." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d pli" +msgstr[1] "%d pli" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopii" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Alglui" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Montri tekston" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Kaŝi tekston" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Pasvorto" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Memorigi pasvorton" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Atingeblo" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zomi" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Ekrana legilo" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Ekrana klavaro" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Vidaj avertoj" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Fiksaj klavoj" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Malrapidaj klavoj" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Saltaj klavoj" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Musklavoj" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Alta kontrasto" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Granda teksto" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bludento" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bludento-agordoj" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d Konektita" +msgstr[1] "%d Konektitaj" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Malŝaltita" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Ŝaltita" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Brileco" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Klavaro" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Montri klavararanĝon" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Loko ŝaltita" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Malŝalti" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Privatecaj agordoj" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Loko uzata" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Loko malŝaltita" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Ŝalti" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Ĉu permesi al %s aliri vian lokon?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Loka aliro povas ŝanĝiĝi iam ajn en la privateco-agordoj." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s malŝaltita" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s konektita" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s nemastrumita" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s malkonektante" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "%s konektante" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s postulas aŭtentigon" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Mikroprogramo mankas por %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nedisponebla" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s konekto malsukcesis" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Drataj agordoj" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Porteblaj larĝkapacitaj agordoj" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s aparataro malŝaltita" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s malŝaltita" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Konekti al interreto" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Aviadila reĝimo ŝaltita" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Malŝalti aviadilan reĝimon" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Vifio malŝaltita" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Necesas ŝalti vifion por konekti al reto." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Ŝalti vifion" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Vifiaj retoj" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Elekti reton" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Neniu reto" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Uzi aparataran ŝaltilon por malŝalti" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Elekti reton" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Vifio-agordoj" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s retkaptejo aktiva" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s ne konektita" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "konektante…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "aŭtentigo necesas" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "konekto malsukcesis" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "VPR-agordoj" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPR" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPR malŝaltita" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Ret-agordoj" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s drata konekto" +msgstr[1] "%s drataj konektoj" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s vifia konekto" +msgstr[1] "%s vifiaj konektoj" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modema konekto" +msgstr[1] "%s modemaj konektoj" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "Konekto malsukcesis" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "Aktivigo de reto-konekto malsukcesis" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Noktlumo malŝaltita" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Noktlumo ŝaltita" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Daŭrigi" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Malŝalti ĝis morgaŭ" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Elektro-agordoj" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Plene ŝargita" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Ne ŝargante" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Taksante…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Restas %d:%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d ĝis plena (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Ekrano estas kunhavigita" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Malŝalti" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Aviadila reĝimo ŝaltita" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Ŝanĝi uzanton" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Adiaŭi" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Kontoagordoj" + +#: js/ui/status/system.js:256 +msgid "Orientation Lock" +msgstr "Orientiĝa ŝloso" + +#: js/ui/status/system.js:282 +msgid "Suspend" +msgstr "Dormeti" + +#: js/ui/status/system.js:292 +msgid "Power Off" +msgstr "Malŝalti" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Nekonata Thunderbolt aparato" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Nova aparato detektiĝis kiam vi estis for. Bonvolu malkonekti kaj rekonekti " +"vian aparaton por uzi ĝin." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Ne-aŭtentigita Thunderbolt aparato" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Detektis novan aparaton kiu bezonas aŭtentigon de administranto." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt aŭtentiga eraro" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Ne povis aŭtentigi la Thunderbolt aparaton: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Laŭteco ŝanĝita" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Speguli" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Kunigi ekranojn" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Nur ekstera" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Nur integrita" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Saluti kiel alia uzanto" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Malŝlosi fenestron" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplikaĵoj" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Serĉi" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” pretas" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Ĉu vi volas konservi ĉi tiujn ekranajn agordojn?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Malfari ŝanĝojn" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Konservi ŝanĝojn" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Agordaj ŝanĝoj malfaritos post %d sekundo" +msgstr[1] "Agordaj ŝanĝoj malfaritos post %d sekundoj" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimumigi" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Malmaksimumigi" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maksimumigi" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Movi" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Regrandigi" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Movi titolbreton surekranen" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Ĉiam supre" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Ĉiam je videbla laborspaco" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Movi al maldekstra laborspaco" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Movi al dekstra laborspaco" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Movi al supra laborspaco" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Movi al suba laborspaco" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Movi al supra ekrano" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Movi al suba ekrano" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Movi al maldekstra ekrano" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Movi al dekstra ekrano" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolucio-kalendaro" + +#: src/main.c:408 +msgid "Print version" +msgstr "Presi version" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Reĝimo uzata de GDM por la salut-ekrano" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Uzi specifan reĝimon, ekz. “gdm” por la salut-ekrano" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Listigi eblajn reĝimojn" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "Nekonata" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Malsukcesis lanĉi “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Pasvortoj ne kongruas." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Pasvorto ne povas esti malplena" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "La uzanto malakceptis la aŭtentigan dialogon" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u eligo" +msgstr[1] "%u eligoj" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u enigo" +msgstr[1] "%u enigoj" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Sistemsonoj" + +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %s:" + +#~ msgid "%s all day." +#~ msgstr "%s tuttage." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, tiam %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, tiam %s, sekve %s." + +#~ msgid "Feels like %s." +#~ msgstr "Sentas kiel %s." + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Agordoj de kromprogramoj de GNOME-ŝelo" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Montri la semajnajntagon en la kalendaro" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Montri la semajndaton laŭ ISO en la kalendaro." + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Reta aŭtentokontrola alidirekto" + +#~ msgid "Events" +#~ msgstr "Eventoj" + +#~ msgid "Notifications" +#~ msgstr "Sciigoj" + +#~ msgid "Hide tray" +#~ msgstr "Kaŝi pleton" + +#~ msgid "Status Icons" +#~ msgstr "Stato-piktogramoj" + +#~ msgid "Clear section" +#~ msgstr "Forviŝi sekcion" + +#~ msgid "Not In Use" +#~ msgstr "Ne uzata" + +#~ msgid "Use as Internet connection" +#~ msgstr "Uzi kiel interreta konekto" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME-ŝelo (wayland kunmetilo)" + +#~ msgid "Show the message tray" +#~ msgstr "Montri la mesaĝo-pleton" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "di" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "lu" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "ma" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "me" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "ĵa" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "ve" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "sa" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nenio estas planita" + +#~ msgid "Today" +#~ msgstr "Hodiaŭ" + +#~ msgid "Tomorrow" +#~ msgstr "Morgaŭ" + +#~ msgid "This week" +#~ msgstr "Ĉi tiu semajno" + +#~ msgid "Next week" +#~ msgstr "Sekva semajno" + +#~ msgid "Removable Devices" +#~ msgstr "Demeteblaj aparatoj" + +#~ msgid "Eject" +#~ msgstr "Elĵeti" + +#~ msgid "Invitation" +#~ msgstr "Invito" + +#~ msgid "Call" +#~ msgstr "Voki" + +#~ msgid "File Transfer" +#~ msgstr "Dosiertransigo" + +#~ msgid "Chat" +#~ msgstr "Babili" + +#~ msgid "Unmute" +#~ msgstr "Malsilentigi" + +#~ msgid "Mute" +#~ msgstr "Silentigi" + +#~ msgid "Invitation to %s" +#~ msgstr "Invito al %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s invitas vin aliĝi al %s" + +#~ msgid "Decline" +#~ msgstr "Refuzi" + +#~ msgid "Accept" +#~ msgstr "Akcepti" + +#~ msgid "Video call from %s" +#~ msgstr "Videa voko de %s" + +#~ msgid "Call from %s" +#~ msgstr "Voko de %s" + +#~ msgid "Answer" +#~ msgstr "Repondo" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s sendas %s al vi" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s volus permiso por vidi kiam vi estas konektita" + +#~ msgid "Authentication failed" +#~ msgstr "Aŭtentigo malsukcesis" + +#~ msgid "Encryption error" +#~ msgstr "Ĉifrado-eraro" + +#~ msgid "Certificate not provided" +#~ msgstr "Atestilo ne donita" + +#~ msgid "Certificate untrusted" +#~ msgstr "Malfidita atestilo" + +#~ msgid "Certificate expired" +#~ msgstr "Posttempa atestilo" + +#~ msgid "Certificate not activated" +#~ msgstr "Atestilo ne aktivigita" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Atestilo-nomo de gastiga komputilo miskongruas" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Atestilo-fingropremo miskongruas" + +#~ msgid "Certificate self-signed" +#~ msgstr "Memsubskribita atestilo" + +#~ msgid "Status is set to offline" +#~ msgstr "Stato agordas kiam nekonektita." + +#~ msgid "Certificate is invalid" +#~ msgstr "Nevalida atestilo" + +#~ msgid "Connection has been refused" +#~ msgstr "Refuzinta konekto" + +#~ msgid "Connection can't be established" +#~ msgstr "Ne povas establi konekton" + +#~ msgid "Connection has been lost" +#~ msgstr "Konekto perdiĝis" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Ĉi tio konto estas jam konektata al servilo" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Konekto anstataŭigis per nova konekto uzanta la saman risurcon" + +#~ msgid "The account already exists on the server" +#~ msgstr "La konto jam ekzistas sur la servilo" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Servilo estas nun tro okupata por akcepti la konekton" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Atestilo senvalidigita" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Atestilo uzas malsekuran ĉifrigan algoritmon aŭ estas kriptografie " +#~ "malforta." + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "La longeco de la servilo-atestilo, aŭ la profundeco de la servilo-" +#~ "atestilo ĉeno, transpasita la maksimumo altrudis per la biblioteko de " +#~ "kriptografia." + +#~ msgid "Internal error" +#~ msgstr "Interna eraro" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Ne povas konekti al %s" + +#~ msgid "View account" +#~ msgstr "Vidi konton" + +#~ msgid "Open Calendar" +#~ msgstr "Malfermi kalendaron" + +#~ msgid "Open" +#~ msgstr "Malfermi" + +#~ msgid "Remove" +#~ msgstr "Forigi" + +#~ msgid "Clear Messages" +#~ msgstr "Vakigi mesaĝojn" + +#~ msgid "Notification Settings" +#~ msgstr "Sciigaj agordoj" + +#~ msgid "Tray Menu" +#~ msgstr "Pleto-menuo" + +#~ msgid "No Messages" +#~ msgstr "Neniuj mesaĝoj" + +#~ msgid "Message Tray" +#~ msgstr "Mesaĝa pleto" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d konektita aparato" +#~ msgstr[1] "%d konektitaj aparatoj" + +#~| msgid "authentication required" +#~ msgid "Authentication required" +#~ msgstr "Aŭtentokontrolo estas bezonata" + +#~ msgid "UPS" +#~ msgstr "vicnutrilo" + +#~ msgid "Battery" +#~ msgstr "Baterio" + +#~ msgid "Airplane Mode" +#~ msgstr "Aviadila reĝimo" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Listo de kategorioj kiu devus montriĝi kiel dosierujoj" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Ĉiu kategoria nomo en ĉi listo prezentitos kiel dosierujoj en la aplikaĵa " +#~ "vido anstantaŭ montriĝi entekste en la ĉefa vido." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Aranĝo de butonoj sur la titola breto" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Ĉi ŝlosilo atutas la ŝlosilon en 'org.gnome.desktop.wm.preferences' kiam " +#~ "uzanta GNOME-ŝelon." + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Elekti kromprogramon por agordi uzanta la redaktebla falmenuo supre." + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Authorization request from %s" +#~ msgstr "Rajtigpeto de %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Aparato %s volas pariĝi kun tiu ĉi komputilo" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Aparato '%s' volas aliron al servo '%s'" + +#~ msgid "Grant this time only" +#~ msgstr "Konsenti nur ĉi tiun fojon" + +#~ msgid "Reject" +#~ msgstr "Rifuzi" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Pariĝ-konfirmo por %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Bonvole konfirmu ĉu la PIN-kodo '%06d' kongruas kun tiu sur la aparato." + +#~ msgid "Matches" +#~ msgstr "Kongruas" + +#~ msgid "Does not match" +#~ msgstr "Ne kongruas" + +#~ msgid "Pairing request for %s" +#~ msgstr "Pariĝ-peto por '%s'" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Bonvole enigu la PIN-kodon montranta de la aparato." + +#~ msgid "OK" +#~ msgstr "Akcepti" + +#~ msgid "unavailable" +#~ msgstr "nedisponebla" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Pardonu, neniu saĝo por vi hodiaŭ:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s la Orakolo diras" + +#~ msgid "Extension" +#~ msgstr "Kromprogramo" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screenshots" +#~ msgstr "Ekrankopioj" + +#~ msgid "Record a screencast" +#~ msgstr "Registri ekrankopion" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Bildrapido uzata por ekranregistraĵoj." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "La ĉenstablo de Gstreamer uzata por kodi la ekranregistraĵon" + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "La dosiersufikso uzata por konservi la ekranregistraĵon" + +#~ msgid "Session" +#~ msgstr "Seanco" + +#~ msgid "Power" +#~ msgstr "kurento" + +#~ msgid "Restart" +#~ msgstr "Restartigi" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Ekranregistraĵo de %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Alklaku \"Elsaluti\" por ĉesi tiujn aplikaĵojn kaj elsaluti de la sistemo." + +#~ msgid "Logging out of the system." +#~ msgstr "Elsalutanta de la sistemo." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Alklaku \"Elŝalti\" por ĉesi tiujn aplikaĵojn kaj elŝalti la sistemon." + +#~ msgid "Powering off the system." +#~ msgstr "Elŝaltanta la sistemon." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Alklaku \"Restartigi\" por ĉesi tiujn aplikaĵojn kaj restartigi la " +#~ "sistemon." + +#~ msgid "Restarting the system." +#~ msgstr "Restartiganta la sistemon." + +#~ msgid "disabled" +#~ msgstr "elŝaltita" + +#~ msgid "Connected (private)" +#~ msgstr "Konektita (private)" + +#~ msgid "Wired" +#~ msgstr "Drata" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Ĉu kolekti statistikojn pri uzo de aplikaĵoj?" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "La ŝelo kutime kontrolas la ruliĝajn aplikaĵojn por montri la plej " +#~ "uzitajn aplikaĵojn (ekz. en lanĉiloj). Kvankam ĉi tiu datumoj estos " +#~ "tenata privata, vi eble volas elŝalti ĉi tion pro privateca kialo. " +#~ "Bonvole atentu ke faranta ĉi tion ne forigos jam konservitajn datumojn." + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "elŝaltitaj OpenSearch-provizantoj" + +#~ msgid "Show time with seconds" +#~ msgstr "Montri horon kun sekundoj" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Se vera, montri sekundojn en horo." + +#~ msgid "Show date in clock" +#~ msgstr "Montri daton en horloĝo" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Se vera, montri daton en la horloĝo, krom la horo." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Ensaluti" + +#~ msgid "APPLICATIONS" +#~ msgstr "APLIKAĴOJ" + +#~ msgid "SETTINGS" +#~ msgstr "AGORDOJ" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..d2cb25a --- /dev/null +++ b/po/es.po @@ -0,0 +1,3491 @@ +# Spanish translation of gnome-shell. +# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Jorge González , 2009, 2010, 2011. +# Benjamín Valero Espinosa , 2011. +# Daniel Mustieles , 2010-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell.master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-24 17:37+0000\n" +"PO-Revision-Date: 2019-02-06 11:27+0100\n" +"Last-Translator: Daniel Mustieles \n" +"Language-Team: es \n" +"Language: es\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: Gtranslator 3.31.90\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Mostrar la lista de notificaciones" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Dar el foco a la notificación activa" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Mostrar la vista general" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Mostrar todas las aplicaciones" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Abrir el menú de la aplicación" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Extensiones de la Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurar las extensiones de GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gestión de ventanas e inicio de aplicaciones" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Activar las herramientas internas, útiles para desarrolladores y probadores, " +"desde Alt+F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permitir acceder a las herramientas internas de depuración monitorización " +"usando el diálogo Alt+F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID de las extensiones que activar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Las extensiones de GNOME Shell tienen una propiedad UUID; esta clave lista " +"las extensiones que se deben cargar. Cualquier extensión que se quiere " +"cargar debe estar en la lista. También puede manipular esta lista con los " +"métodos de DBus «EnableExtension» y «DisableExtension» en org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Desactivar extensiones de usuario" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Desactivar todas las extensiones que ha activado el usuario sin afectar a la " +"configuración «enabled-extension»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" +"Desactiva la validación de la compatibilidad de la versión de la extensión" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell sólo cargará las extensiones que indiquen que soportan la " +"versión actual en ejecución. Activar esta opción desactivará esta " +"comprobación e intentará cargar todas las extensiones, independientemente de " +"las versiones que indiquen que soportan." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lista de ID de archivos de escritorio para las aplicaciones favoritas" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Las aplicaciones correspondientes con esos identificadores se mostrarán en " +"el área de favoritos." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Visor del selector de aplicaciones" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Índice de la vista seleccionada actualmente en el selector de aplicaciones." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Histórico del diálogo de comandos (Alt+F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Histórico del diálogo de «looking glass»" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "" +"Mostrar siempre el elemento de menú «Cerrar sesión» en el menú del usuario." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Esta clave sobrescribe la ocultación automática del elemento de menú «Cerrar " +"sesión» en situaciones de un único usuario o de una única sesión." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Indica si se debe recordar la contraseña para montar sistemas de archivos " +"remotos o cifrados" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"La shell solicitará una contraseña cuando se monte un dispositivo cifrado o " +"un sistema de archivos remoto. Si la contraseña se puede guardar para usarla " +"en un futuro, se mostrará la casilla «Recordar contraseña». Esta clave " +"establece el valor predeterminado de la casilla." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Indica si el adaptador Bluetooth predeterminado tiene dispositivos asociados " +"configurados" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"La shell sólo mostrará un menú de Bluetooth si hay conectado un adaptador de " +"Bluetooth, o si hay dispositivos asociados configurados con el adaptador " +"predeterminado. Esto se restablecerá si se ve que el adaptador " +"predeterminado no tiene dispositivos asociados." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Activar la introspección de API" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Activa una API de D-Bus que permite la introspección del estado de la " +"aplicación de la shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Asociación de teclas para abrir el menú de la aplicación" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Asociación de teclas para abrir el menú de la aplicación." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Asociación de teclas para la vista «Mostrar aplicaciones»" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista " +"de actividades." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Asociación de teclas para la vista general" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Asociación de teclas para abrir la Vista de actividades." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Asociación de teclas para cambiar la visibilidad de la lista de " +"notificaciones" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Asociación de teclas para cambiar la visibilidad de la lista de " +"notificaciones." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Asociación de teclas para dar el foco a la notificación activa" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Asociación de teclas para dar el foco a la notificación activa." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Asociación de teclas que pausa y reanuda los «tweens» en ejecución, para " +"depuración." + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Cambiar a la aplicación 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Cambiar a la aplicación 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Cambiar a la aplicación 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Cambiar a la aplicación 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Cambiar a la aplicación 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Cambiar a la aplicación 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Cambiar a la aplicación 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Cambiar a la aplicación 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Cambiar a la aplicación 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Qué teclado usar" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "El tipo de teclado que usar." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limitar el intercambiador al área de trabajo actual." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Si es cierto, sólo las aplicaciones que tengan ventanas en el área de " +"trabajo actual se muestran en el selector. Si no, se incluyen todas las " +"aplicaciones." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "El modo de icono de la aplicación." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configura cómo se muestran las ventanas en el selector. Los valore posibles " +"son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-" +"only» (sólo muestra el icono de la aplicación) «both»." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Si es cierto, sólo se muestran en el selector las ventanas del área de " +"trabajo actual. Si no, se incluyen todas las ventanas." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Acoplar un diálogo modal a la ventana padre" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Esta clave sobrescribe la clave en org.gnome.mutter al ejecutar GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la " +"ventana" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Las áreas de trabajo se gestionan dinámicamente" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Áreas de trabajo solo en la pantalla principal" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Retardo al cambiar el foco del ratón hasta que el puntero deja de moverse" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Inicio de sesión de la red" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Algo ha fallado" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Ha habido un problema: no se puede mostrar la configuración para esta " +"extensión. Se recomienda que informe del error a los autores de la extensión." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Detalles técnicos" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Copiar error" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Página web" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Visitar la página web de la extensión" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "No hay extensiones instaladas" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Las extensiones se puede instalar mediante software o extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Buscar en Software" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Cancelar" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Siguiente" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Desbloquear" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Iniciar sesión" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Elegir sesión" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "¿No está en la lista?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ej., usuario o %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Nombre de usuario:" + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Ventana de inicio de sesión" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Error de autenticación" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(o pase el dedo)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Apagar" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +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:95 +msgctxt "search-result" +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:98 +msgid "lock screen" +msgstr "bloquear;pantalla" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Cerrar la sesión" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "cerrar;sesión;salir" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Suspender" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspender;dormir" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +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:119 +msgid "switch user" +msgstr "cambiar;usuario" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +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:126 +msgid "lock orientation;screen;rotation" +msgstr "bloqueo;orientación;pantalla" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Comando no encontrado" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "No se pudo analizar el comando:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Falló la ejecución de «%s»:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Ahora mismo" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Hace %d minuto" +msgstr[1] "Hace %d minutos" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Hace %d hora" +msgstr[1] "Hace %d horas" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Ayer" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Hace %d día" +msgstr[1] "Hace %d días" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Hace %d semana" +msgstr[1] "Hace %d semanas" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Hace %d mes" +msgstr[1] "Hace %d meses" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Hace %d año" +msgstr[1] "Hace %d años" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ayer, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%d de %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%d de %B de %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ayer a las %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%d de %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%d de %B de %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Inicio de sesión en el punto de acceso" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Su conexión a este punto de acceso no es segura. Las contraseñas y otra " +"información que introduzca en esta página la podrían ver personas cercanas." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Denegar acceso" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Conceder acceso" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Frecuentes" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Todas" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Ventana nueva" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Lanzar usando la tarjeta gráfica dedicada" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Quitar de los favoritos" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Añadir a los favoritos" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Mostrar detalles" + +#: 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:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Se ha quitado %s de sus favoritos." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Seleccionar dispositivo de sonido" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Configuración de sonido" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Auriculares" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Manos libres" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Micrófono" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Cambiar el fondo…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Configuración de pantalla" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Configuración" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "X" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB de %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Mes anterior" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Siguiente mes" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Todo el día" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %d de %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %d de %B de %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "No hay notificaciones" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "No hay eventos" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Limpiar" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» no responde." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Puede elegir esperar un momento para que continúe o forzar a la aplicación a " +"terminar." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Forzar la salida" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Esperar" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Dispositivo externo conectado" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Dispositivo externo desconectado" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Abrir con %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Contraseña:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Escriba de nuevo:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Alternativamente puede conectarse pulsando el botón «WPS» de su router." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Conectar" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Contraseña: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Clave:" + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Contraseña de la clave privada:" + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identidad:" + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Servicio:" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "La red inalámbrica requiere autenticación" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Se necesitan contraseñas o claves de cifrado para acceder a la red " +"inalámbrica «%s»." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Autenticación 802.1X cableada" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Nombre de la red: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Autenticación DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Código PIN requerido" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +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" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Contraseña de la red de banda ancha móvil" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, 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:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Gestor de la red" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Se necesita autenticación" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrador" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Autenticar" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Eso no ha funcionado. Inténtelo de nuevo." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Ahora %s se llama %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Ventanas" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +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:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e de %B de %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Añadir relojes del mundo…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Relojes del mundo" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Meteorología" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Seleccionar ubicación…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Cargando…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Conectarse para obtener la información meteorológica" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "La información meteorológica no está disponible actualmente." + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Cerrar la sesión %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Cerrar la sesión" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "se cerrará automáticamente la sesión de %s en %d segundo." +msgstr[1] "se cerrará automáticamente la sesión de %s en %d segundos." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Su sesión se cerrará automáticamente en %d segundo." +msgstr[1] "Su sesión se cerrará automáticamente en %d segundos." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Cerrar la sesión" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Apagar" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalar actualizaciones y apagar" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "El sistema se apagará automáticamente en %d segundo." +msgstr[1] "El sistema se apagará automáticamente en %d segundos." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalar las actualizaciones de software pendientes" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Apagar" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "El sistema se reiniciará automáticamente en %d segundo." +msgstr[1] "El sistema se reiniciará automáticamente en %d segundos." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reiniciar e instalar actualizaciones" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"El sistema se reiniciará automáticamente e instalará las actualizaciones en " +"%d segundo." +msgstr[1] "" +"El sistema se reiniciará automáticamente e instalará las actualizaciones en " +"%d segundos." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reiniciar e instalar" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalar y apagar" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Apagar después de instalar las actualizaciones" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reiniciar e instalar actualizaciones" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s se instalará después de reiniciar. La instalación de la actualización " +"puede tardar mucho tiempo: asegúrese de que tiene una copia de respaldo y de " +"que el equipo está enchufado." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Funcionando con batería: conéctese antes de instalar las actualizaciones." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Algunas aplicaciones están ocupadas o tienen trabajo sin guardar." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Hay otros usuarios con la sesión iniciada." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remoto)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consola)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Instalar" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s quiere inhibir los atajos" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "Su aplicación quiere inhibir los atajos" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Puede restaurar los atajos pulsando %s." + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "Denegar" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "Permitir" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Teclas lentas activadas" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Teclas lentas desactivadas" + +#: js/ui/kbdA11yDialog.js:33 +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:40 +msgid "Sticky Keys Turned On" +msgstr "Teclas persistentes activadas" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Teclas persistentes desactivadas" + +#: js/ui/kbdA11yDialog.js:43 +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:45 +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:57 +msgid "Leave On" +msgstr "Dejar activada" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Encender" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Apagar" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Dejar desactivada" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "Configuración de región e idioma" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "No hay extensiones instaladas" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s no ha generado ningún error." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Ocultar errores" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Mostrar errores" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Activado" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Desactivado" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Error" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Caducado" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Descargando" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Ver fuente" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Página web" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Información del sistema" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Artista desconocido" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Título desconocido" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volumen" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Deshacer" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Vista general" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Escribir para buscar…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Atajo nuevo…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Aplicación definida" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Mostrar la ayuda en pantalla" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Cambiar monitor" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Asignar pulsación" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Hecho" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Editar…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nada" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Pulse un botón para configurar" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Pulse Esc para salir" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Pulse cualquier tecla para salir" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Salir" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Actividades" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:867 +msgid "Top Bar" +msgstr "Barra superior" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Introducir un comando" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Cerrar" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Reiniciar no está disponible en Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Reiniciando…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d de %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d mensaje nuevo" +msgstr[1] "%d mensajes nuevos" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notificación nueva" +msgstr[1] "%d notificaciones nuevas" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:271 +msgid "Lock" +msgstr "Bloquear" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME necesita bloquear la pantalla" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "No se pudo bloquear" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "Una aplicación impidió el bloqueo" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Buscando…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "No se encontraron resultados." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d más" +msgstr[1] "%d más" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Copiar" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Pegar" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Mostrar texto" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Ocultar texto" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Contraseña" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Recordar contraseña" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Accesibilidad" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Ampliación" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Lector de pantalla" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Teclado en pantalla" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Alertas visuales" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Teclas persistentes" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Teclas lentas" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Rechazo de teclas" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Teclas del ratón" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Contraste alto" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Texto grande" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Configuración de Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d conectado" +msgstr[1] "%d conectados" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Desconectado" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Encendido" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Brillo" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Teclado" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Mostrar la distribución del teclado" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Ubicación activada" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Desactivar" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Configuración de privacidad" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Ubicación en uso" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Ubicación desactivada" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Activar" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "¿Conceder acceso a %s a su ubicación?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Los servicios de ubicación se pueden cambiar en cualquier momento desde la " +"configuración de privacidad." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s apagada" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s sin gestionar" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Desconectando %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, 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:437 +#, 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:445 +#, 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s no disponible" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Falló la conexión %s" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Configuración de red cableada" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Configuración de banda ancha móvil" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s desactivado" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Conectar a Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "El modo avión está activado" + +#: js/ui/status/network.js:787 +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:788 +msgid "Turn Off Airplane Mode" +msgstr "Apagar el modo avión" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "La Wi-Fi está desactivada" + +#: js/ui/status/network.js:798 +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:799 +msgid "Turn On Wi-Fi" +msgstr "Activar la Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Redes Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Seleccionar una red" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "No hay redes" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Usar el interruptor hardware para apagar" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Seleccionar red" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Configuración de Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Punto de acceso %s activo" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s no conectado" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "conectando…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "se necesita autenticación" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "falló la conexión" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "Configuración de VPN" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN apagada" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Configuración de la red" + +#: js/ui/status/network.js:1564 +#, 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:1568 +#, 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:1572 +#, 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:1701 +msgid "Connection failed" +msgstr "Falló la conexión" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "Falló la activación de la conexión de red" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Luz nocturna desactivada" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Luz nocturna activada" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Reanudar" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Desactivar hasta mañana" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Configuración de energía" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Cargada completamente" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "No está cargando" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Estimando…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d queda (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d para la carga completa (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Se está compartiendo la pantalla" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Apagar" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Modo avión activado" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Cambiar de usuario" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Cerrar la sesión" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Configuración de la cuenta" + +#: js/ui/status/system.js:256 +msgid "Orientation Lock" +msgstr "Bloqueo de orientación" + +#: js/ui/status/system.js:282 +msgid "Suspend" +msgstr "Suspender" + +#: js/ui/status/system.js:292 +msgid "Power Off" +msgstr "Apagar" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Dispositivo Thunderbolt desconocido" + +#: js/ui/status/thunderbolt.js:323 +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:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Dispositivo Thunderbolt no autorizado" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Se ha detectado un dispositivo nuevo y un administrador debe autorizarlo." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Error de autorización de Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volumen modificado" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Espejo" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Unir pantallas" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Sólo la externa" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Sólo la integrada" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Iniciar sesión como otro usuario" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Desbloquear ventana" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplicaciones" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Buscar" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» está preparado" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "¿Quiere mantener esta configuración de la pantalla?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Revertir configuración" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Mantener cambios" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "La configuración se revertirá en %d segundo" +msgstr[1] "La configuración se revertirá en %d segundos" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimizar" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Desmaximizar" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximizar" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Mover" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Redimensionar" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Mover la barra de título a la pantalla" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Siempre encima" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Siempre en el área de trabajo visible" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Mover al área de trabajo de la izquierda" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Mover al área de trabajo de la derecha" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Subir a un área de trabajo" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Bajar a un área de trabajo" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Mover a la pantalla de arriba" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Mover a la pantalla de abajo" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Mover a la pantalla de la izquierda" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Mover a la pantalla de la derecha" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendario de Evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Imprimir versión" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Modo usado por GDM para la pantalla de inicio" + +#: src/main.c:420 +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:426 +msgid "List possible modes" +msgstr "Listar los modos posibles" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "Desconocido" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Falló al lanzar «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Las contraseñas no coinciden." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "La contraseña no puede estar vacía" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "El usuario rechazó el diálogo de autenticación" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u salida" +msgstr[1] "%u salidas" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entradas" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Sonidos del sistema" + +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:" + +#~ msgid "%s all day." +#~ msgstr "%s todo el día." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, luego %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, luego %s seguido de %s." + +#~ msgid "Feels like %s." +#~ msgstr "Sensación térmica de %s." + +#~| 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" + +#~ msgid "Status Icons" +#~ msgstr "Iconos de estado" + +#~ msgid "Events" +#~ msgstr "Eventos" + +#~ msgid "Notifications" +#~ msgstr "Notificaciones" + +#~ msgid "Clear section" +#~ msgstr "Limpiar la sección" + +#~ msgid "Media" +#~ msgstr "Medios" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferencias de las extensiones de GNOME Shell" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Redirección para autenticación web" + +#~ msgid "Not In Use" +#~ msgstr "No está en uso" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Mostrar la fecha de la semana en el calendario" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Si es cierta, muestra la fecha de semana ISO en el calendario." + +#~ msgid "Use as Internet connection" +#~ msgstr "Usar como conexión a Internet" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s solicita acceso a su ubicación." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (composición wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d dispositivo conectado" +#~ msgstr[1] "%d dispositivos conectados" + +#~ msgid "Authentication required" +#~ msgstr "Autenticación requerida" + +#~ msgid "UPS" +#~ msgstr "SAI" + +#~ msgid "Battery" +#~ msgstr "Batería" + +#~ msgid "Airplane Mode" +#~ msgstr "Modo avión" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Invitación" + +#~ msgid "Call" +#~ msgstr "Llamar" + +#~ msgid "File Transfer" +#~ msgstr "Transferencia de archivos" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "Invitation to %s" +#~ msgstr "Invitación a %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s le está invitando a unirse a %s" + +#~ msgid "Decline" +#~ msgstr "Rechazar" + +#~ msgid "Accept" +#~ msgstr "Aceptar" + +#~ msgid "Video call from %s" +#~ msgstr "Videollamada de %s" + +#~ msgid "Call from %s" +#~ msgstr "Llamada de %s" + +#~ msgid "Answer" +#~ msgstr "Responder" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s le está enviando %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s solicita permiso para ver cuándo está en línea" + +#~ msgid "Authentication failed" +#~ msgstr "Falló la autenticación" + +#~ msgid "Encryption error" +#~ msgstr "Error de cifrado" + +#~ msgid "Certificate not provided" +#~ msgstr "Certificado no proporcionado" + +#~ msgid "Certificate untrusted" +#~ msgstr "No se confía en el certificado" + +#~ msgid "Certificate expired" +#~ msgstr "Certificado caducado" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificado no activado" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "El nombre del servidor dle certificado no coincide" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "La huella del certificado no coincide" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificado autofirmado" + +#~ msgid "Status is set to offline" +#~ msgstr "El estado está establecido a «desconectado»" + +#~ msgid "Certificate is invalid" +#~ msgstr "El certificado no es válido" + +#~ msgid "Connection has been refused" +#~ msgstr "Se ha rechazado la conexión" + +#~ msgid "Connection can't be established" +#~ msgstr "No se puede establecer la conexión" + +#~ msgid "Connection has been lost" +#~ msgstr "Se ha perdido la conexión" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Esta cuenta ya está conectada al servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "Se ha sustituido la conexión por una nueva conexión usando el mismo " +#~ "recurso" + +#~ msgid "The account already exists on the server" +#~ msgstr "La cuenta ya existe en el servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "" +#~ "Actualmente el servidor está muy ocupado intentando gestionar la conexión" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Se ha revocado el certificado" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "El certificado usa un algoritmo de cifrado inseguro o es " +#~ "criptográficamente débil" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "La longitud del certificado del servidor o la profundidad de la cadena " +#~ "del certificado del servidor exceden los límites impuestos por la " +#~ "biblioteca de criptografía" + +#~ msgid "Internal error" +#~ msgstr "Error interno" + +#~ msgid "Unable to connect to %s" +#~ msgstr "No se pudo conectar a %s" + +#~ msgid "View account" +#~ msgstr "Ver cuenta" + +#~ msgid "Show the message list" +#~ msgstr "Mostrar la lista de mensajes" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Dom" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "L" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "M" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "X" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "J" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "V" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "S" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nada programado" + +#~ msgid "Today" +#~ msgstr "Hoy" + +#~ msgid "Tomorrow" +#~ msgstr "Mañana" + +#~ msgid "This week" +#~ msgstr "Esta semana" + +#~ msgid "Next week" +#~ msgstr "La semana que viene" + +#~ msgid "Removable Devices" +#~ msgstr "Dispositivos extraíbles" + +#~ msgid "Eject" +#~ msgstr "Expulsar" + +#~ msgid "Unmute" +#~ msgstr "Dar voz" + +#~ msgid "Mute" +#~ msgstr "Silenciar" + +#~ msgid "Open Calendar" +#~ msgstr "Abrir calendario" + +#~ msgid "Date & Time Settings" +#~ msgstr "Configuración de hora y fecha" + +#~ msgid "Open" +#~ msgstr "Abrir" + +#~ msgid "Remove" +#~ msgstr "Quitar" + +#~ msgid "Clear Messages" +#~ msgstr "Limpiar mensajes" + +#~ msgid "Notification Settings" +#~ msgstr "Configuración de las notificaciones" + +#~ msgid "Tray Menu" +#~ msgstr "Bandeja de menú" + +#~ msgid "No Messages" +#~ msgstr "No hay mensajes" + +#~ msgid "Message Tray" +#~ msgstr "Bandeja de mensajes" + +#~ msgid "Captive Portal" +#~ msgstr "Portal captivo" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "El nivel máximo de precisión de la ubicación." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Configura el nivel máximo de precisión de la ubicación que se permite ver " +#~ "a las aplicaciones. Las opciones válidas son «off» (desactivar el rastreo " +#~ "de la ubicación), «country», «city», «neighborhood», «street», y " +#~ "«exact» (normalmente necesita un receptor GPS). Tenga en cuenta que esto " +#~ "sólo controla lo que GeoClue permitirá ver a las aplicaciones y lo que " +#~ "pueden encontrar sobre la ubicación de usuario usando los recursos de la " +#~ "red (aunque con precisión a nivel de la calle, en el mejor de los casos)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Orden de los botones en la barra de título" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Esta clave sobrescribe la clave en org.gnome.desktop.wm.preferences al " +#~ "ejecutar GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Extensión" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Seleccione una extensión que configurar usando la caja combinada de " +#~ "arriba." + +#~ msgid "calendar:MY" +#~ msgstr "calendario:MA" + +#~ msgid "unavailable" +#~ msgstr "no disponible" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d de %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d de %B %Y, %H:%M " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Lista de categorías que se deben mostrar como carpetas" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Cada nombre de categoría de esta lista se representará como una carpeta " +#~ "en la vista de aplicaciones, en lugar de mostrarse en línea en la vista " +#~ "principal." + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Authorization request from %s" +#~ msgstr "Solicitud de autorización de %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "El dispositivo «%s» quiere emparejarse con este equipo" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "El dispositivo %s quiere acceder al servicio «%s»" + +#~ msgid "Grant this time only" +#~ msgstr "Conceder sólo esta vez" + +#~ msgid "Reject" +#~ msgstr "Rechazar" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Confirmación de emparejamiento para «%s»" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Confirme que la clave mostrada en «%06d» coincide con la del dispositivo." + +#~ msgid "Matches" +#~ msgstr "Coincide" + +#~ msgid "Does not match" +#~ msgstr "No coincide" + +#~ msgid "Pairing request for %s" +#~ msgstr "Solicitud de emparejamiento para «%s»" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Introduzca el PIN mencionado en el dispositivo." + +#~ msgid "OK" +#~ msgstr "Aceptar" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Hoy no tiene ningún mensaje:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s el oráculo dice" + +#~ msgid "Settings Menu" +#~ msgstr "Menú de configuración" + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Usado internamente para guardar el último IM de presencia establecido " +#~ "explícitamente por el usuario. El valor aquí es de la enumeración " +#~ "TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Usado internamente para guardar el último estado de presencia de la " +#~ "sesión del usuario. El valor aquí es de la GsmPresenceStatus." + +#~ msgid "Session" +#~ msgstr "Sesión" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Pulse «Cerrar la sesión» para salir de esas aplicaciones y cerrar la " +#~ "sesión del sistema." + +#~ msgid "Logging out of the system." +#~ msgstr "Cerrando la sesión." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "Pulse «Apagar» para salir de esas aplicaciones y apagar el sistema." + +#~ msgid "Powering off the system." +#~ msgstr "Apagando el sistema." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Pulse «Reiniciar» para salir de esas aplicaciones y reiniciar el sistema." + +#~ msgid "Restarting the system." +#~ msgstr "Reiniciando el sistema." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Apagar puede hacer que pierdan el trabajo que no hayan guardado." + +#~ msgid "Screenshots" +#~ msgstr "Capturas de pantalla" + +#~ msgid "Record a screencast" +#~ msgstr "Grabar una captura de pantalla" + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Asociación de teclas cambiar el grabador de pantalla" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Tasa de fotogramas usada para grabar «screencast»." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "La tasa de fotogramas de la grabación resultante grabada por el grabador " +#~ "de «screencast» de GNOME Shell, en fotogramas por segundo." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "La tubería de gstreamer usada para codificar el «screencast»" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Establece la tubería GStreamer usada para codificar grabaciones. Sigue la " +#~ "sintaxis usada para gst-launch. La tubería debería tener un sumidero " +#~ "(«sink») desconectado donde grabar el vídeo que se está grabando. " +#~ "Generalmente tendrá un punto de origen desconectado; la salida de ese " +#~ "punto se escribirá en el archivo de salida. Sin embargo, la tubería " +#~ "también puede tomar parte en su propia salida; esto se puede usar para " + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Extensión de archivo que usar para almacenar los «screencast»" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Screencast desde %d %t" + +#~ msgid "Power" +#~ msgstr "Energía" + +#~ msgid "Restart" +#~ msgstr "Reiniciar" + +#~ msgid "Volume, network, battery" +#~ msgstr "Volumen, red, batería" + +#~ msgid "Visibility" +#~ msgstr "Visibilidad" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Configurar un dispositivo nuevo…" + +#~ msgid "Send Files…" +#~ msgstr "Enviar archivos…" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "disabled" +#~ msgstr "desactivada" + +#~ msgid "More…" +#~ msgstr "Más…" + +#~ msgid "Wired" +#~ msgstr "Cableada" + +#~ msgid "Universal Access Settings" +#~ msgstr "Configuración del acceso universal" + +#~ msgid "Keyboard Settings" +#~ msgstr "Configuración del teclado" + +#~ msgid "Mouse Settings" +#~ msgstr "Configuración del ratón…" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "Queda %d hora" +#~ msgstr[1] "Queda %d horas" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "Quedan %d %s %d %s" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "hora" +#~ msgstr[1] "horas" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minuto" +#~ msgstr[1] "minutos" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "Queda %d minuto" +#~ msgstr[1] "Quedan %d minutos" + +#~ msgid "AC Adapter" +#~ msgstr "Adaptador de corriente" + +#~ msgid "Laptop Battery" +#~ msgstr "Batería del portátil" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgid "Mouse" +#~ msgstr "Ratón" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "Teléfono móvil" + +#~ msgid "Media Player" +#~ msgstr "Reproductor multimedia" + +#~ msgid "Tablet" +#~ msgstr "Tableta" + +#~ msgid "Computer" +#~ msgstr "Equipo" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Desconocido" + +#~ msgid "Available" +#~ msgstr "Disponible" + +#~ msgid "Busy" +#~ msgstr "Ocupado" + +#~ msgid "Invisible" +#~ msgstr "Invisible" + +#~ msgid "Away" +#~ msgstr "Ausente" + +#~ msgid "Idle" +#~ msgstr "Inactivo" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Su estado del chat se establecerá a «ocupado»" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Las notificaciones están ahora desactivadas, incluyendo los mensajes de " +#~ "chat. Su estado en línea se ha ajustado para que otros sepan que puede no " +#~ "leer sus mensajes." + +#~ msgid "cable unplugged" +#~ msgstr "cable desconectado" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "" +#~ "Indica si se deben recolectar estadísticas acerca del uso de las " +#~ "aplicaciones" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "La «shell» normalmente monitoriza todas las aplicaciones activas para " +#~ "presentar las más usadas (ej. en los lanzadores). Aunque estos datos se " +#~ "mantienen de forma privada, puede querer desactivarlo por razones de " +#~ "privacidad. Note que haciéndolo no eliminará los datos ya guardados." + +#~ msgid "Auto Ethernet" +#~ msgstr "Ethernet automática" + +#~ msgid "Auto broadband" +#~ msgstr "Banda ancha automática" + +#~ msgid "Auto dial-up" +#~ msgstr "Marcado automático" + +#~ msgid "Auto %s" +#~ msgstr "%s automática" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth automático" + +#~ msgid "Auto wireless" +#~ msgstr "Inalámbrica automática" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Iniciar sesión" + +#~ msgid "tray" +#~ msgstr "bandeja" + +#~ msgid "More..." +#~ msgstr "Más…" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "United Kingdom" +#~ msgstr "Reino Unido" + +#~ msgid "Default" +#~ msgstr "Predeterminada" + +#~ msgid "Show full name in the user menu" +#~ msgstr "Mostrar el nombre completo en el menú del usuario" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "" +#~ "Indica si se muestra el nombre del usuario en el menú del usuario o no." + +#~ msgid "APPLICATIONS" +#~ msgstr "APLICACIONES" + +#~ msgid "SETTINGS" +#~ msgstr "CONFIGURACIÓN" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Su mensaje oculto favorito" + +#~ msgid "Subscription request" +#~ msgstr "Solicitud de suscripción" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Enviado el %A a las %H:%M" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Enviado el %A, %d de %B de %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Falló la conexión a %s" + +#~ msgid "Reconnect" +#~ msgstr "Reconectar" + +#~ msgid "Browse Files..." +#~ msgstr "Examinar archivos…" + +#~ msgid "Error browsing device" +#~ msgstr "Error al examinar el dispositivo" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "No se puede examinar el dispositivo solicitado, el error es «%s»" + +#~ msgid "Wireless" +#~ msgstr "Inalámbrica" + +#~ msgid "VPN Connections" +#~ msgstr "Conexiones VPN" + +#~ msgid "System Settings" +#~ msgstr "Configuración del sistema" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "proveedores OpenSearch desactivados" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Falló al desmontar «%s»" + +#~ msgid "Retry" +#~ msgstr "Reintentar" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "LUGARES Y DISPOSITIVOS" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "Conectar a…" + +#~ msgid "Passphrase" +#~ msgstr "Contraseña" + +#~ msgid "Show time with seconds" +#~ msgstr "Mostrar la hora con segundos" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Si es cierta, muestra los segundos en la hora." + +#~ msgid "Show date in clock" +#~ msgstr "Mostrar la fecha en el reloj" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Si es cierta, muestra la fecha en el reloj, además de la hora." + +#~ msgctxt "contact" +#~ msgid "Unknown" +#~ msgstr "Desconocido" + +#~ msgid "CONTACTS" +#~ msgstr "CONTACTOS" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e de %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e de %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e de %b, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "%s is online." +#~ msgstr "%s está conectado/a." + +#~ msgid "%s is offline." +#~ msgstr "%s está desconectado/a." + +#~ msgid "%s is away." +#~ msgstr "%s está ausente." + +#~ msgid "%s is busy." +#~ msgstr "%s está ocupado/a." + +#~ msgid "Hidden" +#~ msgstr "Oculto" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Contraseña incorrecta; inténtelo de nuevo" + +#~ msgid "Power Off..." +#~ msgstr "Apagar…" + +#~ msgid "Online Accounts" +#~ msgstr "Cuentas en línea" + +#~ msgid "Log Out..." +#~ msgstr "Cerrar la sesión…" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ELEMENTOS RECIENTES" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. disabled-extensions overrides this setting for " +#~ "extensions that appear in both lists." +#~ msgstr "" +#~ "Las extensiones de GNOME Shell tienen una propiedad uuid; esta clave " +#~ "lista las extensiones que no se deben cargar. «disabled-extensions» " +#~ "sobrescribe este ajuste para las extensiones que aparecen en ambas listas." + +#~ msgid "Home Folder" +#~ msgstr "Carpeta personal" + +#~ msgid "Show password" +#~ msgstr "Mostrar contraseña" + +#~ msgid "%s has finished starting" +#~ msgstr "%s finalizó su lanzamiento" + +#~ msgid "If true, display onscreen keyboard." +#~ msgstr "Si es cierta, muestra el teclado en pantalla." + +#~ msgid "Connectivity lost" +#~ msgstr "Conectividad perdida" + +#~| msgid "You're no longer connected to the network" +#~ msgid "You are no longer connected to the network" +#~ msgstr "Ya no está conectado a la red" + +#~ msgid "calendar:week_start:0" +#~ msgstr "calendar:week_start:1" + +#~ msgid "Do Not Disturb" +#~ msgstr "No molestar" + +#, fuzzy +#~ msgid "The length of the server certificate, or the depth of the " +#~ msgstr "La longitud del certificado del servidor o la profundidad del" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "Ahora está conectado a la red de banda ancha móvil «%s»" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "Ahora está conectado a la red inalámbrica «%s»" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "Ahora está conectado a la VPN «%s»" + +#~ msgid "Uuids of extensions to disable" +#~ msgstr "Uuid de las extensiones que desactivar" + +#~ msgid "Localization Settings" +#~ msgstr "Configuración regional" + +#~ msgid "Less than a minute ago" +#~ msgstr "Hace menos de un minuto" + +#~ msgid "Shut Down" +#~ msgstr "Apagar" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "Pulse «Apagar» para salir de esas aplicaciones y apagar el sistema." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "El sistema se apagará automáticamente en %d segundos." + +#~ msgid "Shutting down the system." +#~ msgstr "Apagando el sistema." + +#~ msgid "Confirm" +#~ msgstr "Confirmar" + +#~ msgid "PREFERENCES" +#~ msgstr "PREFERENCIAS" + +#~ msgid "Shut Down..." +#~ msgstr "Apagar…" + +#~ msgid "Clip the crosshairs at the center" +#~ msgstr "Fijar los cursores en el centro" + +#~ msgid "Color of the crosshairs" +#~ msgstr "Color de las cruces" + +#~ msgid "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." +#~ msgstr "" +#~ "Determina la longitud de las líneas verticales y horizontales que " +#~ "conforman los cursores." + +#~ msgid "" +#~ "Determines the position of the magnified mouse image within the magnified " +#~ "view and how it reacts to system mouse movement. The values are - none: " +#~ "no mouse tracking; - centered: the mouse image is displayed at the center " +#~ "of the zoom region (which also represents the point under the system " +#~ "mouse) and the magnified contents are scrolled as the system mouse moves; " +#~ "- proportional: the position of the magnified mouse in the zoom region is " +#~ "proportionally the same as the position of the system mouse on screen; - " +#~ "push: when the magnified mouse intersects a boundary of the zoom region, " +#~ "the contents are scrolled into view." +#~ msgstr "" +#~ "Determina la posición de la imagen magnificada del ratón dentro de la " +#~ "vista magnificada y cómo reacciona al movimiento del ratón del sistema. " +#~ "Los valores son «none» (ninguno): sin seguimiento del ratón; " +#~ "«centered» (centrado): la imagen del ratón se muestra en el centro de la " +#~ "región ampliada (que también representa el punto bajo el ratón del " +#~ "sistema) y el contenido magnificado se desliza según se mueve el ratón " +#~ "del sistema; «proporcional»: la posición del ratón magnificado en la " +#~ "región de ampliación es proporcionalmente la misma que la posición del " +#~ "ratón del sistema en el ratón; «push» (empujar): cuando el ratón " +#~ "magnificado cruza un límite de la región de ampliación, el contenido se " +#~ "desliza en la vista." + +#~ msgid "" +#~ "Determines the transparency of the crosshairs, from fully opaque to fully " +#~ "transparent." +#~ msgstr "" +#~ "Determina la transparencia de los cursores, de completamente opacos a " +#~ "completamente transparentes." + +#~ msgid "" +#~ "Determines whether the crosshairs intersect the magnified mouse sprite, " +#~ "or are clipped such that the ends of the horizontal and vertical lines " +#~ "surround the mouse image." +#~ msgstr "" +#~ "Determina si las cruces cruzan el «sprite» magnificado del ratón o se " +#~ "fijan de tal forma que los finales de las líneas horizontales y " +#~ "verticales rodean la imagen del ratón." + +#~ msgid "Enable lens mode" +#~ msgstr "Activar el modo lente" + +#~ msgid "" +#~ "Enables/disables display of crosshairs centered on the magnified mouse " +#~ "sprite." +#~ msgstr "" +#~ "Activa/desactiva el mostrado de los cursores centrados en el «sprite» " +#~ "magnificado del ratón." + +#~ msgid "" +#~ "For centered mouse tracking, when the system pointer is at or near the " +#~ "edge of the screen, the magnified contents continue to scroll such that " +#~ "the screen edge moves into the magnified view." +#~ msgstr "" +#~ "Para el seguimiento del centro del ratón, cuando el puntero del sistema " +#~ "está cerca del borde de la pantalla, el contenido magnificado continúa " +#~ "desplazándose de tal forma que el borde de la pantalla se mueve dentro de " +#~ "la vista magnificada." + +#~ msgid "Length of the crosshairs" +#~ msgstr "Longitud de las cruces" + +#~ msgid "Magnification factor" +#~ msgstr "Factor de magnificación" + +#~ msgid "Mouse Tracking Mode" +#~ msgstr "Modo de seguimiento del ratón" + +#~ msgid "Opacity of the crosshairs" +#~ msgstr "Opacidad de las cruces" + +#~ msgid "Scroll magnified contents beyond the edges of the desktop" +#~ msgstr "" +#~ "Desplazar el contenido magnificado más allá de los bordes del escritorio" + +#~ msgid "Show or hide crosshairs" +#~ msgstr "Mostrar u ocultar las cruces" + +#~ msgid "Show or hide the magnifier" +#~ msgstr "Mostrar u ocultar el magnificador" + +#~ msgid "Show or hide the magnifier and all of its zoom regions." +#~ msgstr "" +#~ "Mostrar u ocultar el magnificador y todas sus regiones de ampliación." + +#~ msgid "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." +#~ msgstr "" +#~ "El color de las líneas verticales y horizontales que conforman las cruces." + +#~ msgid "" +#~ "The magnified view either fills the entire screen, or occupies the top-" +#~ "half, bottom-half, left-half, or right-half of the screen." +#~ msgstr "" +#~ "La vista magnificada o llena la pantalla u ocupa la mitad superior, mitad " +#~ "inferior, mitad izquierda o mitad derecha de la pantalla." + +#~ msgid "" +#~ "The power of the magnification. A value of 1.0 means no magnification. A " +#~ "value of 2.0 doubles the size." +#~ msgstr "" +#~ "El poder de la magnificación. Un valor de 1.0 significa sin " +#~ "magnificación. Un valor de 2.0 duplica el tamaño." + +#~ msgid "Thickness of the crosshairs" +#~ msgstr "Grosor de las cruces" + +#~ msgid "" +#~ "Whether the magnified view should be centered over the location of the " +#~ "system mouse and move with it." +#~ msgstr "" +#~ "Indica si la vista magnificada se debe centrar sobre la ubicación del " +#~ "ratón del sistema y moverse con ella." + +#~ msgid "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." +#~ msgstr "" +#~ "Anchura de las líneas verticales y horizontales que conforman las cruces." + +#~ msgid "Bluetooth Agent" +#~ msgstr "Agente Bluetooth" + +#~ msgid "Search your computer" +#~ msgstr "Buscar en su equipo" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "" +#~ "No se puede añadir un área de trabajo nueva porque se ha llegado al " +#~ "límite de áreas de trabajo." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "No se puede quitar el primer área de trabajo." + +#~ msgid "Customize the panel clock" +#~ msgstr "Personalizar el reloj del panel" + +#~ msgid "Custom format of the clock" +#~ msgstr "Formato personalizado del reloj" + +#~ msgid "Hour format" +#~ msgstr "Formato de la hora" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." +#~ msgstr "" +#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los " +#~ "segundos en la hora." + +#~ msgid "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." +#~ msgstr "" +#~ "Esta clave especifica el formato usado por el reloj del panel cuando la " +#~ "clave del formato se establece a «custom» (personalizado). Puede usar " +#~ "especificadores de conversión que entienda strftime() para obtener un " +#~ "formato específico. Consulte el manual de strftime() para obtener más " +#~ "información." + +#~ msgid "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." +#~ msgstr "" +#~ "Esta clave especifica el formato de la hora especificado por el reloj del " +#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 " +#~ "horas), «unix» y «custom» (personalizado).Si se establece a «unix» el " +#~ "reloj mostrará la hora en segundos desde la época (1 de enero de 1970). " +#~ "Si se establece a «custom» el reloj mostrará la hora según el formato " +#~ "especificado en la clave «custom_format». Note que si se establece a " +#~ "«unix» o «custom» se ignoran las claves «show_date» y «show_seconds»." + +#~ msgid "Clock Preferences" +#~ msgstr "Preferencias del reloj" + +#~ msgid "Show seco_nds" +#~ msgstr "Mostrar los segu_ndos" + +#~ msgid "_12 hour format" +#~ msgstr "Formato _12 horas" + +#~ msgid "_24 hour format" +#~ msgstr "Formato _24 horas" + +#~ msgid "Preferences" +#~ msgstr "Preferencias" + +#~ msgid "What's using power..." +#~ msgstr "Lo que está usando energía…" + +#~ msgid "Overview workspace view mode" +#~ msgstr "Modo de visualización de la vista previa del área de trabajo" + +#~ msgid "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." +#~ msgstr "" +#~ "El modo de vista del área de trabajo seleccionada en la vista general. " +#~ "Los valores soportados son «single» (sencillo) y «grid» (rejilla)." + +#~ msgid "Drag here to add favorites" +#~ msgstr "Arrastrar aquí para añadir a los favoritos" + +#~ msgid "Find" +#~ msgstr "Buscar" + +#~ msgid "ON" +#~ msgstr "ENCENDIDO" + +#~ msgid "OFF" +#~ msgstr "APAGADO" + +#~ msgid "Sidebar" +#~ msgstr "Barra lateral" + +#~ msgid "Recent Documents" +#~ msgstr "Documentos recientes" + +#~ msgid "PLACES" +#~ msgstr "LUGARES" + +#~ msgid "(see all)" +#~ msgstr "(ver todo)" + +#~ msgid "SEARCH RESULTS" +#~ msgstr "RESULTADOS DE LA BÚSQUEDA" + +#~ msgid "Can't lock screen: %s" +#~ msgstr "No se puede bloquear la pantalla: %s" + +#~ msgid "Can't temporarily set screensaver to blank screen: %s" +#~ msgstr "" +#~ "No se puede establecer temporalmente el salvapantallas a oscurecer " +#~ "pantalla: %s" + +#~ msgid "Can't logout: %s" +#~ msgstr "No se puede salir de la sesión: %s" + +#~ msgid "Browse" +#~ msgstr "Examine" + +#~ msgid "Find apps or documents" +#~ msgstr "Encuentre aplicaciones o documentos" + +#~| msgid "RECENT DOCUMENTS" +#~ msgid "DOCUMENTS" +#~ msgstr "DOCUMENTOS" + +#~ msgid "The user manager object this user is controlled by." +#~ msgstr "El objeto de gestión de usuarios que controla a este usuario." diff --git a/po/et.po b/po/et.po new file mode 100644 index 0000000..9552907 --- /dev/null +++ b/po/et.po @@ -0,0 +1,2885 @@ +# GNOME kesta eesti keele tõlge. +# Estonian translation for gnome-shell. +# +# Copyright (C) 2010, 2011 The Gnome Project +# +# This file is distributed under the same license as the gnome-shell package. +# +# Ivar Smolin , 2011. +# Mattias Põldaru , 2010, 2011, 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell MASTER\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-02 10:57+0000\n" +"PO-Revision-Date: 2019-03-10 18:49+0200\n" +"Last-Translator: Mart Raudsepp \n" +"Language-Team: Estonian <>\n" +"Language: et\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.2\n" +"X-DamnedLies-Scope: partial\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Arvuti" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Teadete nimekirja kuvamine" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Aktiivse teate fookustamine" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Ülevaate näitamine" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Kõigi rakenduste kuvamine" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Rakenduste menüü avamine" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shelli laiendused" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Shelli laienduste seadistamine" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Aknahaldur ja rakenduste käivitaja" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Arendajate ja testijate jaoks sisemiste tööriistade lubamine Alt-F2 alt" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Lubab ligipääsu sisemistele silumise ja monitoorimise tööriistadele Alt-F2 " +"dialoogi kaudu." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Lubatavate laienduste UUID-d" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shelli laiendustel on UUID omadus; selles võtmes loetletud laiendused " +"tuleks laadida. Seda loendit saab muuta kasutades EnableExtension ja " +"DisableExtension DBus-i meetodit kohas org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lemmikrakenduste töölauafailide ID-de loend" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "Nendele tunnustele vastavaid rakendusi kuvatakse lemmikutes." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Käsudialoogi (Alt-F2) ajalugu" + +# suurendusklaasidialoog? miks ka mitte :) +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Otsingudialoogi ajalugu" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Kasutajamenüüs näidatakse alati „Logi välja“ menüükirjet." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"See võti keelab automaatse „Logi välja“ menüükirje peitmise, kui arvutis on " +"üks kasutaja ning avatud üks seanss." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Kas pidada meeles krüpteeritud või kaugfailisüsteemide haakimise paroole" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Shell küsib parooli, kui haagitakse krüpteeritud seade või kaugfailisüsteem. " +"Kui parooli on võimalik salvestada edaspidiseks kasutuseks, näidatakse " +"„Salvesta parool“ märkeruutu. See võti määrab selle märkeruudu vaikimisi " +"oleku." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Rakenduste menüü avamise kiirklahv" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Kiirklahv rakenduste menüü avamiseks." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "„Rakenduste kuvamise“ kiirklahv" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "„Rakenduste kuvamise“ kiirklahv tegevuste ülevaates." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Ülevaate avamise kiirklahv" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Tegevuste ülevaate avamise kiirklahv." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Teadete loendi nähtavuse muutmise kiirklahv" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Kiirklahv teadete loendi nähtavuse muutmiseks." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Aktiivse teate fookustamise kiirklahv" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Aktiivse teate fookustamise kiirklahv." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Liikumine 1. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Liikumine 2. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Liikumine 3. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Liikumine 4. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Liikumine 5. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Liikumine 6. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Liikumine 7. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Liikumine 8. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Liikumine 9. rakendusele" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Millist klaviatuuri kasutada" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Kasutatava klaviatuuri liik." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Piira aknavahetaja käesolevale tööalale." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Rakenduste ikooni režiim." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Seadistab, kuidas aknaid aknavahetajas kuvatakse. Sobivad väärtused on " +"„thumbnail-only“ (näidatakse ainult akna pisipilti), „app-icon-" +"only“ (näidatakse ainult akna ikooni) või „both“ (mõlemad)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Modaaldialoog kuulub vanemakna juurde" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"See võti on ülimuslik võtme org.gnome.mutter suhtes, kui kasutatakse GNOME " +"Shelli." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Akende lohistamisel ekraani serva lubatakse serva paigutamine" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Tööalasid hallatakse dünaamiliselt" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Tööalad peamisel monitoril" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Hiire all asuv aken saab fookuse alles hiire peatumisel" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Võrku sisselogimine" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Midagi läks nihu" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Tehnilised üksikasjad" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Kopeeri veateade" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Koduleht" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Külasta laienduse kodulehte" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Ühtegi laiendust pole paigaldatud" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Katkesta" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Järgmine" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Võta lukust lahti" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Logi sisse" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Seansi valimine" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Pole loendis?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(nt 'user' või %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Kasutajanimi: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Sisselogimisaken" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Viga autentimisel" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(või libista näpp üle lugeja)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Lülita välja" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"power off;shutdown;reboot;restart;lülita välja;taaskäivitamine;" +"väljalülitamine" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Lukusta ekraan" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "lock screen;lukusta ekraan;ekraanilukk;ekraani lukustamine" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Logi välja" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;logi välja;väljalogimine" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Uinak" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;uinak;unerežiim" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Vaheta kasutajat" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "switch user;vaheta kasutajat;kasutajavahetus" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Lukusta asend" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "" +"lock orientation;screen;rotation;asendilukk;lukusta asend;kuvar;pööre;" +"pööramine" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Käsku ei leitud" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Käsku pole võimalik analüüsida:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "„%s“ käivitamine nurjus:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Praegu" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minut tagasi" +msgstr[1] "%d minutit tagasi" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d tund tagasi" +msgstr[1] "%d tundi tagasi" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Eile" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d päev tagasi" +msgstr[1] "%d päeva tagasi" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d nädal tagasi" +msgstr[1] "%d nädalat tagasi" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d kuu tagasi" +msgstr[1] "%d kuud tagasi" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d aasta tagasi" +msgstr[1] "%d aastat tagasi" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Eile %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d. %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d. %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Eile %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d. %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d. %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Kuumkoha sisselogimine" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Sinu ühendus selle kuumkoha sisselogimisse pole turvaline. Paroolid või muu " +"info, mille sisestad sellele lehele on vaadatavad lähedalasuvate inimeste " +"poolt." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Keela juurdepääs" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Anna ligipääs" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Siia ilmuvad tihti kasutatud rakendused" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Tihti" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Kõik" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Uus aken" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Käivita eraldiseisva graafikakaardiga" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Eemalda lemmikutest" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Lisa lemmikutesse" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Kuva üksikasju" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s lisati lemmikutesse." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s eemaldati lemmikutest." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Vali heliseade" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Helisätted" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Kõrvaklapid" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Peakomplekt" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Muuda tausta…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Kuvari sätted" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Sätted" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "60" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "E" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "K" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "N" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "R" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "L" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Eelmine kuu" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Järgmine kuu" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "%V. nädal" + +#. 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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Kogu päev" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d. %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d. %B %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Teateid pole" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Sündmusi pole" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Tühjenda" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "„%s“ ei vasta." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Võid veidi oodata, et see jätkaks tööd, või sundida rakenduse täielikult " +"sulguma." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Sundsulge" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Oota" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Väline ketas ühendati" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Väline ketas eemaldati" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Ava programmiga %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Parool:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Sisesta uuesti:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Ühendu" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Parool: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Võti: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Privaatvõtme parool: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identiteet: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Teenus: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Juhtmeta võrgu jaoks on vajalik autentimine" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Juhtmeta võrguga „%s“ ühendumiseks on vajalik parool või krüptimisvõti." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Juhtmega ühenduse 802.1X autentimine" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Võrgu nimi: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL autentimine" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Vajalik on PIN-kood" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Mobiiliühenduse loomiseks on vaja PIN-koodi" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mobiiliühenduse võrgu parool" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "„%s“-ga ühenduse loomiseks on vaja parooli." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Võrguhaldur" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Vajalik on autentimine" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administraator" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Autendi" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Kahjuks see ei sobinud. Palun proovi uuesti." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s nimi on nüüd %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Aknad" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Rakenduste kuvamine" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Dokk" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d. %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %e. %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Lisa maailmakellasid…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Maailmakellad" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Ilm" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Vali asukoht…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Laadimine…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Ilmateate nägemiseks ühendu võrku" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Ilmateade pole hetkel saadaval" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s väljalogimine" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Väljalogimine" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s logitakse %d sekundi pärast automaatselt välja." +msgstr[1] "%s logitakse %d sekundi pärast automaatselt välja." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Sind logitakse %d sekundi pärast automaatselt välja." +msgstr[1] "Sind logitakse %d sekundi pärast automaatselt välja." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Logi välja" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Väljalülitamine" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Paigalda uuendused ja lülita välja" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "%d sekundi pärast lülitub süsteem automaatselt välja." +msgstr[1] "%d sekundi pärast lülitub süsteem automaatselt välja." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Paigalda ootel tarkvarauuendused" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Taaskäivita" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Lülita välja" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Taaskäivitamine" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Süsteem taaskäivitub automaatselt %d sekundi pärast." +msgstr[1] "Süsteem taaskäivitub automaatselt %d sekundi pärast." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Taaskäivitamine ja uuenduste paigaldamine" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "Süsteem taaskäivitub ja paigaldab uuendused %d sekundi pärast." +msgstr[1] "Süsteem taaskäivitub ja paigaldab uuendused %d sekundi pärast." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Taaskäivita ja paigalda" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Paigalda ja lülita välja" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Lülita välja pärast uuenduste paigaldamist" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Taaskäivita ja paigalda täiendus" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s paigaldatakse pärast taaskäivitust. Täienduse paigaldamine võib võtta " +"kaua aega: veendu, et su andmed on varundatud ning arvuti on vooluvõrku " +"ühendatud." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Töötad aku peal: palun ühenda arvuti vooluvõrku enne uuenduste paigaldamist." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Mõned rakendused on tegevuses või on neis salvestamata asju." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Teised kasutajad on sisse logitud." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (kaugühendus)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsool)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Paigalda" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Kas laadida alla ja paigaldada „%s“ aadressilt extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s soovib kiirklahve üle võtta" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Rakendus soovib kiirklahve üle võtta" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Kiirklahve saad taastada, vajutades %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Keela" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Luba" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Aeglased klahvid sisselülitatud" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Aeglased klahvid väljalülitatud" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Sa hoidsid tõstuklahvi all 8 sekundit. See on otsetee aeglaste klahvide " +"funktsioonile, mis muudab sinu klaviatuuri tööviisi." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Kleepuvad klahvid sisselülitatud" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Kleepuvad klahvid väljalülitatud" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Sa vajutasid tõstuklahvi 5 korda järjest. See on otsetee kleepuvate klahvide " +"funktsioonile, mis muudab sinu klaviatuuri tööviisi." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Sa vajutasid kahte klahvi korraga või vajutasid tõstuklahvi 5 korda järjest. " +"See lülitab välja kleepuvate klahvide funktsiooni, mis muudab sinu " +"klaviatuuri tööviisi." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Jäta sisse" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Lülita sisse" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Lülita välja" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Jäta välja" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Asukoha ja keele sätted" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Ühtegi laiendust pole paigaldatud" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ei ole väljastanud ühtegi veateadet." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Peida vead" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Näita vigu" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Lubatud" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Keelatud" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Viga" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Pole värske" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Allalaadimine" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Kuva lähtekoodi" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Veebileht" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Süsteemi andmed" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Tundmatu esitaja" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Tundmatu pealkiri" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Helivaljus" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Võta tagasi" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Ülevaade" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Otsing…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Uus kiirklahv…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Rakenduse määratud" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Kuva ekraaniabi" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Vaheta ekraani" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Omista klahvivajutus" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Valmis" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Muuda…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Puudub" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Vajuta seadistamiseks klahvi" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Väljumiseks vajuta Esc" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Väljumiseks vajuta mistahes klahvi" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Sulge" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Tegevused" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Süsteem" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Ülemine riba" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Palun sisesta käsk" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Sulge" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Taaskäivitus ei ole Waylandis saadaval" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Taaskäivitamine…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d uus sõnum" +msgstr[1] "%d uut sõnumit" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d uus teade" +msgstr[1] "%d uut teadet" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Lukusta" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME peab ekraani lukustama" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Pole võimalik lukustada" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Rakendus blokeeris lukustamise" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Otsing…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Tulemused puuduvad." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d veel" +msgstr[1] "%d veel" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopeeri" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Aseta" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Teksti näidatakse" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Tekst on peidetud" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Parool" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Parooli meelespidamine" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Kasutaja abivahendid" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Suurendus" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Ekraanilugeja" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Ekraaniklaviatuur" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Visuaalsed märguanded" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Kleepuvad klahvid" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Aeglased klahvid" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Põrkeklahvid" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Hiireklahvid" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Kõrgkontrastne" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Suur tekst" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetoothi sätted" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d ühendatud" +msgstr[1] "%d ühendatud" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Väljas" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Sees" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Heledus" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Klaviatuur" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Klaviatuuripaigutuse kuvamine" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Asukoha jagamine lubatud" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Keela" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Privaatsussätted" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Asukoha jagamine sees" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Asukoha jagamine väljas" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Luba" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Kas jagad rakendusele %s juurdepääsu oma asukohale?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Asukoha ligipääse saab igal ajal privaatsussätetest muuta." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s väljas" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s ühendatud" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s pole hallatud" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s ühenduse katkestamine" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s ühendamine" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s vajab autentimist" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s püsivara puudub" + +#. 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s pole saadaval" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s ühendus nurjus" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Juhtmeühenduse sätted" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Mobiiliühenduse sätted" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s riistvaraliselt keelatud" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s keelatud" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Ühendu Internetiga" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Lennurežiim sees" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi on keelatud, kui lennurežiim on sees." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Lülita lennurežiim välja" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi väljas" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi tuleb sisse lülitada, et võrku ühenduda." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Lülita Wi-Fi sisse" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi võrgud" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Vali võrk" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Võrke pole" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Kasuta riistvaralist lülitit väljalülitamiseks" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Võrgu valimine" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi sätted" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s kuumkoht sees" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s pole ühendatud" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "ühendumine…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "vajalik on autentimine" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "ühendumine nurjus" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPN-i sätted" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN väljas" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Võrgusätted" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s juhtmega ühendus" +msgstr[1] "%s juhtmega ühendust" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi ühendus" +msgstr[1] "%s Wi-Fi ühendust" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemi ühendus" +msgstr[1] "%s modemi ühendust" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Ühendus nurjus" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Võrguühenduse aktiveerimine nurjus" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Öövalgustus keelatud" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Öövalgustus sees" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Jätka" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Keela homseni" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Toitesätted" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Täiesti täis" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Ei lae" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Andmete kogumine…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Jäänud %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Täitumiseni %d∶%02d (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Ekraani jagatakse" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Lülita välja" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Lennurežiim" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Vaheta kasutajat" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Logi välja" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Kasutaja sätted" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Asendilukk" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Uinak" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Lülita välja" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Tundmatu Thunderbolt-seade" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Sinu äraolekul tuvastati uus seade. Palun ühenda see seade lahti ja tagasi, " +"et selle kasutamist alustada." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Autoriseerimata Thunderbolt-seade" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolti autoriseerimise viga" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Thunderbolti seadet ei saanud autoriseerida: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Helivaljus muutus" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Peegelda" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Ühenda kuvarid" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Ainult väline" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Ainult sisemine" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Logi sisse teise kasutajana" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Võta aken lukust lahti" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Rakendused" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Otsing" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "„%s“ on valmis" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Kas tahad säilitada need kuvasätted?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Taasta sätted" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Säilita muudatused" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Sätete muudatused ennistatakse %d sekundi pärast" +msgstr[1] "Sätete muudatused ennistatakse %d sekundi pärast" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimeeri" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Tühista maksimeerimine" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maksimeeri" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Liiguta" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Muuda suurust" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Liiguta tiitliriba ekraanile" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Alati pealmine" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Alati kuvataval töölaual" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Liiguta vasakpoolsele töölauale" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Liiguta parempoolsele töölauale" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Liiguta ülemisele töölauale" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Liiguta alumisele töölauale" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Liiguta ülemisele kuvarile" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Liiguta alumisele kuvarile" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Liiguta vasakpoolsele kuvarile" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Liiguta parempoolsele kuvarile" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolutioni kalender" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Versiooniteabe kuvamine" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Sisselogimise kuval kasutatav GDM-i režiim" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Erirežiimi kasutamine, nt sisselogimisakna jaoks „gdm“" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Võimalike režiimide loetelu" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Tundmatu" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "„%s“ käivitamine nurjus" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Paroolid ei kattu." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Parool ei saa olla tühi" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Kasutaja katkestas autentimisdialoogi" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u väljund" +msgstr[1] "%u väljundit" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u sisend" +msgstr[1] "%u sisendit" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Süsteemi helid" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "%s jaoks eelistuste dialoogi laadimisel esines viga:" + +#~ msgid "%s all day." +#~ msgstr "%s terve päeva." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, hiljem %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, siis %s, hiljem %s." + +#~ msgid "Feels like %s." +#~ msgstr "Tundub nagu %s." + +#~ msgid "Show the message tray" +#~ msgstr "Teateala näitamine" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Shelli laienduste eelistused" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (waylandi komposiitor)" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Kategooriad, mida tuleb kuvada kaustadena" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Kõiki selles loetelus olevaid kategooriaid kuvatakse rakenduste vaates " +#~ "kaustadena, mitte peavaates teistega koos." + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Kalendris näidatakse kuupäeva nädalavormingus" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Kui määratud, kuvatakse kalendris kuupäeva ISO nädalavormingus." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Nuppude järjekord tiitliribal" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "See võti on ülimuslik võtme org.gnome.desktop.wm.preferences suhtes, kui " +#~ "kasutatakse GNOME Shelli." + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Vali seadistatav laiendus kasutades ülemist valikukasti." + +#~ msgid "Nothing Scheduled" +#~ msgstr "Ühtegi sündmust pole plaanitud" + +#~ msgid "Today" +#~ msgstr "Täna" + +#~ msgid "Tomorrow" +#~ msgstr "Homme" + +#~ msgid "This week" +#~ msgstr "Käesolev nädal" + +#~ msgid "Next week" +#~ msgstr "Järgmine nädal" + +#~ msgid "Removable Devices" +#~ msgstr "Eemaldatavad seadmed" + +#~ msgid "Eject" +#~ msgstr "Väljasta" + +#~ msgid "Invitation" +#~ msgstr "Kutse" + +#~ msgid "Call" +#~ msgstr "Helista" + +#~ msgid "File Transfer" +#~ msgstr "Failiülekanne" + +#~ msgid "Chat" +#~ msgstr "Vestlus" + +#~ msgid "Unmute" +#~ msgstr "Heli peale" + +#~ msgid "Mute" +#~ msgstr "Heli maha" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d. %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d. %B %Y, %H:%M" + +#~ msgid "Invitation to %s" +#~ msgstr "Kutse: %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s kutsub sind liituma: %s" + +#~ msgid "Decline" +#~ msgstr "Keeldu" + +#~ msgid "Accept" +#~ msgstr "Nõustu" + +#~ msgid "Video call from %s" +#~ msgstr "%s tahab alustada videokõnet" + +#~ msgid "Call from %s" +#~ msgstr "%s helistab" + +#~ msgid "Answer" +#~ msgstr "Vasta" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s saadab sulle %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s palub sinu luba, et näha, kui sa oled võrgus" + +#~ msgid "Authentication failed" +#~ msgstr "Autentimine nurjus" + +#~ msgid "Encryption error" +#~ msgstr "Krüptimise viga" + +#~ msgid "Certificate not provided" +#~ msgstr "Sertifikaati pole" + +#~ msgid "Certificate untrusted" +#~ msgstr "Sertifikaat pole usaldusväärne" + +#~ msgid "Certificate expired" +#~ msgstr "Sertifikaat on aegunud" + +#~ msgid "Certificate not activated" +#~ msgstr "Sertifikaat pole aktiivne" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Sertifikaadi hostinimi ei klapi" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Sertifikaadi sõrmejälg ei klapi" + +#~ msgid "Certificate self-signed" +#~ msgstr "Sertifikaat on ise-allkirjastatud" + +#~ msgid "Status is set to offline" +#~ msgstr "Oled nüüd ühenduseta olekus" + +#~ msgid "Certificate is invalid" +#~ msgstr "Sertifikaat on vigane" + +#~ msgid "Connection has been refused" +#~ msgstr "Ühendusest keelduti" + +#~ msgid "Connection can't be established" +#~ msgstr "Ühendust pole võimalik luua" + +#~ msgid "Connection has been lost" +#~ msgstr "Ühendus katkes" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Selle kontoga on juba serverisse ühendutud" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Ühendus on asendatud sama kontot kasutades uue ühendusega" + +#~ msgid "The account already exists on the server" +#~ msgstr "See konto on serveris juba olemas" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Server on praegu ühendusega toimetulekuks liiga hõivatud" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Sertifikaat on tühistatud" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Sertifikaat kasutab ebaturvalist šifrialgoritmini ning on nõrgalt " +#~ "krüptitud" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Serveri sertifikaadi pikkus ehk sertifikaatide keti sügavus ületab " +#~ "krüptograafiateegi määratud piiri" + +#~ msgid "Internal error" +#~ msgstr "Sisemine viga" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Pole võimalik ühenduda võrguga %s" + +#~ msgid "View account" +#~ msgstr "Konto kuvamine" + +#~ msgid "Open Calendar" +#~ msgstr "Ava kalender" + +#~ msgid "Date & Time Settings" +#~ msgstr "Kuupäeva ja kella sätted" + +#~ msgid "Open" +#~ msgstr "Ava" + +#~ msgid "Remove" +#~ msgstr "Eemalda" + +#~ msgid "Clear Messages" +#~ msgstr "Kustuta teated" + +#~ msgid "Notification Settings" +#~ msgstr "Märguannete sätted" + +#~ msgid "Tray Menu" +#~ msgstr "Paneelimenüü" + +#~ msgid "No Messages" +#~ msgstr "Teateid pole" + +#~ msgid "Message Tray" +#~ msgstr "Teateala" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d ühendatud seade" +#~ msgstr[1] "%d ühendatud seadet" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Aku" + +#~ msgid "Authorization request from %s" +#~ msgstr "Autoriseerimise päring seadmelt %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Seade '%s' tahab selle arvutiga paarduda" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Seade %s soovib ligipääsu teenusele '%s'" + +#~ msgid "Grant this time only" +#~ msgstr "Luba ainult seekord" + +#~ msgid "Reject" +#~ msgstr "Lükka tagasi" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Paardumise kinnitus seadmele %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "Palun kontrolli, kas parool '%06d' kattub seadme parooliga." + +#~ msgid "Matches" +#~ msgstr "Kattub" + +#~ msgid "Does not match" +#~ msgstr "Ei kattu" + +#~ msgid "Pairing request for %s" +#~ msgstr "Seadmega %s paardumise päring" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Palun sisesta seadme poolt öeldav PIN-kood." + +#~ msgid "OK" +#~ msgstr "Olgu" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Vabandust, tänaseks tarkuseteri pole:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Oraakel %s ütleb" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Settings Menu" +#~ msgstr "Sätete menüü" + +#~ msgid "Screenshots" +#~ msgstr "Ekraanipildid" + +#~ msgid "Record a screencast" +#~ msgstr "Ekraanivideo salvestamine" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Kas rakenduste kasutuse kohta kogutakse andmeid" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "Shell tavaliselt seirab aktiivseid rakendusi, et näidata enamkasutatavaid " +#~ "(näiteks käivitajaid). Kuigi neid andmeid hoitakse privaatselt, võid " +#~ "privaatsuse suurendamiseks selle keelata. Selle keelamine siiski ei " +#~ "eemalda juba salvestatud andmeid." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Kasutatakse kasutaja poolt viimati vahetult määratud kiirsuhtluse oleku " +#~ "salvestamiseks. See väärtus pärineb TpConnectionPresenceType nummerdusest." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Kasutatakse kasutaja poolt viimati vahetult määratud kiirsuhtluse oleku " +#~ "salvestamiseks. See väärtus pärineb GsmPresenceStatus nummerdusest." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Erkaanilindistaja lülitamise kiirklahv" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Kiirklahv erkaanilindistaja käivitamiseks/peatamiseks." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Ekraanivideo lindistamisel kasutatav kaadrikiirus." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "GNOME Shelli lindistatava ekraanivideo kaadrisagedus (kaadrit sekundis)." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "GStreameri toru, mida ekraanivideo kodeerimiseks kasutatakse" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Määrab GStreameri toru, mida kasutatakse lindistuste kodeerimiseks. See " +#~ "peab vastama gst-launch'i süntaksile. Torul peaks olema vaba plokk (sink " +#~ "pad), kuhu lindistatav video salvestatakse. Tavaliselt on vaba plokk " +#~ "olemas; selle ploki väljund kirjutatakse väljundfaili. Toru võib " +#~ "hoolitseda ka enda väljundi eest - seda võib kasutada väljundi saatmiseks " +#~ "icecast serverisse shout2send või sarnase tehnoloogia abil. Kui see on " +#~ "määramata või väärtus on tühi, kasutatakse vaikimisi toru. See on praegu " +#~ "'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +#~ "threads=%T ! queue ! webmmux' ning lindistab WEBM vormingusse VP8 " +#~ "koodekiga. %T asendatakse süsteemi oletatava optimaalseima lõimede " +#~ "(thread) arvuga." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Ekraanivideo salvestamisel kasutatav faililaiend" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Ekraanivideo jaoks kasutatav failinimi on unikaalne, see sisaldab " +#~ "salvestamise kuupäeva ja ka käesoleva võtmega määratud laiendit. Mõnda " +#~ "teise konteinervormingusse salvestades tuleks ka sellele vormingule " +#~ "vastav laiend määrata." + +#~ msgid "Session…" +#~ msgstr "Seanss…" + +#~ msgid "Power" +#~ msgstr "Vool" + +#~ msgid "Restart" +#~ msgstr "Taaskäivita" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Ekraanivideo %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Nende rakenduste sulgemiseks ja süsteemist väljalogimiseks klõpsa nupule " +#~ "Logi välja." + +#~ msgid "Logging out of the system." +#~ msgstr "Süsteemist väljalogimine" + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Nende rakenduste sulgemiseks ja süsteemi väljalülitamiseks klõpsa nupule " +#~ "Lülita välja." + +#~ msgid "Powering off the system." +#~ msgstr "Süsteemi väljalülitamine." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Nende rakenduste sulgemiseks ja süsteemi taaskäivitamiseks klõpsa " +#~ "\"Taaskäivita\"." + +#~ msgid "Restarting the system." +#~ msgstr "Süsteemi taaskäivitamine." + +#~ msgid "Universal Access Settings" +#~ msgstr "Universaalse ligipääsu sätted" + +#~ msgid "Visibility" +#~ msgstr "Nähtavus" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Uue seadme häälestamine…" + +#~ msgid "Send Files…" +#~ msgstr "Failide saatmine…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Klaviatuurisätted" + +#~ msgid "Mouse Settings" +#~ msgstr "Hiiresätted" + +#~ msgid "Volume, network, battery" +#~ msgstr "Helivaljus, võrk, aku" + +#~ msgid "disabled" +#~ msgstr "keelatud" + +#~ msgid "cable unplugged" +#~ msgstr "juhe eemaldatud" + +#~ msgid "More…" +#~ msgstr "Veel…" + +#~ msgid "Wired" +#~ msgstr "Juhtmega" + +#~ msgid "Auto Ethernet" +#~ msgstr "Automaatne ethernet" + +#~ msgid "Auto broadband" +#~ msgstr "Automaatne lairibaühendus" + +#~ msgid "Auto dial-up" +#~ msgstr "Automaatne sissehelistamine" + +#~ msgid "Auto %s" +#~ msgstr "Automaatne %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Automaatne bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Automaatne juhtmeta ühendus" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "jäänud %d %s ja %d %s" + +#~ msgid "AC Adapter" +#~ msgstr "Laadija" + +#~ msgid "Laptop Battery" +#~ msgstr "Sülearvuti aku" + +#~ msgid "Mouse" +#~ msgstr "Hiir" + +#~ msgid "PDA" +#~ msgstr "Elektronmärkmik" + +#~ msgid "Cell Phone" +#~ msgstr "Mobiiltelefon" + +#~ msgid "Media Player" +#~ msgstr "Meediaesitaja" + +#~ msgid "Tablet" +#~ msgstr "Graafikalaud" + +#~ msgid "Computer" +#~ msgstr "Arvuti" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Tundmatu" + +#~ msgid "Available" +#~ msgstr "Saadaval" + +#~ msgid "Busy" +#~ msgstr "Hõivatud" + +#~ msgid "Invisible" +#~ msgstr "Nähtamatu" + +#~ msgid "Away" +#~ msgstr "Eemal" + +#~ msgid "Idle" +#~ msgstr "Jõude" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Sinu vestluse olekuks määratakse hõivatud" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Märguanded on nüüd keelatud, sealhulgas vestlusteated. Sinu netiolekut " +#~ "muudeti, et teised teaksid, et sa ei pruugi nende teateid näha." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Väljalülitamine võib põhjustada salvestamata töö kaotsimineku." + +#~ msgid "Show full name in the user menu" +#~ msgstr "Kasutajamenüüs näidatakse kasutaja tervet nime" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "Kas kasutajamenüüs näidatakse kasutaja kogu nime või mitte." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Sisselogimine" + +#~ msgid "APPLICATIONS" +#~ msgstr "RAKENDUSED" + +#~ msgid "SETTINGS" +#~ msgstr "SEADED" + +#~ msgid "tray" +#~ msgstr "salv" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Sinu lemmiküllatusmuna" + +#~ msgid "United Kingdom" +#~ msgstr "Suurbritannia" + +#~ msgid "Default" +#~ msgstr "Vaikimisi" + +#~ msgid "Subscription request" +#~ msgstr "Tellimuse päring" + +#~ msgid "%H:%M on Yesterday" +#~ msgstr "Eile %H:%M" + +#~ msgid "Connection to %s failed" +#~ msgstr "Ühendus %s nurjus" + +#~ msgid "Reconnect" +#~ msgstr "Ühendu uuesti" + +#~ msgid "Wireless" +#~ msgstr "Juhtmeta" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "keelatud OpenSearch pakkujad" + +#~ msgid "Show time with seconds" +#~ msgstr "Kellaaega näidatakse sekunditega" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Kui määratud, siis kuvatakse aja juures ka sekundeid." + +#~ msgid "Show date in clock" +#~ msgstr "Kell näitab kuupäeva" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Kui määratud, siis kuvatakse kellaaja kõrval ka kuupäeva." + +#~ msgid "CONTACTS" +#~ msgstr "KONTAKTID" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "'%s' lahtihaakimine nurjus" + +#~ msgid "Retry" +#~ msgstr "Proovi uuesti" + +#~ msgid "Connect to..." +#~ msgstr "Ühendumine..." + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ASUKOHAD JA SEADMED" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Vale parool, palun proovi uuesti" + +#~ msgid "%s is busy." +#~ msgstr "%s on hõivatud." + +#~ msgid "Hidden" +#~ msgstr "Nähtamatu" + +#~ msgid "Power Off..." +#~ msgstr "Lülita välja..." + +#~ msgid "Online Accounts" +#~ msgstr "Netikontod" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..346595e --- /dev/null +++ b/po/eu.po @@ -0,0 +1,2210 @@ +# Basque translation for gnome-shell. +# Copyright (C) 2011 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Julen Ruiz Aizpuru , 2011. +# Iñaki Larrañaga Murgoitio , 2011, 2012, 2013, 2014, 2015, 2016, 2017. +# Asier Sarasua Garmendia , 2013, 2019. +msgid "" +msgstr "Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-21 18:43+0000\n" +"PO-Revision-Date: 2019-02-23 06:00+0100\n" +"Last-Translator: Asier Sarasua Garmendia \n" +"Language-Team: Basque \n" +"Language: eu\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: OmegaT 4.1.5\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Erakutsi jakinarazpen-zerrenda" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokatu jakinarazpen aktiboa" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Erakutsi ikuspegi orokorra" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Erakutsi aplikazio guztiak" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Ireki aplikazioen menua" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell-en hedapenak" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Konfiguratu GNOME Shell-eko gehigarriak" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Leiho-kudeaketa eta aplikazioak abiaraztea" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Gaitu garatzaile eta probatzaileentzako barne-tresnak Alt-F2 bitartez" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "Barneko arazte- eta gainbegiraketa-tresnen atzipena onartzen du Alt-F2 elkarrizketa-koadroa erabiliz." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Gaitzeko hedapenen UUIDak" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "GNOME Shell gehigarriek UUID propietatea dute; kargatu beharko liratekeen gehigarriak zerrendatzen ditu gako honek. Kargatzea nahi diren gehigarri guztiak zerrenda honetan agertu behar dute. Zerrenda hau alda dezakezu DBus-eko 'EnableExtension' (gehitu hedapena) eta 'DisableExtension' (desgaitu hedapena) metodoekin 'org.gnome.Shell'-en." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Desgaitu erabiltzailearen gehigarriak" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "“enabled-extension” ezarpenari eragin gabe erabiltzaileak gaitutako gehigarri guztiak desgaitu." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Hedapenaren bertsioaren bateragarritasunaren balidazioa desgaitzen du" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "GNOME Shell-ek unean exekutatzen ari den bertsioarekin bat datozen hedapenak soilik kargatzen ditu. Aukera hau gaitzean egiaztapen hau desgaitzen da eta hedapen guztiak kargatzen saiatzen da, onartzen duten bertsioari ez ikusi eginez." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Gogoko aplikazioen mahaigaineko fitxategien IDen zerrenda" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "Identifikadore horiei dagozkien aplikazioak bistaratuko dira gogokoen arean." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Aplikazio-hautatzailearen ikuspegia" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Unean hautatutako ikuspegiaren indizea aplikazio-hautatzailean." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Komandoen (Alt-F2) elkarrizketa-koadroaren historia" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Ikuskatzailearen elkarrizketa-koadroaren historia" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Erakutsi beti erabiltzaile-menuko “Amaitu saioa“ menu-elementua." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "Gako honek “Amaitu saioa“ menu-elementua automatikoki ezkutatzea gainidazten du, saio bakarreko egoeran." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "Zifratutako edo urruneko fitxategi-sistemak muntatzeko pasahitza gogoratuko den ala ez" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "Shell-ak pasahitza eskatuko du zifratutako gailu bat edo urruneko fitxategi-sistema bat muntatzen denean. Pasahitza geroago erabiltzeko gorde badaiteke, “Gogoratu pasahitza“ kontrol-laukia agertuko da. Gako honek kontrol-laukiaren egoera lehenetsia ezartzen du." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Bluetooth lehenetsiaren moldatzaileak berarekin esleitutako gailurik duen ala ez" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "Shell-ak Bluetooth moldagailu bat entxufatuta dagoenean soilik Bluetooth-aren menua erakutsiko duen, edo moldagailu lehenetsiarekin esleitutako gailuak konfiguratuta daudenean. Hau leheneratu egingo da moldagailu lehenetsiak berarekin esleitutako gailurik ez daukanean." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Gaitu introspekzio APIa" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "Shell-en aplikazio-egoeraren introspekzioa ahalbidetzen duen D-Bus API bat gaitzen du." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Aplikazioen menua irekitzeko laster-tekla" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Aplikazioen menua irekitzeko laster-tekla." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "“Erakutsi aplikazioak“ bista irekitzeko laster-tekla" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Jarduerak ikuspegi orokorraren “Erakutsi aplikazioak“ ikuspegia irekitzeko laster-tekla." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Ikuspegi orokorra bista irekitzeko laster-tekla" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Jardueren ikuspegi orokorra irekitzeko laster-tekla" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Jakinarazpenen zerrendaren ikusgaitasuna txandakatzeko laster-tekla" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Jakinarazpenen zerrendaren ikusgaitasuna txandakatzeko laster-tekla." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Jakinarazpen aktiboa enfokatzeko laster-tekla" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Jakinarazpen aktiboa enfokatzeko laster-tekla." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "Laster-teklak exekutatzen ari diren 'tween' guztiak pausarazi eta jarraitzen ditu arazketa lantzeko" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Aldatu 1 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Aldatu 2 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Aldatu 3 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Aldatu 4 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Aldatu 5 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Aldatu 6 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Aldatu 7 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Aldatu 8 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Aldatu 9 aplikaziora" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Erabili beharreko teklatua" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Erabili beharreko teklatu mota." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Mugatu aldatzailea uneko laneko areara." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "TRUE (egia) bada, uneko laneko arean leihoak dituzten aplikazioak soilik erakutsiko dira aldatzailean. Bestela, aplikazio guztiak egongo dira." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Aplikazio-ikonoaren modua." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "Leihoak aldatzaileak nola erakusten diren konfiguratzen du. Aukera posibleak “thumbnail-only“ (leihoaren miniatura erakustea), “app-icon-only“ (aplikazio-ikonoa erakustea soilik) edo “both“ (biak)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "TRUE (egia) bada, uneko laneko arean leihoak soilik erakutsiko dira aldatzailean. Bestela, leiho guztiak egongo dira." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Erantsi elkarrizketa-leiho modala leiho gurasoari" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Gako honek org.gnome.mutter gakoa gainidazten du GNOME Shell exekutatzean." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Gaitu lauzatzea leihoak pantailaren ertzetan jaregitean" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Laneko areak dinamikoki kudeatzen dira" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Laneko areak monitore nagusian soilik" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Fokuaren aldaketaren atzerapena saguaren moduan erakusleak mugitzeari utzi arte" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Sareko saio-hasiera" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Zerbait gaizki joan da" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "Barkatu, arazo bat gertatu da: hedapen honen ezarpenak ezin dira erakutsi. Arazoa hedapenaren egileei jakinarazi diezaiezun gomendatzen dizugu." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Xehetasun teknikoak" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Kopiatze-errorea" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Webgune nagusia" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Bisitatu hedapenaren webgunea" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Ez dago hedapenik instalatuta" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "Hedapenak instalatzeko, Software edo extensions.gnome.org erabili daiteke." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Arakatu softwarean" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Utzi" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Hurrengoa" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Desblokeatu" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Hasi saioa" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Aukeratu saioa" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Ez zaude zerrendan?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(adib., erabiltzailea edo %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Erabiltzaile-izena: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Saio-hasierako leihoa" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Autentifikazio-errorea" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(edo lerratu hatza)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Itzali" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "itzali;amatatu;berrabiarazi;berrezarri" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Blokeatu pantaila" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "blokeatu pantaila" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Amaitu saioa" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "amaitu saioa;deskonektatu" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Eseki" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "eseki;lo" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Aldatu erabiltzailea" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "aldatu erabiltzailea" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Blokeatu orientazioa" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "blokeatu orientazioa;pantaila;biraketa" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Ez da komandoa aurkitu" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Ezin izan da komandoa analizatu:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Huts egin du '%s' exekutatzean:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Orain" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "duela minutu %d" +msgstr[1] "duela %d minutu" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "duela ordu %d" +msgstr[1] "duela %d ordu" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Atzo" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "duela egun %d" +msgstr[1] "duela %d egun" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "duela aste %d" +msgstr[1] "duela %d aste" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "duela hilabete %d" +msgstr[1] "duela %d hilabete" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "duela urte %d" +msgstr[1] "duela %d urte" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Atzo, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%B %-d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Atzo, %I:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%B %-d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%B %-d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Wifigunearen saio-hasiera" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "Wifigune honetarako saio-hasierako zure konexioa ez da segurua. Orri honetan sartzen dituzun pasahitzak edo bestelako informazioak inguruko beste jendeek ikus ditzakete." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Ukatu sarbidetza" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Baimendu sarbidetza" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Maiztasunez erabilitako aplikazioak hemen agertuko dira" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Askotan" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Denak" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "_Leiho berria" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Abiarazi eskainitako txartel grafikoa erabiliz" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Kendu gogokoetatik" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Gehitu gogokoei" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Erakutsi xehetasunak" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s gogokoei gehitu zaie." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s gogokoetatik kendu da." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Hautatu audioaren gailua" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Soinuaren ezarpenak" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Aurikularrak" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Aurikular+mikrofonoa" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofonoa" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Aldatu atzeko planoa…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Pantailaren ezarpenak" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Ezarpenak" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "I" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "A" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "A" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "A" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "O" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "O" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "L" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Aurreko hila" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Hurrengo hila" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "%V. astea" + +#. 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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Egun osoa" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %B %-d" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %B %-d, %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Jakinarazpenik ez" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Gertaerarik ez" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Garbitu" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s“(e)k ez du erantzuten." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "Pixka bat itxoitearen edo aplikazioa irtetera derrigortzearen artean aukera dezakezu." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Derrigortu irtetea" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Itxoin" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Kanpoko unitatea konektatuta" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Kanpoko unitatea deskonektatuta" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Ireki honekin: %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Pasahitza:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Idatzi berriro:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "Bestela, zure routerreko \"WPS\" botoia sakatuta konektatu zaitezke." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Konektatu" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Pasahitza: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Gakoa: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Gako pribatuaren pasahitza: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identitatea: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Zerbitzua: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Haririk gabeko sareak autentifikazioa eskatzen du" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "Pasahitzak edo zifratze-gakoak behar dira haririk gabeko '%s' sarera sarbidetzeko." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Haridun 802.1X autentifikazioa" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Sarearen izena: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL autentifikazioa" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN kodea behar da" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN kodea behar da bandazabal mugikorreko gailuarentzako" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PINa: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Bandazabal mugikorreko sarearen pasahitza" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Pasahitza behar da '%s'(e)ra konektatzeko." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Sarearen kudeatzailea" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Autentifikazioa behar da" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administratzailea" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Autentifikatu" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Huts egin du. Saiatu berriro." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s orain %s izenarekin ezagutzen da" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Leihoak" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Erakutsi aplikazioak" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Atrakagarria" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%B %-d %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %Y(e)ko %Bren %e(a)" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Gehitu munduko erlojuak…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Munduko erlojuak" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Eguraldia" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Hautatu kokalekua…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Kargatzen..." + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Konektatu eguraldiaren informazioa lortzeko" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Eguraldiaren informazioa unean ez dago eskuragarri" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Amaitu %s(r)en saioa" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Amaitu saioa" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s erabiltzailearen saioa automatikoki %d segundotan amaituko da." +msgstr[1] "%s erabiltzailearen saioa automatikoki %d segundotan amaituko da." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Zure saioa automatikoki %d segundotan amaituko da." +msgstr[1] "Zure saioa automatikoki %d segundotan amaituko da." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Amaitu saioa" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Itzali" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalatu eguneraketak eta itzali" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistema automatikoki %d segundotan itzaliko da." +msgstr[1] "Sistema automatikoki %d segundotan itzaliko da." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalatu falta diren softwareen eguneraketak" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Berrabiarazi" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Itzali" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Berrabiarazi" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistema automatikoki %d segundotan berrabiaraziko da." +msgstr[1] "Sistema automatikoki %d segundotan berrabiaraziko da." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Berrabiarazi eta instalatu eguneraketak" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "Sistema automatikoki berrabiaraziko da eta eguneraketak instalatuko ditu segundo %dean." +msgstr[1] "Sistema automatikoki berrabiaraziko da eta eguneraketak instalatuko ditu %d segundotan." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Berrabiarazi eta instalatu" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalatu eta itzali" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Itzali eguneraketa guztiak instalatu ondoren" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Berrabiarazi eta instalatu bertsio-berritzea" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "%s %s instalatuko da berrabiarazi ondoren. Bertsio-berritzearen instalazioak denbora luzea beharko du, ziurtatu zaitez babeskopia eginda daukazula eta ordenagailua entxufatuta dagoela." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Bateriarrekin ari da lanean: entxufatu eguneraketak instalatu aurretik." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Aplikazio batzuk lanpetuta daude edo gorde gabeko lanak dituzte." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Beste erabiltzaileek saioa hasi dute." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (urrunekoa)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (kontsola)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Instalatu" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Deskargatu eta instalatu “%s“ extensions.gnome.org gunetik?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "“%s“(e)k laster-teklak galarazi nahi ditu" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplikazioak laster-teklak galarazi nahi ditu" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Laster-teklak lehenera ditzakezu “%s\" sakatuz." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Ukatu" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Baimendu" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Tekla geldoak aktibatuta" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Tekla geldoak desaktibatuta" + +#: js/ui/kbdA11yDialog.js:33 +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 "Shift teklari 8 segundo baino denbora gehiago eutsi diozu sakatuta. Hori tekla geldoen eginbidea aktibatzeko lasterbidea da, eta zure teklatuaren funtzionamendua aldatzen du." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Tekla itsaskorrak aktibatuta" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Tekla itsaskorrak desaktibatuta" + +#: js/ui/kbdA11yDialog.js:43 +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 "Shift teklari 5 aldiz jarraian sakatu diozu. Hori tekla itsaskorren eginbidea aktibatzeko lasterbidea da, eta zure teklatuaren funtzionamendua aldatzen du." + +#: js/ui/kbdA11yDialog.js:45 +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 "Bi tekla aldi berean sakatu dituzu, edo Shift teklari 5 aldiz jarraian sakatu diozu. Hori tekla itsaskorren eginbidea desaktibatzeko lasterbidea da, eta zure teklatuaren funtzionamendua aldatzen du." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Utzi piztuta" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Piztu" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Itzali" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Utzi itzalita" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Eskualdearen eta hizkuntzaren ezarpenak" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Hedapenik ez dago instalatuta" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s(e)k ez du inolako errorerik igorri." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Ezkutatu erroreak" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Erakutsi erroreak" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Gaituta" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Desgaituta" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Errorea" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Zaharkituta" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Deskargatzen" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Ikusi iturburua" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Web orria" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Sistemaren informazioa" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Artista ezezaguna" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Titulu ezezaguna" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Bolumena" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Desegin" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Aurkezpen orokorra" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Idatzi bilaketa..." + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Laster-tekla berria..." + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Aplikazioan definituta" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Erakutsi pantailako laguntzan" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Aldatu monitorea" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Esleitu tekla-sakatzea" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Eginda" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Editatu…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Bat ere ez" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Sakatu botoi bat konfiguratzeko" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Sakatu Ihes irteteko" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Sakatu edozer tekla irteteko" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Irten" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Jarduerak" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Goiko barra" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Idatzi komandoa" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Itxi" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Berrabiaraztea ez dago erabilgarri Wayland-en" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Berrabiarazten…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "Mezu berri %d" +msgstr[1] "%d mezu berri" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "Jakinarazpen berri %d" +msgstr[1] "%d jakinarazpen berri" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Blokeatu" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOMEk pantaila blokeatzea behar du" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Ezin da blokeatu" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Beste aplikazio batek blokeatu du" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Bilatzen…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Emaitzarik ez." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d gehiago" +msgstr[1] "%d gehiago" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopiatu" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Itsatsi" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Erakutsi testua" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Ezkutatu testua" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Pasahitza" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Gogoratu pasahitza" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Erabilerraztasuna" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zooma" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Pantaila irakurlea" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Pantailako teklatua" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Abisu bisualak" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Tekla itsaskorrak" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Tekla geldoak" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Errebote-teklak" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Sagu-teklak" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Kontraste handia" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Testu handia" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth ezarpenak" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d konektatuta" +msgstr[1] "%d konektatuta" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Desaktibatuta" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Aktibatuta" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Distira" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Teklatua" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Erakutsi teklatuaren diseinua" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Kokalekua gaituta" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Desgaitu" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Pribatutasunaren ezarpenak" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Kokalekua erabilita" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Kokalekua desgaituta" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Gaitu" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Eman '%s'(r)i zure kokalekurako sarbidetza?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Kokalekuaren sarbidetza edozer unetan alda daiteke pribatutasunen ezarpenetatik." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "'%s' itzalita" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "'%s' konektatuta" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "'%s' kudeatu gabea" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "'%s' deskonektatzen" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "'%s' konektatzen" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "'%s'(e)k autentifikazioa eskatzen du" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "'%s'(r)en firmwarea falta da" + +#. 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "'%s' ez dago erabilgarri" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "'%s'(r)en konexioak huts egin du" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Haridunaren ezarpenak" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Bandazabal mugikorraren ezarpenak" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "'%s' hardwarea desgaituta" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "'%s' desgaituta" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Konektatu Internetera" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Hegazkin modua piztuta" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Haririk gabekoa desgaitu egiten da hegazkin modua piztean." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Itzali hegazkin modua" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Haririk gabekoa itzalita" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Haririk gabekoa piztu egin behar da sare batera konektatzeko." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Piztu haririk gabekoa" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi sareak" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Hautatu sare bat" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Sarerik ez" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Erabili hardwarearen aldatzailea itzaltzeko" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Hautatu sarea" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Haririk gabekoaren ezarpenak" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "'%s' wifigunea aktibo" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "'%s' konektatu gabe" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "konektatzen…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "autentifikazioa behar da" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "konexioak huts egin du" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPNaren ezarpenak" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPNa" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPNa itzalita" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Sarearen ezarpenak" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s haridun konexioa" +msgstr[1] "%s haridun konexioak" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s haririk gabeko konexioa" +msgstr[1] "%s haririk gabeko konexioak" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modem konexioa" +msgstr[1] "%s modem konexioak" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Konexioak huts egin du" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Sareko konexioa aktibatzeak huts egin du" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "“Gaueko argia“ desgaituta" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "“Gaueko argia“ aktibatuta" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Jarraitu" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Desgaitu bihar arte" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Energiaren ezarpenak" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Erabat kargatuta" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Kargarik ez" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Kalkulatzen…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d falta da (%% %d)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d bete arte (%% %d)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%% %d" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Pantaila partekatzen ari da" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Desaktibatu" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Hegazkin modua piztuta" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Aldatu erabiltzailea" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Amaitu saioa" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Kontuaren ezarpenak" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Orientazioaren blokeoa" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Eseki" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Itzali" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Thunderbolt gailu ezezaguna" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "Gailu berria detektatu da ez zeunden bitartean. Deskonektatu eta berriro konektatu gailua hura erabiltzen hasi ahal izateko." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Baimenik gabeko Thunderbolt gailua" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Gailu berria detektatu da eta administratzaile batek baimena eman behar dio." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt baimen-errorea" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Ezin izan da Thunderbolt gailua baimendu: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Bolumena aldatuta" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Ispilua" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Batu pantailak" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Kanpokoa soilik" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Barnekoa soilik" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Hasi saioa beste erabiltzaile baten gisan" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Desblokeatu leihoa" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplikazioak" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Bilatu" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "'%s' prest dago" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Pantailaren ezarpen hauek mantentzea nahi duzu?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Alderantzikatu ezarpenak" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Mantendu aldaketak" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Ezarpenen aldaketak segundo %dean alderantzikatuko dira" +msgstr[1] "Ezarpenen aldaketak %d segundotan alderantzikatuko dira" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimizatu" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Desmaximizatu" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximizatu" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Aldatu lekuz" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Aldatu tamaina" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Mugitu titulu-barra pantailan" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Beti gainean" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Beti laneko area ikusgaian" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Eraman ezkerreko laneko areara" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Eraman eskuineko laneko areara" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Eraman gaineko laneko areara" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Eraman azpiko laneko areara" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Eraman gaineko pantailara" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Eraman azpiko pantailara" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Eraman ezkerreko pantailara" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Eraman eskuineko pantailara" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution egutegia" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Bistaratu bertsioa" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "GDMk erabiltzen duen modua saio-hasierako pantailarako" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Erabili modu jakin bat, adib. “gdm“, saioa hasteko pantailarako" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Zerrendatu modu posibleak" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Ezezaguna" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Huts egin du '%s' abiaraztean" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Pasahitzak ez datoz bat" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Pasahitza ezin da hutsa izan" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Erabiltzaileak autentifikatzeko elkarrizketa-koadroa itxi du" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "Irteera %u" +msgstr[1] "%u irteera" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "Sarrera %u" +msgstr[1] "%u sarrera" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sistemaren soinuak" diff --git a/po/fa.po b/po/fa.po new file mode 100644 index 0000000..56e52f7 --- /dev/null +++ b/po/fa.po @@ -0,0 +1,2867 @@ +# Persian translation for gnome-shell. +# Copyright (C) 2010-2011 Iranian Free Software Users Group (IFSUG.org)translation team. +# This file is distributed under the same license as the gnome-shell package. +# Mahyar Moghimi , 2010. +# Arash Mousavi , 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017. +# +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-09-22 13:50+0000\n" +"PO-Revision-Date: 2017-10-01 17:04+0330\n" +"Last-Translator: Arash Mousavi \n" +"Language-Team: Persian <>\n" +"Language: fa\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-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 2.0.4\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "سیستم" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "نمایش فهرست اعلان‌ها" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "متمرکز کردن اعلان فعال" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "نمایش نمای کلی" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "نمایش همه برنامه‌ها" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "بازکردن منو برنامه" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "افزونه‌های پوسته" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "پیکربندی ترجیحات افزونه‌های گنوم‌شل" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "پوستهٔ گنوم" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "مدیریت پنجره‌ها و اجرا کننده‌ی برنامه‌ها" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"فعال کردن ابزارهای داخلی مفید برای توسعه دهندگان و آزمایش کنندگان از طریق Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 dialog." +msgstr "" +"اجازه دسترسی به ابزارهای اشکال‌زدا و پایشگر داخلی با استفاده از محاوره‌ی Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "شناسه‌های UUID افزونه‌ها جهت فعال‌سازی" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"افزونه‌های گنوم‌شل مشخصه‌ی UUID دارند؛ این کلید، افزونه‌هایی که باید بار شوند را " +"فهرست می‌کند. هر افزونه‌ای که می‌خواهد بار شود، باید در این فهرست باشد. شما همچنین " +"می‌توانید این فهرست را از طریق EnableExtension و DisableExtension (روش‌های D-Bus) " +"در org.gnome.Shell نیز بسازید." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "غیرفعّال کردن افزونه‌های کاربر" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"غیرفعّال کردن تمام افزونه‌هایی که کاربر فعّال کرده، بدون اثر روی تنظیمات «افزونهٔ " +"فعّال»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "غیرفعال‌سازی بررسی سازگاری نسخه‌ی افزونه" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current running " +"version. Enabling this option will disable this check and try to load all " +"extensions regardless of the versions they claim to support." +msgstr "" +"گنوم‌شل تنها نسخه‌هایی از افزونه‌ها رو بارگیری می‌کند که ادعا می‌کنند از نسخه فعلی " +"پشتیبانی می‌کند. فعال‌سازی این گزینه، بررسی این مورد را غیرفعال می‌کند و سعی خواهد " +"شد که تمام افزنه‌ها، بدون درنظر گرفتن سازگاری آنها بارگیری شوند." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "فهرست شناسه‌های پرونده‌ی رومیزی برای برنامه‌های مورد پسند" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "برنامه‌های مشابه این شناسه‌ها در قسمت مورد پسندها نمایش داده می‌شود." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "نمای گزینش برنامه" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "اندیس نمای انتخاب شده در انتخابگر برنامه." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "تاریخچه‌ی فرمان برای محاوره‌ی (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "تاریخچه برای نما محاوره شیشه‌ای" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "نمایش همیشگی «خروج از سیستم» در فهرست کاربر." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"این کلید مخفی‌سازی خودکار مورد «خروج از سیستم» در منو را در حالت‌های یک-کاربر، یک-" +"نشست بازنویسی می‌کند." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"اینکه آیا گذرواژه برای سوارکردن سیستم‌های پرونده‌ی رمزنگاری شده و یا دوردست به‌خاطر " +"سپرده شود یا خیر" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a “Remember " +"Password” checkbox will be present. This key sets the default state of the " +"checkbox." +msgstr "" +"هنگامی که دستگاهی رمزنگاری شده یا سامانه‌پرونده‌ای دوردست سوار می‌شود، پوسته " +"درخواست گذرواژه می‌کند. اگر گذرواژه را بتوان برای استفادهٔ آینده ذخیره کرد، گزینهٔ " +"«به‌خاطر سپردن گذرواژه» موجود خواهد بود. این کلید، حالت پیش‌گزیدهٔ این گزینه را " +"تنظیم می‌کند." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "اینکه آداپتور بلوتوث پیش‌فرض دستگاه‌هایی متصل به خود دارد یا خیر" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default adapter. " +"This will be reset if the default adapter is ever seen not to have devices " +"associated to it." +msgstr "" +"شل تنها زمانی منو بلوتوث را نمایش می‌دهد که آداپتور بلوتوث روشن باشد، یا " +"دستگاه‌هایی به گونه‌ای تنظیم شده باشند که به آداپتور پیش‌فرض متصل شوند." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "کلید مقید برای باز کردن منو برنامه" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "کلید مقید برای باز کردن منو برنامه." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "کلید تخصیص‌یافته برای باز کردن نمای «نمایش برنامه‌ها»" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "کلید تخصیص یافته برای باز کردن نمای «نمایش برنامه‌ها» در نمای‌کلی فعالیت‌ها." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "کلید مقید برای باز کردن نمای کلی" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "کلید مقید برای باز کردن نمای «نمایش برنامه‌ها»." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "کلید مقید برای تغییر وضعیت نمایش فهرست پیام‌ها" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "کلید مقید برای تغییر وضعیت نمایش فهرست پیام‌ها." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "کلید مقید برای متمرکز کردن اعلان فعال" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "کلید مقید برای متمرکز کردن اعلان فعال." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"کلیدهای مقید برای مکث کردن و اجرا کردن تمام دوغلوهای در حال اجرا، برای مصارف رفع " +"اشکال" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "استفاده از کدام صفحه‌کلید" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "نوع صفحه‌کلید برای استفاده." + +#: data/org.gnome.shell.gschema.xml.in:158 data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "محدود کردن تعویض‌گر به فضای‌کاری فعلی." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are shown " +"in the switcher. Otherwise, all applications are included." +msgstr "" +"اگر درست باشد، تنها برنامه‌هایی که در فضای‌کاری فعلی پنجره دارند در تعویض‌گر نشان " +"داده می‌شوند. در غیر این صورت، تمام برنامه‌ها نشان داده می‌شوند." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "حالت شمایلی برنامه." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities are " +"“thumbnail-only” (shows a thumbnail of the window), “app-icon-only” (shows only " +"the application icon) or “both”." +msgstr "" +"نحوه نمایش پنجره‌ها را در تعویضگر پیکربندی می‌کند. مقدارهای ممکن عبارتند از " +"«thumbnail-only» (نمایش تصویر بندانگشتی از پنجره)، «app-icon-only» (نمایش تنها " +"شمایل برنامه) یا «both» (هر دو)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"اگر درست باشد، تنها پنجره‌های فضای‌کاری فعلی در تعویض‌گر نمایش داده می‌شود. در غیر " +"این صورت، تمام پنجره‌ها اضافه می‌شوند." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "چسباندن محاوره‌ی مقید به پنجره والد" + +#: data/org.gnome.shell.gschema.xml.in:198 data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "این کلید، کلید org.gnome.mutter را در زمان اجرای گنوم‌شل بازنویسی می‌کند." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "فعال کردن مرتب‌سازی پنجره‌ها هنگام رها کردنشان در گوشه‌های صفحه نمایش" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "فضاهای کاری به‌صورت پویا مدیریت می‌شوند" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "فضاهای کاری تنها در صفحه‌نمایش اصلی" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"به تاخیر انداختن تغییر تمرکز در حالت موشی تا زمانی که نشانگر از حرکت باز ایستد" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "ورود به سیستم شبکه" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "خطایی هنگام باز کردن محاوره‌ی ترجیحات برای %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 +msgid "Cancel" +msgstr "لغو" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "بعدی" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "بازکردن قفل" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "ورود" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "انتخاب نشست" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "فهرست نشده؟" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(برای مثال, کاربر یا %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "نام‌کاربری: " + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "پنجره‌ی ورود به سیستم" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "خطا تایید هویت" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +msgid "(or swipe finger)" +msgstr "(یا انگشتتان را بکشید)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +msgctxt "search-result" +msgid "Power off" +msgstr "خاموش کردن" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +msgid "power off;shutdown" +msgstr "خاموش کردن" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +msgctxt "search-result" +msgid "Lock screen" +msgstr "صفحهٔ قفل" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +msgid "lock screen" +msgstr "قفل کردن صفحه" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +msgctxt "search-result" +msgid "Log out" +msgstr "خروج" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "خارج شدن" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +msgctxt "search-result" +msgid "Suspend" +msgstr "تعلیق" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +msgid "suspend;sleep" +msgstr "تعلیق" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:127 +msgctxt "search-result" +msgid "Switch user" +msgstr "تعویض کاربر" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:130 +msgid "switch user" +msgstr "تعویض کاربر" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:134 +msgctxt "search-result" +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 "قفل کردن جهت" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "فرمان پیدا نشد" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "عدم توانایی در تجزیه فرمان:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "اجرای «%s» شکست خورد:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "همین الآن" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%Id دقیقه پیش" +msgstr[1] "%Id دقیقه پیش" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%Id ساعت پیش" +msgstr[1] "%Id ساعت پیش" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "دیروز" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%Id روز پیش" +msgstr[1] "%Id روز پیش" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%Id هفته پیش" +msgstr[1] "%Id هفته پیش" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%Id ماه پیش" +msgstr[1] "%Id ماه پیش" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%Id سال پیش" +msgstr[1] "%Id سال پیش" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%OH∶%OM" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "دیروز، %OH:%OM" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A، %OH∶%OM" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d %B، %OH∶%OM" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%Od %OB %OY، %OH:%OM" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%Ol∶%OM %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "دیروز، %OI:%OM" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A، %OH:%OM" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%Od %B، %OH:%OM" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%Od %B، %OH:%OM" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "ورود نقطهٔ داغ" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"اتّصال شما به این ورود نقطهٔ داغ امن نیست. گذرواژه‌ها یا دیگر اطّلاعاتی که در این " +"صفحه وارد می‌کنید، می‌تواند توسّط افراد اطراف دیده شود." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "رد دسترسی" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "پذیرفتن دسترسی" + +#: js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "برنامه‌های بیشتر استفاده شده در اینجا نمایش داده می‌شود" + +#: js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "پُراستفاده" + +#: js/ui/appDisplay.js:937 +msgid "All" +msgstr "همه" + +#: js/ui/appDisplay.js:1915 +msgid "New Window" +msgstr "پنجره‌ی جدید" + +#: js/ui/appDisplay.js:1929 +msgid "Launch using Dedicated Graphics Card" +msgstr "اجرا با کارت گرافیک اختصاصی" + +#: js/ui/appDisplay.js:1956 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "حذف از مورد پسندها" + +#: js/ui/appDisplay.js:1962 +msgid "Add to Favorites" +msgstr "اضافه کردن به مورد پسندها" + +#: js/ui/appDisplay.js:1972 +msgid "Show Details" +msgstr "نمایش جزئیات" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "مورد %s به مورد پسندهای شما اضافه شد." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "مورد %s ازمورد پسندهای شما حذف شد." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "انتخاب دستگاه صوتی" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "تنظیمات صوتی" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "هدفون‌ها" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "هدست" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "میکروفون" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "تغییر پس‌زمینه…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "تنظیمات نمایشگر" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:265 +msgid "Settings" +msgstr "تنظیمات" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "5" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "۱ش" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "۲ش" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "۳ش" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "۴ش" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "۵ش" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "آ" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "ش" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "ماه قبل" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr "ماه بعد" + +#: js/ui/calendar.js:605 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%Od" + +#: js/ui/calendar.js:660 +msgid "Week %V" +msgstr "هفته %OV" + +#. Translators: Shown in calendar event list for all day events +#. * Keep it short, best if you can use less then 10 characters +#. +#: js/ui/calendar.js:729 +msgctxt "event list time" +msgid "All Day" +msgstr "تمام روز" + +#: js/ui/calendar.js:862 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A %Od %B " + +#: js/ui/calendar.js:866 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A %Od %B %Oy" + +#: js/ui/calendar.js:1086 +msgid "No Notifications" +msgstr "بدون اعلان" + +#: js/ui/calendar.js:1089 +msgid "No Events" +msgstr "بدون رویداد" + +#: js/ui/calendar.js:1117 +msgid "Clear All" +msgstr "پاک‌سازی همه" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» پاسخگو نیست." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the application " +"to quit entirely." +msgstr "" +"ممکن است بخواهید مدت کوتاهی منتظر بمانید تا ادامه دهد یا برنامه را مجبور به خروج " +"کامل کنید." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "خروج اجباری" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "انتظار" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "دیسک‌گردان خارجی متصل شد" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "دیسک‌گردان خارجی قطع شد" + +#: js/ui/components/autorunManager.js:358 +#, javascript-format +msgid "Open with %s" +msgstr "باز کردن با %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "گذرواژه:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "تلاش مجدد:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261 +#: js/ui/status/network.js:355 js/ui/status/network.js:939 +msgid "Connect" +msgstr "اتصال" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "گذرواژه: " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "کلید: " + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "شناسه: " + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "گذرواژه کلید خصوصی: " + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "سرویس: " + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638 +msgid "Authentication required by wireless network" +msgstr "تایید هویت برای شبکه بی‌سیم لازم است" + +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network “%s”." +msgstr "گذرواژه یا کلیدهای رمزنگاری برای دسترسی به شبکه «%s» لازم است." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "تایید هویت 802.1X سیمی" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "نام شبکه: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "تایید هویت DSL" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "کد پین لازم است" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653 +msgid "PIN code is needed for the mobile broadband device" +msgstr "کد پین برای دستگاه پهن‌باند تلفن‌همراه لازم است" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "پین: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659 +msgid "Mobile broadband network password" +msgstr "گذرواژه شبکه پهن‌باند تلفن همراه" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643 +#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "برای اتصال به «%s» گذرواژه لازم است." + +#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720 +msgid "Network Manager" +msgstr "مدیریت شبکه" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "تایید هویت لازم است" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "مدیر" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "تایید هویت" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "متاسفیم، تاثیری نداشت! لطفاً دوباره تلاش کنید." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "‏%s با عنوان %s شناخته می‌شود" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "پنجره‌‌ها" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +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 +msgid "Dash" +msgstr "دَش" + +#. 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 +msgid "%B %e %Y" +msgstr "%Od %B %OY" + +#. Translators: This is the accessible name of the date button shown +#. * 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 +msgid "%A %B %e %Y" +msgstr "%A %Od %B %OY" + +#: js/ui/dateMenu.js:144 +msgid "Add world clocks…" +msgstr "اضافه کردن ساعت‌های جهانی…" + +#: js/ui/dateMenu.js:145 +msgid "World Clocks" +msgstr "ساعت‌های جهانی" + +#: js/ui/dateMenu.js:224 +msgid "Weather" +msgstr "آب‌وهوا" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:286 +#, javascript-format +msgid "%s all day." +msgstr "کل روز %s." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:292 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s سپس %s بعد." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:298 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s، بعد %s، در ادامه %s بعد." + +#: js/ui/dateMenu.js:309 +msgid "Select a location…" +msgstr "موقعیتی را برگزینید…" + +#: js/ui/dateMenu.js:312 +msgid "Loading…" +msgstr "در حال بار کردن…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:318 +#, javascript-format +msgid "Feels like %s." +msgstr "حسی شبیه به %s." + +#: js/ui/dateMenu.js:321 +msgid "Go online for weather information" +msgstr "برای اطّلاعات آب‌وهوا برخط شوید" + +#: js/ui/dateMenu.js:323 +msgid "Weather information is currently unavailable" +msgstr "اطّلاعات آب‌وهو در حال حاضر موجود نیست" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "خروج از %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "خروج از سیستم" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "‏%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد." +msgstr[1] "‏%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "شما پس از %Id ثانیه به طور خودکار از سیستم خارج می‌شوید." +msgstr[1] "شما پس از %Id ثانیه به طور خودکار از سیستم خارج می‌شوید." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "خروج" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "خاموش کردن" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "نصب بروزرسانی‌ها و خاموش کردن" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "سیستم پس از %Id ثانیه به طور خودکار خاموش می‌شود." +msgstr[1] "سیستم پس از %Id ثانیه به طور خودکار خاموش می‌شود." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "نصب به‌روز رسانی‌هایِ در انتظار" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "راه‌اندازی مجدد" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "خاموش کردن" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "راه‌اندازی مجدد" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "سیستم پس از %Id ثانیه به طور خودکار مجددا راه‌اندازی می‌شود." +msgstr[1] "سیستم پس از %Id ثانیه به طور خودکار مجددا راه‌اندازی می‌شود." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "راه‌اندازی مجدد و نصب بروزرسانی‌ها" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"سیستم پس از %Id ثانیه به طور خودکار مجددا راه‌اندازی می‌شود و بروزرسانی‌های را نصب " +"می‌کند." +msgstr[1] "" +"سیستم پس از %Id ثانیه به طور خودکار مجددا راه‌اندازی می‌شود و بروزرسانی‌های را نصب " +"می‌کند." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "راه‌اندازی دوباره و نصب" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "نصب و خاموش کردن" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "خاموش کردن بعد از نصب به‌روز رسانی‌ها" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "راه‌اندازی مجدد و نصب بروزرسانی‌ها" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"پس از راه‌اندازی دوباره %s %s نصب خواهد شد. نصب ارتقا ممکن است زمان زیادی بطول " +"بکشد: مطمئن شوید که پشتیبان دارید و رایانه به برق متصل است." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"درحال اجرا بر روی انرژی باتری: لطفا قبل از نصب بروزرسانی‌ها، به برق وصل کنید." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "تعدادی از برنامه‌ها مشغول هستند یا کارهای ذخیره نشده دارند." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "کاربران دیگر وارد سیستم هستند." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (دوردست)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (پایانه)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "نصب" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "بارگیری و نصب «%s» از extensions.gnome.org؟" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s می‌خواهد جلوی میان‌برها را بگیرد" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "برنامه می‌خواهد جلوی میان‌برها را بگیرد" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "می‌توانید با فشردن %s میان‌برها را برگردانید." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "رد کردن" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "اجازه دادن" + +#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "صفحه‌کلید" + +#: js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "هیچ افزونه‌ای نصب نشده است" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "افزونه %s هیچ خطایی منتشر نکرده است." + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "مخفی کردن خطاها" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "نمایش خطاها" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "به کار انداختن" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "از کار انداختن" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "خطا" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "قدیمی" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "در حال بارگیری" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "نمایش منبع" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "صفحه‌ی وب" + +#: js/ui/messageTray.js:1493 +msgid "System Information" +msgstr "اطلاعات سیستم" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "هنرمند ناشناس" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "عنوان ناشناس" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "برگردان" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "نمای‌کلی" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "برای جستجو تایپ کنید…" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "میان‌بر جدید…" + +#: js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "تعریف شده در برنامه" + +#: js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "نمایش راهنمای روی صفحه" + +#: js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "تعویض نمایشگر" + +#: js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "تخصیص دنبالهٔ کلید" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "انجام شد" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "ویرایش…" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "هیچ‌کدام" + +#: js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "برای پیکربندی، کلیدی را بزنید" + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "برای خروج esc را بزنید" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "برای خروج، هر کلیدی را بزنید" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "خروج" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "فعالیت‌ها" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "سیستم" + +#: js/ui/panel.js:812 +msgid "Top Bar" +msgstr "نوار بالا" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "یک فرمان وارد کنید" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "بستن" + +#: js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "راه‌اندازی مجدد در Wayland موجود نیست" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "درحال راه‌اندازی مجدد…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A، %Od %B" + +#: js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%Id پیام جدید" +msgstr[1] "%Id پیام جدید" + +#: js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%Id اعلان جدید" +msgstr[1] "%Id اعلان جدید" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:284 +msgid "Lock" +msgstr "قفل کردن" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "لازم است گنوم صفحه را قفل کند" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr "نمی‌توان قفل کرد" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 +msgid "Lock was blocked by an application" +msgstr "قفل توسط یک برنامه مسدود شده بود" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "درحال حستجو…" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "بدون نتیجه." + +#: js/ui/search.js:777 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%Id بیش‌تر" +msgstr[1] "%Id بیش‌تر" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "رونوشت" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "چسباندن" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "نمایش متن" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "مخفی‌کردن متن" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "گذرواژه" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "به‌خاطر سپردن گذرواژه" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "دسترسی‌پذیری" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "بزرگنمایی" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "صفحه‌نمایش خوان" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "صفحه‌کلید مجازی" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "هشدارهای نمایشی" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "کلیدهای چسبان" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "کلیدهای آرام" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "کلیدهای پرشی" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "کلیدهای موشی" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "کنتراست بالا" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "متن درشت" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "بلوتوث" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627 +msgid "Bluetooth Settings" +msgstr "تنظیمات بلوتوث" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%Id متصل شد" +msgstr[1] "%Id متصل شد" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "خاموش" + +#: js/ui/status/bluetooth.js:140 +msgid "On" +msgstr "روشن" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299 +msgid "Turn On" +msgstr "روشن کردن" + +#: 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 "خاموش کردن" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "روشنایی" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "نمایش چیدمان صفحه‌کلید" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "مکان فعال شد" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "از کار انداختن" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "تنظیمات حریم‌خصوصی" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "مکان در حال استفاده است" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "مکان غیرفعال شد" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "به کار انداختن" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "دادن دسترسی به %s برای دانستن مکان شما؟" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "دسترسی به مکان در هر زمانی می‌تواند از طریق تنظیمات حریم‌خصوصی تغییر کند." + +#: js/ui/status/network.js:104 +msgid "" +msgstr "<ناشناخته>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 js/ui/status/network.js:1328 +#, javascript-format +msgid "%s Off" +msgstr "%s خاموش است" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:457 +#, javascript-format +msgid "%s Connected" +msgstr "%s متصل شد" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:462 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s مدیریت نشده" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:465 +#, javascript-format +msgid "%s Disconnecting" +msgstr "درحال قطع ارتباط %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:472 js/ui/status/network.js:1320 +#, javascript-format +msgid "%s Connecting" +msgstr "درحال اتصال %s" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:475 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s نیاز به تایید هویت دارد" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:483 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "میان‌افزار برای %s موجود نیست" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:487 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s در دسترس نیست" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:490 +#, javascript-format +msgid "%s Connection Failed" +msgstr "اتصال %s شکست خورد" + +#: js/ui/status/network.js:506 +msgid "Wired Settings" +msgstr "تنظیمات اتصال سیمی" + +#: js/ui/status/network.js:548 +msgid "Mobile Broadband Settings" +msgstr "تنظیمات پهن‌باند همراه" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:591 js/ui/status/network.js:1325 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "سخت‌افزار %s غیرفعال شد" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:595 +#, javascript-format +msgid "%s Disabled" +msgstr "%s غیرفعال شد" + +#: js/ui/status/network.js:635 +msgid "Connect to Internet" +msgstr "اتصال به اینترنت" + +#: js/ui/status/network.js:833 +msgid "Airplane Mode is On" +msgstr "حالت هواپیمایی روشن است" + +#: js/ui/status/network.js:834 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "در زمان روشن بودن حالت هواپیمایی وای-فای غیرفعال می‌شود." + +#: js/ui/status/network.js:835 +msgid "Turn Off Airplane Mode" +msgstr "خاموش کردن حالت هواپیمایی" + +#: js/ui/status/network.js:844 +msgid "Wi-Fi is Off" +msgstr "بی‌سیم خاموش است" + +#: js/ui/status/network.js:845 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "برای اتصال به شبکه باید وای-فای روشن شود." + +#: js/ui/status/network.js:846 +msgid "Turn On Wi-Fi" +msgstr "روشن کردن بی‌سیم" + +#: js/ui/status/network.js:871 +msgid "Wi-Fi Networks" +msgstr "شبکه‌های وای-فای" + +#: js/ui/status/network.js:873 +msgid "Select a network" +msgstr "یک شبکه انتخاب کنید" + +#: js/ui/status/network.js:903 +msgid "No Networks" +msgstr "هیچ شبکه‌ای نیست" + +#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "برای خاموش کردن از کلید سخت‌افزاری استفاده کنید" + +#: js/ui/status/network.js:1191 +msgid "Select Network" +msgstr "انتخاب شبکه" + +#: js/ui/status/network.js:1197 +msgid "Wi-Fi Settings" +msgstr "تنظیمات بی‌سیم" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1316 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s کانون فعال" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1331 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s متصل نشد" + +#: js/ui/status/network.js:1435 +msgid "connecting…" +msgstr "درحال اتّصال…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1438 +msgid "authentication required" +msgstr "تایید هویت لازم است" + +#: js/ui/status/network.js:1440 +msgid "connection failed" +msgstr "اتصال شکست خورد" + +#: js/ui/status/network.js:1494 +msgid "VPN Settings" +msgstr "تنظیمات VPN" + +#: js/ui/status/network.js:1498 +msgid "VPN" +msgstr "وی‌پی‌ان" + +#: js/ui/status/network.js:1508 +msgid "VPN Off" +msgstr "وی‌پی‌ان خاموش است" + +#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "تنظیمات شبکه" + +#: js/ui/status/network.js:1603 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "اتّصال سیمی %s" +msgstr[1] "اتّصال سیمی %s" + +#: js/ui/status/network.js:1607 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "اتّصال وای‌فای %s" +msgstr[1] "اتّصال وای‌فای %s" + +#: js/ui/status/network.js:1611 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "اتّصال مودم %s" +msgstr[1] "اتّصال مودم %s" + +#: js/ui/status/network.js:1759 +msgid "Connection failed" +msgstr "اتصال شکست خورد" + +#: js/ui/status/network.js:1760 +msgid "Activation of network connection failed" +msgstr "فعال‌سازی اتصال شبکه شکست خورد" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "نور شب غیرفعّال است" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "نور شب روشن" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "از سر گیری" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "غیرفعّال تا فردا" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "تنظیمات انرژی" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "کاملا شارژ شده" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "درحال برآورد…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%Id∶%I02d باقی‌مانده (%Id %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%Id∶%I02d تا شارژ کامل (%Id %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%Id %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "حالت هواپیمایی روشن است" + +#: js/ui/status/system.js:228 +msgid "Switch User" +msgstr "تعویض کاربر" + +#: js/ui/status/system.js:240 +msgid "Log Out" +msgstr "خروج از سیستم" + +#: js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "تنظیمات حساب" + +#: js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "قفل جهت" + +#: js/ui/status/system.js:295 +msgid "Suspend" +msgstr "تعلیق" + +#: js/ui/status/system.js:305 +msgid "Power Off" +msgstr "خاموش کردن" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "بلندی صدا تغییر کرد" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "بلندی صدا" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "آینه" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "پیوند نمایشگرها" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "فقط خارجی" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "فقط داخلی" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "ورود به سیستم بعنوان کاربری دیگر" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "بازکردن قفل پنجره" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "برنامه‌ها" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "جستجو" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» آماده است" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "آیا می‌خواهید تنظیمات تصویر را نگاه دارید؟" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "بازنشانی تنظیمات" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "ذخیره تغییرات" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "تغییرات تنظیمات در %Id ثانیه بازنشانی می‌شود" +msgstr[1] "تغییرات تنظیمات در %Id ثانیه بازنشانی می‌شود" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%Id × %Id" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "حداقل کردن" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "ناحداکثر کردن" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "حداکثر کردن" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "جابجایی" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "تغییر اندازه" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "جابجایی نوار عنوان روی صفحه‌نمایش" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "همیشه در بالا" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "همیشه بر روی فضای کاری درحال نمایش" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "انتقال به فضای کاری چپ" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "انتقال به فضای کاری راست" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "انتقال به فضای کاری بالا" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "انتقال به فضای کاری پایین" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "انتقال به نمایشگر بالا" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "انتقال به نمایشگر پایین" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "انتقال به نمایشگر سمت چپ" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "انتقال به نمایشگر سمت راست" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "تقویم اوولوشن" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:380 +msgid "Print version" +msgstr "چاپ نسخه" + +#: src/main.c:386 +msgid "Mode used by GDM for login screen" +msgstr "حالت استفاده شده توسط GDM برای صفحه ورود به سیستم" + +#: src/main.c:392 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "استفاده از یک حالت مشخص، مثلاً gdm برای صفحهٔ ورود" + +#: src/main.c:398 +msgid "List possible modes" +msgstr "فهرست کردن حالت‌های ممکن" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "ناشناس" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "راه‌اندازی «%s» شکست خورد" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "گذرواژه‌های منطبق نیستند." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "گذرواژه نمی‌تواند خالی باشد" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "محاوره تایید هویت از طرف کاربر رد شد" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%Iu خروجی" +msgstr[1] "%Iu خروجی" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%Iu ورودی" +msgstr[1] "%Iu ورودی" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "صداهای سیستم" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "ترجیحات افزونه‌های گنوم‌شل" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "تغییر مسیر برای تایید هویت وب" + +#~ msgid "Events" +#~ msgstr "رویدادها" + +#~ msgid "Notifications" +#~ msgstr "اعلان‌ها" + +#~ msgid "Hide tray" +#~ msgstr "مخفی‌کردن سینی" + +#~ msgid "Status Icons" +#~ msgstr "شمایل‌های وضعیت" + +#~ msgid "Clear section" +#~ msgstr "پاک کردن قسمت" + +#~ msgid "Media" +#~ msgstr "رسانه" + +#~ msgid "Not In Use" +#~ msgstr "در حال استفاده نیست" + +#~ msgid "%d x %d" +#~ msgstr "%Id x %Id" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "نمایش هفته در تقویم" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "در صورت تنظیم بر روی «درست»، تاریخ هفتگی ایزو را در تقویم نشان می‌دهد." + +#~ msgid "Use as Internet connection" +#~ msgstr "استفاده به عنوان اتصال اینترنت" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "گنوم‌شل (چینشگر wayland)" + +#~ msgid "Show the message tray" +#~ msgstr "نمایش سینی پیام" + +#~ msgid "Captive Portal" +#~ msgstr "پرتال درگیر" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%OH∶%OM" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%Ol∶%OM %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "۱ش" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "۲ش" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "۳ش" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "۴ش" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "۵ش" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "ج" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "ش" + +#~ msgid "Nothing Scheduled" +#~ msgstr "بدون برنامه‌ریزی" + +#~ msgid "Today" +#~ msgstr "امروز" + +#~ msgid "Tomorrow" +#~ msgstr "فردا" + +#~ msgid "This week" +#~ msgstr "این هفته" + +#~ msgid "Next week" +#~ msgstr "هفته آینده" + +#~ msgid "Removable Devices" +#~ msgstr "دستگاه‌های جدا شدنی" + +#~ msgid "Eject" +#~ msgstr "بیرون دادن" + +#~ msgid "Invitation" +#~ msgstr "دعوتنامه" + +#~ msgid "Call" +#~ msgstr "تماس" + +#~ msgid "File Transfer" +#~ msgstr "انتقال پرونده" + +#~ msgid "Chat" +#~ msgstr "گپ" + +#~ msgid "Unmute" +#~ msgstr "باصدا" + +#~ msgid "Mute" +#~ msgstr "بی‌صدا" + +#~ msgid "Invitation to %s" +#~ msgstr "دعوتنامه به %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "‏%s از شما دعوت می‌کند که به %s بپیوندید" + +#~ msgid "Decline" +#~ msgstr "رد کردن" + +#~ msgid "Accept" +#~ msgstr "پذیرفتن" + +#~ msgid "Video call from %s" +#~ msgstr "تماس ویدئویی از طریق %s" + +#~ msgid "Call from %s" +#~ msgstr "تماس از طرف %s" + +#~ msgid "Answer" +#~ msgstr "پاسخگویی" + +#~ msgid "%s is sending you %s" +#~ msgstr "‏%s در حال ارسال %s به شما است" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "‏%s اجازه دسترسی برای دیدن زمان‌هایی که شما برخط هستید را دارد" + +#~ msgid "Authentication failed" +#~ msgstr "تایید هویت شکست خورد" + +#~ msgid "Encryption error" +#~ msgstr "خطا رمزنگاری" + +#~ msgid "Certificate not provided" +#~ msgstr "گواهینامه ارائه نشده" + +#~ msgid "Certificate untrusted" +#~ msgstr "گواهینامه نامعتبر است" + +#~ msgid "Certificate expired" +#~ msgstr "گواهینامه منقضی شده" + +#~ msgid "Certificate not activated" +#~ msgstr "گواهینامه فعال نشده" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "نام کارگزار گواهینامه نامنطبق است" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "اثرانگشت گواهینامه نامنطبق است" + +#~ msgid "Certificate self-signed" +#~ msgstr "گواهینامه خود-امضا شده" + +#~ msgid "Status is set to offline" +#~ msgstr "وضعیت بر روی برون خط تنظیم شده" + +#~ msgid "Certificate is invalid" +#~ msgstr "گواهینامه نامعتبر است" + +#~ msgid "Connection has been refused" +#~ msgstr "اتصال رد شده است" + +#~ msgid "Connection can't be established" +#~ msgstr "اتصال نمی‌تواند برقرار شود" + +#~ msgid "Connection has been lost" +#~ msgstr "اتصال از دست رفته است" + +#~ msgid "This account is already connected to the server" +#~ msgstr "این حساب قبلا به کارگزار متصل شده است" + +#~ msgid "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "اتصال توسط یک اتصال جدید که از منبع مشابه استفاده می‌کند، جایگزین شده است" + +#~ msgid "The account already exists on the server" +#~ msgstr "حساب از قبل بر روی کارگزار وجود دارد" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "کارگزار در حال حاضر برای دست گرفتن اتصال بسیار مشغول است" + +#~ msgid "Certificate has been revoked" +#~ msgstr "گواهینامه لغو شده است" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "گواهینامه از الگوریتم رمزی نامطمئنی استفاده می‌کند یا از نظر cryptography ضعیف " +#~ "است" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server certificate " +#~ "chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "اندازه گواهینامه کارگزار، یا عمق حلقه‌ی گواهینامه کارگزار، از محدودیت اعمال " +#~ "شده توسط کتابخانه cryptography تجاوز کرد" + +#~ msgid "Internal error" +#~ msgstr "خطای داخلی" + +#~ msgid "Unable to connect to %s" +#~ msgstr "نمی‌توان به %s متصل شد" + +#~ msgid "View account" +#~ msgstr "نمایش حساب" + +#~ msgid "Open Calendar" +#~ msgstr "بازکردن تقویم" + +#~ msgid "Date & Time Settings" +#~ msgstr "تنظیمات تاریخ و ساعت" + +#~ msgid "Open" +#~ msgstr "بازکردن" + +#~ msgid "Remove" +#~ msgstr "حذف" + +#~ msgid "Clear Messages" +#~ msgstr "پاک کردن پیام‌ها" + +#~ msgid "Notification Settings" +#~ msgstr "تنظیمات اعلان‌ها" + +#~ msgid "Tray Menu" +#~ msgstr "منو سینی" + +#~ msgid "No Messages" +#~ msgstr "پیامی وجود ندارد" + +#~ msgid "Message Tray" +#~ msgstr "سینی پیام" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%Id دستگاه متصل شد" +#~ msgstr[1] "%Id دستگاه متصل شد" + +#~ msgid "Authentication required" +#~ msgstr "تایید هویت لازم است" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "باتری" + +#~ msgid "Airplane Mode" +#~ msgstr "حالت هواپیمایی" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "فهرست دسته‌هایی که باید به شکل پوشه نمایش داده شوند" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "هر نام دسته در این فهرست، بجای اینکه پشت سر هم در نمای اصلی نمایش داده شود، " +#~ "به‌عنوان پوشه در نمای برنامه‌ها نشان داده می‌شود." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "چیدمان دکمه‌ها در نوار عنوان" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when running " +#~ "GNOME Shell." +#~ msgstr "" +#~ "این کلید، کلید org.gnome.desktop.wm.preferences را در زمان اجرای گنوم‌شل " +#~ "بازنویسی می‌کند." + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "با استفاده از جعبه‌ی بالا یک افزونه برای پیکربندی انتخاب کنید." + +#~ msgid "calendar:MY" +#~ msgstr "تقویم:من" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A، %OH:%OM" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %Od، %OH:%OM" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %Od %y, %OH:%OM " + +#~ msgid "Authorization request from %s" +#~ msgstr "درخواست تایید هویت از %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "دستگاه %s می‌خواهد با این رایانه جفت شود" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "دستگاه %s می‌خواهد به سرویس «%s» دسترسی داشته باشد" + +#~ msgid "Grant this time only" +#~ msgstr "موافقت تنها در همین زمان" + +#~ msgid "Reject" +#~ msgstr "رد کردن" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "تایید جهت جفت‌شدن با %s" + +#~ msgid "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "لطفا تایید کنید که آیا کلید عبور مربوط به «%I06d» با همتای آن در دستگاه " +#~ "مطابقت دارد یا خیر." + +#~ msgid "Matches" +#~ msgstr "منطبق شد" + +#~ msgid "Does not match" +#~ msgstr "منطبق نیست" + +#~ msgid "Pairing request for %s" +#~ msgstr "درخواست جفت‌شدن برای %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "لطفا PIN ذکر شده در دستگاه را وارد کنید." + +#~ msgid "OK" +#~ msgstr "تایید" + +#~ msgid "unavailable" +#~ msgstr "خارج از دسترس" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "شرمنده، هیچ تعبیری امروز برای شما وجود ندارد:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "‏%s پیشگو می‌گوید" + +#~ msgid "Screenshots" +#~ msgstr "عکس‌های صفحه" + +#~ msgid "Record a screencast" +#~ msgstr "ضبط یک تصویربرداری از صفحه‌نمایش" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "" +#~ "اینکه اطلاعات برنامه‌ها درباره‌ی میزان استفاده از منابع جمع‌آوری شود یا خیر" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the most " +#~ "used ones (e.g. in launchers). While this data will be kept private, you may " +#~ "want to disable this for privacy reasons. Please note that doing so won't " +#~ "remove already saved data." +#~ msgstr "" +#~ "پوسته گنوم در حالت عادی برنامه‌های فعال را جهت ارائه برنامه‌های بیشتر استفاده " +#~ "شده پایش می کند. (برای مثال در اجرا کننده‌ها). با اینکه که این اطلاعات به صورت " +#~ "خصوصی نگاه‌داری می‌شود، ممکن است شما بخواهید این امکان را به دلایل امنیتی " +#~ "غیرفعال کنید. لطفا توجه کنید این کار باعث پاک شدن اطلاعاتی که تاکنون ذخیره " +#~ "شده‌اند نمی‌شود." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. The " +#~ "value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "به‌طور داخلی جهت ذخیره‌ی آخرین وضعیتِ حاضرِ ثبت شده‌ی توسط کاربر استفاده می‌شود. " +#~ "مقدار اینجا از محل محاسبه‌ی TpConnectionPresenceType است." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. The " +#~ "value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "به‌طور داخلی برای ذخیره آخرین نشستی که کاربر در آن وضعیت حاضر داشته است " +#~ "استفاده می‌شود. مقدار اینجا از محاسبه GsmPresenceStatus است." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "کلید مقید برای تغییر وضعیت ضبط کننده‌ی صفحه" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "کلید مقید برای شروع/توقف ضبط کننده‌ی صفحه پیش ساخته." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "سرعت فریم استفاده شده در تصویربرداری از صفحه‌نمایش." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "سرعت فریم حاصل از تصویربرداری از صفحه نمایش با استفاده از ضبط کننده نمایشگر " +#~ "پوسته‌ی گنوم بر اساس فریم بر ثانیه" + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "مجرای ارتباطی gstreamer برای کدگذاری تصویربرداری از صفحه نمایش" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +#~ "used for gst-launch. The pipeline should have an unconnected sink pad where " +#~ "the recorded video is recorded. It will normally have a unconnected source " +#~ "pad; output from that pad will be written into the output file. However the " +#~ "pipeline can also take care of its own output - this might be used to send " +#~ "the output to an icecast server via shout2send or similar. When unset or set " +#~ "to an empty value, the default pipeline will be used. This is currently " +#~ "'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=" +#~ "%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as " +#~ "a placeholder for a guess at the optimal thread count on the system." +#~ msgstr "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +#~ "used for gst-launch. The pipeline should have an unconnected sink pad where " +#~ "the recorded video is recorded. It will normally have a unconnected source " +#~ "pad; output from that pad will be written into the output file. However the " +#~ "pipeline can also take care of its own output - this might be used to send " +#~ "the output to an icecast server via shout2send or similar. When unset or set " +#~ "to an empty value, the default pipeline will be used. This is currently " +#~ "'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=" +#~ "%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as " +#~ "a placeholder for a guess at the optimal thread count on the system." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "پسوند پرونده‌ی قابل استفاده برای ذخیره تصویربرداری از صفحه‌نمایش" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on the " +#~ "current date, and use this extension. It should be changed when recording to " +#~ "a different container format." +#~ msgstr "" +#~ "نام پرونده‌ی ضبط شده برای تصویربرداری از صفحه‌نمایش یکتا و براساس تاریخ جاری " +#~ "خواهد بود و از این افزونه استفاده خواهد کرد. اگر در زمان ضبط از قالب دیگری " +#~ "استفاده کنید باید تغییر کند." + +#~ msgid "Extension" +#~ msgstr "افزونه" + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "نشست..." + +#~ msgid "Power" +#~ msgstr "انرژی" + +#~ msgid "Restart" +#~ msgstr "راه‌اندازی مجدد" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%OH\\u2236%OM" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%Ol\\u2236%OM\\u2009%p" + +#~ msgid "Screencast from %d %t" +#~ msgstr "ویدئو صفحه‌نمایش %Id %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "بر روی خروج از سیستم کلیک کنید تا از این برنامه‌ها خارج و از سیستم خارج شوید." + +#~ msgid "Logging out of the system." +#~ msgstr "درحال خروج از سیستم." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "بر روی خاموش کردن کلیک کنید تا از این برنامه‌ها خارج و سیستم خاموش شود." + +#~ msgid "Powering off the system." +#~ msgstr "درحال خاموش کردن سیستم." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "بر روی راه‌اندازی مجدد کلیک کنید تا از این برنامه‌ها خارج و سیستم مجددا " +#~ "راه‌اندازی گردد." + +#~ msgid "Restarting the system." +#~ msgstr "درحال راه‌اندازی مجدد سیستم." + +#~ msgid "Universal Access Settings" +#~ msgstr "تنظیمات دسترسی جامع" + +#~ msgid "Visibility" +#~ msgstr "قابلیت دیدن" + +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "برپاسازی یک دستگاه جدید..." + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "ارسال پرونده‌ها..." + +#~ msgid "Keyboard Settings" +#~ msgstr "تنظیمات صفحه‌کلید" + +#~ msgid "Mouse Settings" +#~ msgstr "تنظیمات موشی" + +#~| msgid "Region and Language Settings" +#~ msgid "Region & Language Settings" +#~ msgstr "تنظیمات ناحیه و زبان" + +#~ msgid "Volume, network, battery" +#~ msgstr "جلد، شبکه، باتری" + +#~ msgid "disabled" +#~ msgstr "از کار افتاد" + +#~ msgid "cable unplugged" +#~ msgstr "کابل قطع شد" + +#~ msgid "More…" +#~ msgstr "بیشتر..." + +#~ msgid "Wired" +#~ msgstr "سیمی" + +#~ msgid "Auto Ethernet" +#~ msgstr "اترنت خودکار" + +#~ msgid "Auto broadband" +#~ msgstr "پهن‌باند خودکار" + +#~ msgid "Auto dial-up" +#~ msgstr "دایال‌آپ خودکار" + +#~ msgid "Auto %s" +#~ msgstr "اتصال بیسیم %s خودکار" + +#~ msgid "Auto bluetooth" +#~ msgstr "بلوتوث خودکار" + +#~ msgid "Auto wireless" +#~ msgstr "بیسیم خودکار" + +#~ msgid "Wi-Fi" +#~ msgstr "وای-فای" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%Id %s %Id %s باقی‌مانده" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ساعت" +#~ msgstr[1] "ساعت" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "%Id دقیقه‌" +#~ msgstr[1] "%Id دقیقه‌" + +#~| msgid "AC adapter" +#~ msgid "AC Adapter" +#~ msgstr "آداپتور برق مستقیم" + +#~| msgid "Laptop battery" +#~ msgid "Laptop Battery" +#~ msgstr "باتری لپ‌تاپ" + +#~ msgid "Monitor" +#~ msgstr "صفحه نمایش" + +#~ msgid "Mouse" +#~ msgstr "موشی" + +#~ msgid "PDA" +#~ msgstr "دستیار دیجیتال شخصی" + +#~| msgid "Cell phone" +#~ msgid "Cell Phone" +#~ msgstr "تلفن سلولی" + +#~| msgid "Media player" +#~ msgid "Media Player" +#~ msgstr "پخش‌کننده‌ی رسانه" + +#~ msgid "Tablet" +#~ msgstr "لوح‌رایانه" + +#~ msgid "Computer" +#~ msgstr "رایانه" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "ناشناس" + +#~ msgid "Available" +#~ msgstr "در دسترس" + +#~ msgid "Busy" +#~ msgstr "مشغول" + +#~ msgid "Invisible" +#~ msgstr "نامرئی" + +#~ msgid "Away" +#~ msgstr "غائب" + +#~ msgid "Idle" +#~ msgstr "بی‌کار" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "وضعیت گپ شما «مشغول» تنظیم می‌شود" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online status " +#~ "has been adjusted to let others know that you might not see their messages." +#~ msgstr "" +#~ "هم‌اکنون اعلان‌ها، از جمله پیام‌های گپ، غیرفعال هستند. وضعیتِ برخطِ شما به گونه‌ای " +#~ "تنظیم شده است که به دیگران نشان دهد ممکن است شما پیام‌هایشان را نبینید." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "خاموش‌کردن ممکن است باعث شود که کارهای ذخیره نشده خود را از دست بدهند." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "ورود" + +#~ msgid "APPLICATIONS" +#~ msgstr "برنامه‌ها" + +#~ msgid "SETTINGS" +#~ msgstr "تنظیمات" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%OH:%OM" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%OI:%OM" + +#~ msgid "Subscription request" +#~ msgstr "درخواست اشتراک" + +#~ msgid "Sent at %X on %A" +#~ msgstr "ارسال در %OH:%OM در %A" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "ارسال در %A, %B %d, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "اتصال به %s شکست خورد" + +#~ msgid "Reconnect" +#~ msgstr "اتصال مجدد" + +#~ msgid "tray" +#~ msgstr "سینی" + +#~ msgid "Browse Files..." +#~ msgstr "مرور پرونده‌ها..." + +#~ msgid "Error browsing device" +#~ msgstr "خطا در مرور دستگاه" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "دستگاه درخواست شده قابلیت مرور ندارد، خطا: «%s»" + +#~ msgid "More..." +#~ msgstr "بیشتر..." + +#~ msgid "Wireless" +#~ msgstr "بیسیم" + +#~ msgid "VPN Connections" +#~ msgstr "اتصال‌های وی‌پی‌ان" + +#~ msgid "System Settings" +#~ msgstr "تنظیمات سیستم" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "تخم‌مرغ شانسی مورد علاقه شما" + +#~ msgid "United Kingdom" +#~ msgstr "بریتانیا" + +#~ msgid "Default" +#~ msgstr "پیش‌فرض" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "غیرفعال کردنِ تامین‌کننده‌گان OpenSearch" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "عدم توانایی در پیاده کردن «%s»" + +#~ msgid "Retry" +#~ msgstr "سعی مجدد" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "محل‌ها و ابزارها" + +#~ msgid "Home" +#~ msgstr "خانه" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "اتصال به..." + +#~ msgid "Passphrase" +#~ msgstr "عبارت‌عبور" + +#~ msgid "Show time with seconds" +#~ msgstr "نمایش ساعت همراه با ثانیه" + +#~ msgid "If true, display seconds in time." +#~ msgstr "در صورت تنظیم بر روی «درست»، ثانیه‌ها را در ساعت نشان می‌دهد." + +#~ msgid "Show date in clock" +#~ msgstr "نمایش تاریخ در ساعت" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "اگر روی «درست» تنظیم شود، تاریخ را در کنار ساعت نشان می‌دهد." + +#~ msgid "CONTACTS" +#~ msgstr "CONTACTS" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %Od %b %OH:%OM:%OS" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %Od %b %OH:%OM" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %OH:%OM:%OS" + +#~ msgid "%a %R" +#~ msgstr "%a %OH:%OM" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a Od% %b %OH:%OM:%OS" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %OH:%OM:%OS" + +#~ msgid "Wrong password, please try again" +#~ msgstr "گذرواژه‌ی نادرست، لطفا دوباره تلاش کنید" + +#~ msgid "%s is online." +#~ msgstr "‏%s بر خط است." + +#~ msgid "%s is offline." +#~ msgstr "‏%s برون خط است." + +#~ msgid "%s is away." +#~ msgstr "‏%s غایب است." + +#~ msgid "%s is busy." +#~ msgstr "‏%s مشغول است." + +#~ msgid "Hidden" +#~ msgstr "نامرئی" + +#~ msgid "Power Off..." +#~ msgstr "خاموش کردن..." + +#~ msgid "Online Accounts" +#~ msgstr "حساب‌های برخط" + +#~ msgid "Log Out..." +#~ msgstr "خروج از سیستم..." + +#~ msgid "RECENT ITEMS" +#~ msgstr "موارد اخیر" + +#~ msgid "Home Folder" +#~ msgstr "پوشه‌ی آغازه" + +#~ msgid "Show password" +#~ msgstr "نمایش گذرواژه" + +#~ msgid "If true, display onscreen keyboard." +#~ msgstr "در صورت تنظیم بر روی «درست»، صفحه‌کلید مجازی نمایش داده می‌شود." + +#~ msgid "%s has finished starting" +#~ msgstr "راه‌اندازی %s پایان یافته است" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..df6bbbf --- /dev/null +++ b/po/fi.po @@ -0,0 +1,3103 @@ +# gnome-shell Finnish translation +# Copyright (C) 2009-2011 Timo Jyrinki +# This file is distributed under the same license as the gnome-shell package. +# +# IMPORTANT NOTICE! +# +# Some date / time strings are currently non-optimal. The optimal CLDR +# compliant versions are included as comments in the respective strings. +# +# CLDR: http://kotoistus.fi/suositukset/vahv_kalenterit_cldr1_4.htm +# +# They should be taken into use as soon as the related bugs are fixed: +# https://bugzilla.gnome.org/show_bug.cgi?id=647320 +# https://bugzilla.gnome.org/show_bug.cgi?id=648678 +# +# Gnome 2012-03 Finnish translation sprint participants: +# Helsingforce +# Niklas Laxström +# Timo Jyrinki , 2009-2011. +# Marko Myllynen , 2011. +# Ville-Pekka Vainio , 2011. +# Jiri Grönroos , 2012, 2013, 2014, 2015, 2016, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-05 11:40+0000\n" +"PO-Revision-Date: 2019-02-09 20:55+0200\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: suomi \n" +"Language: fi\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.6\n" +"X-DamnedLies-Scope: partial\n" +"X-Project-Style: gnome\n" +"X-POT-Import-Date: 2012-03-05 15:06:10+0000\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Järjestelmä" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Näytä ilmoitusluettelo" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Kohdista aktiiviseen ilmoitukseen" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Näytä yleisnäkymä" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Näytä kaikki sovellukset" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Avaa sovellusvalikko" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:221 +msgid "Shell Extensions" +msgstr "Shell-laajennukset" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Hallitse Gnome Shell -laajennuksia" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Gnome Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Ikkunanhallinta ja sovelluksien käynnistäminen" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Ota käyttöön sisäiset kehittäjiä ja testaajia hyödyttävät työkalut Alt-F2:sta" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Salli pääsy sisäiseen vianselvitys- ja monitorointityökaluun Alt-F2-ikkunan " +"kautta." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Käyttöön otettavien laajennusten UUID:t" + +#: data/org.gnome.shell.gschema.xml.in:17 +#, fuzzy +#| msgid "" +#| "GNOME Shell extensions have a uuid property; this key lists extensions " +#| "which should be loaded. Any extension that wants to be loaded needs to be " +#| "in this list. You can also manipulate this list with the EnableExtension " +#| "and DisableExtension DBus methods on org.gnome.Shell." +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOMEn ikkunanhallinnan laajennuksilla on uuid-tunnisteominaisuus, ja tämä " +"avain luettelee laajennukset, jotka ladataan. Niiden laajennosten, jotka " +"halutaan ladata, on oltava tässä luettelossa. Tätä luetteloa voi muokata " +"myös org.gnome.Shell-DBus-metodeilla EnableExtension ja DisableExtension." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Poista käytöstä käyttäjälaajennukset" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Poistaa käytöstä laajennusten versioyhteensopivuuden tarkistuksen" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Gnome Shell lataa vain ne laajennukset, jotka väittävät tukevan käytössä " +"olevaa Shell-versiota. Tämä valinta poistaa tarkistuksen käytöstä ja yrittää " +"ladata kaikki laajennukset siitä huolimatta, mitä versiota laajennukset " +"väittävät tukevansa." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Luettelo työpöytätiedostojen tunnisteista lempisovelluksille" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "Näitä tunnisteita vastaavat sovellukset näytetään suosikkien alueella." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historia komentoikkunalle (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historia näyttölasi-ikkunalle" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Näytä aina “Kirjaudu ulos”-toiminto käyttäjävalikossa." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Tämä avain ohittaa “Kirjaudu ulos”-valikkokohdan automaattisen piilotuksen " +"\"yksi käyttäjä, yksi istunto\"-tilanteissa." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Muistetaanko salattujen tai etätiedostojärjestelmien liittämiseen tarvittava " +"salasana" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Shell pyytää salasanaa, kun salattu laite tai etätiedostojärjestelmä " +"liitetään. Jos salasana voidaan tallentaa tulevaa käyttöä varten, “Muista " +"salasana”-valintaruutu näytetään. Tämä avain asettaa valintaruudun " +"oletustilan." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Sovellusvalikon avaukseen käytettävä pikanäppäin" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Sovellusvalikon avaukseen käytettävä pikanäppäin." + +#: data/org.gnome.shell.gschema.xml.in:116 +#, fuzzy +#| msgid "Keybinding to open the \"Show Applications\" view" +msgid "Keybinding to open the “Show Applications” view" +msgstr "Näytä sovellukset -näkymän avaukseen käytettävä pikanäppäin" + +#: data/org.gnome.shell.gschema.xml.in:117 +#, fuzzy +#| msgid "" +#| "Keybinding to open the \"Show Applications\" view of the Activities " +#| "Overview." +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Yleisnäkymän Näytä sovellukset -näkymän avaukseen käytettävä pikanäppäin." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Yleisnäkymän avaukseen käytettävä pikanäppäin" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Yleisnäkymän avaukseen käytettävä pikanäppäin." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Ilmoitusalueen näyttämiseen/piilottamiseen tarkoitettu pikanäppäin" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Ilmoitusluettelon näyttämiseen/piilottamiseen tarkoitettu pikanäppäin." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Aktiiviseen ilmoitukseen kohdistava pikanäppäin" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Aktiiviseen ilmoitukseen kohdistava pikanäppäin." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Vaihda sovellukseen 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Vaihda sovellukseen 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Vaihda sovellukseen 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Vaihda sovellukseen 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Vaihda sovellukseen 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Vaihda sovellukseen 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Vaihda sovellukseen 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Vaihda sovellukseen 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Vaihda sovellukseen 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Mitä näppäimistöä käytetään" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Käytettävän näppäimistön tyyppi." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Rajoita vaihtaja nykyiseen työtilaan." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Jos tosi, näytetään vaihtajassa vain niiden sovellusten ikkunat, jotka " +"sijaitsevat nykyisessä työtilassa. Muussa tapauksessa kaikki sovellukset " +"sisällytetään." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Sovelluskuvakkeen tila." + +#: data/org.gnome.shell.gschema.xml.in:221 +#, fuzzy +#| msgid "" +#| "Configures how the windows are shown in the switcher. Valid possibilities " +#| "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +#| "only' (shows only the application icon) or 'both'." +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Määrittää kuinka ikkunat näytetään ikkunavaihtimessa. Mahdolliset arvot ovat " +"'thumbnail-only' (näyttää ikkunan pienoiskuvan), 'app-icon-only' (näyttää " +"vain sovelluksen kuvakkeen) tai 'both'." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Jos tosi,vain nykyisessä työtilassa olevat ikkunat näytetään vaihtajassa. " +"Muussa tapauksessa kaikki ikkunat näytetään." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Kiinnitä modaali-ikkuna isäntäikkunaan" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Tämä avain syrjäyttää avaimen org.gnome.mutter Gnome Shelliä käyttäessä." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Käytä reunakiinnitystä tiputtaessa ikkunoita näytön reunoille" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Työtilojen hallinta on dynaamista" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Työtilat ainoastaan ensisijaisella näytöllä" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Viivästytä kohdistuksen vaihtumista hiiritilassa, kunnes osoitin lopettaa " +"liikkumisen" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Verkkokirjautuminen" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:121 +msgid "Something’s gone wrong" +msgstr "Jokin meni pieleen" + +#: js/extensionPrefs/main.js:128 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Ongelma havaittu: tämän laajennuksen asetuksia ei voi näyttää. Suosittelemme " +"ilmoittamaan ongelmasta laajennuksen tekijälle." + +#: js/extensionPrefs/main.js:135 +msgid "Technical Details" +msgstr "Tekniset tiedot" + +#: js/extensionPrefs/main.js:170 +msgid "Copy Error" +msgstr "Kopiointivirhe" + +#: js/extensionPrefs/main.js:190 +msgid "Homepage" +msgstr "Verkkosivu" + +#: js/extensionPrefs/main.js:191 +msgid "Visit extension homepage" +msgstr "Käy laajennuksen verkkosivulla" + +#: js/extensionPrefs/main.js:454 +msgid "No Extensions Installed" +msgstr "Laajennuksia ei ole asennettu" + +#: js/extensionPrefs/main.js:464 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Laajennuksia voi asentaa ohjelmistokeskuksen kautta tai sivustolta extensions.gnome.org." + +#: js/extensionPrefs/main.js:479 +msgid "Browse in Software" +msgstr "Selaa ohjelmistokeskuksessa" + +#: js/gdm/authPrompt.js:143 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:437 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:330 js/ui/status/network.js:894 +msgid "Cancel" +msgstr "Peru" + +#: js/gdm/authPrompt.js:162 js/gdm/authPrompt.js:205 js/gdm/authPrompt.js:437 +msgid "Next" +msgstr "Seuraava" + +#: js/gdm/authPrompt.js:201 js/ui/shellMountOperation.js:334 +#: js/ui/unlockDialog.js:55 +msgid "Unlock" +msgstr "Avaa lukitus" + +#: js/gdm/authPrompt.js:203 +msgctxt "button" +msgid "Sign In" +msgstr "Kirjaudu sisään" + +#: js/gdm/loginDialog.js:311 +msgid "Choose Session" +msgstr "Valitse istunto" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:454 +msgid "Not listed?" +msgstr "Ei luettelossa?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(esim. käyttäjä tai %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Käyttäjänimi: " + +#: js/gdm/loginDialog.js:1231 +msgid "Login Window" +msgstr "Kirjautumisikkuna" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "Tunnistautumisvirhe" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(tai pyyhkäise sormella)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "Sammuta" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +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:101 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Lukitse näyttö" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:104 +msgid "lock screen" +msgstr "lock screen" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "Kirjaudu ulos" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "logout;sign off;kirjaudu ulos;uloskirjautuminen;poistu" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "Valmiustila" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "suspend;sleep" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +msgid "Switch User" +msgstr "Vaihda käyttäjää" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:125 +msgid "switch user" +msgstr "switch user" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +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:132 +msgid "lock orientation;screen;rotation" +msgstr "lock orientation;screen;rotation;lukitse kierto;lukitse suunta;suunta" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Komentoa ei löydy" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Komentoa ei voi jäsentää:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Kohteen ”%s” suorittaminen epäonnistui:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Juuri nyt" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuutti sitten" +msgstr[1] "%d minuuttia sitten" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d tunti sitten" +msgstr[1] "%d tuntia sitten" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Eilen" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d päivä sitten" +msgstr[1] "%d päivää sitten" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d viikko sitten" +msgstr[1] "%d viikkoa sitten" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d kuukausi sitten" +msgstr[1] "%d kuukautta sitten" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d vuosi sitten" +msgstr[1] "%d vuotta sitten" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Eilen, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d. %Bta, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d. %Bta %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Eilen, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +#| msgid "%B %d, %l∶%M %p" +msgid "%B %-d, %l∶%M %p" +msgstr "%B %-d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +#| msgid "%B %d %Y, %l∶%M %p" +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%B %-d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "Tukiasemaan kirjautuminen" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Yhteytesi tukiaseman kirjautumissivuun ei ole salattu. Salasanat ja muut " +"välittämäsi tiedot voivat olla muiden ihmisten nähtävissä." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "Estä pääsy" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "Salli pääsy" + +#: js/ui/appDisplay.js:780 +msgid "Frequently used applications will appear here" +msgstr "Usein käytetyt sovellukset ilmestyvät tänne" + +#: js/ui/appDisplay.js:895 +msgid "Frequent" +msgstr "Käytetyimmät" + +#: js/ui/appDisplay.js:902 +msgid "All" +msgstr "Kaikki" + +#: js/ui/appDisplay.js:1857 +msgid "New Window" +msgstr "Uusi ikkuna" + +#: js/ui/appDisplay.js:1871 +msgid "Launch using Dedicated Graphics Card" +msgstr "Käynnistä erillisnäytönohjainta käyttäen" + +#: js/ui/appDisplay.js:1898 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "Poista suosikeista" + +#: js/ui/appDisplay.js:1904 +msgid "Add to Favorites" +msgstr "Lisää suosikkeihin" + +#: js/ui/appDisplay.js:1914 +msgid "Show Details" +msgstr "Näytä tiedot" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s on lisätty suosikkeihin." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s on poistettu suosikeista." + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "Valitse äänilaite" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "Ääniasetukset" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "Kuulokkeet" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "Headset-kuulokkeet" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "Mikrofoni" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "Muuta työpöydän taustaa…" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Näytön asetukset" + +#: js/ui/backgroundMenu.js:18 +msgid "Settings" +msgstr "Asetukset" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:42 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:71 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:73 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:75 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:77 +msgctxt "grid wednesday" +msgid "W" +msgstr "K" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:79 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:81 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:83 +msgctxt "grid saturday" +msgid "S" +msgstr "L" + +#. * +#. * 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:346 +msgid "%OB" +msgstr "" + +#. * +#. * 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:356 +msgid "%OB %Y" +msgstr "" + +#: js/ui/calendar.js:413 +msgid "Previous month" +msgstr "Edellinen kuukausi" + +#: js/ui/calendar.js:424 +msgid "Next month" +msgstr "Seuraava kuukausi" + +#: js/ui/calendar.js:578 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:633 +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:701 +msgctxt "event list time" +msgid "All Day" +msgstr "Koko päivä" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d. %Bta" + +#: js/ui/calendar.js:837 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d. %Bta %Y" + +#: js/ui/calendar.js:1060 +msgid "No Notifications" +msgstr "Ei ilmoituksia" + +#: js/ui/calendar.js:1063 +msgid "No Events" +msgstr "Ei tapahtumia" + +#: js/ui/calendar.js:1089 +msgid "Clear" +msgstr "Tyhjennä" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” ei vastaa." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Voit odottaa hetken sovelluksen jatkamista tai pakottaa sovelluksen " +"lopettamisen." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Pakota lopetus" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Odota" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "Erillinen asema yhdistetty" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Erillinen asema irrotettu" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "Avaa käyttäen sovellusta %s" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "Salasana:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "Uudelleen:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Vaihtoehtoisesti voit yhdistää painamalla reitittimesi “WPS”-painiketta." + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:225 +#: js/ui/status/network.js:315 js/ui/status/network.js:897 +msgid "Connect" +msgstr "Yhdistä" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Salasana: " + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "Avain: " + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Salaisen avaimen salasana: " + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Henkilöllisyys: " + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Palvelu: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "Langaton verkko vaatii tunnistautumisen" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, 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:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "Kiinteän 802.1X-yhteyden tunnistautuminen" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Verkon nimi: " + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "DSL-tunnistautuminen" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "PIN-koodi vaaditaan" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Mobiililaajakaista vaatii PIN-koodin" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "Mobiililaajakaistan verkkosalasana" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Salasana vaaditaan kohteeseen \"%s\" yhdistämiseksi." + +#: js/ui/components/networkAgent.js:682 js/ui/status/network.js:1671 +msgid "Network Manager" +msgstr "Verkon hallinta" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "Tunnistautuminen vaaditaan" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "Ylläpitäjä" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "Tunnistaudu" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:314 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Kirjautuminen epäonnistui. Yritä uudelleen." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:785 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s on nyt nimeltään %s" + +#: js/ui/ctrlAltTab.js:25 js/ui/viewSelector.js:176 +msgid "Windows" +msgstr "Ikkunat" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +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:397 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:74 +msgid "%B %-d %Y" +msgstr "%-d. %Bta %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A, %e. %Bta %Y" + +#: js/ui/dateMenu.js:143 +msgid "Add world clocks…" +msgstr "Lisää maailmankelloja…" + +#: js/ui/dateMenu.js:144 +msgid "World Clocks" +msgstr "Maailmankellot" + +#: js/ui/dateMenu.js:234 +msgid "Weather" +msgstr "Sää" + +#: js/ui/dateMenu.js:317 +msgid "Select a location…" +msgstr "Valitse sijainti…" + +#: js/ui/dateMenu.js:325 +msgid "Loading…" +msgstr "Ladataan…" + +#: js/ui/dateMenu.js:335 +msgid "Go online for weather information" +msgstr "Yhdistä verkkoon saadaksesi säätietoja" + +#: js/ui/dateMenu.js:337 +msgid "Weather information is currently unavailable" +msgstr "Säätiedot eivät ole juuri nyt saatavilla" + +#: js/ui/endSessionDialog.js:49 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Kirjaa %s ulos" + +#: js/ui/endSessionDialog.js:50 +msgctxt "title" +msgid "Log Out" +msgstr "Kirjaudu ulos" + +#: js/ui/endSessionDialog.js:52 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua." +msgstr[1] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua." + +#: js/ui/endSessionDialog.js:57 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua." +msgstr[1] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua." + +#: js/ui/endSessionDialog.js:63 +msgctxt "button" +msgid "Log Out" +msgstr "Kirjaudu ulos" + +#: js/ui/endSessionDialog.js:69 +msgctxt "title" +msgid "Power Off" +msgstr "Sammuta" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Asenna päivitykset ja sammuta" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua." +msgstr[1] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua." + +#: js/ui/endSessionDialog.js:76 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Asenna odottavat ohjelmistopäivitykset" + +#: js/ui/endSessionDialog.js:79 js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Restart" +msgstr "Käynnistä uudelleen" + +#: js/ui/endSessionDialog.js:81 +msgctxt "button" +msgid "Power Off" +msgstr "Sammuta" + +#: js/ui/endSessionDialog.js:88 +msgctxt "title" +msgid "Restart" +msgstr "Käynnistä uudelleen" + +#: js/ui/endSessionDialog.js:90 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "" +"Järjestelmä käynnistyy automaattisesti uudelleen %d sekunnin kuluttua." +msgstr[1] "" +"Järjestelmä käynnistyy automaattisesti uudelleen %d sekunnin kuluttua." + +#: js/ui/endSessionDialog.js:104 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Käynnistä uudelleen ja asenna päivitykset" + +#: js/ui/endSessionDialog.js:106 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Järjestelmä käynnistyy automaattisesti uudelleen ja asentaa päivitykset %d " +"sekunnin kuluttua." +msgstr[1] "" +"Järjestelmä käynnistyy automaattisesti uudelleen ja asentaa päivitykset %d " +"sekunnin kuluttua." + +#: js/ui/endSessionDialog.js:112 js/ui/endSessionDialog.js:132 +msgctxt "button" +msgid "Restart & Install" +msgstr "Käynnistä uudelleen ja asenna" + +#: js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Asenna ja sammuta" + +#: js/ui/endSessionDialog.js:114 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Sammuta päivitysten asennuksen jälkeen" + +#: js/ui/endSessionDialog.js:122 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Käynnistä uudelleen ja asenna päivitys" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:127 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s asennetaan uudelleenkäynnistyksen jälkeen. Versiopäivityksen asennus " +"voi kestää kauan: varmista varmuuskopioidesi ajantasaisuus ja toimivuus. " +"Kiinnitä kone myös verkkovirtaan." + +#: js/ui/endSessionDialog.js:316 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Laite käy akkuvirralla: kiinnitä verkkovirtaan ennen päivitysten asennusta." + +#: js/ui/endSessionDialog.js:333 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Jotkin sovellukset ovat kiireisiä tai sisältävät tallentamatonta työtä." + +#: js/ui/endSessionDialog.js:340 +msgid "Other users are logged in." +msgstr "Muita käyttäjiä on kirjautuneena." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:621 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (etä)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:624 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsoli)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "Asenna" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Ladataanko ja asennetaanko ”%s” sivustolta extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s haluaa rajoittaa pikanäppäimiä" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "Sovellus haluaa rajoittaa pikanäppäinten toimintaa" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Voit palauttaa pikanäppäinten toiminnan painamalla %s." + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "Kiellä" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "Salli" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "Hitaat näppäimet otettu käyttöön" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "Hitaat näppäimet poistettu käytöstä" + +#: js/ui/kbdA11yDialog.js:34 +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:41 +msgid "Sticky Keys Turned On" +msgstr "Pohjaan jäävät näppäimet otettu käyttöön" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "Pohjaan jäävät näppäimet poistettu käytöstä" + +#: js/ui/kbdA11yDialog.js:44 +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:46 +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:58 +msgid "Leave On" +msgstr "Jätä käyttöön" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1270 +msgid "Turn On" +msgstr "Ota käyttöön" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:134 js/ui/status/network.js:316 +#: js/ui/status/network.js:1270 js/ui/status/network.js:1382 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Sammuta" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "Poista käytöstä" + +#: js/ui/keyboard.js:190 +msgid "Region & Language Settings" +msgstr "Kielen & alueen asetukset" + +#: js/ui/lookingGlass.js:627 +msgid "No extensions installed" +msgstr "Laajennuksia ei asennettu" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:681 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ei ole lähettänyt virheitä." + +#: js/ui/lookingGlass.js:687 +msgid "Hide Errors" +msgstr "Piilota virheet" + +#: js/ui/lookingGlass.js:691 js/ui/lookingGlass.js:751 +msgid "Show Errors" +msgstr "Näytä virheet" + +#: js/ui/lookingGlass.js:700 +msgid "Enabled" +msgstr "Käytössä" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:703 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Ei käytössä" + +#: js/ui/lookingGlass.js:705 +msgid "Error" +msgstr "Virhe" + +#: js/ui/lookingGlass.js:707 +msgid "Out of date" +msgstr "Ei ajan tasalla" + +#: js/ui/lookingGlass.js:709 +msgid "Downloading" +msgstr "Noudetaan" + +#: js/ui/lookingGlass.js:733 +msgid "View Source" +msgstr "Näytä lähde" + +#: js/ui/lookingGlass.js:742 +msgid "Web Page" +msgstr "Verkkosivusto" + +#: js/ui/messageTray.js:1483 +msgid "System Information" +msgstr "Järjestelmän tiedot" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "Tuntematon esittäjä" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "Tuntematon kappale" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "Äänenvoimakkuus" + +#: js/ui/overview.js:78 +msgid "Undo" +msgstr "Kumoa" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:105 +msgid "Overview" +msgstr "Yleisnäkymä" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:231 +msgid "Type to search…" +msgstr "Kirjoita hakeaksesi…" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "Uusi pikanäppäin…" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "Sovelluksen määrittämä" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "Näytä ohje" + +#: js/ui/padOsd.js:153 +#, fuzzy +#| msgid "Switch User" +msgid "Switch monitor" +msgstr "Vaihda käyttäjää" + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "Määritä painallus" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "Valmis" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "Muokkaa…" + +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "Ei mitään" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "Paina näppäintä määrittääksesi asetukset" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "Paina Esc poistuaksesi" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "Paina mitä tahansa näppäintä poistuaksesi" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Lopeta" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:410 +msgid "Activities" +msgstr "Toiminnot" + +#: js/ui/panel.js:685 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Järjestelmä" + +#: js/ui/panel.js:808 +msgid "Top Bar" +msgstr "Yläpalkki" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Syötä komento" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:169 +msgid "Close" +msgstr "Sulje" + +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "Uudelleenkäynnistys ei ole käytettävissä Waylandilla" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "Käynnistetään uudelleen…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %e. %Bta" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d uusi viesti" +msgstr[1] "%d uutta viestiä" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d uusi ilmoitus" +msgstr[1] "%d uutta ilmoitusta" + +#: js/ui/screenShield.js:458 js/ui/status/system.js:291 +msgid "Lock" +msgstr "Lukitse" + +#: js/ui/screenShield.js:722 +msgid "GNOME needs to lock the screen" +msgstr "Gnomen täytyy lukita näyttö" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:843 js/ui/screenShield.js:1316 +msgid "Unable to lock" +msgstr "Lukitus epäonnistui" + +#: js/ui/screenShield.js:844 js/ui/screenShield.js:1317 +msgid "Lock was blocked by an application" +msgstr "Lukitus estettiin sovelluksen toimesta" + +#: js/ui/search.js:644 +msgid "Searching…" +msgstr "Etsitään…" + +#: js/ui/search.js:646 +msgid "No results." +msgstr "Ei tuloksia." + +#: js/ui/search.js:770 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d lisää" +msgstr[1] "%d lisää" + +#: js/ui/shellEntry.js:20 +msgid "Copy" +msgstr "Kopioi" + +#: js/ui/shellEntry.js:25 +msgid "Paste" +msgstr "Liitä" + +#: js/ui/shellEntry.js:91 +msgid "Show Text" +msgstr "Näytä teksti" + +#: js/ui/shellEntry.js:93 +msgid "Hide Text" +msgstr "Piilota teksti" + +#: js/ui/shellMountOperation.js:301 +msgid "Password" +msgstr "Salasana" + +#: js/ui/shellMountOperation.js:322 +msgid "Remember Password" +msgstr "Muista salasana" + +#: js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Esteettömyys" + +#: js/ui/status/accessibility.js:54 +msgid "Zoom" +msgstr "Lähennys" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Reader" +msgstr "Näytönlukija" + +#: js/ui/status/accessibility.js:65 +msgid "Screen Keyboard" +msgstr "Näyttönäppäimistö" + +#: js/ui/status/accessibility.js:69 +msgid "Visual Alerts" +msgstr "Visuaaliset hälytykset" + +#: js/ui/status/accessibility.js:72 +msgid "Sticky Keys" +msgstr "Pohjaan jäävät näppäimet" + +#: js/ui/status/accessibility.js:75 +msgid "Slow Keys" +msgstr "Hitaat näppäimet" + +#: js/ui/status/accessibility.js:78 +msgid "Bounce Keys" +msgstr "Kimmonäppäimet" + +#: js/ui/status/accessibility.js:81 +msgid "Mouse Keys" +msgstr "Hiirinäppäimet" + +#: js/ui/status/accessibility.js:155 +msgid "High Contrast" +msgstr "Korkea kontrasti" + +#: js/ui/status/accessibility.js:186 +msgid "Large Text" +msgstr "Suuri tekstin koko" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:591 +msgid "Bluetooth Settings" +msgstr "Bluetooth-asetukset" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d yhdistetty" +msgstr[1] "%d yhdistetty" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "Pois" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "Päällä" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "Kirkkaus" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "Näppäimistö" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "Näytä näppäimistön asettelu" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "Sijainti käytettävissä" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "Poista käytöstä" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "Yksityisyysasetukset" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "Sijainti käytössä" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "Sijainti pois käytöstä" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "Käytä" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Saako %s käyttää sijaintitietoasi?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Sijaintitiedon käyttöoikeuksia voi muuttaa milloin tahansa " +"yksityisyysasetuksista." + +#: js/ui/status/network.js:72 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:422 js/ui/status/network.js:1299 +#, javascript-format +msgid "%s Off" +msgstr "%s pois" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:425 +#, javascript-format +msgid "%s Connected" +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:430 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s - Ei hallinnassa" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:433 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s - Katkaistaan yhteyttä" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:440 js/ui/status/network.js:1291 +#, 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:443 +#, 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:451 +#, 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:455 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s - Ei saatavilla" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:458 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s - Yhteys epäonnistui" + +#: js/ui/status/network.js:470 +msgid "Wired Settings" +msgstr "Kiinteän yhteyden asetukset" + +#: js/ui/status/network.js:512 +msgid "Mobile Broadband Settings" +msgstr "Mobiililaajakaistan asetukset" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:559 js/ui/status/network.js:1296 +#, 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:563 +#, javascript-format +msgid "%s Disabled" +msgstr "%s - Poistettu käytöstä" + +#: js/ui/status/network.js:603 +msgid "Connect to Internet" +msgstr "Yhdistä internetiin" + +#: js/ui/status/network.js:792 +msgid "Airplane Mode is On" +msgstr "Lentokonetila on päällä" + +#: js/ui/status/network.js:793 +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:794 +msgid "Turn Off Airplane Mode" +msgstr "Käytä lentokonetilaa" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is Off" +msgstr "Wifi on pois" + +#: js/ui/status/network.js:804 +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:805 +msgid "Turn On Wi-Fi" +msgstr "Ota wifi käyttöön" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi Networks" +msgstr "Wifi-verkot" + +#: js/ui/status/network.js:832 +msgid "Select a network" +msgstr "Valitse verkko" + +#: js/ui/status/network.js:861 +msgid "No Networks" +msgstr "Ei verkkoja" + +#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Käytä laitepainiketta sammuttaaksesi" + +#: js/ui/status/network.js:1158 +msgid "Select Network" +msgstr "Valitse verkko" + +#: js/ui/status/network.js:1164 +msgid "Wi-Fi Settings" +msgstr "Wifin asetukset" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1287 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s - Yhteyspiste aktiivisena" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s - Ei yhdistetty" + +#: js/ui/status/network.js:1399 +msgid "connecting…" +msgstr "yhdistetään…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1402 +msgid "authentication required" +msgstr "tunnistautuminen vaaditaan" + +#: js/ui/status/network.js:1404 +msgid "connection failed" +msgstr "yhteys katkesi" + +#: js/ui/status/network.js:1454 +msgid "VPN Settings" +msgstr "VPN-asetukset" + +#: js/ui/status/network.js:1471 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1481 +msgid "VPN Off" +msgstr "VPN pois" + +#: js/ui/status/network.js:1542 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Verkkoasetukset" + +#: js/ui/status/network.js:1571 +#, 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:1575 +#, 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:1579 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modeemiyhteys" +msgstr[1] "%s modeemiyhteyttä" + +#: js/ui/status/network.js:1708 +msgid "Connection failed" +msgstr "Yhteys epäonnistui" + +#: js/ui/status/network.js:1709 +msgid "Activation of network connection failed" +msgstr "Verkkoyhteyden aktivointi epäonnistui" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Yövalo pois käytöstä" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Yövalo päällä" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Palauta" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Poista käytöstä huomiseen asti" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "Virranhallinta" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "Ladattu täyteen" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "Ei lataudu" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "Arvioidaan…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d jäljellä (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d kunnes täynnä (%d %%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Näyttö jaetaan" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Sammuta" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Lentokonetila on päällä" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "Vaihda käyttäjää" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "Kirjaudu ulos" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "Tilin asetukset" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "Kiertolukitus" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "Valmiustila" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "Sammuta" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "Tuntematon Thunderbolt-laite" + +#: js/ui/status/thunderbolt.js:326 +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:329 +msgid "Unauthorized Thunderbolt device" +msgstr "Thunderbolt-laite ilman valtuutusta" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Uusi laite on havaittu. Se tulee valtuuttaa ylläpitäjän toimesta." + +#: 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 "Thunderbolt-laitetta ei voitu valtuuttaa: %s" + +#: js/ui/status/volume.js:136 +msgid "Volume changed" +msgstr "Äänenvoimakkuutta muutettu" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "Peili" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "Liitä näytöt" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "Vain ulkoinen" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "Vain sisäinen" + +#: js/ui/unlockDialog.js:63 +msgid "Log in as another user" +msgstr "Kirjaudu toisena käyttäjänä" + +#: js/ui/unlockDialog.js:80 +msgid "Unlock Window" +msgstr "Lukituksen avausikkuna" + +#: js/ui/viewSelector.js:180 +msgid "Applications" +msgstr "Sovellukset" + +#: js/ui/viewSelector.js:184 +msgid "Search" +msgstr "Haku" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” on valmis" + +#: js/ui/windowManager.js:60 +msgid "Do you want to keep these display settings?" +msgstr "Haluatko säilyttää nämä näyttöasetukset?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:72 +msgid "Revert Settings" +msgstr "Palauta asetukset" + +#: js/ui/windowManager.js:75 +msgid "Keep Changes" +msgstr "Säilytä muutokset" + +#: js/ui/windowManager.js:93 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Asetusmuutokset palautetaan %d sekunnissa" +msgstr[1] "Asetusmuutokset palautetaan %d sekunnissa" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:669 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:29 +msgid "Minimize" +msgstr "Pienennä" + +#: js/ui/windowMenu.js:36 +msgid "Unmaximize" +msgstr "Palauta koko" + +#: js/ui/windowMenu.js:40 +msgid "Maximize" +msgstr "Suurenna" + +#: js/ui/windowMenu.js:47 +msgid "Move" +msgstr "Siirrä" + +#: js/ui/windowMenu.js:53 +msgid "Resize" +msgstr "Muuta kokoa" + +#: js/ui/windowMenu.js:60 +msgid "Move Titlebar Onscreen" +msgstr "Siirrä ikkunapalkki näytölle" + +#: js/ui/windowMenu.js:65 +msgid "Always on Top" +msgstr "Aina päällimmäisenä" + +#: js/ui/windowMenu.js:84 +msgid "Always on Visible Workspace" +msgstr "Aina näkyvissä olevassa työtilassa" + +#: js/ui/windowMenu.js:98 +msgid "Move to Workspace Left" +msgstr "Siirrä vasemmalla olevaan työtilaan" + +#: js/ui/windowMenu.js:104 +msgid "Move to Workspace Right" +msgstr "Siirrä oikealla olevaan työtilaan" + +#: js/ui/windowMenu.js:110 +msgid "Move to Workspace Up" +msgstr "Siirrä ylempänä olevaan työtilaan" + +#: js/ui/windowMenu.js:116 +msgid "Move to Workspace Down" +msgstr "Siirrä alempana olevaan työtilaan" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Siirrä ylempänä olevaan näyttöön" + +#: js/ui/windowMenu.js:143 +msgid "Move to Monitor Down" +msgstr "Siirrä alempana olevaan näyttöön" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Left" +msgstr "Siirrä vasemmalla olevaan näyttöön" + +#: js/ui/windowMenu.js:161 +msgid "Move to Monitor Right" +msgstr "Siirrä oikealla olevaan näyttöön" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution-kalenteri" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Tulosta versio" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "GDM:n kirjautumisruudussa käyttämä tila" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Käytä tiettyä tilaa (esim. “gdm”) kirjautumisnäkymää varten" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Listaa mahdolliset tilat" + +#: src/shell-app.c:266 +msgctxt "program" +msgid "Unknown" +msgstr "Tuntematon" + +#: src/shell-app.c:517 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Sovelluksen “%s” käynnistäminen epäonnistui" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Salasanat eivät täsmää." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Salasana ei voi olla tyhjä" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Käyttäjä poistui tunnistautumisvalintaikkunasta" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u ulostulo" +msgstr[1] "%u ulostuloa" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u sisääntulo" +msgstr[1] "%u sisääntuloa" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Järjestelmän äänet" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Kohteen %s asetusikkunaa ladataessa tapahtui virhe:" + +#~ msgid "%s all day." +#~ msgstr "%s koko päivän." + +#~ msgid "%s, then %s later." +#~ msgstr "%s. %s myöhemmin." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s. Sen jälkeen %s. Myöhemmin %s." + +#~ msgid "Feels like %s." +#~ msgstr "Tuntuu kuin %s." + +#~| 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" + +#~ msgid "Status Icons" +#~ msgstr "Tilakuvakkeet" + +#~ msgid "Events" +#~ msgstr "Tapahtumat" + +#~ msgid "Notifications" +#~ msgstr "Ilmoitukset" + +#~ msgid "Clear section" +#~ msgstr "Tyhjennä osio" + +#~ msgid "Media" +#~ msgstr "Media" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Gnome Shell -laajennusten asetukset" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Verkkotunnistautumisen uudelleenohjaus" + +#~ msgid "Not In Use" +#~ msgstr "Ei käytössä" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Näytä viikonpäivä kalenterissa" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Jos tosi, näytä ISO-viikonpäivät kalenterissa." + +#~ msgid "Use as Internet connection" +#~ msgstr "Käytä internetyhteytenä" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Gnome Shell (Wayland-komposiointi)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d yhdistetty laite" +#~ msgstr[1] "%d yhdistettyä laitetta" + +#~ msgid "Authentication required" +#~ msgstr "tunnistautuminen vaaditaan" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Akku" + +#~ msgid "Airplane Mode" +#~ msgstr "Lentokonetila" + +#~ msgid "Show the message tray" +#~ msgstr "Näytä viestialue" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "su" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "ma" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "ti" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "ke" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "to" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "pe" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "la" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Ei merkintöjä" + +#~ msgid "Today" +#~ msgstr "Tänään" + +#~ msgid "Tomorrow" +#~ msgstr "Huomenna" + +#~ msgid "This week" +#~ msgstr "Tällä viikolla" + +#~ msgid "Next week" +#~ msgstr "Ensi viikolla" + +#~ msgid "Removable Devices" +#~ msgstr "Irrotettavat laitteet" + +#~ msgid "Eject" +#~ msgstr "Poista asemasta" + +#~ msgid "Invitation" +#~ msgstr "Kutsu" + +#~ msgid "Call" +#~ msgstr "Soita" + +#~ msgid "File Transfer" +#~ msgstr "Tiedostonsiirto" + +#~ msgid "Chat" +#~ msgstr "Keskustelu" + +#~ msgid "Unmute" +#~ msgstr "Palauta ääni" + +#~ msgid "Mute" +#~ msgstr "Vaimenna" + +#~ msgid "Invitation to %s" +#~ msgstr "Kutsu huoneeseen %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s kutsuu sinut huoneeseen %s" + +#~ msgid "Decline" +#~ msgstr "Kieltäydy" + +#~ msgid "Accept" +#~ msgstr "Hyväksy" + +#~ msgid "Video call from %s" +#~ msgstr "Videopuhelu käyttäjältä %s" + +#~ msgid "Call from %s" +#~ msgstr "Puhelu käyttäjältä %s" + +#~ msgid "Answer" +#~ msgstr "Vastaa" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s on lähettämässä sinulle tiedostoa %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s haluaisi saada luvan nähdä, milloin olet linjoilla" + +#~ msgid "Authentication failed" +#~ msgstr "Tunnistautuminen epäonnistui" + +#~ msgid "Encryption error" +#~ msgstr "Salausvirhe" + +#~ msgid "Certificate not provided" +#~ msgstr "Varmennetta ei annettu" + +#~ msgid "Certificate untrusted" +#~ msgstr "Varmenteeseen ei luoteta" + +#~ msgid "Certificate expired" +#~ msgstr "Varmenne on vanhentunut" + +#~ msgid "Certificate not activated" +#~ msgstr "Varmennetta ei ole aktivoitu" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Varmenteen konenimiristiriita" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Varmenteen sormenjälkiristiriita" + +#~ msgid "Certificate self-signed" +#~ msgstr "Varmenne on itseallekirjoitettu" + +#~ msgid "Status is set to offline" +#~ msgstr "Tilaksi on asetettu ”poissa linjoilta”" + +#~ msgid "Certificate is invalid" +#~ msgstr "Varmenne ei kelpaa" + +#~ msgid "Connection has been refused" +#~ msgstr "Yhteys on evätty" + +#~ msgid "Connection can't be established" +#~ msgstr "Yhteyttä ei voida muodostaa" + +#~ msgid "Connection has been lost" +#~ msgstr "Yhteys on katkennut" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Tämä tili on jo yhteydessä palvelimeen" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Yhteys on korvattu uudella samaa resurssia käyttävällä yhteydellä" + +#~ msgid "The account already exists on the server" +#~ msgstr "Tili on jo olemassa palvelimella" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Palvelin on tällä hetkellä liian kiireinen käsittelemään yhteyttä" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Varmenne on kumottu" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "Varmenne käyttää turvatonta salausmenetelmää" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Palvelinvarmenne tai palvelinvarmenneketju on liian pitkä " +#~ "salauskirjastolle" + +#~ msgid "Internal error" +#~ msgstr "Sisäinen virhe" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Käyttäjään %s yhdistäminen epäonnistui" + +#~ msgid "View account" +#~ msgstr "Näytä tili" + +#~ msgid "Open Calendar" +#~ msgstr "Avaa kalenteri" + +#~ msgid "Date & Time Settings" +#~ msgstr "Ajan & päiväyksen asetukset" + +#~ msgid "Open" +#~ msgstr "Avaa" + +#~ msgid "Remove" +#~ msgstr "Poista" + +#~ msgid "Clear Messages" +#~ msgstr "Tyhjennä viestit" + +#~ msgid "Notification Settings" +#~ msgstr "Ilmoitusasetukset" + +#~ msgid "Tray Menu" +#~ msgstr "Viestialuevalikko" + +#~ msgid "No Messages" +#~ msgstr "Ei viestejä" + +#~ msgid "Message Tray" +#~ msgstr "Viestialue" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Sijainnin suurin tarkkuustaso." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Painikkeiden järjestys otsikkopalkissa" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Tämä avain syrjäyttää avaimen org.gnome.desktop.wm.preferences Gnome " +#~ "Shelliä käyttäessä." + +#~ msgid "Extension" +#~ msgstr "Laajennus" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Valitse muokattava laajennus alta." + +#~ msgid "unavailable" +#~ msgstr "ei käytettävissä" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Luettelo luokista, jotka tulee esittää kansioina" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%e. %Bta, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%e. %Bta %Y, %H:%M " + +#~ msgid "Authorization request from %s" +#~ msgstr "Valtuutuspyyntö kohteesta %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Laite %s haluaa muodostaa parituksen tämän tietokoneen kanssa" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Laite %s pyytää pääsyä palveluun %s" + +#~ msgid "Grant this time only" +#~ msgstr "Salli vain tällä kerralla" + +#~ msgid "Reject" +#~ msgstr "Hylkää" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Paritusvahvistus kohteelle %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "Vahvista, täsmääkö koodi \"%06d\" laitteen koodin kanssa." + +#~ msgid "Matches" +#~ msgstr "Täsmää" + +#~ msgid "Does not match" +#~ msgstr "Ei täsmää" + +#~ msgid "Pairing request for %s" +#~ msgstr "Parituspyyntö kohteelle %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Kirjoita laitteella mainittu PIN-koodi." + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Ei viisauksia tälle päivälle:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s, sanoo oraakkeli" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Settings Menu" +#~ msgstr "Asetusvalikko" + +#~ msgid "Screenshots" +#~ msgstr "Kuvakaappaukset" + +#~ msgid "Record a screencast" +#~ msgstr "Nauhoita kuvakaappausvideo" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Kerätäänkö sovellusten käytöstä tilastoja" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "Ikkunanhallinta seuraa normaalisti aktiivisia sovelluksia, jotta eniten " +#~ "käytetyt voidaan esittää (esim. käynnistimissä). Vaikka nämä tiedot " +#~ "pysyvät yksityisinä, voit silti haluta ottaa ominaisuuden pois käytöstä " +#~ "yksityisyyden vuoksi. Huomaa että pois kytkeminen ei poista aiemmin " +#~ "tallennettuja tietoja." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "" +#~ "Kuvakaappausvideon nauhoitukseen/lopetukseen tarkoitettu pikanäppäin" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "" +#~ "Kuvakaappausvideon nauhoitukseen/lopetukseen tarkoitettu pikanäppäin." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Kuvakaappausvideoiden kuvataajuus." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Nauhoituksesta tuloksena saatavan kuvakaappausvideon kuvataajuus kun " +#~ "käytössä on GNOMEn ikkunanhallinnan nauhoitin, kuvaa per sekunti." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "Gstreamer-liukuhihna jolla kuvakaappausvideot pakataan" + +#, fuzzy +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Asettaa GStreamer-liukuhihnan, jota käytetään nauhoitusten pakkaamiseen. " +#~ "Asetus noudattaa gst-launch-komennon syntaksia. Liukuhihnalla tulee olla " +#~ "yhdistämätön viemärialusta, jonne nauhoitettu video syötetään. " +#~ "Normaalisti sillä on yhdistämätön lähde, jonka tuloste kirjoitetaan " +#~ "tulostetiedostoon. Liukuhihna voi kuitenkin huolehtia itse tulosteesta - " +#~ "tätä voidaan käyttää vaikkapa lähettämään tuloste Icecast-palvelimelle " +#~ "shout2send- tai vastaavalla komponentilla. Jos tätä ei aseteta tai arvona " +#~ "on tyhjää, käytetään oletusliukuhihnaa. Oletusliukuhihna on tällä " +#~ "hetkellä ”videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! " +#~ "webmmux” ja nauhoittaa WEBM-muotoon VP8-koodekilla. %T korvautuu " +#~ "arvauksella parhaan suorituskyvyn antavasta säiemäärästä järjestelmässä." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Tiedostopääte kuvakaappausvideoiden tallentamiseen" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Nauhoitetuille kuvakaappausvideoille valitaan yksikäsitteinen " +#~ "tiedostonimi nykyisen päivämäärän ja tämän tiedostopäätteen mukaisesti. " +#~ "Tiedostopääte tulisi vaihtaa mikäli nauhoitetaan eri tallennusmuotoon." + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "Istunto…" + +#~| msgid "Power Off" +#~ msgid "Power" +#~ msgstr "Virta" + +#~ msgid "Restart" +#~ msgstr "Käynnistä uudelleen" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Kuvakaappausvideo - %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Napsauta Kirjaudu ulos poistuaksesi näistä sovelluksista ja " +#~ "kirjautuaksesi ulos järjestelmästä." + +#~ msgid "Logging out of the system." +#~ msgstr "Kirjaudutaan ulos järjestelmästä." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Napsauta Sammuta poistuaksesi näistä sovelluksista ja sammuttaaksesi " +#~ "järjestelmän." + +#~ msgid "Powering off the system." +#~ msgstr "Sammutetaan järjestelmää" + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Napsauta Käynnistä uudelleen poistuaksesi näistä sovelluksista ja " +#~ "käynnistääksesi järjestelmän uudelleen." + +#~ msgid "Restarting the system." +#~ msgstr "Käynnistetään järjestelmää uudelleen." + +#~ msgid "Universal Access Settings" +#~ msgstr "Esteettömyysasetukset" + +#~ msgid "Visibility" +#~ msgstr "Näkyvyys" + +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "Asenna uusi laite…" + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "Lähetä tiedostoja…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Näppäimistön asetukset" + +#~ msgid "Mouse Settings" +#~ msgstr "Hiiren asetukset" + +#~ msgid "Volume, network, battery" +#~ msgstr "Äänenvoimakkuus, verkko, akku" + +#~ msgid "disabled" +#~ msgstr "ei käytössä" + +#~ msgid "cable unplugged" +#~ msgstr "kaapeli ei kytketty" + +#~ msgid "More…" +#~ msgstr "Lisää…" + +#~ msgid "Wired" +#~ msgstr "Kiinteä" + +#~ msgid "Auto Ethernet" +#~ msgstr "Automaattinen, kiinteä" + +#~ msgid "Auto broadband" +#~ msgstr "Automaattinen, mobiililaajakaista" + +#~ msgid "Auto dial-up" +#~ msgstr "Automaattinen, puhelinverkko" + +#~ msgid "Auto %s" +#~ msgstr "Automaattinen: %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Automaattinen: Bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Automaattinen: langaton" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s jäljellä" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "tunti" +#~ msgstr[1] "tuntia" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minuutti" +#~ msgstr[1] "minuuttia" + +#~| msgid "AC adapter" +#~ msgid "AC Adapter" +#~ msgstr "Virtalähde" + +#~| msgid "Laptop battery" +#~ msgid "Laptop Battery" +#~ msgstr "Kannettavan akku" + +#~ msgid "Monitor" +#~ msgstr "Näyttö" + +#~ msgid "Mouse" +#~ msgstr "Hiiri" + +#~ msgid "PDA" +#~ msgstr "Kämmentietokone" + +#~| msgid "Cell phone" +#~ msgid "Cell Phone" +#~ msgstr "Matkapuhelin" + +#~| msgid "Media player" +#~ msgid "Media Player" +#~ msgstr "Mediasoitin" + +#~ msgid "Tablet" +#~ msgstr "Taulutietokone" + +#~ msgid "Computer" +#~ msgstr "Tietokone" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgid "Available" +#~ msgstr "Tavoitettavissa" + +#~ msgid "Busy" +#~ msgstr "Kiireinen" + +#~ msgid "Invisible" +#~ msgstr "Näkymätön" + +#~ msgid "Away" +#~ msgstr "Poissa" + +#~ msgid "Idle" +#~ msgstr "Jouten" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Pikaviestitilaksi asetetaan ”kiireinen”" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Ilmoitukset, kuten keskusteluviestit, ovat nyt poissa käytöstä. " +#~ "Pikaviestitilaasi on muutettu, jotta muut tietävät, että et ehkä näe " +#~ "heidän viestejään." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "" +#~ "Sammuttaminen saattaa aiheuttaa muiden käyttäjien menettävän " +#~ "tallentamattomia tietoja." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Kirjaudu sisään" + +#~ msgid "APPLICATIONS" +#~ msgstr "SOVELLUKSET" + +#~ msgid "SETTINGS" +#~ msgstr "ASETUKSET" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H.%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l.%M %p" + +#~ msgid "Subscription request" +#~ msgstr "Tilauspyyntö" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Lähetetty %Ana kello %H.%M" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Lähetetty %Ana %d. %Bta %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Yhteys kohteeseen %s katkesi" + +#~ msgid "Reconnect" +#~ msgstr "Yhdistä uudelleen" + +#~ msgid "tray" +#~ msgstr "ilmoitusalue" + +#~ msgid "Browse Files..." +#~ msgstr "Selaa tiedostoja…" + +#~ msgid "Error browsing device" +#~ msgstr "Virhe selattaessa laitetta" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Pyydettyä laitetta ei voida selata, virhe on ”%s”" + +#~ msgid "More..." +#~ msgstr "Lisää…" + +#~ msgid "Wireless" +#~ msgstr "Langaton" + +#~ msgid "VPN Connections" +#~ msgstr "VPN-yhteydet" + +#~ msgid "System Settings" +#~ msgstr "Järjestelmän asetukset" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Suosikkiyllätyksesi" + +#~ msgid "United Kingdom" +#~ msgstr "Yhdistynyt kuningaskunta" + +#~ msgid "Default" +#~ msgstr "Oletus" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "käytöstä poistetut OpenSearch-tarjoajat" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Laitteen ”%s” irrottaminen epäonnistui" + +#~ msgid "Retry" +#~ msgstr "Yritä uudelleen" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "SIJAINNIT JA LAITTEET" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Show time with seconds" +#~ msgstr "Näytä aika sekuntien kera" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Jos tosi, näytä sekunnit ajassa." + +#~ msgid "Show date in clock" +#~ msgstr "Näytä päivämäärä kellossa" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Jos tosi, näytä päivämäärä kellossa ajan lisäksi." + +#~ msgid "CONTACTS" +#~ msgstr "YHTEYSTIEDOT" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %d.%m., %H.%M.%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %d.%m., %H.%M" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %H.%M.%S" + +#~ msgid "%a %R" +#~ msgstr "%a %H.%M" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %d.%m., %I.%M.%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %I.%M.%S %p" + +#~ msgid "Connect to..." +#~ msgstr "Yhdistä…" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Väärä salasana, yritä uudelleen" + +#~ msgid "%s is online." +#~ msgstr "%s on linjoilla." + +#~ msgid "%s is offline." +#~ msgstr "%s on poissa linjoilta." + +#~ msgid "%s is away." +#~ msgstr "%s on poissa." + +#~ msgid "%s is busy." +#~ msgstr "%s on kiireinen." + +#~ msgid "Hidden" +#~ msgstr "Piilotettu" + +#~ msgid "Power Off..." +#~ msgstr "Sammuta…" + +#~ msgid "Online Accounts" +#~ msgstr "Verkkotilit" + +#~ msgid "Log Out..." +#~ msgstr "Kirjaudu ulos…" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..c7c27fb --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2355 @@ +# French translations for gnome-shell package. +# Copyright (C) 2009-2019 Listed translators +# This file is distributed under the same license as the gnome-shell package. +# +# Mathieu Bridon , 2009. +# Pablo Martin-Gomez , 2010. +# Bruno Brouard , 2011-2012. +# Cyril Arnaud , 2011. +# Luc Guillemin , 2011. +# Luc Pionchon , 2011. +# Pierre Henry , 2012. +# Alexandre Franke , 2012, 2015. +# Mathieu Stumpf , 2013. +# Alain Lojewski , 2014-2018. +# Erwan Georget , 2016. +# Claude Paroz , 2010-2011, 2016. +# Julien Humbert , 2019. +# Charles Monzat , 2016-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master fr\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-13 20:47+0000\n" +"PO-Revision-Date: 2019-03-17 19:15+0100\n" +"Last-Translator: Charles Monzat \n" +"Language-Team: GNOME French Team \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"X-Generator: Gtranslator 3.32.0\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Système" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Afficher la liste des notifications" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Donner le focus à la notification active" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Afficher la vue d’ensemble" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Afficher toutes les applications" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Ouvrir le menu de l’application" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Extensions Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurer les extensions Shell de GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Shell de GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gestion des fenêtres et lancement des applications" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Activer les outils internes pour les développeurs et les testeurs depuis Alt-" +"F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Autoriser l’accès aux outils internes de débogage et de surveillance grâce à " +"la boîte de dialogue de lancement d’applications (Alt-F2)." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Identifiants UUID des extensions à activer" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Les extensions GNOME Shell ont une propriété UUID. Cette clé énumère les " +"extensions qui doivent être chargées. Toute extension qui voudrait être " +"chargée doit être ajoutée dans cette liste. Vous pouvez aussi manipuler " +"cette liste avec les méthodes DBus EnableExtension et DisableExtension de " +"org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Désactiver les extensions utilisateur" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Désactiver l’ensemble des extensions activées par l’utilisateur sans " +"affecter la propriété « enabled-extension »." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Désactive la vérification de compatibilité de version" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell charge uniquement les extensions annonçant leur gestion de la " +"version en cours. Activer cette option désactive cette vérification et " +"essaie de charger toutes les extensions, sans considérer les versions " +"qu’elles annoncent prendre en charge." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Liste d’identifiants de fichiers desktop pour les applications favorites" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Les applications correspondant à ces identifiants sont affichées dans la " +"zone des favoris." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Vue du sélecteur d’applications" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Index de la vue actuellement sélectionnée dans le sélecteur d’applications." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historique de la boîte de dialogue des commandes (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historique de la boîte de dialogue d’inspection" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "" +"Toujours afficher l’élément « Se déconnecter » dans le menu utilisateur." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Cette clé affiche l’élément « Se déconnecter » du menu utilisateur " +"normalement caché automatiquement dans le cas d’une session ou d’un " +"utilisateur unique." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Se souvenir des mots de passe pour les montages des systèmes de fichiers " +"chiffrés ou distants" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Le shell demandera un mot de passe au montage d’un périphérique chiffré ou " +"d’un système de fichiers distant. Si le mot de passe peut être enregistré " +"pour une utilisation ultérieure, une case à cocher « Se souvenir du mot de " +"passe » sera présente. Cette clé détermine l’état par défaut de cette case à " +"cocher." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Indique si l’adaptateur Bluetooth a des périphériques associés" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Le shell n’affichera d’élément de menu Bluetooth que si un adaptateur " +"Bluetooth est allumé ou s’il y a des périphériques associés avec " +"l’adaptateur par défaut. Cela sera réinitialisé si l’adaptateur par défaut " +"se retrouve sans aucun périphérique associé." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Activer l’API d’introspection" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Active l’API D-Bus, qui permet d’introspecter l’état d’application du shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Combinaison de touches pour ouvrir le menu de l’application" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Combinaison de touches pour ouvrir le menu de l’application." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "" +"Combinaison de touches pour ouvrir la vue « Afficher les applications »" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Combinaison de touches pour ouvrir la vue « Afficher les applications » de " +"la vue d’ensemble des activités." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Combinaison de touches pour ouvrir la vue d’ensemble" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Combinaison de touches pour ouvrir la vue d’ensemble des activités." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Combinaison de touches pour inverser la visibilité de la liste des " +"notifications" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Combinaison de touches pour inverser la visibilité de la liste des " +"notifications." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Combinaison de touches pour donner le focus à la notification active" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Combinaison de touches pour donner le focus à la notification active." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Combinaison de touches pour stopper et fermer toutes les transitions à des " +"fins de débogage" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Passer à l’application 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Passer à l’application 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Passer à l’application 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Passer à l’application 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Passer à l’application 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Passer à l’application 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Passer à l’application 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Passer à l’application 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Passer à l’application 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Le clavier utilisé" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Le type de clavier utilisé." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limite le sélecteur de fenêtres à l’espace de travail actuel." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Si vrai, seules les applications ayant des fenêtres ouvertes sur l’espace de " +"travail actuel sont affichées dans le sélecteur. Sinon, toutes les " +"applications y sont incluses." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Le type d’icône des applications." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configure la façon dont les fenêtres sont affichées dans le sélecteur. Les " +"choix possibles sont « thumbnail-only » (affiche une miniature de la " +"fenêtre), « app-icon-only » (affiche uniquement l’icône de l’application), " +"ou « both » (affiche les deux)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Si vrai, seules les fenêtres de l’espace de travail actuel sont affichées " +"dans le sélecteur. Sinon, toutes les fenêtres y sont incluses." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Attacher les dialogues modaux à leur fenêtre parente" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Cette clé prend le pas sur la clé dans org.gnome.mutter lorsque GNOME Shell " +"est lancé." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Activer l’empilage des fenêtres déposées sur les bords de l’écran" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Les espaces de travail sont gérés dynamiquement" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Les espaces de travail sont uniquement sur l’écran principal" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Retarder les changements de focus en mode souris jusqu’à ce que le pointeur " +"arrête de bouger" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Identification réseau" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Quelque chose s’est mal passé" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Nous sommes désolés, mais il y a eu un problème : les paramètres de cette " +"extension ne peuvent être affichés. Nous vous recommandons de signaler ce " +"problème aux auteurs de l’extension." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Détails techniques" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Copier l’erreur" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Site Web" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Visiter le site Web de l’extension" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Aucune extension installée" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Les extensions peuvent être installées via Logiciels ou depuis extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Parcourir dans Logiciels" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Annuler" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Suivant" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Déverrouiller" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Se connecter" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Choisir une session" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Absent de la liste ?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(par ex. utilisateur ou %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Nom d’utilisateur : " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Fenêtre de connexion" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Erreur d’authentification" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(ou faites glisser le doigt)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Éteindre" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "éteindre;fermer;débrancher;redémarrer;rallumer;reboot;" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Verrouillage de l’écran" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "verrouillage;écran;" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Fermer la session" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "fermer;session;déconnecter;" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Mettre en veille" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "mettre en veille;sommeil;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Changer d’utilisateur" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "changer;utilisateur;" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Verrouillage de l’orientation" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "verrouillage;orientation;écran;rotation;" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Commande non trouvée" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Impossible d’analyser la commande :" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Exécution de « %s » impossible :" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "À l’instant" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Il y a %d minute" +msgstr[1] "Il y a %d minutes" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Il y a %d heure" +msgstr[1] "Il y a %d heures" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Hier" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Il y a %d jour" +msgstr[1] "Il y a %d jours" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Il y a %d semaine" +msgstr[1] "Il y a %d semaines" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Il y a %d mois" +msgstr[1] "Il y a %d mois" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Il y a %d an" +msgstr[1] "Il y a %d ans" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Hier, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Hier, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Identification du point d’accès" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"La connexion à ce point d’accès n’est pas sécurisée. Les mots de passe et " +"les autres informations que vous saisissez sur cette page peuvent être " +"interceptés par des personnes autour de vous." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Refuser l’accès" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Accorder l’accès" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Les applications fréquemment utilisées apparaîtront ici" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Fréquemment utilisées" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Toutes" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Nouvelle fenêtre" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Démarrer en utilisant la carte graphique dédiée" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Enlever des favoris" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Ajouter aux favoris" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Afficher les détails" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s a été ajouté à vos favoris." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s a été supprimé de vos favoris." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Sélectionner le périphérique audio" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Paramètres de son" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Casque audio" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Micro-casque" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Microphone" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Modifier l’arrière-plan…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Paramètres d’affichage" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Paramètres" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Mois précédent" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Mois suivant" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Semaine %V" + +# luc: Trying alternatives: +# 123456789|123456789| +# Toute la journée bad +# Journée entière bad +# Jour entier +# La journée +# Journée +# +# All Day +# +# le calendrier (mal) francisé : +# http://blog.arkezis.com/wp-content/uploads/2011/04/Capture.png +# +# See also https://bugzilla.gnome.org/show_bug.cgi?id=658679 +# +#. 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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Journée" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A %-d %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A %-d %B, %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Aucune notification" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Aucun évènement" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Effacer" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "« %s » ne répond pas." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Vous pouvez soit attendre un peu pour continuer, soit forcer l’application à " +"quitter." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Forcer à quitter" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Attendre" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Disque externe connecté" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Disque externe déconnecté" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Ouvrir avec %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Mot de passe :" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Saisissez à nouveau :" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Vous pouvez également vous connecter en appuyant sur le bouton « WPS » sur " +"votre routeur." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Se connecter" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Mot de passe : " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Clé : " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Mot de passe de la clé privée : " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identité : " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Service : " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "L’authentification est requise par le réseau sans fil" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Il faut un mot de passe ou une clé de chiffrement pour accéder au réseau " +"sans fil « %s »." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Authentification filaire 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Nom du réseau : " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Authentification DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Code PIN requis" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Un code PIN est nécessaire pour les connexions mobiles" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN : " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mot de passe de la connexion mobile" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Un mot de passe est requis pour se connecter à « %s »." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Gestionnaire de réseau" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Authentification nécessaire" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrateur" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "S’authentifier" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Échec de l’authentification. Essayez à nouveau." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s est maintenant connu sous le nom de %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Fenêtres" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Afficher les applications" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Dash" + +# luc: FIXME: how to have a capitalized weekday (start of sentence)? +# %a (abbreviated) %A (full weekday) %^A (full weekday all uppercase) +# https://bugzilla.gnome.org/show_bug.cgi?id=658686 +# +# luc: TODO: to test, this possibly explodes on dimanche 25 septembre 2011 +# L M M J V S D +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +# luc: FIXME: how to have a capitalized weekday (start of sentence)? +# %a (abbreviated) %A (full weekday) %^A (full weekday all uppercase) +# https://bugzilla.gnome.org/show_bug.cgi?id=658686 +# +# luc: TODO: to test, this possibly explodes on dimanche 25 septembre 2011 +# L M M J V S D +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Ajouter des horloges locales…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Horloges locales" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Météo" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Choisir un emplacement…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Chargement…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Chercher les informations météorologiques en ligne" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Les informations météorologiques ne sont pas disponibles actuellement" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Fermer la session de %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Fermer la session" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s sera déconnecté automatiquement dans %d seconde." +msgstr[1] "%s sera déconnecté automatiquement dans %d secondes." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Vous allez être déconnecté automatiquement dans %d seconde." +msgstr[1] "Vous allez être déconnecté automatiquement dans %d secondes." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Fermer la session" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Éteindre" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Installer les mises à jour et éteindre" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Cet ordinateur s’éteindra automatiquement dans %d seconde." +msgstr[1] "Cet ordinateur s’éteindra automatiquement dans %d secondes." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Installer les mises à jour logicielles en attente" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Redémarrer" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Éteindre" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Redémarrer" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Cet ordinateur redémarrera automatiquement dans %d seconde." +msgstr[1] "Cet ordinateur redémarrera automatiquement dans %d secondes." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Redémarrer et installer les mises à jour" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "Le système redémarrera automatiquement dans %d seconde." +msgstr[1] "Le système redémarrera automatiquement dans %d secondes." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Redémarrer et installer" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installer et éteindre" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Éteindre après l’installation des mises à jour" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Redémarrer et installer la mise à niveau" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s sera installé après le redémarrage. L’installation d’une mise à niveau " +"peut prendre beaucoup de temps : vérifiez que vous disposez de sauvegardes " +"et que l’ordinateur est branché sur le secteur." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Fonctionnement sur batterie : veuillez vous brancher avant d’installer les " +"mises à jour." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Certaines applications sont occupées ou des documents ne sont pas " +"enregistrés." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "D’autres utilisateurs sont connectés." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (distant)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (console)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Installer" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s veut neutraliser les raccourcis" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "L’application veut neutraliser les raccourcis" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Pour restaurer les raccourcis, appuyez sur %s." + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "Refuser" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "Autoriser" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Touches lentes activées" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Touches lentes désactivées" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Vous venez d’appuyer pendant 8 secondes sur la touche Maj. Ceci est le " +"raccourci d’activation des touches lentes et affecte la façon dont votre " +"clavier réagit." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Touches rémanentes activées" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Touches rémanentes désactivées" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Vous venez d’appuyer 5 fois de suite sur la touche Maj. Ceci est le " +"raccourci d’activation des touches rémanentes et affecte la façon dont votre " +"clavier réagit." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Vous venez d’appuyer sur deux touches en même temps, ou 5 fois de suite sur " +"la touche Maj. Ceci désactive la fonction touches rémanentes et affecte la " +"façon dont votre clavier réagit." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Laisser activé" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Activer" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Éteindre" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Laisser éteint" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "Paramètres de langue et région" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Aucune extension installée" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s n’a émis aucune erreur." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Masquer les erreurs" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Afficher les erreurs" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Activé" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Désactivé" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Erreur" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Périmé" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Téléchargement" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Afficher la source" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Page Web" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Informations du système" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Artiste inconnu" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Titre inconnu" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volume" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Annuler" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Vue d’ensemble" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Rechercher…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Nouveau raccourci…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Applications définies" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Afficher l’aide à l’écran" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Changer d’écran" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Associer une touche" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Terminé" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Édition…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Aucun" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Appuyez sur un bouton pour le configurer" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Appuyez sur Échap pour quitter" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Appuyez sur une touche pour quitter" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Quitter" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Activités" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Système" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "Barre supérieure" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Saisissez une commande" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Fermer" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Le redémarrage n’est pas disponible sur Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Redémarrage…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nouveau message" +msgstr[1] "%d nouveaux messages" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nouvelle notification" +msgstr[1] "%d nouvelles notifications" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Verrouiller" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME a besoin de verrouiller l’écran" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Impossible de verrouiller" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Le verrouillage a été bloqué par une application" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Recherche…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Aucun résultat." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d de plus" +msgstr[1] "%d de plus" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Copier" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Coller" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Afficher le texte" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Masquer le texte" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Mot de passe" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Se souvenir du mot de passe" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Accessibilité" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zoom" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Lecteur d’écran" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Clavier visuel" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Alertes visuelles" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Touches rémanentes" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Touches lentes" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Touches rebond" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Touches de la souris" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Contraste élevé" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Grand texte" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Paramètres Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d connecté" +msgstr[1] "%d connectés" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Éteint" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Actif" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Luminosité" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Clavier" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Afficher la disposition du clavier" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Localisation activée" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Désactiver" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Paramètres de confidentialité" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Localisation en cours d’utilisation" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Localisation désactivée" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Activer" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Donner accès à votre position à %s ?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Les règles d’accès à la localisation peuvent à tout moment être modifiées " +"dans les paramètres de confidentialité." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s éteint" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s connecté" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s non géré" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Déconnexion de %s en cours" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "Connexion de %s en cours" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "Authentification nécessaire pour %s" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Micrologiciel manquant pour %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s non disponible" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Échec de connexion à %s" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Paramètres filaire" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Paramètres connexion mobile" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Équipement %s désactivé" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s désactivé" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Se connecter à Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Le mode avion est activé" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Le Wi-Fi est désactivé quand le mode avion est activé." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Désactiver le mode avion" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Le Wi-Fi est désactivé" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Le Wi-Fi a besoin d’être activé pour se connecter à un réseau." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Activer le Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Réseaux Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Choisir un réseau" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Aucun réseau disponible" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Utiliser l’interrupteur matériel pour éteindre" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Sélectionner un réseau" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Paramètres Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Point d’accès %s actif" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s non connecté" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "connexion…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "authentification nécessaire" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "échec de connexion" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "Paramètres VPN" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN désactivé" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Paramètres du réseau" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s connexion filaire." +msgstr[1] "%s connexions filaires." + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s connexion Wi-Fi." +msgstr[1] "%s connexions Wi-Fi." + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s connexion à un modem." +msgstr[1] "%s connexions à des modems." + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "Échec de connexion" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "L’activation de la connexion réseau a échoué" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Mode nuit désactivé" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Mode nuit activé" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Reprendre" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Désactiver jusqu’à demain" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Paramètres de gestion de l’énergie" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Charge complète" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Pas en charge" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Estimation en cours…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d restant (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d avant chargement complet (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "L’écran est partagé" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Éteindre" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Mode avion activé" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Changer d’utilisateur" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Fermer la session" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Paramètres du compte" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Verrouillage de l’orientation" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Mettre en veille" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Éteindre" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Interface Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Périphérique Thunderbolt inconnu" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Un nouveau périphérique a été détecté pendant votre absence. Veuillez le " +"débrancher et rebrancher avant de commencer à l’utiliser." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Périphérique Thunderbolt non autorisé" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Un nouvel appareil a été détecté et a besoin d’être autorisé par un " +"administrateur." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Erreur d’autorisation Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Impossible d’autoriser le périphérique Thunderbolt : %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volume modifié" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Cloner" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Joindre écrans" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Externe seulement" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Intégré seulement" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Se connecter en tant qu’autre utilisateur" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Fenêtre de déverrouillage" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Applications" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Recherche" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "« %s » est prêt" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Voulez-vous conserver ces paramètres d’affichage ?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Restaurer les paramètres" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Conserver les modifications" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Les paramètres seront restaurés dans %d seconde" +msgstr[1] "Les paramètres seront restaurés dans %d secondes" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimiser" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Réduire" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximiser" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Déplacer" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Redimensionner" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Déplacer la barre de titre sur l’écran" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Toujours au premier plan" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Toujours sur l’espace de travail visible" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Déplacer vers l’espace de travail de gauche" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Déplacer vers l’espace de travail de droite" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Déplacer vers l’espace de travail supérieur" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Déplacer vers l’espace de travail inférieur" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Déplacer vers l’écran du haut" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Déplacer vers l’écran du bas" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Déplacer vers l’écran de gauche" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Déplacer vers l’écran de droite" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Agenda d’Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Affiche la version" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Mode utilisé par GDM pour l’écran de connexion" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "" +"Utiliser un mode particulier, par ex. « gdm » pour l’écran de connexion" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Lister les modes possibles" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "Inconnu" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Impossible de lancer « %s »" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Les mots de passe ne correspondent pas." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Le mot de passe ne peut pas être vide" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "La fenêtre d’authentification a été écartée par l’utilisateur" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u sortie" +msgstr[1] "%u sorties" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrée" +msgstr[1] "%u entrées" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Sons système" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Éteindre" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Fermer la session" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Changer d’utilisateur" diff --git a/po/fur.po b/po/fur.po new file mode 100644 index 0000000..e5e7440 --- /dev/null +++ b/po/fur.po @@ -0,0 +1,2485 @@ +# Friulian translation for video-subtitles. +# Copyright (C) 2016 video-subtitles's COPYRIGHT HOLDER +# This file is distributed under the same license as the video-subtitles package. +# Fabio Tomat , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: video-subtitles master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-05 11:40+0000\n" +"PO-Revision-Date: 2019-02-05 15:59+0100\n" +"Last-Translator: Fabio Tomat \n" +"Language-Team: Friulian \n" +"Language: fur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sisteme" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Mostre la liste des notifichis" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Met il focus ae notifiche ative" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Mostre la panoramiche" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Mostre dutis lis aplicazions" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Vierç il menù aplicazions" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:221 +msgid "Shell Extensions" +msgstr "Estensions Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configure lis estensions di GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gjestion barcons e inviament aplicazions" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Abilite i struments internis utii pai svilupadôrs e beta-tester vie Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permet l'acès ai struments internis di debug e di analisi doprant il dialic " +"ALT-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID des estensions di abilitâ" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Lis estensions par GNOME Shell a àn une proprietât UUID: cheste clâf a met " +"in liste lis estensions di cjamâ. Si scugne meti in cheste liste dutis lis " +"estensions che si vûl di cjariâ. Al è pussibil ancje modificâ cheste liste " +"cun la modalitât DBus EnableExtension e DisableExtension su org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Disabilite lis estensions dal utent" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Disabilite dutis lis estensions che l'utent al à abilitât cence vê " +"interessât la impostazion “enabled-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Disabilite la convalide de compatibilitât di version des estensions" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell al cjarie nome lis estensions che a disin di supuartâ la version " +"di GNOME Shell atualmentri in esecuzion. Abilitant cheste opzion il control " +"nol vignarà plui fat e al cirarà di cjariâ dutis lis estensions ignorant la " +"version che a disin di supuartâ." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Liste di ID di file dal scritori par lis aplicazions preferidis" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Lis aplicazions che a corispuindin a chescj identificadôrs a vignaran " +"mostrâts te aree dai preferîts." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Viodude seletôr app" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indiç de viodude cumò selezionade tal seletôr di aplicazions." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Storic comants pal dialic dai comants (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Storic pal dialic looking glass" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Mostre simpri l'element “Jes” tal menu dal utent." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Cheste clâf a anule il platâ automatic de vôs di menù “Jes” cuant che si è " +"te modalitât ugnul-utent, ugnule-session." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Specifiche se visâsi la password par montâ i filesystem rimots o cifrâts" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"La shell e domandarà une password cuant che un dispositîf cifrât o un " +"filesystem rimot al ven montât. Se le password e pues jessi salvade par un " +"ûs futûr, une casele di selezion “Visasi Password” e sarà presinte. Cheste " +"clâf e stabilìs il valôr predefinît di cheste casele di selezion." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Indiche se il dispositîf Bluetooth predefinît al à vût dispositîfs associâts" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"La shell e mostrarà un menù Bluetooth nome se un adatatôr Bluetooth al è " +"alimentât, o se a son dispositîfs configurâts e associâts cul adatatôr " +"predefinît. Chest al vignarà azerât se l'adatatôr predefinît nol à mai vût " +"dispositîfs associâts." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Abilite la API di introspezion" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Al abilite une API di D-Bus che e permet la introspezion dal stât de " +"aplicazion de shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Tast rapit associât par vierzi il menù des aplicazions" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Tast rapit associât par vierzi il menù des aplicazions." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Cumbinazion di tascj par vierzi la visuâl “Mostre Aplicazions”" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Cumbinazion di tascj par vierzi la visuâl “Mostre Aplicazions” inte " +"Panoramiche Ativitâts." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Tast rapit associât par vierzi la panoramiche" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Tast rapit associât par vierzi la visuâl Panoramiche Ativitâts." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Associazion tascj par cambiâ la visibilitât de liste des notifichis" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Associazion tascj par cambiâ la visibilitât de liste des notifichis." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Tast rapit associât par meti a fûc la notifiche ative" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Tast rapit associât par meti a fûc la notifiche ative." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Associazion di tascj par meti in pause e ripiâ ducj i tween in esecuzion, " +"par motîfs di debug" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Passe ae aplicazion 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Passe ae aplicazion 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Passe ae aplicazion 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Passe ae aplicazion 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Passe ae aplicazion 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Passe ae aplicazion 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Passe ae aplicazion 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Passe ae aplicazion 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Passe ae aplicazion 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Cuale tastiere doprâ" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Il stamp di tastiere di doprâ." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limite il seletôr al spazi di lavôr in ûs." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Se vêr, nome lis aplicazions che a àn barcons tal spazi di lavôr curint a " +"son mostrâts tal seletôr. Se no, dutis lis aplicazions a vegnin includudis." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "La modalitât de icone de aplicazion." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configure cemût che i barcons a saran viodûts intal scambiadôr. Lis " +"pussibilitâts validis a son “thumbnail-only” (al mostre une anteprime dal " +"barcon), “app-icon-only” (al mostre nome la icone de aplicazion) o " +"“both” (al mostre ducj e doi)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Se vêr, nome i barcons dal spazi di lavôr curint a vegnin mostrâts intal " +"seletôr. Se no, ducj i barcons a vegnin includûts." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Lee il barcon modâl al barcon gjenitôr" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Cheste clâf e sorplante chê in org.gnome.mutter cuant che al è in esecuzion " +"GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Abilite la tasseladure sul ôr cuant che si strissine i barcons tal ôr dal " +"visôr" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "I spazis di vore a son ministrât in maniere dinamiche" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Spazis di lavôr dome sul visôr principâl" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Tardâ il cambiament dal focus te modalitât mouse fintant che il pontadôr no " +"si ferme" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Acès di rêt" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:121 +msgid "Something’s gone wrong" +msgstr "Alc al è lât stuart" + +#: js/extensionPrefs/main.js:128 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Si scusin, ma si à vût un probleme: lis impostazions par cheste estension no " +"puedin jessi mostradis. Si consee di segnalâ il probleme ai autôrs de " +"estension." + +#: js/extensionPrefs/main.js:135 +msgid "Technical Details" +msgstr "Detais tecnics" + +#: js/extensionPrefs/main.js:170 +msgid "Copy Error" +msgstr "Copie erôr" + +#: js/extensionPrefs/main.js:190 +msgid "Homepage" +msgstr "Pagjine principâl" + +#: js/extensionPrefs/main.js:191 +msgid "Visit extension homepage" +msgstr "Visite la pagjine principâl de estension" + +#: js/extensionPrefs/main.js:454 +msgid "No Extensions Installed" +msgstr "Nissune estension instalade" + +#: js/extensionPrefs/main.js:464 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Si puedin instalâ lis estension cun Software o cun extensions.gnome.org." + +#: js/extensionPrefs/main.js:479 +msgid "Browse in Software" +msgstr "Esplore in Software" + +#: js/gdm/authPrompt.js:143 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:437 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:330 js/ui/status/network.js:894 +msgid "Cancel" +msgstr "Anule" + +#: js/gdm/authPrompt.js:162 js/gdm/authPrompt.js:205 js/gdm/authPrompt.js:437 +msgid "Next" +msgstr "Indenant" + +#: js/gdm/authPrompt.js:201 js/ui/shellMountOperation.js:334 +#: js/ui/unlockDialog.js:55 +msgid "Unlock" +msgstr "Sbloche" + +#: js/gdm/authPrompt.js:203 +msgctxt "button" +msgid "Sign In" +msgstr "Jentre" + +#: js/gdm/loginDialog.js:311 +msgid "Choose Session" +msgstr "Selezione Session" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:454 +msgid "Not listed?" +msgstr "No in liste?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(p.e., utent o %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Non utent:" + +#: js/gdm/loginDialog.js:1231 +msgid "Login Window" +msgstr "Barcon di acès" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "Erôr di autenticazion" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(o passe cul dêt)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "Distudâ" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +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:101 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Bloc schermi" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:104 +msgid "lock screen" +msgstr "bloc schermi" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "Jessî" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "jessî;sierâ session" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "Sospindi" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "sospindi;polse" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +msgid "Switch User" +msgstr "Cambi Utent" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:125 +msgid "switch user" +msgstr "cambiâ utent" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Bloc orientament" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:132 +msgid "lock orientation;screen;rotation" +msgstr "bloc orientament;schermi;rotazion" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Comant no cjatât" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Impussibil analizâ il comant:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Esecuzion di '%s' falide:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Propite cumò" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minût indaûr" +msgstr[1] "%d minûts indaûr" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ore indaûr" +msgstr[1] "%d oris indaûr" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Îr" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d zornade indaûr" +msgstr[1] "%d zornadis indaûr" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d setemane indaûr" +msgstr[1] "%d setemanis indaûr" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d mês indaûr" +msgstr[1] "%d mês indaûr" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d an indaûr" +msgstr[1] "%d agns indaûr" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Îr, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d di %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d di %B dal %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%I∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Îr, %I∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %I∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d di %B, %I∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d di %B dal %Y, %I∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "Acès Hotspot" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"La tô conession a chest acès hotspot no je sigure. Lis password o altris " +"informazions che tu inserirâs su cheste pagjine e podaran jessi viodudis des " +"personis chi ator." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "Dinee acès" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "Garantìs l'acès" + +#: js/ui/appDisplay.js:780 +msgid "Frequently used applications will appear here" +msgstr "Lis aplicazions dopradis dispès a vignaran mostradis culì" + +#: js/ui/appDisplay.js:895 +msgid "Frequent" +msgstr "Dispès" + +#: js/ui/appDisplay.js:902 +msgid "All" +msgstr "Dutis" + +#: js/ui/appDisplay.js:1857 +msgid "New Window" +msgstr "Gnûf barcon" + +#: js/ui/appDisplay.js:1871 +msgid "Launch using Dedicated Graphics Card" +msgstr "Invie doprant une schede grafiche dedicade" + +#: js/ui/appDisplay.js:1898 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "Gjave dai preferîts" + +#: js/ui/appDisplay.js:1904 +msgid "Add to Favorites" +msgstr "Zonte tai preferîts" + +#: js/ui/appDisplay.js:1914 +msgid "Show Details" +msgstr "Mostre Detais" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s al è stât zontât tai tiei preferîts." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s al è stât gjavât dai tiei preferîts." + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "Selezione dispositîf sonôr" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "Impostazions suns" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "Cufis" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "Cufis cun microfon" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "Microfon" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "Cambie sfont…" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Impostazions visôr" + +#: js/ui/backgroundMenu.js:18 +msgid "Settings" +msgstr "Impostazions" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:42 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:71 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:73 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:75 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:77 +msgctxt "grid wednesday" +msgid "W" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:79 +msgctxt "grid thursday" +msgid "T" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:81 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:83 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:346 +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:356 +msgid "%OB %Y" +msgstr "%OB dal %Y" + +#: js/ui/calendar.js:413 +msgid "Previous month" +msgstr "Mês indaûr" + +#: js/ui/calendar.js:424 +msgid "Next month" +msgstr "Prossim mês" + +#: js/ui/calendar.js:578 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:633 +msgid "Week %V" +msgstr "Setemane %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:701 +msgctxt "event list time" +msgid "All Day" +msgstr "Dut il dì" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d di %B" + +#: js/ui/calendar.js:837 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d di %B dal %Y" + +#: js/ui/calendar.js:1060 +msgid "No Notifications" +msgstr "Nissune notifiche" + +#: js/ui/calendar.js:1063 +msgid "No Events" +msgstr "Nissun event" + +#: js/ui/calendar.js:1089 +msgid "Clear" +msgstr "Nete" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” nol rispuint." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Si pues sielzi di spietâ un tic che al continui o sfuarçâ la aplicazion a " +"jessî dal dut." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Sfuarce jessude" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Spiete" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "Dispositîf esterni tacât" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Dispositîf esterni distacât" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "Vierç cun %s" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "Password:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "Scîf di gnûf:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"In alternative al è pussibil conetisi fracant il boton “WPS” sul router." + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:225 +#: js/ui/status/network.js:315 js/ui/status/network.js:897 +msgid "Connect" +msgstr "Conet" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Password: " + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "Clâf:" + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Password di clâf privade:" + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Identitât:" + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Servizi:" + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "La rêt cence fîl e domande autenticazion" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +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:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "Autenticazion vie fîl 802.1X" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Non rêt:" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "Autenticazion DSL" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "Si pretint un codiç PIN" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "Passowrd rêt mobil a bande largje" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, 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:682 js/ui/status/network.js:1671 +msgid "Network Manager" +msgstr "Ministradôr di rêt" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "Autenticazion Necessarie" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "Aministradôr" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "Autentiche" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:314 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Mi displâs, no je lade drete. Prove di gnûf." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:785 +#, javascript-format +msgid "%s is now known as %s" +msgstr "L'utent %s al è cognossût cumò come %s" + +#: js/ui/ctrlAltTab.js:25 js/ui/viewSelector.js:176 +msgid "Windows" +msgstr "Barcons" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +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:397 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:74 +msgid "%B %-d %Y" +msgstr "%-d di %B dal %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %e di %B dal %Y" + +#: js/ui/dateMenu.js:143 +msgid "Add world clocks…" +msgstr "Zonte orlois mondiâi…" + +#: js/ui/dateMenu.js:144 +msgid "World Clocks" +msgstr "Orlois mondiâi" + +#: js/ui/dateMenu.js:234 +msgid "Weather" +msgstr "Timp" + +#: js/ui/dateMenu.js:317 +msgid "Select a location…" +msgstr "Selezione une posizion…" + +#: js/ui/dateMenu.js:325 +msgid "Loading…" +msgstr "Daûr a cjariâ…" + +#: js/ui/dateMenu.js:335 +msgid "Go online for weather information" +msgstr "Va in rêt pes informazions sul timp" + +#: js/ui/dateMenu.js:337 +msgid "Weather information is currently unavailable" +msgstr "Lis informazions sul timp al moment no son disponibilis" + +#: js/ui/endSessionDialog.js:49 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Termine session di %s" + +#: js/ui/endSessionDialog.js:50 +msgctxt "title" +msgid "Log Out" +msgstr "Termine session" + +#: js/ui/endSessionDialog.js:52 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s al jessarà in automatic chi di %d secont." +msgstr[1] "%s al jessarà in automatic chi di %d seconts." + +#: js/ui/endSessionDialog.js:57 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Tu jessarâs in automatic chi di %d secont." +msgstr[1] "Tu jessarâs in automatic chi di %d seconts." + +#: js/ui/endSessionDialog.js:63 +msgctxt "button" +msgid "Log Out" +msgstr "Jes" + +#: js/ui/endSessionDialog.js:69 +msgctxt "title" +msgid "Power Off" +msgstr "Distude" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instale inzornaments e distude" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Il sisteme si distudarà in automatic chi di %d secont." +msgstr[1] "Il sisteme si studarà in automatic chi di %d seconts." + +#: js/ui/endSessionDialog.js:76 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instale i inzornaments software in spiete" + +#: js/ui/endSessionDialog.js:79 js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Restart" +msgstr "Torne invie" + +#: js/ui/endSessionDialog.js:81 +msgctxt "button" +msgid "Power Off" +msgstr "Distude" + +#: js/ui/endSessionDialog.js:88 +msgctxt "title" +msgid "Restart" +msgstr "Torne invie" + +#: js/ui/endSessionDialog.js:90 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Il sisteme si tornarà a inviâ in automatic chi di %d secont." +msgstr[1] "Il sisteme si tornarà a inviâ in automatic chi di %d secont." + +#: js/ui/endSessionDialog.js:104 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Torne a inviâ e instale inzornaments" + +#: js/ui/endSessionDialog.js:106 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Il sisteme al tornarà a inviâsi in automatic instalant i inzornaments chi di " +"%d secont." +msgstr[1] "" +"Il sisteme al tornarà a inviâsi in automatic instalant i inzornaments chi di " +"%d seconts." + +#: js/ui/endSessionDialog.js:112 js/ui/endSessionDialog.js:132 +msgctxt "button" +msgid "Restart & Install" +msgstr "Torne invie e instale" + +#: js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instale e distude" + +#: js/ui/endSessionDialog.js:114 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Distude dopo vê instalât i inzornaments" + +#: js/ui/endSessionDialog.js:122 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Torne invie e instale avanzament" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:127 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s al vignarà instalât dopo vê tornât a inviâ il computer. La instalazion " +"dal avanzament e pues tirâ a dilunc: siguriti di vê fat i backup e che il to " +"computer al sedi tacât." + +#: js/ui/endSessionDialog.js:316 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Funzionament su batarie: par plasê tache la spine prime di instalâ i " +"inzornaments." + +#: js/ui/endSessionDialog.js:333 +msgid "Some applications are busy or have unsaved work." +msgstr "Cualchi aplicazion e je impegnade opûr e à lavôrs no salvâts." + +#: js/ui/endSessionDialog.js:340 +msgid "Other users are logged in." +msgstr "Altris utents a son jentrâts." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:621 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (rimot)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:624 +#, javascript-format +msgid "%s (console)" +msgstr "%s (locâl vie tastiere)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "Instale" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Scjariâ e instalâ '%s' da extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s al desidere inibî lis scurtis" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "Une aplicazion e desidere inibî lis scurtis" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Si pues ripristinâ lis scurtis fracant %s." + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "Dinee" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "Pemet" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "Tascj lents ativâts" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "Tascj lents disativâts" + +#: js/ui/kbdA11yDialog.js:34 +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:41 +msgid "Sticky Keys Turned On" +msgstr "Tascj tacadiçs ativâts" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "Tascj tacadiçs disativâts" + +#: js/ui/kbdA11yDialog.js:44 +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:46 +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:58 +msgid "Leave On" +msgstr "Lasse ativât" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1270 +msgid "Turn On" +msgstr "Impie" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:134 js/ui/status/network.js:316 +#: js/ui/status/network.js:1270 js/ui/status/network.js:1382 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Distude" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "Lasse disativât" + +#: js/ui/keyboard.js:190 +msgid "Region & Language Settings" +msgstr "Impostazions regjon e lenghe" + +#: js/ui/lookingGlass.js:627 +msgid "No extensions installed" +msgstr "Nissune estension instalade" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:681 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nol a dât fûr nissun erôr." + +#: js/ui/lookingGlass.js:687 +msgid "Hide Errors" +msgstr "Tapone Erôrs" + +#: js/ui/lookingGlass.js:691 js/ui/lookingGlass.js:751 +msgid "Show Errors" +msgstr "Mostre Erôrs" + +#: js/ui/lookingGlass.js:700 +msgid "Enabled" +msgstr "Abilitât" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:703 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Disabilitât" + +#: js/ui/lookingGlass.js:705 +msgid "Error" +msgstr "Erôr" + +#: js/ui/lookingGlass.js:707 +msgid "Out of date" +msgstr "No inzornât" + +#: js/ui/lookingGlass.js:709 +msgid "Downloading" +msgstr "Daur a scjamâ" + +#: js/ui/lookingGlass.js:733 +msgid "View Source" +msgstr "Viôt sorzint" + +#: js/ui/lookingGlass.js:742 +msgid "Web Page" +msgstr "Pagjine Web" + +#: js/ui/messageTray.js:1483 +msgid "System Information" +msgstr "Informazion di sisteme" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "Artist no cognossût" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "Titul no cognossût" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "Volum" + +#: js/ui/overview.js:78 +msgid "Undo" +msgstr "Anule" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:105 +msgid "Overview" +msgstr "Panoramiche" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:231 +msgid "Type to search…" +msgstr "Scrîf par cirî…" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "Gnove scurte…" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "Aplicazion definide" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "Mostre jutori a schermi" + +#: js/ui/padOsd.js:153 +msgid "Switch monitor" +msgstr "Cambie visôr" + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "Assegne batidure" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "Fat" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "Modifiche…" + +# masculin o feminin +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "Nissune" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "Frache un boton par configurâ" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "Frache Esc par jessî" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "Frache un tast par jessî" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Jes" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:410 +msgid "Activities" +msgstr "Ativitâts" + +#: js/ui/panel.js:685 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sisteme" + +#: js/ui/panel.js:808 +msgid "Top Bar" +msgstr "Sbare parsore" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Scrîf un comant" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:169 +msgid "Close" +msgstr "Siere" + +# torne invie o torne tache +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "Il tornâ a tacâ nol è disponibil in Wayland" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "Daûr a tornâ a inviâ…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %d di %B" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d gnûf messaç" +msgstr[1] "%d gnûfs messaçs" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d gnove notifiche" +msgstr[1] "%d gnovis modifichis" + +#: js/ui/screenShield.js:458 js/ui/status/system.js:291 +msgid "Lock" +msgstr "Bloche" + +#: js/ui/screenShield.js:722 +msgid "GNOME needs to lock the screen" +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 +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:843 js/ui/screenShield.js:1316 +msgid "Unable to lock" +msgstr "Impussibil blocâ" + +#: js/ui/screenShield.js:844 js/ui/screenShield.js:1317 +msgid "Lock was blocked by an application" +msgstr "Il bloc al è stât dineât di une aplicazion" + +#: js/ui/search.js:644 +msgid "Searching…" +msgstr "Daûr a cirî…" + +#: js/ui/search.js:646 +msgid "No results." +msgstr "Nissun risultât." + +# o ancjemò %d +#: js/ui/search.js:770 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d altri" +msgstr[1] "%d altris" + +#: js/ui/shellEntry.js:20 +msgid "Copy" +msgstr "Copie" + +#: js/ui/shellEntry.js:25 +msgid "Paste" +msgstr "Tache" + +#: js/ui/shellEntry.js:91 +msgid "Show Text" +msgstr "Mostre Test" + +#: js/ui/shellEntry.js:93 +msgid "Hide Text" +msgstr "Plate Test" + +#: js/ui/shellMountOperation.js:301 +msgid "Password" +msgstr "Password" + +#: js/ui/shellMountOperation.js:322 +msgid "Remember Password" +msgstr "Visâsi Password" + +#: js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Acessibilitât" + +#: js/ui/status/accessibility.js:54 +msgid "Zoom" +msgstr "Ingrandiment" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Reader" +msgstr "Letôr schermi" + +#: js/ui/status/accessibility.js:65 +msgid "Screen Keyboard" +msgstr "Tastiere a Visôr" + +#: js/ui/status/accessibility.js:69 +msgid "Visual Alerts" +msgstr "Avertencis Visuâi" + +#: js/ui/status/accessibility.js:72 +msgid "Sticky Keys" +msgstr "Tascj tacadiçs" + +#: js/ui/status/accessibility.js:75 +msgid "Slow Keys" +msgstr "Tascj Lents" + +#: js/ui/status/accessibility.js:78 +msgid "Bounce Keys" +msgstr "Tascj che si sbalcin" + +#: js/ui/status/accessibility.js:81 +msgid "Mouse Keys" +msgstr "Mouse di tastiere" + +#: js/ui/status/accessibility.js:155 +msgid "High Contrast" +msgstr "Contrast elevât" + +#: js/ui/status/accessibility.js:186 +msgid "Large Text" +msgstr "Test Larc" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:591 +msgid "Bluetooth Settings" +msgstr "Impostazions Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d tacât" +msgstr[1] "%d tacâts" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "Distudât" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "Impiât" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "Luminositât" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "Tastiere" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "Mostre la disposizion de tastiere" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "Posizion abilitade" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "Disabilite" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "Impostazions privacy" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "Posizion in ûs" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "Posizion no abilitade" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "Abilite" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Permeti a %s di cognossi la tô posizion?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"L'acès ae posizion al pues jessi cambiât cuant che tu vuelis su impostazions " +"privacy." + +#: js/ui/status/network.js:72 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:422 js/ui/status/network.js:1299 +#, javascript-format +msgid "%s Off" +msgstr "%s distudât" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:425 +#, javascript-format +msgid "%s Connected" +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:430 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s no ministrât" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:433 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s daûr a disconeti" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:440 js/ui/status/network.js:1291 +#, 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:443 +#, 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:451 +#, 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:455 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s no disponibil" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:458 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Conession falide su %s" + +#: js/ui/status/network.js:470 +msgid "Wired Settings" +msgstr "Impostazions rêt vie fîl" + +#: js/ui/status/network.js:512 +msgid "Mobile Broadband Settings" +msgstr "Impostazions bande largje mobil" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:559 js/ui/status/network.js:1296 +#, 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:563 +#, javascript-format +msgid "%s Disabled" +msgstr "%s disabilitât" + +#: js/ui/status/network.js:603 +msgid "Connect to Internet" +msgstr "Conet a internet" + +#: js/ui/status/network.js:792 +msgid "Airplane Mode is On" +msgstr "Modalitât avion piade" + +#: js/ui/status/network.js:793 +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:794 +msgid "Turn Off Airplane Mode" +msgstr "Distude modalitât avion" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is Off" +msgstr "Il Wi-Fi al è distudât" + +#: js/ui/status/network.js:804 +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:805 +msgid "Turn On Wi-Fi" +msgstr "Impie il Wi-Fi" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi Networks" +msgstr "Rêts Wi-Fi" + +#: js/ui/status/network.js:832 +msgid "Select a network" +msgstr "Selezione une rêt" + +#: js/ui/status/network.js:861 +msgid "No Networks" +msgstr "Nissune rêt" + +#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Dopre interutôr fisic par distudâ" + +#: js/ui/status/network.js:1158 +msgid "Select Network" +msgstr "Selezione rêt" + +#: js/ui/status/network.js:1164 +msgid "Wi-Fi Settings" +msgstr "Impostazions Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1287 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspot %s atîf" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s distacât" + +#: js/ui/status/network.js:1399 +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:1402 +msgid "authentication required" +msgstr "autenticazion necessarie" + +#: js/ui/status/network.js:1404 +msgid "connection failed" +msgstr "conession falide" + +#: js/ui/status/network.js:1454 +msgid "VPN Settings" +msgstr "Impostazions VPN" + +#: js/ui/status/network.js:1471 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1481 +msgid "VPN Off" +msgstr "VPN distudât" + +#: js/ui/status/network.js:1542 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Impostazions rêt" + +#: js/ui/status/network.js:1571 +#, 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:1575 +#, 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:1579 +#, 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:1708 +msgid "Connection failed" +msgstr "Conession falide" + +#: js/ui/status/network.js:1709 +msgid "Activation of network connection failed" +msgstr "Ativazion de conession di rêt falide" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Lûs noturne disabilitade" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Lûs noturne impiade" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Ripie" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Disabilite fintremai doman" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "Impostazions di alimentazion" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "Cjarie" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "Nol sta cjariant" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "In stime…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "A restin %d∶%02d (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d par jessi plene (%d%%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Il schermi al è condividût" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Distude" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Modalitât Avion ative" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "Cambie Utent" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "Jes" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "Impostazions account" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "Bloc Orientament" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "Sospindi" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "Distude" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "Dispositîf Thunderbolt no cognossût" + +#: js/ui/status/thunderbolt.js:326 +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:329 +msgid "Unauthorized Thunderbolt device" +msgstr "Dispositîf Thunderbolt cence autorizazion" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Al è stât cjatât un gnûf dispositîf e al covente jessi autorizâts di un " +"aministradôr." + +#: 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:136 +msgid "Volume changed" +msgstr "Volum modificât" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "Sdopleâ" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "Unìs schermis" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "Dome esterni" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "Dome incorporât" + +#: js/ui/unlockDialog.js:63 +msgid "Log in as another user" +msgstr "Jentre come altri utent" + +#: js/ui/unlockDialog.js:80 +msgid "Unlock Window" +msgstr "Sbloche barcon" + +#: js/ui/viewSelector.js:180 +msgid "Applications" +msgstr "Aplicazions" + +#: js/ui/viewSelector.js:184 +msgid "Search" +msgstr "Cîr" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” al è pront" + +#: js/ui/windowManager.js:60 +msgid "Do you want to keep these display settings?" +msgstr "Vûstu tignî chestis impostazions di visôr?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:72 +msgid "Revert Settings" +msgstr "Ripristine impostazions" + +#: js/ui/windowManager.js:75 +msgid "Keep Changes" +msgstr "Ten lis modifichis" + +#: js/ui/windowManager.js:93 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "" +"Lis modifichis as impostazions a vignaran ripristinadis chi di %d secont" +msgstr[1] "" +"Lis modifichis as impostazions a vignaran ripristinadis chi di %d seconts" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:669 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:29 +msgid "Minimize" +msgstr "Minimize" + +#: js/ui/windowMenu.js:36 +msgid "Unmaximize" +msgstr "Gjave slargjament" + +#: js/ui/windowMenu.js:40 +msgid "Maximize" +msgstr "Slargje" + +#: js/ui/windowMenu.js:47 +msgid "Move" +msgstr "Sposte" + +#: js/ui/windowMenu.js:53 +msgid "Resize" +msgstr "Ridimensione" + +#: js/ui/windowMenu.js:60 +msgid "Move Titlebar Onscreen" +msgstr "Môf la sbare dal titul a schermi" + +#: js/ui/windowMenu.js:65 +msgid "Always on Top" +msgstr "Simpri Denant" + +#: js/ui/windowMenu.js:84 +msgid "Always on Visible Workspace" +msgstr "Simpri sul spazi di lavôr visibil" + +#: js/ui/windowMenu.js:98 +msgid "Move to Workspace Left" +msgstr "Sposte tal spazi di lavôr a çampe" + +#: js/ui/windowMenu.js:104 +msgid "Move to Workspace Right" +msgstr "Sposte tal spazi di lavôr a drete" + +#: js/ui/windowMenu.js:110 +msgid "Move to Workspace Up" +msgstr "Sposte tal spazi di lavôr Parsore" + +#: js/ui/windowMenu.js:116 +msgid "Move to Workspace Down" +msgstr "Sposte tal spazi di lavôr Disot" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Sposte tal visôr parsore" + +#: js/ui/windowMenu.js:143 +msgid "Move to Monitor Down" +msgstr "Sposte tal visôr disot" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Left" +msgstr "Sposte tal visôr a çampe" + +#: js/ui/windowMenu.js:161 +msgid "Move to Monitor Right" +msgstr "Sposte tal visôr a drete" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendari di Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Stampe version" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Modalitât doprade da GDM pe videade di acès" + +#: src/main.c:420 +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:426 +msgid "List possible modes" +msgstr "Liste modalitâts pussibilis" + +#: src/shell-app.c:266 +msgctxt "program" +msgid "Unknown" +msgstr "No cognossût" + +#: src/shell-app.c:517 +#, c-format +msgid "Failed to launch “%s”" +msgstr "No soi rivât a eseguî '%s'" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Lis password no corispuindin." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "La password no pues jessi vueide" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Dialic di autenticazion anulât dal utent" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u jessude" +msgstr[1] "%u jessudis" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u jentrade" +msgstr[1] "%u jentradis" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Suns di sisteme" + +#~ msgid "%s all day." +#~ msgstr "%s dut il dì." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, plui tart %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, chi di un pôc %s, e plui tart %s." + +#~ msgid "Feels like %s." +#~ msgstr "Si sintin %s." + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "" +#~ "Al è vignût fûr un erôr cuant che si cjamave il dialic des preferencis " +#~ "par %s:" + +#~ 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" + +#~ msgid "Status Icons" +#~ msgstr "Iconis di stât" + +#~ msgid "Events" +#~ msgstr "Events" + +#~ msgid "Notifications" +#~ msgstr "Notifichis" + +#~ msgid "Clear section" +#~ msgstr "Nete la sezion" + +#~ msgid "Media" +#~ msgstr "Supuart" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferencis Estensions di GNOME Shell" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Indreçament pe autenticazion web" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Not In Use" +#~ msgstr "No in ûs" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Mostre il dì de setemane tal calendari" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Se VÊR, al mostre la date ISO de setemane tal calendari." + +#~ msgid "Use as Internet connection" +#~ msgstr "Dopre come conession internet" + +#~ msgid "GNOME Delivers a full desktop experience" +#~ msgstr "GNOME al da fûr une esperience di scritori complete " + +#~ msgid "Part of this means making it easy for users.." +#~ msgstr "Part di chest al significhe rindi facil pai utents.." + +#~ msgid "..to explore new features and workflows." +#~ msgstr "..esplorâ gnovis carateristichis e flus di lavôr." + +#~ msgid "This is where GNOME Help comes into the picture." +#~ msgstr "Chest al è dulà che Jutori di GNOME al jentre in sene." + +#~ msgid "Need to know the keyboard shortcuts of gedit?" +#~ msgstr "Covential savê lis scurtis de tastiere di gedit?" + +#~ msgid "GNOME Help lets you explore them easily through its interface." +#~ msgstr "" +#~ "Il Jutori di GNOME ti permet di esplorâju in mût facil cun la sô " +#~ "interface." + +#~ msgid "Want to know what documents have to offer?" +#~ msgstr "Vûstu cognossi ce che documents al à di ufrî?" + +#~ msgid "Press F1 and you can get an overview of.." +#~ msgstr "Frache F1 e tu puedis vê une panoramiche des.." + +#~ msgid "..Documents' features at a glance." +#~ msgstr "..carateristichis di Documents cuntune cucade." + +#~ msgid "GNOME Help is your offline assistant.." +#~ msgstr "Jutori di GNOME al è il to assistent fûr linie.." + +#~ msgid "..ready to lend a hand with any application adventure you may take." +#~ msgstr "..pront par dâti une man cun cualsisei aplicazion che ti covente." + +#~ msgid "The documentation is there to help you speed up.." +#~ msgstr "La documentazion e je lì par judâ a niçâti.." + +#~ msgid "..and get work done." +#~ msgstr "..e finî il lavôr." + +#~ msgid "Similarly, the GNOME project aims to provide good documentation.." +#~ msgstr "" +#~ "Te stesse maniere, il progjet GNOME al smire a furnî une buine " +#~ "documentazion.." + +#~ msgid "..for developers and administrators." +#~ msgstr "..par svilupadôrs e aministradôrs." + +#~ msgid "For developers, help is provided through Devhelp.." +#~ msgstr "Pai svilupadôrs, il jutori al è furnît vie Devhelp.." + +#~ msgid "..and online at the GNOME Developer Center." +#~ msgstr "..e in rêt tal Centri dal Svilupadôr GNOME." + +#~ msgid "Combined you have a library of knowledge and tools.." +#~ msgstr "Cumbinâts tu âs une librarie di cognossince e struments.." + +#~ msgid "..to get you up to date with the latest happenings.." +#~ msgstr "..par vêti inzornât cun lis ultimis novitâts.." + +#~ msgid "..in everything from glib to gnome-shell.." +#~ msgstr "..su dut a partî di glib fin a gnome-shell.." + +#~ msgid "..in terms of source code, API and plug-in development." +#~ msgstr "..in tiermins di codiç sorzint, API e plug-in di svilup." + +#~ msgid "For system administrators and tinkerers.." +#~ msgstr "Pai aministradôrs di sisteme e traficons.." + +#~ msgid "..we provide the System Administration Guide online.." +#~ msgstr "..o furnin la Guide par Aministradôrs di Sisteme in linie.." + +#~ msgid "at help.gnome.org." +#~ msgstr "su help.gnome.org." + +#~ msgid "This guide aims at addressing your needs.." +#~ msgstr "Cheste guide a ponte a indreçâ lis tôs dibisugnis.." + +#~ msgid "" +#~ "..whether it be managing the configuration of several computers from one " +#~ "place.." +#~ msgstr "" +#~ "..che a sedin ministrâ la configurazion di diviers computer da un puest " +#~ "sôl.." + +#~ msgid "..or playing with the logo on the login screen." +#~ msgstr "..o zuiâ cul logo de schermade di acès." + +#~ msgid "Together, Help, Developer Center and the Sysadmin Guide.." +#~ msgstr "" +#~ "Adun, Jutori, Centri dal Svilupadôr e la Guide dal Aministradôr di " +#~ "sisteme.." + +#~ msgid "..makes up GNOMEs documentation." +#~ msgstr "..a fasin la documentazion di GNOME." + +#~ msgid "Of course, we are always looking to make the documentation better." +#~ msgstr "Sigûr, nô o cirin simpri di miorâ la documentazion." + +#~ msgid "Got an idea, found a typo.." +#~ msgstr "Vût une idee, cjatât un erôr di scriture.." + +#~ msgid "..or just want to find a way to help?" +#~ msgstr "..o nome vê gole di cjatâ une maniere par judâ?" + +#~ msgid "File a bug at bugzilla.gnome.org.." +#~ msgstr "Invie un erôr a bugzilla.gnome.org.." + +#~ msgid "..against \"gnome-user-docs\"." +#~ msgstr "..su \"gnome-user-docs\"." + +#~ msgid "Or come hangout at in the #docs channel.." +#~ msgstr "O vent te cunvigne al canâl #docs.." + +#~ msgid "..at irc.gnome.org" +#~ msgstr "..su irc.gnome.org" + +#~ msgid "This is Karen Sandler, thank you for using GNOME." +#~ msgstr "O soi Karen Sandler, gracie di doprâ GNOME." diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..cda4411 --- /dev/null +++ b/po/ga.po @@ -0,0 +1,1668 @@ +# Irish translations for gnome-shell package. +# Copyright (C) 2009-2015 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Seán de Búrca , 2009-2015. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell.master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-09-30 22:09-0600\n" +"PO-Revision-Date: 2015-09-30 22:29-0600\n" +"Last-Translator: Seán de Búrca \n" +"Language-Team: Irish \n" +"Language: ga\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " +"4;\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "Córas" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the notification list" +msgstr "Taispeáin an liosta fógraí" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "Cuir an fócas san fhógra gníomhach" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "Taispeáin an foramharc" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "Taispeáin gach feidhmchlár" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "Oscail roghchlár an fheidhmchláir" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "Airíonna Eisínteachtaí GNOME Shell" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "Cumraigh Eisínteachtaí GNOME Shell" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +#, fuzzy +msgid "UUIDs of extensions to enable" +msgstr "Eisínteacht gan suiteáil" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "" + +#. Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "History for the looking glass dialog" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "Show the week date in the calendar" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "If true, display the ISO week date in the calendar." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the application menu." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the overview" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to open the Activities Overview." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "Keybinding to focus the active notification." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "Which keyboard to use" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "The type of keyboard to use." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "Limit switcher to current workspace." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "The application icon mode." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "Attach modal dialog to the parent window" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces are managed dynamically" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Workspaces only on primary monitor" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Network Login" +msgstr "Logáil Isteach Líonra" + +#: ../js/extensionPrefs/main.js:122 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Tharla earráid agus luchtú na dialóige sainroghanna do %s:" + +#: ../js/extensionPrefs/main.js:154 +msgid "GNOME Shell Extensions" +msgstr "Eisínteachtaí GNOME Shell" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145 +#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:916 +msgid "Cancel" +msgstr "Cealaigh" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215 +#: ../js/gdm/authPrompt.js:447 +msgid "Next" +msgstr "Ar Aghaidh" + +#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Díghlasáil" + +#: ../js/gdm/authPrompt.js:213 +msgctxt "button" +msgid "Sign In" +msgstr "Logáil Isteach" + +#: ../js/gdm/loginDialog.js:281 +msgid "Choose Session" +msgstr "Roghnaigh Seisiún" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:431 +msgid "Not listed?" +msgstr "Gan liostáil?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: ../js/gdm/loginDialog.js:850 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(m.s., úsáideoir nó %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/gdm/loginDialog.js:855 ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Ainm úsáideora: " + +#: ../js/gdm/loginDialog.js:1184 +msgid "Login Window" +msgstr "Fuinneog Logála Isteach" + +#: ../js/gdm/util.js:341 +msgid "Authentication error" +msgstr "Earráid fhíordheimhnithe" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/util.js:473 +msgid "(or swipe finger)" +msgstr "(nó faidhpeáil méar)" + +#: ../js/misc/util.js:119 +msgid "Command not found" +msgstr "Ordú gan aimsiú" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:152 +msgid "Could not parse command:" +msgstr "Níorbh fhéidir ordú a pharsáil:" + +#: ../js/misc/util.js:160 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Theip ar rith “%s”:" + +#. Translators: Time in 24h format +#: ../js/misc/util.js:191 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../js/misc/util.js:197 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Inné, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: ../js/misc/util.js:203 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: ../js/misc/util.js:209 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: ../js/misc/util.js:215 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: ../js/misc/util.js:220 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: ../js/misc/util.js:226 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Inné, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: ../js/misc/util.js:232 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: ../js/misc/util.js:238 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: ../js/misc/util.js:244 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login +#. * window, until we know the title of the actual login page +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "" + +#: ../js/ui/appDisplay.js:794 +msgid "Frequently used applications will appear here" +msgstr "" + +#: ../js/ui/appDisplay.js:914 +msgid "Frequent" +msgstr "Feidhmchláir Is Minice" + +#: ../js/ui/appDisplay.js:921 +msgid "All" +msgstr "Gach Feidhmchlár" + +#: ../js/ui/appDisplay.js:1853 +msgid "New Window" +msgstr "Fuinneog Nua" + +#: ../js/ui/appDisplay.js:1881 ../js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Bain ó na Ceanáin" + +#: ../js/ui/appDisplay.js:1887 +msgid "Add to Favorites" +msgstr "Cuir Leis na Ceanáin" + +#: ../js/ui/appDisplay.js:1897 +msgid "Show Details" +msgstr "Taispeáin Mionsonraí" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Cuireadh %s leis na ceanáin." + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Baineadh %s ó na ceanáin." + +#: ../js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Athraigh Cúlra…" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Display Settings" +msgstr "Socruithe Taispeána" + +#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366 +msgid "Settings" +msgstr "Socruithe" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: ../js/ui/calendar.js:55 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:84 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:86 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:88 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:90 +msgctxt "grid wednesday" +msgid "W" +msgstr "C" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:92 +msgctxt "grid thursday" +msgid "T" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:94 +msgctxt "grid friday" +msgid "F" +msgstr "A" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:96 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:566 +msgid "Previous month" +msgstr "An mhí roimhe seo" + +#: ../js/ui/calendar.js:576 +msgid "Next month" +msgstr "An chéad mhí eile" + +#: ../js/ui/calendar.js:783 +msgid "Week %V" +msgstr "Seachtain %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:1188 +msgctxt "event list time" +msgid "All Day" +msgstr "An Lá ar Fad" + +#: ../js/ui/calendar.js:1295 +msgid "Clear section" +msgstr "" + +#: ../js/ui/calendar.js:1522 +msgid "Events" +msgstr "Imeachtaí" + +#: ../js/ui/calendar.js:1531 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: ../js/ui/calendar.js:1535 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d %B, %Y" + +#: ../js/ui/calendar.js:1620 +msgid "Notifications" +msgstr "Fógraí" + +#: ../js/ui/calendar.js:1771 +msgid "No Notifications" +msgstr "Gan Fhógra" + +#: ../js/ui/calendar.js:1774 +msgid "No Events" +msgstr "Gan Imeacht" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Ceanglaíodh tiomántán seachtrach" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Dícheanglaíodh tiomántán seachtrach" + +#: ../js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "Oscail le %s" + +#: ../js/ui/components/keyring.js:120 ../js/ui/components/polkitAgent.js:315 +msgid "Password:" +msgstr "Focal faire:" + +#: ../js/ui/components/keyring.js:153 +msgid "Type again:" +msgstr "Clóscríobh arís:" + +#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:269 +#: ../js/ui/status/network.js:352 ../js/ui/status/network.js:919 +msgid "Connect" +msgstr "Ceangal" + +#. Cisco LEAP +#: ../js/ui/components/networkAgent.js:233 +#: ../js/ui/components/networkAgent.js:245 +#: ../js/ui/components/networkAgent.js:273 +#: ../js/ui/components/networkAgent.js:293 +#: ../js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Focal faire: " + +#. static WEP +#: ../js/ui/components/networkAgent.js:238 +msgid "Key: " +msgstr "Eochair:" + +#: ../js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Aitheantas:" + +#: ../js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "" + +#: ../js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Seirbhís:" + +#: ../js/ui/components/networkAgent.js:320 +#: ../js/ui/components/networkAgent.js:658 +msgid "Authentication required by wireless network" +msgstr "" + +#: ../js/ui/components/networkAgent.js:321 +#: ../js/ui/components/networkAgent.js:659 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" + +#: ../js/ui/components/networkAgent.js:325 +#: ../js/ui/components/networkAgent.js:662 +msgid "Wired 802.1X authentication" +msgstr "" + +#: ../js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Ainm líonra: " + +#: ../js/ui/components/networkAgent.js:332 +#: ../js/ui/components/networkAgent.js:666 +msgid "DSL authentication" +msgstr "Fíordheimhniú DSL" + +#: ../js/ui/components/networkAgent.js:339 +#: ../js/ui/components/networkAgent.js:672 +msgid "PIN code required" +msgstr "UAP de dhíth" + +#: ../js/ui/components/networkAgent.js:340 +#: ../js/ui/components/networkAgent.js:673 +msgid "PIN code is needed for the mobile broadband device" +msgstr "" + +#: ../js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "UAP: " + +#: ../js/ui/components/networkAgent.js:348 +#: ../js/ui/components/networkAgent.js:679 +msgid "Mobile broadband network password" +msgstr "" + +#: ../js/ui/components/networkAgent.js:349 +#: ../js/ui/components/networkAgent.js:663 +#: ../js/ui/components/networkAgent.js:667 +#: ../js/ui/components/networkAgent.js:680 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Tá focal faire de dhíth chun ceangal le “%s”." + +#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1658 +msgid "Network Manager" +msgstr "Bainisteoir Líonra" + +#: ../js/ui/components/polkitAgent.js:60 +msgid "Authentication Required" +msgstr "Fíordheimhniú de Dhíth" + +#: ../js/ui/components/polkitAgent.js:102 +msgid "Administrator" +msgstr "Riarthóir" + +#: ../js/ui/components/polkitAgent.js:182 +msgid "Authenticate" +msgstr "Fíordheimhnigh" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/components/polkitAgent.js:301 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "Tá brón orm, theip sé sin. Bain triail eile as, le do thoil." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/components/telepathyClient.js:759 +#, fuzzy, javascript-format +msgid "%s is now known as %s" +msgstr "Tugtar %2$s ar %1$s anois" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:155 +msgid "Windows" +msgstr "Fuinneoga" + +#: ../js/ui/dash.js:250 ../js/ui/dash.js:291 +msgid "Show Applications" +msgstr "Taispeáin Feidhmchláir" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/dash.js:449 +msgid "Dash" +msgstr "Deais" + +#. 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:73 +msgid "%B %e %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: ../js/ui/dateMenu.js:80 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: ../js/ui/dateMenu.js:160 +msgid "Add world clocks…" +msgstr "Cuir cloig an domhain leis…" + +#: ../js/ui/dateMenu.js:161 +msgid "World Clocks" +msgstr "Cloig an Domhain" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Logáil %s Amach" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Logáil Amach" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Logálfar %s amach go huathoibríoch i gceann %d soicind." +msgstr[1] "Logálfar %s amach go huathoibríoch i gceann %d shoicind." +msgstr[2] "Logálfar %s amach go huathoibríoch i gceann %d shoicind." +msgstr[3] "Logálfar %s amach go huathoibríoch i gceann %d soicind." +msgstr[4] "Logálfar %s amach go huathoibríoch i gceann %d soicind." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Logálfar thú amach go huathoibríoch i gceann %d soicind." +msgstr[1] "Logálfar thú amach go huathoibríoch i gceann %d shoicind." +msgstr[2] "Logálfar thú amach go huathoibríoch i gceann %d shoicind." +msgstr[3] "Logálfar thú amach go huathoibríoch i gceann %d soicind." +msgstr[4] "Logálfar thú amach go huathoibríoch i gceann %d soicind." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Logáil Amach" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Múch" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Suiteáil Nuashonruithe & Múch" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Múchfar an córas go huathoibríoch i gceann %d soicind." +msgstr[1] "Múchfar an córas go huathoibríoch i gceann %d shoicind." +msgstr[2] "Múchfar an córas go huathoibríoch i gceann %d shoicind." +msgstr[3] "Múchfar an córas go huathoibríoch i gceann %d soicind." +msgstr[4] "Múchfar an córas go huathoibríoch i gceann %d soicind." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Suiteáil nuashonruithe bogearraí ar feitheamh" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Atosaigh" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Múch" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Atosaigh" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Atosófar an córas go huathoibríoch i gceann %d soicind." +msgstr[1] "Atosófar an córas go huathoibríoch i gceann %d shoicind." +msgstr[2] "Atosófar an córas go huathoibríoch i gceann %d shoicind." +msgstr[3] "Atosófar an córas go huathoibríoch i gceann %d soicind." +msgstr[4] "Atosófar an córas go huathoibríoch i gceann %d soicind." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Atosaigh & Suiteáil Nuashonruithe" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Atosófar an córas agus suiteálfar nuashonruithe go huathoibríoch i gceann %d " +"soicind." +msgstr[1] "" +"Atosófar an córas agus suiteálfar nuashonruithe go huathoibríoch i gceann %d " +"shoicind." +msgstr[2] "" +"Atosófar an córas agus suiteálfar nuashonruithe go huathoibríoch i gceann %d " +"shoicind." +msgstr[3] "" +"Atosófar an córas agus suiteálfar nuashonruithe go huathoibríoch i gceann %d " +"soicind." +msgstr[4] "" +"Atosófar an córas agus suiteálfar nuashonruithe go huathoibríoch i gceann %d " +"soicind." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "Atosaigh & Suiteáil" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Suiteáil & Múch" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Múch tar éis suiteáil nuashonruithe" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "Tá cúpla feidhmchlár gnóthach nó tá obair gan sábháil acu." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "Tá úsáideoirí eile logáilte isteach." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (cianda)" + +#. Translators: Console here refers to a tty like a VT console +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consól)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Suiteáil" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Íosluchtaigh agus suiteáil “%s” ó extensions.gnome.org?" + +#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:713 +msgid "Keyboard" +msgstr "Méarchlár" + +#. translators: 'Hide' is a verb +#: ../js/ui/legacyTray.js:66 +msgid "Hide tray" +msgstr "Folaigh tráidire" + +#: ../js/ui/legacyTray.js:107 +msgid "Status Icons" +msgstr "Deilbhíní Stádais" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "Eisínteacht gan suiteáil" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "" + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "Folaigh Earráidí" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "Taispeáin Earráidí" + +#: ../js/ui/lookingGlass.js:716 +msgid "Enabled" +msgstr "Cumasaithe" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828 +msgid "Disabled" +msgstr "Díchumasaithe" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "Earráid" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "As dáta" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "Á íosluchtú" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "Féach Foinse" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "Suíomh Gréasáin" + +#: ../js/ui/messageTray.js:1486 +msgid "System Information" +msgstr "Eolas an Chórais" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "Cealaigh" + +#: ../js/ui/overview.js:117 +msgid "Overview" +msgstr "Foramharc" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/overview.js:244 +msgid "Type to search…" +msgstr "Clóscríobh chun chuardach…" + +#: ../js/ui/panel.js:352 +msgid "Quit" +msgstr "Scoir" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:404 +msgid "Activities" +msgstr "Gníomhartha" + +#: ../js/ui/panel.js:650 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Córas" + +#: ../js/ui/panel.js:754 +msgid "Top Bar" +msgstr "Barra ag an mBarr" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Iontráil Ordú" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162 +msgid "Close" +msgstr "Dún" + +#: ../js/ui/runDialog.js:281 +msgid "Restarting…" +msgstr "Á atosú…" + +#. Translators: This is a time format for a date in +#. long format +#: ../js/ui/screenShield.js:85 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: ../js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d teachtaireacht nua" +msgstr[1] "%d theachtaireacht nua" +msgstr[2] "%d theachtaireacht nua" +msgstr[3] "%d dteachtaireacht nua" +msgstr[4] "%d teachtaireacht nua" + +#: ../js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d fhógra nua" +msgstr[1] "%d fhógra nua" +msgstr[2] "%d fhógra nua" +msgstr[3] "%d bhfógra nua" +msgstr[4] "%d fógra nua" + +#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:374 +msgid "Lock" +msgstr "Cuir Faoi Ghlas" + +#: ../js/ui/screenShield.js:684 +msgid "GNOME needs to lock the screen" +msgstr "Teastaíonn ó GNOME an scáileán a chur faoi ghlas" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271 +msgid "Unable to lock" +msgstr "Ní féidir cur faoi ghlas" + +#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272 +msgid "Lock was blocked by an application" +msgstr "Cuireadh cosc ar chur faoi ghlas ag feidmhchlár" + +#: ../js/ui/search.js:617 +msgid "Searching…" +msgstr "Á chuardach…" + +#: ../js/ui/search.js:619 +msgid "No results." +msgstr "Gan torthaí." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Cóipeáil" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Greamaigh" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Taispeáin Téacs" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Folaigh Téacs" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "Focal Faire" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "Meabhraigh Focal Faire" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Inrochtaineacht" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Súmáil" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Léitheoir Scáileáin" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Méarchlár Scáileáin" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Foláirimh Amhairc" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Eochracha Greamaitheacha" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Eochracha Malla" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Eochracha Preabtha" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Eochracha Luiche" + +#: ../js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Ardchodarsnacht" + +#: ../js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Téacs Mór" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279 +#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90 +#: ../js/ui/status/rfkill.js:117 +msgid "Turn Off" +msgstr "Díchumasaigh" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "Socruithe Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: ../js/ui/status/bluetooth.js:105 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d Ceangailte" +msgstr[1] "%d Ceangailte" +msgstr[2] "%d Ceangailte" +msgstr[3] "%d Ceangailte" +msgstr[4] "%d Ceangailte" + +#: ../js/ui/status/bluetooth.js:107 +msgid "Not In Use" +msgstr "Níl in Úsáid" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Gile" + +#: ../js/ui/status/keyboard.js:736 +msgid "Show Keyboard Layout" +msgstr "Taispeáin Leagan Amach an Mhéarchláir" + +#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177 +msgid "Location Enabled" +msgstr "Suíomh Cumasaithe" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178 +msgid "Disable" +msgstr "Díchumasaigh" + +#: ../js/ui/status/location.js:73 +msgid "Privacy Settings" +msgstr "Socruithe Príobháideachais" + +#: ../js/ui/status/location.js:176 +msgid "Location In Use" +msgstr "Suíomh in Úsáid" + +#: ../js/ui/status/location.js:180 +msgid "Location Disabled" +msgstr "Suíomh Díchumasaithe" + +#: ../js/ui/status/location.js:181 +msgid "Enable" +msgstr "Cumasaigh" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308 +#, javascript-format +msgid "%s Off" +msgstr "%s Múchta" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:454 +#, javascript-format +msgid "%s Connected" +msgstr "%s Ceangailte" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: ../js/ui/status/network.js:459 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s Gan Bhainistiú" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:462 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s ag Dícheangal" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300 +#, javascript-format +msgid "%s Connecting" +msgstr "%s ag Ceangal" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: ../js/ui/status/network.js:472 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "Fíordheimhniú de Dhíth ar %s" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: ../js/ui/status/network.js:480 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Dochtearraí do %s ar Iarraidh" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: ../js/ui/status/network.js:484 +#, javascript-format +msgid "%s Unavailable" +msgstr "Níl %s ar Fáil" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:487 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Theip Ceangal %s" + +#: ../js/ui/status/network.js:503 +msgid "Wired Settings" +msgstr "Socruithe Sreangaithe" + +#: ../js/ui/status/network.js:545 ../js/ui/status/network.js:624 +#, fuzzy +msgid "Mobile Broadband Settings" +msgstr "Socruithe Cumhachta" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: ../js/ui/status/network.js:592 +#, javascript-format +msgid "%s Disabled" +msgstr "%s Díchumasaithe" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "" + +#: ../js/ui/status/network.js:813 +#, fuzzy +msgid "Airplane Mode is On" +msgstr "Mód Eitleáin" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "" + +#: ../js/ui/status/network.js:815 +#, fuzzy +msgid "Turn Off Airplane Mode" +msgstr "Mód Eitleáin" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Tá Wi-Fi Múchta" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "" + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Cuir Wi-Fi ar Siúl" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Líonraí Wi-Fi" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "Roghnaigh líonra" + +#: ../js/ui/status/network.js:883 +msgid "No Networks" +msgstr "Gan Líonra" + +#: ../js/ui/status/network.js:904 ../js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "" + +#: ../js/ui/status/network.js:1171 +msgid "Select Network" +msgstr "Roghnaigh Líonra" + +#: ../js/ui/status/network.js:1177 +msgid "Wi-Fi Settings" +msgstr "Socruithe Wi-Fi" + +#: ../js/ui/status/network.js:1279 +msgid "Turn On" +msgstr "Cumasaigh" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:1311 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s Gan Cheangal" + +#: ../js/ui/status/network.js:1411 +msgid "connecting..." +msgstr "á cheangal..." + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:1414 +msgid "authentication required" +msgstr "fíordheimhniú de dhíth" + +#: ../js/ui/status/network.js:1416 +msgid "connection failed" +msgstr "theip an ceangal" + +#: ../js/ui/status/network.js:1482 ../js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Socruithe Líonra" + +#: ../js/ui/status/network.js:1484 +msgid "VPN Settings" +msgstr "Socruithe VPN" + +#: ../js/ui/status/network.js:1503 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1513 +msgid "VPN Off" +msgstr "VPN Múchta" + +#: ../js/ui/status/network.js:1697 +msgid "Connection failed" +msgstr "Theip an ceangal" + +#: ../js/ui/status/network.js:1698 +msgid "Activation of network connection failed" +msgstr "" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "Socruithe Cumhachta" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "Luchtaithe go hIomlán" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "Á mheasúnú…" + +#. Translators: this is : Remaining () +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d Fágtha (%d%%)" + +#. Translators: this is : Until Full () +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d go dTí Lán (%d%%)" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: ../js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Mód Eitleáin ar Siúl" + +#: ../js/ui/status/system.js:343 +msgid "Switch User" +msgstr "Athraigh Úsáideoir" + +#: ../js/ui/status/system.js:348 +msgid "Log Out" +msgstr "Logáil Amach" + +#: ../js/ui/status/system.js:353 +msgid "Account Settings" +msgstr "Socruithe Cuntais" + +#: ../js/ui/status/system.js:370 +msgid "Orientation Lock" +msgstr "Glas Treoshuímh" + +#: ../js/ui/status/system.js:378 +msgid "Suspend" +msgstr "Cuir ar Fionraí" + +#: ../js/ui/status/system.js:381 +msgid "Power Off" +msgstr "Múch" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "Athraíodh an airde" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "Airde" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "Micreafón" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Logáil isteach mar úsáideoir eile" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Fuinneog Dhíghlasála" + +#: ../js/ui/viewSelector.js:159 +msgid "Applications" +msgstr "Feidhmchláir" + +#: ../js/ui/viewSelector.js:163 +msgid "Search" +msgstr "Cuardaigh" + +#: ../js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "Tá “%s” réidh" + +#: ../js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "Ar mhaith leat socruithe na taispeána seo a choimeád?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: ../js/ui/windowManager.js:82 +msgid "Revert Settings" +msgstr "Fill Socruithe" + +#: ../js/ui/windowManager.js:85 +msgid "Keep Changes" +msgstr "Coimeád Athruithe" + +#: ../js/ui/windowManager.js:103 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Fillfear athruithe socruithe i gceann %d soicind" +msgstr[1] "Fillfear athruithe socruithe i gceann %d shoicind" +msgstr[2] "Fillfear athruithe socruithe i gceann %d shoicind" +msgstr[3] "Fillfear athruithe socruithe i gceann %d soicind" +msgstr[4] "Fillfear athruithe socruithe i gceann %d soicind" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: ../js/ui/windowManager.js:658 +#, javascript-format +msgid "%d x %d" +msgstr "%d x %d" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Íoslaghdaigh" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Uasmhéadaigh" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Bog" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Ar Barr i gCónaí" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "" + +#: ../js/ui/windowMenu.js:105 +msgid "Move to Workspace Left" +msgstr "" + +#: ../js/ui/windowMenu.js:110 +msgid "Move to Workspace Right" +msgstr "" + +#: ../js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "" + +#: ../js/ui/windowMenu.js:120 +msgid "Move to Workspace Down" +msgstr "" + +#: ../js/ui/windowMenu.js:136 +msgid "Move to Monitor Up" +msgstr "" + +#: ../js/ui/windowMenu.js:142 +msgid "Move to Monitor Down" +msgstr "" + +#: ../js/ui/windowMenu.js:148 +msgid "Move to Monitor Left" +msgstr "" + +#: ../js/ui/windowMenu.js:154 +msgid "Move to Monitor Right" +msgstr "" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Féilire Evolution" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1835 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u Aschur" +msgstr[1] "%u Aschur" +msgstr[2] "%u Aschur" +msgstr[3] "%u nAschur" +msgstr[4] "%u Aschur" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1845 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u Ionchur" +msgstr[1] "%u Ionchur" +msgstr[2] "%u Ionchur" +msgstr[3] "%u nIonchur" +msgstr[4] "%u Ionchur" + +#: ../src/gvc/gvc-mixer-control.c:2371 +msgid "System Sounds" +msgstr "Fuaimeanna Córais" + +#: ../src/main.c:381 +msgid "Print version" +msgstr "Taispeáin leagan" + +#: ../src/main.c:387 +msgid "Mode used by GDM for login screen" +msgstr "" + +#: ../src/main.c:393 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "" + +#: ../src/main.c:399 +msgid "List possible modes" +msgstr "" + +#: ../src/shell-app.c:239 +msgctxt "program" +msgid "Unknown" +msgstr "Anaithnid" + +#: ../src/shell-app.c:480 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Theip ar luchtú “%s”" + +#: ../src/shell-keyring-prompt.c:742 +msgid "Passwords do not match." +msgstr "Ní ionann na focail fhaire." + +#: ../src/shell-keyring-prompt.c:750 +msgid "Password cannot be blank" +msgstr "Ní féidir an focal faire a bheith bán" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "" diff --git a/po/gd.po b/po/gd.po new file mode 100644 index 0000000..e9d84af --- /dev/null +++ b/po/gd.po @@ -0,0 +1,2234 @@ +# Scottish Gaelic translation for gnome-shell. +# Copyright (C) 2015 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# GunChleoc , 2015, 2016, 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-14 09:04+0000\n" +"PO-Revision-Date: 2018-02-26 12:55+0100\n" +"Last-Translator: GunChleoc \n" +"Language-Team: Fòram na Gàidhlig\n" +"Language: gd\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " +"(n > 2 && n < 20) ? 2 : 3;\n" +"X-Generator: Virtaal 0.7.1\n" +"X-DamnedLies-Scope: partial\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "An siostam" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Seall liosta nam brathan" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Cuir am fòcas air a’ bhrath ghnìomhach" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Seall am foir-shealladh" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Seall a h-uile aplacaid" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Fosgail clàr-taice nan aplacaidean" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:142 +msgid "Shell Extensions" +msgstr "Leudachain na slige" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Rèitich leudachain Slige GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Slige GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Stiùireadh uinneagan is cur gu dol aplacaidean" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Cuir an comas innealan an luchd-leasachaidh ’s deuchainne o Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "Ceadaich inntrigeadh dha na h-innealan a chum dì-bhugachaidh ’s sgrùdaidh le còmhradh Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs nan leudachan ri an cur an comas" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "Tha buadh UUID aig leudachain Slige GNOME; seallaidh an iuchair sin na leudachain a bu chòir luchdadh. Feumaidh gach leudachan a tha ag iarraidh luchdadh a bhith air an liosta seo. ’S urrainn dhut an liosta seo atharrachadh cuideachd leis na modhan D-Bus EnableExtension agus DisableExtension air org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Cuir à comas leudachain a’ chleachdaiche" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "Cuir à comas gach leudachan a chuir an cleachdaiche an comas gun bhuaidh air an roghainn “enabled-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Cuiridh seo à comas dearbhadh na co-chòrdalachd airson tionndadh nan leudachan" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "Cha luchdaich Slige GNOME ach leudachain a dh’innseas gu bheil iad co-chòrdail leis an tionndadh a tha ’ga ruith. Ma chuireas tu an roghainn seo an comas, thèid an dearbhadh a chur à comas agus feuchaidh sinn ris a h-uile leudachan a luchdadh ge b’ e dè na tionndaidhean ris an cuir iad taic dhan rèir-san." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Liosta dhe IDan nam faidhlichean desktop airson nan aplacaidean as annsa leat" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "Thèid na h-aplacaidean a fhreagras ris na h-aithnichearan seo a shealltainn air raon nan annsachdan." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Sealladh roghnaichear nan aplacaid" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Inneacs an t-seallaidh làithrich ann an roghnaichear nan aplacaid." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Eachdraidh a’ chòmhraidh-àithne (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Eachdraidh a’ chòmhraidh aig looking glass" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Seall nì “Clàraich a-mach” air clàr-taice a’ chleachdaiche an-còmhnaidh." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "Tar-àithnidh an iuchair seo am falach fèin-obrachail aig “Clàraich a-mach” air a’ chlàr-taice ann an suidheachaidhean le aon chleachdaiche ’s aon seisean a-mhàin." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "Co-dhiù an dèid am facal-faire a chuimhneachadh airson munntachadh shiostaman-fhaidhlichean crioptaichte no cèine" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "Iarraidh an t-slige facal-faire ort nuair a thèid siostam-fhaidhlichean crioptaichte no cèin a mhunntachadh. Ma ghabhas am facal-faire sàbhaladh airson na h-ama ri teachd, bidh bogsa-cromaige “Cuimhnich am facal-faire” ann. Suidhichidh an iuchair seo staid thùsail na bogsa-cromaige ud." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Co-dhiù an robh uidheaman co-cheangailte ris an adaptar Bluetooth gus nach robh" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "Cha seall an t-slige nì clàir-thaice “Bluetooth” ach ma tha cumhachd aig adaptar Bluetooth no ma chaidh uidheaman co-cheangailte ris an adaptar tùsail roimhe. Thèid seo ath-shuidheachadh ma chithear an t-adaptar tùsail gun uidheam co-cheangailte ris." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Nasgadh iuchrach gus clàr-taice nan aplacaidean fhosgladh" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Nasgadh iuchrach gus clàr-taice nan aplacaidean fhosgladh." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Nasgadh iuchrach gus an sealladh “Seall na h-aplacaidean” fhosgladh" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Nasgadh iuchrach gus an sealladh “Seall na h-aplacaidean” aig foir-shealladh nan gnìomhachdan fhosgladh." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Nasgadh iuchrach gus am foir-shealladh fhosgladh" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Nasgadh iuchrach gus foir-shealladh nan gnìomhachdan fhosgladh." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Nasgadh iuchrach gus liosta nam brathan a shealltainn no fhalach" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Nasgadh iuchrach gus liosta nam brathan a shealltainn no fhalach." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Nasgadh iuchrach gus am fòcas a chur air a’ bhrath ghnìomhach" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Nasgadh iuchrach gus am fòcas a chur air a’ bhrath ghnìomhach." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "Nasgadh iuchrach a chuireas gach tween a tha ’ga ruith ’na stad ’s a thòisicheas orra a-rithist a chum dì-bhugachaidh" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Am meur-chlàr ri chleachdadh" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "An seòrsa de mheur-chlàr a thèid a chleachdadh." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Cuingich an t-suidsear air an rùm-obrach làithreach." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "Mas e true a th’ ann, cha dèid a shealltainn san t-suidsear ach na h-aplacaidean aig a bheil uinneag san rùm-obrach làithreach. Mur e, thèid a h-uile aplacaid a ghabhail a-staigh." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Modh ìomhaigheagan nan aplacaid." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "Rèitichidh seo an dòigh sa thèid na h-uinneagan a shealltainn san t-suidsear. ’S e “thumbnail-only” (seallaidh seo dealbhag na h-uinneige), “app-icon-only” (seallaidh seo ìomhaigheag na h-aplacaid) no “both” (seallaidh seo an dà chuid dhiubh) a tha sna luachan dligheach." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "Mas e true a th’ ann, cha dèid a shealltainn san t-suidsear ach na h-uinneagan a tha san rùm-obrach làithreach. Mur e, thèid a h-uile uinneag a ghabhail a-staigh." + +#: data/org.gnome.shell.gschema.xml.in:198 +msgid "Attach modal dialog to the parent window" +msgstr "Ceangail còmhradh mòdach ris an uinneag-pàrant" + +#: data/org.gnome.shell.gschema.xml.in:199 +#: data/org.gnome.shell.gschema.xml.in:208 +#: data/org.gnome.shell.gschema.xml.in:216 +#: data/org.gnome.shell.gschema.xml.in:224 +#: data/org.gnome.shell.gschema.xml.in:232 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Tar-àithnidh an iuchair seo an iuchair ann an org.gnome.mutter nuair a thèid Slige GNOME a ruith." + +#: data/org.gnome.shell.gschema.xml.in:207 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Cuir leacadh nan oirean an comas nuair a thèid uinneagan a leigeil às aig oir na sgrìn" + +#: data/org.gnome.shell.gschema.xml.in:215 +msgid "Workspaces are managed dynamically" +msgstr "Thèid na rumannan-obrach a stiùireadh gu h-innsgineach" + +#: data/org.gnome.shell.gschema.xml.in:223 +msgid "Workspaces only on primary monitor" +msgstr "Rumannan-obrach air a’ phrìomh-mhonatair a-mhàin" + +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Cuir dàil air atharraichean an fòcais ann am modh luchaige gus an sguir an tomhaire air gluasad" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Clàradh a-steach lìonraidh" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:112 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Thachair mearachd le luchdadh còmhradh nan roghainnean airson %s:" + +#: js/gdm/authPrompt.js:148 js/ui/audioDeviceSelection.js:62 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 +#: js/ui/endSessionDialog.js:442 js/ui/extensionDownloader.js:197 +#: js/ui/shellMountOperation.js:345 js/ui/status/network.js:905 +msgid "Cancel" +msgstr "Sguir dheth" + +#: js/gdm/authPrompt.js:167 js/gdm/authPrompt.js:210 js/gdm/authPrompt.js:442 +msgid "Next" +msgstr "Air adhart" + +#: js/gdm/authPrompt.js:206 js/ui/shellMountOperation.js:349 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Neo-ghlais" + +#: js/gdm/authPrompt.js:208 +msgctxt "button" +msgid "Sign In" +msgstr "Clàraich a-steach" + +#: js/gdm/loginDialog.js:319 +msgid "Choose Session" +msgstr "Tagh seisean" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:463 +msgid "Not listed?" +msgstr "Nach eil d’ ainm air an liosta?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:892 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(m.e., cleachdaiche no %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:897 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Ainm-cleachdaiche:" + +#: js/gdm/loginDialog.js:1235 +msgid "Login Window" +msgstr "Uinneag a’ chlàraidh a-steach" + +#: js/gdm/util.js:345 +msgid "Authentication error" +msgstr "Mearachd leis an dearbhadh" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:485 +msgid "(or swipe finger)" +msgstr "(no grad-shlaighd le do mheur)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:97 +msgctxt "search-result" +msgid "Power Off" +msgstr "Cuir dheth" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:100 +msgid "power off;shutdown;reboot;restart" +msgstr "power off;shutdown;reboot;restart;cumhachd;dheth;cur sìos;cuir sìos;cuir dheth;cur dheth;dùin;dùin sìos;ath-thòisich;ath-thòiseachadh;tòisich" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:104 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Glais an sgrìn" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:107 +msgid "lock screen" +msgstr "sgrìn-ghlasaidh;glais;glas;sgrìn" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:111 +msgctxt "search-result" +msgid "Log Out" +msgstr "Clàraich a-mach" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:114 +msgid "logout;sign off" +msgstr "logout;sign off;clàraidh a-mach;clàradh a-mach;logadh a-mach;" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:118 +msgctxt "search-result" +msgid "Suspend" +msgstr "Cuir ’na dhàil" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:121 +msgid "suspend;sleep" +msgstr "suspend;sleep;cuir 'na dhàil;cur 'na dhàil;cuir na dhàil;cur na dhàil;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:125 +msgctxt "search-result" +msgid "Switch User" +msgstr "Leum gu cleachdaiche eile" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:128 +msgid "switch user" +msgstr "switch user;suids;cleachdaiche" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:132 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Glais a’ chomhair" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:135 +msgid "lock orientation;screen;rotation" +msgstr "lock orientation;screen;rotation;glais;comhair;glais a' chomhair;sgrìn;cuairteachadh;cuairtich" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Cha deach an àithne a lorg" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Cha b’ urrainn dhuinn an àithne a pharsadh:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Cha b’ urrainn dhuinn “%s” a ruith:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "An-dràsta fhèin" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d mhionaid air ais" +msgstr[1] "%d mhionaid air ais" +msgstr[2] "%d mionaidean air ais" +msgstr[3] "%d mionaid air ais" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d uair a thìde air ais" +msgstr[1] "%d uair a thìde air ais" +msgstr[2] "%d uairean a thìde air ais" +msgstr[3] "%d uair a thìde air ais" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "An-dè" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d latha air ais" +msgstr[1] "%d latha air ais" +msgstr[2] "%d làithean air ais" +msgstr[3] "%d latha air ais" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d seachdain air ais" +msgstr[1] "%d sheachdain air ais" +msgstr[2] "%d seachdainean air ais" +msgstr[3] "%d seachdain air ais" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d mhìos air ais" +msgstr[1] "%d mhìos air ais" +msgstr[2] "%d mìosan air ais" +msgstr[3] "%d mìos air ais" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d bhliadhna air ais" +msgstr[1] "%d bhliadhna air ais" +msgstr[2] "%d bliadhnaichean air ais" +msgstr[3] "%d bliadhna air ais" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "An-dè aig %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M%p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "An-dè aig %l:%M%p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M%p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d %B, %l∶%M%p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d %B %Y, %l∶%M%p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:49 +msgid "Hotspot Login" +msgstr "Clàradh a-steach Hotspot" + +#: js/portalHelper/main.js:95 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "Chan eil an ceangal agad gu clàradh a-steach a’ hotspot seo tèarainte. Chì daoine a tha faisg ort na faclan-faire agus fiosrachadh sam bith eile a chuireas tu a-steach air an duilleag seo." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:46 js/ui/status/location.js:376 +msgid "Deny Access" +msgstr "Diùlt an t-inntrigeadh" + +#: js/ui/accessDialog.js:47 js/ui/status/location.js:379 +msgid "Grant Access" +msgstr "Ceadaich an t-inntrigeadh" + +#: js/ui/appDisplay.js:790 +msgid "Frequently used applications will appear here" +msgstr "Nochdaidh aplacaidean a chleachdas tu gu tric an-seo" + +#: js/ui/appDisplay.js:911 +msgid "Frequent" +msgstr "An fheadhainn thric" + +#: js/ui/appDisplay.js:918 +msgid "All" +msgstr "Na h-uile" + +#: js/ui/appDisplay.js:1889 +msgid "New Window" +msgstr "Uinneag ùr" + +#: js/ui/appDisplay.js:1903 +msgid "Launch using Dedicated Graphics Card" +msgstr "Cuir gu dol le cairt-ghrafaigeachd shònraichte" + +#: js/ui/appDisplay.js:1930 js/ui/dash.js:287 +msgid "Remove from Favorites" +msgstr "Thoir air falbh o na h-annsachdan" + +#: js/ui/appDisplay.js:1936 +msgid "Add to Favorites" +msgstr "Cuir ris na h-annsachdan" + +#: js/ui/appDisplay.js:1946 +msgid "Show Details" +msgstr "Seall am mion-fhiosrachadh" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Chaidh %s a chur ris na h-annsachdan agad." + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Chaidh %s a toirt air falbh o na h-annsachdan agad." + +#: js/ui/audioDeviceSelection.js:50 +msgid "Select Audio Device" +msgstr "Tagh uidheam fuaime" + +#: js/ui/audioDeviceSelection.js:60 +msgid "Sound Settings" +msgstr "Roghainnean na fuaime" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headphones" +msgstr "Headphones" + +#: js/ui/audioDeviceSelection.js:71 +msgid "Headset" +msgstr "Headset" + +#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:255 +msgid "Microphone" +msgstr "Micreofon" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Atharraich an cùlaibh…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:47 +msgid "Display Settings" +msgstr "Roghainnean an t-seallaidh" + +#: js/ui/backgroundMenu.js:22 +msgid "Settings" +msgstr "Roghainnean" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:44 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:73 +msgctxt "grid sunday" +msgid "S" +msgstr "Dò" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:75 +msgctxt "grid monday" +msgid "M" +msgstr "Lu" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:77 +msgctxt "grid tuesday" +msgid "T" +msgstr "Mà" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:79 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ci" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:81 +msgctxt "grid thursday" +msgid "T" +msgstr "Da" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:83 +msgctxt "grid friday" +msgid "F" +msgstr "hA" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:85 +msgctxt "grid saturday" +msgid "S" +msgstr "Dò" + +#. * +#. * 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:380 +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:390 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:447 +msgid "Previous month" +msgstr "Am mìos roimhe" + +#: js/ui/calendar.js:457 +msgid "Next month" +msgstr "An ath mhìos" + +#: js/ui/calendar.js:610 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:665 +msgid "Week %V" +msgstr "Seachdain %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:734 +msgctxt "event list time" +msgid "All Day" +msgstr "Fad an latha" + +#: js/ui/calendar.js:869 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/calendar.js:873 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d %B, %Y" + +#: js/ui/calendar.js:1103 +msgid "No Notifications" +msgstr "Chan eil brath ann" + +#: js/ui/calendar.js:1106 +msgid "No Events" +msgstr "Chan eil tachartas ann" + +#: js/ui/calendar.js:1134 +msgid "Clear All" +msgstr "Falamhaich na h-uile" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:50 +#, javascript-format +msgid "“%s” is not responding." +msgstr "Chan eil “%s” a’ freagairt." + +#: js/ui/closeDialog.js:51 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "Faodaidh tu feitheamh greis gus an lean seo air adhart no sparradh air an aplacaid gum fàg i gu lèir." + +#: js/ui/closeDialog.js:67 +msgid "Force Quit" +msgstr "Spàrr fàgail air" + +#: js/ui/closeDialog.js:70 +msgid "Wait" +msgstr "Fuirich air" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Chaidh draibh on taobh a-muigh a cheangal" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Chaidh draibh on taobh a-muigh a dhì-cheangal" + +#: js/ui/components/autorunManager.js:348 +#, javascript-format +msgid "Open with %s" +msgstr "Fosgail le %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 +msgid "Password:" +msgstr "Facal-faire:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Am facal-faire a-rithist:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:229 +#: js/ui/status/network.js:320 js/ui/status/network.js:908 +msgid "Connect" +msgstr "Ceangail" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Facal-faire: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Iuchair: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Facal-faire na h-iuchrach prìobhaidich: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Dearbh-aithne: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Seirbheis: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:688 +msgid "Authentication required by wireless network" +msgstr "Tha an lìonra uèirleas ag iarraidh dearbhadh" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:689 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "Tha feum air faclan-faire no iuchraichean crioptachaidh gus an lìonra uèirleas “%s” inntrigeadh." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:692 +msgid "Wired 802.1X authentication" +msgstr "Dearbhadh Wired 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Ainm an lìonraidh: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:696 +msgid "DSL authentication" +msgstr "Dearbhadh DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:702 +msgid "PIN code required" +msgstr "Tha feum air còd PIN" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:703 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Tha feum air còd PIN airson an uidheim mobile banna-leathainn" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:709 +msgid "Mobile broadband network password" +msgstr "Facal-faire an lìonraidh banna-leathainn mobile" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:693 +#: js/ui/components/networkAgent.js:697 js/ui/components/networkAgent.js:710 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Tha feum air facal-faire airson ceangal ri “%s”." + +#: js/ui/components/networkAgent.js:677 js/ui/status/network.js:1690 +msgid "Network Manager" +msgstr "Manaidsear nan lìonra" + +#: js/ui/components/polkitAgent.js:48 +msgid "Authentication Required" +msgstr "Tha feum air dearbhadh" + +#: js/ui/components/polkitAgent.js:76 +msgid "Administrator" +msgstr "Rianaire" + +#: js/ui/components/polkitAgent.js:156 +msgid "Authenticate" +msgstr "Dearbhaich" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:329 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Tha sinn duilich ach cha do dh’obraich sin. Am feuch thu ris a-rithist?" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:795 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Thug %s %s air" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Uinneagan" + +#: js/ui/dash.js:248 js/ui/dash.js:289 +msgid "Show Applications" +msgstr "Seall na h-aplacaidean" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:446 +msgid "Dash" +msgstr "Deas-bhòrd" + +#. 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:74 +msgid "%B %e %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "Cuir uaireadairean an t-saoghail ris…" + +#: js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "Uaireadairean an t-saoghail" + +#: js/ui/dateMenu.js:227 +msgid "Weather" +msgstr "An aimsir" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:291 +#, javascript-format +msgid "%s all day." +msgstr "%s fad an latha." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:297 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s ’s %s an uairsin." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:303 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s ’s %s an uairsin ’s %s an uairsin." + +#: js/ui/dateMenu.js:314 +msgid "Select a location…" +msgstr "Tagh ionad…" + +#: js/ui/dateMenu.js:317 +msgid "Loading…" +msgstr "’Ga luchdadh…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:323 +#, javascript-format +msgid "Feels like %s." +msgstr "A’ faireachdainn mar %s." + +#: js/ui/dateMenu.js:326 +msgid "Go online for weather information" +msgstr "Rach air loidhne airson fiosrachadh mun aimsir" + +#: js/ui/dateMenu.js:328 +msgid "Weather information is currently unavailable" +msgstr "Chan eil fiosrachadh mun aimsir ri fhaighinn an-dràsta" + +#: js/ui/endSessionDialog.js:51 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Clàraich a-mach %s" + +#: js/ui/endSessionDialog.js:52 +msgctxt "title" +msgid "Log Out" +msgstr "Clàraich a-mach" + +#: js/ui/endSessionDialog.js:54 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Thèid %s a chlàradh a-mach gu fèin-obrachail an ceann %d diog." +msgstr[1] "Thèid %s a chlàradh a-mach gu fèin-obrachail an ceann %d dhiog." +msgstr[2] "Thèid %s a chlàradh a-mach gu fèin-obrachail an ceann %d diogan." +msgstr[3] "Thèid %s a chlàradh a-mach gu fèin-obrachail an ceann %d diog." + +#: js/ui/endSessionDialog.js:59 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Thèid thu a chlàradh a-mach gu fèin-obrachail an ceann %d diog." +msgstr[1] "Thèid thu a chlàradh a-mach gu fèin-obrachail an ceann %d dhiog." +msgstr[2] "Thèid thu a chlàradh a-mach gu fèin-obrachail an ceann %d diogan." +msgstr[3] "Thèid thu a chlàradh a-mach gu fèin-obrachail an ceann %d diog." + +#: js/ui/endSessionDialog.js:65 +msgctxt "button" +msgid "Log Out" +msgstr "Clàraich a-mach" + +#: js/ui/endSessionDialog.js:71 +msgctxt "title" +msgid "Power Off" +msgstr "Cuir dheth" + +#: js/ui/endSessionDialog.js:72 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Stàlaich na h-ùrachaidhean ⁊ cuir dheth" + +#: js/ui/endSessionDialog.js:74 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Thèid an siostam a chur dheth gu fèin-obrachail an ceann %d diog." +msgstr[1] "Thèid an siostam a chur dheth gu fèin-obrachail an ceann %d dhiog." +msgstr[2] "Thèid an siostam a chur dheth gu fèin-obrachail an ceann %d diogan." +msgstr[3] "Thèid an siostam a chur dheth gu fèin-obrachail an ceann %d diog." + +#: js/ui/endSessionDialog.js:78 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Stàlaich na h-ùrachaidhean bathair-bhog a tha a’ feitheamh" + +#: js/ui/endSessionDialog.js:81 js/ui/endSessionDialog.js:98 +msgctxt "button" +msgid "Restart" +msgstr "Ath-thòisich" + +#: js/ui/endSessionDialog.js:83 +msgctxt "button" +msgid "Power Off" +msgstr "Cuir dheth" + +#: js/ui/endSessionDialog.js:90 +msgctxt "title" +msgid "Restart" +msgstr "Ath-thòisich" + +#: js/ui/endSessionDialog.js:92 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Thèid an siostam a thòiseachadh às ùr gu fèin-obrachail an ceann %d diog." +msgstr[1] "Thèid an siostam a thòiseachadh às ùr gu fèin-obrachail an ceann %d dhiog." +msgstr[2] "Thèid an siostam a thòiseachadh às ùr gu fèin-obrachail an ceann %d diogan." +msgstr[3] "Thèid an siostam a thòiseachadh às ùr gu fèin-obrachail an ceann %d diog." + +#: js/ui/endSessionDialog.js:106 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Ath-thòisich ⁊ stàlaich na h-ùrachaidhean" + +#: js/ui/endSessionDialog.js:108 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "Tòisichidh an siostam às ùr is stàlaichidh e ùrachaidhean gu fèin-obrachail an ceann %d diog." +msgstr[1] "Tòisichidh an siostam às ùr is stàlaichidh e ùrachaidhean gu fèin-obrachail an ceann %d dhiog." +msgstr[2] "Tòisichidh an siostam às ùr is stàlaichidh e ùrachaidhean gu fèin-obrachail an ceann %d diogan." +msgstr[3] "Tòisichidh an siostam às ùr is stàlaichidh e ùrachaidhean gu fèin-obrachail an ceann %d diog." + +#: js/ui/endSessionDialog.js:114 js/ui/endSessionDialog.js:134 +msgctxt "button" +msgid "Restart & Install" +msgstr "Ath-thòisich ⁊ stàlaich" + +#: js/ui/endSessionDialog.js:115 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Stàlaich ⁊ cuir dheth" + +#: js/ui/endSessionDialog.js:116 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Dùin sìos nuair a bhios na h-ùrachaidhean air an stàladh" + +#: js/ui/endSessionDialog.js:124 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Ath-thòisich ⁊ stàlaich an t-àrdachadh" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:129 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "Thèid %s %s a stàladh às dèidh an ath-thòiseachaidh. Dh’fhaoidte gun doir e fada an t-àrdachadh a stàladh: dèan cinnteach gun do rinn thu lethbhreac-glèidhidh agus gu bheil an coimpiutair ceangailte ri bun-dealain." + +#: js/ui/endSessionDialog.js:321 +msgid "Running on battery power: please plug in before installing updates." +msgstr "A’ ruith air cumhachd a’ bhataraidh: ceangail gu bun-dealain mus stàlaich thu ùrachaidhean." + +#: js/ui/endSessionDialog.js:338 +msgid "Some applications are busy or have unsaved work." +msgstr "Tha cuid a dh’aplacaidean trang no tha obair aca nach deach a shàbhaladh." + +#: js/ui/endSessionDialog.js:345 +msgid "Other users are logged in." +msgstr "Tha daoine eile air an clàradh a-steach." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:626 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (cèin)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:629 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consoil)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Stàlaich" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "A bheil thu airson “%s” a luchdadh a-nuas is a stàladh o extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "Tha %s airson ath-ghoiridean a bhacadh" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Tha aplacaid airson ath-ghoiridean a bhacadh" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "’S urrainn dut na h-ath-ghoiridean aiseag ’s tu a’ brùthadh air %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Diùlt" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Ceadaich" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned On" +msgstr "Tha na h-iuchraichean slaodach air" + +#: js/ui/kbdA11yDialog.js:34 +msgid "Slow Keys Turned Off" +msgstr "Tha na h-iuchraichean slaodach dheth" + +#: 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 "Chum thu sìos an iuchair Shift fad 8 diogan. Seo an ath-ghoirid airson gleus nan iuchraichean slaodach agus tha buaidh aige air an dòigh air a dh’obraicheas am meur-chlàr agad." + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned On" +msgstr "Tha na h-iuchraichean steigeach air" + +#: js/ui/kbdA11yDialog.js:43 +msgid "Sticky Keys Turned Off" +msgstr "Tha na h-iuchraichean steigeach dheth" + +#: 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 "Bhrùth thu an iuchair Shift 5 tursan às dèidh a chèile. Seo an ath-ghoirid airson gleus nan iuchraichean steigeach agus tha buaidh aige air an dòigh air a dh’obraicheas am meur-chlàr agad." + +#: 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 "Bhrùth thu dà iuchair aig an aon àm no bhrùth thu an iuchair Shift 5 tursan às dèidh a chèile. Cuiridh seo dheth gleus nan iuchraichean steigeach agus tha buaidh aige air an dòigh air a dh’obraicheas am meur-chlàr agad." + +#: js/ui/kbdA11yDialog.js:59 +msgid "Leave On" +msgstr "Fàg air" + +#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:138 +#: js/ui/status/network.js:1280 +msgid "Turn On" +msgstr "Cuir air" + +#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:138 +#: js/ui/status/network.js:138 js/ui/status/network.js:321 +#: js/ui/status/network.js:1280 js/ui/status/network.js:1395 +#: js/ui/status/nightLight.js:43 js/ui/status/rfkill.js:85 +#: js/ui/status/rfkill.js:112 +msgid "Turn Off" +msgstr "Cuir dheth" + +#: js/ui/kbdA11yDialog.js:67 +msgid "Leave Off" +msgstr "Fàg dheth" + +#: js/ui/keyboard.js:198 +msgid "Region & Language Settings" +msgstr "Roghainnean roinn-dùthcha ⁊ cànain" + +#: js/ui/lookingGlass.js:644 +msgid "No extensions installed" +msgstr "Cha deach leudachan a stàladh" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:698 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "Cha robh mearachd sam bith aig %s." + +#: js/ui/lookingGlass.js:704 +msgid "Hide Errors" +msgstr "Falaich na mearachdan" + +#: js/ui/lookingGlass.js:708 js/ui/lookingGlass.js:768 +msgid "Show Errors" +msgstr "Seall na mearachdan" + +#: js/ui/lookingGlass.js:717 +msgid "Enabled" +msgstr "An comas" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:720 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "À comas" + +#: js/ui/lookingGlass.js:722 +msgid "Error" +msgstr "Mearachd" + +#: js/ui/lookingGlass.js:724 +msgid "Out of date" +msgstr "Ro shean" + +#: js/ui/lookingGlass.js:726 +msgid "Downloading" +msgstr "’Ga luchdadh a-nuas" + +#: js/ui/lookingGlass.js:750 +msgid "View Source" +msgstr "Seall am bun-tùs" + +#: js/ui/lookingGlass.js:759 +msgid "Web Page" +msgstr "Duilleag-lìn" + +#: js/ui/messageTray.js:1498 +msgid "System Information" +msgstr "Fiosrachadh an t-siostaim" + +#: js/ui/mpris.js:185 +msgid "Unknown artist" +msgstr "Chan eil fhios cò an neach-ciùil" + +#: js/ui/mpris.js:186 +msgid "Unknown title" +msgstr "Chan eil fhios dè an tiotal" + +#: js/ui/osdWindow.js:32 js/ui/status/volume.js:204 +msgid "Volume" +msgstr "Àirde na fuaime" + +#: js/ui/overview.js:83 +msgid "Undo" +msgstr "Neo-dhèan" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:112 +msgid "Overview" +msgstr "Foir-shealladh" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:239 +msgid "Type to search…" +msgstr "Sgrìobh airson lorg…" + +#: js/ui/padOsd.js:107 +msgid "New shortcut…" +msgstr "Ath-ghoirid ùr…" + +#: js/ui/padOsd.js:158 +msgid "Application defined" +msgstr "A-rèir na h-aplacaid" + +#: js/ui/padOsd.js:159 +msgid "Show on-screen help" +msgstr "Seall a’ chobhair air an sgrìn" + +#: js/ui/padOsd.js:160 +msgid "Switch monitor" +msgstr "Gearr leum gu monatair eile" + +#: js/ui/padOsd.js:161 +msgid "Assign keystroke" +msgstr "Sònraich buille-iuchrach dha" + +#: js/ui/padOsd.js:228 +msgid "Done" +msgstr "Deiseil" + +#: js/ui/padOsd.js:744 +msgid "Edit…" +msgstr "Deasaich…" + +#: js/ui/padOsd.js:786 js/ui/padOsd.js:891 +msgid "None" +msgstr "Chan eil gin" + +#: js/ui/padOsd.js:845 +msgid "Press a button to configure" +msgstr "Brùth air putan gus a rèiteachadh" + +#: js/ui/padOsd.js:846 +msgid "Press Esc to exit" +msgstr "Brùth air Esc airson fàgail" + +#: js/ui/padOsd.js:849 +msgid "Press any key to exit" +msgstr "Brùth air iuchair sam bith airson fàgail" + +#: js/ui/panel.js:359 +msgid "Quit" +msgstr "Fàg an-seo" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:415 +msgid "Activities" +msgstr "Gnìomhachdan" + +#: js/ui/panel.js:696 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "An siostam" + +#: js/ui/panel.js:820 +msgid "Top Bar" +msgstr "Bàr a’ bharra" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:301 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:74 +msgid "Enter a Command" +msgstr "Cuir a-steach àithne" + +#: js/ui/runDialog.js:114 js/ui/windowMenu.js:174 +msgid "Close" +msgstr "Dùin" + +#: js/ui/runDialog.js:276 +msgid "Restart is not available on Wayland" +msgstr "Chan eil ath-thòiseachadh ri làimh air Wayland" + +#: js/ui/runDialog.js:281 +msgid "Restarting…" +msgstr "’Ga ath-thòiseachadh…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d teachdaireachd ùr" +msgstr[1] "%d theachdaireachd ùr" +msgstr[2] "%d teachdaireachdan ùra" +msgstr[3] "%d teachdaireachd ùr" + +#: js/ui/screenShield.js:148 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d bhrath ùr" +msgstr[1] "%d bhrath ùr" +msgstr[2] "%d brathan ùra" +msgstr[3] "%d brath ùr" + +#: js/ui/screenShield.js:451 js/ui/status/system.js:297 +msgid "Lock" +msgstr "Glais" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "Feumaidh GNOME an sgrìn a ghlasadh" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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:1309 +msgid "Unable to lock" +msgstr "Cha ghabh a ghlasadh" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1310 +msgid "Lock was blocked by an application" +msgstr "Chaidh a’ ghlas a bhacadh le aplacaid" + +#: js/ui/search.js:660 +msgid "Searching…" +msgstr "’Ga lorg…" + +#: js/ui/search.js:662 +msgid "No results." +msgstr "Chan eil toradh ann." + +#: js/ui/search.js:786 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d a bharrachd" +msgstr[1] "%d a bharrachd" +msgstr[2] "%d a bharrachd" +msgstr[3] "%d a bharrachd" + +#: js/ui/shellEntry.js:26 +msgid "Copy" +msgstr "Dèan lethbhreac" + +#: js/ui/shellEntry.js:31 +msgid "Paste" +msgstr "Cuir ann" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Seall an teacsa" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Falaich an teacsa" + +#: js/ui/shellMountOperation.js:316 +msgid "Password" +msgstr "Facal-faire " + +#: js/ui/shellMountOperation.js:337 +msgid "Remember Password" +msgstr "Cuimhnich am facal-faire" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "So-ruigsinneachd" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Sùm" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Leughadair sgrìn" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Meur-chlàr air an sgrìn" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Rabhaidhean lèirsinneach" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Iuchraichean steigeach" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Iuchraichean slaodach" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Iuchraichean bocaidh" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Iuchraichean luchaige" + +#: js/ui/status/accessibility.js:165 +msgid "High Contrast" +msgstr "Iomsgaradh àrd" + +#: js/ui/status/accessibility.js:200 +msgid "Large Text" +msgstr "Teacsa mòr" + +#: js/ui/status/bluetooth.js:43 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:52 js/ui/status/network.js:600 +msgid "Bluetooth Settings" +msgstr "Roghainnean Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:132 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d uidheam ceangailte" +msgstr[1] "%d uidheam ceangailte" +msgstr[2] "%d uidheaman ceangailte" +msgstr[3] "%d uidheam ceangailte" + +#: js/ui/status/bluetooth.js:134 +msgid "Off" +msgstr "Dheth" + +#: js/ui/status/bluetooth.js:136 +msgid "On" +msgstr "Air" + +#: js/ui/status/brightness.js:41 +msgid "Brightness" +msgstr "Soilleireachd" + +#: js/ui/status/keyboard.js:795 +msgid "Keyboard" +msgstr "Meur-chlàr" + +#: js/ui/status/keyboard.js:818 +msgid "Show Keyboard Layout" +msgstr "Seall co-dhealbhachd a’ mheur-chlàir" + +#: js/ui/status/location.js:72 js/ui/status/location.js:180 +msgid "Location Enabled" +msgstr "Tha an t-ionad an comas" + +#: js/ui/status/location.js:73 js/ui/status/location.js:181 +msgid "Disable" +msgstr "Cuir à comas" + +#: js/ui/status/location.js:74 +msgid "Privacy Settings" +msgstr "Roghainnean na prìobhaideachd" + +#: js/ui/status/location.js:179 +msgid "Location In Use" +msgstr "Tha an t-ionad ’ga chleachdadh" + +#: js/ui/status/location.js:183 +msgid "Location Disabled" +msgstr "Tha an t-ionad à comas" + +#: js/ui/status/location.js:184 +msgid "Enable" +msgstr "Cuir an comas" + +#. Translators: %s is an application name +#: js/ui/status/location.js:369 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "A bheil thu airson inntrigeadh dhan ionad agad a thoirt dha %s?" + +#: js/ui/status/location.js:370 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "’S urrainn dhut inntrigeadh an ionaid atharrachadh uair sam bith ann an roghainnean na prìobhaideachd." + +#: js/ui/status/network.js:74 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 js/ui/status/network.js:1309 +#, javascript-format +msgid "%s Off" +msgstr "Tha %s dheth" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:430 +#, javascript-format +msgid "%s Connected" +msgstr "Ceangailte ri %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:435 +#, javascript-format +msgid "%s Unmanaged" +msgstr "Chan eil %s ‘ga stiùireadh" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:438 +#, javascript-format +msgid "%s Disconnecting" +msgstr "A’ dì-cheangal o %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:445 js/ui/status/network.js:1301 +#, javascript-format +msgid "%s Connecting" +msgstr "A’ ceangal ri %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:448 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "Tha %s ag iarraidh dearbhadh" + +#. 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:456 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Tha bathar-an-sàs a dhìth air %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:460 +#, javascript-format +msgid "%s Unavailable" +msgstr "Chan eil %s ri fhaighinn" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:463 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Cha deach leinn ceangal ri %s" + +#: js/ui/status/network.js:479 +msgid "Wired Settings" +msgstr "Roghainnean le uèir" + +#: js/ui/status/network.js:521 +msgid "Mobile Broadband Settings" +msgstr "Roghainnean banna-leathainn mobile" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:564 js/ui/status/network.js:1306 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Tha bathar-cruaidh %s à comas" + +#. 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:568 +#, javascript-format +msgid "%s Disabled" +msgstr "Tha %s à comas" + +#: js/ui/status/network.js:608 +msgid "Connect to Internet" +msgstr "Ceangail ris an eadar-lìon" + +#: js/ui/status/network.js:802 +msgid "Airplane Mode is On" +msgstr "Tha am modh itealain air" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Tha WiFi à comas fhad ’s a tha am modh itealain air." + +#: js/ui/status/network.js:804 +msgid "Turn Off Airplane Mode" +msgstr "Cuir am modh itealain dheth" + +#: js/ui/status/network.js:813 +msgid "Wi-Fi is Off" +msgstr "Tha WiFi dheth" + +#: js/ui/status/network.js:814 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Feumaidh tu WiFi a chur air gus ceangal ri lìonra." + +#: js/ui/status/network.js:815 +msgid "Turn On Wi-Fi" +msgstr "Cuir WiFi air" + +#: js/ui/status/network.js:840 +msgid "Wi-Fi Networks" +msgstr "Lìonraidhean WiFi" + +#: js/ui/status/network.js:842 +msgid "Select a network" +msgstr "Tagh lìonra" + +#: js/ui/status/network.js:872 +msgid "No Networks" +msgstr "Chan eil lìonra ann" + +#: js/ui/status/network.js:893 js/ui/status/rfkill.js:110 +msgid "Use hardware switch to turn off" +msgstr "Cleachd suidse bathair-chruaidh gus a chur dheth" + +#: js/ui/status/network.js:1172 +msgid "Select Network" +msgstr "Tagh lìonra" + +#: js/ui/status/network.js:1178 +msgid "Wi-Fi Settings" +msgstr "Roghainnean WiFi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1297 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Tha hotspot %s gnìomhach" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1312 +#, javascript-format +msgid "%s Not Connected" +msgstr "Chan eil %s ceangailte" + +#: js/ui/status/network.js:1412 +msgid "connecting…" +msgstr "a’ dèanamh ceangal…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1415 +msgid "authentication required" +msgstr "tha feum air dearbhadh" + +#: js/ui/status/network.js:1417 +msgid "connection failed" +msgstr "dh’fhàillig leis a’ cheangal" + +#: js/ui/status/network.js:1471 +msgid "VPN Settings" +msgstr "Roghainnean VPN" + +#: js/ui/status/network.js:1484 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1494 +msgid "VPN Off" +msgstr "Tha VPN dheth" + +#: js/ui/status/network.js:1558 js/ui/status/rfkill.js:88 +msgid "Network Settings" +msgstr "Roghainnean an lìonraidh" + +#: js/ui/status/network.js:1587 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s cheangal uèirichte" +msgstr[1] "%s cheangal uèirichte" +msgstr[2] "%s ceanglaichean uèirichte" +msgstr[3] "%s ceangal uèirichte" + +#: js/ui/status/network.js:1591 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s cheangal WiFi" +msgstr[1] "%s cheangal WiFi" +msgstr[2] "%s ceanglaichean WiFi" +msgstr[3] "%s ceangal WiFi" + +#: js/ui/status/network.js:1595 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s cheangal mòdaim" +msgstr[1] "%s cheangal mòdaim" +msgstr[2] "%s ceanglaichean mòdaim" +msgstr[3] "%s ceangal mòdaim" + +#: js/ui/status/network.js:1727 +msgid "Connection failed" +msgstr "Dh’fhàillig leis a’ cheangal" + +#: js/ui/status/network.js:1728 +msgid "Activation of network connection failed" +msgstr "Dh’fhàillig gnìomhachadh a’ cheangail ris an lìonra" + +#: js/ui/status/nightLight.js:64 +msgid "Night Light Disabled" +msgstr "Tha an solas-oidhche à comas" + +#: js/ui/status/nightLight.js:65 +msgid "Night Light On" +msgstr "Tha an solas-oidhche air" + +#: js/ui/status/nightLight.js:66 +msgid "Resume" +msgstr "Lean air" + +#: js/ui/status/nightLight.js:67 +msgid "Disable Until Tomorrow" +msgstr "Cuir à comas gus a-màireach" + +#: js/ui/status/power.js:52 +msgid "Power Settings" +msgstr "Roghainnean na cumhachd" + +#: js/ui/status/power.js:68 +msgid "Fully Charged" +msgstr "Air a làn-teàirrdseadh" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:75 js/ui/status/power.js:81 +msgid "Estimating…" +msgstr "’Ga thuairmeas…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d air fhàgail (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:94 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d gus am bi e làn (%d%%)" + +#: js/ui/status/power.js:122 js/ui/status/power.js:124 +#, javascript-format +msgid "%d %%" +msgstr "%d%%" + +#: js/ui/status/remoteAccess.js:46 +msgid "Screen is Being Shared" +msgstr "Tha an sgrìn ’ga cho-roinneadh" + +#: js/ui/status/remoteAccess.js:48 +#| msgid "Turn Off" +msgid "Turn off" +msgstr "Cuir dheth" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:83 +msgid "Airplane Mode On" +msgstr "Tha am modh itealain air" + +#: js/ui/status/system.js:230 +msgid "Switch User" +msgstr "Leum gu cleachdaiche eile" + +#: js/ui/status/system.js:242 +msgid "Log Out" +msgstr "Clàraich a-mach" + +#: js/ui/status/system.js:254 +msgid "Account Settings" +msgstr "Roghainnean a’ chunntais" + +#: js/ui/status/system.js:282 +msgid "Orientation Lock" +msgstr "Glais na comhair" + +#: js/ui/status/system.js:308 +msgid "Suspend" +msgstr "Cuir ’na dhàil" + +#: js/ui/status/system.js:318 +msgid "Power Off" +msgstr "Cuir dheth" + +#: js/ui/status/thunderbolt.js:268 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#. we are done +#: js/ui/status/thunderbolt.js:324 +msgid "Unknown Thunderbolt device" +msgstr "Uidheam Thunderbolt nach aithne dhuinn" + +#: js/ui/status/thunderbolt.js:325 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "Mhothaich sinn do dh’uidheam ùr fhad ’s an robh thu air falbh. Bris an ceangal is ceangail an uidheam a-rithist gus a chleachdadh." + +#: js/ui/status/thunderbolt.js:330 +msgid "Thunderbolt authorization error" +msgstr "Mearachd dearbhadh Thunderbolt" + +#: js/ui/status/thunderbolt.js:331 +#, javascript-format +#| msgid "Could not authorize the thunderbolt device: %s" +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Cha b’ urrainn dhuinn an t-uidheam Thunderbolt ùghdarrachadh: %s" + +#: js/ui/status/volume.js:135 +msgid "Volume changed" +msgstr "Dh’atharraich àirde na fuaime" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Sgàthanaich" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Cuir iad còmhla" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Taobh a-muigh a-mhàin" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "’Na bhroinn a-mhàin" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Clàraich a-steach mar chleachdaiche eile" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Thoir a’ ghlas far na h-uinneige" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Aplacaidean" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Lorg" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "Tha “%s” deiseil" + +#: js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "A bheil thu airson na roghainnean seallaidh seo a chumail?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:75 +msgid "Revert Settings" +msgstr "Till na roghainnean" + +#: js/ui/windowManager.js:78 +msgid "Keep Changes" +msgstr "Cùm na h-atharraichean" + +#: js/ui/windowManager.js:96 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Thèid na h-atharraichean air na roghainnean a thilleadh an ceann %d diog" +msgstr[1] "Thèid na h-atharraichean air na roghainnean a thilleadh an ceann %d dhiog" +msgstr[2] "Thèid na h-atharraichean air na roghainnean a thilleadh an ceann %d diogan" +msgstr[3] "Thèid na h-atharraichean air na roghainnean a thilleadh an ceann %d diog" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:686 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Fìor-lùghdaich" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Neo-làn-mheudaich" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Làn-mheudaich" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Gluais" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Ath-mheudaich" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Gluais am bàr-tiotail air an sgrìn" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Air a’ bhàrr an-còmhnaidh" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Air rùm-obrach a tha ri fhaicinn an-còmhnaidh" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Gluais dhan rùm-obrach air an taobh chlì" + +#: js/ui/windowMenu.js:109 +msgid "Move to Workspace Right" +msgstr "Gluais dhan rùm-obrach air an taobh deas" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Gluais dhan rùm-obrach aig a’ bhàrr" + +#: js/ui/windowMenu.js:121 +msgid "Move to Workspace Down" +msgstr "Gluais dhan rùm-obrach aig a’ bhonn" + +#: js/ui/windowMenu.js:139 +msgid "Move to Monitor Up" +msgstr "Gluais dhan mhonatair aig a’ bhàrr" + +#: js/ui/windowMenu.js:148 +msgid "Move to Monitor Down" +msgstr "Gluais dhan mhonatair aig a’ bhonn" + +#: js/ui/windowMenu.js:157 +msgid "Move to Monitor Left" +msgstr "Gluais dhan mhonatair air an taobh chlì" + +#: js/ui/windowMenu.js:166 +msgid "Move to Monitor Right" +msgstr "Gluais dhan mhonatair air an taobh deas" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Mìosachan Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:410 +msgid "Print version" +msgstr "Seall an tionndadh" + +#: src/main.c:416 +msgid "Mode used by GDM for login screen" +msgstr "Am modh a chleachdas GDM airson na sgrìn clàraidh a-steach" + +#: src/main.c:422 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Cleachd modh sònraichte airson na sgrìn clàraidh a-steach, can “gdm”" + +#: src/main.c:428 +msgid "List possible modes" +msgstr "Seall na modhan a tha ann" + +#: src/shell-app.c:272 +msgctxt "program" +msgid "Unknown" +msgstr "Chan eil fhios" + +#: src/shell-app.c:523 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Cha b’ urrainn dhuinn “%s” a chur gu dol" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Chan eil an dà fhacal-faire co-ionann." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Chan fhaod am facal-faire a bhith bàn" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Leig an cleachdaiche an dearbhadh seachad" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u às-chur" +msgstr[1] "%u às-chur" +msgstr[2] "%u às-chuir" +msgstr[3] "%u às-chur" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ion-chur" +msgstr[1] "%u ion-chur" +msgstr[2] "%u ion-chuir" +msgstr[3] "%u ion-chur" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Fuaimean an t-siostaim" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Cuir a’ chumhachd dheth" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Clàraich a-mach" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Dèan suids eadar cleachdaichean" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Roghainnean airson leudachain na Slige GNOME" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Ath-stiùireadh an dearbhaidh-lìn" + +#~ msgid "Events" +#~ msgstr "Tachartasan" + +#~ msgid "Notifications" +#~ msgstr "Brathan" + +#~ msgid "Hide tray" +#~ msgstr "Falaich an treidhe" + +#~ msgid "Status Icons" +#~ msgstr "Ìomhaigheagan staide" + +#~ msgid "Clear section" +#~ msgstr "Falamhaich an earrann" + +#~ msgid "Media" +#~ msgstr "Meadhanan" + +#~ msgid "Not In Use" +#~ msgstr "Chan eil e 'ga chleachdadh" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Use as Internet connection" +#~ msgstr "Cleachd e mar cheangal ris an eadar-lìon" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Slige GNOME (co-dhèanadair wayland)" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..3724d7f --- /dev/null +++ b/po/gl.po @@ -0,0 +1,3482 @@ +# Galician translation for gnome-shell. +# Copyright (C) 2012 Leandro Regueiro +# This file is distributed under the same license as the gnome-shell package. +# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas +# colaborar connosco, podes atopar máis información en http://www.trasno.net +# Antón Méixome , 2009. +# Fran Diéguez , 2009, 2010, 2011, 2012. +# Leandro Regueiro , 2012. +# Fran Dieguez , 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-09 10:41+0000\n" +"PO-Revision-Date: 2019-02-09 13:34+0200\n" +"Last-Translator: Fran Dieguez \n" +"Language-Team: Galician\n" +"Language: gl\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: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Mostrar a lista de notificacións" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Enfocar a notificación activa" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Mostrar a vista xeral" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Mostrar todos os aplicativos" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Abrir o menú de aplicativo" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:221 +msgid "Shell Extensions" +msgstr "Extensións de Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configure as extensións de GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Xestor de xanelas e inicio de aplicativos" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Activar as ferramentas internas útiles para os desenvolvedores e probadores " +"usando Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permite o acceso ás ferramentas de depuración e monitorización internas " +"usando o diálogo Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs das extensións a activar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"As extensións do GNOME Shell teñen unha propiedade UUID; esta chave lista as " +"extensións que deberían cargarse. Calquera extensión que queira ser cargada " +"debe estar nesta lista. Pode modificar esta lista cos métodos " +"EnableExtension e DisableExtension de D-Bus en org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Desactivar as extensións do usuario" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Desactiva todas as extensións que o usuario activou sen cambiar á " +"preferencia «enabled-extensions»" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Desactiva a validación da compatibilidade de versión das extensións" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell só cargará extensións que reclamen compatibilidade coa versión " +"executándose actualmente. Ao activar esta opción desactivarase esta " +"comprobación e probarase a cagar todas as extensións sen importar que " +"versión reclaman." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lista de ID de ficheiros de escritorio para os aplicativos preferidos" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Os aplicativos que corresponden a estes identificadores mostraranse na área " +"de preferidos." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Visualización da selección de aplicativos" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Índice da vista seleccionada actualmente no selector de aplicativo." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historial do diálogo de ordes (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historial do diálogo de «looking glass»" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Mostrar sempre o elemento de menú «Saír da sesión» no menú de usuario." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Esta chave sobrescribe a ocultación automática do elemento de menú «Saír da " +"sesión» en situacións con un único usuario ou única sesión." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Indica se se debe lembrar o contrasinal para montar os sistemas de ficheiros " +"cifrados ou remotos" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"O shell non solicitará o contrasinal cando un dispositivo cifrado ou un " +"sistema de ficheiros remoto se monta. Se o contrasinal se pode gardar para o " +"futuro aparecerá a opción «Lembrar contrasinal» Esta chave estabelece o " +"estado por omisión da opción. " + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Indica se o adaptador de Bluetooth por omisión ten configurados dispositivos " +"asociados a el" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"O shell só mostrará o elemento de menú de Bluetooth se hai un adaptador de " +"Bluetooth conectado ou se houbera dispositivos asociados co adaptador " +"principal. Isto restabelecerase se o adaptador por omisión non se ve ou non " +"ten dispositivos asociados a el." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Activar o API de introspección" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Activar o API de D-Bus que permite introspeccionar o estado do aplicativo do " +"shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Combinación de teclas para abrir o menú de aplicativo" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Combinación de teclas para abrir o menú de aplicativo." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Combinación de teclas para abrir a vista «Mostrar aplicativos»" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Combinación de teclas para abrir a vista \"Mostrar aplicativos\" da Vista " +"xera de Actividades." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Combinación de teclas para abrir a Vista xeral" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Combinación de teclas para abrir a Vista de actividades." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Combinación de teclas para trocar a visibilidade da área de notificacións" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Combinación de teclas para trocar a visibilidade da área de notificacións." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Combinación de teclas para enfocar a notificación activa" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Combinación de teclas para enfocar a notificación activa." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "Atallo de teclado que pausa e reinicia todo os xemelgos executándose." + +#: data/org.gnome.shell.gschema.xml.in:150 +#| msgid "Show Applications" +msgid "Switch to application 1" +msgstr "Cambiar ao aplicativo 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Cambiar ao aplicativo 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Cambiar ao aplicativo 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Cambiar ao aplicativo 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Cambiar ao aplicativo 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Cambiar ao aplicativo 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Cambiar ao aplicativo 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Cambiar ao aplicativo 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Cambiar ao aplicativo 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Que teclado usar" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "O tipo de teclado a usar." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Restrinxir o trocador ao espazo de traballo actual." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Se é verdadeiro, só se mostran no trocador os aplicativos que teñen xanelas " +"no espazo de traballo actual. Doutra maneira inclúense todos os aplicativos." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "O modo da icona do aplicativo." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configura como se mostran as xanelas no intercambiador. As opcións posíbeis " +"son «thumbnail-only» (mostra unha miniatura da xanela, «app-icon-only» (só " +"mostra a icona do aplicativo) ou «both» (móstranse ambas cosas)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Se é verdadeiro, só se mostrarán no trocador as xanelas do espazo de " +"traballo actual. Doutra maneira inclúense todos os aplicativos." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Anexar o diálogo modal á xanela pai" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Esta chave sobrescribe a chave en org.gnome.mutter cando executa GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Activar o mosaico nos bordos ao arrastrar xanelas aos bordos da xanela" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Os espazos de traballo xestiónanse dinamicamente" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Espazos de traballo só no monitor primario" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Atrasar os cambios de foco no modo rato até que o punteiro se pare" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Inicio de sesión de rede" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:121 +msgid "Something’s gone wrong" +msgstr "Algo foi mal" + +#: js/extensionPrefs/main.js:128 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Sentímolo, pero houbo un problema: a configuración para esta extensión non " +"pode mostrarse. Recomendámoslle que informe do problema aos autores da " +"extensión." + +#: js/extensionPrefs/main.js:135 +#| msgid "Show Details" +msgid "Technical Details" +msgstr "Detalles técnicos" + +#: js/extensionPrefs/main.js:170 +#| msgid "Show Errors" +msgid "Copy Error" +msgstr "Copiar erro" + +#: js/extensionPrefs/main.js:190 +#| msgid "Home" +msgid "Homepage" +msgstr "Sitio web" + +#: js/extensionPrefs/main.js:191 +#| msgid "UUIDs of extensions to enable" +msgid "Visit extension homepage" +msgstr "Visitar o sitio web da extensión" + +#: js/extensionPrefs/main.js:454 +#| msgid "No extensions installed" +msgid "No Extensions Installed" +msgstr "Non hai ningunha extensión instalada" + +#: js/extensionPrefs/main.js:464 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"As extensións poden instalarse mediante Software ou extensions.gnome.org." + +#: js/extensionPrefs/main.js:479 +msgid "Browse in Software" +msgstr "Explorar en Software" + +#: js/gdm/authPrompt.js:144 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:437 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:330 js/ui/status/network.js:894 +msgid "Cancel" +msgstr "Cancelar" + +#: js/gdm/authPrompt.js:163 js/gdm/authPrompt.js:206 js/gdm/authPrompt.js:438 +msgid "Next" +msgstr "Seguinte" + +#: js/gdm/authPrompt.js:202 js/ui/shellMountOperation.js:334 +#: js/ui/unlockDialog.js:55 +msgid "Unlock" +msgstr "Desbloquear" + +#: js/gdm/authPrompt.js:204 +msgctxt "button" +msgid "Sign In" +msgstr "Iniciar sesión" + +#: js/gdm/loginDialog.js:311 +msgid "Choose Session" +msgstr "Escolla unha sesión" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:455 +msgid "Not listed?" +msgstr "Non está na lista?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:889 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(p.ex., usuario ou %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:894 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Nome de usuario: " + +#: js/gdm/loginDialog.js:1232 +msgid "Login Window" +msgstr "Xanela de inicio de sesión" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "Erro de autenticación" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(ou pase o dedo)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "Apagar" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +msgid "power off;shutdown;reboot;restart" +msgstr "apagar;reiniciar;" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:101 +msgctxt "search-result" +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:104 +msgid "lock screen" +msgstr "bloquear pantalla;bloquear" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "Saír da sesión" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "pechar a sesión;desloguearse;saír da sesión" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "Suspender" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "Suspender;durmir" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +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:125 +msgid "switch user" +msgstr "cambiar de usuario" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +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:132 +msgid "lock orientation;screen;rotation" +msgstr "bloquear orientación;pantalla;rotación" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Orde non atopada" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Non foi posíbel analizar a orde:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Produciuse un fallo na execución de «%s»:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Xusto agora" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "hai %d minuto" +msgstr[1] "hai %d minutos" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "hai %d hora" +msgstr[1] "hai %d horas" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Onte" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "hai %d día" +msgstr[1] "hai %d días" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "hai %d semana" +msgstr[1] "hai %d semanas" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "hai %d mes" +msgstr[1] "hai %d meses" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "hai %d ano" +msgstr[1] "hai %d anos" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Onte, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A ás %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%d de %B ás %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%d de %B de %Y ás %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Onte, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%d de %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%d de %B de %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "Inicio de sesión do Hotspot" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"A súa conexión a este inicio de sesión de hotspot non é segura. Os " +"contrasinais e outra información que escriba nesta páxina pode ser vista " +"porque persoas cercanas." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "Denegar acceso" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "Conceder acceso" + +#: js/ui/appDisplay.js:671 +msgid "Frequently used applications will appear here" +msgstr "Os aplicativos usados recentemente aparecerán aquí" + +#: js/ui/appDisplay.js:786 +msgid "Frequent" +msgstr "Frecuentes" + +#: js/ui/appDisplay.js:793 +msgid "All" +msgstr "Todos" + +#: js/ui/appDisplay.js:1748 js/ui/panel.js:93 +msgid "New Window" +msgstr "Xanela nova" + +#: js/ui/appDisplay.js:1762 +msgid "Launch using Dedicated Graphics Card" +msgstr "Iniciar usando a Tarxeta Gráfica Adicada" + +#: js/ui/appDisplay.js:1789 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "Retirar dos marcadores" + +#: js/ui/appDisplay.js:1795 +msgid "Add to Favorites" +msgstr "Engadir aos favoritos" + +#: js/ui/appDisplay.js:1805 js/ui/panel.js:104 +msgid "Show Details" +msgstr "Mostrar detalles" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s foi engadido aos seus favoritos." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s retirouse dos seus marcadores." + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "Seleccionar dispositivo de son" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "Preferencias de son" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "Cascos auriculares" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "Auriculares" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "Micrófono" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "Cambiar fondo de escritorio…" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Preferencias da pantalla" + +#: js/ui/backgroundMenu.js:18 +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:42 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:71 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:73 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:75 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:77 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:79 +msgctxt "grid thursday" +msgid "T" +msgstr "X" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:81 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:83 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:346 +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:356 +msgid "%OB %Y" +msgstr "%B de %Y" + +#: js/ui/calendar.js:413 +msgid "Previous month" +msgstr "Anterior mes" + +#: js/ui/calendar.js:424 +msgid "Next month" +msgstr "Seguinte mes" + +#: js/ui/calendar.js:578 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:633 +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:701 +msgctxt "event list time" +msgid "All Day" +msgstr "Todo o día" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %d de %B" + +#: js/ui/calendar.js:837 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %d de %B de %Y" + +#: js/ui/calendar.js:1060 +msgid "No Notifications" +msgstr "Non hai notificacións" + +#: js/ui/calendar.js:1063 +msgid "No Events" +msgstr "Non hai eventos" + +#: js/ui/calendar.js:1089 +msgid "Clear" +msgstr "Limpar" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» non está respondendo." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Debe escoller se quere agardar que continúe ou forzar que o aplicativo peche " +"por completo." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Forzar peche" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Agardar" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "Unidade externa conectada" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Unidade externa desconectada" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "Abrir con %s" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "Contrasinal:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "Escriba de novo:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"De forma alternativa pode conectarse premendo o botón «WPS» do seu ruter." + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:225 +#: js/ui/status/network.js:315 js/ui/status/network.js:897 +msgid "Connect" +msgstr "Conectar" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Contrasinal: " + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "Chave: " + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Contrasinal da chave privada: " + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Identidade: " + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Servizo: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "A rede sen fíos require autenticación" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Requírense contrasinais ou chaves de cifrado para acceder á rede sen fíos " +"«%s»." + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "Autenticación con fíos 802.1X" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Nome da rede:" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "Autenticación DSL" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "Requírese un código PIN" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +msgid "PIN code is needed for the mobile broadband device" +msgstr "É necesario un código PIN para o dispositivo de banda larga móbil" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN:" + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "Contrasinal da rede de banda larga móbil" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, 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:682 js/ui/status/network.js:1671 +msgid "Network Manager" +msgstr "Xestor da rede" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "Requírese autenticación" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "Administrador" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "Autenticar" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:314 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Desculpe, iso non funcionou. Ténteo de novo." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:785 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Agora %s chámase %s" + +#: js/ui/ctrlAltTab.js:25 js/ui/viewSelector.js:176 +msgid "Windows" +msgstr "Xanelas" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +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:397 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:74 +msgid "%B %-d %Y" +msgstr "%e de %B de %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A, %e de %B de %Y" + +#: js/ui/dateMenu.js:143 +msgid "Add world clocks…" +msgstr "Engadir reloxos do mundo…" + +#: js/ui/dateMenu.js:144 +msgid "World Clocks" +msgstr "Reloxos do mundo" + +#: js/ui/dateMenu.js:234 +msgid "Weather" +msgstr "Tempo" + +#: js/ui/dateMenu.js:317 +msgid "Select a location…" +msgstr "Seleccione unha localizacion…" + +#: js/ui/dateMenu.js:325 +msgid "Loading…" +msgstr "Cargando…" + +#: js/ui/dateMenu.js:335 +msgid "Go online for weather information" +msgstr "Conectarse para var a información do tempo" + +#: js/ui/dateMenu.js:337 +msgid "Weather information is currently unavailable" +msgstr "A información do tempo non está dispoñíbel actualmente" + +#: js/ui/endSessionDialog.js:49 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Saír da sesión de %s" + +#: js/ui/endSessionDialog.js:50 +msgctxt "title" +msgid "Log Out" +msgstr "Saír da sesión" + +#: js/ui/endSessionDialog.js:52 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Vaise pechar a sesión de %s en %d segundo." +msgstr[1] "Vaise pechar a sesión de %s en %d segundos." + +#: js/ui/endSessionDialog.js:57 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "A súa sesión pecharase automaticamente en %d segundo." +msgstr[1] "A súa sesión pecharase automaticamente en %d segundos." + +#: js/ui/endSessionDialog.js:63 +msgctxt "button" +msgid "Log Out" +msgstr "Saír da sesión" + +#: js/ui/endSessionDialog.js:69 +msgctxt "title" +msgid "Power Off" +msgstr "Apagar" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalar actualizacións e apagar" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "O sistema apagarase automaticamente en %d segundo." +msgstr[1] "O sistema apagarase automaticamente en %d segundos." + +#: js/ui/endSessionDialog.js:76 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalar actualizacóns de software pendentes" + +#: js/ui/endSessionDialog.js:79 js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:81 +msgctxt "button" +msgid "Power Off" +msgstr "Apagar" + +#: js/ui/endSessionDialog.js:88 +msgctxt "title" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:90 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "O sistema reiniciarase automaticamente en %d segundo." +msgstr[1] "O sistema reiniciarase automaticamente en %d segundos." + +#: js/ui/endSessionDialog.js:104 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reiniciar e instalar actualizacións" + +#: js/ui/endSessionDialog.js:106 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"O sistema reiniciarase automaticamente e instalará as actualizacións en %d " +"segundo." +msgstr[1] "" +"O sistema reiniciarase automaticamente e instalará as actualizacións en %d " +"segundos." + +#: js/ui/endSessionDialog.js:112 js/ui/endSessionDialog.js:132 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reiniciar e instalar" + +#: js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalar e apagar" + +#: js/ui/endSessionDialog.js:114 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Apagar despois de instalar as actualizacións" + +#: js/ui/endSessionDialog.js:122 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reiniciar e instalar anovación" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:127 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s instalarase despois do reinicio. A instalación de anovacións pode " +"levar algún tempo: asegúrese que ten unha copia de respaldo dos seus datos e " +"que o seu computador está enchufado." + +#: js/ui/endSessionDialog.js:316 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Con enerxía da batería: enchufar antes de instalar actualizacións." + +#: js/ui/endSessionDialog.js:333 +msgid "Some applications are busy or have unsaved work." +msgstr "Algúns aplicativos están ocupados ou teñen traballo sen gardar." + +#: js/ui/endSessionDialog.js:340 +msgid "Other users are logged in." +msgstr "Hai outros usuarios conectados." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:621 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remoto)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:624 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consola)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "Instalar" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Desexa descargar e instalar «%s» desde extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s quere inhibir os atallos de teclado" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "O aplicativo quere inhibir os atallos de teclado" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Pode restaurar os atallos de teclado premendo %s." + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "Denegar" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "Permitir" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "Teclas lentas activadas" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "Teclas lentas desactivadas" + +#: js/ui/kbdA11yDialog.js:34 +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:41 +msgid "Sticky Keys Turned On" +msgstr "Teclas persistentes activadas" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "Teclas persistentes desactivadas" + +#: js/ui/kbdA11yDialog.js:44 +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:46 +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:58 +msgid "Leave On" +msgstr "Deixar activado" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1270 +msgid "Turn On" +msgstr "Activar" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:134 js/ui/status/network.js:316 +#: js/ui/status/network.js:1270 js/ui/status/network.js:1382 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Apagar" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "Deixar desactivado" + +#: js/ui/keyboard.js:209 +msgid "Region & Language Settings" +msgstr "Preferencias de rexión e idioma" + +#: js/ui/lookingGlass.js:627 +msgid "No extensions installed" +msgstr "Non hai ningunha extensión instalada" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:681 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s non emitiu ningún erro." + +#: js/ui/lookingGlass.js:687 +msgid "Hide Errors" +msgstr "Ocultar erros" + +#: js/ui/lookingGlass.js:691 js/ui/lookingGlass.js:751 +msgid "Show Errors" +msgstr "Mostrar erros" + +#: js/ui/lookingGlass.js:700 +msgid "Enabled" +msgstr "Activado" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:703 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Desactivado" + +#: js/ui/lookingGlass.js:705 +msgid "Error" +msgstr "Erro" + +#: js/ui/lookingGlass.js:707 +msgid "Out of date" +msgstr "Obsoleto" + +#: js/ui/lookingGlass.js:709 +msgid "Downloading" +msgstr "Descargando" + +#: js/ui/lookingGlass.js:733 +msgid "View Source" +msgstr "Ver fonte" + +#: js/ui/lookingGlass.js:742 +msgid "Web Page" +msgstr "Páxina web" + +#: js/ui/messageTray.js:1483 +msgid "System Information" +msgstr "Información do sistema" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "Artista descoñecido" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "Título descoñecido" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "Volume" + +#: js/ui/overview.js:78 +msgid "Undo" +msgstr "Desfacer" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:105 +msgid "Overview" +msgstr "Vista xeral" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:231 +msgid "Type to search…" +msgstr "Escriba para buscar…" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "Novo atallo…" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "Aplicativo definido" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "Mostrar a axuda en pantalla" + +#: js/ui/padOsd.js:153 +msgid "Switch monitor" +msgstr "Cambiar monitor" + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "Asignar combinación de teclas" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "Feito" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "Editar…" + +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "Ningún" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "Prema un botón para continuar" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "Prema Esc para saír" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "Prema calquera tecla para saír" + +#: js/ui/panel.js:118 +msgid "Quit" +msgstr "Saír" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:476 +msgid "Activities" +msgstr "Actividades" + +#: js/ui/panel.js:751 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:872 +msgid "Top Bar" +msgstr "Barra superior" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Escriba unha orde" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:167 +msgid "Close" +msgstr "Pechar" + +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "Reiniciar non está dispoñíbel en Wayland" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "Reiniciando…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %d de %B" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d mensaxe nova" +msgstr[1] "%d mensaxes novas" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notificación nova" +msgstr[1] "%d notificacións novas" + +#: js/ui/screenShield.js:458 js/ui/status/system.js:291 +msgid "Lock" +msgstr "Bloquear" + +#: js/ui/screenShield.js:722 +msgid "GNOME needs to lock the screen" +msgstr "GNOME precisa bloquear a pantalla" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:843 js/ui/screenShield.js:1316 +msgid "Unable to lock" +msgstr "Non foi posíbel bloquear" + +#: js/ui/screenShield.js:844 js/ui/screenShield.js:1317 +msgid "Lock was blocked by an application" +msgstr "Un aplicativo impediu o bloqueo" + +#: js/ui/search.js:644 +msgid "Searching…" +msgstr "Buscando…" + +#: js/ui/search.js:646 +msgid "No results." +msgstr "Sen resultados." + +#: js/ui/search.js:770 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d máis" +msgstr[1] "%d máis" + +#: js/ui/shellEntry.js:21 +msgid "Copy" +msgstr "Copiar" + +#: js/ui/shellEntry.js:26 +msgid "Paste" +msgstr "Pegar" + +#: js/ui/shellEntry.js:92 +msgid "Show Text" +msgstr "Mostrar texto" + +#: js/ui/shellEntry.js:94 +msgid "Hide Text" +msgstr "Ocultar texto" + +#: js/ui/shellMountOperation.js:301 +msgid "Password" +msgstr "Contrasinal" + +#: js/ui/shellMountOperation.js:322 +msgid "Remember Password" +msgstr "Lembrar contrasinal" + +#: js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Accesibilidade" + +#: js/ui/status/accessibility.js:54 +msgid "Zoom" +msgstr "Ampliación" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Reader" +msgstr "Lector da pantalla" + +#: js/ui/status/accessibility.js:65 +msgid "Screen Keyboard" +msgstr "Teclado en pantalla" + +#: js/ui/status/accessibility.js:69 +msgid "Visual Alerts" +msgstr "Alertas visuais" + +#: js/ui/status/accessibility.js:72 +msgid "Sticky Keys" +msgstr "Teclas persistentes" + +#: js/ui/status/accessibility.js:75 +msgid "Slow Keys" +msgstr "Teclas lentas" + +#: js/ui/status/accessibility.js:78 +msgid "Bounce Keys" +msgstr "Rexeite de teclas" + +#: js/ui/status/accessibility.js:81 +msgid "Mouse Keys" +msgstr "Teclas do rato" + +#: js/ui/status/accessibility.js:155 +msgid "High Contrast" +msgstr "Contraste alto" + +#: js/ui/status/accessibility.js:186 +msgid "Large Text" +msgstr "Texto grande" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:591 +msgid "Bluetooth Settings" +msgstr "Preferencias do Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d conectado" +msgstr[1] "%d conectados" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "Desactivado" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "Activado" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "Brillo" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "Teclado" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "Mostrar a distribución do teclado" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "Localización activada" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "Desactivar" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "Preferencias da privacidade" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "Localización en uso" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "Localización desactivada" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "Activar" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Darlle acceso a %s á súa localización?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Pode cambiar o acceso á localización en calquera momento desde as " +"preferencias de privacidade." + +#: js/ui/status/network.js:72 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:422 js/ui/status/network.js:1299 +#, javascript-format +msgid "%s Off" +msgstr "%s apagado" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:425 +#, javascript-format +msgid "%s Connected" +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:430 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s sen xestionar" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:433 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s desconectando" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:440 js/ui/status/network.js:1291 +#, 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:443 +#, 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:451 +#, 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:455 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s non dispoñíbel" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:458 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s conexión fallada" + +#: js/ui/status/network.js:470 +msgid "Wired Settings" +msgstr "Preferencias da rede con fíos" + +#: js/ui/status/network.js:512 +msgid "Mobile Broadband Settings" +msgstr "Preferencias da banda larga móbil" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:559 js/ui/status/network.js:1296 +#, 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:563 +#, javascript-format +msgid "%s Disabled" +msgstr "%s desactivado" + +#: js/ui/status/network.js:603 +msgid "Connect to Internet" +msgstr "Conectarse a internet" + +#: js/ui/status/network.js:792 +msgid "Airplane Mode is On" +msgstr "Modo avión activado" + +#: js/ui/status/network.js:793 +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:794 +msgid "Turn Off Airplane Mode" +msgstr "Desactivar o modo avión" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is Off" +msgstr "Wifi desactivada" + +#: js/ui/status/network.js:804 +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:805 +msgid "Turn On Wi-Fi" +msgstr "Activar Wifi" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi Networks" +msgstr "Redes WiFi" + +#: js/ui/status/network.js:832 +msgid "Select a network" +msgstr "Seleccione unha rede" + +#: js/ui/status/network.js:861 +msgid "No Networks" +msgstr "Sen redes" + +#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Usar interruptor hardware para apagar" + +#: js/ui/status/network.js:1158 +msgid "Select Network" +msgstr "Seleccione unha rede" + +#: js/ui/status/network.js:1164 +msgid "Wi-Fi Settings" +msgstr "Preferencias da WiFi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1287 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s punto wifi activo" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s non conectado" + +#: js/ui/status/network.js:1399 +msgid "connecting…" +msgstr "conectando…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1402 +msgid "authentication required" +msgstr "requírese autenticación" + +#: js/ui/status/network.js:1404 +msgid "connection failed" +msgstr "conexión fallada" + +#: js/ui/status/network.js:1454 +msgid "VPN Settings" +msgstr "Preferencias de VPN" + +#: js/ui/status/network.js:1471 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1481 +msgid "VPN Off" +msgstr "VPN desactivada" + +#: js/ui/status/network.js:1542 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Preferencias da rede" + +#: js/ui/status/network.js:1571 +#, 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:1575 +#, 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:1579 +#, 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:1708 +msgid "Connection failed" +msgstr "Produciuse un fallo na conexión" + +#: js/ui/status/network.js:1709 +msgid "Activation of network connection failed" +msgstr "Produciuse un fallo na activación da conexión de rede" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Luz nocturna desactivada" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Luz nocturna activada" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Reiniciar" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Desactivar ate mañán" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "Preferencias de enerxía" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "Carga completa" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "Non cargándose" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "Estimando…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d Faltan (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d ate cargado (%d %%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "A pantalla está compartíndose" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Desactivar" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Modo avión activado" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "Cambiar de usuario" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "Saír da sesión" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "Preferencias da conta" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "Bloqueo de orientación" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "Suspender" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "Apagar" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "Dispositivo Thunderbolt descoñecido" + +#: js/ui/status/thunderbolt.js:326 +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:329 +msgid "Unauthorized Thunderbolt device" +msgstr "Dispositivo Thunderbolt non autorizado" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Detectouse un novo dispositivo e precisa ser autorizado por un administrador." + +#: 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:136 +msgid "Volume changed" +msgstr "Volume cambiado" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "Espello" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "Unir pantallas" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "Só a externa" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "Só a interna" + +#: js/ui/unlockDialog.js:63 +msgid "Log in as another user" +msgstr "Iniciar sesión como outro usuario" + +#: js/ui/unlockDialog.js:80 +msgid "Unlock Window" +msgstr "Desbloquear xanela" + +#: js/ui/viewSelector.js:180 +msgid "Applications" +msgstr "Aplicativos" + +#: js/ui/viewSelector.js:184 +msgid "Search" +msgstr "Buscar" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» está preparado" + +#: js/ui/windowManager.js:60 +msgid "Do you want to keep these display settings?" +msgstr "Desexa manter estas preferencias de pantalla?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:72 +msgid "Revert Settings" +msgstr "Reverter preferencias" + +#: js/ui/windowManager.js:75 +msgid "Keep Changes" +msgstr "Manter cambios" + +#: js/ui/windowManager.js:93 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Os cambios das preferencias revertiranse en %d segundo" +msgstr[1] "Os cambios das preferencias revertiranse en %d segundos" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:669 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:27 +msgid "Minimize" +msgstr "Minimizar" + +#: js/ui/windowMenu.js:34 +msgid "Unmaximize" +msgstr "Restaurar" + +#: js/ui/windowMenu.js:38 +msgid "Maximize" +msgstr "Maximizar" + +#: js/ui/windowMenu.js:45 +msgid "Move" +msgstr "Mover" + +#: js/ui/windowMenu.js:51 +msgid "Resize" +msgstr "Redimensionar" + +#: js/ui/windowMenu.js:58 +msgid "Move Titlebar Onscreen" +msgstr "Mover a barra de título na pantalla" + +#: js/ui/windowMenu.js:63 +msgid "Always on Top" +msgstr "Sempre enriba" + +#: js/ui/windowMenu.js:82 +msgid "Always on Visible Workspace" +msgstr "Sempre no espazo de traballo visible" + +#: js/ui/windowMenu.js:96 +msgid "Move to Workspace Left" +msgstr "Mover ao espazo da esquerda" + +#: js/ui/windowMenu.js:102 +msgid "Move to Workspace Right" +msgstr "Mover ao espazo da dereita" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Up" +msgstr "Mover ao espazo de arriba" + +#: js/ui/windowMenu.js:114 +msgid "Move to Workspace Down" +msgstr "Mover ao espazo de abaixo" + +#: js/ui/windowMenu.js:132 +msgid "Move to Monitor Up" +msgstr "Mover ao monitor de arriba" + +#: js/ui/windowMenu.js:141 +msgid "Move to Monitor Down" +msgstr "Mover ao monitor de abaixo" + +#: js/ui/windowMenu.js:150 +msgid "Move to Monitor Left" +msgstr "Mover ao monitor da esquerda" + +#: js/ui/windowMenu.js:159 +msgid "Move to Monitor Right" +msgstr "Mover ao monitor da dereita" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendario de Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Imprimir versión" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Modo usado por GDM para a pantalla de inicio" + +#: src/main.c:420 +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:426 +msgid "List possible modes" +msgstr "Listar os modos posíbeis" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Descoñecido" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Produciuse un erro ao iniciar «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Os contrasinais non coinciden." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "O contrasinal non pode estar baleiro" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "O usuario rexeitou o diálogo de autenticación" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u saída" +msgstr[1] "%u saídas" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entradas" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sons do sistema" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Produciuse un erro ao cargar o diálogo de preferenzas para %s:" + +#~ msgid "%s all day." +#~ msgstr "%s todo o día" + +#~ msgid "%s, then %s later." +#~ msgstr "%s, entón %s máis tarde." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, entón %s, seguido de %s máis tarde." + +#~ msgid "Feels like %s." +#~ msgstr "Sensación de %s." + +#~| 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" + +#~ msgid "Status Icons" +#~ msgstr "Iconas de estado" + +#~ msgid "Events" +#~ msgstr "Eventos" + +#~ msgid "Notifications" +#~ msgstr "Notificacións" + +#~ msgid "Clear section" +#~ msgstr "Limpar sección" + +#~ msgid "Media" +#~ msgstr "Multimedia" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferencias das extensións de GNOME Shell" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Redirección web de autenticación" + +#~ msgid "Not In Use" +#~ msgstr "Non está en uso" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Mostrar a data da semana no calendario" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Se é verdadeiro, móstrase a data da semana ISO no calendario." + +#~ msgid "Use as Internet connection" +#~ msgstr "Usar como conexión a Internet" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s está solicitando acceso á súa localización." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (compositor de wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d dispositivo conectado" +#~ msgstr[1] "%d dispositivos conectados" + +#~ msgid "Authentication required" +#~ msgstr "Requírese autenticación" + +#~ msgid "UPS" +#~ msgstr "SAI" + +#~ msgid "Battery" +#~ msgstr "Batería" + +#~ msgid "Airplane Mode" +#~ msgstr "Modo avión" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Convite" + +#~ msgid "Call" +#~ msgstr "Chamar" + +#~ msgid "File Transfer" +#~ msgstr "Transferencia de ficheiro" + +#~ msgid "Chat" +#~ msgstr "Conversa" + +#~ msgid "Invitation to %s" +#~ msgstr "Convite a %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s estalle convidando a unirse a %s" + +#~ msgid "Decline" +#~ msgstr "Rexeitar" + +#~ msgid "Accept" +#~ msgstr "Aceptar" + +#~ msgid "Video call from %s" +#~ msgstr "Videochamada de %s" + +#~ msgid "Call from %s" +#~ msgstr "Chamada de %s" + +#~ msgid "Answer" +#~ msgstr "Responder" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s esta enviándolle %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s solicítalle permiso para ver cando está en liña" + +#~ msgid "Authentication failed" +#~ msgstr "Fallou a autenticación" + +#~ msgid "Encryption error" +#~ msgstr "Erro de cifrado" + +#~ msgid "Certificate not provided" +#~ msgstr "Certificado non fornecido" + +#~ msgid "Certificate untrusted" +#~ msgstr "Non se confía no certificado" + +#~ msgid "Certificate expired" +#~ msgstr "Certificado caducado" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificado non activado" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "O nome do servidor do certificado non coincide" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "A pegada do certificado non coincide" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificado autoasinado" + +#~ msgid "Status is set to offline" +#~ msgstr "O estado está definido a «desconectado»" + +#~ msgid "Certificate is invalid" +#~ msgstr "O certificado non é válido" + +#~ msgid "Connection has been refused" +#~ msgstr "Rexeitouse a conexión" + +#~ msgid "Connection can't be established" +#~ msgstr "Non é posíbel estabelecer a conexión" + +#~ msgid "Connection has been lost" +#~ msgstr "Perdeuse a conexión" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Esta cuenta xa está conectada ao servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "Substituíuse a conexión por unha nova conexión empregando o mesmo recurso" + +#~ msgid "The account already exists on the server" +#~ msgstr "Esta conta xa existe no servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "" +#~ "Nestes intres o servidor está moi ocupado tentando xestionar a conexión" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Revogouse o certificado" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "O certificado usa un algoritmo de cifrado inseguro ou é " +#~ "criptográficamente débil" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "A lonxitude do certificado do servidor ou a profundidade da cadea do " +#~ "certificado do servidor excede os límites impostos pola biblioteca de " +#~ "criptografía." + +#~ msgid "Internal error" +#~ msgstr "Erro interno" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Non foi posíbel conectarse a %s" + +#~ msgid "View account" +#~ msgstr "Ver conta" + +#~ msgid "Show the message list" +#~ msgstr "Mostrar a lista de mensaxes" + +#~ msgid "Captive Portal" +#~ msgstr "Portal cautivo" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Do" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "L" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "M" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "W" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "X" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "V" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "S" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nada programado" + +#~ msgid "Today" +#~ msgstr "Hoxe" + +#~ msgid "Tomorrow" +#~ msgstr "Mañá" + +#~ msgid "This week" +#~ msgstr "Esta semana" + +#~ msgid "Next week" +#~ msgstr "A vindeira semana" + +#~ msgid "Removable Devices" +#~ msgstr "Dispositivos extraíbeis" + +#~ msgid "Eject" +#~ msgstr "Expulsar" + +#~ msgid "Unmute" +#~ msgstr "Desactivar silencio" + +#~ msgid "Mute" +#~ msgstr "Silenciar" + +#~ msgid "Open Calendar" +#~ msgstr "Abrir Calendario" + +#~ msgid "Date & Time Settings" +#~ msgstr "Preferencias de data e hora" + +#~ msgid "Open" +#~ msgstr "Abrir" + +#~ msgid "Remove" +#~ msgstr "Retirar" + +#~ msgid "Clear Messages" +#~ msgstr "Limpar mensaxes" + +#~ msgid "Notification Settings" +#~ msgstr "Preferencias das notificacións" + +#~ msgid "Tray Menu" +#~ msgstr "Menú da bandexa do sistema" + +#~ msgid "No Messages" +#~ msgstr "Non hai mensaxes" + +#~ msgid "Message Tray" +#~ msgstr "Bandexa de mensaxes" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "O nivel de exactitude máxima para a localización." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Configura o nivel máximo de exactitude que os aplicativos de localización " +#~ "poden ver. As opcións válidas son 'off' (desactiva o seguimento de " +#~ "localización), 'country', 'city', 'neighborhood', 'street', e " +#~ "'exact' (normalmente requiren dun GPS). Teña en conta que isto só " +#~ "controla o que Geoclue lle permitirá aos aplicativos ver e que eles poden " +#~ "buscar a localizaócin do usuario usando os seus propios recursos de rede " +#~ "(con exactitude a nivel de rúa no mellor caso)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Distribución dos botóns na barra de títulos" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Esta chave sobrescribe a chave en org.gnome.wm.preferences cando executa " +#~ "GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Complemento" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Seleccione unha extensión que configurar usando a caixa combinada de " +#~ "arriba." + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "unavailable" +#~ msgstr "non dispoñíbel" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "%A, %H:%M" +#~ msgstr "%H:%M do %A" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d de %B de %Y, %H:%M " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Lista de categorías que se debería mostrar como cartafoles" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Cada nome de categoría nesta lista representarase como un cartafol na " +#~ "vista de aplicativos, no lugar de mostrarse en liña na vista principal." + +#~ msgid "Authorization request from %s" +#~ msgstr "Solicitude de autorización de %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "O dispositivo «%s» quere emparellarse con este equipo" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "O dispositivo %s quere acceder ao servizo «%s»" + +#~ msgid "Grant this time only" +#~ msgstr "Conceder só esta vez" + +#~ msgid "Reject" +#~ msgstr "Rexeitar" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Confirmación de emparellado para «%s»" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Confirme que a frase de paso «%06d» coincide coa mostrada no dispositivo." + +#~ msgid "Matches" +#~ msgstr "Coincide" + +#~ msgid "Does not match" +#~ msgstr "Non coincide" + +#~ msgid "Pairing request for %s" +#~ msgstr "Solicitude de emparellamento para «%s»" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Escriba o PIN mencionado no dispositivo." + +#~ msgid "OK" +#~ msgstr "Aceptar" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Hoxe non ten ningunha mensaxe:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s o oráculo dí" + +#~ msgid "Settings Menu" +#~ msgstr "Menú de preferencias" + +#~ msgid "Session" +#~ msgstr "Sesión" + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Usado internamente para gardar o último IM de presenza estabelecido " +#~ "explícitamente polo usuario. O valor aquí é da enumeración " +#~ "TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Usado internamente para gardar o último estado de presenza da sesión do " +#~ "usuario. O valor aquí é da GsmPresenceStatus." + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Prema en «Saír da sesión» para pechar estes aplicativos e saír da sesión " +#~ "do sistema." + +#~ msgid "Logging out of the system." +#~ msgstr "Saíndo da sesión do sistema." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Prema sobre «Apagar» para pechar estes aplicativos e apagar o sistema." + +#~ msgid "Powering off the system." +#~ msgstr "Apagando o sistema." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Prema «Reiniciar» para pechar estes aplicativos e reiniciar o sistema." + +#~ msgid "Restarting the system." +#~ msgstr "Reiniciando o sistema." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Se apaga o computador pode perder o traballo que non gardou." + +#~ msgid "Screenshots" +#~ msgstr "Capturas de pantalla" + +#~ msgid "Record a screencast" +#~ msgstr "Facer unha gravación da pantalla" + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Combinación de teclas para trocar a gravadora de pantalla" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "" +#~ "Combinación de teclas para iniciar/deter a gravadora de pantalla " +#~ "incrustada." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Taxa de marcos usada para gravar «screencast»." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "A taxa de marcos da grabación resultante grabada polo grabador de " +#~ "«screencast» de GNOME Shell, en marcos por segundo." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "A tubería de gstreamer usada para codificar o «screenast»." + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Estabelece a tubería GStreamer usada para codificar gravacións. Segue a " +#~ "sintaxe usada para gst-launch. A tubería debería ter un sumideiro " +#~ "(«sink») desconectado onde grabar o vídeo que se está grabando. " +#~ "Xeralmente terá un punto de orixe de desconectado; a saída dese punto " +#~ "escribirase no ficheiro de saída. Porén, a tubería tamén pode tomar parte " +#~ "na súa propia saída; isto pódese usar para enviar a saída a un servidor " +#~ "«icecast» a través de shout2send ou similar. Cando non está estabelecido " +#~ "ou está a un valor baleiro, usarase a tubería predeterminada. Actualmente " +#~ "é «vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +#~ "threads=%T ! queue ! webmmux» e grava en WEBM usando o códec VP8. Úsase " +#~ "%T como marcador de posición para o número de fillos óptimos no sistema." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Extensión de ficheiro que usar para almacenar os «screencast»" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "O nome do ficheiro para os «screencast» será un nome de ficheiro único " +#~ "baseado na data actual e usará esta extensión. Debería cambiar ao grabar " +#~ "nun formato de contedor diferente." + +#~ msgid "Power" +#~ msgstr "Apagar" + +#~ msgid "Restart" +#~ msgstr "Reiniciar" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Screencast desde %d %t" + +#~ msgid "Volume, network, battery" +#~ msgstr "Volume, rede, batería" + +#~ msgid "Universal Access Settings" +#~ msgstr "Preferencias do acceso universal" + +#~ msgid "Visibility" +#~ msgstr "Visibilidade" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Configurar un dispositivo novo…" + +#~ msgid "Send Files…" +#~ msgstr "Enviar ficheiros…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Preferencias do teclado" + +#~ msgid "Mouse Settings" +#~ msgstr "Preferencias do rato" + +#~ msgid "Wi-Fi" +#~ msgstr "Wifi" + +#~ msgid "disabled" +#~ msgstr "desactivada" + +#~ msgid "More…" +#~ msgstr "Máis…" + +#~ msgid "Wired" +#~ msgstr "Con fíos" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "Queda %d hora" +#~ msgstr[1] "Quedan %d horas" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "Quedan %d %s %d %s" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "hora" +#~ msgstr[1] "horas" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minuto" +#~ msgstr[1] "minutos" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "Queda %d minuto" +#~ msgstr[1] "Quedan %d minutos" + +#~ msgid "AC Adapter" +#~ msgstr "Adaptador de corrente" + +#~ msgid "Laptop Battery" +#~ msgstr "Batería do portátil" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgid "Mouse" +#~ msgstr "Rato" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "Teléfono móbil" + +#~ msgid "Media Player" +#~ msgstr "Reprodutor multimedia" + +#~ msgid "Tablet" +#~ msgstr "Tableta" + +#~ msgid "Computer" +#~ msgstr "Equipo" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Descoñecido" + +#~ msgid "Available" +#~ msgstr "Dispoñíbel" + +#~ msgid "Busy" +#~ msgstr "Ocupado" + +#~ msgid "Invisible" +#~ msgstr "Invisíbel" + +#~ msgid "Away" +#~ msgstr "Ausente" + +#~ msgid "Idle" +#~ msgstr "Inactivo" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "O seu estado de conversa estabelecerase a «ocupado»" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Agora as notificacións están desactivadas, incluíndo as mensaxes de " +#~ "conversa. O seu estado de conexión axustouse para que outros saiban que " +#~ "non quere ver as súas mensaxes." + +#~ msgid "cable unplugged" +#~ msgstr "cable desconectado" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "" +#~ "Indica se se deben recolectar estatísticas sobre o uso dos aplicativos" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "O shell normalmente monitoriza os aplicativos activos para mostrarlle os " +#~ "máis usados (p.ex. nos iniciadores). Aínda que estes datos se manteñen de " +#~ "forma privada, vostede pode desactivar isto por razóns de privacidade. " +#~ "Teña en conta que facendo isto non retirará os datos gardados." + +#~ msgid "Auto Ethernet" +#~ msgstr "Ethernet automática" + +#~ msgid "Auto broadband" +#~ msgstr "Banda larga automática" + +#~ msgid "Auto dial-up" +#~ msgstr "Marcado automático" + +#~ msgid "Auto %s" +#~ msgstr "%s automática" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth automática" + +#~ msgid "Auto wireless" +#~ msgstr "Sen fíos automática" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Iniciar sesión" + +#~ msgid "tray" +#~ msgstr "área de notificación" + +#~ msgid "More..." +#~ msgstr "Máis…" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~| msgid "Always show the 'Log out' menuitem in the user menu." +#~ msgid "Show full name in the user menu" +#~ msgstr "Mostrar o nome completo no menú de usuario" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "" +#~ "Indica se se mostra o nome completo do usuario se mostra no menú de " +#~ "usuario" + +#~ msgid "United Kingdom" +#~ msgstr "Reino Unido" + +#~ msgid "Default" +#~ msgstr "Predeterminado" + +#~ msgid "APPLICATIONS" +#~ msgstr "APLICATIVOS" + +#~ msgid "SETTINGS" +#~ msgstr "CONFIGURACIÓN" + +#~ msgid "Subscription request" +#~ msgstr "Solicitude de autorización" + +#~ msgid "%H:%M on Yesterday" +#~ msgstr "%H:%M de Onte" + +#~ msgid "%H:%M on %A, %B %d, %Y" +#~ msgstr "%H:%M do %A, %d de %B de %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Fallou a conexión a %s" + +#~ msgid "Reconnect" +#~ msgstr "Reconectar" + +#~ msgid "Wireless" +#~ msgstr "Sen fíos" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "A súa mensaxe oculta favorita" + +#~ msgid "Browse Files..." +#~ msgstr "Explorar ficheiros…" + +#~ msgid "Error browsing device" +#~ msgstr "Produciuse un erro ao explorar o dispositivo" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Non é posíbel explorar o dispositivo solicitado, o erro é «%s»" + +#~ msgid "VPN Connections" +#~ msgstr "Conexións VPN" + +#~ msgid "System Settings" +#~ msgstr "Preferencias do sistema" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "fornecedores OpenSearch desactivados" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Produciuse un erro ao desmontar «%s»" + +#~ msgid "Retry" +#~ msgstr "Reintentar" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "LUGARES E DISPOSITIVOS" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "Conectar a…" + +#~ msgid "Passphrase" +#~ msgstr "Frase de paso" + +#~ msgctxt "contact" +#~ msgid "Unknown" +#~ msgstr "Descoñecido" + +#~ msgid "CONTACTS" +#~ msgstr "CONTACTOS" + +#~ msgid "%s is online." +#~ msgstr "%s está conectado/a." + +#~ msgid "%s is offline." +#~ msgstr "%s está desconectado/a." + +#~ msgid "%s is away." +#~ msgstr "%s está ausente." + +#~ msgid "%s is busy." +#~ msgstr "%s está ocupado/a." + +#~ msgid "Show time with seconds" +#~ msgstr "Mostrar a hora con segundos" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Se é certa, móstranse os segundos na hora." + +#~ msgid "Show date in clock" +#~ msgstr "Mostrar a data no reloxo" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Se é certa, móstrase a data no reloxo, ademais da hora." + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e de %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e de %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e de %b, %l:%M:%S" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Contrasinal incorrecto, ténteo de novo" + +#~ msgid "Hidden" +#~ msgstr "Oculto" + +#~ msgid "Power Off..." +#~ msgstr "Apagar…" + +#~ msgid "Online Accounts" +#~ msgstr "Contas en liña" + +#~ msgid "Log Out..." +#~ msgstr "Saír da sesión…" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ELEMENTOS RECENTES" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. disabled-extensions overrides this setting for " +#~ "extensions that appear in both lists." +#~ msgstr "" +#~ "As extensións do GNOME Shell teñen unha propiedade uuid. Esta chave lista " +#~ "as extensións que deberían cargarse. «disabled-extensions» sobrescribe " +#~ "este axuste para as extensións que aparecen en ámbalas dúas listas." + +#~ msgid "Home Folder" +#~ msgstr "Cartafol persoal" + +#~ msgid "Show password" +#~ msgstr "Mostrar contrasinal" + +#~ msgid "%s has finished starting" +#~ msgstr "%s rematou de iniarse" + +#~ msgid "If true, display onscreen keyboard." +#~ msgstr "Se é verdadeiro, móstranse o teclado en pantalla." + +#~ msgid "Connectivity lost" +#~ msgstr "Conectividade perdida" + +#~ msgid "You are no longer connected to the network" +#~ msgstr "Xa non está conectado á rede" + +#~ msgid "Do Not Disturb" +#~ msgstr "Non molestar" + +#~ msgid "calendar:week_start:0" +#~ msgstr "calendar:week_start:1" + +#~ msgid "The length of the server certificate, or the depth of the " +#~ msgstr "A lonxitude do certificado do servidor ou a profundidade de" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "Vostede está conectado agora á conexión de banda larga móbil «%s»" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "Vostede está conectado agora á conexión sen fíos «%s»" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "Vostede está conectado agora á conexión VPN «%s»" + +#~ msgid "Uuids of extensions to disable" +#~ msgstr "Uuid das extensións que activar" + +#~ msgid "Localization Settings" +#~ msgstr "Configuracións do son" + +#~ msgid "Less than a minute ago" +#~ msgstr "Hai menos dun minuto" + +#~ msgid "Shut Down" +#~ msgstr "Apagar" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "" +#~ "Prema sobre Apagar para saír de estes aplicativos e apagar o computador." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "O computador apagarase automaticamente en %d segundos." + +#~ msgid "Shutting down the system." +#~ msgstr "Apagando o computador." + +#~ msgid "Confirm" +#~ msgstr "Confirmar" + +#~ msgid "Panel" +#~ msgstr "Panel" + +#~ msgid "Clip the crosshairs at the center" +#~ msgstr "Poñer o punto de mira no centro" + +#~ msgid "Color of the crosshairs" +#~ msgstr "Cor do punto de mira" + +#~ msgid "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." +#~ msgstr "" +#~ "Determina a lonxitude das liñas verticais e horizontais que contén o " +#~ "punto de mira." + +#~ msgid "" +#~ "Determines the position of the magnified mouse image within the magnified " +#~ "view and how it reacts to system mouse movement. The values are - none: " +#~ "no mouse tracking; - centered: the mouse image is displayed at the center " +#~ "of the zoom region (which also represents the point under the system " +#~ "mouse) and the magnified contents are scrolled as the system mouse moves; " +#~ "- proportional: the position of the magnified mouse in the zoom region is " +#~ "proportionally the same as the position of the system mouse on screen; - " +#~ "push: when the magnified mouse intersects a boundary of the zoom region, " +#~ "the contents are scrolled into view." +#~ msgstr "" +#~ "Determina a posición da imaxe magnificada do rato dentro da vista " +#~ "magnificada e como reacciona ao movemento do rato do sistema. Os valores " +#~ "son «none» (ningún): sen seguimento do rato; «centered» (centrado): a " +#~ "imaxe do rato móstrase no centro da rexión ampliada (que tamén representa " +#~ "o punto baixo o rato do sistema) e o contido magnificado deslízase " +#~ "segundo se move o rato do sistema; «proporcional»: a posición do rato " +#~ "magnificado na rexión de ampliación é proporcionalmente a mesma que a " +#~ "posición do rato do sistema na pantalla; «push» (empurrar): cando o rato " +#~ "magnificado cruza un límite da rexión de ampliación, o contido deslízase " +#~ "na vista." + +#~ msgid "" +#~ "Determines the transparency of the crosshairs, from fully opaque to fully " +#~ "transparent." +#~ msgstr "" +#~ "Determina a transparencia do punto de mira, desde a opacidade total á " +#~ "transparencia total." + +#~ msgid "" +#~ "Determines whether the crosshairs intersect the magnified mouse sprite, " +#~ "or are clipped such that the ends of the horizontal and vertical lines " +#~ "surround the mouse image." +#~ msgstr "" +#~ "Determina se as cruces cruzan o «sprite» magnificado do rato ou fíxanse " +#~ "de tal forma que os finais das liñas horizontais e verticais rodean a " +#~ "imaxe do rato." + +#~ msgid "Enable lens mode" +#~ msgstr "Activar o modo lente" + +#~ msgid "" +#~ "Enables/disables display of crosshairs centered on the magnified mouse " +#~ "sprite." +#~ msgstr "" +#~ "Activa/desactiva a visualización do punto de mira centrada no mapa de " +#~ "bits de magnificación do rato." + +#~ msgid "" +#~ "For centered mouse tracking, when the system pointer is at or near the " +#~ "edge of the screen, the magnified contents continue to scroll such that " +#~ "the screen edge moves into the magnified view." +#~ msgstr "" +#~ "Para o seguimento do centro do rato, cando o punteiro do sistema está " +#~ "preto do bordo da pantalla, o contido magnificado continúa desprazándose " +#~ "de tal forma que o bordo da pantalla móvese dentro da vista magnificada." + +#~ msgid "Length of the crosshairs" +#~ msgstr "Lonxitude do punto de mira" + +#~ msgid "Magnification factor" +#~ msgstr "Factor de magnificación" + +#~ msgid "Mouse Tracking Mode" +#~ msgstr "Modo de seguimento do rato" + +#~ msgid "Opacity of the crosshairs" +#~ msgstr "Opacidade do punto de mira" + +#~ msgid "Scroll magnified contents beyond the edges of the desktop" +#~ msgstr "Mostrar os contidos magnificados máis aló dos bordos do escritorio" + +#~ msgid "Show or hide crosshairs" +#~ msgstr "Mostrar ou agochar o punto de mira" + +#~ msgid "Show or hide the magnifier" +#~ msgstr "Mostrar ou agochar o magnificador" + +#~ msgid "Show or hide the magnifier and all of its zoom regions." +#~ msgstr "" +#~ "Mostrar ou agochar o magnificador e todas as súas rexións de " +#~ "magnificación." + +#~ msgid "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." +#~ msgstr "A cor das liñas verticais e horizontais que contén o punto de mira." + +#~ msgid "" +#~ "The magnified view either fills the entire screen, or occupies the top-" +#~ "half, bottom-half, left-half, or right-half of the screen." +#~ msgstr "" +#~ "A vista magnificada tanto se enche a pantalla completa, ou ocupa a metade " +#~ "superior, metade inferior, metade da esquerda ou metade da dereita da " +#~ "pantalla." + +#~ msgid "" +#~ "The power of the magnification. A value of 1.0 means no magnification. A " +#~ "value of 2.0 doubles the size." +#~ msgstr "" +#~ "O poder da magnificación. Un valor de 1.0 desactiva a magnificación. Un " +#~ "valor de 2.0 duplica o tamaño." + +#~ msgid "Thickness of the crosshairs" +#~ msgstr "Grosor do punto de mira" + +#~ msgid "" +#~ "Whether the magnified view should be centered over the location of the " +#~ "system mouse and move with it." +#~ msgstr "" +#~ "Indica se a visualización do punto de mira debería centrarse sobre a " +#~ "localización do rato do sistema ou moverse con el." + +#~ msgid "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." +#~ msgstr "" +#~ "Anchura das liñas verticais e horizontais que contén o punto de mira." + +#~ msgid "PREFERENCES" +#~ msgstr "PREFERENCIAS" + +#~ msgid "Shut Down..." +#~ msgstr "Apagar…" + +#~ msgid "Bluetooth Agent" +#~ msgstr "Axente Bluetooth" + +#~ msgid "Search your computer" +#~ msgstr "Buscar no seu computador" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "" +#~ "Non é posíbel engadir unha área de traballo nova porque chegouse ao " +#~ "límite de áreas de traballo." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "Non é posíbel quitar a primeira área de traballo." + +#~ msgid "Customize the panel clock" +#~ msgstr "Personalizar o reloxo do panel" + +#~ msgid "Custom format of the clock" +#~ msgstr "Formato personalizado o reloxo do panel" + +#~ msgid "Hour format" +#~ msgstr "Formato da hora" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." +#~ msgstr "" +#~ "Se é verdadeiro e o formato é «12-hour» ou «24-hour» móstranse os " +#~ "segundos na hora." + +#~ msgid "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." +#~ msgstr "" +#~ "Esta chave especifica o formato usado polo reloxo do panel cando a chave " +#~ "de formato está estabelecida a \"custom\". Vostede pode usar os " +#~ "especificadores de conversión que entende strftime() para obter un " +#~ "formato de hora especificado. Vexa o manual de strftime() para obter máis " +#~ "información." + +#~ msgid "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." +#~ msgstr "" +#~ "Esta chave especifica o formato de hora usado polo reloxo do panel. Os " +#~ "posíbeis valores son «12-hour», «24-hour», «unix» e «custom». Se está " +#~ "estabelecido a «unix», o reloxo mostrará a hora en segundos desde Epoch, " +#~ "p.ex. 01-01-1970. Se está estabelecido a «custom», o reloxo mostrará a " +#~ "hora segundo o formato especificado na chave custom_format. Teña en conta " +#~ "que se está estabelecido a «unix» ou «custom», as chaves show_date e " +#~ "show_seconds ignoraranse." + +#~ msgid "Clock Preferences" +#~ msgstr "Preferencias do reloxo" + +#~ msgid "Show seco_nds" +#~ msgstr "Mostrar os segu_ndos" + +#~ msgid "_12 hour format" +#~ msgstr "Formato _12 horas" + +#~ msgid "_24 hour format" +#~ msgstr "Formato _24 horas" + +#~ msgid "Preferences" +#~ msgstr "Preferencias" + +#~ msgid "What's using power..." +#~ msgstr "Que está usando enerxía..." + +#~ msgid "Overview workspace view mode" +#~ msgstr "Modo de visualización do espazo de traballo de vista previa" + +#~ msgid "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." +#~ msgstr "" +#~ "O modo de visualización do espazo de traballo seleccionado na vista " +#~ "previa. Os valores admitidos son \"single\" e \"grid\"." + +#~ msgid "Drag here to add favorites" +#~ msgstr "Arrastre aquí para engadir aos favoritos" + +#~ msgid "Find" +#~ msgstr "Buscar" + +#~ msgid "System Preferences..." +#~ msgstr "Preferencias do sistema..." + +#~ msgid "ON" +#~ msgstr "⚫" + +#~ msgid "OFF" +#~ msgstr "⚪" diff --git a/po/gu.po b/po/gu.po new file mode 100644 index 0000000..ad80384 --- /dev/null +++ b/po/gu.po @@ -0,0 +1,2375 @@ +# translation of gu.po to Gujarati +# Gujarati translation for gnome-shell. +# Copyright (C) 2011 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Sweta Kothari , 2011, 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gu\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug." +"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-10-01 07:39+0000\n" +"PO-Revision-Date: 2014-10-01 15:51+0530\n" +"Last-Translator: \n" +"Language-Team: American English \n" +"Language: gu\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: Lokalize 1.0\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "સિસ્ટમ" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "સંદેશો ટ્રેને બતાવો" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "સક્રિય સૂચના પર પ્રકાશ નાંખો" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "ઝાંખી બતાવો" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "બધા કાર્યક્રમો બતાવો" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "કાર્યક્રમ મેનુને ખોલો" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME શેલ" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "વિન્ડો સંચાલન અને કાર્યક્રમ શરૂઆત" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME Shell ઍક્સટેન્શન પસંદગીઓ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Shell ઍક્સટેન્શનને રૂપરેખાંકિત કરો" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME Shell (વેલૅન્ડ કંપોઝીટર)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Alt-F2 માંથી ડેવલપર અને ટેસ્ટર માટે ઉપયોગી આંતરિક સાધનોને સક્રિય કરો" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "Alt-F2 સંવાદની મદદથી આંતરિક ડિબગીંગ અને મોનિટરીંગ સાધનોને વાપરવા પરવાનગી આપે છે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "સક્રિય કરવા માટે એક્સટેન્શનનું UUIDs" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +#| msgid "" +#| "GNOME Shell extensions have a uuid property; this key lists extensions " +#| "which should be loaded. Any extension that wants to be loaded needs to be " +#| "in this list. You can also manipulate this list with the EnableExtension " +#| "and DisableExtension DBus methods on org.gnome.Shell." +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell ઍક્સટેન્શન પાસે UUID ગુણધર્મ છે; આ કી ઍક્સટેન્શનની યાદી કરે છે કે જેને લાવેલ હોવુ " +"જોઇએ. કોઇપણ ઍક્સટેન્શન કે જેને આ યાદીમાં લાવવાની જરૂર છે. તમે પણ org.gnome.Shell પર " +"EnableExtension અને DisableExtension DBus પદ્દતિઓ સાથે આ યાદીને કુશળતાપૂર્વક વાપરી " +"શકો છો." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "ઍક્સટેન્શન આવૃત્તિ સુસંગતતાની માન્યતાને નિષ્ક્રિય કરે છે" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell એ ફક્ત ઍક્સટેન્શનને લાવશે કે જે હાલની ચાલતી આવૃત્તિને આધાર આપવા માટે દાવો કરે છે. " +"આ વિકલ્પને સક્રિય કરવાનું આ ચકાસણીને નિષ્ક્રિય કરશે અને આવૃત્તિને બાદ કરતા બધા ઍક્સટેન્શનને " +"લાવવાનો પ્રયત્ન કરે છે જે તેઓ આધાર આપવા માટે દાવો કરે છે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "પસંદીદા કાર્યક્રમો માટે ડેસ્કટોપ ફાઇલ IDs ની યાદી કરો" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "કાર્યક્રમો આ ઓળખકર્તાઓ સાથે સંકળાયેલ છે તે પસંદીદા વિસ્તારમાં દેખાશે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "કાર્યક્રમ પસંદકર્તા દૃશ્ય" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "કાર્યક્રમ પસંદકર્તામાં હાલમાં પસંદ થયેલ દૃશ્યની અનુક્રમણિકા." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "આદેશ (Alt-F2) સંવાદ માટે ઇતિહાસ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "ગ્લાસ સંવાદને જોવા માટે ઇતિહાસ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "વપરાશકર્તા મેનુમાં હંમેશા 'બહાર નીકળો' મેનુ વસ્તુને બતાવો." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +#| msgid "" +#| "This key overrides the automatic hiding of the 'Log out' menuitem in " +#| "single-user, single-session situations." +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"આ કી એકજ વપરાશકર્તા, એકજ-સત્ર પરિસ્થિતિઓમાં 'બહાર નીકળો' મેનુવસ્તુને આપમેળે છુપાવવા આ કીને " +"ઓવરરાઇડ કરવામાં " +"આવી છે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "Whether to remember password for mounting encrypted or remote filesystems" +msgstr "એનક્રિપ્ટ થયેલ અથવા દૂરસ્થ ફાઇલ સિસ્ટમોને માઉન્ટ કરવા માટે ક્યાંતો પાસવર્ડ યાદ રાખો" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"શેલ પાસવર્ડને સૂચિત કરશે જ્યારે એનક્રિપ્ટ થયેલ ઉપકરણ અથવા દૂસ્થ ફાઇલસિસ્ટમ માઉન્ટ થયેલ હોય. " +"જો પાસવર્ડ ભવિષ્યનાં વપરાશ માટે સંગ્રહી શકાય છે 'પાસવર્ડ યાદ રાખો' ચેકબોક્સ હાજર રહેશે. " +"આ કી ચેકબોક્સની મૂળભૂત સ્થિતિને સુયોજિત કરે છે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "કૅલેન્ડરમાં અઠવાડિયા તારીખને બતાવો" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "જો true હોય તો, કૅલેન્ડરમાં ISO અઠવાડિયાની તારીખને દર્શાવો." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "કાર્યક્રમ મેનુને ખોલવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "કાર્યક્રમ મેનુને ખોલવા માટે કિબાઇન્ડીંગ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "પ્રવૃત્તિ ઝાંખીનાં \"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "ઝાંખીને ખોલવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "પ્રવૃત્તિ ઝાંખીને ખોલવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "કાર્યક્રમ મેનુને ખોલવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "કાર્યક્રમ મેનુને ખોલવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "સક્રિય સૂચના પર પ્રકાશ નાંખવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "સક્રિય સૂચના પર પ્રકાશ નાંખવા માટે કિબાઇન્ડીંગ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "કીબાઇન્ડીંગ કે જે બધી ચાલતી ટ્વીનને અટકાવે છે અને પાછુ લાવે છે, ડિબગીંગ હેતુઓ માટે" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "ક્યુ કિબોર્ડ વાપરવુ છે" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "વાપરવા માટે કિબોર્ડનો પ્રકાર." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "વર્તમાન કામ કરવાની જગ્યા માટે સ્વિચર મર્યાદિત કરી છે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"જો true હોય તો, ફક્ત કાર્યક્રમો કે જેની પાસે હાલની કાર્ય કરવાની જગ્યા પર વિન્ડો છે તે " +"સ્વીચરમાં બતાવેલ છે. નહિંતો, બધા કાર્યક્રમનો સમાવેલ છે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "કાર્યક્રમ સંકેત સ્થિતિ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"રૂપરેખાંકિત કરે છે કે સ્વીચરમાં કેવી રીતે વિન્ડો બતાવેલ છે. યોગ્ય શક્યતાઓ 'થમ્ભનેઇલ-" +"ફક્ત' (વિન્ડોનાં થમ્ભનેઇલને બતાવે છે), 'કાર્યક્રમ-ચિહ્ન-ફક્ત' (ફક્ત કાર્યક્રમ ચિહ્ન બતાવે છે) " +"અથવા 'બંને' છે. " + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"જો true હોય તો, હાલની કાર્ય કરવાની જગ્યામાંથી વિન્ડો સ્વીચરમાં બતાવેલ છે. નહિં તો, બધી " +"વિન્ડોને સમાવેલ છે." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "મુખ્ય વિન્ડોમાં મોડલ સંવાદને જોડો" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "આ કી org.gnome.mutter માં કી ઉપર લખાઇ જશે જ્યારે GNOME Shell ચાલી રહ્યુ હોય." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "જ્યારે સ્ક્રીન બાજુ પર વિન્ડોને પડતી મૂકી રહ્યા હોય ત્યારે ટાઇલીંગ સક્રિય કરો" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "કામ કરવાની જગ્યા ગતિશીલ રીતે સંચાલિત થયેલ છે" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "ફક્ત પ્રાથમિક મોનિટર પર કામ કરવાની જગ્યા" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "માઉસ સ્થિતિમાં ફેરફારો કરવામાં વિલંબ જ્યાં સુધી પોઇંટર ખસેડવાનું બંધ થાય" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "કૅપ્ટીવ પોર્ટલ" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "ત્યાં %s માટે પસંદગી સંવાદને લાવવામાં ભૂલ હતી:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "GNOME Shell ઍક્સટેન્શન" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "રદ કરો" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "આગળ" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "તાળું ખોલો" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "પ્રવેશો" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "સત્ર પસંદ કરો" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "શું યાદી થયેલ નથી?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(દા.ત., વપરાશકર્તા અથવા %s)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "વપરાશકર્તાનામ:" + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "પ્રવેશ વિન્ડો" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "સત્તાધિકરણ ભૂલ" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(અથવા સ્વાઇપ આંગળી)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "આદેશ મળ્યો નથી" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "આદેશનું પદચ્છેદન કરી શક્યા નથી:" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” ને અમલમાં મૂકવાનુ નિષ્ફળ:" + +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "વેબ સત્તાધિકરણ દિશામાન" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "વારંવાર વપરાતા કાર્યક્રમો અહિંયા દેખાશે" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "સામાન્ય" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "બધા" + +#: ../js/ui/appDisplay.js:1790 +msgid "New Window" +msgstr "નવી વિન્ડો" + +#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "પસંદીદાઓ માંથી દૂર કરો" + +#: ../js/ui/appDisplay.js:1822 +msgid "Add to Favorites" +msgstr "પસંદીદાને ઉમેરો" + +#: ../js/ui/appDisplay.js:1831 +msgid "Show Details" +msgstr "વિગતો બતાવો" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ને તમારી પસંદીદામાં ઉમેરી દેવામાં આવ્યુ છે." + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s ને તમારી પસંદીદામાંથી દૂર કરી દેવામાં આવ્યુ છે." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "સુયોજનો" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "પાશ્ર્વભાગને બદલો..." + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "બધા દિવસ" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "Su" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "M" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "T" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "W" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "Th" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "F" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "પહેલાંનો મહિનો" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "આગળનો મહિનો" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "અનુસૂચિત કંઇ નથી" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "આજે" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "આવતી કાલે" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "આ અઠવાડિયે" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "આગળનું અઠવાડિયું" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "બહારની ડ્રાઇવ જોડાયેલ છે" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "બહારની ડ્રાઇવનું જોડાણ તૂટી ગયુ" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "દૂર કરી શકાય તેવા ઉપકરણો" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s સાથે ખોલો" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "રદ કરો" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "પાસવર્ડ:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "ફરીથી પ્રયત્ન કરો:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "જોડાવો" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "પાસવર્ડ:" + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "કી:" + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "ઓળખાણ: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "ખાનગી કી પાસવર્ડ:" + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "સેવા:" + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "વાયરલેસ નેટવર્ક દ્દારાસત્તાધિકરણ જરૂરી" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "પાસવર્ડ અથવા એનક્રિપ્શન કીઓને વાયરલેસ નેટવર્ક “%s” માં પ્રવેશની જરૂર છે." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "વાયર થયેલ 802.1X સત્તાધિકરણ" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "નેટવર્ક નામ:" + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL સત્તાધિકરણ" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "PIN કોડ જરૂરી" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "મોબાઇલ બ્રોડબેન્ડ ઉપકરણ માટે PIN કોડ જરૂરી છે" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "મોબાઇલ બ્રોડબેન્ડ નેટવર્ક પાસવર્ડ" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "પાસવર્ડ “%s” સાથે જોડાવા માટે જરૂરી છે." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "સત્તાધિકરણ જરૂરી" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "વહીવટકર્તા" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "સત્તાધિકરણ" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "દિલગીર છું, કામ કરતુ નથી. મહેરબાની કરીને ફરીથી પ્રયત્ન કરો." + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "આમંત્રણ" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "કોલ" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "ફાઇલ પરિવહન" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "વાતચીત" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "અવાજ ચાલુ રાખો" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "મૂંગુ" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "ગઇ કાલે, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "ગઈકાલે ∶%l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s એ હવે %s તરીકે જાણીતુ છે" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s માં આમંત્રણ" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s એ તમને %s માં જોડાવા માટે આમંત્રણ આપી રહ્યા છે" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "ના પાડવી" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "સ્વીકારો" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s માંથી વિડીયો કોલ" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s માંથી કોલ" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "જવાબ" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s એ %s માં મોકલી રહ્યા છે" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "%s ને જોવા માટે પરવાનગી આપવાનું ગમે થે જ્યારે તમે ઓનલાઇન હોય" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "નેટવર્ક ભૂલ" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "સત્તાધિકરણ નિષ્ક્રિય" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "એનક્રિપ્શન ભૂલ" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "પ્રમાણપત્ર પૂરુ પાડેલ નથી" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "પ્રમાણપત્ર વિશ્ર્વાસપાત્ર નથી" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "પ્રમાણપત્ર નિવૃત્ત થયેલ છે" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "પ્રમાણપત્ર સક્રિય થયેલ નથી" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "પ્રમાણપત્ર યજમાનનામ બંધબેસતુ નથી" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "પ્રમાણપજ્ઞ ફિંગરપ્રિન્ટ બંધબેસતુ નથી" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "જાતે હસ્તાક્ષર થયેલ પ્રમાણપત્ર" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "સ્થિતિ ઓફલાઇન તરીકે સુયોજિત છે" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "એનક્રિપ્શન ઉપલબ્ધ નથી" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "પ્રમાણપત્ર અમાન્ય છે" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "જોડાણને નામંજૂર કરી દેવામાં આવ્યુ છે" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "જોડાણ સ્થાપિત કરી શકાતુ નથી" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "જોડાણ ખોવાઈ ગયેલ છે" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "આ ખાતુ પહેલેથી જ સર્વર સાથે જોડાયેલ છે" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "Connection has been replaced by a new connection using the same resource" +msgstr "સરખા સ્ત્રોતની મદદથી જોડાણને નવાં જોડાણ દ્દારા બદલી દેવામાં આવ્યુ છે" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "ખાતુ પહેલેથી સર્વર પર અસ્તિત્વ ધરાવે છે" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "સર્વર એ જોડાણને સંચાલિત કરવા માટે હાલમાં વ્યસ્ત છે" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "પ્રમાણપત્રને રદ કરી દેવામાં આવ્યુ છે" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "પ્રમાણપત્ર અસુરક્ષિત સાઇફર અલ્ગોરિધમને વાપરે છે અથવા ક્રિપ્ટોગ્રાફિકલી નબળુ છે" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"સર્વર પ્રમાણપત્રની લંબાઇ, સર્વર પ્રમાણપત્ર કતારની ઊંચાઇ, ક્રિપ્ટોગ્રાફી લાઇબ્રેરી દ્દારા " +"બનાવેલ મર્યાદાને વધારે છે" + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "આંતરિક ભૂલ" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s સાથે જોડાવાનું અસમર્થ" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "ખાતામાં જુઓ" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "અજ્ઞાત કારણ" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "વિન્ડો" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "કાર્યક્રમો બતાવો" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "ડૅશ" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "કૅલેન્ડરને ખોલો" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "ઘડિયાળ ખોલો" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "તારીખ અને સમય સુયોજનો" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s માંથી બહાર નીકળો" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "બહાર નીકળો" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s એ %d સેકંડમાં આપમેળે બહાર નીકળી જશે." +msgstr[1] "%s એ %d સેકંડોમાં આપમેળે બહાર નીકળી જશે." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "તમે %d સેકંડમાં આપમેળે બહાર નીકળી જશે." +msgstr[1] "તમે %d સેકંડોમાં આપમેળે બહાર નીકળી જશે." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "બહાર નીકળો" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "પાવર બંધ" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "સુધારા સ્થાપિત કરો અને પાવર બંધ કરો" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે." +msgstr[1] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "બાકી રહેલા સોફ્ટવેર સુધારાને સ્થાપિત કરો" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "પુન:શરૂ કરો" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "પાવર બંધ" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "પુન:શરૂ કરો" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પુન:શરૂ થઇ જશે." +msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે પુન:શરૂ થઇ જશે." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "સુધારા સ્થાપિત કરો અને પુન:શરૂ કરો" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +#| msgid "The system will restart automatically in %d second." +#| msgid_plural "The system will restart automatically in %d seconds." +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "The system will automatically restart and install updates in %d seconds." +msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે સુધારાઓને પુન:શરૂ અને સ્થાપિત કરશે." +msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે સુધારાઓને પુન:શરૂ અને સ્થાપિત કરશે." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "પુન:શરૂ કરો અને સ્થાપિત કરો" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "સ્થાપિત કરો અને પાવર બંધ " + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "સુધારા સ્થાપિત થાય પછી પાવર બંધ કરો" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "બેટરી પાવર પર ચાલી રહ્યુ છે: મહેરબાની કરીને સુધારા સ્થાપિત કરતા પહેલાં પ્લગઇન કરો." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "અમુક કાર્યક્રમો વ્યસ્ત છે અથવા તેની પાસે અસંગ્રહેલ કામ છે." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "બીજા વપરાશકર્તાઓ પ્રવેશેલ છે." + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (દૂરસ્થ)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (કન્સોલ)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "સ્થાપિત કરો" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org માંથી “%s” ને સ્થાપિત અને ડાઉનલોડ કરો?" + +#: ../js/ui/keyboard.js:700 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "કિબોર્ડ" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "એક્સટેન્શનો સ્થાપિત થયેલ નથી" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s એ કોઇપણ ભૂલોને બહાર કાઢતા નથી." + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "ભૂલો છુપાડો" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "ભૂલો બતાવો" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "સક્રિય" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "નિષ્ક્રિય" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "ભૂલ" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "અપ્રચલિત" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "ડાઉનલોડ કરી રહ્યા છે" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "સ્ત્રોત દર્શાવો" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "વેબ પાનું" + +#: ../js/ui/messageTray.js:1327 +msgid "Open" +msgstr "ખોલો" + +#: ../js/ui/messageTray.js:1334 +msgid "Remove" +msgstr "દૂર કરો" + +#: ../js/ui/messageTray.js:1631 +msgid "Notifications" +msgstr "સૂચનાઓ" + +#: ../js/ui/messageTray.js:1638 +msgid "Clear Messages" +msgstr "સંદેશા સાફ કરો" + +#: ../js/ui/messageTray.js:1657 +msgid "Notification Settings" +msgstr "સૂચના સુયોજનો" + +#: ../js/ui/messageTray.js:1710 +msgid "Tray Menu" +msgstr "ટ્રે મેનુ" + +#: ../js/ui/messageTray.js:1934 +msgid "No Messages" +msgstr "સંદેશા નથી" + +#: ../js/ui/messageTray.js:1979 +msgid "Message Tray" +msgstr "સંદેશો ટ્રે" + +#: ../js/ui/messageTray.js:2992 +msgid "System Information" +msgstr "સિસ્ટમ જાણકારી" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "અજ્ઞાત" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d નવો સંદેશો" +msgstr[1] "%d નવા સંદેશા" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "રદ કરો" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "ઝાંખી" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "શોધવા માટે ટાઇપ કરો..." + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "બહાર નીકળો" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "પ્રવૃત્તિઓ" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "ટોચની પટ્ટી" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "આદેશને દાખલ કરો" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "બંધ કરો" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "પુન:શરૂ કરી રહ્યા છે…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d નવી સૂચના" +msgstr[1] "%d નવી સૂચનાઓ" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "તાળુ" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "GNOME ને સ્ક્રીનને તાલુ મારવાની જરૂર છે" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "તાળુ મારવામાં અસમર્થ" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "તાળુ કાર્યક્રમ દ્દારા બ્લોક થયેલ છે" + +#: ../js/ui/search.js:607 +msgid "Searching…" +msgstr "શોધી રહ્યા છે..." + +#: ../js/ui/search.js:609 +msgid "No results." +msgstr "પરિણામો નથી." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "નકલ કરો" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "ચોંટાડો" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "લખાણ બતાવો" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "લખાણ છુપાડો" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "પાસવર્ડ" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "પાસવર્ડને યાદ રાખો" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "ઉપલબ્ધતા" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "નાનુ મોટુ કરો" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "સ્ક્રીન રીડર" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "સ્ક્રીન કિબોર્ડ" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "દેખાતી ચેતવણીઓ" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "સ્ટીકી કી" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "ધીમી કી" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "બાઉન્સ કી" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "માઉસ કીઓ" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "ઉચ્ચ વિરોધાભાસ" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "લાંબુ લખાણ" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "બ્લુટુથ" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "બંધ કરો" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "બ્લુટુથ સુયોજનો" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d જોડાયેલ ઉપકરણ" +msgstr[1] "%d જોડાયેલ ઉપકરણો" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +msgid "Not Connected" +msgstr "જોડાયેલ નથી" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "તેજસ્વિતા" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "કીબોર્ડ લેઆઉટને બતાવો" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "સ્થાન" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "નિષ્ક્રિય" + +#: ../js/ui/status/location.js:73 +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "ખાનગી સુયોજનો" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "વપરાશમાં" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "સક્રિય" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "<અજ્ઞાત>" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +msgid "Off" +msgstr "બંધ" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "જોડાયેલ" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "સંચાલિત થયેલ નથી" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "જોડાઇ તૂટી રહ્યુ છે" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +msgid "Connecting" +msgstr "જોડાઇ રહ્યા છે" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "સત્તાધિકરણ જરૂરી" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "ફર્મવેર ગેરહાજર" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "બિનઉપલબ્ધ" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "જોડાણ નિષ્ફળ" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "વાયર થયેલ સુયોજનો" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "મોબાઇલ બ્રોડબેન્ડ સુયોજનો" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +msgid "Hardware Disabled" +msgstr "હાર્ડવેર નિષ્ક્રિય" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "ઇન્ટરનેટ જોડાણ તરીકે વાપરો" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "ઍરપ્લેન સ્થિતિ ચાલુ છે" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi નિષ્ક્રિય થયેલ છે જ્યારે ઍરપ્લેન સ્થિતિ ચાલુ હોય." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "ઍરપ્લેન સ્થિતિને બંધ કરો" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi બંધ છે" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "નેટવર્કમાં જોડાવા માટે ક્રમમાં Wi-Fi ને ચાલુ કરવાની જરૂર છે." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi ચાલુ કરો" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi નેટવર્ક" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "નેટવર્ક પસંદ કરો" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "નેટવર્ક નથી" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "બંધ કરવા માટે હાર્ડવેર સ્વીચને વાપરો" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "નેટવર્ક પસંદ કરો" + +#: ../js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi સુયોજનો" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "ચાલુ કરો" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "હૉટસ્પોટ સક્રિય" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "જોડાઇ રહ્યા છે..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "સત્તાધિકરણ જરૂરી" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "જોડાણ નિષ્ફળ" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "નેટવર્ક સુયોજનો" + +#: ../js/ui/status/network.js:1482 +msgid "VPN Settings" +msgstr "VPN સુયોજનો" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "નેટવર્ક સંચાલક" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "નેટવર્ક જોડાણનું સક્રિયકરણ નિષ્ફળ થયેલ છે" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "પાવર સુયોજનો" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "સંપૂર્ણપણે ચાર્જ થયેલ છે" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "અંદાજ કરી રહ્યા છે..." + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d બાકી રહેલ છે (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d જ્યાં સુધી સંપૂર્ણ થાય (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "બેટરી" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "ઍરપ્લેન સ્થિતિ" + +#: ../js/ui/status/rfkill.js:85 +msgid "On" +msgstr "ચાલુ" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "વપરાશકર્તાને બદલો" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "બહાર નીકળો" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "દિશા તાળુ" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "અટકાવો" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "પાવર બંધ" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "બદલાયેલ વોલ્યુમ" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "વોલ્યુમ" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "માઇક્રોફોન" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "બીજા વપરાશકર્તા તરીકે પ્રવેશો" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "વિન્ડોનું તાળુ ખોલો" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "કાર્યક્રમો" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "શોધો" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” તૈયાર છે" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "શું તમને આ દર્શાવ સુયોજનોને રાખવા માંગો છો?ે" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "સુયોજનોને પાછા લાવો" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "ફેરફારો કરો" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "સુયોજન ફેરફારો એ %d સેકંડમાં પાછા આવશે" +msgstr[1] "સુયોજન ફેરફારો એ %d સેકંડોમાં પાછા આવશે" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "ન્યુનતમ કરો" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "મહત્તમમાંથી પાછુ લાવો" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "મહત્તમ કરો" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "ખસેડો" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "માપ બદલો" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "શીર્ષકપટ્ટી ઓનસ્ક્રીનને ખસેડો" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "હંમેશા ટોચ ઉપર" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "હંમેશા દૃશ્ય કામ કરવાની જગ્યા પર" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "ઉપર કામ કરવાની જગ્યા પર ખસેડો" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "નીચે કામ કરવાની જગ્યાએ ખસેડો" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution કૅલેન્ડર" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u આઉટપુટ" +msgstr[1] "%u આઉટપુટો" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ઇનપુટ" +msgstr[1] "%u ઇનપુટો" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "સિસ્ટમ અવાજો" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "ા" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "લૉગિન સ્ક્રીન માટે GDM દ્દારા વાપરેલ સ્થિતિ" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "ખાસ સ્થિતિને વાપરો, દા.ત. પ્રવેશ સ્ક્રીન માટે \"gdm\"" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "શક્ય સ્થિતિઓની યાદી કરો" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” ને શરૂ કરવામાં નિષ્ફળતા" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "પાસવર્ડ બંધબેસતો નથી" + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "પાસવર્ડને ખાલી રાખી શકાતો નથી" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "સત્તાધિકરણ વપરાશકર્તા દ્દારા અસ્વીકાર થયેલ છે" + +#~ msgid "Screenshots" +#~ msgstr "સ્ક્રીનશોટ" + +#~ msgid "Record a screencast" +#~ msgstr "સ્ક્રીનકાસ્ટ રેકોર્ડ કરો" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "શું કાર્યક્રમ વપરાશ વિશે આંકડા એકત્ર કરવા જોઇએ" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "શેલ સામાન્ય રીતે મોટાભાગનાં એકને હાજર રાખવા માટે ક્રમમાં સક્રિય કાર્યક્રમોને મોનિટર " +#~ "કરવામાં આવે છે (દા.ત. લૉન્ચર). જ્યારે આ માહિતીને ખાનગી રાખવામાં આવશે, તમે ખાનગી " +#~ "કારણો માટે આને નિષ્ક્રિય કરવા માંગી શકો છો. મહેરબાની કરીને આવુ કરવાનું નોંધો તેથી " +#~ "પહેલેથી સંગ્રહેલ માહિતીને દૂર કરાતુ નથી." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "વર્ગોની યાદી કે જે ફોલ્ડરો તરીકે દર્શાવેલ હોવા જોઇએ" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "આ યાદીમાં દરેક વર્ગનામ કાર્યક્રમ દૃશ્યમાં ફોલ્ડર તરીકે રજૂ થયેલ છે, મુખ્ય વિન્ડોમાં ઇનલાઇન " +#~ "દર્શાવવા કરતા." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "વપરાશકર્તા દ્દારા છેલ્લુ IM સુયોજનને સંગ્રહવા આંતરિક રીતે વાપરેલ છે. અહિંયા કિંમત " +#~ "TpConnectionPresenceType ઍન્યુમરેશનમાંથી છે." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "વપરાશકર્તા માટે છેલ્લી સત્રની હાજર પરિસ્થિતિને સંગ્રહવા આંતરિક રીતે વાપરેલ છે. કિંમત " +#~ "અહિંયા GsmPresenceStatus ઍન્યુમરેશનમાંથી છે." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "કાર્યક્રમ મેનુને ખોલવા માટે કિબાઇન્ડીંગ" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "બિલ્ટઇન સ્ક્રીન રેકોર્ડરને શરૂ/બંધ કરવા માટે કfબાઇન્ડીંગ." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "રેકોર્ડીંગ સ્ક્રીનકાસ્ટ માટે વાપરેલ ફ્રેમરેટ." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "પરિણામી સ્ક્રીનકાસ્ટની framerate એ દરેક સેકંડે ફ્રેમમાં GNOME Shell નાં સ્ક્રીનકાસ્ટ " +#~ "રેકોર્ડર દ્દારા અહેવાલ થયેલ છે." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "સ્ક્રીનકાસ્ટને એનકોડ કરવા માટે વાપરેલ gstreamer પાઇપલાઇન" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "રેકોર્ડીંગ ને એનકોડ કરવા માટે વાપરેલ GStreamer પાઇપલાઇનને સુયોજિત કરે છે. તે gst-" +#~ "launch માટે વાપરેલ બંધારણને અનુસરે છે. પાઇપલાઇન પાસે બિનજોડાયેલ સીંક પેડ હોય છે જ્યાં " +#~ "રેકોર્ડ થયેલ વિડિયો રેકોર્ડ થયેલ છે. સામાન્ય રીતે તેમની પાસે બિનજોડાયેલ સ્ત્રોત પેડ હશે; " +#~ "તે પેડમાંથી આઉટપુટ એ આઉટપુટ ફાઇલમાં લખાયેલ હશે. છતાંપણ પાઇપલાઇન પણ તેનાં પોતાના " +#~ "આઉટપુટની સંભાળ લઇ શકે છે - આ shout2send મારફતે અથવા તેનાં જેવા મારફતે icecast " +#~ "સર્વરમાં આઉટપુટને મોકલવા વાપરી શકાય છે. જ્યારે ખાલી ફાઇલને સુયોજિત અથવા અસુયોજિત " +#~ "કરો, મૂળભૂત પાઇપલાઇન વાપરેલ હે. આ હાલમાં 'vp8enc min_quantizer=13 " +#~ "max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! " +#~ "webmmux' છે અને VP8 કોડેકની મદદતી WEBM માં રેકોર્ડ થાય છે. %T એ સિસ્ટમ પર ઓપ્ટીમલ " +#~ "થ્રેડ ગણતરી પર ધારવા માટે પ્લેસહોલ્ડરને વાપરેલ છે." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "સ્ક્રીનકાસ્ટને સંગ્રહ કરવા માટે વાપરેલ ફાઇલ ઍક્સટેન્શન" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "રેકોર્ડ થયેલ સ્ક્રીનકાસ્ટ માટે ફાઇલનામ વર્તમાન તારીખ પર આધારિત અનન્ય ફાઇલનામ હશે, " +#~ "અને આ ઍક્સટેન્શનને વાપરો. તેને બદલેલ હોવુ જોઇએ જ્યારે વિવિધ પાત્ર બંધારણમાં રેકોર્ડ કરી " +#~ "રહ્યા છે." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "શીર્ષકપટ્ટી પર બટનોની ગોઠવણ" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "આ કી org.gnome.desktop.wm.preferences માં કી ઉપર લખાઇ જશે જ્યારે GNOME શેલ " +#~ "ચાલી રહ્યુ હોય." + +#~ msgid "Extension" +#~ msgstr "ઍક્સટેન્શન" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "ઉપર કોમ્બોબોક્સની મદદથી રૂપરેખાંકિત કરવા માટે ઍક્સટેન્શનને પસંદ કરો." + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "સત્ર..." + +#~| msgid "Power Off" +#~ msgid "Power" +#~ msgstr "પાવર" + +#~ msgid "Restart" +#~ msgstr "પુન:શરૂ કરો" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t માંથી સ્ક્રીનકાસ્ટ" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "આ કાર્યક્રમોને બહાર નીકળવા માટે બહાર નીકળો પર ક્લિક કરો અને સિસ્ટમમાંથી બહાર " +#~ "નીકળો." + +#~ msgid "Logging out of the system." +#~ msgstr "સિસ્ટમની બહાર નીકળી રહ્યા છે." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "આ કાર્યક્રમોને બહાર નીકાળવા માટે પાવર બંધ કરો પર ક્લિક કરો અને સિસ્ટમનો પાવર બંધ " +#~ "કરો" + +#~ msgid "Powering off the system." +#~ msgstr "સિસ્ટમનો પાવર બંધ કરી રહ્યા છે." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "આ કાર્યક્રમોમાંથી બહાર નીકળવા માટે પુન:શરૂ કરો પર ક્લિક કરો અને સિસ્ટમને પુન:શરૂ કરો." + +#~ msgid "Restarting the system." +#~ msgstr "સિસ્ટમને પુન:શરૂ કરી રહ્યા છે." + +#~ msgid "Universal Access Settings" +#~ msgstr "યુનિવર્સલ વપરાશ સુયોજનો" + +#~ msgid "Visibility" +#~ msgstr "દૃશ્યતા" + +#~| msgid "Send Files to Device..." +#~ msgid "Send Files to Device…" +#~ msgstr "ઉપકરણમાં ફાઇલોને મોકલો..." + +#~| msgid "Set Up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "નવા ઉપકરણને સુયોજિત કરો..." + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "ફાઇલોને મોકલો..." + +#~ msgid "Keyboard Settings" +#~ msgstr "કીબોર્ડ સુયોજનો" + +#~ msgid "Mouse Settings" +#~ msgstr "માઉસ સુયોજનો" + +#~ msgid "Sound Settings" +#~ msgstr "સાઇન્ડ સુયોજનો" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s માંથી સત્તાધિકરણ માંગણી" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "ઉપકરણ %s એ સેવા %s' માટે પ્રવેશ ઇચ્છે છે" + +#~ msgid "Always grant access" +#~ msgstr "હંમેશા વપરાશ મંજૂર કરો" + +#~ msgid "Grant this time only" +#~ msgstr "ફક્ત આ સમયે સંમતિ આપો" + +#~ msgid "Reject" +#~ msgstr "રદ કરો" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s માટો જોડીની ખાતરી" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "ઉપકરણ %s આ કમ્પ્યૂટર સાથે જોડી કરવા માંગે છે" + +#~ msgid "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgstr "મહેરબાની કરીને ખાતરી કરો કે શું PIN '%06d' એ ઉપકરણ પર એક સાથે બંધબેસે છે." + +#~ msgid "Matches" +#~ msgstr "બંધબેસે છે" + +#~ msgid "Does not match" +#~ msgstr "બંધબેસતુ નથી" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s માટે જોડી માંગણી" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "મહેરબાની કરીને ઉપકરણ પર દર્શાવેલ PIN દાખલ કરો." + +#~ msgid "OK" +#~ msgstr "બરાબર" + +#~ msgid "Region & Language Settings" +#~ msgstr "વિસ્તાર અને ભાષા સુયોજનો" + +#~ msgid "Volume, network, battery" +#~ msgstr "વોલ્યુમ, નેટવર્ક, બેટરી" + +#~ msgid "disabled" +#~ msgstr "નિષ્ક્રિય" + +#~ msgid "cable unplugged" +#~ msgstr "કેબલ પ્લગ થયેલ નથી" + +#~ msgid "unavailable" +#~ msgstr "બિનઉપલબ્ધ" + +#~ msgid "More…" +#~ msgstr "વધારે…" + +#~ msgid "Wired" +#~ msgstr "વાયરવાળું" + +#~ msgid "Auto Ethernet" +#~ msgstr "આપમેળે ઇથરનેટ" + +#~ msgid "Auto broadband" +#~ msgstr "આપમેળે બ્રોડબેન્ડ" + +#~ msgid "Auto dial-up" +#~ msgstr "આપમેળે ડાયલ અપ" + +#~ msgid "Auto %s" +#~ msgstr "આપમેળે %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "આપમેળે બ્લુટુથ" + +#~ msgid "Auto wireless" +#~ msgstr "આપમેળે વાયરલેસ" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "Networking is disabled" +#~ msgstr "નેટવર્કીંગ નિષ્ક્રિય થયેલ છે" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d કલાક બાકી રહેલ છે" +#~ msgstr[1] "%d કલાક બાકી રહેલ છે" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s બાકી રહેલ છે" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "કલાક" +#~ msgstr[1] "કલાકો" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "મિનિટ" +#~ msgstr[1] "મિનિટો" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d મિનિટ બાકી રહી છે" +#~ msgstr[1] "%d મિનિટ બાકી રહી છે" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~ msgid "AC Adapter" +#~ msgstr "AC ઍડપ્ટર" + +#~ msgid "Laptop Battery" +#~ msgstr "લેપટોપ બેટરી" + +#~ msgid "Monitor" +#~ msgstr "મોનિટર" + +#~ msgid "Mouse" +#~ msgstr "માઉસ" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "સેલ ફોન" + +#~ msgid "Media Player" +#~ msgstr "મીડિયા પ્લેયર" + +#~ msgid "Tablet" +#~ msgstr "ટૅબલેટ" + +#~ msgid "Computer" +#~ msgstr "કમ્પ્યૂટર" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "અજ્ઞાત" + +#~ msgid "Available" +#~ msgstr "ઉપલબ્ધ" + +#~ msgid "Busy" +#~ msgstr "વ્યસ્ત" + +#~ msgid "Invisible" +#~ msgstr "અદૃશ્ય" + +#~ msgid "Away" +#~ msgstr "દૂર" + +#~ msgid "Idle" +#~ msgstr "નિષ્ક્રિય" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "તમારી વાર્તાલાપ પરિસ્થિતિ વ્યસ્ત તરીકે સુયોજિત હશે" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "સૂચનાઓ હવે નિષ્ક્રિય થયેલ છે, વાર્તાલાપ સંદેશાને સમાવી રહ્યા છે, બીજાને જણાવવા માટે " +#~ "તમારી ઓનલાઇન સ્થિતિને ગોઠવી દેવામાં આવી છે કે જે તમે તેનાં સંદેશાને જોઇ શકશો નહિં." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "બંધ કરવાથી તેઓ અસંગ્રહેલ કામને ગુમાવી શકે છે." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "માફ કરો, આજે તમારા માટે શાણપણ નથી:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s એ એવી કિંમત છે જે Oracle કહે છે" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "પ્રવેશો" + +#~ msgid "tray" +#~ msgstr "ટ્રે" + +#~ msgid "Clear" +#~ msgstr "સાફ કરો" + +#~ msgid "More..." +#~ msgstr "વધારે..." + +#~ msgid "APPLICATIONS" +#~ msgstr "APPLICATIONS" + +#~ msgid "SETTINGS" +#~ msgstr "SETTINGS" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Subscription request" +#~ msgstr "ઉમેદવારી માંગણી" + +#~ msgid "Connection error" +#~ msgstr "જોડાણ ભૂલ" + +#~ msgid "Sent at %X on %A" +#~ msgstr "%A પર %X અહિંયા મોકલેલ છે" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "%A પર મોકલેલ છે, %B %d, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "%s માટે જોડાણ નિષ્ફળ" + +#~ msgid "Reconnect" +#~ msgstr "પુન:જોડાવો" + +#~ msgid "Browse Files..." +#~ msgstr "ફાઇલોને બ્રાઉઝ કરો..." + +#~ msgid "Error browsing device" +#~ msgstr "ઉપકરણને બ્રાઉઝ કરતી વખતે ભૂલ" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "સુચિત ઉપકરણને બ્રાઉઝ કરી શકાતુ નથી, ભૂલ '%s' છે" + +#~ msgid "Wireless" +#~ msgstr "વાયરલેસ" + +#~ msgid "VPN Connections" +#~ msgstr "VPN જોડાણો" + +#~ msgid "System Settings" +#~ msgstr "સિસ્ટમ સુયોજનો" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "તમારા મનગમતા ઇસ્ટર ઇંડા" + +#~ msgid "United Kingdom" +#~ msgstr "United Kingdom" + +#~ msgid "Default" +#~ msgstr "મૂળભૂત" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "નિષ્ક્રિય થયેલ OpenSearch પ્રબંધક" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "'%s' ને અનમાઉન્ટ કરવામાં નિષ્ફળતા" + +#~ msgid "Retry" +#~ msgstr "પુન:પ્રયત્ન કરો" + +#~ msgid "Connect to..." +#~ msgstr "ની સાથે જોડાવો..." + +#~ msgid "PLACES & DEVICES" +#~ msgstr "સ્થાનો અને ઉપકરણો" + +#~ msgid "Passphrase" +#~ msgstr "પાસફ્રેજ" + +#~ msgid "Home" +#~ msgstr "ઘર" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Show time with seconds" +#~ msgstr "સેકંડોમાં સમયને બતાવો" + +#~ msgid "If true, display seconds in time." +#~ msgstr "જો true હોય તો, સમયમાં સેકંડ બતાવો." + +#~ msgid "Show date in clock" +#~ msgstr "ઘડિયાળમાં તારીખને બતાવો" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "જો true હોય તો, ઘડિયાળમાં તારીખ બતાવો, સમય સાથે વધુમાં." + +#~ msgid "CONTACTS" +#~ msgstr "સંપર્કો" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "ખોટો પાસવર્ડ, મહેરબાની કરીને ફરીથી પ્રયત્ન કરો" + +#~ msgid "%s is online." +#~ msgstr "%s ઓનલાઇન છે." + +#~ msgid "%s is offline." +#~ msgstr "%s ઓફલાઇન છે." + +#~ msgid "%s is away." +#~ msgstr "%s એ દૂર છે." + +#~ msgid "%s is busy." +#~ msgstr "%s વ્યસ્ત છે." + +#~ msgid "Hidden" +#~ msgstr "છુપાયેલ" + +#~ msgid "Power Off..." +#~ msgstr "પાવર બંધ..." + +#~ msgid "Online Accounts" +#~ msgstr "ઓનલાઇન ખાતુ" + +#~ msgid "Lock Screen" +#~ msgstr "સ્ક્રીનને તાળુ મારો" + +#~ msgid "Log Out..." +#~ msgstr "બહાર નીકળો..." + +#~| msgid "Password:" +#~ msgid "Show password" +#~ msgstr "પાસવર્ડ બતાવો:" + +#~ msgid "Home Folder" +#~ msgstr "ઘર ફોલ્ડર" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "તમે હવે મોબાઇલ બ્રોડબેન્ડ જોડાણ '%s' સાથે જોડાયેલ છો" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "તમે હવે વાયરલેસ નેટવર્ક '%s' સાથે જોડાયેલ છો" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "તમે હવે વાયરવાળું નેટવર્ક '%s' સાથે જોડાયેલ છો" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "તમે હવે VPN નેટવર્ક '%s' સાથે જોડાયેલ છો" + +#~ msgid "%d minute ago" +#~ msgid_plural "%d minutes ago" +#~ msgstr[0] "%d મિનિટ પહેલાં" +#~ msgstr[1] "%d મિનિટો પહેલાં" + +#~ msgid "%d hour ago" +#~ msgid_plural "%d hours ago" +#~ msgstr[0] "%d કલાક પહેલાં" +#~ msgstr[1] "%d કલાકો પહેલાં" + +#~ msgid "%d day ago" +#~ msgid_plural "%d days ago" +#~ msgstr[0] "%d દિવસ પહેલાં" +#~ msgstr[1] "%d દિવસો પહેલાં" + +#~ msgid "%d week ago" +#~ msgid_plural "%d weeks ago" +#~ msgstr[0] "%d અઠવાડિયુ પહેલાં" +#~ msgstr[1] "%d અઠવાડિયાઓ પહેલાં" diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..642a687 --- /dev/null +++ b/po/he.po @@ -0,0 +1,3166 @@ +# Hebrew translation for gnome-shell. +# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# liel , 2009. +# Yaron Shahrabani , 2010. +# Yosef Or Boczko , 2013, 2014, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2017-11-26 22:25+0200\n" +"PO-Revision-Date: 2017-11-26 22:32+0200\n" +"Last-Translator: Yosef Or Boczko \n" +"Language-Team: עברית <>\n" +"Language: he\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n>2||n==0) ? 1 : 2;\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: ../js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "אירעה שגיאה בעת טעינת דו־שיח ההעדפות עבור %s:" + +#: ../js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +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 +msgid "Cancel" +msgstr "ביטול" + +#: ../js/gdm/authPrompt.js:171 ../js/gdm/authPrompt.js:218 +#: ../js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "הבא" + +#: ../js/gdm/authPrompt.js:214 ../js/ui/shellMountOperation.js:348 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "שחרור" + +#: ../js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "כניסה" + +#: ../js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "בחירת הפעלה" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "לא רשום?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: ../js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(משתמש או %s לדוגמה)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/gdm/loginDialog.js:893 ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "שם משתמש:" + +#: ../js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "חלון כניסה" + +#: ../js/gdm/util.js:346 +msgid "Authentication error" +msgstr "שגיאת אימות" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/util.js:478 +msgid "(or swipe finger)" +msgstr "(או להעביר אצבע)" + +#. Translators: The name of the power-off action in search +#: ../js/misc/systemActions.js:99 +msgctxt "search-result" +msgid "Power Off" +msgstr "כיבוי" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: ../js/misc/systemActions.js:102 +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" +msgstr "נעילת המסך" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: ../js/misc/systemActions.js:109 +msgid "lock screen" +msgstr "נעילת המסך" + +#. Translators: The name of the logout action in search +#: ../js/misc/systemActions.js:113 +msgctxt "search-result" +msgid "Log Out" +msgstr "יציאה" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: ../js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "יציאה;התנתקות;התנתק;" + +#. Translators: The name of the suspend action in search +#: ../js/misc/systemActions.js:120 +msgctxt "search-result" +msgid "Suspend" +msgstr "השהיה" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: ../js/misc/systemActions.js:123 +msgid "suspend;sleep" +msgstr "השהיה;שינה;" + +#. Translators: The name of the switch user action in search +#: ../js/misc/systemActions.js:127 +msgctxt "search-result" +msgid "Switch User" +msgstr "החלפת משתמש" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: ../js/misc/systemActions.js:130 +msgid "switch user" +msgstr "החלפת משתמש" + +#. Translators: The name of the lock orientation action in search +#: ../js/misc/systemActions.js:134 +msgctxt "search-result" +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;screen;rotation" +msgstr "נעילת כיוון;מסך;סיבוב;כיוון;" + +#: ../js/misc/util.js:122 +msgid "Command not found" +msgstr "הפקודה לא נמצאה" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "לא ניתן לפענח את הפקודה:" + +#: ../js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "ההרצה של „%s” נכשלה:" + +#: ../js/misc/util.js:180 +msgid "Just now" +msgstr "רק עכשיו" + +#: ../js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "לפני דקה" +msgstr[1] "לפני %d דקות" +msgstr[2] "לפני שתי דקות" + +#: ../js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "לפני שעה" +msgstr[1] "לפני %d שעות" +msgstr[2] "לפני שעתיים" + +#: ../js/misc/util.js:188 +msgid "Yesterday" +msgstr "אתמול" + +#: ../js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "לפני יום" +msgstr[1] "לפני %d ימים" +msgstr[2] "לפני יומיים" + +#: ../js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "לפני שבוע" +msgstr[1] "לפני %d שבועות" +msgstr[2] "לפני שבועיים" + +#: ../js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "לפני חודש" +msgstr[1] "לפני %d חודשים" +msgstr[2] "לפני חודשיים" + +#: ../js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "לפני שנה" +msgstr[1] "לפני %d שנים" +msgstr[2] "לפני שנתיים" + +#. Translators: Time in 24h format +#: ../js/misc/util.js:228 +msgid "%H∶%M" +msgstr "‎%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "אתמול, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: ../js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: ../js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d ב%B, %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: ../js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d ב%B, %H:%M" + +#. Translators: Time in 12h format +#: ../js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: ../js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "אתמול, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: ../js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l:%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: ../js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d ב%B, %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: ../js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d ב%B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: ../js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "התחברות לנקודה חמה" + +#: ../js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"ההתחברות שלך לנקודה חמה זו אינה בטוחה. ססמאות ומידע אחר שהזנת עשויים להיות " +"גלויים לאנשים בקרבת מקום." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: ../js/ui/accessDialog.js:63 ../js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "מניעת גישה" + +#: ../js/ui/accessDialog.js:64 ../js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "אפשור גישה" + +#: ../js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "יישומים בשימוש תדיר יופיעו כאן" + +#: ../js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "תדיר" + +#: ../js/ui/appDisplay.js:937 +msgid "All" +msgstr "הכול" + +#: ../js/ui/appDisplay.js:1915 +msgid "New Window" +msgstr "חלון חדש" + +#: ../js/ui/appDisplay.js:1929 +msgid "Launch using Dedicated Graphics Card" +msgstr "הפעלה בשימוש כרטיס חזותי ייעוד" + +#: ../js/ui/appDisplay.js:1956 ../js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "הסרה מהמועדפים" + +#: ../js/ui/appDisplay.js:1962 +msgid "Add to Favorites" +msgstr "הוספה למועדפים" + +#: ../js/ui/appDisplay.js:1972 +msgid "Show Details" +msgstr "הצגת פרטים" + +#: ../js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "‏%s נוסף למועדפים שלך." + +#: ../js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "‏%s הוסר מהמועדפים שלך." + +#: ../js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "בחירת התקן שמע" + +#: ../js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "הגדרות שמע" + +#: ../js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "אזניות" + +#: ../js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "אזניות עם מיקרופון" + +#: ../js/ui/audioDeviceSelection.js:82 ../js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "מיקרופון" + +#: ../js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "החלפת הרקע…" + +#: ../js/ui/backgroundMenu.js:21 ../js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "הגדרות תצוגה" + +#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:265 +msgid "Settings" +msgstr "הגדרות" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: ../js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "65" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "א" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "ב" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "ג" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "ד" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "ה" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "ו" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "ש" + +#: ../js/ui/calendar.js:449 +msgid "Previous month" +msgstr "חודש קודם" + +#: ../js/ui/calendar.js:459 +msgid "Next month" +msgstr "חודש הבא" + +#: ../js/ui/calendar.js:612 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: ../js/ui/calendar.js:667 +msgid "Week %V" +msgstr "שבוע %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:736 +msgctxt "event list time" +msgid "All Day" +msgstr "יום שלם" + +#: ../js/ui/calendar.js:869 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, ה־%e ב%B" + +#: ../js/ui/calendar.js:873 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, ה־%e ב%B, %Y" + +#: ../js/ui/calendar.js:1093 +msgid "No Notifications" +msgstr "אין התרעות" + +#: ../js/ui/calendar.js:1096 +msgid "No Events" +msgstr "אין אירועים" + +#: ../js/ui/calendar.js:1124 +msgid "Clear All" +msgstr "ניקוי הכל" + +#. Translators: %s is an application name +#: ../js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "‏„%s” לא מגיב" + +#: ../js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "באפשרותך להמתין זמן קצר או לכפות על היישום להיסגר לחלוטין." + +#: ../js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "לכפות סגירה" + +#: ../js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "המתנה" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "חובר כונן חיצוני" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "נותק כונן חיצוני" + +#: ../js/ui/components/autorunManager.js:358 +#, javascript-format +msgid "Open with %s" +msgstr "פתיחה באמצעות %s" + +#: ../js/ui/components/keyring.js:107 ../js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "ססמה:" + +#: ../js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "נא להקליד שוב:" + +#: ../js/ui/components/networkAgent.js:112 ../js/ui/status/network.js:261 +#: ../js/ui/status/network.js:355 ../js/ui/status/network.js:939 +msgid "Connect" +msgstr "התחברות" + +#. Cisco LEAP +#: ../js/ui/components/networkAgent.js:205 +#: ../js/ui/components/networkAgent.js:217 +#: ../js/ui/components/networkAgent.js:245 +#: ../js/ui/components/networkAgent.js:265 +#: ../js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "ססמה:" + +#. static WEP +#: ../js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "מפתח:" + +#: ../js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "זהות:" + +#: ../js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "ססמת מפתח פרטי:" + +#: ../js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "שירות:" + +#: ../js/ui/components/networkAgent.js:292 +#: ../js/ui/components/networkAgent.js:638 +msgid "Authentication required by wireless network" +msgstr "הרשת האלחוטית דורשת אימות" + +#: ../js/ui/components/networkAgent.js:293 +#: ../js/ui/components/networkAgent.js:639 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "ססמאות או מפתחות הצפנה נדרשים כדי לגשת לרשת האלחוטית „%s”" + +#: ../js/ui/components/networkAgent.js:297 +#: ../js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "אימות Wired 802.1X" + +#: ../js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "שם הרשת:" + +#: ../js/ui/components/networkAgent.js:304 +#: ../js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "אימות DSL" + +#: ../js/ui/components/networkAgent.js:311 +#: ../js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "נדרש קוד PIN" + +#: ../js/ui/components/networkAgent.js:312 +#: ../js/ui/components/networkAgent.js:653 +msgid "PIN code is needed for the mobile broadband device" +msgstr "נדרש קוד PIN עבור התקן החיבור האלחוטי בפס רחב" + +#: ../js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:320 +#: ../js/ui/components/networkAgent.js:659 +msgid "Mobile broadband network password" +msgstr "ססמת רשת הפס הרחב הניידת" + +#: ../js/ui/components/networkAgent.js:321 +#: ../js/ui/components/networkAgent.js:643 +#: ../js/ui/components/networkAgent.js:647 +#: ../js/ui/components/networkAgent.js:660 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "נדרשת ססמה כדי להתחבר אל „%s”" + +#: ../js/ui/components/networkAgent.js:627 ../js/ui/status/network.js:1720 +msgid "Network Manager" +msgstr "מנהל הרשתות" + +#: ../js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "נדרש אימות" + +#: ../js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "מנהל" + +#: ../js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "אימות" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/components/polkitAgent.js:270 ../js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסליחה." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "השם של %s הוחלף ל־%s" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "חלונות" + +#: ../js/ui/dash.js:250 ../js/ui/dash.js:291 +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 +msgid "Dash" +msgstr "חלונית" + +#. 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:76 +msgid "%B %e %Y" +msgstr "%e ב%B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: ../js/ui/dateMenu.js:83 +msgid "%A %B %e %Y" +msgstr "%A ה־%e ב%B %Y" + +#: ../js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "הוספת שעונים מהעולם…" + +#: ../js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "שעוני העולם" + +#: ../js/ui/dateMenu.js:225 +msgid "Weather" +msgstr "מזג אוויר" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: ../js/ui/dateMenu.js:289 +#, javascript-format +msgid "%s all day." +msgstr "%s לאורך היום" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: ../js/ui/dateMenu.js:295 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, ומאוחר יותר %s" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: ../js/ui/dateMenu.js:301 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, לאחר מכן %s וממשיך אל %s מאוחר יותר." + +#: ../js/ui/dateMenu.js:312 +msgid "Select a location…" +msgstr "בחירת מיקום…" + +#: ../js/ui/dateMenu.js:315 +msgid "Loading…" +msgstr "בטעינה…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: ../js/ui/dateMenu.js:321 +#, javascript-format +msgid "Feels like %s." +msgstr "מרגיש כמו %s." + +#: ../js/ui/dateMenu.js:324 +msgid "Go online for weather information" +msgstr "יש להתחבר בשביל מידע על מזג האוויר" + +#: ../js/ui/dateMenu.js:326 +msgid "Weather information is currently unavailable" +msgstr "מידע על מזג האוויר לא זמין כרגע" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "הוצאת %s" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "יציאה" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "המשתמש %s ייצא אוטומטית בעוד שנייה." +msgstr[1] "המשתמש %s ייצא אוטומטית בעוד %d שניות." +msgstr[2] "המשתמש %s ייצא אוטומטית בעוד %d שניות." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "אתה תצא אוטומטית בעוד שנייה." +msgstr[1] "אתה תצא אוטומטית בעוד %d שניות." +msgstr[2] "אתה תצא אוטומטית בעוד %d שניות." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "יציאה" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "כיבוי" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "התקנת עדכונים וכיבוי" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "המערכת תכבה אוטומטית בעוד שנייה." +msgstr[1] "המערכת תכבה אוטומטית בעוד %d שניות." +msgstr[2] "המערכת תכבה אוטומטית בעוד %d שניות." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "התקנת עדכוני תכנה בהמתנה" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "הפעלה מחדש" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "כיבוי" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "הפעלה מחדש" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "המערכת תופעל מחדש בעוד שנייה." +msgstr[1] "המערכת תופעל מחדש בעוד %d שניות." +msgstr[2] "המערכת תופעל מחדש בעוד %d שניות." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "הפעלה מחדש והתקנת עדכונים" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "המערכת תופעל מחדש ותתקין עדכונים בעוד שנייה." +msgstr[1] "המערכת תופעל מחדש ותקין עדכונים בעוד %d שניות." +msgstr[2] "המערכת תופעל מחדש ותקין עדכונים בעוד %d שניות." + +#: ../js/ui/endSessionDialog.js:127 ../js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "הפעלה מחדש והתקנה" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "התקנה וכיבוי" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "כיבוי לאחר התקנת עדכונים" + +#: ../js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "הפעלה מחדש ושדרוג התקנה" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: ../js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s יותקן לאחר הפעלה מחדש. שדרוג ההתקנה עשוי לקחת זמר רב: יש לוודאשגִבית " +"ושהמחשב מחובר למקור חשמל." + +#: ../js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "פועל על סוללה: נא לחבר לפני התקנת עדכונים." + +#: ../js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "כמה יישומים עסוקים או שיש עבודה שלא נשמרה." + +#: ../js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "משתמשים נוספים מחוברים." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: ../js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (מרוחק)" + +#. Translators: Console here refers to a tty like a VT console +#: ../js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (מסוף)" + +#: ../js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "התקנה" + +#: ../js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "הורדה והתקנה של „%s” מ־extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: ../js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s רוצה למנוע צירופי מקשים" + +#: ../js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "יישום הרוצה למנוע צירופי מקשים" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: ../js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "נתן לשחזר צירופי מקשים בהקשה על %s." + +#: ../js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "לדחות" + +#: ../js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "לאפשר" + +#: ../js/ui/keyboard.js:738 ../js/ui/status/keyboard.js:783 +msgid "Keyboard" +msgstr "מקלדת" + +#: ../js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "לא מותקנות הרחבות" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "‏%s לא העלה שגיאות כלשהן." + +#: ../js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "הסתרת השגיאות" + +#: ../js/ui/lookingGlass.js:706 ../js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "הצגת השגיאות" + +#: ../js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "פעיל" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:718 ../subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "מנוטרל" + +#: ../js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "שגיאה" + +#: ../js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "לא בתוקף" + +#: ../js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "בהורדה" + +#: ../js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "צפייה במקור" + +#: ../js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "דף אינטרנט" + +#: ../js/ui/messageTray.js:1494 +msgid "System Information" +msgstr "פרטי המערכת" + +#: ../js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "אמן לא ידוע" + +#: ../js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "כותרת לא ידועה" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "ביטול" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: ../js/ui/overview.js:113 +msgid "Overview" +msgstr "סקירה" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/overview.js:240 +msgid "Type to search…" +msgstr "יש להקליד כדי לחפש…" + +#: ../js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "צירוף מקשים חדש…" + +#: ../js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "הגדרת יישום" + +#: ../js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "הצגת עזרה על המסך" + +#: ../js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "החלפת צגים" + +#: ../js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "הקצאת מקש" + +#: ../js/ui/padOsd.js:220 +msgid "Done" +msgstr "בוצע" + +#: ../js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "עריכה…" + +#: ../js/ui/padOsd.js:774 ../js/ui/padOsd.js:879 +msgid "None" +msgstr "לא כלום" + +#: ../js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "יש ללחוץ על כפתור להגדרה" + +#: ../js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "יש להקיש Esc ליציאה" + +#: ../js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "יש להקיש על מנת לצאת" + +#: ../js/ui/panel.js:358 +msgid "Quit" +msgstr "יציאה" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:414 +msgid "Activities" +msgstr "פעילויות" + +#: ../js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "מערכת" + +#: ../js/ui/panel.js:812 +msgid "Top Bar" +msgstr "הסרגל העליון" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "נא להזין פקודה" + +#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:160 +msgid "Close" +msgstr "סגירה" + +#: ../js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "הפעלה מחדש אינה זמינה תחת Wayland" + +#: ../js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "מופעל מחדש…" + +#. Translators: This is a time format for a date in +#. long format +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, ה־%d ב%B" + +# javascript-format +#: ../js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "הודעה חדשה אחת" +msgstr[1] "%d הודעות חדשות" +msgstr[2] "שתי הודעות חדשות" + +# javascript-format +#: ../js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "התרעה חדשה אחת" +msgstr[1] "%d התרעות חדשות" +msgstr[2] "שתי התרעות חדשות" + +#: ../js/ui/screenShield.js:452 ../js/ui/status/system.js:284 +msgid "Lock" +msgstr "נעילה" + +#: ../js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "על GNOME לנעול את המסך" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr "לא ניתן לנעול" + +#: ../js/ui/screenShield.js:837 ../js/ui/screenShield.js:1309 +msgid "Lock was blocked by an application" +msgstr "הנעילה נחסמה ע״י היישום" + +#: ../js/ui/search.js:651 +msgid "Searching…" +msgstr "בחיפוש…" + +#: ../js/ui/search.js:653 +msgid "No results." +msgstr "אין תוצאות." + +#: ../js/ui/search.js:777 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "העתקה" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "הדבקה" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "הצגת טקסט" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "הסתרת טקסט" + +#: ../js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "ססמה" + +#: ../js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "שמירת הססמה" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "נגישות" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "תקריב" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "מקריא מסך" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "מקלדת מסך" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "התראות חזותיות" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "מקשים דביקים" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "מקשים אטיים" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "מקשים קופצים" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "מקשי עכבר" + +#: ../js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "ניגודיות גבוהה" + +#: ../js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "טקסט גדול" + +#: ../js/ui/status/bluetooth.js:48 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:57 ../js/ui/status/network.js:627 +msgid "Bluetooth Settings" +msgstr "הגדרות Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: ../js/ui/status/bluetooth.js:137 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "אחד מחובר" +msgstr[1] "%d מחוברים" +msgstr[2] "שניים מחוברים" + +#: ../js/ui/status/bluetooth.js:139 +msgid "Off" +msgstr "כבוי" + +#: ../js/ui/status/bluetooth.js:141 +msgid "On" +msgstr "פועל" + +#: ../js/ui/status/bluetooth.js:143 ../js/ui/status/network.js:1299 +msgid "Turn On" +msgstr "הפעלה" + +#: ../js/ui/status/bluetooth.js:143 ../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 "כיבוי" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "בהירות" + +#: ../js/ui/status/keyboard.js:806 +msgid "Show Keyboard Layout" +msgstr "הצגת פריסת המקלדת" + +#: ../js/ui/status/location.js:89 ../js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "איכון מאופשר" + +#: ../js/ui/status/location.js:90 ../js/ui/status/location.js:198 +msgid "Disable" +msgstr "השבתה" + +#: ../js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "הגדרות פרטיות" + +#: ../js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "איכון בשימוש" + +#: ../js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "איכון מושבת" + +#: ../js/ui/status/location.js:201 +msgid "Enable" +msgstr "אפשור" + +#. Translators: %s is an application name +#: ../js/ui/status/location.js:388 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "לתת ליישום %s גישה למיקום שלך?" + +#: ../js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "ניתן לשנות בכל עת את הרשאות הגישה למיקום שלך מהגדרות הפרטיות." + +#: ../js/ui/status/network.js:104 +msgid "" +msgstr "<לא ידוע>" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:454 ../js/ui/status/network.js:1328 +#, javascript-format +msgid "%s Off" +msgstr "%s כבוי" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:457 +#, javascript-format +msgid "%s Connected" +msgstr "%s מחובר" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: ../js/ui/status/network.js:462 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s לא מנוהל" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:465 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s בהליכי ניתוק" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:472 ../js/ui/status/network.js:1320 +#, javascript-format +msgid "%s Connecting" +msgstr "%s בהתחברות" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: ../js/ui/status/network.js:475 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s דורש אימות" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: ../js/ui/status/network.js:483 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "חסרה קושחה עבור %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: ../js/ui/status/network.js:487 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s לא זמין" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:490 +#, javascript-format +msgid "%s Connection Failed" +msgstr "נכשלה ההתחברות אל %s" + +#: ../js/ui/status/network.js:506 +msgid "Wired Settings" +msgstr "הגדרות רשת קווית" + +#: ../js/ui/status/network.js:548 +msgid "Mobile Broadband Settings" +msgstr "הגדרות פס־רחב נייד" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:591 ../js/ui/status/network.js:1325 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s נמנוטרל חומרתית" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: ../js/ui/status/network.js:595 +#, javascript-format +msgid "%s Disabled" +msgstr "%s מושבת" + +#: ../js/ui/status/network.js:635 +msgid "Connect to Internet" +msgstr "התחברות לאינטרנט" + +#: ../js/ui/status/network.js:833 +msgid "Airplane Mode is On" +msgstr "מצב טיסה מופעל" + +#: ../js/ui/status/network.js:834 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "רשת אלחוטית מושבתת כאשר מצב טיסה מופעל." + +#: ../js/ui/status/network.js:835 +msgid "Turn Off Airplane Mode" +msgstr "כיבוי מצב טיסה" + +#: ../js/ui/status/network.js:844 +msgid "Wi-Fi is Off" +msgstr "רשת אלחוטית כבויה" + +#: ../js/ui/status/network.js:845 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "רשת אלחוטית צריכה להיות מופעלת על מנת להתחבר לרשת." + +#: ../js/ui/status/network.js:846 +msgid "Turn On Wi-Fi" +msgstr "הפעלת רשת אלחוטית" + +#: ../js/ui/status/network.js:871 +msgid "Wi-Fi Networks" +msgstr "רשתות אלחוטיות" + +#: ../js/ui/status/network.js:873 +msgid "Select a network" +msgstr "בחירת רשת" + +#: ../js/ui/status/network.js:903 +msgid "No Networks" +msgstr "אין רשתות" + +#: ../js/ui/status/network.js:924 ../js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "שימוש במתג של החומרה לכיבוי" + +#: ../js/ui/status/network.js:1191 +msgid "Select Network" +msgstr "בחירת רשת" + +#: ../js/ui/status/network.js:1197 +msgid "Wi-Fi Settings" +msgstr "הגדרות רשת אלחוטית" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:1316 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "נקודה חמה %s פעילה" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:1331 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s לא מחובר" + +#: ../js/ui/status/network.js:1435 +msgid "connecting…" +msgstr "בהתחברות…" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:1438 +msgid "authentication required" +msgstr "נדרש אימות" + +#: ../js/ui/status/network.js:1440 +msgid "connection failed" +msgstr "ההתחברות נכשלה" + +#: ../js/ui/status/network.js:1494 +msgid "VPN Settings" +msgstr "הגדרות VPN" + +#: ../js/ui/status/network.js:1498 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1508 +msgid "VPN Off" +msgstr "VPN כבוי" + +#: ../js/ui/status/network.js:1572 ../js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "הגדרות הרשת" + +#: ../js/ui/status/network.js:1603 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/status/network.js:1607 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/status/network.js:1611 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/status/network.js:1759 +msgid "Connection failed" +msgstr "ההתחברות נכשלה" + +#: ../js/ui/status/network.js:1760 +msgid "Activation of network connection failed" +msgstr "הפעלת חיבור הרשת נכשלה" + +#: ../js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "תאורת לילה מושבתת" + +#: ../js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "תאורת לילה פועלת" + +#: ../js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "המשך" + +#: ../js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "להשבית עד מחר" + +#: ../js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "הגדרות צריכת החשמל" + +#: ../js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "בטעינה מלאה" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:84 ../js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "מתבצע שערוך…" + +#. Translators: this is : Remaining () +#: ../js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "‏‎‎%d∶%02d נותרו (%d%%)" + +#. Translators: this is : Until Full () +#: ../js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d עד לטעינה מלאה (%d%%)" + +#: ../js/ui/status/power.js:131 ../js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: ../js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "מצב טיסה מופעל" + +#: ../js/ui/status/system.js:228 +msgid "Switch User" +msgstr "החלפת משתמש" + +#: ../js/ui/status/system.js:240 +msgid "Log Out" +msgstr "יציאה" + +#: ../js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "הגדרות חשבון" + +#: ../js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "נעילת כיוון" + +#: ../js/ui/status/system.js:295 +msgid "Suspend" +msgstr "השהיה" + +#: ../js/ui/status/system.js:305 +msgid "Power Off" +msgstr "כיבוי" + +#: ../js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "עצמת השמע השתנתה" + +#: ../js/ui/status/volume.js:170 +msgid "Volume" +msgstr "עצמה" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: ../js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "מראה" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: ../js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "צירוף תצוגות" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: ../js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "חיצוני בלבד" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: ../js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "מובנה בלבד" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "כניסה בתור משתמש אחר" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "שחרור החלון" + +#: ../js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "יישומים" + +#: ../js/ui/viewSelector.js:194 +msgid "Search" +msgstr "חיפוש" + +#: ../js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "‏„%s” מוכן" + +#: ../js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "האם ברצונך לשמור הגדרות תצוגה אלה?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "שחזור הגדרות" + +#: ../js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "שמירת שינויים" + +# javascript-format +#: ../js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "שינויי הגדרות ישוחזרו בעוד שנייה" +msgstr[1] "שינויי הגדרות ישוחזרו בעוד %d שניות" +msgstr[2] "שינויי הגדרות ישוחזרו בעוד %d שניות" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: ../js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "מזעור" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "ביטול הגדלה" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "הגדלה" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "הזזה" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "שינוי גודל" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "הזזת שורת הכותרת על המסך" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "תמיד עליון" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "הצגה בכל מרחבי העבודה" + +#: ../js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "הזזה למרחב העבודה שמשמאל" + +#: ../js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "הזזה למרחב העבודה שמימין" + +#: ../js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "הזזה למרחב העבודה שמלמעלה" + +#: ../js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "הזזה למרחב העבודה שמלמטה" + +#: ../js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "הזה לצג שמלמעלה" + +#: ../js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "הזזה לצג שמלמטה" + +#: ../js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "הזזה לצג שמשמאל" + +#: ../js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "הזזה לצג שמימין" + +#: ../src/main.c:437 +msgid "Print version" +msgstr "Print version" + +#: ../src/main.c:443 +msgid "Mode used by GDM for login screen" +msgstr "המצב בו GDM יעשה שימוש לצורך מסך הכניסה" + +#: ../src/main.c:449 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "שימוש במצב מסוים, לדוגמה: „gdm“ למסך הכניסה" + +#: ../src/main.c:455 +msgid "List possible modes" +msgstr "הצגת המצבים האפשריים" + +#: ../src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "לא ידוע" + +#: ../src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "אירע כשל בטעינת „%s”" + +#: ../src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "הססמאות אינן תואמות." + +#: ../src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "הססמה אינה יכולה להישאר ריקה" + +#: ../src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "פלט אחד" +msgstr[1] "%u פלטים" +msgstr[2] "שני פלטים" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "קלט אחד" +msgstr[1] "%u קלטים" +msgstr[2] "שני קלטים" + +#: ../subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "צלילי מערכת" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "העדפות ההרחבות של GNOME Shell" + +#~ msgid "Configure GNOME Shell Extensions" +#~ msgstr "הגדרת הרחבות GNOME Shell" + +#~ msgid "GNOME Shell" +#~ msgstr "מעטפת GNOME" + +#~ msgid "Window management and application launching" +#~ msgstr "ניהול חלונות והרצת יישומים" + +#~ msgid "Enable internal tools useful for developers and testers from Alt-F2" +#~ msgstr "Enable internal tools useful for developers and testers from Alt-F2" + +#~ msgid "" +#~ "Allows access to internal debugging and monitoring tools using the Alt-F2 " +#~ "dialog." +#~ msgstr "" +#~ "Allows access to internal debugging and monitoring tools using the Alt-F2 " +#~ "dialog." + +#~ msgid "UUIDs of extensions to enable" +#~ msgstr "UUIDs of extensions to enable" + +#~ msgid "" +#~ "GNOME Shell extensions have a UUID property; this key lists extensions " +#~ "which should be loaded. Any extension that wants to be loaded needs to be " +#~ "in this list. You can also manipulate this list with the EnableExtension " +#~ "and DisableExtension D-Bus methods on org.gnome.Shell." +#~ msgstr "" +#~ "GNOME Shell extensions have a UUID property; this key lists extensions " +#~ "which should be loaded. Any extension that wants to be loaded needs to be " +#~ "in this list. You can also manipulate this list with the EnableExtension " +#~ "and DisableExtension D-Bus methods on org.gnome.Shell." + +#~ msgid "Disables the validation of extension version compatibility" +#~ msgstr "Disables the validation of extension version compatibility" + +#~ msgid "" +#~ "GNOME Shell will only load extensions that claim to support the current " +#~ "running version. Enabling this option will disable this check and try to " +#~ "load all extensions regardless of the versions they claim to support." +#~ msgstr "" +#~ "GNOME Shell will only load extensions that claim to support the current " +#~ "running version. Enabling this option will disable this check and try to " +#~ "load all extensions regardless of the versions they claim to support." + +#~ msgid "List of desktop file IDs for favorite applications" +#~ msgstr "List of desktop file IDs for favorite applications" + +#~ msgid "" +#~ "The applications corresponding to these identifiers will be displayed in " +#~ "the favorites area." +#~ msgstr "" +#~ "The applications corresponding to these identifiers will be displayed in " +#~ "the favorites area." + +#~ msgid "App Picker View" +#~ msgstr "App Picker View" + +#~ msgid "Index of the currently selected view in the application picker." +#~ msgstr "Index of the currently selected view in the application picker." + +#~ msgid "History for command (Alt-F2) dialog" +#~ msgstr "History for command (Alt-F2) dialog" + +#~ msgid "History for the looking glass dialog" +#~ msgstr "History for the looking glass dialog" + +#~ msgid "Always show the 'Log out' menu item in the user menu." +#~ msgstr "Always show the 'Log out' menu item in the user menu." + +#~ msgid "" +#~ "This key overrides the automatic hiding of the 'Log out' menu item in " +#~ "single-user, single-session situations." +#~ msgstr "" +#~ "This key overrides the automatic hiding of the 'Log out' menu item in " +#~ "single-user, single-session situations." + +#~ msgid "" +#~ "Whether to remember password for mounting encrypted or remote filesystems" +#~ msgstr "" +#~ "Whether to remember password for mounting encrypted or remote filesystems" + +#~ msgid "" +#~ "The shell will request a password when an encrypted device or a remote " +#~ "filesystem is mounted. If the password can be saved for future use a " +#~ "'Remember Password' checkbox will be present. This key sets the default " +#~ "state of the checkbox." +#~ msgstr "" +#~ "The shell will request a password when an encrypted device or a remote " +#~ "filesystem is mounted. If the password can be saved for future use a " +#~ "'Remember Password' checkbox will be present. This key sets the default " +#~ "state of the checkbox." + +#~ msgid "" +#~ "Whether the default Bluetooth adapter had set up devices associated to it" +#~ msgstr "" +#~ "Whether the default Bluetooth adapter had set up devices associated to it" + +#~ msgid "" +#~ "The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +#~ "powered, or if there were devices set up associated with the default " +#~ "adapter. This will be reset if the default adapter is ever seen not to " +#~ "have devices associated to it." +#~ msgstr "" +#~ "The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +#~ "powered, or if there were devices set up associated with the default " +#~ "adapter. This will be reset if the default adapter is ever seen not to " +#~ "have devices associated to it." + +#~ msgid "Keybinding to open the application menu" +#~ msgstr "Keybinding to open the application menu" + +#~ msgid "Keybinding to open the application menu." +#~ msgstr "Keybinding to open the application menu." + +#~ msgid "Keybinding to open the \"Show Applications\" view" +#~ msgstr "Keybinding to open the \"Show Applications\" view" + +#~ msgid "" +#~ "Keybinding to open the \"Show Applications\" view of the Activities " +#~ "Overview." +#~ msgstr "" +#~ "Keybinding to open the \"Show Applications\" view of the Activities " +#~ "Overview." + +#~ msgid "Keybinding to open the overview" +#~ msgstr "Keybinding to open the overview" + +#~ msgid "Keybinding to open the Activities Overview." +#~ msgstr "Keybinding to open the Activities Overview." + +#~ msgid "Keybinding to toggle the visibility of the notification list" +#~ msgstr "Keybinding to toggle the visibility of the notification list" + +#~ msgid "Keybinding to toggle the visibility of the notification list." +#~ msgstr "Keybinding to toggle the visibility of the notification list." + +#~ msgid "Keybinding to focus the active notification" +#~ msgstr "Keybinding to focus the active notification" + +#~ msgid "Keybinding to focus the active notification." +#~ msgstr "Keybinding to focus the active notification." + +#~ msgid "" +#~ "Keybinding that pauses and resumes all running tweens, for debugging " +#~ "purposes" +#~ msgstr "" +#~ "Keybinding that pauses and resumes all running tweens, for debugging " +#~ "purposes" + +#~ msgid "Which keyboard to use" +#~ msgstr "Which keyboard to use" + +#~ msgid "The type of keyboard to use." +#~ msgstr "The type of keyboard to use." + +#~ msgid "Limit switcher to current workspace." +#~ msgstr "Limit switcher to current workspace." + +#~ msgid "" +#~ "If true, only applications that have windows on the current workspace are " +#~ "shown in the switcher. Otherwise, all applications are included." +#~ msgstr "" +#~ "If true, only applications that have windows on the current workspace are " +#~ "shown in the switcher. Otherwise, all applications are included." + +#~ msgid "The application icon mode." +#~ msgstr "The application icon mode." + +#~ msgid "" +#~ "Configures how the windows are shown in the switcher. Valid possibilities " +#~ "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +#~ "only' (shows only the application icon) or 'both'." +#~ msgstr "" +#~ "Configures how the windows are shown in the switcher. Valid possibilities " +#~ "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +#~ "only' (shows only the application icon) or 'both'." + +#~ msgid "" +#~ "If true, only windows from the current workspace are shown in the " +#~ "switcher. Otherwise, all windows are included." +#~ msgstr "" +#~ "If true, only windows from the current workspace are shown in the " +#~ "switcher. Otherwise, all windows are included." + +#~ msgid "Attach modal dialog to the parent window" +#~ msgstr "Attach modal dialog to the parent window" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.mutter when running GNOME Shell." +#~ msgstr "" +#~ "This key overrides the key in org.gnome.mutter when running GNOME Shell." + +#~ msgid "Enable edge tiling when dropping windows on screen edges" +#~ msgstr "Enable edge tiling when dropping windows on screen edges" + +#~ msgid "Workspaces are managed dynamically" +#~ msgstr "Workspaces are managed dynamically" + +#~ msgid "Workspaces only on primary monitor" +#~ msgstr "Workspaces only on primary monitor" + +#~ msgid "Delay focus changes in mouse mode until the pointer stops moving" +#~ msgstr "Delay focus changes in mouse mode until the pointer stops moving" + +#~| msgid "Network error" +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "אימות ניתוב הרשת" + +#~ msgid "Events" +#~ msgstr "אירועים" + +#~ msgid "Notifications" +#~ msgstr "התרעות" + +#~ msgid "Hide tray" +#~ msgstr "הסתרת המגש" + +#~ msgid "Status Icons" +#~ msgstr "סמלי מצב" + +#~ msgid "Clear section" +#~ msgstr "ניקוי מקטע" + +#~ msgid "Media" +#~ msgstr "מדיה" + +#~ msgid "Not In Use" +#~ msgstr "לא בשימוש" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Evolution Calendar" +#~ msgstr "יומן אבולושן" + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ msgid "System" +#~ msgstr "מערכת" + +# javascript-format +#~ msgid "Show the notification list" +#~ msgstr "הצגת רשימת ההתרעות" + +#~ msgid "Focus the active notification" +#~ msgstr "התמקדות על ההתרעה הפעילה" + +#~ msgid "Show the overview" +#~ msgstr "הצגת הסקירה" + +#~ msgid "Show all applications" +#~ msgstr "הצגת כל היישומים" + +#~ msgid "Open the application menu" +#~ msgstr "פתיחת תפריט היישום" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Show the week date in the calendar" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "If true, display the ISO week date in the calendar." + +#~ msgid "Use as Internet connection" +#~ msgstr "שימוש כחיבור לאינטרנט" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "‏%s דורש גישה למיקום שלך." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "‏GNOME Shell (מסדר wayland)" + +# javascript-format +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "התקן אחד מחובר" +#~ msgstr[1] "%d התקנים מחוברים" + +#~ msgid "Authentication required" +#~ msgstr "נדרש אימות" + +#~ msgid "UPS" +#~ msgstr "אל־פסק" + +#~ msgid "Battery" +#~ msgstr "סוללה" + +#~ msgid "Airplane Mode" +#~ msgstr "מצב טיסה" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "‎%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Invitation" +#~ msgstr "הזמנה" + +#~ msgid "Call" +#~ msgstr "התקשרות" + +#~ msgid "File Transfer" +#~ msgstr "העברת קבצים" + +#~ msgid "Chat" +#~ msgstr "שיחה" + +#~ msgid "Invitation to %s" +#~ msgstr "הזמנה ל־%s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "הוזמנת על ידי %s להצטרף אל %s" + +#~ msgid "Decline" +#~ msgstr "דחייה" + +#~ msgid "Accept" +#~ msgstr "אישור" + +#~ msgid "Video call from %s" +#~ msgstr "שיחת וידאו מאת %s" + +#~ msgid "Call from %s" +#~ msgstr "שיחה מאת %s" + +#~ msgid "Answer" +#~ msgstr "מענה" + +#~ msgid "%s is sending you %s" +#~ msgstr "‏%s שולח/ת אליך %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "‏%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון" + +#~ msgid "Authentication failed" +#~ msgstr "האימות נכשל" + +#~ msgid "Encryption error" +#~ msgstr "שגיאת הצפנה" + +#~ msgid "Certificate not provided" +#~ msgstr "לא סופק אישור" + +#~ msgid "Certificate untrusted" +#~ msgstr "האישור אינו מהימן" + +#~ msgid "Certificate expired" +#~ msgstr "האישור פג" + +#~ msgid "Certificate not activated" +#~ msgstr "האישור לא מופעל" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "שם המארח באישור אינו תואם" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "חוסר התאמה בטביעת האצבע של האישור" + +#~ msgid "Certificate self-signed" +#~ msgstr "אישור בחתימה עצמית" + +#~ msgid "Status is set to offline" +#~ msgstr "המצב הוגדר ל'מנותק'" + +#~ msgid "Certificate is invalid" +#~ msgstr "האישור אינו תקף" + +#~ msgid "Connection has been refused" +#~ msgstr "ההתחברות נשללה" + +#~ msgid "Connection can't be established" +#~ msgstr "לא ניתן להפעיל את החיבור" + +#~ msgid "Connection has been lost" +#~ msgstr "החיבור אבד" + +#~ msgid "This account is already connected to the server" +#~ msgstr "חשבון זה כבר מחובר לשרת" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "החיבור הוחלף בחיבור חדש באמצעות אותו המשאב" + +#~ msgid "The account already exists on the server" +#~ msgstr "החשבון כבר קיים בשרת" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "השרת עסוק ברגע זה מכדי לטפל בחיבור" + +#~ msgid "Certificate has been revoked" +#~ msgstr "האישור נשלל" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "האישור משתמש באלגוריתם הצפנה שאינו בטוח או חלש מבחינת הצפנה" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "אורך אישור השרת, או עומק שרשרת אישור השרת, חורגים מהמגבלות שנכפו על ידי " +#~ "ספריית ההצפנה" + +#~ msgid "Internal error" +#~ msgstr "שגיאה פנימית" + +#~ msgid "Unable to connect to %s" +#~ msgstr "לא ניתן להתחבר אל %s" + +#~ msgid "View account" +#~ msgstr "צפייה בחשבון" + +#~ msgid "Show the message list" +#~ msgstr "הצגת רשימת הודעות" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "א׳" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "ב׳" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "ג׳" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "ד׳" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "ה" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "ו׳" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "ש׳" + +#~ msgid "Nothing Scheduled" +#~ msgstr "היומן ריק" + +#~ msgid "Today" +#~ msgstr "היום" + +#~ msgid "Tomorrow" +#~ msgstr "מחר" + +#~ msgid "This week" +#~ msgstr "השבוע" + +#~ msgid "Next week" +#~ msgstr "בשבוע הבא" + +#~ msgid "Removable Devices" +#~ msgstr "התקנים נשלפים" + +#~ msgid "Eject" +#~ msgstr "שליפה" + +#~ msgid "Unmute" +#~ msgstr "ביטול ההשתקה" + +#~ msgid "Mute" +#~ msgstr "השתקה" + +#~ msgid "Open Calendar" +#~ msgstr "פתיחת היומן" + +#~ msgid "Date & Time Settings" +#~ msgstr "הגדרות תאריך ושעה" + +#~ msgid "Open" +#~ msgstr "פתיחה" + +#~ msgid "Remove" +#~ msgstr "הסרה" + +#~ msgid "Clear Messages" +#~ msgstr "פינוי ההודעות" + +#~ msgid "Notification Settings" +#~ msgstr "הגדרות התרעה" + +#~ msgid "Tray Menu" +#~ msgstr "תפריט מגש" + +#~ msgid "No Messages" +#~ msgstr "אין הודעות" + +#~ msgid "Message Tray" +#~ msgstr "אזור דיווח ההודעות" + +#~ msgid "Captive Portal" +#~ msgstr "Captive Portal" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "The maximum accuracy level of location." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Arrangement of buttons on the titlebar" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "הרחבה" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "יש לבחור את ההרחבה להגדרה באמצעות תיבת הבחירה המשולבת שלהלן." + +#~ msgid "calendar:MY" +#~ msgstr "calendar:YM" + +#~ msgid "unavailable" +#~ msgstr "לא זמין" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgid "%A, %H\\u2236%M" +#~ msgstr "%A, %H\\u2236%M" + +#~ msgid "%B %d, %H\\u2236%M" +#~ msgstr "%d ב%B, %H\\u2236%M" + +#~ msgid "%B %d %Y, %H\\u2236%M" +#~ msgstr "%d ב%B %Y, %H\\u2236%M" + +#~ msgid "%l\\u2236%M %p" +#~ msgstr "%l\\u2236%M %p" + +#~ msgid "%A, %l\\u2236%M %p" +#~ msgstr "%A, %l\\u2236%M %p" + +#~ msgid "%B %d, %l\\u2236%M %p" +#~ msgstr "%d ב%B, %l\\u2236%M %p" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A ב־%H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "ה־%d ב%B ב־%H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "ה־%d ב%B %Y ב־%H:%M" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "List of categories that should be displayed as folders" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." + +#~ msgid "Authorization request from %s" +#~ msgstr "בקשת אישור מאת %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'" + +#~ msgid "Grant this time only" +#~ msgstr "הענקת גישה הפעם בלבד" + +#~ msgid "Reject" +#~ msgstr "סירוב" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "אישור צימוד עבור %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "נא לאשר האם מילת הצופן '%06d' תואמת את זו שמופיעה בהתקן." + +#~ msgid "Matches" +#~ msgstr "התאמות" + +#~ msgid "Does not match" +#~ msgstr "אינו תואם" + +#~ msgid "Pairing request for %s" +#~ msgstr "בקשת צימוד עבור %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן." + +#~ msgid "OK" +#~ msgstr "אישור" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "אין משפטי חכמה עבורך להיום, צר לי:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "‏%s, כה אמרה האוראקל" + +#~ msgid "Screenshots" +#~ msgstr "צילומי מסך" + +#~ msgid "Record a screencast" +#~ msgstr "הסרטת המסך" + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Keybinding to toggle the screen recorder" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Keybinding to start/stop the builtin screen recorder." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Framerate used for recording screencasts." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "The gstreamer pipeline used to encode the screencast" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "File extension used for storing the screencast" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." + +#~ msgid "Session" +#~ msgstr "הפעלה" + +#~ msgid "Power" +#~ msgstr "צריכת חשמל" + +#~ msgid "Screencast from %d %t" +#~ msgstr "צילום מסך מהקובץ %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "יש ללחוץ על יציאה כדי לסגור יישומים אלה ולצאת מהמערכת." + +#~ msgid "Logging out of the system." +#~ msgstr "מתבצעת יציאה מהמערכת." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "יש ללחוץ על כיבוי כדי לסגור יישומים אלה ולכבות את המערכת." + +#~ msgid "Powering off the system." +#~ msgstr "המערכת נכבית." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "יש ללחוץ על יציאה כדי לסגור יישומים אלה ולהפעיל את המערכת מחדש." + +#~ msgid "Restarting the system." +#~ msgstr "המערכת מופעלת מחדש" + +#~ msgid "Volume, network, battery" +#~ msgstr "עצמת שמע, רשת, סוללה" + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "כיבוי המערכת עלול לגרום להם לאיבוד עבודה שלא נשמרה." + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Whether to collect stats about applications usage" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." + +#~ msgid "Universal Access Settings" +#~ msgstr "הגדרות גישה אוניברסלית" + +#~ msgid "Visibility" +#~ msgstr "הצגה" + +#~ msgid "Set Up a New Device…" +#~ msgstr "הגדרת התקן חדש…" + +#~ msgid "Send Files…" +#~ msgstr "שליחת קבצים…" + +#~ msgid "Keyboard Settings" +#~ msgstr "הגדרות מקלדת" + +#~ msgid "Mouse Settings" +#~ msgstr "הגדרות עכבר" + +#~ msgid "Region & Language Settings" +#~ msgstr "הגדרות אזור ושפה" + +#~ msgid "disabled" +#~ msgstr "מנוטרל" + +#~ msgid "cable unplugged" +#~ msgstr "הכבל מנותק" + +#~ msgid "More…" +#~ msgstr "עוד…" + +#~ msgid "Wired" +#~ msgstr "קווי" + +#~ msgid "Auto Ethernet" +#~ msgstr "אתרנט אוטומטי" + +#~ msgid "Auto broadband" +#~ msgstr "פס רחב אוטומטי" + +#~ msgid "Auto dial-up" +#~ msgstr "חיוג אוטומטי" + +#~ msgid "Auto %s" +#~ msgstr "‏%s אוטומטי" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth אוטומטי" + +#~ msgid "Auto wireless" +#~ msgstr "אלחוטי אוטומטי" + +#~ msgid "Wi-Fi" +#~ msgstr "רשת אלחוטית" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s נותרו" + +#~ msgid "AC Adapter" +#~ msgstr "מתאם חשמל" + +#~ msgid "Laptop Battery" +#~ msgstr "סוללת מחשב נייד" + +#~ msgid "Monitor" +#~ msgstr "צג" + +#~ msgid "Mouse" +#~ msgstr "עכבר" + +#~ msgid "PDA" +#~ msgstr "מחשב כף יד" + +#~ msgid "Cell Phone" +#~ msgstr "טלפון סלולרי" + +#~ msgid "Media Player" +#~ msgstr "נגן מדיה" + +#~ msgid "Tablet" +#~ msgstr "טבלת שליטה" + +#~ msgid "Computer" +#~ msgstr "מחשב" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgid "Available" +#~ msgstr "זמין" + +#~ msgid "Busy" +#~ msgstr "עסוק" + +#~ msgid "Invisible" +#~ msgstr "בלתי נראה" + +#~ msgid "Away" +#~ msgstr "מרוחק" + +#~ msgid "Idle" +#~ msgstr "בהמתנה" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "מצב הצ׳אט שלך יוגדר ל'עסוק'" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "ההתרעות כבויות כעת, לרבות הודעות צ׳אט. המצב המקוון שלך הותאם כדי לבשר " +#~ "לאחרים שיתכן שהודעותיהם לא יתקבלו באופן מיידי." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "כניסה" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "tray" +#~ msgstr "מגש מערכת" + +#~ msgid "More..." +#~ msgstr "עוד..." + +#~ msgid "United Kingdom" +#~ msgstr "בריטניה" + +#~ msgid "Default" +#~ msgstr "בררת מחדל" + +#~ msgid "Show full name in the user menu" +#~ msgstr "Show full name in the user menu" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "Whether the users full name is shown in the user menu or not." + +#~ msgid "APPLICATIONS" +#~ msgstr "יישומים" + +#~ msgid "SETTINGS" +#~ msgstr "הגדרות" + +#~ msgid "Subscription request" +#~ msgstr "בקשת הרשמה" + +#~ msgid "%H:%M on Yesterday" +#~ msgstr "אתמול ב־%H:%M" + +#~ msgid "%H:%M on %A, %B %d, %Y" +#~ msgstr "%A, ה־%d ב%B, %Y בשעה %H:%M" + +#~ msgid "Connection to %s failed" +#~ msgstr "החיבור אל %s נכשל" + +#~ msgid "Reconnect" +#~ msgstr "התחברות מחדש" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "ביצת הפסחא האהובה עליך" + +#~ msgid "Browse Files..." +#~ msgstr "עיון בקבצים..." + +#~ msgid "Error browsing device" +#~ msgstr "שגיאה בעיון בהתקן" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'" + +#~ msgid "Wireless" +#~ msgstr "אלחוטי" + +#~ msgid "VPN Connections" +#~ msgstr "חיבורי VPN" + +#~ msgid "System Settings" +#~ msgstr "הגדרות המערכת" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "disabled OpenSearch providers" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "אירע כשל בניתוק '%s'" + +#~ msgid "Retry" +#~ msgstr "ניסיון חוזר" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "מקומות והתקנים" + +#~ msgid "Home" +#~ msgstr "בית" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "התחברות אל..." + +#~ msgid "Passphrase" +#~ msgstr "מילת צופן" + +#~ msgid "Show time with seconds" +#~ msgstr "Show time with seconds" + +#~ msgid "If true, display seconds in time." +#~ msgstr "If true, display seconds in time." + +#~ msgid "Show date in clock" +#~ msgstr "Show date in clock" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "If true, display date in the clock, in addition to time." + +#~ msgctxt "contact" +#~ msgid "Unknown" +#~ msgstr "לא ידוע" + +#~ msgid "CONTACTS" +#~ msgstr "אנשי קשר" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "ססמה שגויה, נא לנסות שוב" + +#~ msgid "%s is online." +#~ msgstr "‏%s התחבר/ה." + +#~ msgid "%s is offline." +#~ msgstr "‏%s התנתק/ה." + +#~ msgid "%s is away." +#~ msgstr "‏'%s' מרוחק/ת." + +#~ msgid "%s is busy." +#~ msgstr "‏%s עסוק/ה." + +#~ msgid "Hidden" +#~ msgstr "מוסתר" + +#~ msgid "Power Off..." +#~ msgstr "כיבוי..." + +#~ msgid "Online Accounts" +#~ msgstr "חשבונות מקוונים" + +#~ msgid "Log Out..." +#~ msgstr "ניתוק..." + +#~ msgid "RECENT ITEMS" +#~ msgstr "פריטים אחרונים" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. disabled-extensions overrides this setting for " +#~ "extensions that appear in both lists." +#~ msgstr "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. disabled-extensions overrides this setting for " +#~ "extensions that appear in both lists." + +#~ msgid "Show password" +#~ msgstr "הצגת ססמה" + +#~ msgid "%s has finished starting" +#~ msgstr "‏%s סיים את תהליך ההתחלה" + +#~ msgid "Home Folder" +#~ msgstr "תיקיית הבית" + +#~ msgid "Uuids of extensions to disable" +#~ msgstr "Uuids of extensions to disable" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "כרגע ישנו חיבור בינך ובין רשת הפס הרחב הניידת '%s'" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "כרגע ישנו חיבור בינך ובין הרשת האלחוטית '%s'" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "כרגע ישנו חיבור בינך ובין הרשת הקווית '%s'" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "כרגע ישנו חיבור בינך ובין רשת ה־VPN‏ '%s'" + +#~ msgid "calendar:week_start:0" +#~ msgstr "calendar:week_start:0" + +#~ msgid "Localization Settings" +#~ msgstr "הגדרות אזוריות" + +#~ msgid "Shut Down" +#~ msgstr "כיבוי" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "יש ללחוץ על יציאה כדי לסגור יישומים אלה ולכבות את המערכת." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "המערכת תכבה אוטומטית בעוד %d שניות." + +#~ msgid "Shutting down the system." +#~ msgstr "המערכת נכבית." + +#~ msgid "Confirm" +#~ msgstr "אישור" + +#~ msgid "Panel" +#~ msgstr "לוח" + +#~ msgid "PREFERENCES" +#~ msgstr "העדפות" + +#~ msgid "Shut Down..." +#~ msgstr "כיבוי..." + +#~ msgid "Clip the crosshairs at the center" +#~ msgstr "Clip the crosshairs at the center" + +#~ msgid "Color of the crosshairs" +#~ msgstr "Color of the crosshairs" + +#~ msgid "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." +#~ msgstr "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." + +#~ msgid "" +#~ "Determines the position of the magnified mouse image within the magnified " +#~ "view and how it reacts to system mouse movement. The values are - none: " +#~ "no mouse tracking; - centered: the mouse image is displayed at the center " +#~ "of the zoom region (which also represents the point under the system " +#~ "mouse) and the magnified contents are scrolled as the system mouse moves; " +#~ "- proportional: the position of the magnified mouse in the zoom region is " +#~ "proportionally the same as the position of the system mouse on screen; - " +#~ "push: when the magnified mouse intersects a boundary of the zoom region, " +#~ "the contents are scrolled into view." +#~ msgstr "" +#~ "Determines the position of the magnified mouse image within the magnified " +#~ "view and how it reacts to system mouse movement. The values are - none: " +#~ "no mouse tracking; - centered: the mouse image is displayed at the center " +#~ "of the zoom region (which also represents the point under the system " +#~ "mouse) and the magnified contents are scrolled as the system mouse moves; " +#~ "- proportional: the position of the magnified mouse in the zoom region is " +#~ "proportionally the same as the position of the system mouse on screen; - " +#~ "push: when the magnified mouse intersects a boundary of the zoom region, " +#~ "the contents are scrolled into view." + +#~ msgid "" +#~ "Determines the transparency of the crosshairs, from fully opaque to fully " +#~ "transparent." +#~ msgstr "" +#~ "Determines the transparency of the crosshairs, from fully opaque to fully " +#~ "transparent." + +#~ msgid "" +#~ "Determines whether the crosshairs intersect the magnified mouse sprite, " +#~ "or are clipped such that the ends of the horizontal and vertical lines " +#~ "surround the mouse image." +#~ msgstr "" +#~ "Determines whether the crosshairs intersect the magnified mouse sprite, " +#~ "or are clipped such that the ends of the horizontal and vertical lines " +#~ "surround the mouse image." + +#~ msgid "Enable lens mode" +#~ msgstr "Enable lens mode" + +#~ msgid "" +#~ "Enables/disables display of crosshairs centered on the magnified mouse " +#~ "sprite." +#~ msgstr "" +#~ "Enables/disables display of crosshairs centered on the magnified mouse " +#~ "sprite." + +#~ msgid "" +#~ "For centered mouse tracking, when the system pointer is at or near the " +#~ "edge of the screen, the magnified contents continue to scroll such that " +#~ "the screen edge moves into the magnified view." +#~ msgstr "" +#~ "For centered mouse tracking, when the system pointer is at or near the " +#~ "edge of the screen, the magnified contents continue to scroll such that " +#~ "the screen edge moves into the magnified view." + +#~ msgid "Length of the crosshairs" +#~ msgstr "Length of the crosshairs" + +#~ msgid "Magnification factor" +#~ msgstr "Magnification factor" + +#~ msgid "Mouse Tracking Mode" +#~ msgstr "Mouse Tracking Mode" + +#~ msgid "Opacity of the crosshairs" +#~ msgstr "Opacity of the crosshairs" + +#~ msgid "Scroll magnified contents beyond the edges of the desktop" +#~ msgstr "Scroll magnified contents beyond the edges of the desktop" + +#~ msgid "Show or hide crosshairs" +#~ msgstr "Show or hide crosshairs" + +#~ msgid "Show or hide the magnifier" +#~ msgstr "Show or hide the magnifier" + +#~ msgid "Show or hide the magnifier and all of its zoom regions." +#~ msgstr "Show or hide the magnifier and all of its zoom regions." + +#~ msgid "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." +#~ msgstr "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." + +#~ msgid "" +#~ "The magnified view either fills the entire screen, or occupies the top-" +#~ "half, bottom-half, left-half, or right-half of the screen." +#~ msgstr "" +#~ "The magnified view either fills the entire screen, or occupies the top-" +#~ "half, bottom-half, left-half, or right-half of the screen." + +#~ msgid "" +#~ "The power of the magnification. A value of 1.0 means no magnification. A " +#~ "value of 2.0 doubles the size." +#~ msgstr "" +#~ "The power of the magnification. A value of 1.0 means no magnification. A " +#~ "value of 2.0 doubles the size." + +#~ msgid "Thickness of the crosshairs" +#~ msgstr "Thickness of the crosshairs" + +#~ msgid "" +#~ "Whether the magnified view should be centered over the location of the " +#~ "system mouse and move with it." +#~ msgstr "" +#~ "Whether the magnified view should be centered over the location of the " +#~ "system mouse and move with it." + +#~ msgid "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." +#~ msgstr "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." + +#~ msgid "Bluetooth Agent" +#~ msgstr "סוכן Bluetooth" + +#~ msgid "Search your computer" +#~ msgstr "חיפוש במחשב שלך" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "לא ניתן להוסיף מרחבי עבודה כיוון שהם ממלאים את המכסה המרבית." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "לא ניתן להסיר את מרחב העבודה הראשון." + +#~ msgid "Customize the panel clock" +#~ msgstr "התאמת לוח השעון" + +#~ msgid "Custom format of the clock" +#~ msgstr "Custom format of the clock" + +#~ msgid "Hour format" +#~ msgstr "Hour format" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." +#~ msgstr "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." + +#~ msgid "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." +#~ msgstr "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." + +#~ msgid "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." +#~ msgstr "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." + +#~ msgid "Clock Format" +#~ msgstr "מבנה השעון" + +#~ msgid "Clock Preferences" +#~ msgstr "העדפות השעון" + +#~ msgid "Show seco_nds" +#~ msgstr "הצגת ש_ניות" + +#~ msgid "_12 hour format" +#~ msgstr "מבנה _12 שעות" + +#~ msgid "_24 hour format" +#~ msgstr "מבנה _24 שעות" + +#~ msgid "Preferences" +#~ msgstr "העדפות" + +#~ msgid "What's using power..." +#~ msgstr "מה צורך חשמל..." + +#~ msgid "Overview workspace view mode" +#~ msgstr "Overview workspace view mode" + +#~ msgid "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." +#~ msgstr "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." + +#~ msgid "Drag here to add favorites" +#~ msgstr "יש לגרור פריטים לכאן כדי להוסיף מועדפים" + +#~ msgid "Find" +#~ msgstr "חיפוש" + +#~ msgid "ON" +#~ msgstr "1" + +#~ msgid "OFF" +#~ msgstr "0" + +#~ msgid "PLACES" +#~ msgstr "מקומות" + +#~ msgid "SEARCH RESULTS" +#~ msgstr "תוצאות חיפוש" + +#~ msgid "Recent Documents" +#~ msgstr "מסמכים אחרונים" + +#~ msgid "Can't lock screen: %s" +#~ msgstr "לא ניתן לנעול את המסך: %s" + +#~ msgid "Can't temporarily set screensaver to blank screen: %s" +#~ msgstr "לא ניתן זמנית לקבוע שומר מסך כמסך שחור: %s" + +#~ msgid "Can't logout: %s" +#~ msgstr "לא ניתן להתנתק: %s" + +#~ msgid "Sidebar" +#~ msgstr "סרגל צד" diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 0000000..b298ce4 --- /dev/null +++ b/po/hi.po @@ -0,0 +1,2381 @@ +# translation of gnome-shell.master.hi.po to Hindi +# Hindi translation for gnome-shell. +# Copyright (C) 2011 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Rajesh , 2011. +# rajesh , 2012, 2013, 2014. +# chandankumar , 2012. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell.master.hi\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-19 19:40+0000\n" +"PO-Revision-Date: 2014-09-23 15:37+0630\n" +"Last-Translator: rajesh \n" +"Language-Team: Hindi \n" +"Language: hi\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: Lokalize 1.5\n" +"X-DamnedLies-Scope: partial\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "तंत्र" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "संदेश तश्तरी दिखाएँ" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "सक्रिय अधिसूचना पर फोकस करें" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "सारांश दिखाएँ" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "सभी अनुप्रयोग दिखाएँ" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "अनुप्रयोग मेन्यू खोलें" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "गनोम शेल" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "विंडो प्रबंधन और अनुप्रयोग लॉन्चिंग" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "गनोम शेल एक्सटेंशन वरीयताएँ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "गनोम शेल एक्सटेंशन विन्यस्त करें" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "गनोम शेल (wayland compositor)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Alt-F2 से डेवलपर्स और परीक्षकों के लिए उपयोगी आंतरिक उपकरण को सक्षम करें" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 संवाद का उपयोग करके आंतरिक डिबगिंग और निगरानी उपकरण तक पहुँच पायें." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "एक्सटेंशन का UUIDs सक्रिय किया जाना है" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"गनोम शैल एक्सटेंशन का एक uuid गुण है, इस कुंजी एक्सटेंशन जो लोड किया जाना " +"चाहिए की सूची " +"दिखाता हैं. किसी भी विस्तारक जिसे लोड करने के लिए चाहता है को इस सूची में " +"होने की जरूरत " +"है. आप भी इस सूची में EnableExtension और DisableExtension डिबस तरीकों के " +"साथ org." +"gnome.Shell पर हेरफेर कर सकते हैं." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "विस्तार संस्करण संगतता के वैधीकरण को निष्क्रिय करता है" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"गनोम शेल केवल वही विस्तार लोड करेगा जो मौजूदा कार्यशील संस्करण के समर्थन का " +"दावा करता है. इस विकल्प का सक्रिय करना इस चेक को निष्क्रिय करेगा और सभी " +"विस्तार को लोड करने की कोशिश करेगा उन संस्करण से अलग जिसके समर्थन का वे दावा " +"करते हैं." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "पसंदीदा अनुप्रयोगों के लिए डेस्कटॉप फ़ाइल आईडी की सूची." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"इन पहचानकर्ता के लिए अनुप्रयोगों को पसंदीदा क्षेत्र में प्रदर्शित किया जाएगा." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "एप्प पिकर दृश्य" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "अनुप्रयोग पिकर में मौजूदा चयनित दृश्य की सूची." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "कमांड (Alt-F2) के लिए इतिहास संवाद " + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "ग्लास खोज संवाद के लिए इतिहास" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "हमेशा 'लॉग आउट' मेन्यू मद को उपयोक्ता मेन्यू में दिखाएँ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"यह कुँजी 'लॉग आउट' मेन्यू मद का एकल उपयोक्ता, एकल सत्र स्थिति में स्वचालित " +"छिपाने को " +"अधिरोहित करती है." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "गोपित या दूरस्थ फ़ाइलतंत्र के लिए कूटशब्द क्या याद रखने हैं" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"यह शेल किसी कूटशब्द का निवेदन करेगा जब कोई गोपित युक्ति या दूरस्थ फ़ाइलतंत्र " +"आरोहित किया " +"जाता है. यदि कूटशब्द को भविष्य के उपयोग के लिए सहेजा जाता है तो 'कूटशब्द याद " +"रखें' " +"जाँचपेटी मौजूद रहेगा. यह कुँजी जाँचपेटी की तयशुदा स्थिति को सेट करता है." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "अगर सही है, पंचांग में सप्ताह संख्या दिखाएँ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "अगर सही है, तो पंचांग में ISO सप्ताह तिथि दिखाएँ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "अनुप्रयोग मेनू को खोलने के लिए कीबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "अनुप्रयोग मेनू को खोलने के लिए कीबाइंडिंग." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"अनुप्रयोग दिखाएँ\" दृश्य खोलने के लिए खोलने के लिए कीबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"गतिविधि परिदृश्य के \"अनुप्रयोग दिखाएँ\" दृश्य खोलने के लिए खोलने के लिए " +"कीबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +#| msgid "Keybinding to open the \"Show Applications\" view" +msgid "Keybinding to open the overview" +msgstr "सारांश खोलने के लिए कीबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +#| msgid "Keybinding to open the \"Show Applications\" view" +msgid "Keybinding to open the Activities Overview." +msgstr "गतिविधि सारांश खोलने के लिए कीबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "संदेश ट्रे की दृश्यता को टॉगल करने के लिए कीबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "संदेश ट्रे की दृश्यता को टॉगल करने के लिए कीबाइंडिंग." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "सक्रिय अधिसूचना फोकस करने के लिए कीबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "सक्रिय अधिसूचना फोकस करने के लिए कीबाइंडिंग." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"डिबगिंग उद्देश्य के लिए कीबाइंडिंग जो सभी कार्यशील ट्विन्स को रोकता है और " +"पुनर्बहाल करता है" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "उपयोग करने के लिए कुंजीपटल" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "उपयोग करने के लिए कीबोर्ड के प्रकार" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "मौजूदा कार्यस्थान में स्विचर सीमित करें." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"यदि सही है, मौजूदा कार्यस्थान पर विंडोयुक्त अनुप्रयोग इस स्विचर में दिखेगा. " +"अन्यथा, सभी अनुप्रयोग शामिल किए जाते हैं." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "अनुप्रयोग चिह्न अवस्था." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"विन्यस्त करें कि कैसे विंडोज स्विचर में दिखाए जाते हैं. मान्य संभावनाएँ हैं " +"'लघुचित्र केवल' (विंडो " +"का लघुचित्र दिखाता है), 'app-icon-केवल' (केवल अनुप्रयोग चिह्न दिखाता है) या " +"'दोनों'." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"यदि सही है, मौजूदा कार्यस्थान से आनेवाला विंडो इस स्विचर में दिखेगा. अन्यथा, " +"सभी विंडो शामिल किए जाते हैं." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "जनक विंडो में मोडल संवाद संलग्न करें" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"यह कुँजी org.gnome.mutter में कुँजी को अधिरोहित करता है जब गनोम शेल को चला " +"रहा हो." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "जब स्क्रीन किनारे पर विंडोज़ को छोड़ने बढ़त टाइलिंग सक्षम करें" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "कार्यस्थान गतिशील रूप से प्रबंधित की जाती हैं" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "केवल प्राथमिक मॉनिटर पर कार्यस्थान" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"माउस अवस्था में पॉइंटर के चलने के रूकने तक फोकस परिवर्तन को विलंबित करें" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "कैप्टिव पोर्टल" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s के लिए वरीयता संवाद लोड करने में एक त्रुटि थी:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "गनोम शेल एक्सटेंशन" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "रद्द करें" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "अगला" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "ताला खोलें" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "साइन इन" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "सत्र चुनें" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "सूचीबद्ध नहीं?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(उदाहरण के लिए, उपयोक्ता या %s)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "उपयोक्तानाम: " + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "लॉगिन विंडो" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "प्रमाणीकरण त्रुटि" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(या स्वाइप फिंगर)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "कमांड नहीं मिला" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "कमांड का विश्लेषण नहीं कर सका:" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” का निष्पादन विफल:" + +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "वेब सत्यापन रिडायरेक्ट" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "बारंबार उपयोग वाला अनुप्रयोग यहाँ प्रकट होगा" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "बारंबार" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "सभी" + +#: ../js/ui/appDisplay.js:1790 +msgid "New Window" +msgstr "नया विंडो" + +#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "पसंदीदा से हटाएँ" + +#: ../js/ui/appDisplay.js:1822 +msgid "Add to Favorites" +msgstr "पसंदीदा में जोड़ें" + +#: ../js/ui/appDisplay.js:1831 +msgid "Show Details" +msgstr "विवरण दिखाएँ" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s को आपकी पसंदीदा में जोड़ा गया है." + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s को आपकी पसंदीदा से हटाया गया है." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "सेटिंग" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "पृष्ठभूमि बदलें…" + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "पूरा दिन" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "र" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "सो" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "मं" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "बु" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "गु" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "शु" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "श" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "रवि" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "सो" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "मं" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "बु" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "गुरू" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "शु" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "श" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "पिछला माह" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "अगला माह" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "कुछ नियोजित नहीं" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "आज" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "कल" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "इस सप्ताह" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "अगला सप्ताह" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "बाहरी ड्राइव कनेक्टेड है" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "बाहरी ड्राइव डिसकनेक्टेड है" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "हटाने योग्य युक्तियाँ" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s के साथ खोलें" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "बाहर निकालें" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "कूटशब्द:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "फिर टाइप करें:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "कनेक्ट करें" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "कूटशब्द: " + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "कुंजी: " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "पहचान : " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "निजी कुंजी कूटशब्द: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "सेवा: " + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "बेतार संजाल के द्वारा सत्यापन जरूरी" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "कूटशब्द या गोपन कुंजी बेतार संजाल “%s” की पहुँच के लिए जरूरी है." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "तारयुक्त 802.1X सत्यापन" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "संजाल नाम: " + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "डीएसएल सत्यापन" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "पिन कोड जरूरी" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "पिन कोड मोबाइल ब्रॉडबैंड युक्ति के लिए जरूरी है" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "पिन: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "मोबाइल ब्रॉडबैंज संजाल कूटशब्द" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s” में कनेक्ट होने के लिए एक कूटशब्द जरूरी है." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "सत्यापन आवश्यक" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "प्रशासक" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "सत्यापित करें" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "माफ करें, वह काम नहीं करता है. कृपया फिर कोशिश करें." + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "आमंत्रण" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "कॉल करें" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "फाइल हस्तांतरण" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "गपशप" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "आवाज़ चालू" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "मूक करें" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "कल %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "कल, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s अब %s रूप में जाना जाता है" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s में आमंत्रण" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s आपको %s में शामिल होने के लिए आमंत्रित कर रहा है" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "मना करें" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "स्वीकारें" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s से वीडियो कॉल" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s से कॉल" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "जवाब" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s आपको %s भेज रहा है" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "%s यह देखने के लिए आपकी अनुमति चाहेगा कि आप कब ऑनलाइन हैं" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "संजाल त्रुटि" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "सत्यापन विफल" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "गोपन त्रुटि" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "प्रमाणपत्र नहीं दिया हुआ" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "प्रमाणपत्र गैर भरोसेमंद" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "प्रमाणपत्र समाप्त" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "प्रमाणपत्र निष्क्रिय" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "प्रमाणपत्र मेजबाननाम बेमेल" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "प्रमाणपत्र फिंगरप्रिंट बेमेल" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "प्रमाणपत्र स्वहस्ताक्षरित" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "प्रस्थिति ऑफ़लाइन पर सेट है" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "गोपन उपलब्ध नहीं है" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "प्रमाणपत्र अवैध है" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "कनेक्शन अस्वीकृत किया गया है" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "कनेक्शन स्थापित नहीं किया जा सकता है" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "कनेक्शन गुम हो गया है" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "यह खाता पहले ही सर्वर से कनेक्टेड है" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" +"समान संसाधन के उपयोग से नए कनेक्शन के द्वारा कनेक्शन को प्रतिस्थापित किया गया " +"है" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "खाता पहले ही सर्वर पर मौजूद है" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "सर्वर कनेक्शन नियंत्रित करने के लिए अभी काफी व्यस्त है" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "प्रमाणपत्र वापस लिया गया है" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "प्रमाणपत्र असुरक्षित साइफर अल्गोरिथम या गोपन की दृष्टि से कमजोर है" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"सर्वर प्रमाणपत्र की लंबाई या सर्वर प्रमाणपत्र की शृंखला की गहराई कूटलेखन " +"लाइब्रेरी के " +"द्वारा लगायी गई सीमा से आगे है" + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "आंतरिक त्रुटि" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s से संबंधित करने में असमर्थ." + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "खाता देखें" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "अज्ञात कारण" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "विंडोज़" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "अनुप्रयोग दिखाएँ" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "डैश" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "पंचांग खोलें" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "घड़ी खोलें" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "तिथि व समय सेटिंग्स" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "लॉग आउट %s" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "लॉग आउट" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s को %d सेकेंड में स्वतः लॉग आउट कर दिया जाएगा." +msgstr[1] "%s को %d सेकेंडों में स्वतः लॉग आउट कर दिया जाएगा." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "आपको %d सेकेंड में स्वतः लॉग आउट कर दिया जाएगा." +msgstr[1] "आपको %d सेकेंडों में स्वतः लॉग आउट कर दिया जाएगा." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "लॉग आउट" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "बंद करें" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "अद्यतन संस्थापित करें और बंद करें" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "यह तंत्र %d सेकेंड में स्वतः बंद हो जाएगा." +msgstr[1] "यह तंत्र %d सेकेंडों में स्वतः बंद हो जाएगा." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "स्थगित सॉफ्टवेयर अद्यतन संस्थापित करें" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "फिर आरंभ करें" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "बंद करें" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "फिर आरंभ करें" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "यह तंत्र %d सेकेंड में स्वतः फिर आरंभ हो जाएगा." +msgstr[1] "यह तंत्र %d सेकेंडों में स्वतः फिर आरंभ हो जाएगा." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "अद्यतन संस्थापित करें और फिर आरंभ करें" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +#| msgid "The system will restart automatically in %d second." +#| msgid_plural "The system will restart automatically in %d seconds." +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"यह तंत्र %d सेकेंड में स्वतः फिर आरंभ हो जाएगा और अद्यतन संस्थापित करेगा." +msgstr[1] "" +"यह तंत्र %d सेकेंड में स्वतः फिर आरंभ हो जाएगा और अद्यतन संस्थापित करेगा." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "फिर आरंभ करें और संस्थापित करें" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "संस्थापित करें और बंद करें" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "अद्यतन संस्थापित होने के बाद बंद करें" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "बैटरी ऊर्जा पर चल रहा है: अद्यतन संस्थापन के पहले प्लगिन करें." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "कुछ अनुप्रयोग व्यस्त हैं या बिना सहेजा कार्य है." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "अन्य उपयोक्ता लॉगिन गैं." + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (दूरस्थ)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (कंसोल)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "संस्थापित करें" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "“%s” को extensions.gnome.org से डाउनलोड कर संस्थापित करें?" + +#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "कुंजीपटल" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "कोई एक्सटेंशन संस्थापित नहीं" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ने कोई त्रुटि नहीं दिया है." + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "त्रुटियाँ छुपाएँ" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "त्रुटियाँ दिखाएँ" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "सक्षम" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "अक्षम" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "त्रुटि" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "समयातीत" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "डाउनलोड कर रहा है" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "श्रोत दिखाएँ" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "वेब पृष्ठ" + +#: ../js/ui/messageTray.js:1327 +msgid "Open" +msgstr "खोलें" + +#: ../js/ui/messageTray.js:1334 +msgid "Remove" +msgstr "हटाएँ" + +#: ../js/ui/messageTray.js:1631 +msgid "Notifications" +msgstr "अधिसूचना" + +#: ../js/ui/messageTray.js:1638 +msgid "Clear Messages" +msgstr "संदेश साफ़ करें" + +#: ../js/ui/messageTray.js:1657 +msgid "Notification Settings" +msgstr "अधिसूचना सेटिंग्स" + +#: ../js/ui/messageTray.js:1710 +msgid "Tray Menu" +msgstr "ट्रे मेनू" + +#: ../js/ui/messageTray.js:1934 +msgid "No Messages" +msgstr "कोई संदेश नहीं" + +#: ../js/ui/messageTray.js:1979 +msgid "Message Tray" +msgstr "संदेश तश्तरी" + +#: ../js/ui/messageTray.js:2992 +msgid "System Information" +msgstr "तंत्र जानकारी" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "अज्ञात" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d नया संदेश" +msgstr[1] "%d नए संदेश" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "पहले जैसा" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "सारांश" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "खोजने के लिए टाइप करें…" + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "बाहर" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "क्रियाएँ" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "शीर्ष पट्टी" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "कमांड दर्ज करें" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "बंद करें" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "फिर आरंभ कर रहा है..." + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d नयी अधिसूचना" +msgstr[1] "%d नयी अधिसूचनाएँ" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "तालाबंद" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "गनोम को स्क्रीन को लॉक करने में जरूरत है" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "ताला खोलने में अक्षम" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "लॉक को किसी अनुप्रयोग द्वारा अवरोधित किया गया" + +#: ../js/ui/search.js:594 +msgid "Searching…" +msgstr "खोज रहा है..." + +#: ../js/ui/search.js:596 +msgid "No results." +msgstr "कोई परिणाम नहीं." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "नक़ल करें" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "चिपकाएँ" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "पाठ दिखाएँ" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "पाठ छिपाएँ" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "कूटशब्द:" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "कूटशब्द याद रखें" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "पहुँच" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "छोटा-बड़ा करें" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "स्क्रीन वाचक" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "स्क्रीन कुँजीपटल" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "दृष्टि चेतावनी" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "स्टिकी कुंजी" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "धीमी कुंजी" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "उछलती कुंजियाँ" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "माउस कुंजियाँ" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "अधिक विरोध" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "बड़ा पाठ" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ब्लूटूथ" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "बन्द करें" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ब्लूटूथ सेटिंग्स" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d कनेक्टेड युक्ति" +msgstr[1] "%d कनेक्टेड युक्ति" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +msgid "Not Connected" +msgstr "मत कनेक्ट करें" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "चमकीलापन" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "कुंजीपट लेआउट दिखाएँ" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "स्थान" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "निष्क्रिय करें" + +#: ../js/ui/status/location.js:73 +msgid "Privacy Settings" +msgstr "गोपनीयता विन्यास" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "उपयोग में" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "सक्रिय करें" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "<अज्ञात>" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +msgid "Off" +msgstr "बंद" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "कनेक्टेड" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "अप्रबंधित" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "डिसकनेक्ट कर रहा है" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +msgid "Connecting" +msgstr "कनेक्शन" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "सत्यापन जरूरी" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "फर्मवेयर अनुपस्थित" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "अनुपलब्ध" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "कनेक्शन असफल" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "बेतार सेटिंग" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "मोबाइल ब्रॉडबैंड सेटिंग" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +msgid "Hardware Disabled" +msgstr "हार्डवेयर निष्क्रिय" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "बतौर इंटरनेट कनेक्शन उपयोग करें" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "हवाई जहाज मोड चालू है" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "वाई-फ़ाइल निष्क्रिय है जब हवाईजहाज अवस्था चालू है." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "हवाई जहाज मोड बंद करें" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "वाई फाई बंद करें" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "वाई-फ़ाई को चलाने की जरूरत है ताकि संजाल से जोड़ा जा सके." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "वाई फाई चालू करें" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr " वाई फाई संजाल" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "एक नेटवर्क चुनें" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "कोई संजाल नहीं" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "बंद करने के लिए हार्डवेयर स्विच का उपयोग करें" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "एक नेटवर्क चुनें" + +#: ../js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "वाइ फाइ सेटिंग" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "चालू करें" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "हॉटस्पॉट सक्रिय" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "कनेक्ट कर रहा है..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "सत्यापन जरूरी" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "संबंधन विफल" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "नेटवर्क सेटिंग्स" + +#: ../js/ui/status/network.js:1482 +msgid "VPN Settings" +msgstr "वीपीएन सेटिंग" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "संजाल प्रबंधक" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "संजाल कनेक्शन का सक्रियन असफल" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "बिजली सेटिंग्स" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "पूरी तरह चार्ज्ड" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "अनुमान लगा रहा है…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d शेष (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d जबतक पूर्ण (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "बैटरी" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "हवाई जहाज मोड" + +#: ../js/ui/status/rfkill.js:85 +msgid "On" +msgstr "चालू" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "उपयोक्ता बदलें" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "लॉग आउट" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "दिशा लॉक" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "स्थगित" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "बंद करें" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "आवाज़ बदला गया" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "आवाज़" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "माइक्रोफोन" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "बतौर अन्य उपयोक्ता लॉगिन करें" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "विंडो खोलें" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "अनुप्रयोग" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "ढूँढें" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” तैयार है" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "क्या आप इस प्रदर्शन जमावट को रखना चाहते हैं?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "सेटिंग्स में वापस जाएँ" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "परिवर्तन बनाए रखें" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "सेटिंग बदलाव %d सेकेंड में वापस होगा" +msgstr[1] "सेटिंग बदलाव %d सेकेंड में वापस होगा" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "न्यूनतम करें" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "गैर अधिकतम करें" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "अधिकतम करें" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "हटाएँ" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "आकार बदलें" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "ऑनस्क्रीन शीर्षकपट्टी खिसकाएँ" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "हमेशा ऊपर" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "हमेशा दृश्य कार्यस्थान पर" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "ऊपर कार्यस्थान में ले जाएँ" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "नीचे कार्यस्थान में ले जाएँ" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "एवोल्यूशन पंचांग" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u आउटपुट" +msgstr[1] "%u आउटपुट" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u इनपुट" +msgstr[1] "%u इनपुट" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "तंत्र ध्वनि" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "छपाई संस्करण" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "लॉगिन स्क्रीन के लिए प्रयुक्त जीडीएम अवस्था" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "विशेष अवस्था का उपयोग करें, उदाहरण के लिए लॉगिन स्क्रीन के लिए \"gdm\"" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "संभावित अवस्था सूचीबद्ध करें" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” लॉन्च करने में विफल" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "कूटशब्द मेल नहीं खाता है." + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "कूटशब्द खाली नहीं हो सकता है" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "सत्यापन संवाद को उपयोक्ता के द्वारा खारिज़ कर दिया गया" + +#~ msgid "Screenshots" +#~ msgstr "स्क्रीनशॉट" + +#~ msgid "Record a screencast" +#~ msgstr "screencast रिकॉर्ड करें" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "क्या अनुप्रयोगों के उपयोग के बारे में आँकड़े इकट्ठा करना हैं." + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "सबसे अधिक इस्तेमाल किया जाने वाले सक्रिय अनुप्रयोगों (जैसे लांचरों में ) पर शेल सामान्य " +#~ "रूप से नज़र रखता है. हालांकि इस डेटा को निजी रखा जाएगा, आप गोपनीयता कारणों के लिए " +#~ "इसे अक्षम कर सकते हैं. कृपया ध्यान दें कि ऐसा करने से पहले से सहेजे गए डेटा को हटाया नहीं " +#~ "जायेगा." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "श्रेणियों की सूची जिसे बतौर फ़ोल्ड़र दिखाया जाना चाहिए" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "अनुप्रयोग दृश्य में हर श्रेणी नाम को बतौर फ़ोल्डर प्रदर्शित किया जाएगा, मुख्य दृश्य में अंदर " +#~ "ही दिखाए गए रूप के बजाय." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "स्पष्ट रूप से उपयोगकर्ता द्वारा निर्धारित की गई आंतरिक रूप से पिछले आईएम उपस्थिति का " +#~ "इस्तेमाल किया किया जाता हैं. यह TpConnectionPresenceType गणन से मान लिया गया " +#~ "हैं " + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "आंतरिक रूप से उपयोगकर्ता के लिए पिछले सत्र उपस्थिति स्थिति को संग्रहीत करने के लिए " +#~ "उपयोग किया जाता हैं. यह GsmPresenceStatus गणन से मान लिया गया हैं " + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "स्क्रीन रिकॉर्डर को टॉगल करने के लिए कीबाइंडिंग" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr " निर्मित स्क्रीन रिकॉर्डर को रोकने/शुरू करने के लिए कीबाइंडिंग" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "screencasts के लिए फ्रेमरेट रिकॉर्डिंग इस्तेमाल किया." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ " गनोम शैल के स्क्रीनकास्ट रिकॉर्डर द्वारा परिणामस्वरूप रिकॉर्ड किये गए स्क्रीनकास्ट का " +#~ "फ्रेमरेट फ्रेम प्रति सेकंड में." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "Gstreamer पाइपलाइन स्क्रीनकास्ट एनकोड करने के लिए प्रयोग किया जाता है." + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "रिकॉर्डिंग को इनकोड करने के लिए GStreamer पाइपलाइन सेट करें. पाइपलाइन के पास एक " +#~ "असंबद्ध सिंक पैड है जहाँ रिकॉर्ड की गई वीडियो दर्ज की गई है.यह सामान्य रूप से एक " +#~ "असंबद्ध स्रोत पैड होगा, इस पैड के उत्पादन को आउटपुट फाइल में लिखा जाएगा. लेकिन पाइप " +#~ "लाइन भी अपने स्वयं केआउटपुट की देखभाल ले सकते हैं- इस shout2send या इसी तरह के " +#~ "माध्यम से एक Icecast सर्वर से आउटपुट को भेजने के लिए इस्तेमाल किया जा सकता है. रिक्त " +#~ "मान को निर्धारित या अनिर्धारित करने के दौरान, डिफ़ॉल्ट पाइपलाइन का इस्तेमाल किया " +#~ "जाएगा. VP8 कोडेक का उपयोग करके को WEBM रिकॉर्ड कर सकते हैं और यह वर्त्तमान में " +#~ "'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +#~ "threads=%T ! queue ! webmmux' हैं. %T सिस्टम पर इष्टतम धागा गिनती में एक अनुमान " +#~ "के लिए एक प्लेसहोल्डर के रूप में प्रयोग किया जाता है." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr " स्क्रीनकास्ट के भंडारण के लिए इस्तेमाल किया जाने वाला फ़ाइल एक्सटेंशन" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "रिकॉर्ड किये गए स्क्रीनकास्ट के लिए फ़ाइल का नाम अद्वितीय वर्तमान दिनांक के आधार पर " +#~ "फ़ाइलनाम होगा और इस विस्तारक का उपयोग करेगा. एक अलग कंटेनर प्रारूप के साथ " +#~ "रिकॉर्डिंग करने के दौरान बदला जाना चाहिए." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "शीर्षक-पट्टी में बटनों का विन्यास" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "यह कुँजी org.gnome.desktop.wm.preferences में कुँजी को अधिरोहित करता है जब गनोम " +#~ "शेल को चला रहा हो." + +#~ msgid "Extension" +#~ msgstr "एक्सटेंशन" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "उपर्युक्त कोंबोबॉक्स के उपयोग को विन्यस्त करने के लिए किसी विस्तार को चुनें." + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "सत्र…" + +#~ msgid "Power" +#~ msgstr "पावर" + +#~ msgid "Restart" +#~ msgstr "फिर आरंभ करें" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t से स्क्रीनकास्ट" + +#~| msgid "Sent on %A, %B %d" +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~| msgid "Sent on %A, %B %d" +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "इन अनुप्रयोगों से बाहर निकलने के लिए और तंत्र से लॉग आउट होने के लिए लॉग आउट पर क्लिक " +#~ "करें." + +#~ msgid "Logging out of the system." +#~ msgstr "तंत्र से लॉगिंग आउट." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "इन अनुप्रयोगों से बाहर निकलने या तंत्र की बिजली बंद करने के लिए बंद करें पर क्लिक करें." + +#~ msgid "Powering off the system." +#~ msgstr "तंत्र बंद किया जा रहा है." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "इन अनुप्रयोगों से बाहर निकलने और तंत्र को फिर चालू करने के लिए फिर आरंभ करें क्लिक करें." + +#~ msgid "Restarting the system." +#~ msgstr "तंत्र फिर आरंभ कर रहा है" + +#~ msgid "Universal Access Settings" +#~ msgstr "सार्वभौमिक पहुँच सेटिंग" + +#~ msgid "Visibility" +#~ msgstr "दृश्यता" + +#~| msgid "Send Files to Device..." +#~ msgid "Send Files to Device…" +#~ msgstr "युक्ति में फ़ाइल भेजें…" + +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "कोई नयी युक्ति सेटअप करें…" + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "फाइलें भेजें…" + +#~ msgid "Keyboard Settings" +#~ msgstr "कुंजीपट सेंटिग्स" + +#~ msgid "Mouse Settings" +#~ msgstr "माउस सेटिंग" + +#~ msgid "Sound Settings" +#~ msgstr "ध्वनि सेटिंग्स" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s से सत्यापन आग्रह" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "युक्ति %s सेवा '%s' में पहुँच रखती है" + +#~ msgid "Always grant access" +#~ msgstr "हमेशा पहुँच दें" + +#~ msgid "Grant this time only" +#~ msgstr "केवल इस समय अनुमति दें" + +#~ msgid "Reject" +#~ msgstr "अस्वीकारें" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s के लिए युग्मन पुष्टि" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "युक्ति %s इस कंप्यूटर के साथ जोड़ा बनाना चाहती है" + +#~ msgid "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgstr "कृपया पुष्टि करें कि क्या पिन '%06d' युक्ति पर स्थिति किसी के साथ मेल खाता है." + +#~ msgid "Matches" +#~ msgstr "मिलान" + +#~ msgid "Does not match" +#~ msgstr "मेल नहीं खाता है" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s के लिए जोड़ा आग्रह" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "कृपया युक्ति पर वर्णित पिन दर्ज करें." + +#~ msgid "OK" +#~ msgstr "ठीक" + +#~| msgid "Region and Language Settings" +#~ msgid "Region & Language Settings" +#~ msgstr "क्षेत्र और भाषा सेटिंग्स" + +#~ msgid "Volume, network, battery" +#~ msgstr "आयतन, संजाल, बैटरी" + +#~ msgid "disabled" +#~ msgstr "अक्षम" + +#~ msgid "cable unplugged" +#~ msgstr "केबल प्लग अलग किया गया" + +#~ msgid "unavailable" +#~ msgstr "अनुपलब्ध" + +#~ msgid "More…" +#~ msgstr "अधिक…" + +#~ msgid "Wired" +#~ msgstr "तारसहित" + +#~ msgid "Auto Ethernet" +#~ msgstr "स्वतः इथरनेट" + +#~ msgid "Auto broadband" +#~ msgstr "स्वचालित ब्रॉडबैंड" + +#~ msgid "Auto dial-up" +#~ msgstr "स्वतः डायलअप" + +#~ msgid "Auto %s" +#~ msgstr "स्वतः %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "स्वतः ब्लूटूथ" + +#~ msgid "Auto wireless" +#~ msgstr "स्वतः बेतार" + +#~ msgid "Wi-Fi" +#~ msgstr "वाई-फाई" + +#~ msgid "Networking is disabled" +#~ msgstr "संजालन निष्क्रिय" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d घंटा शेष" +#~ msgstr[1] "%d घंटा शेष" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s शेष" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "घंटा" +#~ msgstr[1] "घंटा" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "मिनट" +#~ msgstr[1] "मिनट" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d मिनट शेष" +#~ msgstr[1] "%d मिनट शेष" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~| msgid "AC adapter" +#~ msgid "AC Adapter" +#~ msgstr "एसी एडॉप्टर" + +#~| msgid "Laptop battery" +#~ msgid "Laptop Battery" +#~ msgstr "लैपटॉप बैटरी" + +#~ msgid "Monitor" +#~ msgstr "मॉनीटर" + +#~ msgid "Mouse" +#~ msgstr "माउस" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~| msgid "Cell phone" +#~ msgid "Cell Phone" +#~ msgstr "सेल फोन" + +#~| msgid "Media player" +#~ msgid "Media Player" +#~ msgstr "मीडिया-प्लेयर" + +#~ msgid "Tablet" +#~ msgstr "टैब्लेट" + +#~ msgid "Computer" +#~ msgstr "कम्प्यूटर" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "अज्ञात" + +#~ msgid "Available" +#~ msgstr "उपलब्ध" + +#~ msgid "Busy" +#~ msgstr "व्यस्त" + +#~ msgid "Invisible" +#~ msgstr "अदृश्य" + +#~ msgid "Away" +#~ msgstr "दूर" + +#~ msgid "Idle" +#~ msgstr "निष्क्रिय" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "आपकी चैट स्थिति व्यस्त नियत की जाएगी" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "चैट संदेश सहित अधिसूचना अब निष्क्रिय है. आपकी ऑनलाइन स्थिति दूसरे को यह जानने के लिए " +#~ "समायोजित की जाएगी जिसे आप अपने संदेश में नहीं देख सकते हैं." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "बंद करना बिना सहेजे काम के नष्ट होने का कारण बन सकता है." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "माफ़ करें, आपके लिए आज कोई दृष्टि नहीं:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s ओरेकल कहती है" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "साइन इन" + +#~ msgid "APPLICATIONS" +#~ msgstr "अनुप्रयोग" + +#~ msgid "SETTINGS" +#~ msgstr "सेटिंग्स" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Subscription request" +#~ msgstr "सदस्यता आग्रह" + +#~ msgid "Connection error" +#~ msgstr "कनेक्शन त्रुटि" + +#~ msgid "Sent at %X on %A" +#~ msgstr "%X पर प्रेषित %A पर" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "%A पर प्रेषित, %B %d, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "%s में कनेक्शन असफल" + +#~ msgid "Reconnect" +#~ msgstr "फिर कनेक्ट करें" + +#~ msgid "tray" +#~ msgstr "तश्तरी" + +#~ msgid "Browse Files..." +#~ msgstr "फ़ाइल ब्राउज़ करें..." + +#~ msgid "Error browsing device" +#~ msgstr "युक्ति की ब्राउज़िंग में त्रुटि" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "निवेदित युक्ति को ब्राउज़ नहीं किया जा सकता है, त्रुटि है '%s'" + +#~ msgid "More..." +#~ msgstr "अधिक..." + +#~ msgid "Wireless" +#~ msgstr "बेतार" + +#~ msgid "VPN Connections" +#~ msgstr "वीपीएन कनेक्शन्स" + +#~ msgid "System Settings" +#~ msgstr "तंत्र विन्यास" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "आपकी पसंदीदा ईस्टर एग" + +#~ msgid "United Kingdom" +#~ msgstr "यूनाइटेड किंगडम" + +#~ msgid "Default" +#~ msgstr "तयशुदा" + +#, fuzzy +#~| msgid "If true, display seconds in time." +#~ msgid "If true, display onscreen keyboard." +#~ msgstr "अगर सत्य है तो समय में सेकण्ड भी दर्शाएगा." + +#~ msgid "If true, display seconds in time." +#~ msgstr "अगर सत्य है तो समय में सेकण्ड भी दर्शाएगा." + +#~ msgid "Show date in clock" +#~ msgstr "घड़ी में तिथि दिखाएँ" + +#~ msgid "Show time with seconds" +#~ msgstr "समय सेकण्ड्स के साथ दिखाएँ" + +#~ msgid "CONTACTS" +#~ msgstr "संपर्क" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "RECENT ITEMS" +#~ msgstr "हालिया मद" + +#~| msgid "Password:" +#~ msgid "Show password" +#~ msgstr "कूटशब्द दिखाएँ" + +#~ msgid "Retry" +#~ msgstr "फिर कोशिश करें" + +#~ msgid "Connect to..." +#~ msgstr "इससे कनेक्ट करें..." + +#~| msgid "Connection" +#~ msgid "Connectivity lost" +#~ msgstr "कनेक्टिविटी गुम" + +#~ msgid "%s is online." +#~ msgstr "%s ऑनलाइन है." + +#~ msgid "%s is offline." +#~ msgstr "%s ऑफ़लाइन है." + +#~ msgid "%s is away." +#~ msgstr "%s दूर है." + +#~ msgid "%s is busy." +#~ msgstr "%s व्यस्त है." + +#~ msgid "Hidden" +#~ msgstr "छुपा हुआ" + +#~ msgid "Power Off..." +#~ msgstr "पावर ऑफ़..." + +#~| msgid "My Account" +#~ msgid "Online Accounts" +#~ msgstr "ऑनलाइन खाता" + +#~ msgid "Lock Screen" +#~ msgstr "स्क्रीन पर ताला लगाएँ" + +#~ msgid "Log Out..." +#~ msgstr "लॉग आउट..." + +#~ msgid "Home Folder" +#~ msgstr "घर फ़ोल्डर" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Less than a minute ago" +#~ msgstr "एक मिनट से कम पहले" + +#~ msgid "%d minute ago" +#~ msgid_plural "%d minutes ago" +#~ msgstr[0] "%d मिनट पहले" +#~ msgstr[1] "%d मिनट पहले" + +#~ msgid "%d hour ago" +#~ msgid_plural "%d hours ago" +#~ msgstr[0] "%d घंटा पहले" +#~ msgstr[1] "%d घंटा पहले" + +#~ msgid "%d day ago" +#~ msgid_plural "%d days ago" +#~ msgstr[0] "%d दिन पहले" +#~ msgstr[1] "%d दिन पहले" diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..1ab23dd --- /dev/null +++ b/po/hr.po @@ -0,0 +1,2361 @@ +# Croatian translation for gnome-shell. +# Copyright (C) 2016 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-24 17:37+0000\n" +"PO-Revision-Date: 2019-03-26 12:33+0100\n" +"Last-Translator: gogo \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.0.6\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sustav" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Prikaži popis poruka obavijesti" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokusiraj aktivnu obavijest" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Prikaži pregled" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Prikaži sve aplikacije" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Otvori izbornik aplikacija" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Proširenja ljuske" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Podesi proširenja GNOME ljuske" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME ljuska" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Pokretanje upravljanja prozorima i aplikacijama" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Omogući unutrašnji alat koristan za razvijatelje i testiratelje koristeći " +"Alt-F2 dijalog" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Dopusti pristup alat nadziranja i unutrašnjeg otklanjanja grešaka koristeći " +"Alt-F2 dijalog." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID-ovi proširenja za omogućavanje" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Proširenja GNOME ljuske imaju UUID svojstvo; taj ključ prikazuje proširenje " +"koje treba učitati. Svako proširenje koje se želi učitati treba biti na tom " +"popisu. Možete isto tako manipulirati tim popisom sa EnableExtension i " +"DisableExtension D-Bus načinima na org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Onemogući korisnikova proširenja" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Onemogući sva proširenja koja je korisnik omogućio bez utjecaja na postavku " +"“omogućeno-proširenje”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Onemogućuje provjeru kompatibilnosti inačice proširenja" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME ljuska će samo učitati proširenja koje podržavaju trenutno pokrenutu " +"inačicu. Omogućavanje te mogućnosti će onemogućiti tu provjeru i pokušati " +"učitati sva proširenja bez obzira koju inačicu podržavaju." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Popis ID-ova datoteka radne površine omiljenih aplikacija" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Aplikacije koje odgovaraju tim identifikatorima će biti prikazane u području " +"omiljenih." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Prikaz odabira aplikacije" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Sadržaj trenutno odabranog prikaza u odabiru aplikacija." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Povijest naredbi (Alt-F2) dijalog" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Povijest dijaloga naprednih kontrola i upravljanja" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Uvijek prikaži ”Odjava” stavku u korisničkom izborniku." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Ova tipka zaobilazi automatsko sakrivanje ”Odjava” stavke izbornika u " +"situaciji jednog-korisnika, jedne-sesije." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Treba li zapamtiti lozinku za montiranje šifriranih ili udaljenih datotečnih " +"sustava" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Ova ljuska će zatražiti lozinku kada šifrirani uređaj ili udaljeni datotečni " +"sustav je montiran. Ako se lozinka može spremiti za buduću upotrebu ”Zapamti " +"lozinku” mogućnost odabira će biti prisutna. Ta mogućnost postavlja zadano " +"stanje odabira." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Treba li zadani Bluetooth adapter postaviti uređaj s kojim je pridružen" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Ova ljuska će samo prikazati Bluetooth izbornik ako je Bluetooth adapter " +"uključen, ili kao su dostupni uređaji pridruženi sa zadanim adapterom. Ovo " +"će biti poništeno ako zadani adapter nije imao nikada pridruženog uređaja." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Omogući API samoispitivanja" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Omogućuje D-Bus API koji omogućuje samoispitivanje stanja aplikacije ljuske." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Prečac tipkovnice za otvaranje izbornika aplikacije" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Prečac tipkovnice za otvaranje izbornika aplikacije." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Prečac tipkovnice za otvaranje prikaza \"Prikaži aplikacije\"" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Prečac tipkovnice za otvaranje prikaza \"Prikaži aplikacije\" u pogledu " +"Aktivnosti." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Prečac tipkovnice za otvaranje pogleda" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Prečac tipkovnice za otvaranje pogleda Aktivnosti." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Prečac tipkovnice za uključivanje/isključivanje vidljivosti popisa obavijesti" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Prečac tipkovnice za uključivanje/isključivanje vidljivosti popisa " +"obavijesti." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Prečac tipkovnice za fokusiranje aktivne obavijesti" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Prečac tipkovnice za fokusiranje aktivne obavijesti." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Prečac tipkovnice za pauziranje i nastavljanje svih pokrenutih duplikata, u " +"svrhu otklanjanja grešaka" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Prebaci na aplikaciju 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Prebaci na aplikaciju 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Prebaci na aplikaciju 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Prebaci na aplikaciju 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Prebaci na aplikaciju 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Prebaci na aplikaciju 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Prebaci na aplikaciju 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Prebaci na aplikaciju 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Prebaci na aplikaciju 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Koju tipkovnicu koristiti" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Vrsta tipkovnice koja se koristi." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Ograniči premještanje na trenutni radni prostor." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ako je odabrano, samo aplikacije koje imaju prozor na trenutnom radnom " +"prostoru su prikazane na prebacivaču. U suprotnom, sve aplikacije su " +"uključene." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Način ikone aplikacije." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Podešava kako su prozori prikazani u prebacivaču. Valjane mogućnosti su " +"”thumbnail-only” (prikazuje minijaturu prozora), ”app-icon-only” (prikazuje " +"samo ikonu aplikacije) ili ”both”." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ako je odabrano, samo prozori s trenutnog radnog prostora su prikazani u " +"prebacivaču, U suprotnom, svi prozori su uključeni." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Pričvrsti prozore dijaloga na nadređeni prozor" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ova vrijednost zaobilazi org.gnome.mutter kada je pokrenuta GNOME ljuska." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Omogući rubno popločavanje pri ispuštanju prozora na rubovima zaslona" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Radni prostori su upravljani promjenjivo" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Radni prostori samo na glavnom zaslonu" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Odgodi promjenu fokusa u načinu rada s mišem dok se pokazivač ne prestane " +"pomicati" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Mrežna prijava" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Nešto je pošlo po krivu" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Nažalost došlo je do problema: postavke za ovo proširenje se ne mogu " +"prikazati. Preporučljivo je da problem prijavite autoru proširenja." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Tehničke pojedinosti" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Kopiraj grešku" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Naslovnica" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Posjetite naslovnicu proširenja" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Nema instaliranih proširenja" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Proširenja se mogu instalirati putem Softvera ili extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Pregledaj u Softveru" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Odustani" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Sljedeće" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Otključaj" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Prijava" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Odaberi sesiju" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Niste na popisu?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(npr., korisnik ili %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Korisničko ime: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Prozor prijave" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Greška ovjere" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(ili pomakni prst)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Isključivanje" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "isključi;isključivanje;ponovno pokreni;ponovno pokretanje" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Zaključavanje zaslona" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "zaključavanje zaslona" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Odjava" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "odjava:odjavljivanje" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Suspenzija" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspendiraj;spavaj" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Zamijeni korisnika" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "zamjena korisnika" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Zaključavanje orjentacije" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "zaključavanje orjentacije" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Naredba nije pronađena" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Nemoguća obrada naredbe:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Izvršavanje '%s' neuspjelo:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Upravo sada" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Prije %d minute" +msgstr[1] "Prije %d minute" +msgstr[2] "Prije %d minuta" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Prije %d sata" +msgstr[1] "Prije %d sata" +msgstr[2] "Prije %d sati" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Jučer" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Prije %d dana" +msgstr[1] "Prije %d dana" +msgstr[2] "Prije %d dana" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Prije %d tjedna" +msgstr[1] "Prije %d tjedna" +msgstr[2] "Prije %d tjedana" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Prije %d mjeseca" +msgstr[1] "Prije %d mjeseca" +msgstr[2] "Prije %d mjeseci" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Prije %d godine" +msgstr[1] "Prije %d godine" +msgstr[2] "Prije %d godina" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Jučer, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d. %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d. %B, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Jučer, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d. %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d. %B %Y, %H∶%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Prijava pristupne točke" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Vaše povezivanje s ovom prijavom pristupne točke nije sigurno. Lozinke i " +"ostale informacije koje ste upisali na ovoj stranici mogu vidjeti ljudi u " +"vašoj blizini." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Zabrani pristup" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Dopusti pristup" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Najčešće korištene aplikacije će se pojaviti ovdje" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Najčešće" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Sve" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Novi prozor" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Pokreni pomoću namjenske grafičke kartice" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Ukloni iz omiljenih" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Dodaj u omiljene" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Prikaži pojedinosti" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s je dodan u omiljene." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s je uklonjen iz omiljenih." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Odaberi zvučni uređaj" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Postavke zvuka" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Slušalice" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Slušalice s mikrofonom" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Promijeni pozadinu…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Postavke prikaza" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Postavke" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "N" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "U" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "Č" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Prijašnji mjesec" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Sljedeći mjesec" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Tjedan %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Cijeli dan" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d. %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d. %B, %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Nema obavijesti" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Nema događaja" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Obriši" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” ne reagira." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Možda ste odabrali kratko čekanje do nastavka izvođenja ili prisile " +"aplikacije da se u potpunosti zatvori." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Prisilno zatvori" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Čekaj" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Vanjski uređaj povezan" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Vanjski uređaj odspojen" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Otvori s(a) %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Lozinka:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Pokušaj ponovno:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Alternativno se možete povezati pritiskom na “WPS” tipku vašeg usmjernika." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Povezivanje" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Lozinka: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Ključ: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Lozinka privatnog ključa: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identitet: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Usluga: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Potrebna je ovjera za bežičnu mrežu" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Lozinka ili ključevi šifriranja su potrebni za pristup bežičnoj mreži “%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Wired 802.1X ovjera" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Naziv mreže: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL ovjera" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN kôd je potreban" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN kôd je potreban za uređaj mobilnog interneta" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Lozinka mreže mobilnog interneta" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Potrebna je lozinka za povezivanje s “%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Mrežni upravitelj" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Potrebna je ovjera" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Ovjeri" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Nažalost, to ne radi. Pokušajte ponovno." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s je poznat kao %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Prozori" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Prikaži aplikacije" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Ploča" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-e %b, %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Dodaj satove iz svijeta…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Svjetski satovi" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Vrijeme" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Odaberi lokaciju…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Pretraživanje…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Posjetite za opširnije vremenske informacije" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Vremenske informacije su trenutno nedostupne" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Odjavi se %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Odjava" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s će se automatski odjaviti za %d sekundu." +msgstr[1] "%s će se automatski odjaviti za %d sekunde." +msgstr[2] "%s će se automatski odjaviti za %d sekundi." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Odjavit ćete se automatski za %d sekundu." +msgstr[1] "Odjavit ćete se automatski za %d sekunde." +msgstr[2] "Odjavit ćete se automatski za %d sekundi." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Odjava" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Isključivanje" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instaliraj nadopune i isključi" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sustav će se automatski isključiti za %d sekundu." +msgstr[1] "Sustav će se automatski isključiti za %d sekunde." +msgstr[2] "Sustav će se automatski isključiti za %d sekundi." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instaliraj dostupne nadopune softvera" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Ponovno pokreni" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Isključi" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Ponovno pokreni" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sustav će se automatski ponovno pokrenuti za %d sekundu." +msgstr[1] "Sustav će se automatski ponovno pokrenuti za %d sekunde." +msgstr[2] "Sustav će se automatski ponovno pokrenuti za %d sekundi." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Ponovno pokreni i instaliraj nadopune" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sustav će se automatski ponovno pokrenuti i instalirati nadopune za %d " +"sekundu." +msgstr[1] "" +"Sustav će se automatski ponovno pokrenuti i instalirati nadopune za %d " +"sekunde." +msgstr[2] "" +"Sustav će se automatski ponovno pokrenuti i instalirati nadopune za %d " +"sekundi." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Ponovno pokreni i instaliraj" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instaliraj i isključi" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Isključi nakon što se nadopune instaliraju" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Ponovno pokreni i instaliraj nadogradnju" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s će se instalirati nakon ponovnog pokretanja. Instalacija nadogradnji " +"može potrajati duže vrijeme: pobrinite se da ste spremili svoj rad i " +"računalo je priključeno na izvor napajanja." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Koristi se energija baterije: računalo priključite na izvor napajanja prije " +"instalacije nadopuna." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Neke aplikacije su zauzete ili imaju nespremljeni rad." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Drugi korisnici su prijavljeni." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (udaljeno)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konzola)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Instaliraj" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Preuzmi i instaliraj “%s” sa extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s želi spriječiti prečac" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplikacija želi spriječiti prečac" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Možete obnoviti prečac pritiskom na %s." + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "Spriječi" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "Dopusti" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Spore tipke uključene" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Spore tipke isključene" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Držali ste pritisnutu tipku Shift 8 sekundi. To je prečac za značajku sporih " +"tipka, koja utječe na način rada vaše tipkovnice." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Pričvrstive tipke uključene" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Pričvrstive tipke isključene" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Upravo ste pritisnuli tipku Shift 5 puta uzastopno. To je prečac za značajku " +"pričvrstivih tipka, koja utječe na način rada vaše tipkovnice." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Upravo ste pritisnuli dvije tipke odjednom, ili ste pritisnuli tipku Shift 5 " +"puta uzastopno. To isključuje značajku pričvrstivih tipka, koja utječe na " +"način rada vaše tipkovnice." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Ostavi" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Uključi" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Isključi" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Ukloni" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "Postavke jezika i regije" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Nema instaliranih proširenja" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nije dao ni jednu grešku." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Sakrij greške" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Prikaži greške" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Omogućeno" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Onemogućen" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Greška" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Zastarjelo" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Preuzimanje" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Pogledaj izvor" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Web stranica" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Informacije sustava" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Nepoznat izvođač" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Nepoznat naslov" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Glasnoća zvuka" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Poništi" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Pregled" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Upiši za pretragu…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Novi prečac…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Određeno aplikacijom" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Prikaži zaslonsku pomoć" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Prebaci zaslon" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Pošalji pritisak tipke" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Završeno" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Uredi…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nedodjeljeno" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Pritisni tipku za podešavanje" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Pritisni Esc za prekidanje" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Pritisni bilo koju tipku za prekidanje" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Zatvori" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Aktivnosti" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sustav" + +#: js/ui/panel.js:867 +msgid "Top Bar" +msgstr "Gornja traka" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Upiši naredbu" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Zatvori" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Ponovno pokretanje nije dostupno na Waylandu" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Ponovno pokretanje…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nova poruka" +msgstr[1] "%d nove poruke" +msgstr[2] "%d novih poruka" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nova obavijest" +msgstr[1] "%d nove obavijesti" +msgstr[2] "%d novih obavijesti" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:271 +msgid "Lock" +msgstr "Zaključaj" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME treba zaključati zaslon" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "Nemoguće zaključavanje" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "Zaključavanje je blokirala apliakcija" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Pretraživanje…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Nema rezultata." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "Još %d" +msgstr[1] "Još %d" +msgstr[2] "Još %d" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopiraj" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Zalijepi" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Prikaži tekst" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Sakrij tekst" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Lozinka" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Zapamti lozinku" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Pristupačnost" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Uvećano" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Čitač zaslona" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Zaslonska tipkovnica" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Vizualna upozorenja" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Ljepljive tipke" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Spore tipke" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Odbijanje tipki" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Tipke miša" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Visok kontrast" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Velik tekst" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth postavke" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d povezan" +msgstr[1] "%d povezana" +msgstr[2] "%d povezanih" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Isključeno" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Uključeno" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Svjetlina" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Tipkovnica" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Prikaži raspored tipkovnice" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Lokacija omogućena" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Onemogući" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Postavke privatnost" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Lokacija se već koristi" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Lokacija onemogućena" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Omogući" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Dopustite %s pristup vašoj lokaciji?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Pristup lokaciji može se promijeniti u svako vrijeme iz postavka privatnosti." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s isključena" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s povezana" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s neupravljana" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s prekidanje povezivanja" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "%s povezivanje" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s zahtijeva ovjeru" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Nedostaje firmver za %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nedostupna" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s neuspješno povezivanje" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Postavke žične mreže" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Mobilni internet" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s hardverski onemogućena" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s onemogućeno" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Povežite se na internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Zrakoplovni način rada je omogućen" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Bežična mreža je onemogućena u zrakoplovnom načinu rada." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Isključi zrakoplovni način rada" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Bežična mreža isključena" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Bežična mreža se mora uključiti kako bi se povezala s internetom." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Uključi bežičnu mrežu" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Bežične mreže" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Odaberi mrežu" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Nema mreža" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Koristi hardverski prekidač za isključivanje" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Odaberi mrežu" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Postavke bežične mreže" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s pristupna točka aktivna" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nije povezana" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "povezivanje…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "potrebna je ovjera" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "neuspješno povezivanje" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "VPN postavke" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN isključen" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Mrežne postavke" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s žično povezivanje" +msgstr[1] "%s žična povezivanja" +msgstr[2] "%s žičnih povezivanja" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s bežično povezivanje" +msgstr[1] "%s bežična povezivanja" +msgstr[2] "%s bežičnih povezivanja" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemsko povezivanje" +msgstr[1] "%s modemska povezivanja" +msgstr[2] "%s modemskih povezivanja" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "Neuspješno povezivanje" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "Aktiviranje mrežnog povezivanja je neuspjelo" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Noćno svjetlo onemogućeno" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Noćno svjetlo uključeno" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Nastavi" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Onemogući do sutra" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Postavke energije" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Potpuno napunjeno" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Ne puni se" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Procjenjivanje…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d preostalo (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d preostalo do napunjenosti (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Zaslon se trenutno dijeli" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Isključi" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Zrakoplovni način rada uključen" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Zamijeni korisnika" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Odjava" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Postavke računa" + +#: js/ui/status/system.js:256 +msgid "Orientation Lock" +msgstr "Zaključavanje orjentacije" + +#: js/ui/status/system.js:282 +msgid "Suspend" +msgstr "Suspendiraj" + +#: js/ui/status/system.js:292 +msgid "Power Off" +msgstr "Isključivanje" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Nepoznati Thunderbolt uređaj" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Otkriven je novi uređaj dok ste bili odsutni. Odspojite i ponovno spojite " +"uređaj kako bi ga mogli koristiti." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Neovlašteni Thunderbolt uređaj" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Novi uređaj je otkriven i mora biti ovjeren od strane administratora." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Greška Thunderbolt odobravanja" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nemoguće odobravanje Thunderbolt uređaja: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Glasnoća zvuka promijenjena" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Zrcaljenje" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Spoji zaslone" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Samo vanjski" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Samo ugrađeni" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Prijavi se kao drugi korisnik" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Otključaj prozor" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplikacije" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Pretraži" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” je spreman" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Želite li zadržati ove postavke zaslona?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Vrati postavke" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Zadrži promjene" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Promjene postavka će se vratiti za %d sekundu" +msgstr[1] "Promjene postavka će se vratiti za %d sekunde" +msgstr[2] "Promjene postavka će se vratiti za %d sekundi" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Smanji" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Prikaži u prozoru" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Uvećaj" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Pomakni" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Promjena veličine" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Premjesti naslovnu traku na zaslom" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Uvijek na vrhu" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Uvijek na vidljivom radnom prostoru" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Premjesti na lijevi radni prostor" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Premjesti na desni radni prostor" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Premjesti na gornji radni prostor" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Premjesti na donji radni prostor" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Premjesti na gornji zaslon" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Premjesti na donji zaslon" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Premjesti na lijevi zaslon" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Premjesti na desni zaslon" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution kalendar" + +#: src/main.c:408 +msgid "Print version" +msgstr "Ispiši inačicu" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Način koji koristi GDM za zaslon prijave" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Koristi određen način, npr. \"gdm\" za zaslon prijave" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Popis mogućih načina" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "Nepoznat" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Neuspješno pokretanje “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Lozinke se ne podudaraju." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Lozinka ne može biti prazna" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Dijalog ovjere je prekinut od strane korisnika" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u izlaz" +msgstr[1] "%u izlaza" +msgstr[2] "%u izlaza" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ulaz" +msgstr[1] "%u ulaza" +msgstr[2] "%u ulaza" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Zvukovi sustava" + +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Dogodila se greška učitavanja dijaloga osobitosti za %s:" + +#~ msgid "%s all day." +#~ msgstr "%s cijeli dan." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, zatim %s kasnije." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, zatim %s, praćena s %s kasnije." + +#~ msgid "Feels like %s." +#~ msgstr "Kao da je %s." + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Isključivanje" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Odjava" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Zamjena korisnika" + +#~ msgid "Hide tray" +#~ msgstr "Sakrij traku stanja" + +#~ msgid "Status Icons" +#~ msgstr "Ikona stanja" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Osobitosti proširenja GNOME ljuske" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Web ovjera je preusmjerena" + +#~ msgid "Events" +#~ msgstr "Događaji" + +#~ msgid "Notifications" +#~ msgstr "Obavijesti" + +#~ msgid "Clear section" +#~ msgstr "Obriši odjeljak" + +#~ msgid "Media" +#~ msgstr "Medij" + +#~ msgid "Not In Use" +#~ msgstr "Ne koristi se" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..829f768 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,2289 @@ +# Hungarian translation for gnome-shell. +# Copyright 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# +# Gabor Kelemen , 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016. +# Lukács Bence , 2012. +# Balázs Meskó , 2014. +# Balázs Úr , 2012, 2014, 2015, 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-03 10:16+0000\n" +"PO-Revision-Date: 2019-02-05 21:05+0100\n" +"Last-Translator: Balázs Úr \n" +"Language-Team: Hungarian \n" +"Language: hu\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: Lokalize 1.2\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Rendszer" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Az értesítési lista megjelenítése" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Az aktív értesítés fókuszba" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Áttekintés megjelenítése" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Minden alkalmazás megjelenítése" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Az alkalmazásmenü megnyitása" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell kiterjesztések" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Shell kiterjesztések beállítása" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Ablakkezelés és alkalmazásindítás" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Fejlesztők és tesztelők számára hasznos belső eszközök engedélyezése az Alt-" +"F2 ablakból" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Belső hibakereső és megfigyelő eszközök elérésének engedélyezése az Alt-F2 " +"ablak használatával." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Engedélyezendő kiterjesztések UUID-jei" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"A GNOME Shell kiterjesztések rendelkeznek egy UUID tulajdonsággal; ez a " +"kulcs felsorolja a betöltendő kiterjesztéseket. Minden betöltendő " +"kiterjesztésnek szerepelnie kell a listában. A listát az org.gnome.Shell " +"EnableExtension és DisableExtension D-Bus metódusaival is manipulálhatja." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Felhasználói kiterjesztések letiltása" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Minden olyan kiterjesztés letiltása, amelyet a felhasználó az „enabled-" +"extension” beállítást nem érintve engedélyezett." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Letiltja a kiterjesztés-verzió kompatibilitás ellenőrzését" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"A GNOME Shell csak azon kiterjesztéseket tölti be, amelyek állítják, hogy " +"támogatják az éppen futó verziót. Ezt a lehetőséget bekapcsolva ez az " +"ellenőrzés kikapcsolható, és az összes kiterjesztés betöltésére kísérletet " +"tesz, függetlenül attól, hogy melyik verziót támogatják." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "A kedvenc alkalmazások asztalifájl-azonosítóinak listája" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Az itt felsorolt azonosítóknak megfelelő alkalmazások jelennek meg a " +"kedvencek területen." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Alkalmazás-választó nézet" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Az aktuálisan kiválasztott nézet indexe az alkalmazás-választóban." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "A parancsablak (Alt-F2) előzményei" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "A távcső ablak előzményei" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Mindig jelenjen meg a „Kijelentkezés” menüelem a felhasználói menüben." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Ez a kulcs felülbírálja a „Kijelentkezés” menüelem automatikus elrejtését " +"egyfelhasználós, egyedüli munkamenet esetén." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Megjegyezze-e a jelszót a titkosított vagy távoli fájlrendszerek csatolásához" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"A shell jelszót fog kérni titkosított eszköz vagy távoli fájlrendszer " +"csatolásakor. Ha a jelszó elmenthető későbbi használatra, akkor megjelenik " +"egy „Jelszó megjegyzése” jelölőmező. Ez a kulcs a jelölőnégyzet " +"alapértelmezett állapotát állítja be." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Az alapértelmezett Bluetooth adapterhez voltak-e hozzárendelt eszközök" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"A shell csak akkor fogja megjelenítem a Bluetooth menüelemet, ha az adapter " +"be van kapcsolva, vagy ha voltak az alapértelmezett adapterhez rendelt " +"eszközök. Ez visszaállításra kerül, ha az alapértelmezett adapter nem " +"látható, vagy nincsenek hozzárendelt eszközök." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Önelemző API engedélyezése" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Egy olyan D-Bus API-t engedélyez, amely lehetővé teszi a parancsértelmező " +"alkalmazás állapotának önellenőrzését." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Billentyűtársítás az alkalmazásmenü megnyitásához" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Billentyűtársítás az alkalmazásmenü megnyitásához." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Billentyűtársítás az „Alkalmazások megjelenítése” nézet megnyitásához" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Billentyűtársítás a Tevékenységek áttekintés „Alkalmazások megjelenítése” " +"nézetének megnyitásához." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Billentyűtársítás az áttekintés megnyitásához" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Billentyűtársítás a Tevékenységek áttekintés megnyitásához." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Billentyűtársítás az értesítési lista láthatóságának módosításához" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Billentyűtársítás az értesítési lista láthatóságának módosításához." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Billentyűtársítás az aktív értesítés fókuszálásához" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Billentyűtársítás az aktív értesítés fókuszálásához." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Billentyűtársítás, amely minden futó átkötést szüneteltet és folytat " +"hibakeresési célból" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Váltás az 1. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Váltás a 2. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Váltás a 3. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Váltás a 4. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Váltás az 5. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Váltás a 6. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Váltás a 7. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Váltás a 8. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Váltás a 9. alkalmazásra" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "A használandó billentyűzet" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Használandó billentyűzet típusa." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Váltó korlátozása a jelenlegi munkaterületre." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ha igaz, akkor csak azok az alkalmazások lesznek megjelenítve a váltón, " +"amelyek ablakokkal rendelkeznek az aktuális munkaterületen. Egyébként minden " +"alkalmazás fel van véve." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Az alkalmazás ikon mód." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Az ablakok megjelenésének beállítása a váltóban. Lehetséges értékek: " +"„thumbnail-only” (az ablak bélyegképének megjelenítése), „app-icon-only” (az " +"alkalmazás ikonjának megjelenítése) vagy „both” (mindkettő)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ha igaz, akkor csak az aktuális munkaterületről származó ablakok lesznek " +"megjelenítve a váltón. Egyébként minden ablak fel lesz véve." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Kizárólagos párbeszédablak csatolása a szülő ablakhoz" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ez a kulcs felülbírálja az org.gnome.mutter helyen lévő kulcsot, amikor a " +"GNOME Shell fut." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Szélek csempézésének engedélyezése ablakok képernyőszélekre ejtésekor" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Munkaterületek dinamikus kezelése" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Munkaterületek csak az elsődleges monitoron" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Fókuszváltozások késleltetése a mutató mozgásának megállásáig egér módban" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Hálózati bejelentkezés" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Valami elromlott" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Nagyon sajnáljuk, de probléma történt: a kiterjesztés beállításait nem lehet " +"megjeleníteni. Azt ajánljuk, hogy jelentse a hibát a kiterjesztés szerzőinek." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Technikai részletek" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Hiba másolása" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Honlap" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "A kiterjesztés honlapjának megtekintése" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Nincsenek kiterjesztések telepítve" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"A kiterjesztések a Szoftverekből vagy az extensions.gnome.org oldalon keresztül telepíthetők." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Tallózás a Szoftverekben" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Mégse" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Következő" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Feloldás" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Bejelentkezés" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Válasszon munkamenetet" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Nincs a listán?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(például: felhasználó vagy %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Felhasználónév: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Bejelentkezési ablak" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Hitelesítési hiba" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(vagy húzza le az ujját)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Kikapcsolás" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "kikapcsolás;leállítás;újraindítás" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Zárolási képernyő" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "képernyő zárolása;képernyő;zárolás" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Kijelentkezés" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "kijelentkezés;kilépés" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Felfüggesztés" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "felfüggesztés;alvás" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Felhasználóváltás" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "felhasználóváltás" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Tájolás zárolása" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "tájolás zárolása;képernyő;tájolás" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "A parancs nem található" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "A parancs nem dolgozható fel:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "„%s” végrehajtása meghiúsult:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Épp most" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d perce" +msgstr[1] "%d perce" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d órája" +msgstr[1] "%d órája" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Tegnap" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d napja" +msgstr[1] "%d napja" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d hete" +msgstr[1] "%d hete" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d hónapja" +msgstr[1] "%d hónapja" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d éve" +msgstr[1] "%d éve" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Tegnap %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%B %-d. %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%Y. %B %-d. %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Tegnap %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%B %-d. %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%Y. %B %-d. %H:%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Hotspot bejelentkezés" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"A kapcsolata ehhez a hotspot bejelentkezéshez nem biztonságos. Az ezen az " +"oldalon megadott jelszavakat és más információkat a közelben lévő emberek is " +"láthatják." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Hozzáférés tiltása" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Hozzáférés megadása" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Itt jelennek meg a gyakran használt alkalmazások" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Gyakori" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Összes" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Új ablak" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Futtatás a dedikált videokártyával" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Eltávolítás a Kedvencek közül" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Hozzáadás a Kedvencekhez" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Részletek megjelenítése" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s felvéve a Kedvencek közé." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s eltávolítva a Kedvencek közül" + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Válasszon hangeszközt" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Hangbeállítások" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Fülhallgatók" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Fejhallgató" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Háttér megváltoztatása…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Kijelző beállításai" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Beállítások" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "H" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "K" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "Sz" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "Cs" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "Sz" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%Y. %OB" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Előző hónap" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Következő hónap" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "%V. hét" + +#. 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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Egész nap" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%B %-d. %A" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%Y. %B %-d. %A" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Nincsenek értesítések" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Nincsenek események" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Törlés" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "„%s” nem válaszol." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Várhat egy kicsit a folytatódására, vagy kikényszerítheti az alkalmazás " +"teljes kilépését." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Erőltetett kilépés" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Várakozás" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Külső meghajtó csatlakoztatva" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Külső meghajtó leválasztva" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Megnyitás ezzel: %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Jelszó:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Írja be újra:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "Alternatívaként kapcsolódhat a „WPS” gomb megnyomásával az eszközön." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Kapcsolódás" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Jelszó: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Kulcs: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Személyes kulcs jelszava: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Személyazonosság: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Szolgáltatás: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "A vezeték nélküli hálózat hitelesítést igényel" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Jelszavak vagy titkosítási kulcsok szükségesek a(z) „%s” vezeték nélküli " +"hálózat eléréséhez." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Vezetékes 802.1X hitelesítés" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Hálózat neve: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL hitelesítés" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN kód szükséges" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN kód szükséges a mobil széles sávú eszközhöz" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mobil széles sávú hálózat jelszava" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Jelszó szükséges a kapcsolódáshoz a következőhöz: „%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Hálózatkezelő" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Hitelesítés szükséges" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Rendszergazda" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Hitelesítés" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Elnézést, ez nem sikerült. Próbálja újra." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s mostantól %s néven ismert" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Ablakok" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Alkalmazások megjelenítése" + +# FIXME - valami jobbat +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%Y. %B %-d." + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%Y. %B %-e. %A" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Világórák hozzáadása…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Világórák" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Időjárás" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Válasszon egy helyet…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Betöltés…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Időjárás-információkért kapcsolódjon az internetre" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Az időjárás-információk jelenleg nem érhetőek el" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s kijelentkeztetése" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Kijelentkezés" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s automatikusan ki fog jelentkezni %d másodperc múlva." +msgstr[1] "%s automatikusan ki fog jelentkezni %d másodperc múlva." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Automatikusan ki fog jelentkezni %d másodperc múlva." +msgstr[1] "Automatikusan ki fog jelentkezni %d másodperc múlva." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Kijelentkezés" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Kikapcsolás" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Frissítések telepítése és kikapcsolás" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "A rendszer automatikusan kikapcsol %d másodperc múlva." +msgstr[1] "A rendszer automatikusan kikapcsol %d másodperc múlva." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Függő szoftverfrissítések telepítése" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Újraindítás" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Kikapcsolás" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Újraindítás" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "A rendszer automatikusan újraindul %d másodperc múlva." +msgstr[1] "A rendszer automatikusan újraindul %d másodperc múlva." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Újraindítás és frissítések telepítése" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"A rendszer %d másodperc múlva automatikusan újraindul és telepíti a " +"frissítéseket." +msgstr[1] "" +"A rendszer %d másodperc múlva automatikusan újraindul és telepíti a " +"frissítéseket." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Újraindítás és telepítés" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Telepítés és kikapcsolás" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Kikapcsolás a frissítések telepítése után" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Újraindítás és frissítések telepítése" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"A(z) %s %s újraindítás után lesz telepítve. A frissítések telepítése " +"eltarthat egy ideig: győződjön meg arról, hogy készített-e biztonsági " +"mentést, valamint a számítógép be van-e dugva." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Akkumulátoros működés: a frissítések telepítése előtt dugja be eszközét a " +"konnektorba." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Egyes alkalmazások elfoglaltak, vagy mentetlen munkát tartalmaznak." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Más felhasználók vannak bejelentkezve." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (távoli)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konzol)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Telepítés" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "" +"Letölti és telepíti a következőt az extensions.gnome.org webhelyről: „%s”?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "A(z) %s meg akarja gátolni a gyorsbillentyűk használatát" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Az alkalmazás meg akarja gátolni a gyorsbillentyűk használatát" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "A(z) %s megnyomásával visszaállíthatja a gyorsbillentyűket." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Tiltás" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Engedélyezés" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Lassú billentyűk be" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Lassú billentyűk ki" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Lenyomva tartotta a Shift billentyűt 8 másodpercig. Ez a Lassú billentyűk " +"szolgáltatás gyorsbillentyűje, ami a billentyűzet működését befolyásolja." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Ragadós billentyűk be" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Ragadós billentyűk ki" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Egymás után ötször nyomta meg a Shift billentyűt. Ez a Ragadós billentyűk " +"szolgáltatás gyorsbillentyűje, ami a billentyűzet viselkedését befolyásolja." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Egyszerre két billentyűt nyomott meg, vagy a Shift billentyűt egymás után " +"ötször. Ez kikapcsolja a Ragadós billentyűk szolgáltatást, ami a " +"billentyűzet viselkedését befolyásolja." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Bekapcsolva hagyás" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Bekapcsolás" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Kikapcsolás" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Kikapcsolva hagyás" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Területi és nyelvi beállítások" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Nincsenek kiterjesztések telepítve" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nem adott hibát." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Hibák elrejtése" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Hibák megjelenítése" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Engedélyezve" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Tiltva" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Hiba" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Elavult" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Letöltés" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Forrás megtekintése" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Weblap" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Rendszerinformációk" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Ismeretlen előadó" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Ismeretlen cím" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Hangerő" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Visszavonás" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Áttekintés" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Gépeljen a kereséshez…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Új gyorsbillentyű…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Alkalmazás által meghatározott" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Súgó megjelenítése" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Kijelzőváltás" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Billentyűleütés hozzárendelése" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Kész" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Szerkesztés…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nincs" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Válasszon egy beállítandó gombot" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Nyomja meg az Esc gombot a kilépéshez" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Nyomjon meg egy gombot a kilépéshez" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Kilépés" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Tevékenységek" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Rendszer" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "Felső sáv" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Adjon meg egy parancsot" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Bezárás" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Az újraindítás nem érhető el Wayland alatt" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Újraindítás…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%B %-d. %A" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d új üzenet" +msgstr[1] "%d új üzenet" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d új értesítés" +msgstr[1] "%d új értesítés" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Zárolás" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "A GNOME-nak zárolnia kell a képernyőt" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Nem lehet zárolni" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "A zárolást egy alkalmazás blokkolta" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Keresés…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Nincs találat." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "még %d további" +msgstr[1] "még %d további" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Másolás" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Beillesztés" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Szöveg megjelenítése" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Szöveg elrejtése" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Jelszó" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Jelszó megjegyzése" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Akadálymentesítés" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Nagyítás" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Képernyőolvasó" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Képernyő-billentyűzet" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Vizuális figyelmeztetések" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Ragadós billentyűk" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Lassú billentyűk" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Billentyűszűrés" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Egérbillentyűk" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Nagy kontraszt" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Nagy szöveg" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth-beállítások" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d kapcsolódva" +msgstr[1] "%d kapcsolódva" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Ki" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Be" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Fényerő" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Billentyűzet" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Billentyűzetkiosztás megjelenítése" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Hely engedélyezve" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Letiltás" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Adatvédelmi beállítások" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Hely használatban" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Hely letiltva" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Engedélyezés" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Elérheti a(z) %s a földrajzi hely adatait?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"A hely hozzáférése bármikor megváltoztatható az adatvédelmi beállításokban." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s ki" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s kapcsolódva" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s felügyeletlen" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s leválasztása" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "%s kapcsolódá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:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s hitelesítést igényel" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Hiányzó firmware ennél: %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nem érhető el" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s kapcsolódás meghiúsult" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Vezetékes beállítások" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Mobil széles sáv beállításai" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s hardver letiltva" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s letiltva" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Kapcsolódás az internetre" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Repülőgép mód be" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "A Wi-Fi ki van kapcsolva repülőgép üzemmódban." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Repülőgép mód ki" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi ki" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "A Wi-Fi-t be kell kapcsolni a hálózatra kapcsolódáshoz." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi bekapcsolása" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi hálózatok" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Válasszon egy hálózatot" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Nincs hálózat" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "A hardveres kapcsolóval kapcsolja ki" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Válasszon hálózatot" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi beállítások" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s hotspot aktív" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nincs kapcsolódva" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "kapcsolódás…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "hitelesítés szükséges" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "a kapcsolódás meghiúsult" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "VPN beállítások" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN ki" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Hálózati beállítások" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s vezetékes kapcsolat" +msgstr[1] "%s vezetékes kapcsolat" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi kapcsolat" +msgstr[1] "%s Wi-Fi kapcsolat" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemes kapcsolat" +msgstr[1] "%s modemes kapcsolat" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "Kapcsolódás meghiúsult" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "A hálózati kapcsolat aktiválása meghiúsult" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Éjszakai fény letiltva" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Éjszakai fény mód" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Folytatás" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Letiltás holnapig" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Energiabeállítások" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Teljesen feltöltve" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Nincs töltés" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Becslés…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d van hátra (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Töltésidő: %d∶%02d (%d%%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Képernyő megosztva" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Kikapcsolás" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Repülőgép mód be" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Felhasználóváltás" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Kijelentkezés" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Fiókbeállítások" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Tájolás zárolása" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Felfüggesztés" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Kikapcsolás" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Ismeretlen thunderbolt eszköz" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Új eszköz lett felismerve, amíg távol volt. Válassza le, és csatlakoztassa " +"újra az eszközt, hogy megkezdhesse a használatát." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Jogosulatlan Thunderbolt eszköz" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Új eszköz lett észlelve, de egy rendszergazdának hitelesítenie szükséges." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt engedélyezési hiba" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nem sikerült a Thunderbolt eszköz engedélyezése: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Hangerő megváltozott" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Tükrözés" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Kijelzők egyesítése" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Csak a külső" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Csak a beépített" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Bejelentkezés másik felhasználóként" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Ablak feloldása" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Alkalmazások" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Oldalsáv" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "„%s” kész" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Meg szeretné tartani ezeket a kijelzőbeállításokat?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Beállítások visszavonása" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Módosítások megtartása" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "A beállítások módosításai %d másodperc múlva visszavonásra kerülnek" +msgstr[1] "A beállítások módosításai %d másodperc múlva visszavonásra kerülnek" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimalizálás" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Eredeti méret" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximalizálás" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Áthelyezés" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Átméretezés" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Címsor mozgatása a képernyőre" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Mindig felül" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Mindig a látható munkaterületen" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Áthelyezés a bal oldali munkaterületre" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Áthelyezés a jobb oldali munkaterületre" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Áthelyezés a felső munkaterületre" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Áthelyezés az alsó munkaterületre" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Áthelyezés a felső kijelzőre" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Áthelyezés az alsó kijelzőre" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Áthelyezés a bal oldali kijelzőre" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Áthelyezés a jobb oldali kijelzőre" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution naptár" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Verzió kiírása" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "A GDM által a bejelentkezési képernyőhöz használt mód" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "" +"Használjon egy adott módot, például a „gdm”-et a bejelentkező képernyőn" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Lehetséges módok listázása" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Ismeretlen" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "„%s” indítása meghiúsult" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "A jelszavak nem egyeznek." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "A jelszó nem lehet üres" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "A hitelesítési ablakot a felhasználó bezárta" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u kimenet" +msgstr[1] "%u kimenet" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u bemenet" +msgstr[1] "%u bemenet" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Rendszerhangok" diff --git a/po/ia.po b/po/ia.po new file mode 100644 index 0000000..7007493 --- /dev/null +++ b/po/ia.po @@ -0,0 +1,1950 @@ +# Interlingua translations for gnome-shell package. +# Copyright (C) 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Nik Kalach , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-04-23 19:57+0000\n" +"PO-Revision-Date: 2013-04-23 08:00+0400\n" +"Last-Translator: Nik Kalach \n" +"Language-Team: Interlingua \n" +"Language: ia\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" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:1 +msgid "Screenshots" +msgstr "Capturas de schermo" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:2 +msgid "Record a screencast" +msgstr "Registrar un video de schermo" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "Systema" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "Monstrar le tiratorio de messages" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "Mitter foco al notificationes active" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "Monstrar le panorama" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "Monstrar tote le applicationes" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "Aperir le menu de applicationes" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Gestion de fenestras e lanceamento de applicationes" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +#: ../js/extensionPrefs/main.js:153 +msgid "GNOME Shell Extension Preferences" +msgstr "Preferentias pro le extensiones GNOME Shell" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurar le extensiones GNOME Shell" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Permitter le accesso via Alt-F2 al instrumentos interne que es utile pro " +"disveloppatores e probatores" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permitter le accesso via le dialog de lanceamento de applicationes (Alt-F2) " +"al instrumentos interne que es utile pro eliminar defectos de software e " +"facer le surveliantia" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "Uuids of extensions to enable" +msgstr "Identificatores UUID del extensiones a activar" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension DBus methods on org.gnome.Shell." +msgstr "" +"Le extensiones GNOME Shell ha un proprietate UUID. Iste clave enumera le " +"extensiones que debe ser cargate. Tote le extensiones que vole ser cargate " +"debe adjungar se a iste lista. Il pote anque manipular iste lista con le " +"methodos DBus EnableExtension e DisableExtension de org.gnome.Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Whether to collect stats about applications usage" +msgstr "Colliger statisticas super le utilisation de applicationes" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" +"Normalmente GNOME Shell survelia le applicationes active a fin de presentar " +"le plus utilisate (per ex. in le lanceatores). Ben que le datos se guarda in " +"privato, on pote disactivar iste functionalitate per le ration de " +"confidentialitate. Remarca que iste disactivation non removera le datos jam " +"registrate." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Lista de identificatores de files desktop pro le applicationes favorite" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Le applicationes que corresponde a iste identificatores essera monstrate in " +"le area de favoritos." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "List of categories that should be displayed as folders" +msgstr "Lista de categorias que deberea ser monstrate como dossiers" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "" +"Each category name in this list will be represented as folder in the " +"application view, rather than being displayed inline in the main view." +msgstr "" +"Cata nomine de categoria in iste lista sera representate como un dossier in " +"le vista de applicationes, plus tosto que de esser alineate in le vista " +"principal." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "Historia del dialogo de commandos (Alt-F2)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "Historia del dialogo de inspection" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "" +"Internally used to store the last IM presence explicitly set by the user. " +"The value here is from the TpConnectionPresenceType enumeration." +msgstr "" +"Illo se utilisa internemente pro registrar le ultime stato de presentia que " +"es definite explicitemente per le usator in le systema de messages instante. " +"Le valor hic es del enumeration TpConnectionPresenceType." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"Internally used to store the last session presence status for the user. The " +"value here is from the GsmPresenceStatus enumeration." +msgstr "" +"Illo se utilisa internemente pro registrar le ultime stato de session del " +"usator. Le valor hic es del enumeration GsmPresenceStatus." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "Always show the 'Log out' menuitem in the user menu." +msgstr "" +"Sempre monstrar le elemento de menu 'Clauder le session' in le menu de " +"usator." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menuitem in single-" +"user, single-session situations." +msgstr "" +"Iste clave supplanta le celamento automatic del elemento de menu 'Clauder le " +"session' in situationes con singule usator o singule session." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Si memorar le contrasigno pro montar le systemas de files cifrate o remote" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Le shell demandara un contrasigno pro montar un dispositivo cifrate o un " +"systema de files remote. Si le contrasigno pote ser retenite pro uso futur " +"un quadrato de selection 'Memorar le contrasigno' sera monstrate. Iste clave " +"defini le stato predefinite del quadrato de selection." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Show the week date in the calendar" +msgstr "Monstrar le numeration de septimanas in le calendario" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "If true, display the ISO week date in the calendar." +msgstr "Si ver, monstrar le numero de septimana ISO in le calendario." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the application menu" +msgstr "Association de claves pro aperir le menu de applicationes" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the application menu." +msgstr "Association de claves pro aperir le menu de applicationes." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "Association de claves pro aperir le vista \"Monstrar applicationes\"" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"Association de claves pro aperir le vista \"Monstrar applicationes\" del " +"panorama de activitates." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to open the overview" +msgstr "Association de claves pro aperir le panorama" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to open the Activities Overview." +msgstr "Association de claves pro aperir le panorama de activitates" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "" +"Association de claves pro commutar le visibilitate del tiratorio de messages" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "" +"Association de claves pro commutar le visibilitate del tiratorio de messages." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "Keybinding to focus the active notification" +msgstr "Association de claves pro mitter foco al notificationes active" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Keybinding to focus the active notification." +msgstr "Association de claves pro mitter foco al notificationes active." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "Keybinding to toggle the screen recorder" +msgstr "Association de claves pro commutar le registrator de schermo" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Keybinding to start/stop the builtin screen recorder." +msgstr "Association de claves pro initiar/arrestar le registration de schermo." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "Which keyboard to use" +msgstr "Que claviero usar" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The type of keyboard to use." +msgstr "Le typo de claviero a usar." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "Framerate used for recording screencasts." +msgstr "Rata de quadros usate pro registrar le video de schermo." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" +"Le numero de imagines per secunda in le video de schermo registrate per le " +"registrator incorporate in GNOME Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "Le catena usante per gstreamer pro codificar video de schermo" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is " +"used as a placeholder for a guess at the optimal thread count on the system." +msgstr "" +"Le definition del catena usante per GStreamer pro codificar videos. Le " +"syntaxe es identic al syntaxe usate per gst-launch. Le catena deberea haber " +"un puncto de egresso disconnectite a ubi le video se scribe. Generalmente " +"illo va haber un puncto de origine disconnectite; le egresso de iste puncto " +"se scribera in le file de resultato. Totevia, le catena anque pote custodiar " +"su proprie egresso - isto pote ser usate pro inviar le resultato a un " +"servitor icecast via shout2send o simile. Quando le valor non es definite o " +"vacue, le catena predefinite se usa. Isto es actualmente 'vp8enc " +"min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! " +"queue ! webmmux' e registra in WEBM usante le codec VP8. %T designa le " +"numero de filos optimal pro le systema." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "File extension used for storing the screencast" +msgstr "Extension de file a usar pro slaveguardar le video de schermo" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" +"Le nomine de file del video registrate es unic. Illo se basa super le data " +"currente e iste extension. Illo deberea esser modificate si le formato de " +"container usate pro registar le video es differente." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "The application icon mode." +msgstr "Le modo de icone in le selector de applicationes." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"Le configuration del maniera como le fenestras es monstrate in le selector. " +"Le possibilitates valide es 'thumbnail-only' (monstrar un miniatura del " +"fenestra), 'app-icon-only' (monstrar solmente un icone del application) o " +"'both' (monstrar tote le duo)." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 +msgid "Attach modal dialog to the parent window" +msgstr "Attaccar le dialogo modal al fenestra parental" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Iste clave supplanta le clave in org.gnome.mutter quando GNOME Shell es " +"lanceate." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 +msgid "Arrangement of buttons on the titlebar" +msgstr "Arrangiamento de buttones sur le barra de titulo" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 +msgid "" +"This key overrides the key in org.gnome.desktop.wm.preferences when running " +"GNOME Shell." +msgstr "" +"Iste clave supplanta le clave in org.gnome.desktop.wm.preferences quando " +"GNOME Shell es lanceate." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:48 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Activar le tegulage de fenestras depositate sur le bordos del schermo" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:49 +msgid "Workspaces are managed dynamically" +msgstr "Le spatios de travalio se gere dynamicamente" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:50 +msgid "Workspaces only on primary monitor" +msgstr "Le spatios de travalio es solmente sur le schermo principal" + +#: ../js/extensionPrefs/main.js:125 +#, c-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Il ha un error al cargamento del dialogo de preferentias pro %s:" + +#: ../js/extensionPrefs/main.js:165 +msgid "Extension" +msgstr "Extension" + +#: ../js/extensionPrefs/main.js:189 +msgid "Select an extension to configure using the combobox above." +msgstr "Selige un extension que configurar usante le lista combinate in alto." + +#: ../js/gdm/loginDialog.js:405 +msgid "Session…" +msgstr "Session…" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:630 +msgid "Not listed?" +msgstr "Esque le nomine non es in le lista?" + +#: ../js/gdm/loginDialog.js:787 ../js/ui/components/networkAgent.js:137 +#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:100 +#: ../js/ui/userMenu.js:938 +msgid "Cancel" +msgstr "Annullar" + +#: ../js/gdm/loginDialog.js:803 +msgctxt "button" +msgid "Sign In" +msgstr "Connecter se" + +#: ../js/gdm/loginDialog.js:803 +msgid "Next" +msgstr "Sequente" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/gdm/loginDialog.js:918 ../js/ui/components/networkAgent.js:260 +#: ../js/ui/components/networkAgent.js:278 +msgid "Username: " +msgstr "Nomine de usator:" + +#: ../js/gdm/loginDialog.js:1174 +msgid "Login Window" +msgstr "Fenestra de connexion" + +#. Translators: accessible name of the power menu in the login screen +#: ../js/gdm/powerMenu.js:36 +msgid "Power" +msgstr "Energia" + +#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700 +#: ../js/ui/userMenu.js:816 +msgid "Suspend" +msgstr "Suspender" + +#: ../js/gdm/powerMenu.js:98 +msgid "Restart" +msgstr "Reinitiar" + +#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698 +#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942 +msgid "Power Off" +msgstr "Extinguer" + +#: ../js/gdm/util.js:249 +msgid "Authentication error" +msgstr "Error de authentication" + +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/util.js:366 +msgid "(or swipe finger)" +msgstr "(o passa le digito trans le lector de impressiones)" + +#: ../js/gdm/util.js:391 +#, c-format +msgid "(e.g., user or %s)" +msgstr "(per ex., usator o %s)" + +#: ../js/misc/util.js:97 +msgid "Command not found" +msgstr "Commando non trovate" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:130 +msgid "Could not parse command:" +msgstr "Impossibile de analysar le commando:" + +#: ../js/misc/util.js:138 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "Falta al execution de '%s':" + +#: ../js/ui/appDisplay.js:351 +msgid "Frequent" +msgstr "Frequente" + +#: ../js/ui/appDisplay.js:358 +msgid "All" +msgstr "Tote" + +#: ../js/ui/appDisplay.js:916 +msgid "New Window" +msgstr "Nove fenestra" + +#: ../js/ui/appDisplay.js:919 ../js/ui/dash.js:284 +msgid "Remove from Favorites" +msgstr "Remover del favoritos" + +#: ../js/ui/appDisplay.js:920 +msgid "Add to Favorites" +msgstr "Adder al favoritos" + +#: ../js/ui/appFavorites.js:87 +#, c-format +msgid "%s has been added to your favorites." +msgstr "%s ha essite addite al favoritos." + +#: ../js/ui/appFavorites.js:121 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "%s ha essite removite del favoritos." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789 +msgid "Settings" +msgstr "Parametros" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "Cambiar le fundo…" + +#. 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:62 +msgctxt "event list time" +msgid "All Day" +msgstr "Jornata" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : +#: ../js/ui/calendar.js:68 +msgctxt "event list time" +msgid "%H\\u2236%M" +msgstr "%H\\u2236%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space +#: ../js/ui/calendar.js:77 +msgctxt "event list time" +msgid "%l\\u2236%M\\u2009%p" +msgstr "%l\\u2236%M\\u2009%p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:108 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:110 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:112 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:114 +msgctxt "grid wednesday" +msgid "W" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:116 +msgctxt "grid thursday" +msgid "T" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:118 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:120 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:133 +msgctxt "list sunday" +msgid "Su" +msgstr "Do" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:135 +msgctxt "list monday" +msgid "M" +msgstr "Lu" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:137 +msgctxt "list tuesday" +msgid "T" +msgstr "Ma" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:139 +msgctxt "list wednesday" +msgid "W" +msgstr "Me" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:141 +msgctxt "list thursday" +msgid "Th" +msgstr "Jo" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:143 +msgctxt "list friday" +msgid "F" +msgstr "Ve" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:145 +msgctxt "list saturday" +msgid "S" +msgstr "Sa" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:720 +msgid "Nothing Scheduled" +msgstr "Nihil planate" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:736 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, le %d de %B" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:739 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, le %d de %B %Y" + +#: ../js/ui/calendar.js:749 +msgid "Today" +msgstr "Hodie" + +#: ../js/ui/calendar.js:753 +msgid "Tomorrow" +msgstr "Deman" + +#: ../js/ui/calendar.js:764 +msgid "This week" +msgstr "Iste septimana" + +#: ../js/ui/calendar.js:772 +msgid "Next week" +msgstr "Le septimana proxime" + +#: ../js/ui/components/automountManager.js:90 +msgid "External drive connected" +msgstr "Disco externe connectite" + +#: ../js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Disco externe disconnectite" + +#: ../js/ui/components/autorunManager.js:294 +msgid "Removable Devices" +msgstr "Dispositivo removibile" + +#: ../js/ui/components/autorunManager.js:594 +#, c-format +msgid "Open with %s" +msgstr "Aperir con %s" + +#: ../js/ui/components/autorunManager.js:620 +msgid "Eject" +msgstr "Ejacular" + +#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268 +msgid "Password:" +msgstr "Contrasigno:" + +#: ../js/ui/components/keyring.js:101 +msgid "Type again:" +msgstr "Introduce de novo:" + +#: ../js/ui/components/networkAgent.js:132 +msgid "Connect" +msgstr "Connecter" + +#. Cisco LEAP +#: ../js/ui/components/networkAgent.js:223 +#: ../js/ui/components/networkAgent.js:235 +#: ../js/ui/components/networkAgent.js:262 +#: ../js/ui/components/networkAgent.js:282 +#: ../js/ui/components/networkAgent.js:292 +msgid "Password: " +msgstr "Contrasigno: " + +#. static WEP +#: ../js/ui/components/networkAgent.js:228 +msgid "Key: " +msgstr "Clave: " + +#: ../js/ui/components/networkAgent.js:266 +msgid "Identity: " +msgstr "Identitate: " + +#: ../js/ui/components/networkAgent.js:268 +msgid "Private key password: " +msgstr "Contrasigno del clave private: " + +#: ../js/ui/components/networkAgent.js:280 +msgid "Service: " +msgstr "Servicio: " + +#: ../js/ui/components/networkAgent.js:309 +msgid "Authentication required by wireless network" +msgstr "Le authentication es requirite per le rete sin filo" + +#: ../js/ui/components/networkAgent.js:310 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"'%s'." +msgstr "" +"Contrasignos o claves de ciframento es necessari pro acceder al rete sin " +"filo '%s'." + +#: ../js/ui/components/networkAgent.js:314 +msgid "Wired 802.1X authentication" +msgstr "Authentication 802.1X pro rete con filo" + +#: ../js/ui/components/networkAgent.js:316 +msgid "Network name: " +msgstr "Nomine de rete: " + +#: ../js/ui/components/networkAgent.js:321 +msgid "DSL authentication" +msgstr "Authentication DSL" + +#: ../js/ui/components/networkAgent.js:328 +msgid "PIN code required" +msgstr "Codice PIN es necessari" + +#: ../js/ui/components/networkAgent.js:329 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Un codice PIN es necessari pro le dispositivo mobile" + +#: ../js/ui/components/networkAgent.js:330 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:336 +msgid "Mobile broadband network password" +msgstr "Contrasigno del rete mobile" + +#: ../js/ui/components/networkAgent.js:337 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "Un contrasigno es necessari pro connecter a '%s'." + +#: ../js/ui/components/polkitAgent.js:55 +msgid "Authentication Required" +msgstr "Authentication necessari" + +#: ../js/ui/components/polkitAgent.js:93 +msgid "Administrator" +msgstr "Administrator" + +#: ../js/ui/components/polkitAgent.js:165 +msgid "Authenticate" +msgstr "Authenticar se" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "Error de authentication. Tenta de novo." + +#. Translators: this is a filename used for screencast recording +#: ../js/ui/components/recorder.js:47 +#, no-c-format +msgid "Screencast from %d %t" +msgstr "Video de schermo %d %t" + +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/components/telepathyClient.js:238 +msgid "Invitation" +msgstr "Invitation" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:298 +msgid "Call" +msgstr "Appello" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:314 +msgid "File Transfer" +msgstr "Transferentia de files" + +#: ../js/ui/components/telepathyClient.js:418 +msgid "Chat" +msgstr "Discussion" + +#: ../js/ui/components/telepathyClient.js:480 +msgid "Unmute" +msgstr "Facer non silente" + +#: ../js/ui/components/telepathyClient.js:480 +msgid "Mute" +msgstr "Silentiar" + +#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30" +#: ../js/ui/components/telepathyClient.js:942 +#, no-c-format +msgid "Yesterday, %H:%M" +msgstr "Heri, %H:%M" + +#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30 +#: ../js/ui/components/telepathyClient.js:948 +#, no-c-format +msgid "%A, %H:%M" +msgstr "%A, %H:%M" + +#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30" +#: ../js/ui/components/telepathyClient.js:953 +#, no-c-format +msgid "%B %d, %H:%M" +msgstr "%d de %B, %H:%M" + +#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30" +#: ../js/ui/components/telepathyClient.js:957 +#, no-c-format +msgid "%B %d %Y, %H:%M " +msgstr "%d de %B %Y, %H:%M " + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/components/telepathyClient.js:985 +#, c-format +msgid "%s is now known as %s" +msgstr "%s es ora cognite como %s" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1088 +#, c-format +msgid "Invitation to %s" +msgstr "Invitation a %s" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/components/telepathyClient.js:1096 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "%s te es inviante a %s" + +#: ../js/ui/components/telepathyClient.js:1098 +#: ../js/ui/components/telepathyClient.js:1137 +#: ../js/ui/components/telepathyClient.js:1177 +#: ../js/ui/components/telepathyClient.js:1240 +msgid "Decline" +msgstr "Declinar" + +#: ../js/ui/components/telepathyClient.js:1099 +#: ../js/ui/components/telepathyClient.js:1178 +#: ../js/ui/components/telepathyClient.js:1241 +msgid "Accept" +msgstr "Acceptar" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1129 +#, c-format +msgid "Video call from %s" +msgstr "Appello video de %s" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1132 +#, c-format +msgid "Call from %s" +msgstr "Appello de %s" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/components/telepathyClient.js:1139 +msgid "Answer" +msgstr "Responder" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/components/telepathyClient.js:1171 +#, c-format +msgid "%s is sending you %s" +msgstr "%s te es inviante %s" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/components/telepathyClient.js:1206 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "%s sollicita le permission de vider quando tu es in linea" + +#: ../js/ui/components/telepathyClient.js:1298 +msgid "Network error" +msgstr "Error de rete" + +#: ../js/ui/components/telepathyClient.js:1300 +msgid "Authentication failed" +msgstr "Falta de authentication" + +#: ../js/ui/components/telepathyClient.js:1302 +msgid "Encryption error" +msgstr "Error de ciframento" + +#: ../js/ui/components/telepathyClient.js:1304 +msgid "Certificate not provided" +msgstr "Certificato non fornite" + +#: ../js/ui/components/telepathyClient.js:1306 +msgid "Certificate untrusted" +msgstr "Certificato indigne de fide" + +#: ../js/ui/components/telepathyClient.js:1308 +msgid "Certificate expired" +msgstr "Certificato perimite" + +#: ../js/ui/components/telepathyClient.js:1310 +msgid "Certificate not activated" +msgstr "Certificato non activate" + +#: ../js/ui/components/telepathyClient.js:1312 +msgid "Certificate hostname mismatch" +msgstr "Discordantia de nomine de host del certificato" + +#: ../js/ui/components/telepathyClient.js:1314 +msgid "Certificate fingerprint mismatch" +msgstr "Discordantia de impression digital del certificato" + +#: ../js/ui/components/telepathyClient.js:1316 +msgid "Certificate self-signed" +msgstr "Certificato autofirmate" + +#: ../js/ui/components/telepathyClient.js:1318 +msgid "Status is set to offline" +msgstr "Le stato es disconnexe" + +#: ../js/ui/components/telepathyClient.js:1320 +msgid "Encryption is not available" +msgstr "Le ciframento non es disponibile" + +#: ../js/ui/components/telepathyClient.js:1322 +msgid "Certificate is invalid" +msgstr "Le certificato non es valide" + +#: ../js/ui/components/telepathyClient.js:1324 +msgid "Connection has been refused" +msgstr "Le connexion ha essite refusate" + +#: ../js/ui/components/telepathyClient.js:1326 +msgid "Connection can't be established" +msgstr "Le connexion non pote ser establite" + +#: ../js/ui/components/telepathyClient.js:1328 +msgid "Connection has been lost" +msgstr "Le connexion se ha perdite" + +#: ../js/ui/components/telepathyClient.js:1330 +msgid "This account is already connected to the server" +msgstr "Iste conto jam es connectite al servitor" + +#: ../js/ui/components/telepathyClient.js:1332 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" +"Le connexion ha essite substituite per un nove connexion usante le mesme " +"ressource" + +#: ../js/ui/components/telepathyClient.js:1334 +msgid "The account already exists on the server" +msgstr "Le conto jam existe sur le servitor" + +#: ../js/ui/components/telepathyClient.js:1336 +msgid "Server is currently too busy to handle the connection" +msgstr "Actualmente le servitor es troppo occupate pro tractar le connexion" + +#: ../js/ui/components/telepathyClient.js:1338 +msgid "Certificate has been revoked" +msgstr "Le certificato ha essite revocate" + +#: ../js/ui/components/telepathyClient.js:1340 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"Le certificato usa un algorithmo de ciframento insecur o es " +"cryptographicamente debile" + +#: ../js/ui/components/telepathyClient.js:1342 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"Le longitude del certificato de servitor o le profunditate del catena de " +"certificatos de servitor excede le limites imponite per le bibliotheca de " +"cryptographia" + +#: ../js/ui/components/telepathyClient.js:1344 +msgid "Internal error" +msgstr "Error interne" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1354 +#, c-format +msgid "Unable to connect to %s" +msgstr "Impossibile de connecter a %s" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "View account" +msgstr "Examinar le conto" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "Unknown reason" +msgstr "Causa incognite" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96 +msgid "Windows" +msgstr "Fenestras" + +#: ../js/ui/dash.js:248 ../js/ui/dash.js:286 +msgid "Show Applications" +msgstr "Monstrar applicationes" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/dash.js:435 +msgid "Dash" +msgstr "Pannello" + +#: ../js/ui/dateMenu.js:91 +msgid "Open Calendar" +msgstr "Aperir calendario" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Clocks" +msgstr "Aperir horologios" + +#: ../js/ui/dateMenu.js:105 +msgid "Date & Time Settings" +msgstr "Parametros de data e hora" + +#. 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:215 +msgid "%A %B %e, %Y" +msgstr "%A, %e de %B %Y" + +#: ../js/ui/endSessionDialog.js:63 +#, c-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Clauder le session de %s" + +#: ../js/ui/endSessionDialog.js:64 +msgctxt "title" +msgid "Log Out" +msgstr "Clauder le session" + +#: ../js/ui/endSessionDialog.js:65 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "" +"Clicca sur 'Clauder le session' pro quitar iste applicationes e sortir del " +"systema." + +#: ../js/ui/endSessionDialog.js:67 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Le session de %s sera terminate automaticamente in %d secunda." +msgstr[1] "Le session de %s sera terminate automaticamente in %d secundas." + +#: ../js/ui/endSessionDialog.js:72 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Le session sera terminate automaticamente in %d secunda." +msgstr[1] "Le session sera terminate automaticamente in %d secundas." + +#: ../js/ui/endSessionDialog.js:76 +msgid "Logging out of the system." +msgstr "Clausura del session." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Clauder le session" + +#: ../js/ui/endSessionDialog.js:83 +msgctxt "title" +msgid "Power Off" +msgstr "Extinguer" + +#: ../js/ui/endSessionDialog.js:84 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "" +"Clicca sur 'Extinguer' pro quitar iste applicationes e extinguer le systema." + +#: ../js/ui/endSessionDialog.js:86 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Le systema se extinguera automaticamente in %d secunda." +msgstr[1] "Le systema se extinguera automaticamente in %d secundas." + +#: ../js/ui/endSessionDialog.js:90 +msgid "Powering off the system." +msgstr "Extinction del systema." + +#: ../js/ui/endSessionDialog.js:92 ../js/ui/endSessionDialog.js:109 +msgctxt "button" +msgid "Restart" +msgstr "Reinitiar" + +#: ../js/ui/endSessionDialog.js:94 +msgctxt "button" +msgid "Power Off" +msgstr "Extinguer" + +#: ../js/ui/endSessionDialog.js:100 +msgctxt "title" +msgid "Restart" +msgstr "Reinitiar" + +#: ../js/ui/endSessionDialog.js:101 +msgid "Click Restart to quit these applications and restart the system." +msgstr "" +"Clicca sur 'Reinitiar' pro quitar iste applicationes e reinitiar le systema." + +#: ../js/ui/endSessionDialog.js:103 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Le systema se reinitiara automaticamente in %d secunda." +msgstr[1] "Le systema se reinitiara automaticamente in %d secundas." + +#: ../js/ui/endSessionDialog.js:107 +msgid "Restarting the system." +msgstr "Reinitio del systema." + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Installar" + +#: ../js/ui/extensionDownloader.js:204 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "Discargar e installar '%s' de extensions.gnome.org?" + +#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314 +#: ../js/ui/status/power.js:211 +msgid "Keyboard" +msgstr "Claviero" + +#: ../js/ui/lookingGlass.js:693 +msgid "No extensions installed" +msgstr "Necun extensiones installate" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:747 +#, c-format +msgid "%s has not emitted any errors." +msgstr "%s non ha emittite alicun errores." + +#: ../js/ui/lookingGlass.js:753 +msgid "Hide Errors" +msgstr "Occultar errores" + +#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:817 +msgid "Show Errors" +msgstr "Monstrar errores" + +#: ../js/ui/lookingGlass.js:766 +msgid "Enabled" +msgstr "Activate" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "Disactivate" + +#: ../js/ui/lookingGlass.js:771 +msgid "Error" +msgstr "Error" + +#: ../js/ui/lookingGlass.js:773 +msgid "Out of date" +msgstr "Perempte" + +#: ../js/ui/lookingGlass.js:775 +msgid "Downloading" +msgstr "Discargamento" + +#: ../js/ui/lookingGlass.js:799 +msgid "View Source" +msgstr "Monstrar le fonte" + +#: ../js/ui/lookingGlass.js:808 +msgid "Web Page" +msgstr "Pagina web" + +#: ../js/ui/messageTray.js:1182 +msgid "Open" +msgstr "Aperir" + +#: ../js/ui/messageTray.js:1189 +msgid "Remove" +msgstr "Remover" + +#: ../js/ui/messageTray.js:1501 +msgid "Clear Messages" +msgstr "Expunger messages" + +#: ../js/ui/messageTray.js:1528 +msgid "Notification Settings" +msgstr "Parametros de notificationes" + +#: ../js/ui/messageTray.js:1710 +msgid "No Messages" +msgstr "Necun message" + +#: ../js/ui/messageTray.js:1783 +msgid "Message Tray" +msgstr "Tiratorio de messages" + +#: ../js/ui/messageTray.js:2801 +msgid "System Information" +msgstr "Information de systema" + +#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:378 +msgctxt "program" +msgid "Unknown" +msgstr "Incognite" + +#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:149 +#, c-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nove message" +msgstr[1] "%d nove messages" + +#: ../js/ui/overview.js:82 +msgid "Undo" +msgstr "Disfacer" + +#: ../js/ui/overview.js:127 +msgid "Overview" +msgstr "Panorama" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/overview.js:260 +msgid "Type to search…" +msgstr "Scribe pro cercar…" + +#: ../js/ui/panel.js:641 +msgid "Quit" +msgstr "Quitar" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:692 +msgid "Activities" +msgstr "Activitates" + +#: ../js/ui/panel.js:989 +msgid "Top Bar" +msgstr "Barra superior" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:718 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:74 +msgid "Enter a Command" +msgstr "Introduce un commando" + +#: ../js/ui/runDialog.js:110 +msgid "Close" +msgstr "Clauder" + +#. Translators: This is a time format for a date in +#. long format +#: ../js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %d de %B" + +#: ../js/ui/screenShield.js:151 +#, c-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nove notification" +msgstr[1] "%d nove notificationes" + +#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807 +msgid "Lock" +msgstr "Serrar" + +#: ../js/ui/screenShield.js:641 +msgid "GNOME needs to lock the screen" +msgstr "GNOME ha besonio de serrar le schermo" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198 +msgid "Unable to lock" +msgstr "Impossibile de serrar" + +#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199 +msgid "Lock was blocked by an application" +msgstr "Le serramento ha essite impedite per un application" + +#: ../js/ui/searchDisplay.js:453 +msgid "Searching…" +msgstr "Cerca…" + +#: ../js/ui/searchDisplay.js:497 +msgid "No results." +msgstr "Necun resultato." + +#: ../js/ui/shellEntry.js:29 +msgid "Copy" +msgstr "Copiar" + +#: ../js/ui/shellEntry.js:34 +msgid "Paste" +msgstr "Collar" + +#: ../js/ui/shellEntry.js:101 +msgid "Show Text" +msgstr "Monstrar texto" + +#: ../js/ui/shellEntry.js:103 +msgid "Hide Text" +msgstr "Occultar texto" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "Contrasigno" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "Recordar contrasigno" + +#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:114 +msgid "Unlock" +msgstr "Disserrar" + +#: ../js/ui/status/accessibility.js:36 +msgid "Accessibility" +msgstr "Accessibilitate" + +#: ../js/ui/status/accessibility.js:41 +msgid "Zoom" +msgstr "Aggrandimento" + +#: ../js/ui/status/accessibility.js:48 +msgid "Screen Reader" +msgstr "Lector de schermo" + +#: ../js/ui/status/accessibility.js:52 +msgid "Screen Keyboard" +msgstr "Claviero visual" + +#: ../js/ui/status/accessibility.js:56 +msgid "Visual Alerts" +msgstr "Allerta visual" + +#: ../js/ui/status/accessibility.js:59 +msgid "Sticky Keys" +msgstr "Claves remanente" + +#: ../js/ui/status/accessibility.js:62 +msgid "Slow Keys" +msgstr "Claves lente" + +#: ../js/ui/status/accessibility.js:65 +msgid "Bounce Keys" +msgstr "Claves saltante" + +#: ../js/ui/status/accessibility.js:68 +msgid "Mouse Keys" +msgstr "Claves del mus imitate" + +#: ../js/ui/status/accessibility.js:72 +msgid "Universal Access Settings" +msgstr "Parametros del accesso universal" + +#: ../js/ui/status/accessibility.js:129 +msgid "High Contrast" +msgstr "Contrasto elevate" + +#: ../js/ui/status/accessibility.js:178 +msgid "Large Text" +msgstr "Texto grande" + +#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32 +#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321 +#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388 +#: ../js/ui/status/network.js:826 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:45 +msgid "Visibility" +msgstr "Visibile" + +#: ../js/ui/status/bluetooth.js:59 +msgid "Send Files to Device…" +msgstr "Inviar files al dispositivo…" + +#: ../js/ui/status/bluetooth.js:60 +msgid "Set Up a New Device…" +msgstr "Configurar un nove dispositivo…" + +#: ../js/ui/status/bluetooth.js:84 +msgid "Bluetooth Settings" +msgstr "Parametros Bluetooth" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:178 +msgid "hardware disabled" +msgstr "disactivate physicamente" + +#: ../js/ui/status/bluetooth.js:197 +msgid "Connection" +msgstr "Connexion" + +#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:460 +msgid "disconnecting..." +msgstr "disconnexion…" + +#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:466 +#: ../js/ui/status/network.js:1546 +msgid "connecting..." +msgstr "connexion…" + +#: ../js/ui/status/bluetooth.js:239 +msgid "Send Files…" +msgstr "Inviar files…" + +#: ../js/ui/status/bluetooth.js:246 +msgid "Keyboard Settings" +msgstr "Parametros de claviero" + +#: ../js/ui/status/bluetooth.js:249 +msgid "Mouse Settings" +msgstr "Parametros de mus" + +#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316 +msgid "Sound Settings" +msgstr "Parametros de sono" + +#: ../js/ui/status/bluetooth.js:322 +#, c-format +msgid "Authorization request from %s" +msgstr "Requesta de authorisation de %s" + +#: ../js/ui/status/bluetooth.js:328 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "Le dispositivo %s vole acceder al servicio '%s'" + +#: ../js/ui/status/bluetooth.js:330 +msgid "Always grant access" +msgstr "Conceder accesso sempre" + +#: ../js/ui/status/bluetooth.js:331 +msgid "Grant this time only" +msgstr "Conceder accesso solmente in iste vice" + +#: ../js/ui/status/bluetooth.js:332 +msgid "Reject" +msgstr "Rejectar" + +#. Translators: argument is the device short name +#: ../js/ui/status/bluetooth.js:359 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "Confirmation del association con %s" + +#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "Le dispositivo %s vole associar se con iste computator" + +#: ../js/ui/status/bluetooth.js:366 +#, c-format +msgid "Please confirm whether the PIN '%06d' matches the one on the device." +msgstr "Confirma que le PIN '%06d' corresponde a illo sur le dispositivo." + +#. Translators: this is the verb, not the noun +#: ../js/ui/status/bluetooth.js:369 +msgid "Matches" +msgstr "Corresponde" + +#: ../js/ui/status/bluetooth.js:370 +msgid "Does not match" +msgstr "Non corresponde" + +#: ../js/ui/status/bluetooth.js:389 +#, c-format +msgid "Pairing request for %s" +msgstr "Requesta del association con %s" + +#: ../js/ui/status/bluetooth.js:397 +msgid "Please enter the PIN mentioned on the device." +msgstr "Introduce le PIN mentionate sur le dispositivo." + +#: ../js/ui/status/bluetooth.js:414 +msgid "OK" +msgstr "Validar" + +#: ../js/ui/status/keyboard.js:368 +msgid "Show Keyboard Layout" +msgstr "Monstrar le disposition de claviero" + +#: ../js/ui/status/keyboard.js:373 +msgid "Region & Language Settings" +msgstr "Parametros de region e de lingua" + +#: ../js/ui/status/lockScreenMenu.js:43 +msgid "Volume, network, battery" +msgstr "Volumine, rete, accumulator" + +#: ../js/ui/status/network.js:104 +msgid "" +msgstr "" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:200 +msgid "disabled" +msgstr "disactivate" + +#. 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) +#: ../js/ui/status/network.js:458 +msgid "unmanaged" +msgstr "foras de gestion" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1549 +msgid "authentication required" +msgstr "necessita authentication" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:479 +msgid "firmware missing" +msgstr "firmware mancante" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:486 +msgid "cable unplugged" +msgstr "cablo disconnectite" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:491 +msgid "unavailable" +msgstr "non disponibile" + +#: ../js/ui/status/network.js:493 ../js/ui/status/network.js:1551 +msgid "connection failed" +msgstr "falta de connexion" + +#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1435 +#: ../js/ui/status/network.js:1627 +msgid "More…" +msgstr "Plus…" + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1365 +msgid "Connected (private)" +msgstr "Connectite (private)" + +#: ../js/ui/status/network.js:667 +msgid "Wired" +msgstr "Via filo" + +#: ../js/ui/status/network.js:668 +msgid "Auto Ethernet" +msgstr "Ethernet automatic" + +#: ../js/ui/status/network.js:695 +msgid "Mobile broadband" +msgstr "Banda large mobile" + +#: ../js/ui/status/network.js:728 +msgid "Auto broadband" +msgstr "Banda large automatic" + +#: ../js/ui/status/network.js:731 +msgid "Auto dial-up" +msgstr "Telephonic automatic" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:861 ../js/ui/status/network.js:1382 +#, c-format +msgid "Auto %s" +msgstr "%s automatic" + +#: ../js/ui/status/network.js:863 +msgid "Auto bluetooth" +msgstr "Bluetooth automatic" + +#: ../js/ui/status/network.js:1384 +msgid "Auto wireless" +msgstr "Sin filo automatic" + +#: ../js/ui/status/network.js:1729 +msgid "Enable networking" +msgstr "Activar le rete" + +#: ../js/ui/status/network.js:1771 +msgid "Wi-Fi" +msgstr "Wi-Fi" + +#: ../js/ui/status/network.js:1790 +msgid "Network Settings" +msgstr "Parametros de rete" + +#: ../js/ui/status/network.js:1807 +msgid "Network Manager" +msgstr "Gerente de rete" + +#: ../js/ui/status/network.js:1897 +msgid "Connection failed" +msgstr "Falta de connexion" + +#: ../js/ui/status/network.js:1898 +msgid "Activation of network connection failed" +msgstr "Falta de activation del connexion de rete" + +#: ../js/ui/status/network.js:2276 +msgid "Networking is disabled" +msgstr "Le rete es disactivate" + +#: ../js/ui/status/power.js:55 +msgid "Battery" +msgstr "Accumulator" + +#: ../js/ui/status/power.js:81 +msgid "Power Settings" +msgstr "Preferentias del gestion de energia" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:99 +msgid "Estimating…" +msgstr "Estimation…" + +#: ../js/ui/status/power.js:106 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "%d hora restante" +msgstr[1] "%d horas restante" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:109 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "%d %s %d %s restante" + +#: ../js/ui/status/power.js:111 +msgid "hour" +msgid_plural "hours" +msgstr[0] "hora" +msgstr[1] "horas" + +#: ../js/ui/status/power.js:111 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "minuta" +msgstr[1] "minutas" + +#: ../js/ui/status/power.js:114 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "%d minuta restante" +msgstr[1] "%d minutas restante" + +#: ../js/ui/status/power.js:117 ../js/ui/status/power.js:191 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d%%" + +#: ../js/ui/status/power.js:201 +msgid "AC Adapter" +msgstr "Adaptor de currente" + +#: ../js/ui/status/power.js:203 +msgid "Laptop Battery" +msgstr "Accumulator del computator" + +#: ../js/ui/status/power.js:205 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:207 +msgid "Monitor" +msgstr "Monitor" + +#: ../js/ui/status/power.js:209 +msgid "Mouse" +msgstr "Mouse" + +#: ../js/ui/status/power.js:213 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:215 +msgid "Cell Phone" +msgstr "Telephono cellular" + +#: ../js/ui/status/power.js:217 +msgid "Media Player" +msgstr "Lector de multimedia" + +#: ../js/ui/status/power.js:219 +msgid "Tablet" +msgstr "Tabletta" + +#: ../js/ui/status/power.js:221 +msgid "Computer" +msgstr "Computator" + +#: ../js/ui/status/power.js:223 +msgctxt "device" +msgid "Unknown" +msgstr "Incognite" + +#: ../js/ui/status/volume.js:124 +msgid "Volume changed" +msgstr "Volumine modificate" + +#. Translators: This is the label for audio volume +#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297 +msgid "Volume" +msgstr "Volumine" + +#: ../js/ui/status/volume.js:258 +msgid "Microphone" +msgstr "Microphono" + +#: ../js/ui/unlockDialog.js:125 +msgid "Log in as another user" +msgstr "Initiar session como altere usator" + +#: ../js/ui/unlockDialog.js:146 +msgid "Unlock Window" +msgstr "Fenestra de disserramento" + +#: ../js/ui/userMenu.js:193 +msgid "Available" +msgstr "Disponibile" + +#: ../js/ui/userMenu.js:196 +msgid "Busy" +msgstr "Occupate" + +#: ../js/ui/userMenu.js:199 +msgid "Invisible" +msgstr "Invisibile" + +#: ../js/ui/userMenu.js:202 +msgid "Away" +msgstr "Absente" + +#: ../js/ui/userMenu.js:205 +msgid "Idle" +msgstr "Inactive" + +#: ../js/ui/userMenu.js:208 +msgid "Offline" +msgstr "Disconnexe" + +#: ../js/ui/userMenu.js:781 +msgid "Notifications" +msgstr "Notificationes" + +#: ../js/ui/userMenu.js:797 +msgid "Switch User" +msgstr "Cambiar de usator" + +#: ../js/ui/userMenu.js:802 +msgid "Log Out" +msgstr "Clauder le session" + +#: ../js/ui/userMenu.js:822 +msgid "Install Updates & Restart" +msgstr "Installar actualisationes e reinitiar" + +#: ../js/ui/userMenu.js:840 +msgid "Your chat status will be set to busy" +msgstr "Le stato de chat sera definite como 'occupate'" + +#: ../js/ui/userMenu.js:841 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" +"Le notificationes es ora disactivate, includente le messages de chat. Le " +"stato in linea se ha adjustate pro facer saper al alteres que lor messages " +"pote non esser notate." + +#: ../js/ui/userMenu.js:888 +msgid "Other users are logged in." +msgstr "Altere usatores son connexe." + +#: ../js/ui/userMenu.js:893 +msgid "Shutting down might cause them to lose unsaved work." +msgstr "Le extinction poterea causar le perdita de obras non salveguardate." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: ../js/ui/userMenu.js:921 +#, c-format +msgid "%s (remote)" +msgstr "%s (remote)" + +#. Translators: Console here refers to a tty like a VT console +#: ../js/ui/userMenu.js:924 +#, c-format +msgid "%s (console)" +msgstr "%s (consola)" + +#: ../js/ui/viewSelector.js:100 +msgid "Applications" +msgstr "Applicationes" + +#: ../js/ui/viewSelector.js:104 +msgid "Search" +msgstr "Cerca" + +#: ../js/ui/wanda.js:77 +#, c-format +msgid "" +"Sorry, no wisdom for you today:\n" +"%s" +msgstr "" +"Il ha necun sagessa hodie:\n" +"%s" + +#: ../js/ui/wanda.js:81 +#, c-format +msgid "%s the Oracle says" +msgstr "%s le oraculo dice" + +#: ../js/ui/windowAttentionHandler.js:19 +#, c-format +msgid "'%s' is ready" +msgstr "'%s' es preste" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Calendario de Evolution" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u egresso" +msgstr[1] "%u egressos" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ingresso" +msgstr[1] "%u ingressos" + +#: ../src/gvc/gvc-mixer-control.c:2371 +msgid "System Sounds" +msgstr "Sonos de systema" + +#: ../src/main.c:347 +msgid "Print version" +msgstr "Monstrar le version" + +#: ../src/main.c:353 +msgid "Mode used by GDM for login screen" +msgstr "Modo usate per GDM pro le schermo de accesso" + +#: ../src/main.c:359 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "Usar un modo specific, per ex. \"gdm\" pro le schermo de accesso" + +#: ../src/main.c:365 +msgid "List possible modes" +msgstr "Monstrar le lista del modos possibile" + +#: ../src/shell-app.c:626 +#, c-format +msgid "Failed to launch '%s'" +msgstr "Impossibile de lancear '%s'" + +#: ../src/shell-keyring-prompt.c:708 +msgid "Passwords do not match." +msgstr "Le contrasignos non corresponde." + +#: ../src/shell-keyring-prompt.c:716 +msgid "Password cannot be blank" +msgstr "Le contrasigno non pote esser vacue" + +#: ../src/shell-polkit-authentication-agent.c:343 +msgid "Authentication dialog was dismissed by the user" +msgstr "Le dialogo de authentication era dimittite per le usator" diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..8bb1c18 --- /dev/null +++ b/po/id.po @@ -0,0 +1,2318 @@ +# Copyright (C) 2010 THE gnome-shell'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Andika Triwidada , 2010-2014, 2017. +# Dirgita , 2011, 2012, 2014. +# Wibiharto , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-21 18:43+0000\n" +"PO-Revision-Date: 2019-02-14 22:18+0700\n" +"Last-Translator: Kukuh Syafaat \n" +"Language-Team: Indonesian \n" +"Language: id\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.2.1\n" +"X-DamnedLies-Scope: partial\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistem" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Tampilkan daftar pemberitahuan" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokuskan pemberitahuan yang aktif" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Tampilkan ikhtisar" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Tampilkan semua aplikasi" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Buka menu aplikasi" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Ekstensi Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Konfigurasi Ekstensi GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Manajemen jendela dan peluncuran aplikasi" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Mengaktifkan perkakas internal yang berguna bagi pengembang dan penguji " +"dengan Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Izinkan askes ke perkakas pemantauan dan pengawakutuan internal memakai " +"dialog Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID ekstensi yang akan difungsikan" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Ekstensi GNOME Shell memiliki properti UUID; kunci ini memuat daftar " +"ekstensi yang mesti dimuat. Sebarang ekstensi yang ingin dimuat perlu berada " +"dalam daftar ini. Anda juga dapat memanipulasi daftar ini dengan metoda D-" +"Bus EnableExtension dan DisableExtension pada org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Nonaktifkan ekstensi pengguna" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Nonaktifkan semua ekstensi pengguna yang telah diaktifkan tanpa mempengaruhi " +"pengaturan \"ekstensi-diaktifkan\"." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Menonaktifkan validasi kompatibilitas versi ekstensi" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell hanya akan memuat ekstensi yang mengklaim mendukung versi " +"berjalan saat ini. Memfungsikan opsi ini akan menonaktifkan pemeriksaan ini " +"dan mencoba memuat semua ekstensi tanpa peduli versi yang mereka klaim " +"didukung." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Daftar ID berkas desktop untuk aplikasi favorit" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Aplikasi yang terkait dengan identifier-identifier ini akan ditampilkan pada " +"area favorit." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Tilikan Penyomot App" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indeks dari tilikan yang sedang dipilih dalam penyomot aplikasi." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Riwayat dialog perintah (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Riwayat untuk dialog yang berpenampilan gelas kaca" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Selalu tampilkan butir menu 'Log keluar' dalam menu pengguna." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Kunci ini menimpa penyembunyian otomatis butir menu 'Log keluar' dalam " +"situasi pengguna-tunggal, sesi-tunggal." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Apakah mengingat sandi untuk mengait sistem berkas terenkripsi atau jarak " +"jauh" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Shell akan meminta suatu sandi ketika suatu perangkat terenkripsi atau " +"sistem berkas jarak jauh dikaitkan. Bila sandi dapat disimpan untuk dipakai " +"dimasa depan, suatu kotak contreng 'Ingat Sandi' akan tampil. Kunci ini " +"menata keadaan baku dari kotak contreng." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Apakah adapter Bluetooth baku telah menyiapkan perangkat yang terasosiasi " +"dengannya" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Shell hanya akan menampilkan butir menu Bluetooth bila sebuah adapter " +"Bluetooth dinyalakan, atau ada perangkat yang telah disiapkan terasosiasi " +"dengan adapter baku. Ini akan di-reset bila adapter baku pernah terlihat " +"tidak punya perangkat yang terasosiasi dengannya." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Aktifkan API introspeksi" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Aktifkan API D-Bus yang memungkinkan untuk mengintrospeksi status aplikasi " +"shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Kombinasi tombol untuk membuka menu aplikasi" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Kombinasi tombol untuk membuka menu aplikasi." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Kombinasi tombol untuk membuka tilikan \"Tampilkan Aplikasi\"" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Kombinasi tombol untuk membuka tilikan Ringkasan Aktivitas \"Tampilkan " +"Aplikasi\"." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Kombinasi tombol untuk membuka ringkasan" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Kombinasi tombol untuk membuka Ringkasan Aktivitas." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Kombinasi tombol untuk kenampakan daftar pemberitahuan" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Kombinasi tombol untuk kenampakan daftar pemberitahuan." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Kombinasi tombol untuk fokus pada pemberitahuan yang aktif" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Kombinasi tombol untuk fokus pada pemberitahuan yang aktif." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Pengikatan tombol yang mengistirahatkan dan melanjutkan semua tween yang " +"sedang berjalan, untuk tujuan pengawakutuan" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Beralih ke aplikasi 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Beralih ke aplikasi 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Beralih ke aplikasi 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Beralih ke aplikasi 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Beralih ke aplikasi 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Beralih ke aplikasi 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Beralih ke aplikasi 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Beralih ke aplikasi 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Beralih ke aplikasi 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Papan tik mana yang akan dipakai" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Jenis papan tik yang akan dipakai." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Batasi pengalih ke ruang kerja saat ini." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Bila berisi true, hanya aplikasi yang punya jendela pada ruang kerja saat " +"ini ditampilkan pada penukar. Bila tidak, semua aplikasi disertakan." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Mode ikon aplikasi." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Mengatur bagaimana jendela ditampilkan dalam penukar. Kemungkinan yang valid " +"adalah \"thumbnail-only\" (menampilkan gambar mini dari jendela), \"app-icon-" +"only\" (hanya menampilkan ikon aplikasi), atau \"both\" (keduanya)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Bila berisi true, hanya jendela dari ruang kerja saat ini ditampilkan pada " +"penukar. Bila tidak, semua jendela disertakan." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Mencantolkan dialog modal ke jendela induk" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Kunci ini menimpa kunci dalam org.gnome.mutter ketika menjalankan GNOME " +"Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Memfungsikan pengubinan tepi ketika menjatuhkan jendela pada tepi layar" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Ruang kerja dikelola secara dinamis" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Ruang kerja hanya pada monitor primer" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Tunda perubahan fokus dalam mode tetikus sampai penunjuk berhenti bergerak" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Log Masuk Jaringan" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Ada yang tidak beres" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Kami sangat menyesal, tetapi ada masalah: pengaturan untuk ekstensi ini " +"tidak dapat ditampilkan. Kami menyarankan Anda melaporkan masalah ini kepada " +"penulis ekstensi." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Detail Teknis" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Salin Galat" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Halaman Web" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Kunjungi halaman web ekstensi" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Tak Ada Ekstensi Terpasang" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Ekstensi dapat dipasang melalui Perangkat Lunak atau extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Ramban di Perangkat Lunak" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Batal" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Selanjutnya" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Buka Kunci" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Masuk" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Pilih Sesi" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Tak masuk daftar?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(cth., pengguna dari %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Nama pengguna: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Jendela Log Masuk" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Galat autentikasi" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(atau gesekkan jari)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Matikan" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "matikan;matikan;nyalakan ulang;nyalakan ulang" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Kunci Layar" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "kunci layar" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Keluar" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "keluar" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Suspensi" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspensi;tidur" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Ganti Pengguna" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "ganti pengguna" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Kunci Orientasi" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "kunci orientasi;layar;rotasi" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Perintah tidak ditemukan" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Tak dapat mengurai perintah:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Eksekusi \"%s\" gagal:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Baru saja" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d menit yang lalu" +msgstr[1] "%d menit yang lalu" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d jam yang lalu" +msgstr[1] "%d jam yang lalu" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Kemarin" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d hari yang lalu" +msgstr[1] "%d hari yang lalu" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d minggu yang lalu" +msgstr[1] "%d minggu yang lalu" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d bulan yang lalu" +msgstr[1] "%d bulan yang lalu" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d tahun yang lalu" +msgstr[1] "%d tahun yang lalu" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Kemarin, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Kemarin, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Log Masuk Area Bersinyal (hotspot)" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Koneksi Anda ke log masuk area bersinyal (hotspot) ini tidak aman. Kata " +"sandi atau informasi lain yang Anda masukkan pada halaman ini dapat dilihat " +"oleh orang-orang di sekitar." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Tolak Akses" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Beri Akses" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Aplikasi yang sering dipakai akan muncul di sini" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Sering" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Semua" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Jendela Baru" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Hapus dari Favorit" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Tambah ke Favorit" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Tampilkan Rincian" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s telah ditambahkan ke favorit Anda." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s telah dihapus dari favorit Anda." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Pilih Perangkat Audio" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Pengaturan Suara" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Headphone" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Headset" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Ubah Latar…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Pengaturan Tampilan" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Pengaturan" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "R" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "K" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Bulan sebelumnya" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Bulan selanjutnya" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Minggu %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Sepanjang Hari" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %d %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %d %B %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Tak Ada Pemberitahuan" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Tak Ada Kejadian" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Bersihkan" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "\"%s\" tidak merespon." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Anda dapat memilih untuk menunggu sebentar untuk melanjutkan atau memaksa " +"aplikasi keluar." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Tutup Paksa" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Tunggu" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Drive eksternal tersambung" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Drive eksternal terputus" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Buka dengan %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Sandi:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Ketik lagi:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Sebagai alternatif Anda dapat terhubung dengan menekan tombol \"WPS\" pada " +"router Anda." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Sambung" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Sandi: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Tombol: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Sandi kunci privat: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identitas: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Layanan: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Otentikasi diperlukan oleh jaringan nirkabel" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Sandi atau kunci enkripsi diperlukan untuk mengakses jaringan nirkabel \"%s" +"\"." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Otentikasi 802.1X kabel" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Nama jaringan: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Otentikasi DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Perlu kode PIN" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Kode PIN diperlukan untuk perangkat data seluler" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Sandi jaringan data seluler" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Manajer Jaringan" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Diperlukan Autentikasi" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Otentikasi" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Maaf, tidak berhasil. Silakan coba lagi." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s sekarang dikenal sebagai %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Jendela" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Tampilkan Aplikasi" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Tambah jam dunia…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Jam Dunia" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Cuaca" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Pilih lokasi…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Memuat…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Pergi daring untuk informasi cuaca" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Informasi cuaca saat ini tidak tersedia" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Keluar %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Keluar" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s akan log keluar otomatis dalam %d detik." +msgstr[1] "%s akan log keluar otomatis dalam %d detik." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Anda akan log keluar otomatis dalam %d detik." +msgstr[1] "Anda akan log keluar otomatis dalam %d detik." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Keluar" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Matikan" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Pasang Pemutakhiran & Matikan" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistem ini akan otomatis dimatikan dalam %d detik." +msgstr[1] "Sistem ini akan otomatis dimatikan dalam %d detik." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Pasang pemutakhiran perangkat lunak yang tertunda" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Nyalakan Ulang" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Matikan" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Nyalakan Ulang" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistem ini akan otomatis dimulai ulang dalam %d detik." +msgstr[1] "Sistem ini akan otomatis dimulai ulang dalam %d detik." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Start Ulang & Pasang Pemutakhiran" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sistem ini akan otomatis dimulai ulang dan memasang pemutakhiran dalam %d " +"detik." +msgstr[1] "" +"Sistem ini akan otomatis dimulai ulang dan memasang pemutakhiran dalam %d " +"detik." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Nyalakan Ulang & Pasang" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Pasang & Matikan" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Matikan daya setelah pemutakhiran dipasang" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Start Ulang & Pasang Peningkatan" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s akan dipasang setelah start ulang. Instalasi peningkatan bisa makan " +"waktu lama: pastikan bahwa Anda telah melakukan back up dan komputer " +"tersambung ke listrik." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Berjalan memakai daya baterai: harap tancapkan sebelum memasang pemutakhiran." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Beberapa aplikasi sedang sibuk atau belum disimpan perubahannya." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Pengguna lain sedang log masuk." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (jarak jauh)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsol)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Pasang" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s ingin mencegah pintasan" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplikasi ingin mencegah pintasan" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Anda dapat memulihkan pintasan dengan menekan %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Tolak" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Izinkan" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Tombol Lambat Dinyalakan" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Tombol Lambat Dimatikan" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Anda hanya menahan tombol Shift selama 8 detik. Ini adalah pintasan untuk " +"fitur Tombol Lambat, yang mempengaruhi cara kerja papan tik Anda." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Tombol Lengket Dinyalakan" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Tombol Lengket Dimatikan" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Anda hanya menekan tombol Shift 5 kali berturut-turut. Ini adalah pintasan " +"untuk fitur Tombol Lengket, yang mempengaruhi cara kerja papan tik Anda." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Anda hanya menekan dua tombol sekaligus, atau menekan tombol Shift 5 kali " +"berturut-turut. Ini mematikan fitur Tombol Lengket, yang mempengaruhi cara " +"kerja papan tik Anda." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Biarkan Menyala" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Nyalakan" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Matikan" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Biarkan Mati" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Pengaturan Wilayah & Bahasa" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Tak ada ekstensi terpasang" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s tidak menampilkan galat apa pun." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Sembunyikan Galat" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Tampilkan Galat" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Diaktifkan" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Dinonaktifkan" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Galat" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Kadaluarsa" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Mengunduh" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Tilik Sumber" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Halaman Web" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Informasi Sistem" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Artis tak dikenal" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Judul tak dikenal" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volume" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Batal" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Gambaran" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Ketik untuk mencari…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Pintasan baru…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Aplikasi yang didefinisikan" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Tampilkan bantuan di layar" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Ganti monitor" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Tetapkan keystroke" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Selesai" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Sunting…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nihil" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Tekan tombol untuk mengkonfigurasi" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Tekan Esc untuk keluar" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Tekan tombol apa saja untuk keluar" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Keluar" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Aktivitas" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistem" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Bar Atas" + +# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^ +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Ketikkan Perintah" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Tutup" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Memulai ulang tidak tersedia di Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Memulai ulang…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d pesan baru" +msgstr[1] "%d pesan baru" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d pemberitahuan baru" +msgstr[1] "%d pemberitahuan baru" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Kunci" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME perlu mengunci layar" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Tak bisa mengunci" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Kunci diblokir oleh suatu aplikasi" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Mencari…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Tak ada yang cocok." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d lagi" +msgstr[1] "%d lagi" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Salin" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Tempel" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Tampilkan Teks" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Sembunyikan Teks" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Sandi" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Ingat Sandi" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Aksesibilitas" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zum" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Pembaca Layar" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Papan Tik di Layar" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Peringatan Visual" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Tombol Lengket" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Tombol Lambat" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Tombol Pantul" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Tombol Tetikus" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Kontras Tinggi" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Teks Besar" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Pengaturan Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d Tersambung" +msgstr[1] "%d Tersambung" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Mati" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Hidup" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Kecerahan" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Papan Ketik" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Tampilkan Tata Letak Papan Tik" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Lokasi Diaktifkan" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Nonaktifkan" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Pengaturan Privasi" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Lokasi Sedang Digunakan" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Koneksi Dinonaktifkan" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Fungsikan" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Beri %s akses ke lokasi Anda?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Akses lokasi dapat diubah setiap saat dari pengaturan privasi." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s Mati" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s Tersambung" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s Tak Dikelola" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s Memutus" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s Menyambung" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s Memerlukan Otentikasi" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware Hilang Untuk %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s Tak tersedia" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Koneksi %s Gagal" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Pengaturan Kabel" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Pengaturan Data Seluler" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s Perangkat Keras Dinonaktifkan" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s Dinonaktifkan" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Sambungkan ke Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Mode Pesawat Terbang Menyala" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi dinonaktifkan ketika mode pesawat terbang menyala." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Matikan Mode Pesawat Terbang" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi Mati" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi perlu dinyalakan untuk menyambung ke suatu jaringan." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Nyalakan Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Jaringan Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Pilih jaringan" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Tiada Jaringan" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Pakai saklar perangkat keras untuk mematikan" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Pilih Jaringan" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Pengaturan Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s Hotspot Aktif" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s Tak Tersambung" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "menyambung…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "diperlukan otentikasi" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "koneksi gagal" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Pengaturan VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN Mati" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Pengaturan Jaringan" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s Koneksi Kabel" +msgstr[1] "%s Koneksi Kabel" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Koneksi Wi-Fi" +msgstr[1] "%s Koneksi Wi-Fi" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s Koneksi Modem" +msgstr[1] "%s Koneksi Modem" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Koneksi gagal" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Aktivasi koneksi jaringan gagal" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Lampu Malam Dinonaktifkan" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Lampu Malam Menyala" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Lanjutkan" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Nonaktifkan Sampai Besok" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Pengaturan Daya" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Terisi Penuh" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Tidak Mengisi Daya" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Memperkirakan…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d:%02d Tersisa (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d Sampai Penuh (%d%%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Layar Sedang Dibagi" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Matikan" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Mode Pesawat Terbang Aktif" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Ganti Pengguna" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Keluar" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Pengaturan Akun" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Kunci Orientasi" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Suspensi" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Matikan" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Perangkat Thunderbolt tak dikenal" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Perangkat baru telah terdeteksi saat Anda pergi. Harap lepaskan dan " +"sambungkan kembali perangkat untuk mulai menggunakannya." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Perangkat Thunderbolt tak dikenal" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Perangkat baru telah terdeteksi dan perlu diautorisasi oleh administrator." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Autorisasi Thunderbolt galat" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Tidak dapat mengautorisasi perangkat Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volume diubah" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Kembar" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Gabung Layar" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Hanya Eksternal" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Hanya Bawaan" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Masuk sebagai pengguna lain" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Buka Kunci Jendela" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplikasi" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Cari" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "'%s' siap" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Apakah Anda ingin mempertahankan pengaturan tampilan ini?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Balikkan Tatanan" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Simpan Perubahan" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Perubahan tatanan akan dikembalikan dalam %d detik" +msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimalkan" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Tak Maksimalkan" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maksimalkan" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Pindah" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Ubah Ukuran" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Pindahkan Bilah Judul Pada Layar" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Selalu di Puncak" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Selalu pada Ruang Kerja yang Tampak" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Pindah ke Ruang Kerja Kiri" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Pindah ke Ruang Kerja Kanan" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Pindah ke Ruang Kerja Atas" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Pindah ke Ruang Kerja Bawah" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Pindah ke Ruang Kerja Atas" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Pindah ke Ruang Kerja Bawah" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Pindahkan ke Monitor Kiri" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Pindahkan ke Monitor Kanan" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution Kalender" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Versi Cetak" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Mode yang dipakai oleh layar log masuk GDM" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Menampilkan mode yang mungkin" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Tak dikenal" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Gagal meluncurkan \"%s\"" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Sandi tidak cocok." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Sandi tidak boleh kosong" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Dialog autentikasi ditolak oleh pengguna" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u Keluaran" +msgstr[1] "%u Keluaran" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u Masukan" +msgstr[1] "%u Masukan" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Suara Sistem" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Ada galat saat memuat dialog preferensi bagi %s:" + +#~ msgid "%s all day." +#~ msgstr "%s sepanjang hari." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, kemudian %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, kemudian %s, diikuti dengan %s nanti." + +#~ msgid "Feels like %s." +#~ msgstr "Terasa seperti %s." + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Matikan" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Keluar" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Ganti pengguna" diff --git a/po/is.po b/po/is.po new file mode 100644 index 0000000..bc1a471 --- /dev/null +++ b/po/is.po @@ -0,0 +1,2448 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Sveinn í Felli , 2015, 2016, 2017, 2019. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2018-10-10 19:07+0000\n" +"PO-Revision-Date: 2019-02-21 11:19+0000\n" +"Last-Translator: Sveinn í Felli \n" +"Language-Team: Icelandic \n" +"Language: is\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: Lokalize 2.0\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Kerfið" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Birta tilkynningalistann" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Áhersla á virka tilkynningu" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Birta yfirlit" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Birta öll forrit" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Birta forritavalmynd" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:142 +msgid "Shell Extensions" +msgstr "Shell Extension skeljarviðbætur" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Stilla GNOME Shell Extension skeljarviðbætur" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME skel" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gluggastjórnun og forritaræsing" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID-auðkenni viðbóta sem á að gera virkar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Gera skeljaviðbætur notanda óvirkar" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Listi yfir auðkenni skjáborðsskráa fyrir uppáhaldsforrit" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Forritavalssýn" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Ferill skipanalínuglugga (Alt+F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Ferill looking-glass skipanalínuglugga (Alt+F)" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Alltaf sýna \"Skrá út\" atriðið í notandavalmyndinni." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Hvort muna eigi lykilorð þegar tengd eru fjartengd eða dulrituð skráakerfi" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Lyklasamsetning til að opna forritavalmyndina" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Lyklasamsetning til að opna forritavalmyndina." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Lyklasamsetning til að opna \"Birta forrit\" sýnina" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Lyklasamsetning til að opna \"Birta forrit\" sýnina í virkniyfirlitinu." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Lyklasamsetning til að opna yfirlitið" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Lyklasamsetning til að opna virkniyfirlitið." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Lyklasamsetning til að víxla sýnileika tilkynningalistans" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Lyklasamsetning til að víxla sýnileika tilkynningalistans." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Lyklasamsetning til að setja virkni á virka tilkynningu" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Lyklasamsetning til að setja virkni á virka tilkynningu." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Hvaða lyklaborð á að nota" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Tegund lyklaborðs sem á að nota." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Takmarka fletti við núverandi vinnusvæði." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ef þetta er satt, verða eingöngu birt forrit sem eru með glugga á núverandi " +"vinnusvæði í flettinum.Annars eru öll forrit höfð með." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Táknmyndinahamur forrits." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Stillir hvernig gluggar birtast í skiptinum. Möguleg gildi eru 'einungis-" +"smámynd' (birtir smámynd gluggans), 'einungis-forritstákn' (birtir aðeins " +"táknmynd forritsins) eða 'bæði'." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ef þetta er satt, verða eingöngu birtir gluggar frá núverandi vinnusvæði í " +"flettinum.Annars eru allir gluggar hafðir með." + +#: data/org.gnome.shell.gschema.xml.in:198 +msgid "Attach modal dialog to the parent window" +msgstr "Festa kvaðningarglugga við yfirglugga" + +#: data/org.gnome.shell.gschema.xml.in:199 +#: data/org.gnome.shell.gschema.xml.in:208 +#: data/org.gnome.shell.gschema.xml.in:216 +#: data/org.gnome.shell.gschema.xml.in:224 +#: data/org.gnome.shell.gschema.xml.in:232 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Þetta hefur forgang fram yfir lykilinn í kjörstillingum org.gnome.mutter " +"þegar GNOME-skelin er keyrð." + +#: data/org.gnome.shell.gschema.xml.in:207 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Virkja flísalögn við jaðra þegar gluggum er sleppt á skjájaðra" + +#: data/org.gnome.shell.gschema.xml.in:215 +msgid "Workspaces are managed dynamically" +msgstr "Vinnusvæðum er stýrt eftir þörfum" + +#: data/org.gnome.shell.gschema.xml.in:223 +msgid "Workspaces only on primary monitor" +msgstr "Vinnusvæði einungis á aðalskjá" + +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Fresta breytingum á virkni í músarham þar til bendillinn hefur stöðvast" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Innskráning á neti" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:112 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Villa kom upp við ræsingu kjörstillingaglugga fyrir %s:" + +#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:62 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 +#: js/ui/endSessionDialog.js:442 js/ui/extensionDownloader.js:197 +#: js/ui/shellMountOperation.js:345 js/ui/status/network.js:905 +msgid "Cancel" +msgstr "Hætta við" + +#: js/gdm/authPrompt.js:166 js/gdm/authPrompt.js:209 js/gdm/authPrompt.js:441 +msgid "Next" +msgstr "Næsta" + +#: js/gdm/authPrompt.js:205 js/ui/shellMountOperation.js:349 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Aflæsa" + +#: js/gdm/authPrompt.js:207 +msgctxt "button" +msgid "Sign In" +msgstr "Skrá inn" + +#: js/gdm/loginDialog.js:319 +msgid "Choose Session" +msgstr "Veldu setu" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:462 +msgid "Not listed?" +msgstr "Ekki á listanum?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:891 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(t.d., notandi eða %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Notandanafn:" + +#: js/gdm/loginDialog.js:1234 +msgid "Login Window" +msgstr "Innskráningargluggi" + +#: js/gdm/util.js:345 +msgid "Authentication error" +msgstr "Auðkenningarvilla" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:485 +msgid "(or swipe finger)" +msgstr "(eða strjúka fingri)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:97 +#| msgid "Power Off" +msgctxt "search-result" +msgid "Power Off" +msgstr "Slökkva" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:100 +#| msgid "power off;shutdown" +msgid "power off;shutdown;reboot;restart" +msgstr "slökkva;hætta;endurræsa" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:104 +#| msgctxt "search-result" +#| msgid "Lock screen" +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Læsa skjá" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:107 +msgid "lock screen" +msgstr "læsa skjá" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:111 +#| msgid "Log Out" +msgctxt "search-result" +msgid "Log Out" +msgstr "Skrá út" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:114 +msgid "logout;sign off" +msgstr "Útskráning;skrá út" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:118 +msgctxt "search-result" +msgid "Suspend" +msgstr "Setja í bið" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:121 +msgid "suspend;sleep" +msgstr "hvíla;svæfa" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:125 +#| msgid "Switch User" +msgctxt "search-result" +msgid "Switch User" +msgstr "Skipta um notanda" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:128 +msgid "switch user" +msgstr "skipta um notanda" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:132 +#| msgctxt "search-result" +#| msgid "Lock orientation" +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Stefnulás" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:135 +#| msgid "lock orientation" +msgid "lock orientation;screen;rotation" +msgstr "læsa stefnu;stefnulás;skjár;snúningur" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Skipun fannst ekki" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Gat ekki þáttað skipun:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Keyrsla '“%s' mistókst:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Í þessum töluðu orðum" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "fyrir %d mínútu síðan" +msgstr[1] "fyrir %d mínútu síðan" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "fyrir %d klukkustund síðan" +msgstr[1] "fyrir %d klukkustundum síðan" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Í gær" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "fyrir %d degi" +msgstr[1] "fyrir %d dögum síðan" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "fyrir %d viku" +msgstr[1] "fyrir %d vikum síðan" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "fyrir %d mánuði" +msgstr[1] "fyrir %d mánuðum" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "fyrir %d ári" +msgstr[1] "fyrir %d árum" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Í gær klukkan H:∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, klukkan %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d. %B, kl. %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d. %B %Y, kl. %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "í gær, kl. %I:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d. %B, kl. %H∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d. %B %Y, kl. %H∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:49 +msgid "Hotspot Login" +msgstr "Innskráning á tengipunkt (hotspot)" + +#: js/portalHelper/main.js:95 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Tenging þín við þennan aðgangsstað er ekki örugg. Aðilar í næsta nágrenni " +"geta séð lykilorð og aðrar upplýsingar sem þú setur inn á þessari síðu." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:46 js/ui/status/location.js:376 +msgid "Deny Access" +msgstr "Hafna aðgangi" + +#: js/ui/accessDialog.js:47 js/ui/status/location.js:379 +msgid "Grant Access" +msgstr "Veita aðgang" + +#: js/ui/appDisplay.js:790 +msgid "Frequently used applications will appear here" +msgstr "Oftast notuð forrit munu birtast hér" + +#: js/ui/appDisplay.js:911 +msgid "Frequent" +msgstr "Algengt" + +#: js/ui/appDisplay.js:918 +msgid "All" +msgstr "Allt" + +#: js/ui/appDisplay.js:1887 +msgid "New Window" +msgstr "Nýr gluggi" + +#: js/ui/appDisplay.js:1901 +msgid "Launch using Dedicated Graphics Card" +msgstr "Ræsa með tileinkuðu skjákorti" + +#: js/ui/appDisplay.js:1928 js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "Fjarlægja úr Eftirlæti" + +#: js/ui/appDisplay.js:1934 +msgid "Add to Favorites" +msgstr "Bæta í Eftirlæti" + +#: js/ui/appDisplay.js:1944 +msgid "Show Details" +msgstr "Sýna ítarlegri upplýsingar" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s var bætt við sem eftirlætisforrit." + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s var fjarlægt úr eftirlætisforritum." + +#: js/ui/audioDeviceSelection.js:50 +msgid "Select Audio Device" +msgstr "Veldu hljóðtæki" + +#: js/ui/audioDeviceSelection.js:60 +msgid "Sound Settings" +msgstr "Hljóðstillingar" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headphones" +msgstr "Heyrnartól" + +#: js/ui/audioDeviceSelection.js:71 +msgid "Headset" +msgstr "Heyrnartól með hljóðnema" + +#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:255 +msgid "Microphone" +msgstr "Hljóðnemi" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Breyta _bakgrunni skjáborðs…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:47 +msgid "Display Settings" +msgstr "Birtingarstillingar" + +#: js/ui/backgroundMenu.js:22 +msgid "Settings" +msgstr "Stillingar" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:44 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:73 +msgctxt "grid sunday" +msgid "S" +msgstr "Su" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:75 +msgctxt "grid monday" +msgid "M" +msgstr "Má" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:77 +msgctxt "grid tuesday" +msgid "T" +msgstr "Þr" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:79 +msgctxt "grid wednesday" +msgid "W" +msgstr "Mi" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:81 +msgctxt "grid thursday" +msgid "T" +msgstr "Fi" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:83 +msgctxt "grid friday" +msgid "F" +msgstr "Fö" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:85 +msgctxt "grid saturday" +msgid "S" +msgstr "La" + +#. * +#. * 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:380 +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:390 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:447 +msgid "Previous month" +msgstr "Fyrri mánuður" + +#: js/ui/calendar.js:457 +msgid "Next month" +msgstr "Næsti mánuður" + +#: js/ui/calendar.js:610 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:665 +msgid "Week %V" +msgstr "Vika %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:734 +msgctxt "event list time" +msgid "All Day" +msgstr "Allan daginn" + +#: js/ui/calendar.js:869 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:873 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: js/ui/calendar.js:1103 +msgid "No Notifications" +msgstr "Engar tilkynningar" + +#: js/ui/calendar.js:1106 +msgid "No Events" +msgstr "Engir atburðir" + +#: js/ui/calendar.js:1134 +msgid "Clear All" +msgstr "Hreinsa allt" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:50 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” svarar ekki." + +#: js/ui/closeDialog.js:51 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Þú getur annað hvort hinkrað augnablik og leyft forritinu að halda áfram eða " +"þú getur þvingað forritið til að slökkva algjörlega á sér." + +#: js/ui/closeDialog.js:67 +msgid "Force Quit" +msgstr "Þvinga til að hætta" + +#: js/ui/closeDialog.js:70 +msgid "Wait" +msgstr "Bíða" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Utanáliggjandi drif tengt" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Utanáliggjandi drif aftengt" + +#: js/ui/components/autorunManager.js:348 +#, javascript-format +msgid "Open with %s" +msgstr "Opna með %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 +msgid "Password:" +msgstr "Lykilorð:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Skrifaðu aftur:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:229 +#: js/ui/status/network.js:320 js/ui/status/network.js:908 +msgid "Connect" +msgstr "Tengjast" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Lykilorð:" + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Lykill:" + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Lykilorð einkalykils:" + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Auðkenni:" + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Þjónusta: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:688 +msgid "Authentication required by wireless network" +msgstr "Auðkenningar er krafist af þráðlausu neti" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:689 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Lykilorða eða dulritunarlykla er krafist til að fá aðgang að þráðlausa " +"netinu “%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:692 +msgid "Wired 802.1X authentication" +msgstr "Kapaltengd 802.1X auðkenning" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Heiti netkerfis:" + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:696 +msgid "DSL authentication" +msgstr "DSL auðkenning" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:702 +msgid "PIN code required" +msgstr "Krafist er PIN-númers" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:703 +msgid "PIN code is needed for the mobile broadband device" +msgstr "" +"Þú þarft að slá inn PIN númer til að þess að tengjast við símaþjónustuna" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:709 +msgid "Mobile broadband network password" +msgstr "Lykilorð fyrir þráðlaust breiðbandsnet" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:693 +#: js/ui/components/networkAgent.js:697 js/ui/components/networkAgent.js:710 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Það er nauðsynlegt að gefa upp lykilorð til að tengjast við “%s”." + +#: js/ui/components/networkAgent.js:677 js/ui/status/network.js:1690 +msgid "Network Manager" +msgstr "Netstjórnun" + +#: js/ui/components/polkitAgent.js:48 +msgid "Authentication Required" +msgstr "Auðkenningar krafist" + +#: js/ui/components/polkitAgent.js:76 +msgid "Administrator" +msgstr "Kerfisstjóri" + +#: js/ui/components/polkitAgent.js:156 +msgid "Authenticate" +msgstr "Auðkenna" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:329 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Æ, þetta virkaði ekki. Endilega reyndu aftur." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:795 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s er nú þekkt(ur) sem %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Gluggar" + +#: js/ui/dash.js:246 js/ui/dash.js:287 +msgid "Show Applications" +msgstr "Sýna forrit" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:444 +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:74 +msgid "%B %e %Y" +msgstr "%e. %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %e. %B, %Y" + +#: js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "Bæta við heimsklukkum…" + +#: js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "Heimsklukkur" + +#: js/ui/dateMenu.js:227 +msgid "Weather" +msgstr "Veður" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:291 +#, javascript-format +msgid "%s all day." +msgstr "%s allan daginn." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:297 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, síðan %s." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:303 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, síðan %s, en snýst svo upp í %s síðar." + +#: js/ui/dateMenu.js:314 +msgid "Select a location…" +msgstr "Veldu staðsetningu…" + +#: js/ui/dateMenu.js:317 +msgid "Loading…" +msgstr "Hleð inn..." + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:323 +#, javascript-format +msgid "Feels like %s." +msgstr "Með vindkælingu %s." + +#: js/ui/dateMenu.js:326 +msgid "Go online for weather information" +msgstr "Fara á netið eftir veðurupplýsingum" + +#: js/ui/dateMenu.js:328 +msgid "Weather information is currently unavailable" +msgstr "Veðurupplýsingar eru ekki tiltækar í augnablikinu" + +#: js/ui/endSessionDialog.js:51 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Skrá út %s" + +#: js/ui/endSessionDialog.js:52 +msgctxt "title" +msgid "Log Out" +msgstr "Skrá út" + +#: js/ui/endSessionDialog.js:54 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s verður skráður út sjálfkrafa eftir %d sekúndu." +msgstr[1] "%s verður skráður út sjálfkrafa eftir %d sekúndur." + +#: js/ui/endSessionDialog.js:59 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Þú verður skráður út sjálfkrafa eftir %d sekúndu." +msgstr[1] "Þú verður skráður út sjálfkrafa eftir %d sekúndur." + +#: js/ui/endSessionDialog.js:65 +msgctxt "button" +msgid "Log Out" +msgstr "Skrá út" + +#: js/ui/endSessionDialog.js:71 +msgctxt "title" +msgid "Power Off" +msgstr "Slökkva" + +#: js/ui/endSessionDialog.js:72 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Setja inn uppfærslur og slökkva" + +#: js/ui/endSessionDialog.js:74 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Kerfið mun slökkva á sér sjálfkrafa eftir %d sekúndu." +msgstr[1] "Kerfið mun slökkva á sér sjálfkrafa eftir %d sekúndur." + +#: js/ui/endSessionDialog.js:78 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Setja inn tiltækar hugbúnaðaruppfærslur" + +#: js/ui/endSessionDialog.js:81 js/ui/endSessionDialog.js:98 +msgctxt "button" +msgid "Restart" +msgstr "Endurræsa" + +#: js/ui/endSessionDialog.js:83 +msgctxt "button" +msgid "Power Off" +msgstr "Slökkva" + +#: js/ui/endSessionDialog.js:90 +msgctxt "title" +msgid "Restart" +msgstr "Endurræsa" + +#: js/ui/endSessionDialog.js:92 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Kerfið mun endurræsast sjálfkrafa eftir %d sekúndu." +msgstr[1] "Kerfið mun endurræsast sjálfkrafa eftir %d sekúndur." + +#: js/ui/endSessionDialog.js:106 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Endurræsa og setja inn uppfærslur" + +#: js/ui/endSessionDialog.js:108 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Kerfið mun endurræsast sjálfkrafa og setja inn uppfærslur eftir %d sekúndu." +msgstr[1] "" +"Kerfið mun endurræsast sjálfkrafa og setja inn uppfærslur eftir %d sekúndur." + +#: js/ui/endSessionDialog.js:114 js/ui/endSessionDialog.js:134 +msgctxt "button" +msgid "Restart & Install" +msgstr "Endurræsa & setja inn uppfærslur" + +#: js/ui/endSessionDialog.js:115 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Setja inn & slökkva" + +#: js/ui/endSessionDialog.js:116 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Slökkva á vélinni eftir að uppfærslur hafa verið settar inn" + +#: js/ui/endSessionDialog.js:124 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Endurræsa og setja inn uppfærslur" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:129 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s verður sett upp eftir endurræsingu. Uppfærsla uppsetningar getur tekið " +"langan tíma: gakktu úr skugga um að þú hafir tekið öryggisafrit og að tölvan " +"sé tengd við rafmagn." + +#: js/ui/endSessionDialog.js:321 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Vélin notar nú rafhlöðu: stingdu henni í samband við rafmagn áður enn " +"uppfærslur eru settar inn." + +#: js/ui/endSessionDialog.js:338 +msgid "Some applications are busy or have unsaved work." +msgstr "Sum forrit eru upptekin eða eru með óvistuð gögn." + +#: js/ui/endSessionDialog.js:345 +msgid "Other users are logged in." +msgstr "Aðrir notendur eru skráðir inn." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:626 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (fjartengt)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:629 +#, javascript-format +msgid "%s (console)" +msgstr "%s (villuskjár)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Setja inn" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Sækja og setja upp '%s' frá extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vill koma í veg fyrir notkun flýtilykla" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Forrit vill koma í veg fyrir notkun flýtilykla" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Þú getur endurheimt flýtilykla með því að ýta á %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Hafna" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Leyfa" + +#: js/ui/kbdA11yDialog.js:33 +#| msgid "Slow Keys" +msgid "Slow Keys Turned On" +msgstr "Kveikt á hægum lyklum" + +#: js/ui/kbdA11yDialog.js:34 +#| msgid "Slow Keys" +msgid "Slow Keys Turned Off" +msgstr "Slökkt á hægum lyklum" + +#: 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 "" + +#: js/ui/kbdA11yDialog.js:42 +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned On" +msgstr "Kveikt á klístruðum lyklum" + +#: js/ui/kbdA11yDialog.js:43 +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned Off" +msgstr "Slökkt á klístruðum lyklum" + +#: 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 "" + +#: 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 "" + +#: js/ui/kbdA11yDialog.js:59 +msgid "Leave On" +msgstr "Halda kveiktu" + +#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:138 +#: js/ui/status/network.js:1280 +msgid "Turn On" +msgstr "Kveikja á" + +#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:138 +#: js/ui/status/network.js:138 js/ui/status/network.js:321 +#: js/ui/status/network.js:1280 js/ui/status/network.js:1395 +#: js/ui/status/nightLight.js:43 js/ui/status/rfkill.js:85 +#: js/ui/status/rfkill.js:112 +msgid "Turn Off" +msgstr "Slökkva" + +#: js/ui/kbdA11yDialog.js:67 +msgid "Leave Off" +msgstr "Halda slökktu" + +#: js/ui/keyboard.js:198 +#| msgid "Date & Time Settings" +msgid "Region & Language Settings" +msgstr "Lands- & tungumálastillingar" + +#: js/ui/lookingGlass.js:644 +msgid "No extensions installed" +msgstr "Engar viðbætur uppsettar" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:698 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s gaf ekki frá sér neinar villur." + +#: js/ui/lookingGlass.js:704 +msgid "Hide Errors" +msgstr "Fela villur" + +#: js/ui/lookingGlass.js:708 js/ui/lookingGlass.js:768 +msgid "Show Errors" +msgstr "Birta villur" + +#: js/ui/lookingGlass.js:717 +msgid "Enabled" +msgstr "Virkt" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:720 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Óvirkt" + +#: js/ui/lookingGlass.js:722 +msgid "Error" +msgstr "Villa" + +#: js/ui/lookingGlass.js:724 +msgid "Out of date" +msgstr "Útrunnið" + +#: js/ui/lookingGlass.js:726 +msgid "Downloading" +msgstr "Hala inn" + +#: js/ui/lookingGlass.js:750 +msgid "View Source" +msgstr "Skoða frumtexta" + +#: js/ui/lookingGlass.js:759 +msgid "Web Page" +msgstr "Vefsíða" + +#: js/ui/messageTray.js:1495 +msgid "System Information" +msgstr "Kerfisupplýsingar" + +#: js/ui/mpris.js:185 +msgid "Unknown artist" +msgstr "Óþekktur flytjandi" + +#: js/ui/mpris.js:186 +msgid "Unknown title" +msgstr "Óþekktur titill" + +#: js/ui/osdWindow.js:32 js/ui/status/volume.js:204 +msgid "Volume" +msgstr "Hljóðstyrkur" + +#: js/ui/overview.js:83 +msgid "Undo" +msgstr "Afturkalla" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:112 +msgid "Overview" +msgstr "Yfirlit" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:239 +msgid "Type to search…" +msgstr "Skrifaðu hér til að leita..." + +#: js/ui/padOsd.js:107 +msgid "New shortcut…" +msgstr "Nýr flýtilykill..." + +#: js/ui/padOsd.js:158 +msgid "Application defined" +msgstr "Forrit skilgreint" + +#: js/ui/padOsd.js:159 +msgid "Show on-screen help" +msgstr "Birta upplýsingar á skjá" + +#: js/ui/padOsd.js:160 +msgid "Switch monitor" +msgstr "Skipta um skjá" + +#: js/ui/padOsd.js:161 +msgid "Assign keystroke" +msgstr "Úthluta lyklaslætti" + +#: js/ui/padOsd.js:228 +msgid "Done" +msgstr "Lokið" + +#: js/ui/padOsd.js:744 +msgid "Edit…" +msgstr "Breyta…" + +#: js/ui/padOsd.js:786 js/ui/padOsd.js:891 +msgid "None" +msgstr "Ekkert" + +#: js/ui/padOsd.js:845 +msgid "Press a button to configure" +msgstr "Ýttu á hnapp til að stilla" + +#: js/ui/padOsd.js:846 +msgid "Press Esc to exit" +msgstr "Ýttu á ESC til að hætta" + +#: js/ui/padOsd.js:849 +msgid "Press any key to exit" +msgstr "Ýttu á einhvern lykil til að hætta" + +#: js/ui/panel.js:359 +msgid "Quit" +msgstr "Hætta" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:415 +msgid "Activities" +msgstr "Virkni" + +#: js/ui/panel.js:696 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Kerfið" + +#: js/ui/panel.js:820 +msgid "Top Bar" +msgstr "Toppstika" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:300 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:74 +msgid "Enter a Command" +msgstr "Settu inn skipun" + +#: js/ui/runDialog.js:114 js/ui/windowMenu.js:174 +msgid "Close" +msgstr "Loka" + +#: js/ui/runDialog.js:276 +msgid "Restart is not available on Wayland" +msgstr "Endurræsing er ekki tiltæk á Wayland" + +#: js/ui/runDialog.js:281 +msgid "Restarting…" +msgstr "Endurræsi…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nýtt skilaboð" +msgstr[1] "%d ný skilaboð" + +#: js/ui/screenShield.js:148 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ný skilaboð" +msgstr[1] "%d ný skilaboð" + +#: js/ui/screenShield.js:451 js/ui/status/system.js:294 +msgid "Lock" +msgstr "Læsa" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "GNOME þarf að læsa skjánum" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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:1309 +msgid "Unable to lock" +msgstr "Gat ekki læst skjá" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1310 +msgid "Lock was blocked by an application" +msgstr "Læsing var hindruð af öðru forriti" + +#: js/ui/search.js:660 +msgid "Searching…" +msgstr "Leita..." + +#: js/ui/search.js:662 +msgid "No results." +msgstr "Engar niðurstöður." + +#: js/ui/search.js:786 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d til viðbótar" +msgstr[1] "%d til viðbótar" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Afrita" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Líma" + +#: js/ui/shellEntry.js:96 +msgid "Show Text" +msgstr "Sýna texta" + +#: js/ui/shellEntry.js:98 +msgid "Hide Text" +msgstr "Fela texta" + +#: js/ui/shellMountOperation.js:316 +msgid "Password" +msgstr "Lykilorð" + +#: js/ui/shellMountOperation.js:337 +msgid "Remember Password" +msgstr "Muna lykilorð" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Aukið aðgengi" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Aðdráttur" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Skjálesari" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Skjályklaborð" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Sjónrænar viðvaranir" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Klístraðir lyklar" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Hægir lyklar" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Lyklaendurvarp" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Músarlyklar" + +#: js/ui/status/accessibility.js:165 +msgid "High Contrast" +msgstr "Mikil birtuskil" + +#: js/ui/status/accessibility.js:200 +msgid "Large Text" +msgstr "Stór texti" + +#: js/ui/status/bluetooth.js:43 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:52 js/ui/status/network.js:600 +msgid "Bluetooth Settings" +msgstr "Stillingar Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:132 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d tengt" +msgstr[1] "%d tengt" + +#: js/ui/status/bluetooth.js:134 +msgid "Off" +msgstr "Slökkt" + +#: js/ui/status/bluetooth.js:136 +msgid "On" +msgstr "Á" + +#: js/ui/status/brightness.js:41 +msgid "Brightness" +msgstr "Birtustig" + +#: js/ui/status/keyboard.js:781 +msgid "Keyboard" +msgstr "Lyklaborð" + +#: js/ui/status/keyboard.js:804 +msgid "Show Keyboard Layout" +msgstr "Birta lyklaborðsuppsetningu" + +#: js/ui/status/location.js:72 js/ui/status/location.js:180 +msgid "Location Enabled" +msgstr "Staðsetning virk" + +#: js/ui/status/location.js:73 js/ui/status/location.js:181 +msgid "Disable" +msgstr "Gera óvirkt" + +#: js/ui/status/location.js:74 +msgid "Privacy Settings" +msgstr "Stillingar á friðhelgi" + +#: js/ui/status/location.js:179 +msgid "Location In Use" +msgstr "Staðsetning í notkun" + +#: js/ui/status/location.js:183 +msgid "Location Disabled" +msgstr "Staðsetning óvirk" + +#: js/ui/status/location.js:184 +msgid "Enable" +msgstr "Virkja" + +#. Translators: %s is an application name +#: js/ui/status/location.js:369 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Á að gefa %s aðgang að staðsetningunni þinni?" + +#: js/ui/status/location.js:370 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Hægt er að breyta aðgangi að staðsetningu hvenær sem er með því að fara í " +"stillingaforritið fyrir gagnaleynd." + +#: js/ui/status/network.js:74 +msgid "" +msgstr "<óþekkt>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 js/ui/status/network.js:1309 +#, javascript-format +msgid "%s Off" +msgstr "%s slökkt" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:430 +#, javascript-format +msgid "%s Connected" +msgstr "%s tengt" + +#. 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:435 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s óstýrt" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:438 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s aftengist" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:445 js/ui/status/network.js:1301 +#, javascript-format +msgid "%s Connecting" +msgstr "%s tengist" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:448 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s krefst auðkenningar" + +#. 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:456 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Grunnhugbúnað (firmware) vantar fyrir %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:460 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s er ekki tiltækt" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:463 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s tenging mistókst" + +#: js/ui/status/network.js:479 +msgid "Wired Settings" +msgstr "Stillingar nets um kapal" + +#: js/ui/status/network.js:521 +msgid "Mobile Broadband Settings" +msgstr "Stillingar ferðabreiðbands" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:564 js/ui/status/network.js:1306 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s vélbúnaður óvirkur" + +#. 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:568 +#, javascript-format +msgid "%s Disabled" +msgstr "%s óvirkt" + +#: js/ui/status/network.js:608 +msgid "Connect to Internet" +msgstr "Tengjast internetinu" + +#: js/ui/status/network.js:802 +msgid "Airplane Mode is On" +msgstr "Flugvélahamur virkur" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Þráðlaust Wi-Fi net er óvirkt þegar flugvélahamur er virkur." + +#: js/ui/status/network.js:804 +msgid "Turn Off Airplane Mode" +msgstr "Slökkva á flugvélaham" + +#: js/ui/status/network.js:813 +msgid "Wi-Fi is Off" +msgstr "Slökkt á þráðlausu neti" + +#: js/ui/status/network.js:814 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Kveikja verður á þráðlausu Wi-Fi neti til að tengjast netkerfi." + +#: js/ui/status/network.js:815 +msgid "Turn On Wi-Fi" +msgstr "Kveikja á þráðlausu neti" + +#: js/ui/status/network.js:840 +msgid "Wi-Fi Networks" +msgstr "Þráðlaus Wi-Fi netkerfi" + +#: js/ui/status/network.js:842 +msgid "Select a network" +msgstr "Veldu netkerfi" + +#: js/ui/status/network.js:872 +msgid "No Networks" +msgstr "Engin netkerfi" + +#: js/ui/status/network.js:893 js/ui/status/rfkill.js:110 +msgid "Use hardware switch to turn off" +msgstr "Nota vélbúnaðarrofa til að slökkva." + +#: js/ui/status/network.js:1172 +msgid "Select Network" +msgstr "Veldu netkerfi" + +#: js/ui/status/network.js:1178 +msgid "Wi-Fi Settings" +msgstr "Stillingar þráðlauss netkerfis" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1297 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Þráðlausi tengipunkturinn %s virkur" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1312 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s ekki tengdur" + +#: js/ui/status/network.js:1412 +msgid "connecting…" +msgstr "tengist..." + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1415 +msgid "authentication required" +msgstr "auðkenningar krafist" + +#: js/ui/status/network.js:1417 +msgid "connection failed" +msgstr "tenging mistókst" + +#: js/ui/status/network.js:1471 +msgid "VPN Settings" +msgstr "VPN stillingar" + +#: js/ui/status/network.js:1484 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1494 +msgid "VPN Off" +msgstr "Slökkt á VPN" + +#: js/ui/status/network.js:1558 js/ui/status/rfkill.js:88 +msgid "Network Settings" +msgstr "Stillingar nets" + +#: js/ui/status/network.js:1587 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s þráðlaus tenging" +msgstr[1] "%s þráðlausar tengingar" + +#: js/ui/status/network.js:1591 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi tenging" +msgstr[1] "%s Wi-Fi tengingar" + +#: js/ui/status/network.js:1595 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s mótaldstenging" +msgstr[1] "%s mótaldstengingar" + +#: js/ui/status/network.js:1727 +msgid "Connection failed" +msgstr "Tenging mistókst" + +#: js/ui/status/network.js:1728 +msgid "Activation of network connection failed" +msgstr "Mistókst að virkja nettengingu" + +#: js/ui/status/nightLight.js:64 +msgid "Night Light Disabled" +msgstr "Næturlýsing óvirk" + +#: js/ui/status/nightLight.js:65 +msgid "Night Light On" +msgstr "Næturlýsing á" + +#: js/ui/status/nightLight.js:66 +msgid "Resume" +msgstr "Halda áfram" + +#: js/ui/status/nightLight.js:67 +msgid "Disable Until Tomorrow" +msgstr "Óvirkt þar til á morgun" + +#: js/ui/status/power.js:52 +msgid "Power Settings" +msgstr "Orkustillingar" + +#: js/ui/status/power.js:68 +msgid "Fully Charged" +msgstr "Full hleðsla" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:75 js/ui/status/power.js:81 +msgid "Estimating…" +msgstr "Reikna…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d eftir (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:94 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d þar til fullhlaðið (%d%%)" + +#: js/ui/status/power.js:122 js/ui/status/power.js:124 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:46 +msgid "Screen is Being Shared" +msgstr "Skjánum er deilt með e-n" + +#: js/ui/status/remoteAccess.js:48 +#| msgid "Turn Off" +msgid "Turn off" +msgstr "Slökkva" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:83 +msgid "Airplane Mode On" +msgstr "Flugvélahamur virkur" + +#: js/ui/status/system.js:227 +msgid "Switch User" +msgstr "Skipta um notanda" + +#: js/ui/status/system.js:239 +msgid "Log Out" +msgstr "Skrá út" + +#: js/ui/status/system.js:251 +msgid "Account Settings" +msgstr "Stillingar aðgangs" + +#: js/ui/status/system.js:279 +msgid "Orientation Lock" +msgstr "Stefnulás" + +#: js/ui/status/system.js:305 +msgid "Suspend" +msgstr "Hvíla" + +#: js/ui/status/system.js:315 +msgid "Power Off" +msgstr "Slökkva" + +#: js/ui/status/thunderbolt.js:268 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#. we are done +#: js/ui/status/thunderbolt.js:324 +msgid "Unknown Thunderbolt device" +msgstr "Óþekkt Thunderbolt-tæki" + +#: js/ui/status/thunderbolt.js:325 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" + +#: js/ui/status/thunderbolt.js:330 +msgid "Thunderbolt authorization error" +msgstr "Villa í auðkenningu á Thunderbolt" + +#: js/ui/status/thunderbolt.js:331 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Gat ekki auðkennt Thunderbolt-tæki: %s" + +#: js/ui/status/volume.js:135 +msgid "Volume changed" +msgstr "Hljóðstyrkur breyttist" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Spegla" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Tengja skjái" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Einungis utanáliggjandi" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Einungis innbyggt" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Skrá inn sem annar notandi" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Aflæsa glugga" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Forrit" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Leita" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s' er tilbúið" + +#: js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "Viltu halda þessum skjástillingum?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:75 +msgid "Revert Settings" +msgstr "Afturkalla stillingar" + +#: js/ui/windowManager.js:78 +msgid "Keep Changes" +msgstr "Halda breytingum" + +#: js/ui/windowManager.js:96 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Breytingar á stillingum verða afturkallaðar eftir %d sekúndu" +msgstr[1] "Breytingar á stillingum verða afturkallaðar eftir %d sekúndur" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:681 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Lágmarka" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Minnka glugga" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Hámarka" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Færa" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Breyta stærð" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Flytja titilslá á skjáinn" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Alltaf efst" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Alltaf á sjáanlegu vinnusvæði" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Flytja á vinnusvæðið til vinstri" + +#: js/ui/windowMenu.js:109 +msgid "Move to Workspace Right" +msgstr "Flytja á vinnusvæðið til hægri" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Færa yfir á vinnusvæði fyrir ofan" + +#: js/ui/windowMenu.js:121 +msgid "Move to Workspace Down" +msgstr "Færa yfir á vinnusvæði fyrir neðan" + +#: js/ui/windowMenu.js:139 +msgid "Move to Monitor Up" +msgstr "Færa á skjá fyrir ofan" + +#: js/ui/windowMenu.js:148 +msgid "Move to Monitor Down" +msgstr "Færa á skjá fyrir neðan" + +#: js/ui/windowMenu.js:157 +msgid "Move to Monitor Left" +msgstr "Færa á skjá til vinstri" + +#: js/ui/windowMenu.js:166 +msgid "Move to Monitor Right" +msgstr "Færa á skjá til hægri" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution dagatal" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:410 +msgid "Print version" +msgstr "Prenta útgáfunúmer" + +#: src/main.c:416 +msgid "Mode used by GDM for login screen" +msgstr "Hamur sem GDM notar fyrir innskráningarglugga" + +#: src/main.c:422 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Nota sérstakan ham, t.d. \"gdm\" fyrir innskráningarskjá" + +#: src/main.c:428 +msgid "List possible modes" +msgstr "Sýna alla mögulega hami" + +#: src/shell-app.c:272 +msgctxt "program" +msgid "Unknown" +msgstr "Óþekkt" + +#: src/shell-app.c:523 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Mistókst að ræsa \"“%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Lykilorðin stemma ekki" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Lykilorðið getur ekki verið autt" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Notandi hafnaði auðkenningarglugga" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u úttak" +msgstr[1] "%u úttök" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u inntak" +msgstr[1] "%u inntök" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Kerfishljóð" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Slökkva" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Skrá út" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Skipta um notanda" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Kjörstillingar GNOME Shell Extension skeljarviðbóta" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Endurbeining á vefauðkenningu" + +#~ msgid "Events" +#~ msgstr "Atburðir" + +#~ msgid "Notifications" +#~ msgstr "Tilkynningar" + +#~ msgid "Hide tray" +#~ msgstr "Fela kerfisbakka" + +#~ msgid "Status Icons" +#~ msgstr "Táknmyndir fyrir stöðu" + +#~ msgid "Clear section" +#~ msgstr "Hreinsa kafla" + +#~ msgid "Media" +#~ msgstr "Gagnamiðill" + +#~ msgid "Not In Use" +#~ msgstr "Ekki í notkun" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Sýna vikudag í dagatali" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "" +#~ "Ef merkt er við þetta sem satt þá mun ISO-vikunúmer vera sýnt í " +#~ "dagatalinu." + +#~ msgid "Use as Internet connection" +#~ msgstr "Nota sem internettengingu" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME skel (wayland skjásamsetning)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d tengt tæki" +#~ msgstr[1] "%d tengd tæki" + +#~ msgid "Authentication required" +#~ msgstr "Auðkenningar krafist" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Rafhlaða" + +#~ msgid "Airplane Mode" +#~ msgstr "Flugvélahamur" + +#~ msgid "Show the message tray" +#~ msgstr "Birta skilaboðabakka" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Su" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Má" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Þr" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Mi" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Fi" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Fö" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "La" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Ekkert á dagskrá" + +#~ msgid "Today" +#~ msgstr "Í dag" + +#~ msgid "Tomorrow" +#~ msgstr "Á morgun" + +#~ msgid "This week" +#~ msgstr "Í þessari viku" + +#~ msgid "Next week" +#~ msgstr "Í næstu viku" + +#~ msgid "Removable Devices" +#~ msgstr "Útskiptanleg tæki" + +#~ msgid "Eject" +#~ msgstr "Spýta út" + +#~ msgid "Invitation" +#~ msgstr "Boð" + +#~ msgid "Call" +#~ msgstr "Símtal" + +#~ msgid "File Transfer" +#~ msgstr "Skráaflutningur" + +#~ msgid "Chat" +#~ msgstr "Spjall" + +#~ msgid "Unmute" +#~ msgstr "Kveikja á hljóði" + +#~ msgid "Mute" +#~ msgstr "Þagga niður" + +#~ msgid "Invitation to %s" +#~ msgstr "Boð til %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s er að bjóða þér að taka þátt í %s" + +#~ msgid "Decline" +#~ msgstr "Hafna" + +#~ msgid "Accept" +#~ msgstr "Samþykkja" + +#~ msgid "Video call from %s" +#~ msgstr "Myndsímtal frá %s" + +#~ msgid "Call from %s" +#~ msgstr "Símtal frá %s" + +#~ msgid "Answer" +#~ msgstr "Svara" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s er að senda þér %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s vill fá heimild til að sjá hvenær þú ert tengd/ur" + +#~ msgid "Authentication failed" +#~ msgstr "Auðkenning mistókst" + +#~ msgid "Encryption error" +#~ msgstr "Dulritunarvilla" + +#~ msgid "Certificate not provided" +#~ msgstr "Skilríki fylgir ekki" + +#~ msgid "Certificate untrusted" +#~ msgstr "Skilríki ekki treyst" + +#~ msgid "Certificate expired" +#~ msgstr "Skilríki er útrunnið" + +#~ msgid "Certificate not activated" +#~ msgstr "Skilríki ekki virkjað" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Vélarheiti skilríkis samsvara ekki" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Fingraför skilríkis samsvara ekki" + +#~ msgid "Certificate self-signed" +#~ msgstr "Skilríki aðeins undirritað af handhafa" + +#~ msgid "Status is set to offline" +#~ msgstr "Staða er sett á ótengda" + +#~ msgid "Certificate is invalid" +#~ msgstr "Skilríkið er ekki gilt" + +#~ msgid "Connection has been refused" +#~ msgstr "Tengingu hefur verið hafnað" + +#~ msgid "Connection can't be established" +#~ msgstr "Ekki er hægt að koma á tengingu" + +#~ msgid "Connection has been lost" +#~ msgstr "Tenging hefur slitnað" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Þessi aðgangur er þegar tengdur miðlaranum" + +#~ msgid "The account already exists on the server" +#~ msgstr "Aðgangurinn er þegar til á miðlaranum" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "" +#~ "Miðlarinn er of upptekinn í augnablikinu til að meðhöndla tenginguna" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Skilríkið hefur veriið afturkallað" + +#~ msgid "Internal error" +#~ msgstr "Innvær villa" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Ekki tókst að tengjast %s" + +#~ msgid "View account" +#~ msgstr "Skoða aðgang" + +#~ msgid "Open Calendar" +#~ msgstr "Opna dagatal" + +#~ msgid "Open" +#~ msgstr "Opna" + +#~ msgid "Remove" +#~ msgstr "Fjarlægja" + +#~ msgid "Clear Messages" +#~ msgstr "Hreinsa skilaboð" + +#~ msgid "Notification Settings" +#~ msgstr "Stillingar á tilkynningum" + +#~ msgid "Tray Menu" +#~ msgstr "Valmynd í kerfisbakka" + +#~ msgid "No Messages" +#~ msgstr "Engin skilaboð" + +#~ msgid "Message Tray" +#~ msgstr "Skilaboðabakki" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..9995042 --- /dev/null +++ b/po/it.po @@ -0,0 +1,2318 @@ +# Italian translations for gnome-shell package. +# Copyright (C) 2009, 2010, the gnome-shell copyright holder +# Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 the Free Software Foundation +# Copyright (C) 2019 the Free Software Foundation +# This file is distributed under the same license as the gnome-shell package. +# +# Milo Casagrande , 2009, 2010, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# Luca Ferretti , 2010, 2011, 2012, 2013, 2014. +# Gianvito Cavasoli , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-25 14:25+0000\n" +"PO-Revision-Date: 2019-02-26 09:57+0100\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italiano \n" +"Language: it\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.2.1\n" +"X-DamnedLies-Scope: partial\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Mostra l'elenco delle notifiche" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Dà il focus alla notifica attiva" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Mostra la panoramica" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Mostra tutte le applicazioni" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Apre il menù applicazioni" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Estensioni della Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configura le estensioni di GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gestione finestre e avvio applicazioni" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Abilita gli strumenti interni utili a sviluppatori e collaudatori attraverso " +"Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Consente l'accesso agli strumenti interni di debug e monitoraggio " +"utilizzando la finestra di dialogo Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID delle estensioni da abilitare" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Le estensioni per la GNOME Shell dispongono di una proprietà UUID: questa " +"chiave elenca le estensioni da caricare. È necessario inserire in questo " +"elenco ogni estensione che si vuole caricare. È anche possibile modificare " +"questo elenco con i metodi DBus EnableExtension e DisableExtension su org." +"gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Disabilita le estensioni utente" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Disabilita tutte le estensioni abilitate dall'utente senza influire " +"sull'impostazione \"enabled-extension\"." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" +"Disabilita la convalida della compatibilità con le versioni delle estensioni" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell carica solo le estensioni che dichiarano di supportare la " +"versione di GNOME Shell attualmente in esecuzione. Abilitando questa opzione " +"verrà disabilitato tale controllo e verrà tentato il caricamento di tutte le " +"estensioni, senza distinzione sulla versione supportata dichiarata." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Elenco di ID di file desktop per le applicazioni preferite" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Le applicazioni che corrispondono a questi identificatori vengono " +"visualizzate nell'area dei preferiti." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Vista selettore app" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Indice della vista attualmente selezionata nel selettore di applicazioni." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Cronologia per la finestra di dialogo dei comandi (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Cronologia per la finestra di dialogo \"looking glass\"" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Mostra sempre la voce \"Termina sessione\" nel menù utente." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Questa chiave sovrascrive la scomparsa automatica della voce di menù " +"\"Termina sessione\" nelle modalità singolo utente e sessione singola." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Indica se ricordare la password per montare file system remoti o cifrati" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"La shell richiederà una password quando un dispositivo cifrato o un file " +"system remoto viene montato. Se la password può essere salvata, viene " +"aggiunta la corrispettiva casella di selezione. Questa chiave imposta lo " +"stato predefinito di tale casella." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Indica se l'adattatore Bluetooth predefinito abbia avuto del dispositivi " +"associati" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Viene visualizzato un elemento nel menù Bluetooth solamente se un adattatore " +"Bluetooth è alimentato o se altri dispositivi sono stati associati con " +"l'adattatore predefinito. Ciò viene reimpostato se l'adattatore predefinito " +"non risulterà avere dispositivi associati." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Abilita l'API d'introspezione" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Abilita un'API D-Bus che permette di eseguire l'introspezione dello stato " +"dell'applicazione della shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Associazione di tasti per aprire il menù delle applicazioni" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Associazione di tasti per aprire il menù delle applicazioni." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Associazione di tasti per aprire la vista \"Mostra applicazioni\"" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Associazione di tasti per aprire la vista \"Mostra applicazioni\" della " +"panoramica Attività." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Associazione di tasti per aprire la panoramica" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Associazione di tasti per aprire la panoramica delle attività." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Associazione di tasti per commutare la visibilità dell'elenco delle notifiche" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Associazione di tasti per commutare la visibilità dell'elenco delle " +"notifiche." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Associazione di tasti per dare il focus alla notifica attiva" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Associazione di tasti per dare il focus alla notifica attiva." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Associazione di tasti per mettere in pausa e ripristinare tutti i tween in " +"esecuzione, a scopo di debug" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Passa all'applicazione 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Passa all'applicazione 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Passa all'applicazione 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Passa all'applicazione 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Passa all'applicazione 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Passa all'applicazione 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Passa all'applicazione 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Passa all'applicazione 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Passa all'applicazione 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Quale tastiera usare" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Il tipo di tastiera da usare." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limita il selettore allo spazio di lavoro in uso." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Se impostata a VERO, nel selettore sono mostrate solo le applicazioni che " +"hanno finestre nello spazio di lavoro attualmente in uso. In caso contrario " +"sono incluse tutte le applicazioni." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "La modalità dell'icona dell'applicazione." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configura come le finestre vengono mostrate nel selettore. Valori consentiti " +"sono: \"thumbnail-only\" (mostra una miniatura della finestra), \"app-icon-" +"only\" (mostra solo l'icona dell'applicazione) oppure \"both\"." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Se impostata a vero, nel selettore sono mostrate solo le finestre dello " +"spazio di lavoro attualmente in uso. In caso contrario sono incluse tutte le " +"finestre." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Collega la finestra modale a quella genitore" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Questa chiave sovrascrive la chiave in org.gnome.mutter quando si esegue " +"GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Abilita il tiling di bordo quando si trascinano le finestre sui bordi dello " +"schermo" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Gli spazi di lavoro sono gestiti dinamicamente" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Gli spazi di lavoro sono solo sul monitor primario" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Ritarda il cambio del focus nella modalità mouse finché il puntatore non si " +"ferma" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Accesso di rete" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Qualcosa è andato storto" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Si è verificato un problema: non è possibile visualizzare le impostazioni di " +"questa estensione. È consigliato segnalare il problema agli autori " +"dell'estensione." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Dettagli tecnici" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Copia errore" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Sito web" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Sito web dell'estensione" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Nessuna estensione installata" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"È possibile installare estensioni utilizzando «Software» o tramite il sito " +"web extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Esplora in Software" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Annulla" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Avanti" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Sblocca" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Accedi" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Scegli sessione" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Non elencato?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(per es. utente o %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Nome utente: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Finestra di accesso" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Errore di autenticazione" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(o scorrere con il dito)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Spegni" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "spegni;arresta;ferma;stop;riavvia;" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Blocca schermo" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "blocca schermo" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Termina sessione" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "termina sessione;esci" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Sospendi" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "sospendi;riposo" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Cambia utente" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "cambia utente" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Blocca orientazione" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "blocca orientazione;schermo;rotazione" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Comando non trovato" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Impossibile riconoscere il comando:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Esecuzione di «%s» non riuscita:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Adesso" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuto fa" +msgstr[1] "%d minuti fa" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ora fa" +msgstr[1] "%d ore fa" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Ieri" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d giorno fa" +msgstr[1] "%d giorni fa" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d settimana fa" +msgstr[1] "%d settimane fa" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d mese fa" +msgstr[1] "%d mesi fa" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d anno fa" +msgstr[1] "%d anni fa" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ieri, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%e %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%e %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%I∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ieri, %I∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %I∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%e %B, %I∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%e %B %Y, %I∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Accesso hotspot" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"La connessione per l'accesso a questo hotspot non è sicura. Le password e le " +"altre informazioni inviate possono essere lette da altri." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Nega accesso" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Consenti accesso" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Qui saranno mostrate le applicazioni usate frequentemente" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Frequenti" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Tutte" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Nuova finestra" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Lancia utilizzando scheda grafica dedicata" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Rimuovi dai preferiti" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Aggiungi ai preferiti" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Mostra dettagli" + +# (ndt) e usare: +# L'elemento %s è stato rimosso... ? +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s è stato aggiunto ai preferiti." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s è stato rimosso dai preferiti." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Seleziona dispositivo audio" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Impostazioni audio" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Cuffie" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Cuffie con microfono" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Microfono" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Cambia sfondo…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Impostazioni monitor" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Impostazioni" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "G" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Mese precedente" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Mese successivo" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Settimana %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Giornata" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %e %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %e %B %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Nessuna notifica" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Nessun evento" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Pulisci" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» non risponde." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"È possibile scegliere se attendere, lasciando che l'applicazione continui, " +"oppure forzare la sua chiusura." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Uscita forzata" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Attendi" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Unità esterna collegata" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Unità esterna scollegata" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Apri con %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Password:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Inserire di nuovo:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"In alternativa è possibile collegarsi premendo il pulsante «WPS» del router." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Connetti" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Password: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Chiave: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Password chiave privata: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identità: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Servizio: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Richiesta autenticazione dalla rete wireless" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"È richiesta una password o una chiave di cifratura per accedere alla rete " +"wireless «%s»." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Autenticazione via cavo 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Nome rete: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Autenticazione DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Richiesto codice PIN" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "È necessario il codice PIN per il dispositivo a banda larga mobile" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Password rete banda larga mobile" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "È richiesta una password per connettersi a «%s»." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Gestore reti" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Richiesta autenticazione" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Amministratore" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Autentica" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Errore nell'autenticazione. Provare di nuovo." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s ha cambiato nome in %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Finestre" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Mostra applicazioni" + +# cruscotto?!?!?!?!?!?!? +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Aggiungi orologi mondiali…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Orologi mondiali" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Meteo" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Seleziona una posizione…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Caricamento…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Collegarsi a Internet per le informazioni meteo" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Le informazioni meteo non sono disponibili" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Termina sessione di %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Termina sessione" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "La sessione di %s verrà terminata automaticamente tra %d secondo." +msgstr[1] "La sessione di %s verrà terminata automaticamente tra %d secondi." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "La sessione verrà terminata automaticamente tra %d secondo." +msgstr[1] "La sessione verrà terminata automaticamente tra %d secondi." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Termina sessione" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Spegni" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Installa aggiornamenti e spegni" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Il sistema verrà spento automaticamente tra %d secondo." +msgstr[1] "Il sistema verrà spento automaticamente tra %d secondi." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Installare gli aggiornamenti software in sospeso" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Riavvia" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Spegni" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Riavvia" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Il sistema verrà riavviato automaticamente tra %d secondo." +msgstr[1] "Il sistema verrà riavviato automaticamente tra %d secondi." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Riavvia e installa aggiornamenti" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Il sistema verrà riavviato automaticamente per installare gli aggiornamenti " +"tra %d secondo." +msgstr[1] "" +"Il sistema verrà riavviato automaticamente per installare gli aggiornamenti " +"tra %d secondi." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Riavvia e installa" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installa e spegni" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Spegnere dopo aver installato gli aggiornamenti" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Riavvia e installa aggiornamenti" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s verrà installato dopo il riavvio. L'installazione potrebbe richiedere " +"tempo: assicurarsi di aver eseguito una copia di sicurezza dei dati e che il " +"computer sia collegato all'alimentazione elettrica." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Alimentazione da batteria: collegare alla rete elettrica prima di installare " +"gli aggiornamenti." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Alcune applicazioni risultano in esecuzione o con lavoro non salvato." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Altri utenti sono collegati." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remoto)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (console)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Installa" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Scaricare e installare «%s» da extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "«%s» vuole bloccare le scorciatoie" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Un'applicazione vuole bloccare le scorciatoie" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Per riabilitare le scorciatoie, premere %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Nega" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Consenti" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Tasti lenti attivati" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Tasti lenti disattivati" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"È stato premuto il tasto «Maiusc» per otto secondi. Questa è la scorciatoia " +"per la funzione «Tasti lenti», che determina il modo in cui opera la " +"tastiera." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Tasti singoli attivati" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Tasti singoli disattivati" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"È stato premuto per cinque volte consecutive il tasto «Maiusc». Questa è la " +"scorciatoia per la funzione «Tasti singoli», che determina il modo in cui " +"opera la tastiera." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Sono stati premuti due tasti contemporaneamente o cinque volte consecutive " +"il tasto «Maiusc». Questo disabilita la funzione «Tasti singoli», che " +"determina il modo in cui opera la tastiera." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Lascia attivata" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Accendi" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Spegni" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Lascia disattivata" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Impostazioni regione e lingua" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Nessuna estensione installata" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s non ha emesso alcun errore." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Nascondi errori" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Mostra errori" + +# (ndt) o abilitata? +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Abilitato" + +# (ndt) o disabilitata? +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Disabilitato" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Errore" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Non aggiornato" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Scaricamento" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Visualizza sorgente" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Pagina web" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Informazione di sistema" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Artista sconosciuto" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Titolo sconosciuto" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volume" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Annulla" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Panoramica" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Digita per cercare…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Nuova scorciatoia…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Definita dall'applicazione" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Mostra aiuto sullo schermo" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Cambia monitor" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Assegna tasti" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Fatto" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Modifica…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nessuno" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Premere un pulsante per configurare" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Premere Esc per uscire" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Premere un tasto per uscire" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Esci" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Attività" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Barra superiore" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Inserire un comando" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Chiudi" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Il riavvio non è disponibile su Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Riavvio…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nuovo messaggio" +msgstr[1] "%d nuovi messaggi" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nuova notifica" +msgstr[1] "%d nuove notifiche" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Blocca" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME deve bloccare lo schermo" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Impossibile bloccare" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Il blocco è stato impedito da un'applicazione" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Ricerca…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Nessun risultato." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d altro" +msgstr[1] "%d altri" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Copia" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Incolla" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Mostra testo" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Nascondi testo" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Password" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Ricorda password" + +# su Android è Rilevabile :P +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Accessibilità" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Ingrandimento" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Lettore schermo" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Tastiera a schermo" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Avvisi visibili" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Tasti singoli" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Tasti lenti" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Tasti rimbalzati" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Mouse da tastiera" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Contrasto elevato" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Caratteri grandi" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Impostazioni Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d collegato" +msgstr[1] "%d collegati" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Disabilitato" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Abilitato" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Luminosità" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Tastiera" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Mostra disposizione tastiera" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Posizione abilitata" + +# (ndt) o disabilitata? +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Disabilitato" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Impostazioni privacy" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Posizione in uso" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Posizione disabilitata" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Abilita" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Consentire a %s di accedere alla propria posizione geografica?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"L'accesso alla posizione geografica può essere modificato in qualsiasi " +"momento attraverso le impostazioni della privacy." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s spento" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s collegato" + +# FIXME o femminile? boh +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s non gestito" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s in disconnessione" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s in connessione" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s richiede autenticazione" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware mancante 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s non disponibile" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Connessione non riuscita su %s" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Impostazioni rete via cavo" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Impostazioni banda larga mobile" + +# (ndt) o disabilitata? +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s disabilitato via hardware" + +# (ndt) o disabilitata? +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s disabilitato" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Connetti a Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "La modalità aereo è attiva" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Il Wi-Fi è disabilitato quando la modalità aereo è attiva." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Disattiva modalità aereo" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Il Wi-Fi è spento" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "È necessario accendere il Wi-Fi per potersi connettere a una rete." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Accendi Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Reti Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Seleziona una rete" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Nessuna rete" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Usare l'interruttore hardware per spegnere" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Seleziona rete" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Impostazioni Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspot %s attivo" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s non collegato" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "connessione…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "richiesta autenticazione" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "connessione non riuscita" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Impostazioni VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN spenta" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Impostazioni rete" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s connessione via cavo" +msgstr[1] "%s connessioni via cavo" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s connessione Wi-Fi" +msgstr[1] "%s connessioni Wi-Fi" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s connessione modem" +msgstr[1] "%s connessioni modem" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Connessione non riuscita" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Attivazione della connessione di rete non riuscita" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Modalità notturna disattivata" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Modalità notturna attivata" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Riprendi" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Disabilita fino a domani" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Impostazioni alimentazione" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Carica" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Non in carica" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Stima in corso…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d rimanente (%d %%)" + +# in stile MacOS sarebbe "al pieno" :P +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d alla carica (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Lo schermo è condiviso" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Spegni" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Modalità aereo attivata" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Cambia utente" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Termina sessione" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Impostazioni account" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Blocca orientazione" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Sospendi" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Spegni" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Dispositivo Thunderbolt sconosciuto" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"È stato rilevato un nuovo dispositivo: scollegarlo e ricollegarlo per " +"poterlo utilizzare." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Dispositivo Thunderbolt non autorizzato" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"È stato rilevato un nuovo dispositivo e l'amministratore di sistema deve " +"autorizzarlo." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Errore autenticazione Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Impossibile autorizzare il dispositivo Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volume modificato" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Duplica" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Unisci schermi" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Solo esterno" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Solo integrato" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Accedi come altro utente" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Sblocca finestra" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Applicazioni" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Cerca" + +# (ndt) dovrebbe essere il nome dell'applicazione +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» è pronto" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Mantenere queste impostazioni per il monitor?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Ripristina impostazioni" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Mantieni modifiche" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Le modifiche alle impostazioni saranno ripristinate tra %d secondo" +msgstr[1] "Le modifiche alle impostazioni saranno ripristinate tra %d secondi" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimizza" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Demassimizza" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Massimizza" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Muovi" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Ridimensiona" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Muovi barra del titolo a schermo" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Sempre in primo piano" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Sempre sullo spazio di lavoro visibile" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Sposta su spazio di lavoro a sinistra" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Sposta su spazio di lavoro a destra" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Sposta su spazio di lavoro in alto" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Sposta su spazio di lavoro in basso" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Sposta su schermo in alto" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Sposta su schermo in basso" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Sposta su schermo a sinistra" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Sposta su schermo a destra" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendario di Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Stampa la versione" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Modalità usata da GDM per la schermata d'accesso" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Usa una modalità specifica, per es. «gdm» per la schermata d'accesso" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Elenca le modalità possibili" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Sconosciuto" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Avvio di «%s» non riuscito" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Le password non corrispondono." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "La password non può essere vuota" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "La finestra di dialogo di autenticazione è stata annullata dall'utente" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u uscita" +msgstr[1] "%u uscite" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ingresso" +msgstr[1] "%u ingressi" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Audio di sistema" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..a9d8427 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,2344 @@ +# Japanese translation of gnome-shell package. +# Copyright (C) 2009-2013 the gnome-shell copyright holder. +# This file is distributed under the same license as the gnome-shell package. +# Nishio Futoshi , 2010. +# Kiyotaka NISHIBORI , 2011. +# Jiro Matsuzawa , 2011-2017. +# Takayuki KUSANO , 2011, 2012. +# Hideki Yamane , 2011. +# Takanori MATSUURA , 2012. +# Yoji TOYODA , 2013. +# Ikuya Awashiro , 2014. +# IWAI, Masaharu , 2015. +# sicklylife , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-03 10:16+0000\n" +"PO-Revision-Date: 2019-03-07 20:09+0900\n" +"Last-Translator: sicklylife \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "システム" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "通知リストを表示する" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "アクティブな通知にフォーカスを当てる" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "アクティビティ画面を表示する" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "すべてのアプリケーションを表示" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "アプリケーションメニューを開く" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell 拡張機能" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Shell 拡張機能の設定を行います" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "ウィンドウ管理とアプリケーションの起動" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Alt-F2 から開発・テスト用の内部ツールを利用可能にする" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 ダイアログを利用した内部のデバッグツールとモニターツールへのアクセスを" +"許可します。" + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "有効にする拡張機能の UUID" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell の拡張機能には UUID プロパティがあり、このキーは、ロードしたい拡" +"張機能の UUID のリストです。ロードしたい拡張機能はこのリストに含めなければな" +"りません。このリストは org.gnome.Shell の EnableExtensions や " +"DisableExtensions といった DBus メソッドでも操作できます。" + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "拡張機能を無効化" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"ユーザーが有効にした拡張機能をすべて無効にします。“enabled-extension”の設定値" +"には影響しません。" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "拡張機能のバージョン互換の検証を無効にする" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"通常では、現在起動中の GNOME Shell のバージョンをサポートする拡張機能だけが" +"ロードされます。この設定を true にした場合、バージョンチェック機能が無効にな" +"り、拡張機能のサポートバージョンに関係なくすべての拡張機能をロードします。" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "お気に入りのアプリケーションの .desktop ファイル ID の一覧" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "これらの ID で示されるアプリケーションは「お気に入り」に表示されます。" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "アプリ一覧画面" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "現在のアプリケーション一覧画面のインデックスです。" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "コマンド (Alt-F2) ダイアログの履歴" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "looking glass ダイアログの履歴" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "ユーザーメニューに「ログアウト」を常に表示する" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"このキーは、単一ユーザー、単一セッション状況で「ログアウト」メニューアイテム" +"を自動的に非表示にする機能よりも優先します。" + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"マウント対象の暗号化されたファイルシステムやリモートファイルシステムのパス" +"ワードを記憶する" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"GNOME Shell は、暗号化されたデバイスやリモートファイルシステムのマウント時に" +"パスワードを要求します。パスワードを保存できる場合は、「パスワードを保存」" +"チェックボックスが表示されます。このキーは、チェックボックスのデフォルト値と" +"なります。" + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"デフォルトの Bluetooth アダプターにデバイスが関連付けられているかどうか" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Bluetooth アダプターの電源がオンになっているか、あるいはデフォルトのアダプ" +"ターに関連付けられたデバイスがある場合にのみ、GNOME Shell は Bluetooth メ" +"ニューを表示します。デフォルトのアダプターに関連付けられたデバイスがなくなっ" +"た場合に、この値はリセットされます。" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "イントロスペクション API を有効にする" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Shell のアプリケーション状態をイントロスペクトできる D-Bus API を有効にしま" +"す。" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "アプリケーションメニューを開くキーバインド" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "アプリケーションメニューを開くキーバインドです。" + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "アプリケーション一覧を開くキーバインド" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "アプリケーション一覧を開くキーバインドです。" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "アクティビティ画面を開くキーバインド" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "アクティビティ画面を開くキーバインドです。" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "通知リストの表示・非表示を切り替えるキーバインド" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "通知リストの表示・非表示を切り替えるキーバインドです。" + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "アクティブな通知にフォーカスを当てるキーバインド" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "アクティブな通知にフォーカスを当てるキーバインドです。" + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Tween の一時停止および再開を行うキーバインドです。デバッグ用途で使用します。" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "アプリケーション 1 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "アプリケーション 2 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "アプリケーション 3 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "アプリケーション 4 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "アプリケーション 5 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "アプリケーション 6 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "アプリケーション 7 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "アプリケーション 8 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "アプリケーション 9 に切り替える" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "使いたいキーボードの種類" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "使いたいキーボードの種類です。" + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "スイッチャーを現在のワークスペース内に制限する" + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"true に設定した場合、現在のワークスペースにウィンドウのあるアプリケーションだ" +"けをスイッチャーに表示します。false に設定した場合はすべてのアプリケーション" +"を表示します。" + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "アプリケーションアイコンモード" + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"ウィンドウスイッチャーでのウィンドウの表示方法を設定します。指定可能な値" +"は、“thumbnail-only”(ウィンドウのサムネイルを表示します)、“app-icon-only”(ア" +"プリケーションアイコンを表示します)、あるいは“both”です。" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"true に設定した場合、現在のワークスペースのウィンドウだけをスイッチャーに表示" +"します。false に設定した場合はすべてのアプリケーションを表示します。" + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "モーダルダイアログを親ウィンドウに結び付ける" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"GNOME Shell 使用時は、 このキーが、org.gnome.mutter の同じキーよりも優先しま" +"す。" + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "ウィンドウを画面の端に移動させたときにタイル状に配置する" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "ワークスペースを動的に管理する" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "プライマリモニターのみワークスペースを切り替える" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "マウスモードにおけるフォーカス遷移をポインターが停止するまで遅延させる" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "ネットワークログイン" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "何か問題が起きています" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"大変申し訳ありませんが、拡張機能の設定を表示できない問題が発生しました。拡張" +"機能の作者に問題を報告することをお勧めします。" + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "技術的な詳細" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "エラーをコピー" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "ホームページ" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "拡張機能のホームページを開く" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "機能拡張はインストールされていません" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"拡張機能は extensions.gnome.org " +"またはソフトウェアでインストールできます。" + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "ソフトウェアで閲覧" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "キャンセル" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "次へ" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "ロック解除" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "サインイン" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "セッションを選択する" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "アカウントが見つかりませんか?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(たとえば、user あるいは %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "ユーザー名: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "ログインウィンドウ" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "認証エラー" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(あるいは指でスワイプする)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "電源オフ" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"power off;shutdown;reboot;restart;電源オフ;シャットダウン;リブート;リスター" +"ト;再起動" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "画面ロック" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "lock screen;画面ロック" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "ログアウト" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;ログアウト;サインオフ" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "サスペンド" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;サスペンド;スリープ" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "ユーザーの切り替え" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "switch user;ユーザー切り替え" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "画面回転ロック" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "lock orientation;画面回転;自動回転;スクリーン;画面;回転" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "コマンドが見つかりません" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "次のコマンドは解析できません:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "”%s”の実行に失敗しました:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "たった今" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d分前" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d時間前" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "昨日" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d日前" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d週間前" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%dか月前" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d年前" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "昨日 %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%B%-e日 %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%Y年%B%-e日 %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%p %l:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "昨日 %p %l:%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A %p %l:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%B%-e日 %p %l:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%Y年%B%-e日 %p %l:%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "ホットスポットログイン" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"このホットスポットログインの接続は安全ではありません。このページであなたが入" +"力したパスワードなどの情報は、近くにいる人に知られてしまう恐れがあります。" + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "拒否" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "許可" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "よく使うアプリケーションがここに表示されます" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "常用" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "すべて" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "新しいウィンドウで開く" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "専用のグラフィックカードを使用して起動する" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "お気に入りから削除" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "お気に入りに追加" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "詳細を表示する" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s をお気に入りに追加しました。" + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s をお気に入りから削除しました。" + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "オーディオデバイスの選択" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "サウンド設定" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "ヘッドフォン" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "ヘッドセット" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "マイク" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "背景の変更…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "ディスプレイ設定" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "設定" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "日" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "月" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "火" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "水" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "木" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "金" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "土" + +#. * +#. * 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:332 +msgid "%OB" +msgstr "" + +#. * +#. * 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:342 +msgid "%OB %Y" +msgstr "" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "先月" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "来月" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "第%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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "終日" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%B%-e日 (%a)" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%Y年%B%-e日 (%a)" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "通知なし" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "イベントなし" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "消去" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "”%s”の応答がありません。" + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"もうしばらく応答を待ちますか? それともアプリケーションを強制的に終了しますか?" + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "強制終了" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "応答を待つ" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "外付けドライブが接続されました" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "外付けドライブが外されました" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "%s で開く" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "パスワード:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "再入力:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "または、ルーターの“WPS”ボタンを押して接続する方法もあります。" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "接続" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "パスワード: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "キー: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "プライベートキーパスワード: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "識別子: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "サービス: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "無線ネットワークでは認証が要求されます" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"無線ネットワーク”%s”にアクセスするにはパスワードか、または暗号化キーが必要で" +"す。" + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "有線 802.1X の認証" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "ネットワーク名: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL 認証" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN コードが必要です" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "モバイルブロードバンドデバイスには PIN コードが必要です" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN 番号: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "モバイルブロードバンドネットワークのパスワード" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "”%s”への接続にはパスワードが必要です。" + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "ネットワークマネージャー" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "認証が要求されました" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "管理者" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "認証" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "申し訳ありません、認証できませんでした。再試行してください。" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s は %s になりました" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "ウィンドウ" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "アプリケーションを表示する" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "ダッシュボード" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%Y年%-m月%-e日" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%Y年%-m月%-e日 (%a)" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "世界時計を追加する…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "世界時計" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "天気" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "場所を選択する…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "ロードしています…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "気象情報取得のためにネットワークに接続する" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "気象情報を取得できません" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s のログアウト" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "ログアウト" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s は %d 秒後に自動的にログアウトします。" + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "%d 秒後に自動的にログアウトします。" + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "ログアウト" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "電源オフ" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "更新をインストールして電源オフ" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "%d 秒後に自動的にシステムの電源を切ります。" + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "未実行のソフトウェアアップデートをインストールする" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "再起動" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "電源オフ" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "再起動" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "%d 秒後にシステムを再起動します。" + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "再起動して更新をインストールする" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "%d 秒後にシステムを再起動して更新をインストールします。" + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "再起動とインストール" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "インストールと電源オフ" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "更新をインストール後電源をオフにする" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "再起動してアップグレード" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s は再起動後にインストールされます。アップグレードには時間が掛かることが" +"あります。重要なデータはバックアップを取っておいてください。また、コンピュー" +"タ本体は電源につないでください。" + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"バッテリーで動作中です: 更新をインストールする前に電源に接続してください。" + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "実行中あるいは作業が未保存のアプリケーションがあります。" + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "他のユーザーがログインしています。" + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (リモート)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (コンソール)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "インストール" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org から”%s”をダウンロードしてインストールしますか?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "" + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "スローキーをオンにする" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "スローキーをオフにする" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"[SHIFT] キーを8秒間押下しました。これはスローキー機能のショートカットとして、" +"キーボード操作に影響を与えるものです。" + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "固定キーをオンにする" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "固定キーをオフにする" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"[SHIFT] キーを連続して5回押下しました。これは固定キー機能のショートカットとし" +"て、キーボード操作に影響を与えるものです。" + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"同時に2つのキーを押下したか、あるいは [SHIFT] キーを連続して5回押下しました。" +"これは固定キー機能を無効にし、キーボード操作に影響を与えるものです。" + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "オンのままにする" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "オンにする" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "オフにする" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "オフのままにする" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "地域と言語の設定" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "機能拡張はインストールされていません" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s は何もエラーを出力していません。" + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "エラーを非表示" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "エラーを表示" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "有効" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "無効" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "エラー" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "最新ではありません" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "ダウンロード中" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "ソースの表示" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "ウェブページ" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "システム情報" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "不明なアーティスト" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "不明なタイトル" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "音量" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "元に戻す" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "アクティビティ画面" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "検索ワードを入力…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "新しいショートカット…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "モニターの切り替え" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "編集…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "終了" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "アクティビティ" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "システム" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "トップバー" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "コマンドを入力" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "閉じる" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "再起動は Wayland で実行できません" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "再起動中…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%B%-e日 (%a)" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d 件の新しいメッセージ" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d 件の新しい通知" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "ロック" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "画面をロックする必要があります" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "ロックできません" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "アプリケーションによってロックがブロックされました" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "検索しています…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "一致するものがありません。" + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "他 %d 件" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "コピー" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "貼り付け" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "文字を表示" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "文字を非表示" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "パスワード" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "パスワードを保存" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "アクセシビリティ" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "ズーム" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "スクリーンリーダー" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "スクリーンキーボード" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "視覚警告" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "固定キー" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "スローキー" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "バウンスキー" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "マウスキー" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "ハイコントラスト" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "大きな文字" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth の設定" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d 台接続" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "オフ" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "オン" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "明るさ" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "キーボード" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "キーボードレイアウトの表示" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "位置情報サービス有効" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "無効" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "プライバシー設定" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "位置情報サービス使用中" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "位置情報サービス無効" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "有効" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "%s が現在の位置情報を取得することを許可しますか?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"位置情報のアクセス許可設定は、プライバシー設定からいつでも変更できます。" + +#: js/ui/status/network.js:66 +msgid "" +msgstr "< 不明 >" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s オフ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s 接続済み" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s 管理対象外" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s 切断中" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "%s 接続中" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s には認証が必要" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s のファームウェア未検出" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s 利用不可" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s 接続失敗" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "有線設定" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "モバイルブロードバンド設定" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s ハードウェア無効" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s 無効" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "インターネットへ接続" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "機内モードオン" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "機内モードがオンになっていると、Wi-Fiは無効になります" + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "機内モードをオフにする" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi オフ" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "ネットワークに接続するには Wi-Fi をオンにする必要があります。" + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi をオンにする" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi ネットワーク" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "ネットワークを選択してください" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "ネットワークなし" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "オフにハードウェアスイッチを使用する" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "ネットワークを選択" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi 設定" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s アクセスポイント使用中" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s 未接続" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "接続中…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "認証の要求" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "接続失敗" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "VPN 設定" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN オフ" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "ネットワーク設定" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "有線接続 %s件" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "Wi-Fi 接続 %s件" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "モデム接続 %s件" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "接続失敗" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "ネットワーク接続を有効にできません" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "夜間モード オフ" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "夜間モード オン" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "再開" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "明日まで無効にする" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "電源設定" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "充電完了" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "放電中" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "残量推計中…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "残り %d:%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "充電完了まで %d:%02d (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "画面を共有しています" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "オフにする" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "機内モードオン" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "ユーザーの切り替え" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "ログアウト" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "アカウント設定" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "画面回転ロック" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "サスペンド" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "電源オフ" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "不明な Thunderbolt デバイス" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"離席中に新しいデバイスを検出しました。そのデバイスを使用する場合は一度切断" +"し、再接続してください。" + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "認証していない Thunderbolt デバイス" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "新しいデバイスを検出しました。管理者の認証が必要です。" + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt 認証エラー" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Thunderbolt デバイスを認証できませんでした: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "音量変更しました" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "画面を複製" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "画面を拡張" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "外部のみ" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "組み込みのみ" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "他のユーザーでログイン" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "ロック解除" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "アプリケーション" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "検索" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "”%s”は準備完了です" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "このディスプレイ設定を保存しますか?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "設定を元に戻す" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "変更を保存" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "%d 秒後に元の設定に戻ります" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "最小化" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "元のサイズに戻す" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "最大化" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "移動" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "サイズの変更" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "画面上でタイトルバーを移動する" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "最前面に維持する" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "すべてのワークスペースに表示する" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "左側のワークスペースへ移動する" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "右側のワークスペースへ移動する" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "上側のワークスペースへ移動する" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "下側のワークスペースへ移動する" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "上側のモニターへ移動する" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "下側のモニターへ移動する" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "左側のモニターへ移動する" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "右側のモニターへ移動する" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution カレンダー" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "バージョンを表示" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "ログイン画面で GDM が使用するモード" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "指定したモードを使用する (例: ログイン画面用の“gdm”)" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "使用可能なモードを一覧表示する" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "不明なプログラム" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "”%s”の起動に失敗しました" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "パスワードが一致しません。" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "パスワードを空白にすることはできません。" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "認証ダイアログはユーザーに拒否されました" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "出力数: %u" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "入力数: %u" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "システムのサウンド" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "%s の設定ダイアログのロード中にエラーが発生しました。" + +#~ msgid "%s all day." +#~ msgstr "終日 %s。" + +#~ msgid "%s, then %s later." +#~ msgstr "%s → %s。" + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s → %s → %s。" + +#~ msgid "Feels like %s." +#~ msgstr "体感温度 %s。" + +#~ 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 "トレイを非表示" + +#~ msgid "Status Icons" +#~ msgstr "ステータスアイコン" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Shell 拡張機能設定" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Web 認証リダイレクト" + +#~ msgid "Events" +#~ msgstr "イベント" + +#~ msgid "Notifications" +#~ msgstr "通知" + +#~ msgid "Clear section" +#~ msgstr "セクションをクリアする" + +#~ msgid "Media" +#~ msgstr "メディア" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "暦週日付を表示" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "ISO 8601 方式の暦週日付を表示します。" + +#~ msgid "Not In Use" +#~ msgstr "未使用" + +#~ msgid "Use as Internet connection" +#~ msgstr "インターネット接続に使用" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s があなたの現在地情報へのアクセスを要求しています。" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (Wayland コンポジター)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "接続デバイス: %d台" + +#~ msgid "Authentication required" +#~ msgstr "認証の要求" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "バッテリー" + +#~ msgid "Airplane Mode" +#~ msgstr "機内モード" diff --git a/po/kk.po b/po/kk.po new file mode 100644 index 0000000..14cc99f --- /dev/null +++ b/po/kk.po @@ -0,0 +1,2576 @@ +# Kazakh translation for gnome-shell. +# Copyright (C) 2015 The gnome-shell authors. +# This file is distributed under the same license as the gnome-shell package. +# Baurzhan Muftakhidinov , 2012-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-11 18:01+0000\n" +"PO-Revision-Date: 2019-02-16 15:54+0500\n" +"Last-Translator: Baurzhan Muftakhidinov \n" +"Language-Team: Kazakh \n" +"Language: kk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.2.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Жүйе" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Хабарламалар тізімін көрсету" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Белсенді хабарламаға фокусты орнату" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Шолуды көрсету" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Барлық қолданбаларды көрсету" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Қолданбалар мәзірін ашу" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Қоршам кеңейтулері" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Shell кеңейтулерін баптау" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Терезелерді басқару мен қолданбаларды жөнелту" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Alt-F2 ішінен өндірушілер мен сынаушылар үшін пайдалы ішкі саймандарды іске " +"қосу" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 сұхбат арқылы қолжетерлік болатын ішкі жөндеу мен бақылау " +"саймандарына қатынауды рұқсат ету." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Іске қосу үшін кеңейтулердің UUID-ры" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell кеңейтулерінде UUID қасиеті бар; бұл кілт жүктелетін кеңейтулер " +"тізімін сақтайды. Жүйеге кірген кезде жүктелем дейтін кеңейту осы тізімде " +"болуы тиіс. Бұл тізімді org.gnome.Shell ішіндегі EnableExtension және " +"DisableExtension DBus тәсілдерімен де өзгертуге болады." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Пайдаланушы кеңейтулерін сөндіру" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"\"enabled-extension\" баптауын тимей-ақ, пайдаланушы іске қосқан барлық " +"кеңейтулерді сөндіру." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Кеңейту нұсқасы үйлесімділігінің расталуын сөндіреді" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell тек ағымдағы орындалып жатқан нұсқаны қолдаймын деп хабарлайтын " +"кеңейтулерді жүктейтін болады. Бұл опцияны іске қосу ол мүмкіндікті " +"сөндіреді, және кеңейту қолдайтын нұсқасына қарамастан жүктеп көретін болады." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Таңдамалы қолданбалар үшін desktop файлдары ID-нің тізімі" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Осы анықтағыштарға сәйкес келетін қолданбалар таңдамалылар аймағында " +"көрсетілетін болады." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Қолданбаларды таңдау көрінісі" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Ағымдағы таңдалған көріністің қолданбаларды таңдау режиміндегі индексі." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Командалар сұхбаты (Alt-F2) үшін тарихы" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Іздеу сұхбатының тарихы" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Пайдаланушы мәзірінде \"Жүйеден шығу\" нұсқасын әрқашан да көрсету." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Бұл кілт бір пайдаланушы, бір сессия бар кезінде \"Жүйеден шығу\" " +"мүмкіндігінің автоматты түрде жасыруын алмастырады." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Шифрленген немесе қашықтағы файлдық жүйелерді тіркеу парольдерін сақтау " +"керек пе, соны көрсетеді" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Қоршам шифрленген құрылғы немесе қашықтағы файлдық жүйе тіркелген кезде " +"парольді сұрайды. Егер парольді болашақтағы қолданулар үшін сақтау керек " +"болса, \"Парольді есте сақтау\" жалаушасын орнатыңыз. Бұл кілт жалаушаның " +"бастапқы күйін орнатады." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Үнсіз келісім бойынша Bluetooth адаптерінде байланысқан құрылғылар бар ма" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Қоршам Bluetooth мәзірін тек Bluetooth адаптері іске қосылған болса және " +"үнсіз келісім бойынша адаптерінде байланысқан құрылғылар бар болса ғана " +"көрсетеді. Бұл үнсіз келісім адаптерінде байланысқан құрылғылар жоқ болса " +"тасталады." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Интроспекция API іске қосу" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Қоршамның қолданба күйін интроспекциялауды мүмкін қылатын D-Bus API іске " +"қосу." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Қолданбалар мәзірін ашу үшін пернелер комбинациясы" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Қолданбалар мәзірін ашу үшін пернелер комбинациясы." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "\"Қолданбаларды көрсету\" көрінісін ашу үшін пернелер комбинациясы" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Көрініс ішінен \"Қолданбаларды көрсету\" ашу үшін пернелер комбинациясы." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Шолуды ашу үшін пернелер комбинациясы" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Көріністі ашу үшін пернелер комбинациясы." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Хабарламалар тізімінің көрінуін іске қосу/сөндіру үшін пернелер комбинациясы" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Хабарламалар тізімінің көрінуін іске қосу/сөндіру үшін пернелер комбинациясы." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Белсенді ескертуге фокусты ауыстыру пернелер комбинациясы" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Белсенді ескертуге фокусты ауыстыру пернелер комбинациясы." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Барлық орындалып тұрған анимацияларды тоқтататын не жалғастыратын пернелер " +"жарлығы (жөндеу үшін)" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "1-ші қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "2-ші қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "3-ші қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "4-ші қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "5-ші қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "6-шы қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "7-ші қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "8-ші қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "9-шы қолданбаға ауысу" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Қолданылатын пернетақта" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Қолданылатын пернетақта түрі." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Ауыстырғышты ағымдағы жұмыс орнымен шектеу." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Таңдалса, ауыстырғышта тек ағымдағы жұмыс орнындағы терезелері бар " +"қолданбалар көрсетіледі. Болмаса, барлық қолданбалар болады." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Қолданбаның таңбаша режимі." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Терезелер ауыстырғышта қалай көрсетілетінін сипаттайды. Мүмкін мәндері " +"\"thumbnail-only\" (терезенің кіші көрінісі көрсетіледі), \"app-icon-only" +"\" (тек қолданба таңбашасы көрсетіледі) немесе \"both\" (екеуі де)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Таңдалса, ауыстырғышта тек ағымдағы жұмыс орнындағы терезелер көрсетіледі. " +"Болмаса, барлық терезелер болады." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Модальды сұхбатты аталық терезесіне жалғау" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Бұл кілт GNOME Shell орындалған кезде org.gnome.mutter ішіндегі кілтті " +"үстінен жазады." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Терезелерді экран шеттеріне апарған кезде олардың өлшемдерін өзгертуді іске " +"қосу" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Жұмыс орындары динамикалы түрде басқарылады" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Жұмыс орындар тек біріншілік мониторда" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Тышқан режиміндегі фокусты ауыстыру курсор тоқтағанша дейін кідірту" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Желілік кіру" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Бір нәрсе қате кетті" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Кешіріңіз, мәселе орын алды: бұл кеңейту үшін баптауларды көрсету мүмкін " +"емес. Бұл мәселені кеңейту авторларына хабарлауды ұсынамыз." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Техникалық ақпараты" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Көшіріп алу қатесі" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Үй парағы" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Кеңейтудің үй парағын шолу" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Кеңейтулер орнатылмаған" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Кеңейтулерді БҚ қолданбасы немесе extensions.gnome.org арқылы орнатуға болады." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "БҚ қолданбасында шолу" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Бас тарту" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Келесі" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Босату" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Кіру" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Сессияны таңдау" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Тізімде жоқсыз ба?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(мыс., пайдаланушы не %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Пайдаланушы аты: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Жүйеге кіру терезесі" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Аутентификация қатесі" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(немесе саусағыңызды өткізіңіз)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Сөндіру" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "сөндіру;қайта қосу" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Экранды блоктау" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "экранды блоктау" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Жүйеден шығу" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "жүйеден шығу" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Ұйықтату" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "ұйықтату" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Пайдаланушыны ауыстыру" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "пайдаланушыны ауыстыру" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Бағдарды бекіту" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "бағдарды бекіту;экран;бұру" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Команда табылмады" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Команданы талдау мүмкін емес:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "\"%s\" жөнелту сәтсіз:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Жаңа ғана" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d минут бұрын" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d сағат бұрын" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Кеше" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d күн бұрын" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d апта бұрын" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d ай бұрын" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d жыл бұрын" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Кеше, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +#| msgid "%B %d, %H∶%M" +msgid "%B %-d, %H∶%M" +msgstr "%B %-d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +#| msgid "%B %d %Y, %H∶%M" +msgid "%B %-d %Y, %H∶%M" +msgstr "%B %-d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Кеше, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +#| msgid "%B %d, %l∶%M %p" +msgid "%B %-d, %l∶%M %p" +msgstr "%B %-d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +#| msgid "%B %d %Y, %l∶%M %p" +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%B %-d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Қатынау нүктесіне кіру" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Бұл қатынау нүктесіне кіруге байланысыңыз қауіпсіз емес. Бұл парақта " +"енгізілген парольдер немесе басқа да ақпаратыңызды сол желідегі адамдар көре " +"алады." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Тыйым салу" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Рұқсат ету" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Жиі қолданылатын қолданбалар осында көрінеді" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Жиі қолданылатын" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Барлығы" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Жаңа терезе" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Бөлек графикалық картаны пайдаланып жөнелту" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Таңдамалылардан өшіру" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Таңдамалыларға қосу" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Деректерді көрсету" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s таңдамалыларыңызға қосылды." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s таңдамалыларыңыздан өшірілді." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Аудио құрылғысын таңдаңыз" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Дыбыс баптаулары" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Құлаққап" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Микрофонды құлаққап" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Микрофон" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Фонды өзгерту…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Экран баптаулары" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Баптаулар" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "Жк" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "Дс" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "Сс" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ср" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "Бс" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "Жм" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "Сн" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "Өткен ай" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "Келесі ай" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +msgid "Week %V" +msgstr "Апта %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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "Толық күн" + +#: js/ui/calendar.js:829 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %B %-d" + +#: js/ui/calendar.js:833 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d, %Y" +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %B %-d, %Y" + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "Хабарламалар жоқ" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "Оқиғалар жоқ" + +#: js/ui/calendar.js:1085 +msgid "Clear" +msgstr "Тазарту" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "\"%s\" жауап бермейді." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Сіз оның жалғастыруын біраз уақыт бойы күте аласыз, немесе қолданбаны " +"толықтай шығуды мәжбүрлете аласыз." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Мәжбүрлі тоқтату" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Күту" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Сыртқы диск қосылды" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Сыртқы диск алынды" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "%s көмегімен ашу" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Пароль:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Қайтадан енгізіңіз:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Қосымша түрде, сіз роутердегі \"WPS\" батырмасын басу арқылы байланыса " +"аласыз." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Байланысу" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Пароль: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Кілт: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Жеке кілт паролі: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Анықтағыш: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Қызмет: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Сымсыз желісі аутентификацияны талап етеді" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"\"%s\" сымсыз желісіне қатынау үшін парольдер не шифрлеу кілттері керек." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Сымды 802.1X аутентификациясы" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Желі аты: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL аутентификациясы" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN коды керек" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Сымсыз кеңжолақты құрылғы үшін PIN коды керек" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Сымсыз кеңжолақты желісінің паролі" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "\"%s\" үшін байланысты орнату үшін пароль керек." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Желілер басқарушысы" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Аутентификация керек" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Әкімші" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Аутентификация" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Кешіріңіз, талап сәтсіз. Қайтадан көріңіз." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s енді %s ретінде белгілі" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Терезелер" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Қолданбаларды көрсету" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +#| msgid "%B %e %Y" +msgid "%B %-d %Y" +msgstr "%B %-d %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Дүниежүзілік сағаттарды қосу…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Дүниежүзілік сағаттар" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Ауа райы" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Орналасуды таңдаңыз…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Жүктеу…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Ауа райы ақпаратын алу үшін желіге байланысыңыз" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Ауа райы ақпараты ағымдағы уақытта қолжетерсіз" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Шығу: %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Шығу" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s жүйеден автоматты түрде %d секундтан кейін шығады." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Сіз жүйеден автоматты түрде %d секундтан кейін шығасыз." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Шығу" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Сөндіру" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Жаңартуларды орнату және сөндіру" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Жүйе %d секундтан кейін автоматты түрде сөндіріледі." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Кезекте тұрған БҚ жаңартуларын орнату" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Қайта қосу" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Сөндіру" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Қайта қосу" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Жүйе %d секундтан кейін автоматты түрде қайта қосылады." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Қайта қосу және жаңартуларды орнату" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Жүйе %d секундтан кейін автоматты түрде қайта қосылады және жаңартуларды " +"орнатады." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Қайта қосу және орнату" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Орнату және сөндіру" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Жаңартулар орнатылғаннан кейін сөндіру" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Қайта қосу және жаңартуларды орнату" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s қайта қосылғаннан кейін орнатылатын болады. Орнатуды жаңарту ұзақ " +"уақытты алуы мүмкін: деректердің қор көшірмесі бар екеніне және компьютер " +"эл. желісіне жалғанып тұрғанына көз жеткізіңіз." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Батареядан жұмыс істеуде: жаңартуларды орнату алдында эл. қорек көзіне " +"қосыңыз." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Кейбір қолданбалар бос емес не сақталмаған жұмыстары бар." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Басқа пайдаланушылар жүйеге кіріп тұр." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (қашықтағы)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (консоль)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Орнату" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org адресінен \"%s\" жүктеп алып, орнату керек пе?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s жарлықтарды сөндіргісі келеді" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Қолданба жарлықтарды сөндіргісі келеді" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Сіз жарлықтарды %s басу арқылы қалпына келтіре аласыз." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Тыйым салу" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Рұқсат ету" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Баяу пернелер іске қосылған" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Баяу пернелер сөндірілген" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Сіз Shift пернесін 8 секунд бойы басулы ұстадыңыз. Бұл Баяу пернелер " +"мүмкіндігінің жарлығы, ол пернетақта жұмысына әсер етеді." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Жабысқақ пернелер іске қосылған" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Жабысқақ пернелер сөндірілген" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Сіз Shift пернесін қатарынан 5 рет бастыңыз. Бұл Жабысқақ пернелер " +"мүмкіндігінің жарлығы, ол пернетақта жұмысына әсер етеді." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Сіз екі пернені бірге бастыңыз, немесе Shift пернесін қатарынан 5 рет " +"бастыңыз. Бұл Жабысқақ пернелер мүмкіндігін сөндіреді, ол пернетақта " +"жұмысына әсер етеді." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Іске қосулы қалдыру" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Іске қосу" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Сөндіру" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Сөндірулі қалдыру" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Аймақ және тіл баптаулары" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Кеңейтулер орнатылмаған" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ешбір қатені шығармады." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Қателерді жасыру" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Қателерді көрсету" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Іске қосылған" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Сөндірулі" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Қате" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Ескірген" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Жүктелуде" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Бастапқы кодын қарау" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Веб парағы" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Жүйелік ақпарат" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Белгісіз әртіс" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Белгісіз атауы" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Дыбыс деңгейі" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Болдырмау" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Шолу" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Іздеу үшін теріңіз…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Жаңа жарлық…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Тағайындалған қолданбалар" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Экрандағы көмекті көрсету" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Мониторды ауыстыру" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Пернелер жарлығын тағайындау" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Дайын" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Түзету…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Ешнәрсе" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Баптау үшін батырманы басыңыз" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Шығу үшін Esc басыңыз" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Шығу үшін кез-келген батырманы басыңыз" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Шығу" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Көрініс" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Жүйелік" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Үстідегі панель" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Команданы енгізу" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Жабу" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Қайта қосу Wayland нұсқасында қолжетерсіз" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Қайта қосу…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d жаңа хабарлама" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d жаңа ескерту" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Блоктау" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME экранды блоктау керек" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Блоктау мүмкін емес" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Блоктауды басқа қолданба болдырмады" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Іздеу…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Нәтижелер жоқ." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "тағы %d" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Көшіру" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Кірістіру" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Мәтінді көрсету" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Мәтінді жасыру" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Пароль" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Парольді есте сақтау" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Қол жетерлілігі" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Үлкейту" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Экраннан оқитын қолданба" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Экрандағы пернетақта" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Бейнелік хабарлау" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Жабысқақ пернелер" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Баяу пернелер" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Қайталанатын пернелер" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Тышқан пернелері" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Жоғары контраст" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Үлкен мәтін" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth баптаулары" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d байланысқан" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Сөнд." + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Іске қос." + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Жарықтылығы" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Пернетақта" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Пернетақта жаймасын көрсету" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Орналасу іске қосулы тұр" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Сөндіру" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Жекелік баптаулары" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Орналасу қолданылуда" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Орналасу сөндірулі тұр" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Іске қосу" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "%s үшін орналасуыңызға рұқсат ету керек пе?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Орналасуыңызға қатынауды кез-кезген кезде жекелік баптауларының ішінен " +"өзгертуге болады." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "<белгісіз>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s сөндірулі" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s байланысқан" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s басқарылмайтын" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s байланысты үзуде" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s байланысуда" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s аутентификацияны талап етеді" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s үшін бинарлы кодтары жоқ" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s қолжетерсіз" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s байланысын орнату сәтсіз" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Сымды желі баптаулары" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Сымсыз кеңжолақты желісінің баптаулары" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s құрылғылық түрде сөндірулі тұр" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s сөндірулі тұр" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Интернетке байланысу" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Ұшақтағы режим іске қосылған" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi ұшақтағы режимі кезінде сөндірілген болады." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Ұшақтағы режимді сөндіру" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi сөндірілген" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Желіге байланысты орнату үшін Wi-Fi іске қосылған болуы тиіс." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi іске қосу" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi желілері" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Желіні таңдау" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Желілер жоқ" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Сөндіру үшін құрылғылық қосқышты қолданыңыз" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Желіні таңдау" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi баптаулары" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s қатынау нүктесі белсенді" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s байланыспаған" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "байланысты орнату…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "аутентификация керек" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "байланысты орнату сәтсіз" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPN баптаулары" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN сөндірілген" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Желі баптаулары" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s сымды желі байланысы" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi желі байланысы" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s модем желі байланысы" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Байланыс орнату сәтсіз" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Желілік байланысты белсендіру сәтсіз" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Түнгі жарық сөндірілген" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Түнгі жарық іске қосылған" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Жалғастыру" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Ертеңге дейін сөндіру" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Қорек баптаулары" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Толығымен зарядталған" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Зарядталуда емес" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Есептеу…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d қалды (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d толық зарядқа дейін (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Экранмен бөлісудесіз" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Сөндіру" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Ұшақтағы режим іске қосулы" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Пайдаланушыны ауыстыру" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Жүйеден шығу" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Тіркелгі баптаулары" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Бағдарды бекіту" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Ұйықтату" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Сөндіру" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Белгісіз Thunderbolt құрылғысы" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Сіз кетіп қалған уақытта жаңа құрылғы анықталған. Оны қолдануды бастау үшін, " +"оны ажыратып, қайта салыңыз." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Авторизацияланбаған Thunderbolt құрылғысы" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Жаңа құрылғы анықталды және де оны әкімші авторизациялау керек." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt авторизация қатесі" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Thunderbolt құралғысын авторизациялау мүмкін емес: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Дыбыс өзгертілді" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Айналы" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Экран­дарды біріктіру" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Тек сыртқы" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Тек құрамындағы" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Басқа пайдаланушы ретінде жүйеге кіру" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Блоктауды алу терезесі" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Қолданбалар" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Іздеу" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "\"%s\" дайын" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Экранның бұл баптауларын сақтауды қалайсыз ба?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Баптауларды қалпына келтіру" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Өзгерістерді сақтау" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Өзгертілген баптаулар %d секундтан кейін қалпына келтіріледі" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Қайыру" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Жазық емес қылу" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Жазық қылу" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Жылжыту" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Өлшемін өзгерту" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Атау жолағын экранға жылжыту" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Әрқашан алдында" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Әрқашан көрінетін жұмыс орнында" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Сол жақтағы жұмыс орнына жылжыту" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Оң жақтағы жұмыс орнына жылжыту" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Жоғарыдағы жұмыс орнына жылжыту" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Төмендегі жұмыс орнына жылжыту" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Жоғарыдағы мониторға жылжыту" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Төмендегі мониторға жылжыту" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Сол жақ мониторға жылжыту" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Оң жақ мониторға жылжыту" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution күнтізбесі" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Баспа нұсқасы" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "GDM жүйеге кіру экраны үшін қолданатын режимі" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Жүйеге кіру экраны үшін арнайы режимді, мыс. \"gdm\", қолдану" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Қолжетерлік режимдерді тізіп шығу" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Белгісіз" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "\"%s\" жөнелту сәтсіз" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Парольдер өзара сәйкес емес." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Пароль бос болуы мүмкін емес" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Аутентификация терезесін пайдаланушы тайдырды" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u шығысы" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u кірісі" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Жүйелік дыбыстар" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "%s үшін баптаулар сұхбатын жүктеу кезінде қате орын алды:" + +#~ msgid "%s all day." +#~ msgstr "%s күні бойы." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, одан кейін %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, одан кейін %s, одан кейін %s." + +#~ msgid "Feels like %s." +#~ msgstr "%s сияқты сезіледі." + +#~ 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 "Жүйелік трейді жасыру" + +#~ msgid "Status Icons" +#~ msgstr "Қалып-күй таңбашалары" + +#~ msgid "Events" +#~ msgstr "Оқиғалар" + +#~ msgid "Notifications" +#~ msgstr "Хабарламалар" + +#~ msgid "Clear section" +#~ msgstr "Санатты тазарту" + +#~ msgid "Media" +#~ msgstr "Медиа" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Shell кеңейту баптаулары" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Веб аутентификацияның қайта бағдарлауы" + +#~ msgid "Not In Use" +#~ msgstr "Қолданылуда емес" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Күнтізбеде апта күнін көрсету" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Ақиқат болса, күнтізбеде ISO апта күнін көрсетеді." + +#~ msgid "Use as Internet connection" +#~ msgstr "Интернетпен байланыс ретінде қолдану" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s орналасу ақпаратыңызға қатынауды сұрайды." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (wayland үйлестіргіші)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d байланысқан құрылғы" + +#~ msgid "Authentication required" +#~ msgstr "Аутентификация керек" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Батарея" + +#~ msgid "Airplane Mode" +#~ msgstr "Ұшақтағы режим" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Шақыру" + +#~ msgid "Call" +#~ msgstr "Қоңырау" + +#~ msgid "File Transfer" +#~ msgstr "Файлдармен алмасу" + +#~ msgid "Chat" +#~ msgstr "Чат" + +#~ msgid "Invitation to %s" +#~ msgstr "%s ішіне шақыру" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s сізді %s ішіне қосылуды шақырады" + +#~ msgid "Decline" +#~ msgstr "Тайдыру" + +#~ msgid "Accept" +#~ msgstr "Қабылдау" + +#~ msgid "Video call from %s" +#~ msgstr "Видео қоңырау: %s" + +#~ msgid "Call from %s" +#~ msgstr "Қоңырау: %s" + +#~ msgid "Answer" +#~ msgstr "Жауап" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s сізге %s жіберуде" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s сіз қашан желіде болатыныңызды білу құқығын сұрап тұр" + +#~ msgid "Authentication failed" +#~ msgstr "Аутентификация сәтсіз" + +#~ msgid "Encryption error" +#~ msgstr "Шифрлеу қатесі" + +#~ msgid "Certificate not provided" +#~ msgstr "Сертификат ұсынылмады" + +#~ msgid "Certificate untrusted" +#~ msgstr "Сертификат сенімсіз" + +#~ msgid "Certificate expired" +#~ msgstr "Сертификаттың мерзімі аяқталған" + +#~ msgid "Certificate not activated" +#~ msgstr "Сертификат белсендірілмеген" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Сертификаттың хост аты сәйкес емес" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Сертификаттың баспасы сәйкес емес" + +#~ msgid "Certificate self-signed" +#~ msgstr "Сертификат өздігінен қолтаңбаланған" + +#~ msgid "Status is set to offline" +#~ msgstr "Қалып-күй желіде емес етіп орнатылды" + +#~ msgid "Certificate is invalid" +#~ msgstr "Сертификат дұрыс емес" + +#~ msgid "Connection has been refused" +#~ msgstr "Сертификат тайдырылды" + +#~ msgid "Connection can't be established" +#~ msgstr "Байланысты орнату мүмкін емес" + +#~ msgid "Connection has been lost" +#~ msgstr "Байланыс жоғалтылды" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Бұл тіркелгі серверге байланысқан болып тұр" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Байланыс дәл сол ресурсты қолданып, жаңа байланыспен алмастырылды" + +#~ msgid "The account already exists on the server" +#~ msgstr "Бұл тіркелгі серверде бар болып тұр" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Сервер бұл байланысты өңдеу үшін тым бос емес" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Сертификат қайта шақырылған" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Сертификат қауіпсіз емес шифрлеу алгоритмін қолдануда немесе " +#~ "криптографиялы әлсіз" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Сервер сертификатының ұзындығы, не ол сертификат тізбегінің ұзындығы " +#~ "криптографиялық жинақ ұсына алатын шегінен асып тұр" + +#~ msgid "Internal error" +#~ msgstr "Ішкі қате" + +#~ msgid "Unable to connect to %s" +#~ msgstr "%s байланысын орнату мүмкін емес" + +#~ msgid "View account" +#~ msgstr "Тіркелгіні қарап шығу" + +#~ msgid "Show the message list" +#~ msgstr "Хабарламалар тізімін көрсету" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Жк" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Бс" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Сс" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Ср" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Бс" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Жм" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Сн" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Жоспар бос" + +#~ msgid "Today" +#~ msgstr "Бүгін" + +#~ msgid "Tomorrow" +#~ msgstr "Ертең" + +#~ msgid "This week" +#~ msgstr "Осы аптада" + +#~ msgid "Next week" +#~ msgstr "Келесі аптада" + +#~ msgid "Removable Devices" +#~ msgstr "Ауыстырмалы құрылғылар" + +#~ msgid "Eject" +#~ msgstr "Шығару" + +#~ msgid "Unmute" +#~ msgstr "Дыбысты қайтару" + +#~ msgid "Mute" +#~ msgstr "Дыбысын өшіру" + +#~ msgid "Open Calendar" +#~ msgstr "Күнтізбені ашу" + +#~ msgid "Open" +#~ msgstr "Ашу" + +#~ msgid "Remove" +#~ msgstr "Өшіру" + +#~ msgid "Clear Messages" +#~ msgstr "Хабарламаларды тазарту" + +#~ msgid "Notification Settings" +#~ msgstr "Хабарлау баптаулары" + +#~ msgid "Tray Menu" +#~ msgstr "Трей мәзірі" + +#~ msgid "No Messages" +#~ msgstr "Хабарламалар жоқ" + +#~ msgid "Message Tray" +#~ msgstr "Жүйелік трей" + +#~ msgid "Captive Portal" +#~ msgstr "Captive-портал" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Орналасудың максималды дәлдік деңгейі." diff --git a/po/km.po b/po/km.po new file mode 100644 index 0000000..4347655 --- /dev/null +++ b/po/km.po @@ -0,0 +1,1740 @@ +# Khmer translation for gnome-shell. +# Copyright (C) 2014 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Khoem Sokhem , 2014. +# Sophea Sok , 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-04-22 07:25+0000\n" +"PO-Revision-Date: 2014-04-03 10:34+0700\n" +"Last-Translator: Sophea Sok \n" +"Language-Team: Khmer <>\n" +"Language: km\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: WordForge 0.8 RC1\n" +"X-Language: km-KH\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "ប្រព័ន្ធ" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "បង្ហាញ​ថាស​សារ" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "ផ្ដោត​លើ​ការ​ជូនដំណឹង​សកម្ម" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "បង្ហាញ​ទិដ្ឋភាព​ទូទៅ" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "បង្ហាញ​កម្មវិធី​ទាំងអស់" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "បើក​ម៉ឺនុយ​កម្មវិធី" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME សែល" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "ការ​គ្រប់គ្រង​វីនដូ និង​ការ​ចាប់ផ្ដើម​កម្មវិធី" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extension Preferences" +msgstr "ចំណូលចិត្ត​ផ្នែក​បន្ថែម​របស់ GNOME សែល" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "កំណត់​រចនាសម្ព័ន្ធ​ផ្នែក​បន្ថែម​របស់ GNOME សែល" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME សែល (wayland compositor)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "បើក​ឧបករណ៍​ខាងក្នុង មាន​ប្រយោជន៍​សម្រាប់​អ្នក​អភិវឌ្ឍន៍ និង​អ្នក​សាកល្បង​ចេញពី Alt-F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "អនុញ្ញាត​ឲ្យ​ចូល​ដំណើរការ​ឧបករណ៍​តាមដាន និង​ឧបករណ៍​បំបាត់​កំហុស​ខាងក្នុង​ដោយ​ប្រើ​ប្រអប់ Alt-F2 ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs នៃ​ផ្នែក​បន្ថែម​ដែល​ត្រូវ​បើក" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"ផ្នែក​បន្ថែម​របស់ GNOME សែល​ដែល​មាន​លក្ខណសម្បត្តិ UUID ។ ពាក្យ​គន្លឹះ​នេះ​គឺ​រាយ​ផ្នែក​បន្ថែម​ដែល​គួរ​ត្រូវ​" +"បាន​ផ្ទុក។ ផ្នែក​បន្ថែម​ណា​ដែល​ត្រូវ​ផ្ទុក គឺ​ត្រូវតែ​នៅ​ក្នុង​បញ្ជី​នេះ។ អ្នក​ក៏​អាច​រៀបចំ​បញ្ជី​នេះ​ដោយ​ប្រើ​" +"វិធីសាស្ត្រ EnableExtension និង DisableExtension D-Bus បាន​ផង​ដែរ​នៅ​លើ org.gnome." +"Shell ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "បិទ​សុពលកម្ម​នៃ​ភាព​ឆបគ្នា​របស់​កំណែ​ផ្នែក​បន្ថែម" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME សែល​នឹង​ផ្ទុក​តែ​ផ្នែក​បន្ថែម​ដែល​ប្រកាស​ដើម្បី​គាំទ្រ​កំណែ​កំពុង​ដំណើរការ​បច្ចុប្បន្ន​ប៉ុណ្ណោះ។ ការ​បើក​" +"ជម្រើស​នេះ គឺ​វា​នឹង​បិទ​ការ​ពិនិត្យមើល​នេះ ហើយ​ព្យាយាម​ផ្ទុក​ផ្នែក​បន្ថែម​ទាំងអស់​ដោយ​មិន​គិត​អំពី​កំណែ​ដែល​ពួកគេ​" +"ប្រកាស​ដើម្បី​គាំទ្រ​ឡើយ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "បញ្ជី​លេខ​សម្គាល់​ឯកសារ​ផ្ទៃតុ​សម្រាប់​កម្មវិធី​សំណព្វ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "កម្មវិធី​ដែល​ត្រូវគ្នា​ជាមួយ​កម្មវិធី​កំណត់​អត្តសញ្ញាណ​ទាំងនេះ នឹង​ត្រូវ​បាន​បង្ហាញ​នៅ​ក្នុង​ផ្ទៃ​សំណព្វ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "History for command (Alt-F2) dialog" +msgstr "ប្រវត្តិ​សម្រាប់​ប្រអប់​ពាក្យ​បញ្ជា (Alt-F2)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "History for the looking glass dialog" +msgstr "ប្រវត្តិ​សម្រាប់​ប្រអប់ looking glass" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "បង្ហាញ​ធាតុ​ម៉ឺនុយ 'ចេញ' ជានិច្ច​នៅ​ក្នុង​ម៉ឺនុយ​អ្នកប្រើ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"ពាក្យ​គន្លឹះ​នេះ​បដិសេធ​ការ​លាក់​ធាតុ​ម៉ឺនុយ 'ចេញ' ស្វ័យប្រវត្តិ​នៅ​ក្នុង​ស្ថានភាព​អ្នកប្រើ​តែមួយ សម័យ​តែមួយ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"ថា​តើ​ត្រូវ​ចងចាំ​ពាក្យសម្ងាត់​សម្រាប់​ការ​ម៉ោន​ប្រព័ន្ធ​ឯកសារ​ពី​ចម្ងាយ ឬ​ឯកសារ​ដែល​បាន​ដាក់​លេខ​កូដ​ដែរ​ឬទេ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"សែល​នឹង​ស្នើ​ពាក្យសម្ងាត់ នៅ​ពេល​ដែល​ឧបករណ៍​ដាក់​លេខ​កូដ ឬ​ប្រព័ន្ធ​ឯកសារ​ពី​ចម្ងាយ​ត្រូវ​បាន​ម៉ោន។ ប្រសិនបើ​" +"ពាក្យសម្ងាត់​អាច​ត្រូវ​បាន​រក្សាទុក​សម្រាប់​ប្រើ​នៅ​ពេល​អនាគត ប្រអប់​ធីក 'ចងចាំ​ពាក្យសម្ងាត់' នឹង​បង្ហាញ។ " +"ពាក្យ​គន្លឹះ​នេះ​កំណត់​សភាព​លំនាំដើម​នៃ​ប្រអប់​ធីក។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "Show the week date in the calendar" +msgstr "បង្ហាញ​កាលបរិច្ឆេទ​សប្ដាហ៍​នៅ​ក្នុង​ប្រតិទិន" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "If true, display the ISO week date in the calendar." +msgstr "បើ​ពិត បង្ហាញ​កាលបរិច្ឆេទ​សប្ដាហ៍ ISO នៅ​ក្នុង​ប្រតិទិន។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Keybinding to open the application menu" +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បើក​ម៉ឺនុយ​កម្មវិធី" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "Keybinding to open the application menu." +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បើក​ម៉ឺនុយ​កម្មវិធី។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បើក​ទិដ្ឋភាព \"កម្មវិធី​បង្ហាញ\"" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បើក​ទិដ្ឋភាព \"កម្មវិធី​បង្ហាញ\" របស់​ទិដ្ឋភាព​សកម្មភាព។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the overview" +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បើក​ទិដ្ឋភាព​ទូទៅ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the Activities Overview." +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បើក​ទិដ្ឋភាព​សកម្មភាព។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បិទ/បើក​លទ្ធភាព​មើល​ឃើញ​របស់​ថាស​សារ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​បិទ/បើក​លទ្ធភាព​មើល​ឃើញ​របស់​ថាស​សារ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to focus the active notification" +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​ផ្ដោត​លើ​ការ​ជូនដំណឹង​សកម្ម" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to focus the active notification." +msgstr "បង្គំ​គ្រាប់ចុច​ដើម្បី​ផ្ដោត​លើ​ការ​ជូនដំណឹង​សកម្ម។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Which keyboard to use" +msgstr "ក្ដារចុច​ដែល​ត្រូវ​ប្រើ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "The type of keyboard to use." +msgstr "ប្រភេទ​ក្ដារចុច​ដែល​ត្រូវ​ប្រើ។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "The maximum accuracy level of location." +msgstr "កម្រិត​សុក្រឹតភាព​អតិបរមា​នៃ​ទីតាំង។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "" +"Configures the maximum level of location accuracy applications are allowed " +"to see. Valid options are 'off' (disable location tracking), 'country', " +"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS " +"receiver). Please keep in mind that this only controls what GeoClue will " +"allow applications to see and they can find user's location on their own " +"using network resources (albeit with street-level accuracy at best)." +msgstr "" +"កំណត់​រចនាសម្ព័ន្ធ​កម្រិត​អតិបរមា​របស់​កម្មវិធី​សុក្រឹតភាព​ទីតាំង​ដែល​បាន​អនុញ្ញាត​ឲ្យ​មើល​ឃើញ។ ជម្រើស​ដែល​ត្រឹមត្រូវ​" +"គឺ 'off' (បិទ​ការ​តាមដាន​ទីតាំង), 'country', 'city', 'neighborhood', 'street', និង " +"'exact' (ត្រូវ​មានឧបករណ៍​ទទួល GPS) ។ សូម​ចងចាំ​ថា​វា​គ្រប់គ្រង​អ្វី​ដែល GeoClue នឹង​អនុញ្ញាត​ឲ្យ​កម្មវិធី​" +"មើល​ឃើញ ហើយ​ពួកគេ​អាច​រក​ឃើញ​ទីតាំង​របស់​អ្នកប្រើ​ដោយ​ប្រើ​ធនធាន​បណ្ដាញ​ផ្ទាល់ខ្លួន (សូម្បីតែ​សុក្រឹតភាព​កម្រិត​" +"ផ្លូវ​ក៏​ល្អ​ដែរ)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The application icon mode." +msgstr "របៀប​រូបតំណាង​កម្មវិធី។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"កំណត់​រចនាសម្ព័ន្ធ​អំពី​របៀប​បង្ហាញ​បង្អួច​នៅ​ក្នុង​កម្មវិធី​ប្ដូរ។ តម្លៃ​ត្រឹមត្រូវ​ដែល​អាច​ប្រើ​បាន​គឺ 'thumbnail-" +"only' (បង្ហាញ​រូបភាព​តូច​របស់​បង្អួច), 'app-icon-only' (បង្ហាញ​តែ​រូបតំណាង​កម្មវិធី​ប៉ុណ្ណោះ) ឬ " +"'both'។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "Attach modal dialog to the parent window" +msgstr "ភ្ជាប់​ប្រអប់​បែបបទ​ទៅ​បង្អួច​មេ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "ពាក្យ​គន្លឹះ​នេះ​បដិសេធ​ពាក្យ​គន្លឹះ​នៅ​ក្នុង org.gnome.mutter ពេល​ដំណើរការ GNOME សែល។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "Arrangement of buttons on the titlebar" +msgstr "ការ​រៀបចំ​ប៊ូតុង​នៅ​លើ​របារ​ចំណងជើង" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"This key overrides the key in org.gnome.desktop.wm.preferences when running " +"GNOME Shell." +msgstr "" +"ពាក្យ​គន្លឹះ​នេះ​បដិសេធ​ពាក្យ​គន្លឹះ​នៅ​ក្នុង org.gnome.desktop.wm.preferences ពេល​ដំណើរការ " +"GNOME សែល។" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "បើក​គម្រប​គែម​ពេល​ទម្លាក់​បង្អួច​នៅ​លើ​គែម​អេក្រង់" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "Workspaces are managed dynamically" +msgstr "តំបន់​ធ្វើការ​ត្រូវ​បាន​គ្រប់គ្រង​ជា​ថាមវន្ត" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Workspaces only on primary monitor" +msgstr "តំបន់​ធ្វើការ​មានតែ​នៅ​លើ​ម៉ូនីទ័រ​មេ​ប៉ុណ្ណោះ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "ប្ដូរ​ការ​ពន្យារពេល​ផ្ដោត​នៅ​ក្នុង​របៀប​កណ្ដុរ​រហូតដល់​ព្រួញ​កណ្ដុរ​លែង​ផ្លាស់ទី" + +#: ../js/extensionPrefs/main.js:127 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "មាន​កំហុស​ពេល​ផ្ទុក​ប្រអប់​ចំណូលចិត្ត​សម្រាប់ %s ៖" + +#: ../js/extensionPrefs/main.js:167 +msgid "Extension" +msgstr "ផ្នែក​បន្ថែម" + +#: ../js/extensionPrefs/main.js:191 +msgid "Select an extension to configure using the combobox above." +msgstr "ជ្រើស​ផ្នែក​បន្ថែម​ដើម្បី​កំណត់​រចនាសម្ព័ន្ធ​ដោយ​ប្រើ​​ប្រអប់​បន្សំ​ខាង​លើ។" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:878 +msgid "Cancel" +msgstr "បោះបង់" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "បន្ទាប់" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "ដោះ​សោ" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "ចូល" + +#: ../js/gdm/loginDialog.js:271 +msgid "Choose Session" +msgstr "ជ្រើស​សម័យ" + +#: ../js/gdm/loginDialog.js:431 +msgid "Not listed?" +msgstr "មិន​បាន​រាយ?" + +#: ../js/gdm/loginDialog.js:616 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ឧ., អ្នកប្រើ ឬ %s)" + +#: ../js/gdm/loginDialog.js:621 ../js/ui/components/networkAgent.js:262 +#: ../js/ui/components/networkAgent.js:280 +msgid "Username: " +msgstr "ឈ្មោះ​អ្នកប្រើ៖" + +#: ../js/gdm/loginDialog.js:924 +msgid "Login Window" +msgstr "បង្អួច​ចូល" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "កំហុស​ការ​ផ្ទៀងផ្ទាត់" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(ឬ​អូស​ម្រាមដៃ)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "រក​មិន​ឃើញ​ពាក្យ​បញ្ជា" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "មិន​អាច​ញែក​ពាក្យ​បញ្ជា៖" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "ការ​ប្រតិបត្តិ “%s” បាន​បរាជ័យ៖" + +#: ../js/ui/appDisplay.js:636 +msgid "Frequently used applications will appear here" +msgstr "កម្មវិធី​ដែល​បាន​ប្រើ​ញឹកញាប់​នឹង​បង្ហាញ​នៅ​ទីនេះ" + +#: ../js/ui/appDisplay.js:747 +msgid "Frequent" +msgstr "ញឹកញាប់" + +#: ../js/ui/appDisplay.js:754 +msgid "All" +msgstr "ទាំងអស់" + +#: ../js/ui/appDisplay.js:1567 +msgid "New Window" +msgstr "បង្អួច​ថ្មី" + +#: ../js/ui/appDisplay.js:1589 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "យកចេញ​ពី​សំណព្វ" + +#: ../js/ui/appDisplay.js:1595 +msgid "Add to Favorites" +msgstr "បន្ថែម​ទៅ​សំណព្វ" + +#: ../js/ui/appFavorites.js:87 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "បាន​បន្ថែម %s ទៅកាន់​សំណព្វ​របស់​អ្នក។" + +#: ../js/ui/appFavorites.js:121 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "បាន​យក %s ចេញពី​សំណព្វ​របស់​អ្នក។" + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810 +#: ../js/ui/status/system.js:334 +msgid "Settings" +msgstr "ការ​កំណត់" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "ប្ដូរ​ផ្ទៃ​ខាងក្រោយ..." + +#. 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:64 +msgctxt "event list time" +msgid "All Day" +msgstr "ពេញ​មួយ​ថ្ងៃ" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:70 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:79 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:110 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:112 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:114 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:116 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:118 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:120 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:122 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:135 +msgctxt "list sunday" +msgid "Su" +msgstr "Su" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:137 +msgctxt "list monday" +msgid "M" +msgstr "M" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:139 +msgctxt "list tuesday" +msgid "T" +msgstr "T" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:141 +msgctxt "list wednesday" +msgid "W" +msgstr "W" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:143 +msgctxt "list thursday" +msgid "Th" +msgstr "Th" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:145 +msgctxt "list friday" +msgid "F" +msgstr "F" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:147 +msgctxt "list saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:390 +msgid "calendar:MY" +msgstr "calendar:MY" + +#: ../js/ui/calendar.js:450 +msgid "Previous month" +msgstr "ខែ​មុន" + +#: ../js/ui/calendar.js:460 +msgid "Next month" +msgstr "ខែ​បន្ទាប់" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:772 +msgid "Nothing Scheduled" +msgstr "គ្មាន​កាលវិភាគ" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:790 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:793 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:804 +msgid "Today" +msgstr "ថ្ងៃនេះ" + +#: ../js/ui/calendar.js:808 +msgid "Tomorrow" +msgstr "ថ្ងៃស្អែក" + +#: ../js/ui/calendar.js:819 +msgid "This week" +msgstr "សប្ដាហ៍​នេះ" + +#: ../js/ui/calendar.js:827 +msgid "Next week" +msgstr "សប្ដាហ៍​បន្ទាប់" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "បាន​ភ្ជាប់​ដ្រាយ​ខាងក្រៅ" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "បាន​ផ្ដាច់​ដ្រាយ​ខាងក្រៅ" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "ឧបករណ៍​ចល័ត" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "បើក​ជាមួយ %s" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "ច្រានចេញ" + +#: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "ពាក្យសម្ងាត់៖" + +#: ../js/ui/components/keyring.js:110 +msgid "Type again:" +msgstr "វាយ​ម្ដងទៀត៖" + +#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240 +#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881 +msgid "Connect" +msgstr "តភ្ជាប់" + +#: ../js/ui/components/networkAgent.js:224 +#: ../js/ui/components/networkAgent.js:236 +#: ../js/ui/components/networkAgent.js:264 +#: ../js/ui/components/networkAgent.js:284 +#: ../js/ui/components/networkAgent.js:294 +msgid "Password: " +msgstr "ពាក្យសម្ងាត់៖" + +#: ../js/ui/components/networkAgent.js:229 +msgid "Key: " +msgstr "សោ៖" + +#: ../js/ui/components/networkAgent.js:268 +msgid "Identity: " +msgstr "អត្តសញ្ញាណ៖" + +#: ../js/ui/components/networkAgent.js:270 +msgid "Private key password: " +msgstr "ពាក្យសម្ងាត់​សោ​ឯកជន៖" + +#: ../js/ui/components/networkAgent.js:282 +msgid "Service: " +msgstr "សេវាកម្ម៖" + +#: ../js/ui/components/networkAgent.js:311 +msgid "Authentication required by wireless network" +msgstr "បាន​ទាមទារ​ការ​ផ្ទៀងផ្ទាត់​តាម​បណ្ដាញ​ឥតខ្សែ" + +#: ../js/ui/components/networkAgent.js:312 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "បាន​ទាមទារ​ពាក្យសម្ងាត់ ឬ​សោ​លេខ​កូដ​ដើម្បី​ចូល​ដំណើរការ​បណ្ដាញ​ឥត​ខ្សែ “%s” ។" + +#: ../js/ui/components/networkAgent.js:316 +msgid "Wired 802.1X authentication" +msgstr "ការ​ផ្ទៀង​ផ្ទាត់​ខ្សែ 802.1X" + +#: ../js/ui/components/networkAgent.js:318 +msgid "Network name: " +msgstr "ឈ្មោះ​បណ្ដាញ៖" + +#: ../js/ui/components/networkAgent.js:323 +msgid "DSL authentication" +msgstr "ការ​ផ្ទៀងផ្ទាត់ DSL" + +#: ../js/ui/components/networkAgent.js:330 +msgid "PIN code required" +msgstr "បាន​ទាមទារ​លេខ​កូដ PIN" + +#: ../js/ui/components/networkAgent.js:331 +msgid "PIN code is needed for the mobile broadband device" +msgstr "បាន​ទាមទារ​លេខ​កូដ PIN សម្រាប់​ឧបករណ៍​រលក​អាកាស​ធំ​ចល័ត" + +#: ../js/ui/components/networkAgent.js:332 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:338 +msgid "Mobile broadband network password" +msgstr "ពាក្យសម្ងាត់​បណ្ដាញ​រលក​អាកាស​ធំ​ចល័ត" + +#: ../js/ui/components/networkAgent.js:339 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "បាន​ទាមទារ​ពាក្យសម្ងាត់​ដើម្បី​តភ្ជាប់​ទៅ “%s” ។" + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "បាន​ទាមទារ​ការ​ផ្ទៀងផ្ទាត់" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "អ្នក​គ្រប់គ្រង" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "ផ្ទៀងផ្ទាត់" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "សុំទោស​ដែល​មិន​ដំណើរការ។ សូម​ព្យាយាម​ម្ដងទៀត។" + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "ការ​អញ្ជើញ" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "ហៅ" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "ផ្ទេរ​ឯកសារ" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "ជជែក" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "បើក​សំឡេង" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "បិទ​សំឡេង" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:958 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:965 +msgid "Yesterday, %H∶%M" +msgstr "ម្សិលមិញ %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:972 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:979 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:985 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:994 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1001 +msgid "Yesterday, %l∶%M %p" +msgstr "ម្សិលមិញ %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1008 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1015 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1021 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1054 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s បាន​ស្គាល់​ជា %s" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1158 +#, javascript-format +msgid "Invitation to %s" +msgstr "ការ​អញ្ជើញ​មកកាន់ %s" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1166 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s អញ្ជើញ​អ្នក​ឲ្យ​ចូលរួម %s" + +#: ../js/ui/components/telepathyClient.js:1168 +#: ../js/ui/components/telepathyClient.js:1203 +#: ../js/ui/components/telepathyClient.js:1237 +#: ../js/ui/components/telepathyClient.js:1295 +msgid "Decline" +msgstr "បដិសេធ" + +#: ../js/ui/components/telepathyClient.js:1174 +#: ../js/ui/components/telepathyClient.js:1243 +#: ../js/ui/components/telepathyClient.js:1300 +msgid "Accept" +msgstr "ព្រម​ទទួល" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1193 +#, javascript-format +msgid "Video call from %s" +msgstr "ហៅ​ជា​វីដេអូ​ពី %s" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1196 +#, javascript-format +msgid "Call from %s" +msgstr "ហៅ​ពី %s" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1210 +msgid "Answer" +msgstr "ឆ្លើយ" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1231 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s កំពុង​ផ្ញើ %s ឲ្យ​អ្នក" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1260 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "%s ចង់​បាន​សិទ្ធិ​ដើម្បី​មើល ពេល​អ្នក​នៅ​ក្រៅ​បណ្ដាញ" + +#: ../js/ui/components/telepathyClient.js:1346 +msgid "Network error" +msgstr "កំហុស​បណ្ដាញ" + +#: ../js/ui/components/telepathyClient.js:1348 +msgid "Authentication failed" +msgstr "ការ​ផ្ទៀងផ្ទាត់​បាន​បរាជ័យ" + +#: ../js/ui/components/telepathyClient.js:1350 +msgid "Encryption error" +msgstr "កំហុស​ការ​ដាក់​លេខ​កូដ" + +#: ../js/ui/components/telepathyClient.js:1352 +msgid "Certificate not provided" +msgstr "មិន​បាន​ផ្ដល់​វិញ្ញាបនបត្រ" + +#: ../js/ui/components/telepathyClient.js:1354 +msgid "Certificate untrusted" +msgstr "វិញ្ញាបនបត្រ​មិន​ទុកចិត្ត" + +#: ../js/ui/components/telepathyClient.js:1356 +msgid "Certificate expired" +msgstr "វិញ្ញាបនបត្រ​ផុត​កំណត់" + +#: ../js/ui/components/telepathyClient.js:1358 +msgid "Certificate not activated" +msgstr "វិញ្ញាបនបត្រ​មិន​បាន​ធ្វើឲ្យ​សកម្ម" + +#: ../js/ui/components/telepathyClient.js:1360 +msgid "Certificate hostname mismatch" +msgstr "វិញ្ញាបនបត្រ​ឈ្មោះ​ម៉ាស៊ីន​មិន​ផ្គូផ្គង" + +#: ../js/ui/components/telepathyClient.js:1362 +msgid "Certificate fingerprint mismatch" +msgstr "វិញ្ញាបនបត្រ​ស្នាម​ម្រាមដៃ​មិន​ផ្គូផ្គង" + +#: ../js/ui/components/telepathyClient.js:1364 +msgid "Certificate self-signed" +msgstr "វិញ្ញាបនបត្រ​ចុះហត្ថលេខា​ខ្លួន​ឯង" + +#: ../js/ui/components/telepathyClient.js:1366 +msgid "Status is set to offline" +msgstr "បាន​កំណត់​ស្ថានភាព​ទៅ​ក្រៅ​បណ្ដាញ" + +#: ../js/ui/components/telepathyClient.js:1368 +msgid "Encryption is not available" +msgstr "មិន​មាន​ការ​ដាក់​លេខ​កូដ" + +#: ../js/ui/components/telepathyClient.js:1370 +msgid "Certificate is invalid" +msgstr "វិញ្ញាបនបត្រ​មិន​ត្រឹមត្រូវ" + +#: ../js/ui/components/telepathyClient.js:1372 +msgid "Connection has been refused" +msgstr "បាន​បដិសេធ​ការ​តភ្ជាប់" + +#: ../js/ui/components/telepathyClient.js:1374 +msgid "Connection can't be established" +msgstr "មិន​អាច​បង្កើត​ការ​តភ្ជាប់" + +#: ../js/ui/components/telepathyClient.js:1376 +msgid "Connection has been lost" +msgstr "ការ​តភ្ជាប់​បាន​ដាច់" + +#: ../js/ui/components/telepathyClient.js:1378 +msgid "This account is already connected to the server" +msgstr "គណនី​នេះ​បាន​ភ្ជាប់​ទៅ​ម៉ាស៊ីន​មេ​រួចហើយ" + +#: ../js/ui/components/telepathyClient.js:1380 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "បាន​ជំនួស​ការ​តភ្ជាប់​ថ្មី​ដោយ​ប្រើ​ធនធាន​ដូចគ្នា" + +#: ../js/ui/components/telepathyClient.js:1382 +msgid "The account already exists on the server" +msgstr "គណនី​មាន​នៅ​លើ​ម៉ាស៊ីន​មេ​រួចហើយ" + +#: ../js/ui/components/telepathyClient.js:1384 +msgid "Server is currently too busy to handle the connection" +msgstr "ម៉ាស៊ីន​មេ​កំពុង​រវល់​ក្នុង​ការ​តភ្ជាប់" + +#: ../js/ui/components/telepathyClient.js:1386 +msgid "Certificate has been revoked" +msgstr "បាន​ដកហូត​វិញ្ញាបនបត្រ" + +#: ../js/ui/components/telepathyClient.js:1388 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "វិញ្ញាបនបត្រ​ប្រើ​ក្បួន​ដោះស្រាយ​ការ​សរសេរ​សម្ងាត់​ដែល​គ្មាន​សុវត្ថិភាព ឬ​ការ​ដាក់​លេខ​កូដ​ខ្សោយ" + +#: ../js/ui/components/telepathyClient.js:1390 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"ប្រវែង​វិញ្ញាបនបត្រ​ម៉ាស៊ីន​មេ ឬ​ជម្រៅ​ច្រវាក់​វិញ្ញាបនបត្រ​ម៉ាស៊ីន​មេ​បាន​លើស​ដែន​កំណត់​ដែល​បាន​បង្ខំ​ដោយ​បណ្ណាល័យ​" +"ការ​ដាក់​លេខ​កូដ" + +#: ../js/ui/components/telepathyClient.js:1392 +msgid "Internal error" +msgstr "កំហុស​ខាងក្នុង" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1402 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "មិន​អាច​តភ្ជាប់​ទៅ %s" + +#: ../js/ui/components/telepathyClient.js:1407 +msgid "View account" +msgstr "មើល​គណនី" + +#: ../js/ui/components/telepathyClient.js:1444 +msgid "Unknown reason" +msgstr "មិន​ស្គាល់​មូលហេតុ" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96 +msgid "Windows" +msgstr "វីនដូ" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "បង្ហាញ​កម្មវិធី" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "ដាច់ៗ" + +#: ../js/ui/dateMenu.js:91 +msgid "Open Calendar" +msgstr "បើក​ប្រតិទិន" + +#: ../js/ui/dateMenu.js:95 +msgid "Open Clocks" +msgstr "បើក​នាឡិកា" + +#: ../js/ui/dateMenu.js:102 +msgid "Date & Time Settings" +msgstr "ការ​កំណត់​កាលបរិច្ឆេទ និង​ពេលវេលា" + +#. 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:192 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:66 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "ចេញ %s" + +#: ../js/ui/endSessionDialog.js:67 +msgctxt "title" +msgid "Log Out" +msgstr "ចេញ" + +#: ../js/ui/endSessionDialog.js:69 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s នឹង​ចេញ​ដោយ​ស្វ័យប្រវត្តិ​ក្នុង​រយៈពេល %d វិនាទី។" + +#: ../js/ui/endSessionDialog.js:74 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "អ្នក​នឹង​ចេញ​ដោយ​ស្វ័យប្រវត្តិ​ក្នុង​រយៈពេល %d វិនាទី។" + +#: ../js/ui/endSessionDialog.js:80 +msgctxt "button" +msgid "Log Out" +msgstr "ចេញ" + +#: ../js/ui/endSessionDialog.js:86 +msgctxt "title" +msgid "Power Off" +msgstr "បិទ" + +#: ../js/ui/endSessionDialog.js:87 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "ដំឡើង​បច្ចុប្បន្នភាព រួច​បិទ" + +#: ../js/ui/endSessionDialog.js:89 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "ប្រព័ន្ធ​នឹង​បិទ​ដោយ​ស្វ័យប្រវត្តិ​ក្នុង​រយៈពេល %d វិនាទី។" + +#: ../js/ui/endSessionDialog.js:93 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "ដំឡើង​បច្ចុប្បន្នភាព​កម្មវិធី​មិនទាន់​សម្រេច" + +#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Restart" +msgstr "ចាប់ផ្ដើម​ឡើងវិញ" + +#: ../js/ui/endSessionDialog.js:98 +msgctxt "button" +msgid "Power Off" +msgstr "បិទ" + +#: ../js/ui/endSessionDialog.js:105 +msgctxt "title" +msgid "Restart" +msgstr "ចាប់ផ្ដើម​ឡើងវិញ" + +#: ../js/ui/endSessionDialog.js:107 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "ប្រព័ន្ធ​នឹង​ចាប់ផ្ដើម​ឡើងវិញ​ដោយ​ស្វ័យប្រវត្តិ​ក្នុង​រយៈពេល %d វិនាទី។" + +#: ../js/ui/endSessionDialog.js:121 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "ចាប់ផ្ដើម​ឡើងវិញ រួច​ដំឡើង​បច្ចុប្បន្នភាព" + +#: ../js/ui/endSessionDialog.js:123 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "ប្រព័ន្ធ​នឹង​ចាប់ផ្ដើម​ឡើងវិញ រួច​ដំឡើង​បច្ចុប្បន្នភាព​ដោយ​ស្វ័យប្រវត្តិ​ក្នុង​រយៈពេល %d វិនាទី។" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "button" +msgid "Restart & Install" +msgstr "ចាប់ផ្ដើម​ឡើងវិញ & ដំឡើង" + +#: ../js/ui/endSessionDialog.js:130 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ដំឡើង & បិទ" + +#: ../js/ui/endSessionDialog.js:131 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "បិទ​បន្ទាប់ពី​បាន​ដំឡើង​បច្ចុប្បន្នភាព" + +#: ../js/ui/endSessionDialog.js:315 +msgid "Running on battery power: please plug in before installing updates." +msgstr "កំពុង​ដំណើរការ​ដោយសារ​ថាមពល​ថ្ម៖ សូម​ដោត​ខ្សែ​មុន​នឹង​ដំឡើង​បច្ចុប្បន្នភាព។" + +#: ../js/ui/endSessionDialog.js:332 +msgid "Some applications are busy or have unsaved work." +msgstr "កម្មវិធី​មួយ​ចំនួន​កំពុង​រវល់ ឬ​មាន​កិច្ចការ​មិនទាន់​រក្សាទុក។" + +#: ../js/ui/endSessionDialog.js:339 +msgid "Other users are logged in." +msgstr "អ្នកប្រើ​ផ្សេង​បាន​ចូល។" + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:619 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (ពី​ចម្ងាយ)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:622 +#, javascript-format +msgid "%s (console)" +msgstr "%s (កុងសូល)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "ដំឡើង" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "ទាញ​យក និង​ដំឡើង “%s” ពី extensions.gnome.org?" + +#: ../js/ui/keyboard.js:645 ../js/ui/status/keyboard.js:335 +msgid "Keyboard" +msgstr "ក្ដារចុច" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "មិន​បាន​ដំឡើង​ផ្នែក​បន្ថែម" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s មិន​បាន​បញ្ចេញ​កំហុស។" + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "លាក់​កំហុស" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "បង្ហាញ​កំហុស" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59 +#: ../js/ui/status/location.js:167 +msgid "Enabled" +msgstr "បាន​បើក" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164 +#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "បាន​បិទ" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "កំហុស" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "ហួស​សម័យ" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "ការ​ទាញ​យក" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "មើល​ប្រភព" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "ទំព័រ​បណ្ដាញ" + +#: ../js/ui/messageTray.js:1326 +msgid "Open" +msgstr "បើក" + +#: ../js/ui/messageTray.js:1333 +msgid "Remove" +msgstr "យកចេញ" + +#: ../js/ui/messageTray.js:1630 +msgid "Notifications" +msgstr "ការ​ជូនដំណឹង" + +#: ../js/ui/messageTray.js:1637 +msgid "Clear Messages" +msgstr "សម្អាត​សារ" + +#: ../js/ui/messageTray.js:1656 +msgid "Notification Settings" +msgstr "ការ​កំណត់​ការ​ជូនដំណឺង" + +#: ../js/ui/messageTray.js:1709 +msgid "Tray Menu" +msgstr "ម៉ឺនុយ​ថាស" + +#: ../js/ui/messageTray.js:1926 +msgid "No Messages" +msgstr "មិន​មាន​សារ" + +#: ../js/ui/messageTray.js:1964 +msgid "Message Tray" +msgstr "ថាស​សារ" + +#: ../js/ui/messageTray.js:2967 +msgid "System Information" +msgstr "ព័ត៌មាន​ប្រព័ន្ធ" + +#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "មិន​ស្គាល់" + +#: ../js/ui/overviewControls.js:483 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "សារ​ថ្មី %d" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "មិនធ្វើវិញ" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "ទិដ្ឋភាព​ទូទៅ" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:250 +msgid "Type to search…" +msgstr "វាយ​បញ្ចូល​ដើម្បី​ស្វែងរក..." + +#: ../js/ui/panel.js:516 +msgid "Quit" +msgstr "បោះបង់" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:568 +msgid "Activities" +msgstr "សកម្មភាព" + +#: ../js/ui/panel.js:915 +msgid "Top Bar" +msgstr "របារ​កំពូល" + +#: ../js/ui/popupMenu.js:271 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:74 +msgid "Enter a Command" +msgstr "បញ្ចូល​ពាក្យ​បញ្ជា" + +#: ../js/ui/runDialog.js:114 +msgid "Close" +msgstr "បិទ" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "ការ​ជូនដំណឺង​ថ្មី %d" + +#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342 +msgid "Lock" +msgstr "ចាក់សោ" + +#: ../js/ui/screenShield.js:708 +msgid "GNOME needs to lock the screen" +msgstr "GNOME ត្រូវការ​ចាក់សោ​អេក្រង់" + +#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1312 +msgid "Unable to lock" +msgstr "មិន​អាច​ចាក់សោ" + +#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1313 +msgid "Lock was blocked by an application" +msgstr "បាន​ទប់ស្កាត់​ការ​ចាក់សោ​ដោយ​កម្មវិធី" + +#: ../js/ui/search.js:606 +msgid "Searching…" +msgstr "កំពុង​ស្វែងរក..." + +#: ../js/ui/search.js:652 +msgid "No results." +msgstr "មិន​មាន​លទ្ធផល។" + +#: ../js/ui/shellEntry.js:27 +msgid "Copy" +msgstr "ចម្លង" + +#: ../js/ui/shellEntry.js:32 +msgid "Paste" +msgstr "បិទភ្ជាប់" + +#: ../js/ui/shellEntry.js:99 +msgid "Show Text" +msgstr "បង្ហាញ​អត្ថបទ" + +#: ../js/ui/shellEntry.js:101 +msgid "Hide Text" +msgstr "លាក់​អត្ថបទ" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "ពាក្យសម្ងាត់" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "ចងចាំ​ពាក្យសម្ងាត់" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "ងាយស្រួល" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "ពង្រីក" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "កម្មវិធី​អាន​អេក្រង់" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "ក្ដារចុច​អេក្រង់" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "ការ​ជូនដំណឹង​និម្មិត" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "គ្រាប់ចុចស្អិត" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "គ្រាប់ចុច​យឺត" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "គ្រាប់ចុច​លោត" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "ប៊ូតុង​កណ្ដុរ" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "កម្រិត​ពណ៌​ខ្ពស់" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "អត្ថបទ​ធំ" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ប៊្លូធូស" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151 +#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234 +#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85 +#: ../js/ui/status/rfkill.js:105 +msgid "Turn Off" +msgstr "បិទ" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ការ​កំណត់​ប៊្លូធូស" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "បាន​តភ្ជាប់​ឧបករណ៍ %d" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262 +msgid "Not Connected" +msgstr "មិន​បាន​តភ្ជាប់" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "ពន្លឺ" + +#: ../js/ui/status/keyboard.js:403 +msgid "Show Keyboard Layout" +msgstr "បង្ហាញ​ប្លង់​ក្ដារចុច" + +#: ../js/ui/status/location.js:53 +msgid "Location" +msgstr "ទីតាំង" + +#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168 +msgid "Disable" +msgstr "បិទ" + +#: ../js/ui/status/location.js:165 +msgid "Enable" +msgstr "បើក" + +#: ../js/ui/status/location.js:167 +msgid "In Use" +msgstr "កំពុង​ប្រើ" + +#: ../js/ui/status/network.js:74 +msgid "" +msgstr "<មិន​ស្គាល់>" + +#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260 +#: ../js/ui/status/network.js:1464 +msgid "Off" +msgstr "បិទ" + +#: ../js/ui/status/network.js:422 +msgid "Connected" +msgstr "បាន​តភ្ជាប់" + +#. 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) */ +#: ../js/ui/status/network.js:426 +#| msgid "unmanaged" +msgid "Unmanaged" +msgstr "មិន​បាន​គ្រប់គ្រង" + +#: ../js/ui/status/network.js:428 +#| msgid "disconnecting..." +msgid "Disconnecting" +msgstr "​ផ្ដាច់" + +#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254 +msgid "Connecting" +msgstr "ការ​តភ្ជាប់" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:437 +#| msgid "authentication required" +msgid "Authentication required" +msgstr "ទាមទារ​ការ​ផ្ទៀងផ្ទាត់" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:445 +#| msgid "firmware missing" +msgid "Firmware missing" +msgstr "បាត់​កម្មវិធី​បង្កប់" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:449 +#| msgid "unavailable" +msgid "Unavailable" +msgstr "មិន​មាន" + +#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646 +msgid "Connection failed" +msgstr "ការ​តភ្ជាប់​បាន​បរាជ័យ" + +#: ../js/ui/status/network.js:467 +msgid "Wired Settings" +msgstr "ការ​កំណត់​ខ្សែ" + +#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587 +msgid "Mobile Broadband Settings" +msgstr "ការ​កំណត់​រលក​អាកាស​ធំ​ចល័ត" + +#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258 +msgid "Hardware Disabled" +msgstr "បាន​បិទ​ផ្នែក​រឹង" + +#: ../js/ui/status/network.js:595 +msgid "Use as Internet connection" +msgstr "ប្រើ​ជា​ការ​តភ្ជាប់​អ៊ីនធឺណិត" + +#: ../js/ui/status/network.js:776 +msgid "Airplane Mode is On" +msgstr "បាន​របៀប​ជិះ​យន្តហោះ" + +#: ../js/ui/status/network.js:777 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "វ៉ាយហ្វាយ​ត្រូវ​បាន​បិទ ពេល​បើក​របៀប​ជិះ​យន្តហោះ។" + +#: ../js/ui/status/network.js:778 +msgid "Turn Off Airplane Mode" +msgstr "បិទ​របៀប​ជិះ​យន្តហោះ" + +#: ../js/ui/status/network.js:787 +msgid "Wi-Fi is Off" +msgstr "បាន​បិទ​វ៉ាយហ្វាយ" + +#: ../js/ui/status/network.js:788 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "ចាំបាច់​ត្រូវ​បើក​វ៉ាយហ្វាយ​ដើម្បី​តភ្ជាប់​បណ្ដាញ។" + +#: ../js/ui/status/network.js:789 +msgid "Turn On Wi-Fi" +msgstr "បើក​វ៉ាយហ្វាយ" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi Networks" +msgstr "បណ្ដាញ​វ៉ាយហ្វាយ" + +#: ../js/ui/status/network.js:816 +msgid "Select a network" +msgstr "ជ្រើស​បណ្ដាញ" + +#: ../js/ui/status/network.js:845 +msgid "No Networks" +msgstr "គ្មាន​បណ្ដាញ" + +#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103 +msgid "Use hardware switch to turn off" +msgstr "ប្រើ​កុងតាក់​ផ្នែក​រឹង​ដើម្បី​បិទ" + +#: ../js/ui/status/network.js:1136 +msgid "Select Network" +msgstr "ជ្រើស​បណ្ដាញ" + +#: ../js/ui/status/network.js:1142 +msgid "Wi-Fi Settings" +msgstr "ការ​កំណត់​វ៉ាយហ្វាយ" + +#: ../js/ui/status/network.js:1234 +msgid "Turn On" +msgstr "បើក" + +#: ../js/ui/status/network.js:1251 +msgid "Hotspot Active" +msgstr "ហតស្ប៉ត​សកម្ម" + +#: ../js/ui/status/network.js:1362 +msgid "connecting..." +msgstr "កំពុង​តភ្ជាប់" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1365 +msgid "authentication required" +msgstr "ទាមទារ​ការ​ផ្ទៀងផ្ទាត់" + +#: ../js/ui/status/network.js:1367 +msgid "connection failed" +msgstr "ការ​តភ្ជាប់​បាន​បរាជ័យ" + +#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88 +msgid "Network Settings" +msgstr "ការ​កំណត់​បណ្ដាញ" + +#: ../js/ui/status/network.js:1435 +msgid "VPN Settings" +msgstr "ការ​កំណត់​វីភីអិន" + +#: ../js/ui/status/network.js:1454 +msgid "VPN" +msgstr "វីភីអិន" + +#: ../js/ui/status/network.js:1607 +msgid "Network Manager" +msgstr "កម្មវិធី​គ្រប់គ្រង​បណ្ដាញ" + +#: ../js/ui/status/network.js:1647 +msgid "Activation of network connection failed" +msgstr "ការ​ធ្វើឲ្យ​បណ្ដាញ​សកម្ម បាន​បរាជ័យ" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "ការ​កំណត់ថាមពល" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "បាន​បញ្ចូល​ពេញ" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "កំពុង​ប៉ាន់ស្មាន..." + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d នៅសល់ (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d រហូត​ពេញ (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "យូភីអេស" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "ថ្ម" + +#: ../js/ui/status/rfkill.js:82 +msgid "Airplane Mode" +msgstr "របៀប​ជិះ​យន្តហោះ" + +#: ../js/ui/status/rfkill.js:84 +msgid "On" +msgstr "បើក" + +#: ../js/ui/status/system.js:314 +msgid "Switch User" +msgstr "ប្ដូរ​អ្នកប្រើ" + +#: ../js/ui/status/system.js:319 +msgid "Log Out" +msgstr "ចេញ" + +#: ../js/ui/status/system.js:338 +msgid "Orientation Lock" +msgstr "ចាក់សោ​ទិស" + +#: ../js/ui/status/system.js:346 +msgid "Suspend" +msgstr "ផ្អាក" + +#: ../js/ui/status/system.js:349 +msgid "Power Off" +msgstr "បិទ" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ប្ដូរ​កម្រិត​សំឡេង" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "កម្រិត​សំឡេង" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "មីក្រូហ្វូន" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "ចូល​ជា​អ្នកប្រើ​ផ្សេង" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "ដោះ​សោ​វីនដូ" + +#: ../js/ui/viewSelector.js:100 +msgid "Applications" +msgstr "កម្មវិធី" + +#: ../js/ui/viewSelector.js:104 +msgid "Search" +msgstr "ស្វែងរក" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” គឺ​រួចរាល់​ហើយ" + +#: ../js/ui/windowManager.js:56 +msgid "Do you want to keep these display settings?" +msgstr "អ្នក​ចង់​រក្សា​ការ​កំណត់​បង្ហាញ​ទាំងនេះ​ដែរ​ឬទេ?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:75 +msgid "Revert Settings" +msgstr "ត្រឡប់​ការ​កំណត់​ទៅ​ដើម" + +#: ../js/ui/windowManager.js:79 +msgid "Keep Changes" +msgstr "រក្សា​ការ​ផ្លាស់ប្ដូរ" + +#: ../js/ui/windowManager.js:98 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "ការ​ផ្លាស់ប្ដូរ​ការ​កំណត់​នឹង​ត្រឡប់​ទៅ​ដើម​ក្នុង​រយៈពេល %d វិនាទី" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "ប្រតិទិន​ការ​វិវត្ត" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "ចេញ %u" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "ចូល %u" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "សំឡេង​ប្រព័ន្ធ" + +#: ../src/main.c:349 +msgid "Print version" +msgstr "បោះពុម្ព​កំណែ" + +#: ../src/main.c:355 +msgid "Mode used by GDM for login screen" +msgstr "របៀប​ដែល​បាន​ប្រើ​ដោយ GDM សម្រាប់​អេក្រង់​ចូល" + +#: ../src/main.c:361 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "ប្រើ​រៀប​ជាក់លាក់, ឧ. \"gdm\" សម្រាប់​អេក្រង់​ចូល" + +#: ../src/main.c:367 +msgid "List possible modes" +msgstr "រាយ​របៀប​ដែល​អាច​ធ្វើ​បាន" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ចាប់ផ្ដើម “%s”" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "ពាក្យសម្ងាត់​មិន​ផ្គូរផ្គង។" + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "ពាក្យសម្ងាត់​មិន​អាចទទេ" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "បាន​បដិសេធ​ប្រអប់​ផ្ទៀងផ្ទាត់​ដោយ​អ្នកប្រើ" diff --git a/po/kn.po b/po/kn.po new file mode 100644 index 0000000..6aed880 --- /dev/null +++ b/po/kn.po @@ -0,0 +1,2220 @@ +# Kannada translation for gnome-shell. +# Copyright (C) 2011 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Shankar Prasad , 2011, 2012, 2013, 2014. +# Shankar , 2013. #zanata. +# Shankar , 2014. #zanata. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-21 19:28+0000\n" +"PO-Revision-Date: 2014-09-22 12:15+0530\n" +"Last-Translator: Shankar Prasad \n" +"Language-Team: Kannada \n" +"Language: kn\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: Lokalize 1.5\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "ವ್ಯವಸ್ಥೆ" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "ಸಂದೇಶ ಟ್ರೇ ಅನ್ನು ತೋರಿಸು" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "ಸಕ್ರಿಯ ಸೂಚನೆಯತ್ತ ಗಮನಹರಿಸು" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "ಅವಲೋಕನವನ್ನು ತೋರಿಸು" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "ಎಲ್ಲಾ ಅನ್ವಯಗಳನ್ನು ತೋರಿಸು" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "ಅನ್ವಯಗಳ ಮೆನುವನ್ನು ತೆರೆ" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME ಶೆಲ್‌" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "ಕಿಟಕಿ ನಿರ್ವಹಣೆ ಹಾಗು ಅನ್ವಯವನ್ನು ಆರಂಭಿಸುವಿಕೆ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME ಶೆಲ್ ಎಕ್ಸ‍ಟೆನ್ಶನ್‍ ಆದ್ಯತೆಗಳು" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME ಶೆಲ್ ಎಕ್ಸ‍ಟೆನ್ಶನ್ಸ್ ಅನ್ನು ಸಂರಚಿಸಿ" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME ಶೆಲ್‌ (ವೇಲ್ಯಾಂಡ್‌ ) ಸಂಯೋಜಕ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Alt-F2 ಇಂದ ವಿಕಸನೆಗಾರರಿಗೆ ಹಾಗು ಪರೀಕ್ಷಕರಿಗೆ ಉಪಯುಕ್ತವಾಗುವ ಆಂತರಿಕ ಉಪಕರಣಗಳನ್ನು " +"ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 ಸಂವಾದಚೌಕವನ್ನು ಬಳಸಿಕೊಂಡು ಆಂತರಿಕ ದೋಷ ನಿವಾರಣೆ ಹಾಗು ಮೇಲ್ವಿಚಾರಣೆ " +"ಉಪಕರಣಗಳನ್ನು " +"ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಅನುವುಮಾಡಿಕೊಡುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಿರುವ ವಿಸ್ತರಣೆಗಳ UUIDಗಳು" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME ಶೆಲ್ ವಿಸ್ತರಣೆಗಳು ಒಂದು UUID ಗುಣವನ್ನು ಹೊಂದಿರುತ್ತವೆ; ಈ ಕೀಲಿ ಪಟ್ಟಿಯು ಲೋಡ್ " +"ಮಾಡಬೇಕಿರುವ ವಿಸ್ತರಣೆಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರಿಸುತ್ತದೆ. ಯಾವುದೆ ವಿಸ್ತರಣೆಗಳನ್ನು ಲೋಡ್‌ " +"ಮಾಡಬೇಕಿದ್ದಲ್ಲಿ ಅದು ಈ ಪಟ್ಟಿಯಲ್ಲಿ ಇರುವುದು ಅತ್ಯಗತ್ಯ. org.gnome.Shell ನಲ್ಲಿ " +"EnableExtension ಮತ್ತು DisableExtension D-Bus ವಿಧಾನಗಳನ್ನು ಬಳಸಿಕೊಂಡೂ ಸಹ ಈ " +"ಪಟ್ಟಿಯನ್ನು ನಿರ್ವಹಿಸಬಹುದು." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "ವಿಸ್ತರಣೆ ಆವೃತ್ತಿಯ ಹೊಂದಾಣಿಕೆಯ ಮೌಲ್ಯಮಾಪನವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME ಶೆಲ್‌ ಪ್ರಸಕ್ತ ಚಲಾಯಿಸಲಾಗುತ್ತಿರುವ ಆವೃತ್ತಿಯನ್ನು ಬೆಂಬಲಿಸಲು ಕೇವಲ " +"ವಿಸ್ತರಣೆಗಳನ್ನು ಮಾತ್ರ " +"ಲೋಡ್ ಮಾಡುತ್ತದೆ. ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಈ ಪರೀಕ್ಷೆಯನ್ನು " +"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ " +"ಮತ್ತು ಬೆಂಬಲವಿರಲಿ ಇಲ್ಲದೆ ಇರಲಿ, ಲಭ್ಯವಿರುವ ಎಲ್ಲಾ ವಿಸ್ತರಣೆಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು " +"ಪ್ರಯತ್ನಿಸುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "ಮೆಚ್ಚಿನ ಅನ್ವಯಗಳಿಗಾಗಿನ ಗಣಕತೆರೆ ಕಡತ IDಗಳ ಪಟ್ಟಿ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"ಈ ಐಡೆಂಟಿಫಯರುಗಳಿಗೆ ಅನುಗುಣವಾದ ಅನ್ವಯಗಳನ್ನು ಮೆಚ್ಚಿನವುಗಳ ಜಾಗದಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "ಆಪ್ ಆಯ್ಕೆಗಾರ ನೋಟ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "ಅನ್ವಯ ಆಯ್ಕೆಗಾರದಲ್ಲಿನ ಪ್ರಸಕ್ತ ಆಯ್ಕೆ ಮಾಡಿದ ನೋಟದ ಸೂಚಿ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "ಆದೇಶದ ಇತಿಹಾಸ (Alt-F2) ಸಂವಾದಚೌಕ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "ನೋಡುವ ಗಾಜಿನ ಸಂವಾದ ಚೌಕಕ್ಕಾಗಿನ ಇತಿಹಾಸ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "ಯಾವಾಗಲೂ 'ನಿರ್ಗಮಿಸು' ಮೆನು ಅಂಶವನ್ನು ಬಳಕೆದಾರ ಮೆನುವಿನಲ್ಲಿ ತೋರಿಸು." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"ಈ ಕೀಲಿಯು ಏಕ-ಬಳಕೆದಾರ, ಏಕ-ಅಧಿವೇಶನ ಸಂದರ್ಭಗಳಲ್ಲಿ 'ನಿರ್ಗಮಿಸು' ಮೆನು ಅಂಶದ " +"ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಡಗಿಸಲ್ಪಡುವ ಆಯ್ಕೆಯನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"ಗೂಢಲಿಪೀಕರಿಸಲಾದ ಅಥವ ದೂರದ ಕಡತವ್ಯವಸ್ಥೆಗಳನ್ನು ಏರಿಸುವ ಸಲುವಾಗಿನ ಗುಪ್ತಪದಗಳನ್ನು " +"ನೆನಪಿಟ್ಟುಕೊಳ್ಳಬೇಕೆ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"ಗೂಢಲಿಪೀಕರಿಸಲಾದ ಸಾಧನ ಅಥವ ದೂರದ ಕಡತವ್ಯವಸ್ಥೆಗಳನ್ನು ಏರಿಸುವ ಸಲುವಾಗಿನ ಗುಪ್ತಪದಗಳನ್ನು " +"ಶೆಲ್ " +"ನೆನಪಿಟ್ಟುಕೊಳ್ಳುತ್ತದೆ. ಗುಪ್ತಪದವನ್ನು ಭವಿಷ್ಯದ ಬಳಕೆಗಾಗಿ ಉಳಿಸಬಹುದಾದಲ್ಲಿ " +"'ಗುಪ್ತಪದವನ್ನು " +"ನೆನಪಿಟ್ಟುಕೊ' ಎಂಬ ಗುರುತು ಚೌಕವು ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ. ಈ ಕೀಲಿಯು ಗುರುತುಚೌಕದ " +"ಪೂರ್ವನಿಯೋಜಿತ " +"ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "ಕ್ಯಾಲೆಂಡರಿನಲ್ಲಿ ವಾರದ ದಿನವನ್ನು ತೋರಿಸು" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "true ಆದಲ್ಲಿ, ಕ್ಯಾಲೆಂಡರಿನಲ್ಲಿ ISO ವಾರದ ದಿನವನ್ನು ತೋರಿಸುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "ಅನ್ವಯಗಳ ಮೆನುವನ್ನು ತೆರೆಯಬೇಕಿರುವ ಕೀಲಿಬೈಂಡಿಂಗ್" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "ಅನ್ವಯಗಳ ಮೆನುವನ್ನು ತೆರೆಯಬೇಕಿರುವ ಕೀಲಿಬೈಂಡಿಂಗ್." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"ಅನ್ವಯಗಳನ್ನು ತೋರಿಸು\" ನೋಟವನ್ನು ತೆರೆಯಬೇಕಿರುವ ಕೀಲಿಬೈಂಡಿಂಗ್" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"ಚಟುವಟಿಕೆ ಅವಲೋಕನದ ನೋಟದಲ್ಲಿನ \"ಅನ್ವಯಗಳನ್ನು ತೋರಿಸು\" ಅನ್ನು ತೆರೆಯಬೇಕಿರುವ " +"ಕೀಲಿಬೈಂಡಿಂಗ್." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "ಅವಲೋಕನವನ್ನು ತೆರೆಯಬೇಕಿರುವ ಕೀಲಿಬೈಂಡಿಂಗ್" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "ಚಟುವಟಿಕೆಗಳ ಅವಲೋಕನವನ್ನು ತೆರೆಯಬೇಕಿರುವ ಕೀಲಿಬೈಂಡಿಂಗ್." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "ಸಂದೇಶ ಟ್ರೇಯ ಗೋಚರಿಕೆಯನ್ನು ಹೊರಳಿಸಲು ಕೀಬೈಂಡಿಂಗ್" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "ಸಂದೇಶ ಟ್ರೇಯ ಗೋಚರಿಕೆಯನ್ನು ಹೊರಳಿಸಲು ಕೀಬೈಂಡಿಂಗ್." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "ಸಕ್ರಿಯ ಸೂಚನೆಯತ್ತ ಗಮನ ಹರಿಸಲು ಕೀಲಿಬೈಂಡಿಂಗ್" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "ಸಕ್ರಿಯ ಸೂಚನೆಯತ್ತ ಗಮನ ಹರಿಸಲು ಕೀಲಿಬೈಂಡಿಂಗ್." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"ಡೀಬಗ್‌ ಉದ್ದೇಶಗಳಿಗಾಗಿ ಚಾಲನೆಯಲ್ಲಿರುವ ಎಲ್ಲಾ ಟ್ವೀನ್‌ಗಳನ್ನು ವಿರಮಿಸುತ್ತದೆ ಮತ್ತು " +"ಮರಳಿ " +"ಆರಂಭಿಸುತ್ತದೆ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "ಯಾವ ಕೀಲಿಮಣೆಯನ್ನು ಬಳಸಬೇಕಿದೆ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "ಬಳಸಬೇಕಿರುವ ಕೀಲಿಮಣೆಯ ಬಗೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "ಸ್ವಿಚರ್ ಅನ್ನು ಪ್ರಸಕ್ತ ಕಾರ್ಯಸ್ಥಳಕ್ಕೆ ಮಿತಿಗೊಳಿಸು." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"ಟ್ರೂ ಆದಲ್ಲಿ, ಪ್ರಸಕ್ತ ಕಾರ್ಯಸ್ಥಳದಲ್ಲಿ ಕಿಟಕಿಗಳನ್ನು ಹೊಂದಿರುವ ಅನ್ವಯಗಳನ್ನು ಮಾತ್ರ " +"ಸ್ವಿಚರ್‌ನಲ್ಲಿ " +"ತೋರಿಸಲಾಗುತ್ತದೆ. ಇಲ್ಲದೆ ಹೋದಲ್ಲಿ, ಎಲ್ಲಾ ಅನ್ವಯಗಳನ್ನು ಸೇರಿಸಲಾಗುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "ಅನ್ವಯ ಚಿಹ್ನೆ ಕ್ರಮ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"ಸ್ವಿಚರಿನಲ್ಲಿ ಕಿಟಕಿಗಳನ್ನು ಹೇಗೆ ತೋರಿಸಲಾಗುತ್ತದೆ ಎನ್ನುವುದನ್ನು ಸಂರಚಿಸುತ್ತದೆ. " +"ಮಾನ್ಯವಾದ " +"ಸಾಧ್ಯತೆಗಳೆಂದರೆ 'ತಂಬ್‌ನೈಲ್-ಮಾತ್ರ' (ಕಿಟಕಿಯ ಒಂದು ತಂಬ್‌ನೈಲ್ ಅನ್ನು ತೋರಿಸುತ್ತದೆ), " +"'app-icon-" +"ಮಾತ್ರ' (ಅನ್ವಯ ಚಿಹ್ನೆಯನ್ನು ಮಾತ್ರ ತೋರಿಸುತ್ತದೆ) ಅಥವ 'ಎರಡೂ'." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"ಟ್ರೂ ಆದಲ್ಲಿ, ಪ್ರಸಕ್ತ ಕಾರ್ಯಸ್ಥಳದಲ್ಲಿ ಕಿಟಕಿಗಳನ್ನು ಮಾತ್ರ ಸ್ವಿಚರ್‌ನಲ್ಲಿ " +"ತೋರಿಸಲಾಗುತ್ತದೆ. ಇಲ್ಲದೆ " +"ಹೋದಲ್ಲಿ, ಎಲ್ಲಾ ಕಿಟಕಿಗಳನ್ನು ಸೇರಿಸಲಾಗುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "ಮೂಲ ಕಿಟಕಿಗೆ ಮೋಡಲ್ ಸಂವಾದವನ್ನು ಸೇರಿಸು" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"ಈ ಕೀಲಿಯು GNOME ಶೆಲ್‌ ಅನ್ನು ಚಲಾಯಿಸುವಾಗ org.gnome.mutter ನಲ್ಲಿನ ಕೀಲಿಯನ್ನು " +"ಅತಿಕ್ರಮಿಸುತ್ತದೆ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "ಕಿಟಕಿಗಳನ್ನು ತೆರೆಯ ಅಂಚಿನಲ್ಲಿ ಬೀಳಿಸುವಾಗ ಅಂಚಿನ ಟೈಲಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "ಕಾರ್ಯಸ್ಥಳಗಳನ್ನು ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ನಿರ್ವಹಿಸಲಾಗುತ್ತದೆ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "ಪ್ರಾಥಮಿಕ ತೆರೆಯ ಮೇಲಿರುವ ಕಾರ್ಯಕ್ಷೇತ್ರಗಳು ಮಾತ್ರ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"ತೆರೆಸೂಚಕವು ಚಲಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುವವರೆಗೆ ಮೌಸ್‌ನ ಗಮನದಲ್ಲಿನ ಬದಲಾವಣೆಗಳನ್ನು " +"ವಿಳಂಬವಾಗಿಸು" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "ಕ್ಯಾಪ್ಟೀವ್ ಪೋರ್ಟಲ್" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s ಗಾಗಿ ಆದ್ಯತೆಗಳ ಸಂವಾದವನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ ಉಂಟಾಗಿದೆ:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "GNOME ಶೆಲ್ ಎಕ್ಸ‍ಟೆನ್ಶನ್ಸ್" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "ರದ್ದು ಮಾಡು" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "ಮುಂದಿನ" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "ಸೈನ್ ಇನ್" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "ಅಧಿವೇಶನವನ್ನು ಆರಿಸಿ" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "ಪಟ್ಟಿಯಲ್ಲಿಲ್ಲವೆ?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ಉದಾ., ಬಳಕೆದಾರ ಅಥವ %s)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "ಬಳಕೆದಾರ ಹೆಸರು: " + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "ಪ್ರವೇಶದ ಕಿಟಕಿ" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "ದೃಢೀಕರಣ ದೋಷ" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(ಅಥವ ನಿಮ್ಮ ಬೆರಳನ್ನು ಉಜ್ಜಿ)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "ಆದೇಶವು ಕಂಡು ಬಂದಿಲ್ಲ" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "ಆದೇಶವನ್ನು ಪಾರ್ಸ್ ಮಾಡಲಾಗಿಲ್ಲ:" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ:" + +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "ಜಾಲ ದೃಢೀಕರಣದ ಮರುನಿರ್ದೇಶನ" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "ಪದೆ ಪದೆ ಬಳಸಲಾಗುವ ಅನ್ವಯಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "ಪುನರಾವರ್ತನೆ" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "ಎಲ್ಲಾ" + +#: ../js/ui/appDisplay.js:1790 +msgid "New Window" +msgstr "ಹೊಸ ಕಿಟಕಿ" + +#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "ಎಲ್ಲಾ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳನ್ನು ತೆಗೆದುಹಾಕು" + +#: ../js/ui/appDisplay.js:1822 +msgid "Add to Favorites" +msgstr "ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸು" + +#: ../js/ui/appDisplay.js:1831 +msgid "Show Details" +msgstr "ವಿವರಗಳನ್ನು ತೋರಿಸು" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ಅನ್ನು ನಿಮ್ಮ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ." + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s ಅನ್ನು ನಿಮ್ಮ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "ಹಿನ್ನೆಲೆಯನ್ನು ಬದಲಾಯಿಸು…" + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "ಎಲ್ಲಾ ದಿನ" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "ಭಾ" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "ಸೋ" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "ಮಂ" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "ಬು" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "ಗು" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "ಶು" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "ಶ" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "ಭಾ" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "ಸೋ" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "ಮಂ" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "ಬು" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "ಗು" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "ಶು" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "ಶ" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "ಹಿಂದಿನ ತಿಂಗಳು" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "ಮುಂದಿನ ತಿಂಗಳು" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "ಯಾವುದೂ ಅನುಸೂಚಿತಗೊಂಡಿಲ್ಲ" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "ಇಂದು" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "ನಾಳೆ" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "ಈ ವಾರ" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "ಮುಂದಿನ ವಾರ" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "ಬಾಹ್ಯ ಡ್ರೈವ್‌ನಿಂದ ಸಂಪರ್ಕ ಕಡಿದಿದೆ" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "ಬಾಹ್ಯ ಡ್ರೈವ್‌ನಿಂದ ಸಂಪರ್ಕ ಕಡಿದಿದೆ" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "ತೆಗೆದುಹಾಕಬಹುದಾದ ಸಾಧನಗಳು" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s ನೊಂದಿಗೆ ತೆರೆ" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "ಹೊರತಳ್ಳು" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "ಗುಪ್ತಪದ:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "ಇನ್ನೊಮ್ಮೆ ನಮೂದಿಸಿ:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "ಸಂಪರ್ಕ ಜೋಡಿಸು" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "ಗುಪ್ತಪದ: " + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "ಕೀಲಿ: " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "ಗುರುತು: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "ಖಾಸಗಿ ಕೀಲಿ ಗುಪ್ತಪದ: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "ಸೇವೆ: " + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "ವೈರ್ಲೆಸ್‌ ಜಾಲಬಂಧಕ್ಕಾಗಿ ದೃಢೀಕರಣದ ಅಗತ್ಯವಿದೆ" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"ವೈರ್ಲೆಸ್‌ ಜಾಲಬಂಧ “%s” ಅನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಗುಪ್ತಪದಗಳು ಅಥವ ಗೂಢಲಿಪೀಕರಣ ಕೀಲಿಗಳ " +"ಅಗತ್ಯವಿದೆ." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "ವೈರ್ಡ್ 802.1X ದೃಢೀಕರಣ" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "ಜಾಲಬಂಧದ ಹೆಸರು: " + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL ದೃಢೀಕರಣ" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "PIN ಕೋಡ್ ಅಗತ್ಯವಿದೆ" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "ಮೊಬೈಲ್ ಬ್ರಾಡ್‌ಬ್ಯಾಂಡ್‌ ಸಾಧನಕ್ಕಾಗಿ PIN ಕೋಡ್‌ ಅಗತ್ಯವಿದೆ" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "ಮೊಬೈಲ್ ಬ್ರಾಡ್‌ಬ್ಯಾಂಡ್ ಜಾಲಬಂಧ ಗುಪ್ತಪದ" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s” ನೊಂದಿಗೆ ಸಂಪರ್ಕಸಾಧಿಸಲು ಗುಪ್ತಪದದ ಅಗತ್ಯವಿದೆ." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "ದೃಢೀಕರಣದ ಅಗತ್ಯವಿದೆ" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "ವ್ಯವಸ್ಥಾಪಕ" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "ದೃಢೀಕರಿಸು" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "ಕ್ಷಮಿಸು, ಅದು ಕೆಲಸ ಮಾಡಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ." + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "ಆಹ್ವಾನ" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "ಕರೆ" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "ಕಡತದ ವರ್ಗಾವಣೆ" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "ಹರಟೆ" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "ಮಾತುಬರಿಸು" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "ಮೂಕಗೊಳಿಸು" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "ನಿನ್ನೆ, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "ನಿನ್ನೆ, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s ಈಗ %s ಆಗಿದ್ದಾರೆ" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s ಗಾಗಿನ ಆಹ್ವಾನ" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s ನಿಮ್ಮನ್ನು %s ಗೆ ಸೇರುವಂತೆ ಆಹ್ವಾನಿಸುತ್ತಿದ್ದಾರೆ" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "ತಿರಸ್ಕರಿಸು" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "ಅಂಗೀಕರಿಸು" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s ಇಂದ ವೀಡಿಯೊ ಕರೆ ಬಂದಿದೆ" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s ಇಂದ ಕರೆ ಬಂದಿದೆ" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "ಉತ್ತರ" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s ರವರು ನಿಮಗೆ %s ಅನ್ನು ಕಳುಹಿಸುತ್ತಿದ್ದಾರೆ" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "" +"ನೀವು ಯಾವಾಗ ಆನ್‌ಲೈನ್‌ನಲ್ಲಿ ಇರುತ್ತೀರಿ ಎಂದು ತಿಳಿಯಲು %s ರವರು ನಿಮ್ಮ ಅನುಮತಿಯನ್ನು " +"ಕೋರಿದ್ದಾರೆ" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "ಜಾಲಬಂಧದ ದೋಷ" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "ದೃಢೀಕರಣವು ವಿಫಲಗೊಂಡಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "ಗೂಢಲಿಪೀಕರಣ ದೋಷ" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "ಪ್ರಮಾಣಪತ್ರವನ್ನು ಒದಗಿಸಲಾಗಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "ಪ್ರಮಾಣಪತ್ರವನ್ನು ನಂಬಲಾಗಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "ಪ್ರಮಾಣಪತ್ರದ ಕಾಲಾವಧಿ ತೀರಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "ಪ್ರಮಾಣಪತ್ರವು ಸಕ್ರಿಯಗೊಂಡಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "ಪ್ರಮಾಣಪತ್ರದ ಅತಿಥೇಯದ ಹೆಸರು ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "ಪ್ರಮಾಣಪತ್ರದ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "ಪ್ರಮಾಣಪತ್ರವು ಸ್ವತಃ ಸೈನ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "ಸ್ಥಿತಿಯನ್ನು ಆಫ್‌ಲೈನ್‌ ಎಂದು ಸೂಚಿಸಿದ್ದಾರೆ." + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "ಗೂಢಲಿಪೀಕರಣ ಲಭ್ಯವಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "ಪ್ರಮಾಣಪತ್ರವು ಅಮಾನ್ಯವಾಗಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "ಸಂಪರ್ಕವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "ಸಂಪರ್ಕವನ್ನು ಸಾಧಿಸಲಾಗಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "ಸಂಪರ್ಕವು ಕಡಿದು ಹೋಗಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "ಈ ಖಾತೆಯು ಈಗಾಗಲೆ ಪೂರೈಕೆಗಣಕದೊಂದಿಗೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲಾಗಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" +"ಒಂದು ಹೊಸ ಸಂಪರ್ಕದಿಂದ ಈ ಸಂಪರ್ಕವನ್ನು ಇದೇ ಸಂಪನ್ಮೂಲವನ್ನು ಬಳಸಿಕೊಂಡು ಬದಲಾಯಿಸಲಾಗಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "ಖಾತೆಯು ಈಗಾಗಲೆ ಪೂರೈಕೆಗಣಕದಲ್ಲಿ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "ಪೂರೈಕೆಗಣಕಕ್ಕೆ ಬಿಡುವಿಲ್ಲದ ಕಾರಣ ಸಂಪರ್ಕವನ್ನು ನಿಭಾಯಿಸಲಾಗುತ್ತಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "ಪ್ರಮಾಣಪತ್ರವನ್ನು ಹಿಂದಕ್ಕೆ ತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"ಪ್ರಮಾಣಪತ್ರವು ಅಸುರಕ್ಷಿತವಾದ ಸಿಫರ್ ಅಲ್ಗಾರಿತಮ್ ಅನ್ನು ಬಳಸುತ್ತದೆ ಅಥವ ದುರ್ಬಲ " +"ಗೂಢಲಿಪೀಕರಣವನ್ನು " +"ಹೊಂದಿದೆ" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"ಪೂರೈಕೆಗಣಕ ಪ್ರಮಾಣಪತ್ರದ ಉದ್ದ ಅಥವ ಪೂರೈಕೆಗಣಕ ಪ್ರಮಾಣಪತ್ರ ಸರಣಿಯ ಆಳವು ಕ್ರಿಪ್ಟೋಗ್ರಫಿ " +"ಲೈಬ್ರರಿಯಿಂದ ನಿಗದಿ ಪಡಿಸಲಾದ ಮಿತಿಗಳನ್ನು ಮೀರಿದೆ." + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "ಆಂತರಿಕ ತಪ್ಪು" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s ನೊಂದಿಗೆ ಸಂಪರ್ಕ ಸಾಧಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "ಖಾತೆಯನ್ನು ನೋಡು" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "ಅಜ್ಞಾತ ಕಾರಣ" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "ವಿಂಡೋಸ್" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "ಅನ್ವಯಗಳನ್ನು ತೋರಿಸು" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "ಡ್ಯಾಶ್" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "ಕ್ಯಾಲೆಂಡರನ್ನು ತೆರೆ" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "ಗಡಿಯಾರವನ್ನು ತೆರೆ" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "ದಿನಾಂಕ ಹಾಗು ಸಮಯದ ಸಿದ್ಧತೆಗಳು" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s ಇಂದ ನಿರ್ಗಮಿಸು" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "ನಿರ್ಗಮಿಸು" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s ರವರು %d ಸೆಕೆಂಡಿನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸುತ್ತಾರೆ." +msgstr[1] "%s ರವರು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸಲ್ಪಡುತ್ತಾರೆ." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "ನೀವು %d ಸೆಕೆಂಡಿನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸಲ್ಪಡುತ್ತೀರಿ." +msgstr[1] "ನೀವು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸಲ್ಪಡುತ್ತೀರಿ." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "ನಿರ್ಗಮಿಸು" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "ಸ್ಥಗಿತಗೊಳಿಸು" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸುತ್ತದೆ ಮತ್ತು ಮರಳಿಸ್ಥಾಪಿಸುತ್ತದೆ" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡಿನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ." +msgstr[1] "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "ಬಾಕಿ ಇರುವ ತಂತ್ರಾಂಶ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸು" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "ಮರಳಿ ಆರಂಭಿಸು" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "ಸ್ಥಗಿತಗೊಳಿಸು" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "ಮರಳಿ ಆರಂಭಿಸು" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡಿನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರಳಿ ಆರಂಭಗೊಳ್ಳುತ್ತದೆ." +msgstr[1] "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರಳಿ ಆರಂಭಗೊಳ್ಳುತ್ತದೆ." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "ಮರಳಿ ಆರಂಭಿಸು ಮತ್ತು ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸು" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"%d ಸೆಕೆಂಡಿನಲ್ಲಿ ವ್ಯವಸ್ಥೆಯು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರಳಿ ಆರಂಭಗೊಳ್ಳುತ್ತದೆ ಮತ್ತು " +"ಅಪ್‌ಡೇಟ್‌ಗಳು " +"ಅನುಸ್ಥಾಪನೆಗೊಳ್ಳುತ್ತದೆ." +msgstr[1] "" +"%d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ವ್ಯವಸ್ಥೆಯು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರಳಿ ಆರಂಭಗೊಳ್ಳುತ್ತದೆ ಮತ್ತು " +"ಅಪ್‌ಡೇಟ್‌ಗಳು " +"ಅನುಸ್ಥಾಪನೆಗೊಳ್ಳುತ್ತವೆ." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "ಮರಳಿ ಆರಂಭಿಸು ಮತ್ತು ಅನುಸ್ಥಾಪಿಸು" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ಅನುಸ್ಥಾಪಿಸು ಮತ್ತು ಆಫ್ ಮಾಡು" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸಿದ ನಂತರ ಪವರ್ ಆಫ್ ಮಾಡು" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"ಬ್ಯಾಟರಿಯ ವಿದ್ಯುಚ್ಛಕ್ತಿಯಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತಿದೆ: ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸುವ " +"ಮೊದಲು ಪ್ಲಗ್ ಇನ್ " +"ಮಾಡು." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"ಕೆಲವು ಅನ್ವಯಗಳು ಕಾರ್ಯನಿರತವಾಗಿರುತ್ತವೆ ಅಥವ ಉಳಿಸದೆ ಇರುವ ಕೆಲಸವನ್ನು ಹೊಂದಿರಬಹುದು." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರರು ಒಳಗೆ ಪ್ರವೇಶಿಸಿದ್ದಾರೆ." + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (ದೂರದ)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (ಕನ್ಸೋಲ್)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "ಅನುಸ್ಥಾಪಿಸು" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "“%s” ಅನ್ನು extensions.gnome.org ಇಂದ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ ಅನುಸ್ಥಾಪಿಸಬೇಕೆ?" + +#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "ಕೀಲಿಮಣೆ" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "ಯಾವುದು ವಿಸ್ತರಣೆಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ಯಾವುದೆ ದೋಷಗಳನ್ನು ತೋರಿಸಿಲ್ಲ." + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "ದೋಷಗಳನ್ನು ಅಡಗಿಸು" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "ದೋಷಗಳನ್ನು ತೋರಿಸು" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "ದೋಷ" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "ಹಳೆಯದಾಗಿದೆ" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "ಇಳಿಸಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "ಆಕರವನ್ನು ನೋಡಿ" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "ಜಾಲ ಪುಟ" + +#: ../js/ui/messageTray.js:1327 +msgid "Open" +msgstr "ತೆರೆ" + +#: ../js/ui/messageTray.js:1334 +msgid "Remove" +msgstr "ತೆಗೆದು ಹಾಕು" + +#: ../js/ui/messageTray.js:1631 +msgid "Notifications" +msgstr "ಸೂಚನೆಗಳು" + +#: ../js/ui/messageTray.js:1638 +msgid "Clear Messages" +msgstr "ಸಂದೇಶಗಳನ್ನು ಅಳಿಸು" + +#: ../js/ui/messageTray.js:1657 +msgid "Notification Settings" +msgstr "ಸೂಚನೆಯ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/messageTray.js:1710 +msgid "Tray Menu" +msgstr "ಟ್ರೇ ಮೆನು" + +#: ../js/ui/messageTray.js:1934 +msgid "No Messages" +msgstr "ಯಾವುದೆ ಸಂದೇಶವಿಲ್ಲ" + +#: ../js/ui/messageTray.js:1979 +msgid "Message Tray" +msgstr "ಸಂದೇಶ ಟ್ರೇ" + +#: ../js/ui/messageTray.js:2992 +msgid "System Information" +msgstr "ವ್ಯವಸ್ಥೆಯ ಮಾಹಿತಿ" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "ಗೊತ್ತಿಲ್ಲದ" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d ಹೊಸ ಸಂದೇಶ" +msgstr[1] "%d ಹೊಸ ಸಂದೇಶಗಳು" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "ರದ್ದುಗೊಳಿಸು" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "ಅವಲೋಕನ" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "ಹುಡುಕಲು ನಮೂದಿಸು…" + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "ನಿರ್ಗಮಿಸು" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "ಚಟುವಟಿಕೆಗಳು" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "ಮೇಲಿನ ಪಟ್ಟಿ" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "ಒಂದು ಆದೇಶವನ್ನು ನಮೂದಿಸಿ" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "ಮುಚ್ಚು" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "ಮರಳಿ ಆರಂಭಿಸಲಾಗುತ್ತಿದೆ…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ಹೊಸ ಸೂಚನೆ" +msgstr[1] "%d ಹೊಸ ಸೂಚನೆಗಳು" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "ಲಾಕ್ ಮಾಡು" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "ತೆರೆಯನ್ನು ಲಾಕ್ ಮಾಡುವಂತೆ GNOME ಬಯಸುತ್ತದೆ" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "ಲಾಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "ಲಾಕ್ ಮಾಡದಂತೆ ಒಂದು ಅನ್ವಯವು ತಡೆದಿದೆ" + +#: ../js/ui/search.js:594 +msgid "Searching…" +msgstr "ಹುಡುಕಲಾಗುತ್ತಿದೆ…" + +#: ../js/ui/search.js:596 +msgid "No results." +msgstr "ಯಾವುದೆ ಫಲಿತಾಂಶಗಳಿಲ್ಲ." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "ಪ್ರತಿಮಾಡು" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "ಅಂಟಿಸು" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "ಪಠ್ಯವನ್ನು ತೋರಿಸು" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "ಪಠ್ಯವನ್ನು ಅಡಗಿಸು" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "ಗುಪ್ತಪದ" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "ಈ ಗುಪ್ತಪದವನ್ನು ನೆನಪಿನಲ್ಲಿಡು" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "ನಿಲುಕಣೆ" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "ಗಾತ್ರ ಬದಲಾವಣೆ" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "ತೆರೆ ಓದುಗ" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "ತೆರೆ ಕೀಲಿಮಣೆ" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "ದೃಶ್ಯರೂಪದ ಎಚ್ಚರಿಕೆಗಳು" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "ಸ್ಟಿಕಿ ಕೀಲಿಗಳು" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "ನಿಧಾನ ಕೀಲಿಗಳು" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "ಪುಟಿಯುವ ಕೀಲಿಗಳು" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "ಮೌಸ್‌ ಕೀಲಿಗಳು" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "ಅತಿ ಹೆಚ್ಚು ವೈದೃಶ್ಯ" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "ದೊಡ್ಡ ಪಠ್ಯ" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ಬ್ಲೂಟೂತ್" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "ಆಫ್ ಮಾಡು" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ಬ್ಲೂಟೂತ್ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d ಸಂಪರ್ಕಿತಗೊಂಡಿರುವ ಸಾಧನ" +msgstr[1] "%d ಸಂಪರ್ಕಿತಗೊಂಡಿರುವ ಸಾಧನಗಳು" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +msgid "Not Connected" +msgstr "ಸಂಪರ್ಕ ಜೋಡಿಸಲಾಗಿಲ್ಲ" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "ಪ್ರಕಾಶ" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "ಕೀಲಿಮಣೆ ವಿನ್ಯಾಸವನ್ನು ತೋರಿಸು" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "ಸ್ಥಳ" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು" + +#: ../js/ui/status/location.js:73 +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "ಗೌಪ್ಯತಾ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "ಬಳಕೆಯಲ್ಲಿದೆ" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "ಸಕ್ರಿಯಗೊಳಿಸು" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "<ಗೊತ್ತಿರದ>" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +msgid "Off" +msgstr "ಆಫ್‌" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "ನಿರ್ವಹಿಸಲಾಗದಿರುವ" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "ಸಂಪರ್ಕ ಕಡಿದುಹಾಕಲಾಗುತ್ತಿದೆ" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +msgid "Connecting" +msgstr "ಸಂಪರ್ಕಿತಗೊಳ್ಳುತ್ತಿದೆ" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "ದೃಢೀಕರಣದ ಅಗತ್ಯವಿದೆ" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "ಫರ್ಮ್‌ವೇರ್ ಕಾಣಿಸುತ್ತಿಲ್ಲ" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "ಅಲಭ್ಯ" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "ಸಂಪರ್ಕವು ವಿಫಲಗೊಂಡಿದೆ" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "ವೈರ್ಡ್ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "ಮೊಬೈಲ್ ಬ್ರಾಡ್‌ಬ್ಯಾಂಡ್ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +msgid "Hardware Disabled" +msgstr "ಯಂತ್ರಾಂಶ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "ಜಾಲಬಂಧ ಸಂಪರ್ಕವಾಗಿ ಬಳಸು" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "ಏರ್‌ಪ್ಲೇನ್ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದೆ" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "" +"ಏರ್‌ಪ್ಲೇನ್ ಸ್ಥಿತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ ವೈ-ಫೈ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "ಏರ್‌ಪ್ಲೇನ್ ಸ್ಥಿತಿಯನ್ನು ಆಫ್ ಮಾಡು" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "ವೈ-ಫೈ ನಿಷ್ಕ್ರಿಯವಾಗಿದೆ" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "ಜಾಲಬಂಧಕ್ಕೆ ಸಂಪರ್ಕಿತಗೊಳ್ಳುವ ಸಲುವಾಗಿ ವೈ-ಫೈ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "ವೈ-ಫೈ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "ವೈ-ಫೈ ಜಾಲಬಂಧಗಳು" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "ಒಂದು ಜಾಲಬಂಧವನ್ನು ಆರಿಸಿ" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "ಯಾವುದೆ ಜಾಲಬಂಧಗಳಿಲ್ಲ" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "ಆಫ್ ಮಾಡಲು ಯಂತ್ರಾಂಶದ ಸ್ವಿಚ್ ಅನ್ನು ಬಳಸಿ" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "ಜಾಲಬಂಧವನ್ನು ಆರಿಸಿ" + +#: ../js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "ವೈ-ಫೈ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "ಸಕ್ರಿಯಗೊಳಿಸು" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "ಹಾಟ್‌ಸ್ಪಾಟ್‌ ಸಕ್ರಿಯ" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "ಸಂಪರ್ಕ ಹೊಂದಲಾಗುತ್ತಿದೆ..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "ದೃಢೀಕರಣದ ಅಗತ್ಯವಿದೆ" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "ಸಂಪರ್ಕ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "ಜಾಲಬಂಧ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/network.js:1482 +msgid "VPN Settings" +msgstr "VPN ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "ನೆಟ್‌ವರ್ಕ್ ಮ್ಯಾನೇಜರ್" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "ಜಾಲಬಂಧ ಸಂಪರ್ಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "ವಿದ್ಯುಚ್ಛಕ್ತಿ ಸಿದ್ಧತೆಗಳು" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "ಸಂಪೂರ್ಣ ಚಾರ್ಜ್ ಆಗಿದೆ" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "ಊಹಿಸಲಾಗುತ್ತಿದೆ…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d ಬಾಕಿ ಇರುವುದು (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d ಪೂರ್ಣಗೊಳ್ಳುವ ವರೆಗೆ (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "ಬ್ಯಾಟರಿ" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "ಏರ್‌ಪ್ಲೇನ್‌ ಸ್ಥಿತಿ" + +#: ../js/ui/status/rfkill.js:85 +msgid "On" +msgstr "ಸಕ್ರಿಯ" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "ಬಳಕೆದಾರನನ್ನು ಬದಲಿಸು" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "ನಿರ್ಗಮಿಸು" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "ಅಭಿಮುಖದ (ಓರಿಯೆಂಟೇಶನ್) ಲಾಕ್" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "ಅಮಾನತ್ತಿನಲ್ಲಿಡು" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "ಸ್ಥಗಿತಗೊಳಿಸು" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ಧ್ವನಿ ಪ್ರಮಾಣವನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "ಧ್ವನಿ ಪ್ರಮಾಣ" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "ಮೈಕ್ರೊಫೋನ್" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನಾಗಿ ಪ್ರವೇಶಿಸಿ" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "ಕಿಟಕಿಯನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡು" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "ಅನ್ವಯಗಳು" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "ಹುಡುಕು" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” ಸಿದ್ಧಗೊಂಡಿದೆ" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "ನೀವು ಈ ಸಿದ್ಧತೆಗಳನ್ನು ಉಳಿಸಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "ಸಿದ್ಧತೆಗಳನ್ನು ಹಿಮ್ಮರಳಿಸು" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸು" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "ಸಿದ್ಧತೆಗಳ ಬದಲಾವಣೆಗಳು %d ಸೆಕೆಂಡಿನಲ್ಲಿ ಹಿಮ್ಮರಳುತ್ತವೆ" +msgstr[1] "ಸಿದ್ಧತೆಗಳ ಬದಲಾವಣೆಗಳು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಹಿಮ್ಮರಳುತ್ತವೆ" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "ಕುಗ್ಗಿಸು" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "ಹಿಂದಿನ ಸ್ಥಿತಿಗೆ ಮರಳಿಸು" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "ಹಿಗ್ಗಿಸು" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "ಸ್ಥಳಾಂತರಿಸು" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "ಮರುಗಾತ್ರಿಸು" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "ಶೀರ್ಷಿಕೆಪಟ್ಟಿಯನ್ನು ತೆರೆಯ ಮೇಲೆ ಸ್ಥಳಾಂತರಿಸು" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "ಯಾವಾಗಲೂ ಮೇಲ್ಭಾಗದಲ್ಲಿ" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "ಯಾವಾಗಲೂ ಗೋಚರಿಸುವ ಕಾರ್ಯಸ್ಥಳದಲ್ಲಿ" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "ಮೇಲಿನ ಕಾರ್ಯಸ್ಥಳಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸು" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "ಕೆಳಗಿನ ಕಾರ್ಯಸ್ಥಳಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸು" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution ಕ್ಯಾಲೆಂಡರ್" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u ಔಟ್‌ಪುಟ್" +msgstr[1] "%u ಔಟ್‌ಪುಟ್‌ಗಳು" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ಇನ್‌ಪುಟ್" +msgstr[1] "%u ಇನ್‌ಪುಟ್‌ಗಳು" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "ವ್ಯವಸ್ಥೆಯ ಧ್ವನಿಗಳು" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "ಮುದ್ರಿಸಬಹುದಾದ ಆವೃತ್ತಿ" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "ಪ್ರವೇಶದ ತೆರೆಗಾಗಿ GDM ಬಳಸಿದ ಪ್ರಕಾರ" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "ನಿಶ್ಚಿತ ಸ್ಥಿತಿಯನ್ನು ಬಳಸು, ಉದಾ. ಪ್ರವೇಶ ತೆರೆಗಾಗಿ \"gdm\"" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "ಸಾಧ್ಯವಿರುವ ಸ್ಥಿತಿಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡು" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” ಅನ್ನು ಆರಂಭಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "ಗುಪ್ತಪದಗಳು ತಾಳೆಯಾಗುವುದಿಲ್ಲ." + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "ಗುಪ್ತಪದವು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "ದೃಢೀಕರಣದ ಸಂವಾದವನ್ನು ಬಳಕೆದಾರರಿಂದ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ" + +#~ msgid "Screenshots" +#~ msgstr "ತೆರೆಚಿತ್ರಗಳು" + +#~ msgid "Record a screencast" +#~ msgstr "ಒಂದು ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟನ್ನು ರೆಕಾರ್ಡು ಮಾಡಿ" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "ಅನ್ವಯದ ಬಳಕೆಯ ಬಗೆಗಿನ ಅಂಕಿಅಂಶಗಳನ್ನು ಸಂಗ್ರಹಿಸಬೇಕೆ" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "ಶೆಲ್‌ ಸಾಮಾನ್ಯವಾಗಿ ಹೆಚ್ಚಾಗಿ ಬಳಸಲಾದ (ಉದಾ. ಆರಂಭಕಗಳಲ್ಲಿ) ಅನ್ವಯಗಳನ್ನು ತೋರಿಸಲು " +#~ "ಸಕ್ರಿಯವಾದವುಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ನಡೆಸುತ್ತದೆ. ಈ ದತ್ತಾಂಶವನ್ನು ಗೌಪ್ಯವಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ, " +#~ "ಹಾಗೂ ಗೌಪ್ಯತಾ ಕಾರಣಗಳಿದ್ದಲ್ಲಿ ನೀವು ಅದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು. ಹಾಗೆ ಮಾಡುವುದರಿಂದ " +#~ "ಉಳಿಸಲಾದ ಯಾವದೆ ದತ್ತಾಂಶವು ತೆಗೆದುಹಾಕಲ್ಪಡುವುದಿಲ್ಲ ಎನ್ನುವುದನ್ನು ನೆನಪಿಡಿ." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "ಕಡತಕೋಶಗಳಾಗಿ ತೋರಿಸಬೇಕಿರುವ ವರ್ಗಗಳ ಪಟ್ಟಿ" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "ಈ ಪಟ್ಟಿಯಲ್ಲಿನ ಪ್ರತಿಯೊಂದು ವರ್ಗ ಹೆಸರನ್ನೂ ಸಹ ಮುಖ್ಯ ನೋಟದಲ್ಲಿ ಸಾಲಿನ ಒಳಗೆ ತೋರಿಸುವ " +#~ "ಬದಲಿಗೆ, ಅನ್ವಯ ನೋಟದಲ್ಲಿ ಕಡತಕೋಶವಾಗಿ ತೋರಿಸಲಾಗುತ್ತದೆ." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "ಆಂತರಿಕವಾಗಿ ಬಳಕೆದಾರರಿಂದ ಸ್ಪಷ್ಟವಾಗಿ ಹೊಂದಿಸಲಾದ ಕೊನೆಯ IM ಅನ್ನು ಶೇಖರಿರಿಸಲು " +#~ "ಬಳಸಲಾಗುತ್ತದೆ. ಇಲ್ಲಿರುವ ಮೌಲ್ಯವು TpConnectionPresenceType ಎನ್ಯೂಮರೇಶನ್‌ನಿಂದ " +#~ "ಬಂದಿರುತ್ತದೆ." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "ಆಂತರಿಕವಾಗಿ ಬಳಕೆದಾರರಿಂದ ಸ್ಪಷ್ಟವಾಗಿ ಹೊಂದಿಸಲಾದ ಕೊನೆಯ ಅಧಿವೇಶನವನ್ನು ಶೇಖರಿರಿಸಲು " +#~ "ಬಳಸಲಾಗುತ್ತದೆ. ಇಲ್ಲಿರುವ ಮೌಲ್ಯವು GsmPresenceStatus ಎನ್ಯೂಮರೇಶನ್‌ನಿಂದ ಬಂದಿರುತ್ತದೆ." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "ತೆರೆ ರೆಕಾರ್ಡರ್ ಅನ್ನು ಹೊರಳಿಸಲು ಕೀಬೈಂಡಿಂಗ್" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "ಒಳನಿರ್ಮಿತ ತೆರೆ ರೆಕಾರ್ಡರ್ ಅನ್ನು ಆರಂಭಿಸಲು/ನಿಲ್ಲಿಸಲು ಕೀಬೈಂಡಿಂಗ್." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳನ್ನು ರೆಕಾರ್ಡು ಮಾಡಲು ಬಳಸಲಾಗುವ ಫ್ರೇಮ್‌ದರಗಳು." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "ಪ್ರತಿ ಸೆಕೆಂಡಿನ ಫ್ರೇಮ್‌ಗಳಲ್ಲಿನ GNOME ಶೆಲ್‌ನ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟ್‍ ರೆಕಾರ್ಡರಿನಿಂದ ರೆಕಾರ್ಡು " +#~ "ಮಾಡಲಾದ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟಿನ ಫ್ರೇಮ್‌ದರ. " + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟ್‍ ಅನ್ನು ಎನ್ಕೋಡ್ ಮಾಡಲು ಬಳಸಲಾಗುವ gstreamer ಪೈಪ್‌ಲೈನ್" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ಎನ್ಕೋಡ್ ಮಾಡಲು ಬಳಸಲಾದ GStreamer ಪೈಪ್‌ಲೈನ್‌ ಅನ್ನು ಹೊಂದಿಸುತ್ತದೆ. ಇದು " +#~ "gst-launch ನಲ್ಲಿ ಬಳಸಲಾದ ಸಿಂಟ್ಯಾಕ್ಸನ್ನು ಅನುಸರಿಸುತ್ತದೆ. ಪೈಪ್‌ಲೈನ್ ವಿಡಿಯೊವನ್ನು " +#~ "ರೆಕಾರ್ಡು ಮಾಡಲು ಒಂದು ನಿಯೋಜಿಸದೇ ಇರುವ ಸಿಂಕ್‌ಪ್ಯಾಡ್‌ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರಬೇಕು. ಇದು " +#~ "ಸಾಮಾನ್ಯವಾಗಿ ಸಂಪರ್ಕಿತಗೊಂಡಿರದೆ ಇರುವ ಪೈಪ್‌ಲೈನ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ; ಆ ಪ್ಯಾಡ್‌ನಿಂದ ಔಟ್‌ಪುಟ್ " +#~ "ಅನ್ನು ಔಟ್‌ಪುಟ್ ಕಡತಕ್ಕೆ ಬರೆಯಲಾಗುತ್ತದೆ. ಆದರೆ ಪೈಪ್‌ಲೈನ್ ತನ್ನದೆ ಆದ ಔಟ್‌ಪುಟ್ ಅನ್ನು " +#~ "ನೋಡಿಕೊಳ್ಳಬಲ್ಲದು - shout2send ಅಥವ ಅದೇ ರೀತಿಯದರ ಮೂಲಕ icecast ಪೂರೈಕೆಗಣಕಕ್ಕೆ " +#~ "ಔಟ್‌ಪುಟ್ ಅನ್ನು ಕಳುಹಿಸಲು ಇದನ್ನು ಬಳಸಬಹುದಾಗಿರುತ್ತದೆ. ಇದರ ಹೊಂದಿಕೆಯನ್ನು " +#~ "ರದ್ದುಗೊಳಿಸಿದಲ್ಲಿ ಅಥವ ಒಂದು ಖಾಲಿ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಿದಲ್ಲಿ, ಪೂರ್ವನಿಯೋಜಿತ ಪೈಪ್‌ಲೈನ್ ಅನ್ನು " +#~ "ಬಳಸಲಾಗುತ್ತದೆ. ಇದು ಪ್ರಸ್ತುತ 'vp8enc min_quantizer=13 max_quantizer=13 cpu-" +#~ "used=5 deadline=1000000 threads=%T ! queue ! webmmux' ಆಗಿರುತ್ತದೆ ಮತ್ತು VP8 " +#~ "ಕೋಡೆಕ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು WEBM ಅನ್ನು ರೆಕಾರ್ಡು ಮಾಡುತ್ತದೆ. %T ಎನ್ನು ವ್ಯವಸ್ತೆಯಲ್ಲಿನ " +#~ "ಸೂಕ್ತವಾದ ಎಳೆಯ ಎಣಿಕೆಯನ್ನು ಊಹಿಸಲು ಒಂದು ಪ್ಲೇಸ್‌ಹೋಲ್ಡರ್ ಆಗಿ ಬಳಸಲಾಗುತ್ತದೆ." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳನ್ನು ಶೇಖರಿಸಿಡಲು ಬಳಸಲಾಗುವ ಕಡತ ವಿಸ್ತರಣೆಗಳು" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "ರೆಕಾರ್ಡು ಮಾಡಲಾದ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳಿಗಾಗಿನ ಕಡತದ ಹೆಸರು ಪ್ರಸಕ್ತ ದಿನಾಂಕದ ಆಧರಿತವಾದ ಒಂದು " +#~ "ವಿಶೇಷವಾದ ಕಡತದ ಹೆಸರಾಗಿರುತ್ತದೆ, ಹಾಗು ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸುತ್ತದೆ. ಬೇರೊಂದು ಕಂಟೈನರ್ " +#~ "ಶೈಲಿಗೆ ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಇದನ್ನು ಬದಲಾಯಿಸಬೇಕಾಗುತ್ತದೆ." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "ಶೀರ್ಷಿಕೆಪಟ್ಟಿಯಲ್ಲಿ ಗುಂಡಿಗಳ ಜೋಡಣೆ" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "ಈ ಕೀಲಿಯು GNOME ಶೆಲ್‌ ಅನ್ನು ಚಲಾಯಿಸುವಾಗ org.gnome.desktop.wm.preferences ನಲ್ಲಿನ " +#~ "ಕೀಲಿಯನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ." + +#~ msgid "Extension" +#~ msgstr "ವಿಸ್ತರಣೆ" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "ಮೇಲಿನ ಸಂಯೋಜನಾಚೌಕವನ್ನು ಬಳಸಿಕೊಂಡು ಸಂರಚಿಸಬೇಕಿರುವ ಒಂದು ವಿಸ್ತರಣೆಯನ್ನು ಆರಿಸಿ." + +#~ msgid "Session" +#~ msgstr "ಅಧಿವೇಶನ" + +#~ msgid "Power" +#~ msgstr "ವಿದ್ಯುಚ್ಛಕ್ತಿ" + +#~ msgid "Restart" +#~ msgstr "ಮರಳಿ ಆರಂಭಿಸು" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t ಇಂದ ತೆರೆಚಲನಚಿತ್ರ" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "ಈ ಅನ್ವಯದಿಂದ ನಿರ್ಗಮಿಸಿ ನಂತರ ವ್ಯವಸ್ಥೆಯಿಂದ ನಿರ್ಗಮಿಸಲು ನಿರ್ಗಮಿಸು ಅನ್ನು ಒತ್ತಿ." + +#~ msgid "Logging out of the system." +#~ msgstr "ವ್ಯವಸ್ಥೆಯಿಂದ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "ಈ ಅನ್ವಯದಿಂದ ನಿರ್ಗಮಿಸಿ ನಂತರ ವ್ಯವಸ್ಥೆಯಿಂದ ನಿರ್ಗಮಿಸಲು ಸ್ಥಗಿತಗೊಳಿಸು ಅನ್ನು ಒತ್ತಿ." + +#~ msgid "Powering off the system." +#~ msgstr "ವ್ಯವಸ್ಥೆಯನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "ಈ ಅನ್ವಯದಿಂದ ನಿರ್ಗಮಿಸಿ ಗಣಕವನ್ನು ಮರಳಿ ಅರಂಭಿಸಲು ಮರಳಿ ಆರಂಭಿಸು ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ." + +#~ msgid "Restarting the system." +#~ msgstr "ನಿಮ್ಮ ವ್ಯವಸ್ಥೆಯನ್ನು ಮರಳಿ ಆರಂಭಿಸಲಾಗುತ್ತಿದೆ." + +#~ msgid "Universal Access Settings" +#~ msgstr "ಜಾಗತಿಕ ನಿಲುಕಣೆ ಸಿದ್ಧತೆಗಳು" + +#~ msgid "Visibility" +#~ msgstr "ಗೋಚರಿಕೆ" + +#~ msgid "Send Files to Device…" +#~ msgstr "ಸಾಧನಕ್ಕೆ ಕಡತಗಳನ್ನು ಕಳುಹಿಸಿ…" + +#~ msgid "Set Up a New Device…" +#~ msgstr "ಒಂದು ಹೊಸ ಸಾಧನವನ್ನು ಸಿದ್ಧಗೊಳಿಸು…" + +#~ msgid "Send Files…" +#~ msgstr "ಕಡತಗಳನ್ನು ಕಳುಹಿಸು…" + +#~ msgid "Keyboard Settings" +#~ msgstr "ಕೀಲಿಮಣೆ ಸಿದ್ಧತೆಗಳು" + +#~ msgid "Mouse Settings" +#~ msgstr "ಮೌಸ್‌ನ ಸಿದ್ಧತೆಗಳು" + +#~ msgid "Sound Settings" +#~ msgstr "ಧ್ವನಿಯ ಸಿದ್ಧತೆಗಳು" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s ಇಂದ ದೃಢೀಕರಣ ದೋಷ" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "%s ಎಂಬ ಸಾಧನಕ್ಕಾಗಿ '%s' ಎಂಬ ಸೇವೆಯನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಬಯಸುತ್ತಿದೆ" + +#~ msgid "Always grant access" +#~ msgstr "ಯಾವಾಗಲೂ ಅನುಮತಿಸು" + +#~ msgid "Grant this time only" +#~ msgstr "ಈ ಬಾರಿ ಮಾತ್ರ ಅನುಮತಿಸು" + +#~ msgid "Reject" +#~ msgstr "ತಿರಸ್ಕರಿಸು" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s ಗಾಗಿ ಪೇರಿಂಗ್ ಖಚಿತಪಡಿಕೆ" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "%s ಎನ್ನುವ ಸಾಧನದೊಂದಿಗೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲು ಬಯಸುತ್ತಿದೆ" + +#~ msgid "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgstr "" +#~ "'%06d' ಎಂಬ PIN ಸಾಧನದಲ್ಲಿರುವುದಕ್ಕೆ ತಾಳೆಯಾಗುತ್ತದೆಯೆ ಎಂದು ದಯವಿಟ್ಟು ಖಚಿತಪಡಿಸಿ." + +#~ msgid "Matches" +#~ msgstr "ಹೊಂದಾಣಿಕೆಗಳು" + +#~ msgid "Does not match" +#~ msgstr "ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s ಗಾಗಿ ಪೇರಿಂಗ್ ಮನವಿ" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "ದಯವಿಟ್ಟು ಸಾಧನದಲ್ಲಿ ಸೂಚಿಸಿರುವ PIN ಅನ್ನು ನಮೂದಿಸಿ." + +#~ msgid "OK" +#~ msgstr "ಸರಿ" + +#~ msgid "Region & Language Settings" +#~ msgstr "ಪ್ರದೇಶ ಮತ್ತು ಭಾಷೆ ಸಿದ್ಧತೆಗಳು" + +#~ msgid "Volume, network, battery" +#~ msgstr "ಧ್ವನಿಪ್ರಮಾಣ, ಜಾಲಬಂಧ, ಬ್ಯಾಟರಿ" + +#~ msgid "disabled" +#~ msgstr "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + +#~ msgid "cable unplugged" +#~ msgstr "ಕೇಬಲ್‌ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ" + +#~ msgid "More…" +#~ msgstr "ಇನ್ನಷ್ಟು …" + +#~ msgid "Wired" +#~ msgstr "ತಂತಿಯುಕ್ತ" + +#~ msgid "Auto Ethernet" +#~ msgstr "ಸ್ವಯಂ-ಎತರ್ನೆಟ್" + +#~ msgid "Auto broadband" +#~ msgstr "ಸ್ವಯಂ-ಬ್ರಾಡ್‌ಬ್ಯಾಂಡ್" + +#~ msgid "Auto dial-up" +#~ msgstr "ಸ್ವಯಂ ಡಯಲ್-ಅಪ್" + +#~ msgid "Auto %s" +#~ msgstr "ಸ್ವಯಂ %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "ಸ್ವಯಂ ಬ್ಲೂಟೂತ್" + +#~ msgid "Auto wireless" +#~ msgstr "ಸ್ವಯಂ ತಂತಿರಹಿತ" + +#~ msgid "Wi-Fi" +#~ msgstr "ವೈ-ಫೈ" + +#~ msgid "Networking is disabled" +#~ msgstr "ಜಾಲಬಂಧವು ವಿಫಲಗೊಂಡಿದೆ" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d ಗಂಟೆ ಬಾಕಿ ಇದೆ" +#~ msgstr[1] "%d ಗಂಟೆಗಳು ಬಾಕಿ ಇವೆ" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s ಬಾಕಿ ಇದೆ" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ಗಂಟೆ" +#~ msgstr[1] "ಗಂಟೆಗಳು" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "ನಿಮಿಷ" +#~ msgstr[1] "ನಿಮಿಷಗಳು" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d ನಿಮಿಷ ಬಾಕಿ ಇದೆ" +#~ msgstr[1] "%d ನಿಮಿಷಗಳು ಬಾಕಿ ಇವೆ" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~ msgid "AC Adapter" +#~ msgstr "AC ಅಡಾಪ್ಟರ್" + +#~ msgid "Laptop Battery" +#~ msgstr "ಲ್ಯಾಪ್‌ಟಾಪ್ ಬ್ಯಾಟರಿ" + +#~ msgid "Monitor" +#~ msgstr "ತೆರೆ" + +#~ msgid "Mouse" +#~ msgstr "ಮೌಸ್" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "ಸೆಲ್ ಫೋನ್" + +#~ msgid "Media Player" +#~ msgstr "ಮಾಧ್ಯಮ ಚಾಲಕ" + +#~ msgid "Tablet" +#~ msgstr "ಟ್ಯಾಬ್ಲೆಟ್" + +#~ msgid "Computer" +#~ msgstr "ಗಣಕ" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "ಗೊತ್ತಿಲ್ಲದ" + +#~ msgid "Available" +#~ msgstr "ಲಭ್ಯ" + +#~ msgid "Busy" +#~ msgstr "ಕಾರ್ಯನಿರತ" + +#~ msgid "Invisible" +#~ msgstr "ಅಗೋಚರ" + +#~ msgid "Away" +#~ msgstr "ಹೊರಗೆ ಹೋಗಿದ್ದೇನೆ" + +#~ msgid "Idle" +#~ msgstr "ಜಡ" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "ನಿಮ್ಮ ಹರಟೆಯ ಸ್ಥಿತಿಯನ್ನು ಕಾರ್ಯನಿರತರಾಗಿದ್ದಾರೆ ಎಂದು ಬದಲಾಯಿಸಲಾಗಿದೆ." + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "ಸಂಭಾಷಣೆಯ ಸಂದೇಶಗಳೂ ಸಹ ಸೇರಿದಂತೆ ಸೂಚನೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ. ನೀವು " +#~ "ಬೇರೆಯವರಿಂದ ಬಂದ ಸಂದೇಶಗಳನ್ನು ನೀವು ನೋಡಿಲ್ಲ ಎಂದು ಅವರಿಗೆ ಗೊತ್ತಾಗುವಂತೆ ನಿಮ್ಮ ಆನ್‌ಲೈನ್ " +#~ "ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸಲಾಗಿರುತ್ತದೆ." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "ಸ್ಥಗಿತಗೊಳಿಸಿದಲ್ಲಿ ಉಳಿಸದೆ ಇರುವ ಕೆಲಸವು ಇಲ್ಲವಾಗಲು ಕಾರಣವಾಗಬಹುದು." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "ಕ್ಷಮಿಸಿ, ನಿಮಗಾಗಿ ಯಾವುದೆ ವಿವೇಕವಾಣಿ ಇಲ್ಲ :\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s Oracle ಹೇಳುವಂತೆ" diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..37876a3 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,2243 @@ +# Korean message translation for gnome-shell +# +# This file is distributed under the same license as the gnome-shell package. +# Young-Ho Cha , 2009. +# Seong-ho Cho , 2012. +# Changwoo Ryu , 2011-2019. +# +# +# 주의 사항: +# - 이 프로그램의 이름인 shell은 "셸"이라고 쓰고, "쉘"이라고 하지 않음. +# - 용어: +# - Airplane Mode: 비행기 모드 +# - instance messanger 또는 IM은 메신저라고 번역 +# - VPN: 가상사설망 +# - pairing (bluetooth 관련): 페어링 +# - Wayland: 웨일랜드로 음역 +# - Night Light: 야간 모드 (gnome-control-center와 일치) +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-11 18:01+0000\n" +"PO-Revision-Date: 2019-02-27 14:41+0900\n" +"Last-Translator: Changwoo Ryu \n" +"Language-Team: GNOME Korea \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "시스템" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "알림 목록 표시" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "현재 알림에 포커스" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "요약 보기" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "모든 프로그램 표시" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "프로그램 메뉴 열기" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "셸 확장" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "그놈 셸 확장을 설정합니다" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "그놈 셸" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "창 관리 및 프로그램 실행" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Alt-F2에서 개발 및 테스트용 내부 기능 사용 가능" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "Alt-F2 대화 상자에서 내부 디버깅 및 감시 기능에 접근을 허용합니다." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "사용할 확장의 UUID 목록" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"그놈 셸 확장에는 UUID 속성이 있습니다. 이 키는 읽어들일 확장의 UUID를 나열합" +"니다. 읽어들이려는 확장은 모두 이 목록에 들어 있어야 합니다. EnableExtension " +"및 DisableExtension D-버스 메소드를 이용해 이 목록을 조작할 수도 있습니다." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "사용자 확장 기능 사용하지 않기" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"“enabled-extension” 설정에 영향을 미치지 않고, 사용자가 켠 확장 기능을 모두 " +"사용하지 않습니다." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "확장의 버전 호환성 검사 하지 않기" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"그놈 셸에서 현재 실행 중인 버전을 지원하는 확장 기능만 읽어들입니다. 이 옵션" +"을 사용하면 이 버전 검사를 하지 않고, 지원한다고 지정된 버전에 관계없이 모든 " +"확장 기능을 읽어들입니다." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "즐겨찾기 프로그램의 데스크톱 파일 ID 목록" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "여기 들어 있는 ID에 해당하는 프로그램은 즐겨찾기 영역에 표시됩니다." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "프로그램 고르기 뷰" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "프로그램 고르기에서 현재 선택한 뷰의 인덱스 값." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "명령어 대화 상자에(Alt-F2) 기록 기능" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "돋보기 대화 상자에 기록 기능" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "사용자 메뉴에 “로그아웃” 메뉴 항목을 항상 표시합니다." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"이 키를 설정하면, 단일 사용자 및 단일 세션에서 “로그아웃” 메뉴 항목 자동 감추" +"기 기능을 사용하지 않습니다." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"암호화 볼륨을 마운트하거나 원격 파일 시스템을 마운트할 때 암호를 저장할지 여" +"부" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"암호화된 저장 장치나 원격 파일 시스템을 마운트하는 경우 암호를 입력해야 합니" +"다. 암호를 저장할 수 있으면 “암호 저장” 확인란이 나타납니다. 이 키에서는 이 " +"확인란의 기본 상태를 지정합니다." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "기본 블루투스 어댑터가 여기 연결할 장치를 준비했는지 여부" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"그놈 셸에서는 블루투스 어댑터에 전원이 들어오거나, 기본 어댑터에 연결 설정한 " +"장치가 있을 경우엠나 경우에만 블루투스 메뉴 항목을 표시합니다. 기본 어댑터에 " +"연결된 장치가 하나도 없는 상황이 발견되면 이 값을 초기화합니다." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "상태 점검 API 사용" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "프로그램에서 셸의 상태를 점검하도록 허용하는 D-버스 API를 사용합니다." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "프로그램 메뉴를 여는 키 바인딩" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "프로그램 메뉴를 여는 키 바인딩." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "“프로그램 보기” 뷰를 여는 키 바인딩" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "현재 활동 요약의 “프로그램 보기” 뷰를 여는 키 바인딩." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "현재 활동 요약을 여는 키 바인딩" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "현재 활동 요약을 여는 키 바인딩." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "알림 목록 보이기를 토글하는 키 바인딩" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "알림 목록 보이기를 토글하는 키 바인딩." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "현재 알림에 포커스하는 키 바인딩" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "현재 알림에 포커스하는 키 바인딩." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"실행 중인 모든 하위 프로세스를 일시 중지하고 계속 하는 키 바인딩, 디버깅 목적" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "프로그램 1로 전환" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "프로그램 2로 전환" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "프로그램 3로 전환" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "프로그램 4로 전환" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "프로그램 5로 전환" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "프로그램 6으로 전환" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "프로그램 7로 전환" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "프로그램 8로 전환" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "프로그램 9로 전환" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "사용할 키보드" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "사용할 키보드의 종류." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "프로그램 전환을 현재 작업 공간에만 한정." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"참이면, 현재 작업 공간에 창이 있는 프로그램만 프로그램 전환 창에 표시합니다. " +"참이 아니면 모든 프로그램을 표시합니다." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "프로그램 아이콘 모드." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"창 전환에서 창이 어떻게 표시될지 설정합니다. 가능한 값은: “thumbnail-only”(창" +"의 섬네일만 표시), “app-icon-only”(프로그램 아이콘만 표시), “both”(모두)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"참이면, 현재 작업 공간에 창이 있는 창만 창 전환 창에 표시합니다. 거짓이면 모" +"든 창을 표시합니다." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "상위 창에 모달 대화창 붙이기" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "그놈 셸을 실행할 때 org.gnome.mutter의 키 대신 사용됩니다." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "화면 가장자리에 창을 놓을 때 가장자리에 맞춥니다" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "작업 공간을 동적으로 관리" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "주 모니터에서만 작업 공간 사용" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "마우스 포인터가 움직이지 않을 때까지 포커스 전환을 미루기" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "네트워크 로그인" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "무언가 잘못되었습니다" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "죄송하지만 문제가 발생했습니다. 이 확장의 설정을 표시할 수 없습니다. 확장 개발자에게 이 문제를 알려주시기를 추천합니다." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "기술적 정보" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "오류 메시지 복사" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "홈페이지" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "확장 홈페이지 보기" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "확장을 설치하지 않았습니다" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "확장은 그놈 소프트웨어 또는 extensions.gnome.org 사이트에서 설치할 수 있습니다." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "그놈 소프트웨어에서 보기" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "취소" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "다음" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "잠금 풀기" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "로그인" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "세션 선택" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "목록에 없습니까?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(예를 들어, 사용자 또는 %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "사용자 이름: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "로그인 창" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "인증 오류" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(또는 지문을 문지르십시오)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "컴퓨터 끄기" + +# 주의: 키워드 번역 +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "power off;shutdown;전원;끄기;셧다운;reboot;restart;재시작;다시;리부팅" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "화면 잠그기" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "화면 잠그기" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "로그아웃" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;로그아웃;나가기" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "절전" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;절전;슬립;서스펜드" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "사용자 바꾸기" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "사용자 바꾸기" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "방향 잠금" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "방향 잠금;화면;회전" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "명령이 없습니다" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "명령어를 파싱할 수 없습니다:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” 실행이 실패했습니다:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "방금" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d분 전" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d시간 전" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "어제" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d일 전" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d주 전" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d달 전" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d년 전" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "어제, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%B %-d일, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%Y년 %B %-d일, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%p %l∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "어제, %p %l∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %p %l∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%B %-d일, %p %l∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%Y년 %B %-d일, %p %l∶%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "핫스팟 로그인" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"이 핫스팟 로그인에 대한 연결은 안전하지 않습니다. 암호나 기타 이 페이지에서 " +"입력한 정보를 주변 사람이 볼 수 있습니다." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "접근 거부" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "접근 허용" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "자주 사용하는 프로그램이 여기 나타납니다" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "자주" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "모두" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "새 창" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "지정한 그래픽 카드를 사용해 시작" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "즐겨찾기에서 제거" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "즐겨찾기에 추가" + +# 주의: "Show ..." 형태지만 보이기로 번역하지 않는다 +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "자세히 보기" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s 프로그램을 즐겨찾기에 추가했습니다." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s 프로그램을 즐겨찾기에서 제거했습니다." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "오디오 장치 선택" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "사운드 설정" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "헤드폰" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "헤드셋" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "마이크" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "배경 바꾸기…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "디스플레이 설정" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "설정" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "일" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "월" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "화" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "수" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "목" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "금" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "토" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%Y년 %OB" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "이전 달" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "다음 달" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +msgid "Week %V" +msgstr "주 %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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "종일" + +#: js/ui/calendar.js:829 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%B %-d일 %A" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%Y년 %B %-d일 %A" + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "알림 없음" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "행사 없음" + +#: js/ui/calendar.js:1085 +msgid "Clear" +msgstr "지우기" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” 프로그램이 응답하지 않습니다." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"좀 더 기다려서 계속 할 수도 있고, 강제로 프로그램을 끝낼 수도 있습니다." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "강제로 끝내기" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "기다리기" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "외부 드라이브 연결" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "외부 드라이브 연결 끊김" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "%s 프로그램으로 열기" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "암호:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "다시 입력하십시오:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "다른 방법으로 라우터의 “WPS” 단추를 눌러서 연결할 수 있습니다." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "연결" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "암호: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "키: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "개인 키 암호: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "신원: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "서비스: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "무선 네트워크에서 인증이 필요합니다" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "“%s” 무선 네트워크에 연결하려면 암호 또는 암호화 키가 필요합니다." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "유선 802.1X 인증" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "네트워크 이름: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "인증이 필요합니다" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN 코드가 필요합니다" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "휴대전화 네트워크 장치를 사용하려면 PIN 코드가 필요합니다" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "휴대전화 네트워크 암호" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s”에 연결하려면 암호가 필요합니다." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "네트워크 관리" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "인증이 필요합니다" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "관리자" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "인증" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "죄송합니다. 동작하지 않았습니다. 다시 시도하십시오." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s의 대화명이 이제 %s입니다" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "창" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "프로그램 표시" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "대시보드" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%Y년 %B %-d일" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%Y년 %B %e일 %A" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "세계 시계 추가…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "세계 시계" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "날씨" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "위치를 선택하십시오…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "읽어들이는 중…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "날씨 정보를 온라인으로 가져옵니다" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "날씨 정보를 현재 사용할 수 없습니다" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s 로그아웃" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "로그아웃" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s 사용자가 %d초 뒤에 자동으로 로그아웃합니다." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "%d초 뒤에 자동으로 로그아웃합니다." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "로그아웃" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "컴퓨터 끄기" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "업데이트 설치 및 컴퓨터 끄기" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "시스템이 %d초 뒤에 자동으로 꺼집니다." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "대기 중인 소프트웨어 업데이트 설치" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "다시 시작" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "컴퓨터 끄기" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "다시 시작" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "시스템이 %d초 뒤에 자동으로 다시 시작합니다." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "다시 시작 및 업데이트 설치" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "시스템이 %d초 뒤에 자동으로 다시 시작하고 업데이트를 설치합니다." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "다시 시작 및 설치" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "설치 및 컴퓨터 끄기" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "업데이트를 설치한 다음 컴퓨터를 끕니다" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "다시 시작 및 업그레이드 설치" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"다시 시작한 뒤에 %s %s 버전을 설치합니다. 업그레이드 설치가 오래 걸릴 수도 있" +"습니다: 백업을 하고 컴퓨터에 전원을 연결하십시오." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "배터리 전원으로 동작 중: 업데이트 설치하려면 AC 전원을 연결하십시오." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "일부 프로그램이 동작 중이거나 저장하지 않은 작업이 남아 있습니다." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "다른 사용자가 로그인 중입니다." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (원격)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (콘솔)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "설치" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "" +"extensions.gnome.org 사이트에서 “%s” 확장을 다운로드해 설치하시겠습니까?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s 프로그램이 바로 가기를 금지하려 합니다" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "프로그램이 바로 가기를 금지하려 합니다" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "%s 키를 누르면 바로 가기를 복구할 수 있습니다." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "거부" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "허용" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "느린 키 켬" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "느린 키 끔" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Shift 키를 8초 동안 누르고 있었습니다. 느린 키 기능의 바로 가기이고, 이렇게 " +"하면 키보드 동작이 달라집니다." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "고정 키 켬" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "고정 키 끔" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Shift 키를 5번 연속으로 눌렀습니다. 고정 키 기능의 바로 가기이고, 이렇게 하" +"면 키보드 동작이 달라집니다." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"두 키를 동시에 누르거나, Shift 키를 5번 연속으로 눌렀습니다. 고정 키 기능을 " +"끄는 바로 가기이고, 이렇게 하면 키보드 동작이 달라집니다." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "계속 유지" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "켜기" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "끄기" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "그만두고 끄기" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "지역 및 언어 설정" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "확장을 설치하지 않았습니다" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s에서 발생한 에러가 없습니다." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "오류 숨기기" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "오류 보이기" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "사용" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "사용 않음" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "오류" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "오래 된 버전" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "다운로드 중" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "소스 보기" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "웹페이지" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "시스템 정보" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "알 수 없는 음악가" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "알 수 없는 제목" + +# 오디오 볼륨 +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "볼륨" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "실행 취소" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "개요" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "검색하려면 입력하십시오…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "새 바로 가기…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "정의한 프로그램" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "화면 도움말 표시" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "모니터 바꾸기" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "키 누르기 지정" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "마침" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "편집…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "없음" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "설정하려면 단추를 누르십시오" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "나가려면 Esc를 누르십시오" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "나가려면 아무 키나 누르십시오" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "끝내기" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "현재 활동" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "시스템" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "위 막대" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "명령을 입력하십시오" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "닫기" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "웨일랜드에서는 다시 시작 기능을 사용할 수 없습니다" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "다시 시작하는 중…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%B %d일 %A" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "새 메시지 %d개" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "새 알림 %d개" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "잠그기" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "그놈에서 화면을 잠궈야 합니다" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "잠글 수 없습니다" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "프로그램이 잠금을 막았습니다" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "검색하는 중…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "결과가 없습니다." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d개 더" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "복사" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "붙여넣기" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "텍스트 보이기" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "텍스트 숨기기" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "암호" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "암호 저장" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "접근성" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "크기 조정" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "화면 읽기" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "화면 키보드" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "화면 알림" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "고정 키" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "느린 키" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "탄력 키" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "마우스 키" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "고대비" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "큰 글자" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "블루투스" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "블루투스 설정" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d개 연결" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "끔" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "켬" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "밝기" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "키보드" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "키보드 배치 표시" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "위치 사용" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "사용 않기" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "사생활 보호 설정" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "위치 사용 중" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "위치 사용 않음" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "사용" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "현재 위치를 %s에서 접근하도록 허용하시겠습니까?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "위치 정보 접근은 언제든지 사생활 보호 설정에서 바꿀 수 있습니다." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "<알 수 없음>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s 꺼짐" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s 연결됨" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s 관리되지 않음" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s 연결 끊는 중" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s 연결하는 중" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s 인증 필요" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s에 필요한 펌웨어 없음" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s 사용 불가" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s 연결이 실패했습니다" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "유선 네트워크 설정" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "휴대전화 네트워크 설정" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s 하드웨어 사용 않음" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s 사용 않음" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "인터넷에 연결" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "비행기 모드 켜짐" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "비행기 모드에서는 와이파이를 사용하지 않습니다." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "비행기 모드 끄기" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "와이파이 꺼짐" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "네트워크에 연결하려면 와이파이를 켜야 합니다." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "와이파이 켜기" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "와이파이 네트워크" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "네트워크를 선택하십시오" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "네트워크 없음" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "끄려면 하드웨어 스위치를 사용하십시오" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "네트워크 선택" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "와이파이 설정" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s 핫스팟 사용 중" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s 연결되지 않음" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "연결하는 중…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "인증 필요" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "연결 실패" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "가상사설망 설정" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "가상사설망" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "가상사설망 꺼짐" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "네트워크 설정" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s 유선 연결" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s 와이파이 연결" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s 모뎀 연결" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "연결이 실패했습니다" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "네트워크 연결이 실패했습니다" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "야간 모드 사용하지 않음" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "야간 모드 켬" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "계속 하기" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "내일까지 사용하지 않기" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "전원 설정" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "완전 충전" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "충전 중 아님" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "예상치 계산 중…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d 남음(%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "충전까지 %d:%02d(%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "화면을 공유하는 중입니다" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "끄기" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "비행기 모드 켜짐" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "사용자 바꾸기" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "로그아웃" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "계정 설정" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "방향 잠금" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "절전" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "컴퓨터 끄기" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "썬더볼트" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "알 수 없는 썬더볼트 장치" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"자리에 없는 동안 새 장치를 검색했습니다. 이 장치를 사용하려면 장치 연결을 끊" +"었다가 다시 연결하십시오." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "권한 없는 썬더볼트 장치" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "새 장치가 발견되었고 관리자가 허가해야 합니다." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "썬더볼트 권한 오류" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "썬더볼트 장치에 권한을 부여할 수 없습니다: %s" + +# 오디오 볼륨 +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "볼륨 바꿈" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "반복" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "디스플레이 연결" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "외부만 사용" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "내장만 사용" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "다른 사용자로 로그인" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "창 잠금 풀기" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "프로그램" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "검색" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” 프로그램이 준비되었습니다" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "이 디스플레이 설정을 유지하시겠습니까?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "설정 되돌리기" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "바뀐 사항 유지" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "바뀐 설정을 %d초 후에 되돌립니다" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "최소화" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "최대화 해제" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "최대화" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "옮기기" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "크기 조정" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "제목 표시줄을 화면에 옮기기" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "항상 위" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "항상 보이는 작업 공간에" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "왼쪽 작업 공간으로 옮기기" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "오른쪽 작업 공간으로 옮기기" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "위 작업 공간으로 옮기기" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "아래 작업 공간으로 옮기기" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "위 모니터로 옮기기" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "아래 모니터로 옮기기" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "왼쪽 모니터로 옮기기" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "오른쪽 모니터로 옮기기" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "에볼루션 달력" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +# 커맨드라인 옵션 설명 +#: src/main.c:408 +msgid "Print version" +msgstr "버전을 표시합니다" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "GDM에서 로그인 화면에 사용할 모드" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "특정 모드 사용. 예를 들어 로그인 화면에 대해 “gdm”" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "가능한 모드 목록 표시" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "알 수 없음" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” 실행에 실패했습니다" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "암호가 일치하지 않습니다." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "빈 암호를 쓸 수 없습니다" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "인증 대화 창을 사용자가 닫았습니다" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u개 출력" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u개 입력" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "시스템 소리" diff --git a/po/ku.po b/po/ku.po new file mode 100644 index 0000000..fd03263 --- /dev/null +++ b/po/ku.po @@ -0,0 +1,1575 @@ +# Kurdish translations for l package. +# Copyright (C) 2011 THE l'S COPYRIGHT HOLDER +# This file is distributed under the same license as the l package. +# Erdal , 2011. +# Erdal Ronahî , 2011. +msgid "" +msgstr "" +"Project-Id-Version: l 10n-gnome\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-10-17 08:32+0000\n" +"PO-Revision-Date: 2011-10-17 13:36+0200\n" +"Last-Translator: Erdal Ronahî \n" +"Language-Team: Kurdish Team http://pckurd.net\n" +"Language: ku\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: Virtaal 0.6.1\n" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:1 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:2 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:3 +msgid "File extension used for storing the screencast" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:4 +msgid "Framerate used for recording screencasts." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:5 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. disabled-extensions overrides this setting for extensions " +"that appear in both lists." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:6 +msgid "History for command (Alt-F2) dialog" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:7 +msgid "History for the looking glass dialog" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:8 +msgid "If true, display date in the clock, in addition to time." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:9 +msgid "If true, display seconds in time." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:10 +msgid "If true, display the ISO week date in the calendar." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:11 +msgid "List of desktop file IDs for favorite applications" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:13 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and " +"records to WEBM using the VP8 codec. %T is used as a placeholder for a guess " +"at the optimal thread count on the system." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:14 +msgid "Show date in clock" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:15 +msgid "Show the week date in the calendar" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:16 +msgid "Show time with seconds" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:17 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:18 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:19 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:20 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:21 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:22 +msgid "The type of keyboard to use." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:23 +msgid "Uuids of extensions to enable" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:24 +msgid "Whether to collect stats about applications usage" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:25 +msgid "Which keyboard to use" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:26 +msgid "disabled OpenSearch providers" +msgstr "" + +#: ../js/gdm/loginDialog.js:617 +msgid "Session..." +msgstr "Danişîn..." + +#: ../js/gdm/loginDialog.js:788 +msgctxt "title" +msgid "Sign In" +msgstr "Têkeve" + +#. translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/loginDialog.js:833 +msgid "(or swipe finger)" +msgstr "" + +#: ../js/gdm/loginDialog.js:851 +msgid "Not listed?" +msgstr "Di listê de tune?" + +#: ../js/gdm/loginDialog.js:1019 ../js/ui/endSessionDialog.js:426 +#: ../js/ui/extensionSystem.js:477 ../js/ui/networkAgent.js:165 +#: ../js/ui/polkitAuthenticationAgent.js:171 ../js/ui/status/bluetooth.js:480 +msgid "Cancel" +msgstr "Betal" + +#: ../js/gdm/loginDialog.js:1024 +msgctxt "button" +msgid "Sign In" +msgstr "Têkeve" + +#: ../js/gdm/loginDialog.js:1373 +msgid "Login Window" +msgstr "Paceya têketinê" + +#: ../js/gdm/powerMenu.js:116 ../js/ui/userMenu.js:549 +#: ../js/ui/userMenu.js:551 ../js/ui/userMenu.js:620 +msgid "Suspend" +msgstr "Xew" + +#: ../js/gdm/powerMenu.js:121 ../js/ui/endSessionDialog.js:89 +#: ../js/ui/endSessionDialog.js:97 ../js/ui/endSessionDialog.js:106 +msgid "Restart" +msgstr "Dîsdestpêkirin" + +#: ../js/gdm/powerMenu.js:126 ../js/ui/endSessionDialog.js:80 +#: ../js/ui/endSessionDialog.js:91 +msgid "Power Off" +msgstr "Girtin" + +#: ../js/misc/util.js:92 +msgid "Command not found" +msgstr "Ferman nehate dîtin" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:119 +msgid "Could not parse command:" +msgstr "" + +#: ../js/misc/util.js:127 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:255 +msgid "All" +msgstr "Hemû" + +#: ../js/ui/appDisplay.js:319 +msgid "APPLICATIONS" +msgstr "SEPAN" + +#: ../js/ui/appDisplay.js:377 +msgid "SETTINGS" +msgstr "MÎHENG" + +#: ../js/ui/appDisplay.js:684 +msgid "New Window" +msgstr "Paceya nû" + +#: ../js/ui/appDisplay.js:687 +msgid "Remove from Favorites" +msgstr "Ji bijareyan rake" + +#: ../js/ui/appDisplay.js:688 +msgid "Add to Favorites" +msgstr "Li bijareyan zêde bike" + +#: ../js/ui/appFavorites.js:89 +#, c-format +msgid "%s has been added to your favorites." +msgstr "%s li bijareyên te de zêde bû." + +#: ../js/ui/appFavorites.js:120 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "%s li bijareyên te de hate rakirin." + +#: ../js/ui/autorunManager.js:280 +msgid "Removable Devices" +msgstr "" + +#: ../js/ui/autorunManager.js:590 +#, c-format +msgid "Open with %s" +msgstr "Bi %s veke" + +#: ../js/ui/autorunManager.js:616 +msgid "Eject" +msgstr "Avêtin" + +#. 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:63 +msgctxt "event list time" +msgid "All Day" +msgstr "Hemû roj" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:68 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H:%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:75 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:115 +msgctxt "grid sunday" +msgid "S" +msgstr "Y" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:117 +msgctxt "grid monday" +msgid "M" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:119 +msgctxt "grid tuesday" +msgid "T" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:121 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ç" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:123 +msgctxt "grid thursday" +msgid "T" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:125 +msgctxt "grid friday" +msgid "F" +msgstr "Î" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:127 +msgctxt "grid saturday" +msgid "S" +msgstr "Ş" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:140 +msgctxt "list sunday" +msgid "Su" +msgstr "Yş" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:142 +msgctxt "list monday" +msgid "M" +msgstr "D" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:144 +msgctxt "list tuesday" +msgid "T" +msgstr "S" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:146 +msgctxt "list wednesday" +msgid "W" +msgstr "Ç" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:148 +msgctxt "list thursday" +msgid "Th" +msgstr "Pş" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:150 +msgctxt "list friday" +msgid "F" +msgstr "Î" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:152 +msgctxt "list saturday" +msgid "S" +msgstr "Ş" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:687 +msgid "Nothing Scheduled" +msgstr "" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:703 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:706 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "" + +#: ../js/ui/calendar.js:716 +msgid "Today" +msgstr "" + +#: ../js/ui/calendar.js:720 +msgid "Tomorrow" +msgstr "" + +#: ../js/ui/calendar.js:729 +msgid "This week" +msgstr "" + +#: ../js/ui/calendar.js:737 +msgid "Next week" +msgstr "" + +#: ../js/ui/contactDisplay.js:65 ../js/ui/notificationDaemon.js:444 +#: ../js/ui/status/power.js:223 ../src/shell-app.c:353 +msgid "Unknown" +msgstr "" + +#: ../js/ui/contactDisplay.js:86 ../js/ui/userMenu.js:139 +msgid "Available" +msgstr "" + +#: ../js/ui/contactDisplay.js:91 ../js/ui/userMenu.js:148 +msgid "Away" +msgstr "" + +#: ../js/ui/contactDisplay.js:95 ../js/ui/userMenu.js:142 +msgid "Busy" +msgstr "" + +#: ../js/ui/contactDisplay.js:99 +msgid "Offline" +msgstr "" + +#: ../js/ui/contactDisplay.js:146 +msgid "CONTACTS" +msgstr "TEKILÎ" + +#: ../js/ui/dash.js:172 ../js/ui/messageTray.js:1204 +msgid "Remove" +msgstr "Rakirin" + +#: ../js/ui/dateMenu.js:99 +msgid "Date and Time Settings" +msgstr "" + +#: ../js/ui/dateMenu.js:125 +msgid "Open Calendar" +msgstr "" + +#. Translators: This is the time format with date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:183 +msgid "%a %b %e, %R:%S" +msgstr "" + +#: ../js/ui/dateMenu.js:184 +msgid "%a %b %e, %R" +msgstr "" + +#. Translators: This is the time format without date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:188 +msgid "%a %R:%S" +msgstr "" + +#: ../js/ui/dateMenu.js:189 +msgid "%a %R" +msgstr "" + +#. Translators: This is a time format with date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:196 +msgid "%a %b %e, %l:%M:%S %p" +msgstr "" + +#: ../js/ui/dateMenu.js:197 +msgid "%a %b %e, %l:%M %p" +msgstr "" + +#. Translators: This is a time format without date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:201 +msgid "%a %l:%M:%S %p" +msgstr "" + +#: ../js/ui/dateMenu.js:202 +msgid "%a %l:%M %p" +msgstr "" + +#. 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:213 +msgid "%A %B %e, %Y" +msgstr "" + +#: ../js/ui/docDisplay.js:16 +msgid "RECENT ITEMS" +msgstr "" + +#: ../js/ui/endSessionDialog.js:60 +#, c-format +msgid "Log Out %s" +msgstr "" + +#: ../js/ui/endSessionDialog.js:61 ../js/ui/endSessionDialog.js:75 +msgid "Log Out" +msgstr "" + +#: ../js/ui/endSessionDialog.js:62 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:64 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:69 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:73 +msgid "Logging out of the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:81 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:83 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:87 +msgid "Powering off the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:98 +msgid "Click Restart to quit these applications and restart the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:100 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:104 +msgid "Restarting the system." +msgstr "" + +#: ../js/ui/extensionSystem.js:481 +msgid "Install" +msgstr "" + +#: ../js/ui/extensionSystem.js:485 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "" + +#: ../js/ui/keyboard.js:309 +msgid "tray" +msgstr "" + +#: ../js/ui/keyboard.js:531 ../js/ui/status/power.js:211 +msgid "Keyboard" +msgstr "" + +#: ../js/ui/lookingGlass.js:645 +msgid "No extensions installed" +msgstr "" + +#: ../js/ui/lookingGlass.js:691 +msgid "Enabled" +msgstr "" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:693 ../src/gvc/gvc-mixer-control.c:1093 +msgid "Disabled" +msgstr "" + +#: ../js/ui/lookingGlass.js:695 +msgid "Error" +msgstr "" + +#: ../js/ui/lookingGlass.js:697 +msgid "Out of date" +msgstr "" + +#: ../js/ui/lookingGlass.js:699 +msgid "Downloading" +msgstr "" + +#: ../js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "" + +#: ../js/ui/lookingGlass.js:726 +msgid "Web Page" +msgstr "" + +#: ../js/ui/messageTray.js:1197 +msgid "Open" +msgstr "" + +#: ../js/ui/messageTray.js:2406 +msgid "System Information" +msgstr "" + +#: ../js/ui/networkAgent.js:145 +msgid "Show password" +msgstr "" + +#: ../js/ui/networkAgent.js:160 +msgid "Connect" +msgstr "" + +#. Cisco LEAP +#: ../js/ui/networkAgent.js:255 ../js/ui/networkAgent.js:267 +#: ../js/ui/networkAgent.js:294 ../js/ui/networkAgent.js:314 +#: ../js/ui/networkAgent.js:324 +msgid "Password: " +msgstr "" + +#. static WEP +#: ../js/ui/networkAgent.js:260 +msgid "Key: " +msgstr "" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/ui/networkAgent.js:292 ../js/ui/networkAgent.js:310 +msgid "Username: " +msgstr "" + +#: ../js/ui/networkAgent.js:298 +msgid "Identity: " +msgstr "" + +#: ../js/ui/networkAgent.js:300 +msgid "Private key password: " +msgstr "" + +#: ../js/ui/networkAgent.js:312 +msgid "Service: " +msgstr "" + +#: ../js/ui/networkAgent.js:341 +msgid "Authentication required by wireless network" +msgstr "" + +#: ../js/ui/networkAgent.js:342 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"'%s'." +msgstr "" + +#: ../js/ui/networkAgent.js:346 +msgid "Wired 802.1X authentication" +msgstr "" + +#: ../js/ui/networkAgent.js:348 +msgid "Network name: " +msgstr "" + +#: ../js/ui/networkAgent.js:353 +msgid "DSL authentication" +msgstr "" + +#: ../js/ui/networkAgent.js:360 +msgid "PIN code required" +msgstr "" + +#: ../js/ui/networkAgent.js:361 +msgid "PIN code is needed for the mobile broadband device" +msgstr "" + +#: ../js/ui/networkAgent.js:362 +msgid "PIN: " +msgstr "" + +#: ../js/ui/networkAgent.js:368 +msgid "Mobile broadband network password" +msgstr "" + +#: ../js/ui/networkAgent.js:369 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "" + +#: ../js/ui/overview.js:91 +msgid "Undo" +msgstr "" + +#: ../js/ui/overview.js:205 +msgid "Windows" +msgstr "" + +#: ../js/ui/overview.js:208 +msgid "Applications" +msgstr "" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:230 +msgid "Dash" +msgstr "" + +#. TODO - _quit() doesn't really work on apps in state STARTING yet +#: ../js/ui/panel.js:539 +#, c-format +msgid "Quit %s" +msgstr "" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:575 +msgid "Activities" +msgstr "" + +#: ../js/ui/panel.js:967 +msgid "Top Bar" +msgstr "" + +#: ../js/ui/placeDisplay.js:120 +#, c-format +msgid "Failed to unmount '%s'" +msgstr "" + +#: ../js/ui/placeDisplay.js:123 +msgid "Retry" +msgstr "" + +#: ../js/ui/placeDisplay.js:163 +msgid "Connect to..." +msgstr "" + +#: ../js/ui/placeDisplay.js:375 +msgid "PLACES & DEVICES" +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:72 +msgid "Authentication Required" +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:106 +msgid "Administrator" +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:175 +msgid "Authenticate" +msgstr "" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/polkitAuthenticationAgent.js:256 +msgid "Sorry, that didn't work. Please try again." +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:268 +msgid "Password:" +msgstr "" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:731 +msgid "toggle-switch-us" +msgstr "" + +#: ../js/ui/runDialog.js:208 +msgid "Please enter a command:" +msgstr "" + +#: ../js/ui/searchDisplay.js:340 +msgid "Searching..." +msgstr "" + +#: ../js/ui/searchDisplay.js:363 +msgid "No matching results." +msgstr "" + +#: ../js/ui/shellMountOperation.js:285 +msgid "Wrong password, please try again" +msgstr "" + +#: ../js/ui/status/accessibility.js:60 +msgid "Zoom" +msgstr "" + +#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, +#. 'screen-reader-enabled'); +#. this.menu.addMenuItem(screenReader); +#: ../js/ui/status/accessibility.js:71 +msgid "Screen Keyboard" +msgstr "" + +#: ../js/ui/status/accessibility.js:75 +msgid "Visual Alerts" +msgstr "" + +#: ../js/ui/status/accessibility.js:78 +msgid "Sticky Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:81 +msgid "Slow Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:84 +msgid "Bounce Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:87 +msgid "Mouse Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:91 +msgid "Universal Access Settings" +msgstr "" + +#: ../js/ui/status/accessibility.js:141 +msgid "High Contrast" +msgstr "" + +#: ../js/ui/status/accessibility.js:178 +msgid "Large Text" +msgstr "" + +#: ../js/ui/status/bluetooth.js:39 ../js/ui/status/bluetooth.js:261 +#: ../js/ui/status/bluetooth.js:347 ../js/ui/status/bluetooth.js:381 +#: ../js/ui/status/bluetooth.js:421 ../js/ui/status/bluetooth.js:454 +msgid "Bluetooth" +msgstr "" + +#: ../js/ui/status/bluetooth.js:52 +msgid "Visibility" +msgstr "" + +#: ../js/ui/status/bluetooth.js:66 +msgid "Send Files to Device..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:67 +msgid "Set up a New Device..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:91 +msgid "Bluetooth Settings" +msgstr "" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:111 +msgid "hardware disabled" +msgstr "" + +#: ../js/ui/status/bluetooth.js:208 +msgid "Connection" +msgstr "" + +#: ../js/ui/status/bluetooth.js:217 ../js/ui/status/network.js:486 +msgid "disconnecting..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:230 ../js/ui/status/network.js:492 +msgid "connecting..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:248 +msgid "Send Files..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:253 +msgid "Browse Files..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:262 +msgid "Error browsing device" +msgstr "" + +#: ../js/ui/status/bluetooth.js:263 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "" + +#: ../js/ui/status/bluetooth.js:271 +msgid "Keyboard Settings" +msgstr "" + +#: ../js/ui/status/bluetooth.js:274 +msgid "Mouse Settings" +msgstr "" + +#: ../js/ui/status/bluetooth.js:279 ../js/ui/status/volume.js:62 +msgid "Sound Settings" +msgstr "" + +#: ../js/ui/status/bluetooth.js:382 +#, c-format +msgid "Authorization request from %s" +msgstr "" + +#: ../js/ui/status/bluetooth.js:388 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "" + +#: ../js/ui/status/bluetooth.js:390 +msgid "Always grant access" +msgstr "" + +#: ../js/ui/status/bluetooth.js:391 +msgid "Grant this time only" +msgstr "" + +#: ../js/ui/status/bluetooth.js:392 ../js/ui/telepathyClient.js:1204 +msgid "Reject" +msgstr "" + +#: ../js/ui/status/bluetooth.js:422 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "" + +#: ../js/ui/status/bluetooth.js:428 ../js/ui/status/bluetooth.js:462 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "" + +#: ../js/ui/status/bluetooth.js:429 +#, c-format +msgid "Please confirm whether the PIN '%s' matches the one on the device." +msgstr "" + +#: ../js/ui/status/bluetooth.js:431 +msgid "Matches" +msgstr "" + +#: ../js/ui/status/bluetooth.js:432 +msgid "Does not match" +msgstr "" + +#: ../js/ui/status/bluetooth.js:455 +#, c-format +msgid "Pairing request for %s" +msgstr "" + +#: ../js/ui/status/bluetooth.js:463 +msgid "Please enter the PIN mentioned on the device." +msgstr "" + +#: ../js/ui/status/bluetooth.js:479 +msgid "OK" +msgstr "" + +#: ../js/ui/status/keyboard.js:73 +msgid "Show Keyboard Layout" +msgstr "" + +#: ../js/ui/status/keyboard.js:78 +msgid "Region and Language Settings" +msgstr "" + +#: ../js/ui/status/network.js:97 +msgid "" +msgstr "" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:285 +msgid "disabled" +msgstr "" + +#. 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) +#: ../js/ui/status/network.js:484 +msgid "unmanaged" +msgstr "" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:495 +msgid "authentication required" +msgstr "" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:505 +msgid "firmware missing" +msgstr "" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:512 +msgid "cable unplugged" +msgstr "" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:517 +msgid "unavailable" +msgstr "" + +#: ../js/ui/status/network.js:519 +msgid "connection failed" +msgstr "" + +#: ../js/ui/status/network.js:575 ../js/ui/status/network.js:1523 +msgid "More..." +msgstr "" + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:611 ../js/ui/status/network.js:1458 +msgid "Connected (private)" +msgstr "" + +#: ../js/ui/status/network.js:689 +msgid "Auto Ethernet" +msgstr "" + +#: ../js/ui/status/network.js:753 +msgid "Auto broadband" +msgstr "" + +#: ../js/ui/status/network.js:756 +msgid "Auto dial-up" +msgstr "" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:878 ../js/ui/status/network.js:1470 +#, c-format +msgid "Auto %s" +msgstr "" + +#: ../js/ui/status/network.js:880 +msgid "Auto bluetooth" +msgstr "" + +#: ../js/ui/status/network.js:1472 +msgid "Auto wireless" +msgstr "" + +#: ../js/ui/status/network.js:1566 +msgid "Enable networking" +msgstr "" + +#: ../js/ui/status/network.js:1578 +msgid "Wired" +msgstr "" + +#: ../js/ui/status/network.js:1589 +msgid "Wireless" +msgstr "" + +#: ../js/ui/status/network.js:1599 +msgid "Mobile broadband" +msgstr "" + +#: ../js/ui/status/network.js:1609 +msgid "VPN Connections" +msgstr "" + +#: ../js/ui/status/network.js:1620 +msgid "Network Settings" +msgstr "" + +#: ../js/ui/status/network.js:1757 +msgid "Connection failed" +msgstr "" + +#: ../js/ui/status/network.js:1758 +msgid "Activation of network connection failed" +msgstr "" + +#: ../js/ui/status/network.js:2008 +msgid "Networking is disabled" +msgstr "" + +#: ../js/ui/status/network.js:2133 +msgid "Network Manager" +msgstr "" + +#: ../js/ui/status/power.js:82 +msgid "Power Settings" +msgstr "" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:103 +msgid "Estimating..." +msgstr "" + +#: ../js/ui/status/power.js:110 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "" +msgstr[1] "" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:113 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "" + +#: ../js/ui/status/power.js:115 +msgid "hour" +msgid_plural "hours" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/status/power.js:115 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/status/power.js:118 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/status/power.js:121 ../js/ui/status/power.js:194 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "" + +#: ../js/ui/status/power.js:201 +msgid "AC adapter" +msgstr "" + +#: ../js/ui/status/power.js:203 +msgid "Laptop battery" +msgstr "" + +#: ../js/ui/status/power.js:205 +msgid "UPS" +msgstr "" + +#: ../js/ui/status/power.js:207 +msgid "Monitor" +msgstr "" + +#: ../js/ui/status/power.js:209 +msgid "Mouse" +msgstr "" + +#: ../js/ui/status/power.js:213 +msgid "PDA" +msgstr "" + +#: ../js/ui/status/power.js:215 +msgid "Cell phone" +msgstr "" + +#: ../js/ui/status/power.js:217 +msgid "Media player" +msgstr "" + +#: ../js/ui/status/power.js:219 +msgid "Tablet" +msgstr "" + +#: ../js/ui/status/power.js:221 +msgid "Computer" +msgstr "" + +#: ../js/ui/status/volume.js:42 +msgid "Volume" +msgstr "" + +#: ../js/ui/status/volume.js:54 +msgid "Microphone" +msgstr "" + +#. We got the TpContact +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/telepathyClient.js:259 +msgid "Invitation" +msgstr "" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:327 +msgid "Call" +msgstr "" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:357 +msgid "File Transfer" +msgstr "" + +#: ../js/ui/telepathyClient.js:438 +msgid "Subscription request" +msgstr "" + +#: ../js/ui/telepathyClient.js:474 +msgid "Connection error" +msgstr "" + +#: ../js/ui/telepathyClient.js:741 +#, c-format +msgid "%s is online." +msgstr "" + +#: ../js/ui/telepathyClient.js:746 +#, c-format +msgid "%s is offline." +msgstr "" + +#: ../js/ui/telepathyClient.js:749 +#, c-format +msgid "%s is away." +msgstr "" + +#: ../js/ui/telepathyClient.js:752 +#, c-format +msgid "%s is busy." +msgstr "" + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/telepathyClient.js:986 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "" + +#. Translators: this is a time format in the style of "Wednesday, May 25", +#. shown when you get a chat message in the same year. +#: ../js/ui/telepathyClient.js:992 +#, no-c-format +msgid "Sent on %A, %B %d" +msgstr "" + +#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", +#. shown when you get a chat message in a different year. +#: ../js/ui/telepathyClient.js:997 +#, no-c-format +msgid "Sent on %A, %B %d, %Y" +msgstr "" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/telepathyClient.js:1039 +#, c-format +msgid "%s is now known as %s" +msgstr "" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/telepathyClient.js:1148 +#, c-format +msgid "Invitation to %s" +msgstr "" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/telepathyClient.js:1156 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "" + +#: ../js/ui/telepathyClient.js:1158 ../js/ui/telepathyClient.js:1248 +#: ../js/ui/telepathyClient.js:1352 +msgid "Decline" +msgstr "" + +#: ../js/ui/telepathyClient.js:1159 ../js/ui/telepathyClient.js:1249 +#: ../js/ui/telepathyClient.js:1353 +msgid "Accept" +msgstr "" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1192 +#, c-format +msgid "Video call from %s" +msgstr "" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1195 +#, c-format +msgid "Call from %s" +msgstr "" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/telepathyClient.js:1206 +msgid "Answer" +msgstr "" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/telepathyClient.js:1242 +#, c-format +msgid "%s is sending you %s" +msgstr "" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/telepathyClient.js:1317 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "" + +#: ../js/ui/telepathyClient.js:1415 +msgid "Network error" +msgstr "" + +#: ../js/ui/telepathyClient.js:1417 +msgid "Authentication failed" +msgstr "" + +#: ../js/ui/telepathyClient.js:1419 +msgid "Encryption error" +msgstr "" + +#: ../js/ui/telepathyClient.js:1421 +msgid "Certificate not provided" +msgstr "" + +#: ../js/ui/telepathyClient.js:1423 +msgid "Certificate untrusted" +msgstr "" + +#: ../js/ui/telepathyClient.js:1425 +msgid "Certificate expired" +msgstr "" + +#: ../js/ui/telepathyClient.js:1427 +msgid "Certificate not activated" +msgstr "" + +#: ../js/ui/telepathyClient.js:1429 +msgid "Certificate hostname mismatch" +msgstr "" + +#: ../js/ui/telepathyClient.js:1431 +msgid "Certificate fingerprint mismatch" +msgstr "" + +#: ../js/ui/telepathyClient.js:1433 +msgid "Certificate self-signed" +msgstr "" + +#: ../js/ui/telepathyClient.js:1435 +msgid "Status is set to offline" +msgstr "" + +#: ../js/ui/telepathyClient.js:1437 +msgid "Encryption is not available" +msgstr "" + +#: ../js/ui/telepathyClient.js:1439 +msgid "Certificate is invalid" +msgstr "" + +#: ../js/ui/telepathyClient.js:1441 +msgid "Connection has been refused" +msgstr "" + +#: ../js/ui/telepathyClient.js:1443 +msgid "Connection can't be established" +msgstr "" + +#: ../js/ui/telepathyClient.js:1445 +msgid "Connection has been lost" +msgstr "" + +#: ../js/ui/telepathyClient.js:1447 +msgid "This resource is already connected to the server" +msgstr "" + +#: ../js/ui/telepathyClient.js:1449 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" + +#: ../js/ui/telepathyClient.js:1451 +msgid "The account already exists on the server" +msgstr "" + +#: ../js/ui/telepathyClient.js:1453 +msgid "Server is currently too busy to handle the connection" +msgstr "" + +#: ../js/ui/telepathyClient.js:1455 +msgid "Certificate has been revoked" +msgstr "" + +#: ../js/ui/telepathyClient.js:1457 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" + +#: ../js/ui/telepathyClient.js:1459 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/telepathyClient.js:1468 +#, c-format +msgid "Connection to %s failed" +msgstr "" + +#: ../js/ui/telepathyClient.js:1477 +msgid "Reconnect" +msgstr "" + +#: ../js/ui/telepathyClient.js:1478 +msgid "Edit account" +msgstr "" + +#: ../js/ui/telepathyClient.js:1524 +msgid "Unknown reason" +msgstr "" + +#: ../js/ui/userMenu.js:145 +msgid "Hidden" +msgstr "" + +#: ../js/ui/userMenu.js:151 +msgid "Idle" +msgstr "" + +#: ../js/ui/userMenu.js:154 +msgid "Unavailable" +msgstr "" + +#: ../js/ui/userMenu.js:547 ../js/ui/userMenu.js:551 ../js/ui/userMenu.js:621 +msgid "Power Off..." +msgstr "" + +#: ../js/ui/userMenu.js:583 +msgid "Notifications" +msgstr "" + +#: ../js/ui/userMenu.js:591 +msgid "Online Accounts" +msgstr "" + +#: ../js/ui/userMenu.js:595 +msgid "System Settings" +msgstr "" + +#: ../js/ui/userMenu.js:602 +msgid "Lock Screen" +msgstr "" + +#: ../js/ui/userMenu.js:607 +msgid "Switch User" +msgstr "" + +#: ../js/ui/userMenu.js:612 +msgid "Log Out..." +msgstr "" + +#: ../js/ui/userMenu.js:640 +msgid "Your chat status will be set to busy" +msgstr "" + +#: ../js/ui/userMenu.js:641 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/viewSelector.js:120 +msgid "Type to search..." +msgstr "" + +#: ../js/ui/viewSelector.js:140 ../src/shell-util.c:261 +msgid "Search" +msgstr "" + +#: ../js/ui/windowAttentionHandler.js:35 +#, c-format +msgid "'%s' is ready" +msgstr "" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1100 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "" +msgstr[1] "" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1110 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "" +msgstr[1] "" + +#: ../src/gvc/gvc-mixer-control.c:1408 +msgid "System Sounds" +msgstr "" + +#: ../src/main.c:480 +msgid "Print version" +msgstr "" + +#: ../src/main.c:486 +msgid "Mode used by GDM for login screen" +msgstr "" + +#: ../src/shell-app.c:579 +#, c-format +msgid "Failed to launch '%s'" +msgstr "" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "" + +#: ../src/shell-polkit-authentication-agent.c:334 +msgid "Authentication dialog was dismissed by the user" +msgstr "" + +#: ../src/shell-util.c:100 +msgid "Home Folder" +msgstr "Peldanka mal" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:115 +msgid "File System" +msgstr "Pergala pelan" + +#. Translators: the first string is the name of a gvfs +#. * method, and the second string is a path. For +#. * example, "Trash: some-directory". It means that the +#. * directory called "some-directory" is in the trash. +#. +#: ../src/shell-util.c:311 +#, c-format +msgid "%1$s: %2$s" +msgstr "%1$s: %2$s" diff --git a/po/ky.po b/po/ky.po new file mode 100644 index 0000000..5592a82 --- /dev/null +++ b/po/ky.po @@ -0,0 +1,1753 @@ +# Kirghiz translation for gnome-shell. +# Copyright (C) 2012 The gnome-shell authors. +# This file is distributed under the same license as the gnome-shell package. +# +# Chynggyz Jumaliev , 2012. +# Timur Zhamakeev , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell-3-6\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-22 18:40+0000\n" +"PO-Revision-Date: 2012-09-24 14:29+0600\n" +"Last-Translator: Timur Zhamakeev \n" +"Language-Team: Kirghiz \n" +"Language: ky\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Lokalize 1.4\n" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:1 +msgid "Screenshots" +msgstr "" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:2 +msgid "Record a screencast" +msgstr "" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +#| msgid "File System" +msgid "System" +msgstr "Файлдар системасы" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "Кабар сабын көрсөтүү" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Терезелерди башкаруу жана тиркемелерди иштетүү" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +#: ../js/extensionPrefs/main.js:152 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME Shell кеңейтмелеринин параметрлери" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Shell кеңейтмелерин ырастоо" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "Uuids of extensions to enable" +msgstr "Күйгүзүлгөн кеңейтмелердин uuid'ри" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension DBus methods on org.gnome.Shell." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Whether to collect stats about applications usage" +msgstr "Тиркемелерди колдонуу жөнүндө статистиканы чогултуш керекпи" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "History for command (Alt-F2) dialog" +msgstr "(Alt-F2) диалогунун команда тарыхы" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "History for the looking glass dialog" +msgstr "Тунук диалогтун көрүү тарыхы" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "" +"Internally used to store the last IM presence explicitly set by the user. " +"The value here is from the TpConnectionPresenceType enumeration." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "" +"Internally used to store the last session presence status for the user. The " +"value here is from the GsmPresenceStatus enumeration." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Show the week date in the calendar" +msgstr "Жылнаамадан жуманын датасын көрсөтүү" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "If true, display the ISO week date in the calendar." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "Keybinding to open the application menu" +msgstr "Тиркеме менюсун ачуу үчүн клавиштик айкалыш" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "Keybinding to open the application menu." +msgstr "Тиркеме менюсун ачуу үчүн клавиштик айкалыш." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +#, fuzzy +#| msgid "Keybinding to toggle the screen recorder" +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "Экран тарткычты которуучу клавиштик айкалыш" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +#, fuzzy +#| msgid "Keybinding to toggle the screen recorder" +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "Экран тарткычты которуучу клавиштик айкалыш" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to toggle the screen recorder" +msgstr "Экран тарткычты которуучу клавиштик айкалыш" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to start/stop the builtin screen recorder." +msgstr "Ички экран тарткычты жүргүзүүчү/токтотуучу клавиштик айкалыш." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Which keyboard to use" +msgstr "Кайсы клавиатураны колдонуу" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "The type of keyboard to use." +msgstr "Колдонгон клавиатуранын түрү." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Framerate used for recording screencasts." +msgstr "Скринкасттарды жазыш үчүн кадр жыштыгынын алмашуусу." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is " +"used as a placeholder for a guess at the optimal thread count on the system." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "File extension used for storing the screencast" +msgstr "Скринкасттарды сактоо үчүн колдонулган файлдын кеңейтмеси" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" + +#: ../js/extensionPrefs/main.js:124 +#, c-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "" + +#: ../js/extensionPrefs/main.js:164 +#, fuzzy +#| msgid "Extension" +msgid "Extension" +msgstr "Кеңейтме" + +#: ../js/extensionPrefs/main.js:188 +msgid "Select an extension to configure using the combobox above." +msgstr "" + +#: ../js/gdm/loginDialog.js:526 +msgid "Session..." +msgstr "Сеанс…" + +#: ../js/gdm/loginDialog.js:674 +msgctxt "title" +msgid "Sign In" +msgstr "Кирүү" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:741 +msgid "Not listed?" +msgstr "Тизмеде жокпу?" + +#: ../js/gdm/loginDialog.js:894 ../js/ui/components/networkAgent.js:137 +#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 +#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 +msgid "Cancel" +msgstr "Айнуу" + +#: ../js/gdm/loginDialog.js:899 +msgctxt "button" +msgid "Sign In" +msgstr "Кирүү" + +#: ../js/gdm/loginDialog.js:1238 +msgid "Login Window" +msgstr "Кирүү терезеси" + +#: ../js/gdm/powerMenu.js:88 ../js/ui/userMenu.js:658 ../js/ui/userMenu.js:662 +#: ../js/ui/userMenu.js:773 +msgid "Suspend" +msgstr "Күтүүчү режим" + +#: ../js/gdm/powerMenu.js:93 +msgid "Restart" +msgstr "Кайта жүргүзүү" + +#: ../js/gdm/powerMenu.js:98 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:662 +#: ../js/ui/userMenu.js:772 +msgid "Power Off" +msgstr "Өчүрүү" + +#: ../js/gdm/util.js:148 +#, fuzzy +#| msgid "Authentication Required" +msgid "Authentication error" +msgstr "Аутентификация керек" + +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/util.js:265 +msgid "(or swipe finger)" +msgstr "(же эсептеген орнотмодон бармагыңызды өткөрүңүз)" + +#: ../js/gdm/util.js:290 +#, c-format +msgid "(e.g., user or %s)" +msgstr "" + +#: ../js/misc/util.js:92 +msgid "Command not found" +msgstr "Команда табылбады" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:125 +msgid "Could not parse command:" +msgstr "Команданы талдоого мүмкүн эмес:" + +#: ../js/misc/util.js:133 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:252 +msgid "All" +msgstr "Баары" + +#: ../js/ui/appDisplay.js:310 +msgid "APPLICATIONS" +msgstr "ТИРКЕМЕЛЕР" + +#: ../js/ui/appDisplay.js:370 +msgid "SETTINGS" +msgstr "ЫРАСТООЛОР" + +#: ../js/ui/appDisplay.js:675 +msgid "New Window" +msgstr "Жаңы терезе" + +#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 +msgid "Remove from Favorites" +msgstr "Тандалмадан өчүрүү" + +#: ../js/ui/appDisplay.js:679 +msgid "Add to Favorites" +msgstr "Тандалмага кошуу" + +#: ../js/ui/appFavorites.js:87 +#, c-format +msgid "%s has been added to your favorites." +msgstr "Cиздин тандалмаларыңызга %s кошулду." + +#: ../js/ui/appFavorites.js:118 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "Cиздин тандалмаларыңыздан %s алынды." + +#. 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:62 +msgctxt "event list time" +msgid "All Day" +msgstr "Бүт күн" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:67 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H:%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:74 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:114 +msgctxt "grid sunday" +msgid "S" +msgstr "Жк" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:116 +msgctxt "grid monday" +msgid "M" +msgstr "Дш" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:118 +msgctxt "grid tuesday" +msgid "T" +msgstr "Ше" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:120 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ша" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:122 +msgctxt "grid thursday" +msgid "T" +msgstr "Бш" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:124 +msgctxt "grid friday" +msgid "F" +msgstr "Жм" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:126 +msgctxt "grid saturday" +msgid "S" +msgstr "Иш" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:139 +msgctxt "list sunday" +msgid "Su" +msgstr "Жк" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:141 +msgctxt "list monday" +msgid "M" +msgstr "Дш" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:143 +msgctxt "list tuesday" +msgid "T" +msgstr "Ше" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:145 +msgctxt "list wednesday" +msgid "W" +msgstr "Ша" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:147 +msgctxt "list thursday" +msgid "Th" +msgstr "Бш" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:149 +msgctxt "list friday" +msgid "F" +msgstr "Жм" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:151 +msgctxt "list saturday" +msgid "S" +msgstr "Иш" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:699 +msgid "Nothing Scheduled" +msgstr "Окуялар жок" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:715 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%B айынын %e %a" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:718 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%Y-ж. %B айынын %e %a" + +#: ../js/ui/calendar.js:728 +msgid "Today" +msgstr "Бүгүн" + +#: ../js/ui/calendar.js:732 +msgid "Tomorrow" +msgstr "Эртең" + +#: ../js/ui/calendar.js:743 +msgid "This week" +msgstr "Ушул жума" + +#: ../js/ui/calendar.js:751 +msgid "Next week" +msgstr "Кийинки жума" + +#: ../js/ui/components/autorunManager.js:278 +msgid "Removable Devices" +msgstr "Алынуучу орнотмолор" + +#: ../js/ui/components/autorunManager.js:575 +#, c-format +msgid "Open with %s" +msgstr "%s менен ачуу" + +#: ../js/ui/components/autorunManager.js:601 +msgid "Eject" +msgstr "Чыгаруу" + +#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260 +msgid "Password:" +msgstr "Сырсөз:" + +#: ../js/ui/components/keyring.js:105 +msgid "Type again:" +msgstr "Дагы киргизиңиз:" + +#: ../js/ui/components/networkAgent.js:132 +msgid "Connect" +msgstr "Туташуу" + +#. Cisco LEAP +#: ../js/ui/components/networkAgent.js:223 +#: ../js/ui/components/networkAgent.js:235 +#: ../js/ui/components/networkAgent.js:262 +#: ../js/ui/components/networkAgent.js:282 +#: ../js/ui/components/networkAgent.js:292 +msgid "Password: " +msgstr "Сырсөз: " + +#. static WEP +#: ../js/ui/components/networkAgent.js:228 +msgid "Key: " +msgstr "Ачкыч: " + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/ui/components/networkAgent.js:260 +#: ../js/ui/components/networkAgent.js:278 +msgid "Username: " +msgstr "Колдонуучу аты: " + +#: ../js/ui/components/networkAgent.js:266 +msgid "Identity: " +msgstr "Окшоштук: " + +#: ../js/ui/components/networkAgent.js:268 +msgid "Private key password: " +msgstr "Өздүк ачкычтын сырсөзү: " + +#: ../js/ui/components/networkAgent.js:280 +msgid "Service: " +msgstr "Кызмат: " + +#: ../js/ui/components/networkAgent.js:309 +msgid "Authentication required by wireless network" +msgstr "Зымсыз тармагына аутентификация керек" + +#: ../js/ui/components/networkAgent.js:310 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"'%s'." +msgstr "" + +#: ../js/ui/components/networkAgent.js:314 +msgid "Wired 802.1X authentication" +msgstr "Wired 802.1X аутентификация" + +#: ../js/ui/components/networkAgent.js:316 +msgid "Network name: " +msgstr "Тармак аты: " + +#: ../js/ui/components/networkAgent.js:321 +msgid "DSL authentication" +msgstr "DSL аутентификация" + +#: ../js/ui/components/networkAgent.js:328 +msgid "PIN code required" +msgstr "PIN-код керек" + +#: ../js/ui/components/networkAgent.js:329 +msgid "PIN code is needed for the mobile broadband device" +msgstr "" + +#: ../js/ui/components/networkAgent.js:330 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:336 +msgid "Mobile broadband network password" +msgstr "Мобилдүү жазы тилкелик тармак үчүн сырсөз" + +#: ../js/ui/components/networkAgent.js:337 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "«%s» жерине туташыш үчүн сырсөз керек." + +#: ../js/ui/components/polkitAgent.js:55 +msgid "Authentication Required" +msgstr "Аутентификация керек" + +#: ../js/ui/components/polkitAgent.js:93 +msgid "Administrator" +msgstr "Администратор" + +#: ../js/ui/components/polkitAgent.js:166 +msgid "Authenticate" +msgstr "Аныктоо" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:381 +msgid "Sorry, that didn't work. Please try again." +msgstr "Кечириңиз, бул иштеген жок. Дагы аракет кылып көрүңүз." + +#. Translators: this is a filename used for screencast recording +#: ../js/ui/components/recorder.js:44 +#, no-c-format +msgid "Screencast from %d %t" +msgstr "Скринкаст %d %t" + +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/components/telepathyClient.js:237 +msgid "Invitation" +msgstr "Чакыруу" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:297 +msgid "Call" +msgstr "Чакыруу" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:313 +msgid "File Transfer" +msgstr "Файл берүү" + +#: ../js/ui/components/telepathyClient.js:394 +msgid "Subscription request" +msgstr "Жазылыш сурамы" + +#: ../js/ui/components/telepathyClient.js:430 +msgid "Connection error" +msgstr "Туташуу катасы" + +#: ../js/ui/components/telepathyClient.js:491 +msgid "Unmute" +msgstr "Катуулукту калыбына келтирүү" + +#: ../js/ui/components/telepathyClient.js:491 +msgid "Mute" +msgstr "Үндү басаңдатуу" + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/components/telepathyClient.js:948 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "" + +#. Translators: this is a time format in the style of "Wednesday, May 25", +#. shown when you get a chat message in the same year. +#: ../js/ui/components/telepathyClient.js:954 +#, no-c-format +msgid "Sent on %A, %B %d" +msgstr "" + +#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", +#. shown when you get a chat message in a different year. +#: ../js/ui/components/telepathyClient.js:959 +#, no-c-format +msgid "Sent on %A, %B %d, %Y" +msgstr "" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/components/telepathyClient.js:988 +#, c-format +msgid "%s is now known as %s" +msgstr "%s эми %s болуп калды" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1088 +#, c-format +msgid "Invitation to %s" +msgstr "%s бөлүмүнө чакыруу" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/components/telepathyClient.js:1096 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "%s сизди %s бөлүмүнө чакырып жатат" + +#: ../js/ui/components/telepathyClient.js:1098 +#: ../js/ui/components/telepathyClient.js:1177 +#: ../js/ui/components/telepathyClient.js:1240 +msgid "Decline" +msgstr "Кабыл албоо" + +#: ../js/ui/components/telepathyClient.js:1099 +#: ../js/ui/components/telepathyClient.js:1178 +#: ../js/ui/components/telepathyClient.js:1241 +msgid "Accept" +msgstr "Кабыл алуу" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1129 +#, c-format +msgid "Video call from %s" +msgstr "Сизди видеодон %s чыкырып жатат" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1132 +#, c-format +msgid "Call from %s" +msgstr "Сизди %s чакырып жатат" + +#: ../js/ui/components/telepathyClient.js:1137 +#: ../js/ui/status/bluetooth.js:346 +msgid "Reject" +msgstr "Кабыл албоо" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/components/telepathyClient.js:1139 +msgid "Answer" +msgstr "Жооп берүү" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/components/telepathyClient.js:1171 +#, c-format +msgid "%s is sending you %s" +msgstr "%s сизге %s жиберип жатат" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/components/telepathyClient.js:1206 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "" + +#: ../js/ui/components/telepathyClient.js:1298 +msgid "Network error" +msgstr "Тармак катасы" + +#: ../js/ui/components/telepathyClient.js:1300 +msgid "Authentication failed" +msgstr "Аутентификация оңунан чыккан жок" + +#: ../js/ui/components/telepathyClient.js:1302 +msgid "Encryption error" +msgstr "Шифрлоо катасы" + +#: ../js/ui/components/telepathyClient.js:1304 +msgid "Certificate not provided" +msgstr "Сертификат берилбейт" + +#: ../js/ui/components/telepathyClient.js:1306 +msgid "Certificate untrusted" +msgstr "Ишеничсиз сертификат" + +#: ../js/ui/components/telepathyClient.js:1308 +msgid "Certificate expired" +msgstr "Сертификаттын күч мөөнөтү өткөн" + +#: ../js/ui/components/telepathyClient.js:1310 +msgid "Certificate not activated" +msgstr "Сертификат активацияланган жок" + +#: ../js/ui/components/telepathyClient.js:1312 +msgid "Certificate hostname mismatch" +msgstr "Сертификаттын түйүн аты дал келген жок" + +#: ../js/ui/components/telepathyClient.js:1314 +msgid "Certificate fingerprint mismatch" +msgstr "Сертификаттын бармак тагы дал келген жок" + +#: ../js/ui/components/telepathyClient.js:1316 +msgid "Certificate self-signed" +msgstr "Өз жазылган сертификат" + +#: ../js/ui/components/telepathyClient.js:1318 +msgid "Status is set to offline" +msgstr "Офлайн статусуна коюлду" + +#: ../js/ui/components/telepathyClient.js:1320 +msgid "Encryption is not available" +msgstr "Шифрлоо жеткиликсиз" + +#: ../js/ui/components/telepathyClient.js:1322 +msgid "Certificate is invalid" +msgstr "Жарабас сертификат" + +#: ../js/ui/components/telepathyClient.js:1324 +msgid "Connection has been refused" +msgstr "Туташтырууга кабыл албады" + +#: ../js/ui/components/telepathyClient.js:1326 +msgid "Connection can't be established" +msgstr "Туташтырууну коюуга мүмкүн эмес" + +#: ../js/ui/components/telepathyClient.js:1328 +msgid "Connection has been lost" +msgstr "Туташтыруу жоготулду" + +#: ../js/ui/components/telepathyClient.js:1330 +msgid "This account is already connected to the server" +msgstr "Бул эсептик жазылыш эчак эле серверге туташытырлган" + +#: ../js/ui/components/telepathyClient.js:1332 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" + +#: ../js/ui/components/telepathyClient.js:1334 +msgid "The account already exists on the server" +msgstr "Эсептик жазылыш эчак эле серверде бар" + +#: ../js/ui/components/telepathyClient.js:1336 +msgid "Server is currently too busy to handle the connection" +msgstr "Учурда туташтырууну иштетип чыгаруу үчүн сервердин күчү жетпей жатат" + +#: ../js/ui/components/telepathyClient.js:1338 +msgid "Certificate has been revoked" +msgstr "Сертификат жокко чыгарылды" + +#: ../js/ui/components/telepathyClient.js:1340 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" + +#: ../js/ui/components/telepathyClient.js:1342 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" + +#: ../js/ui/components/telepathyClient.js:1344 +msgid "Internal error" +msgstr "Ички ката" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1354 +#, c-format +msgid "Connection to %s failed" +msgstr "%s дарегине туташтыруу оңунан чыккан жок" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Reconnect" +msgstr "Кайта туташуу" + +#: ../js/ui/components/telepathyClient.js:1364 +msgid "Edit account" +msgstr "Эсептик жазылышты оңдоо" + +#: ../js/ui/components/telepathyClient.js:1409 +msgid "Unknown reason" +msgstr "Белгисиз себеп" + +#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 +#, fuzzy +#| msgid "Applications" +msgid "Show Applications" +msgstr "Тиркемелер" + +#: ../js/ui/dateMenu.js:86 +msgid "Date and Time Settings" +msgstr "Дата жана убакытты ырастоо" + +#: ../js/ui/dateMenu.js:109 +msgid "Open Calendar" +msgstr "Жылнааманы ачуу" + +#. 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:175 +msgid "%A %B %e, %Y" +msgstr "%Y-ж. %B айынын %e %a" + +#: ../js/ui/endSessionDialog.js:61 +#, c-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s колдонуучусунун сеансын бүтүрүү" + +#: ../js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Log Out" +msgstr "Системадан чыгуу" + +#: ../js/ui/endSessionDialog.js:63 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:65 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "" +"%s колдонуучусунун сеансы %d секундадан кийин автоматтуу түрдө бүтүрүлөт." + +#: ../js/ui/endSessionDialog.js:70 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "%d секундадан кийин автоматтуу түрдө сеанс бүтөт." + +#: ../js/ui/endSessionDialog.js:74 +msgid "Logging out of the system." +msgstr "Системадан чыгуу." + +#: ../js/ui/endSessionDialog.js:76 +msgctxt "button" +msgid "Log Out" +msgstr "Системадан чыгуу" + +#: ../js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Power Off" +msgstr "Өчүрүү" + +#: ../js/ui/endSessionDialog.js:82 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:84 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "%d секундадан кийин автоматтуу түрдө система өчүрүлөт." + +#: ../js/ui/endSessionDialog.js:88 +msgid "Powering off the system." +msgstr "Системаны өчүрүү." + +#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107 +msgctxt "button" +msgid "Restart" +msgstr "Кайта жүргүзүү" + +#: ../js/ui/endSessionDialog.js:92 +msgctxt "button" +msgid "Power Off" +msgstr "Өчүрүү" + +#: ../js/ui/endSessionDialog.js:98 +msgctxt "title" +msgid "Restart" +msgstr "Кайта жүргүзүү" + +#: ../js/ui/endSessionDialog.js:99 +msgid "Click Restart to quit these applications and restart the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:101 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "%d секундадан кийин автоматтуу түрдө система кайта жүргүзүлөт." + +#: ../js/ui/endSessionDialog.js:105 +msgid "Restarting the system." +msgstr "Системаны кайта жүргүзүү." + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Орнотуу" + +#: ../js/ui/extensionDownloader.js:204 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "extensions.gnome.org сайтынан «%s» кеңейтмесин жүктөп орнотосузбу?" + +#: ../js/ui/keyboard.js:327 +msgid "tray" +msgstr "жайма" + +#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 +#: ../js/ui/status/power.js:205 +msgid "Keyboard" +msgstr "Клавиатура" + +#: ../js/ui/lookingGlass.js:691 +msgid "No extensions installed" +msgstr "Кеңейтмелер орнотулган жок" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:745 +#, c-format +msgid "%s has not emitted any errors." +msgstr "%s каталар жөнүндө эч нерсе маалымдаган жок." + +#: ../js/ui/lookingGlass.js:751 +msgid "Hide Errors" +msgstr "Каталарды катуу" + +#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815 +msgid "Show Errors" +msgstr "Каталарды көрсөтүү" + +#: ../js/ui/lookingGlass.js:764 +msgid "Enabled" +msgstr "Күйгүлгөн" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:767 ../src/gvc/gvc-mixer-control.c:1082 +msgid "Disabled" +msgstr "Өчүрүлгөн" + +#: ../js/ui/lookingGlass.js:769 +msgid "Error" +msgstr "Ката" + +#: ../js/ui/lookingGlass.js:771 +msgid "Out of date" +msgstr "Эскирген" + +#: ../js/ui/lookingGlass.js:773 +msgid "Downloading" +msgstr "Жүктөө" + +#: ../js/ui/lookingGlass.js:797 +msgid "View Source" +msgstr "Кодду көрсөтүү" + +#: ../js/ui/lookingGlass.js:806 +msgid "Web Page" +msgstr "Веб-барак" + +#: ../js/ui/messageTray.js:1080 +msgid "Open" +msgstr "Ачуу" + +#: ../js/ui/messageTray.js:1087 +msgid "Remove" +msgstr "Өчүрүү" + +#: ../js/ui/messageTray.js:2055 +msgid "Message Tray" +msgstr "" + +#: ../js/ui/messageTray.js:2511 +msgid "System Information" +msgstr "Системалык информация" + +#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373 +msgctxt "program" +msgid "Unknown" +msgstr "Белгисиз" + +#: ../js/ui/overview.js:82 +msgid "Undo" +msgstr "Жокко чыгаруу" + +#: ../js/ui/overview.js:127 +msgid "Overview" +msgstr "Сереп" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/overview.js:201 +msgid "Type to search..." +msgstr "Табуу…" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:222 +msgid "Dash" +msgstr "Аспаптык панель" + +#: ../js/ui/panel.js:567 +msgid "Quit" +msgstr "Жабуу" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:599 +msgid "Activities" +msgstr "Сереп" + +#: ../js/ui/panel.js:965 +msgid "Top Bar" +msgstr "Үстүңкү панель" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:731 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:205 +msgid "Please enter a command:" +msgstr "Команданы киргизиңиз:" + +#. Translators: This is a time format for a date in +#. long format +#: ../js/ui/screenShield.js:79 +#, fuzzy +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgid "%A, %B %d" +msgstr "%B айынын %e %a" + +#: ../js/ui/screenShield.js:144 +#, c-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "" + +#: ../js/ui/screenShield.js:146 +#, fuzzy, c-format +#| msgid "Notifications" +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "Эскертүүлөр" + +#: ../js/ui/searchDisplay.js:275 +msgid "Searching..." +msgstr "Издөө…" + +#: ../js/ui/searchDisplay.js:323 +#, fuzzy +#| msgid "No matching results." +msgid "No results." +msgstr "Дал келген натыйжалар жок." + +#: ../js/ui/shellEntry.js:26 +msgid "Copy" +msgstr "Копиялоо" + +#: ../js/ui/shellEntry.js:31 +msgid "Paste" +msgstr "Коюу" + +#: ../js/ui/shellEntry.js:102 +msgid "Show Text" +msgstr "Текстти көрсөтүү" + +#: ../js/ui/shellEntry.js:104 +msgid "Hide Text" +msgstr "Текстти катуу" + +#: ../js/ui/shellMountOperation.js:368 +#, fuzzy +#| msgid "Password:" +msgid "Password" +msgstr "Сырсөз:" + +#: ../js/ui/shellMountOperation.js:389 +#, fuzzy +#| msgid "Remember Passphrase" +msgid "Remember Password" +msgstr "Сырсүйлөмдү эске сактоо" + +#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 +msgid "Unlock" +msgstr "Ачуу" + +#: ../js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Жеткиликтүүлүк" + +#: ../js/ui/status/accessibility.js:44 +msgid "Zoom" +msgstr "Масштабтоо" + +#: ../js/ui/status/accessibility.js:51 +msgid "Screen Reader" +msgstr "Экран окугуч" + +#: ../js/ui/status/accessibility.js:55 +msgid "Screen Keyboard" +msgstr "Экрандык клавиатура" + +#: ../js/ui/status/accessibility.js:59 +msgid "Visual Alerts" +msgstr "Көрүнөө эскертүүлөр" + +#: ../js/ui/status/accessibility.js:62 +msgid "Sticky Keys" +msgstr "Жабышма клавиштер" + +#: ../js/ui/status/accessibility.js:65 +msgid "Slow Keys" +msgstr "Жай клавиштер" + +#: ../js/ui/status/accessibility.js:68 +msgid "Bounce Keys" +msgstr "Секирген клавиштер" + +#: ../js/ui/status/accessibility.js:71 +msgid "Mouse Keys" +msgstr "Чычкан клавиштери" + +#: ../js/ui/status/accessibility.js:75 +msgid "Universal Access Settings" +msgstr "" +"Атайы мүмкүнчүлүктөрдү\n" +"ырастоо" + +#: ../js/ui/status/accessibility.js:109 +msgid "High Contrast" +msgstr "Карама-каршы тема" + +#: ../js/ui/status/accessibility.js:146 +msgid "Large Text" +msgstr "Ири текст" + +#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 +#: ../js/ui/status/bluetooth.js:251 ../js/ui/status/bluetooth.js:304 +#: ../js/ui/status/bluetooth.js:335 ../js/ui/status/bluetooth.js:371 +#: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:867 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:44 +msgid "Visibility" +msgstr "Көрүнүү" + +#: ../js/ui/status/bluetooth.js:58 +msgid "Send Files to Device..." +msgstr "Орнотмого файлдарды жөнөтүү…" + +#: ../js/ui/status/bluetooth.js:59 +msgid "Set up a New Device..." +msgstr "Жаңы орнотмону ырастоо…" + +#: ../js/ui/status/bluetooth.js:83 +msgid "Bluetooth Settings" +msgstr "Bluetooth'ту ырастоо" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:208 +msgid "hardware disabled" +msgstr "орнотмо өчүрүлдү" + +#: ../js/ui/status/bluetooth.js:196 +msgid "Connection" +msgstr "Туташуу" + +#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:458 +msgid "disconnecting..." +msgstr "өчүрүлүү…" + +#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:464 +#: ../js/ui/status/network.js:934 +msgid "connecting..." +msgstr "туташуу…" + +#: ../js/ui/status/bluetooth.js:238 +msgid "Send Files..." +msgstr "Файлдарды жөнөтүү…" + +#: ../js/ui/status/bluetooth.js:243 +msgid "Browse Files..." +msgstr "Файлдарды кароо…" + +#: ../js/ui/status/bluetooth.js:252 +msgid "Error browsing device" +msgstr "Орнотмону көрүү катасы" + +#: ../js/ui/status/bluetooth.js:253 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "" + +#: ../js/ui/status/bluetooth.js:261 +msgid "Keyboard Settings" +msgstr "Клавиатураны ырастоо" + +#: ../js/ui/status/bluetooth.js:264 +msgid "Mouse Settings" +msgstr "Чычканды ырастоо" + +#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 +msgid "Sound Settings" +msgstr "Үндү ырастоо" + +#: ../js/ui/status/bluetooth.js:336 +#, c-format +msgid "Authorization request from %s" +msgstr "%s авториязацияны сурап жатат" + +#: ../js/ui/status/bluetooth.js:342 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "%s орнотмосу «%s» кызматына кирүү аракетин кылып жатат" + +#: ../js/ui/status/bluetooth.js:344 +msgid "Always grant access" +msgstr "Дайыма кирүүгө мүмкүндүк берүү" + +#: ../js/ui/status/bluetooth.js:345 +msgid "Grant this time only" +msgstr "Бир гана жолу берүү" + +#: ../js/ui/status/bluetooth.js:372 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "%s менен байланыштыруу аныктоосу" + +#: ../js/ui/status/bluetooth.js:378 ../js/ui/status/bluetooth.js:408 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "%s орнотмосу ушу компьютер менен байланышайын деп жатат" + +#: ../js/ui/status/bluetooth.js:379 +#, c-format +msgid "Please confirm whether the PIN '%06d' matches the one on the device." +msgstr "" + +#: ../js/ui/status/bluetooth.js:381 +msgid "Matches" +msgstr "Дал келди" + +#: ../js/ui/status/bluetooth.js:382 +msgid "Does not match" +msgstr "Дал келбеди" + +#: ../js/ui/status/bluetooth.js:401 +#, c-format +msgid "Pairing request for %s" +msgstr "%s менен байланыштырууга суроо" + +#: ../js/ui/status/bluetooth.js:409 +msgid "Please enter the PIN mentioned on the device." +msgstr "" + +#: ../js/ui/status/bluetooth.js:426 +msgid "OK" +msgstr "OK" + +#: ../js/ui/status/keyboard.js:228 +msgid "Show Keyboard Layout" +msgstr "Клавиатура жайылматүрүн көрсөтүү" + +#: ../js/ui/status/keyboard.js:233 +msgid "Region and Language Settings" +msgstr "Региондук жана тилдик ырастоолор" + +#: ../js/ui/status/lockScreenMenu.js:18 +msgid "Volume, network, battery" +msgstr "" + +#: ../js/ui/status/network.js:94 +msgid "" +msgstr "<белгисиз>" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:230 +msgid "disabled" +msgstr "өчүрүлгөн" + +#. 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) +#: ../js/ui/status/network.js:456 +msgid "unmanaged" +msgstr "башкарылган жок" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:467 ../js/ui/status/network.js:937 +msgid "authentication required" +msgstr "аутентификация керек" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:477 +msgid "firmware missing" +msgstr "тигилме жок" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:484 +msgid "cable unplugged" +msgstr "кабель кошулган жок" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:489 +msgid "unavailable" +msgstr "жеткиликтүү эмес" + +#: ../js/ui/status/network.js:491 ../js/ui/status/network.js:939 +msgid "connection failed" +msgstr "туташтыруу оңунан чыккан жок" + +#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1529 +msgid "More..." +msgstr "Дагы…" + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1459 +msgid "Connected (private)" +msgstr "Туташтырылды (жеке)" + +#: ../js/ui/status/network.js:663 +msgid "Auto Ethernet" +msgstr "Автоматтуу зымдык" + +#: ../js/ui/status/network.js:721 +msgid "Auto broadband" +msgstr "Автоматтуу жазы тилкелик" + +#: ../js/ui/status/network.js:724 +msgid "Auto dial-up" +msgstr "Автоматтуу коммутациялык" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476 +#, c-format +msgid "Auto %s" +msgstr "Автоматтуу %s" + +#: ../js/ui/status/network.js:855 +msgid "Auto bluetooth" +msgstr "Автоматтуу bluetooth" + +#: ../js/ui/status/network.js:1478 +msgid "Auto wireless" +msgstr "Автоматтуу зымсыз" + +#: ../js/ui/status/network.js:1575 +msgid "Enable networking" +msgstr "Тармакты күйгүзүү" + +#: ../js/ui/status/network.js:1597 +msgid "Wired" +msgstr "Зымдык" + +#: ../js/ui/status/network.js:1608 +msgid "Wireless" +msgstr "Зымсыз" + +#: ../js/ui/status/network.js:1618 +msgid "Mobile broadband" +msgstr "Мобильдүү жазы тилкелик" + +#: ../js/ui/status/network.js:1628 +msgid "VPN Connections" +msgstr "VPN туташтыруусу" + +#: ../js/ui/status/network.js:1635 +msgid "Network Settings" +msgstr "Тармакты ырастоо" + +#: ../js/ui/status/network.js:1679 +msgid "Network Manager" +msgstr "Тармак диспетчери" + +#: ../js/ui/status/network.js:1769 +msgid "Connection failed" +msgstr "Туташтыруу оңунан чыккан жок" + +#: ../js/ui/status/network.js:1770 +msgid "Activation of network connection failed" +msgstr "Тармактык туташтыруунун активациясы оңунан чыккан жок" + +#: ../js/ui/status/network.js:2065 +msgid "Networking is disabled" +msgstr "Тармак өчүрүлгөн" + +#: ../js/ui/status/power.js:55 +msgid "Battery" +msgstr "Батарея" + +#: ../js/ui/status/power.js:72 +msgid "Power Settings" +msgstr "Азыктанууну ырастоо" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:94 +msgid "Estimating..." +msgstr "Эсептелип жатат…" + +#: ../js/ui/status/power.js:101 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "%d саат калды" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:104 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "%d %s %d %s калды" + +#: ../js/ui/status/power.js:106 +msgid "hour" +msgid_plural "hours" +msgstr[0] "саат" + +#: ../js/ui/status/power.js:106 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "мүнөт" + +#: ../js/ui/status/power.js:109 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "%d мүнөт калды" + +#: ../js/ui/status/power.js:112 ../js/ui/status/power.js:186 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d%%" + +#: ../js/ui/status/power.js:195 +msgid "AC adapter" +msgstr "Алмашма ток адаптери" + +#: ../js/ui/status/power.js:197 +msgid "Laptop battery" +msgstr "Ноутбук батареясы" + +#: ../js/ui/status/power.js:199 +msgid "UPS" +msgstr "ҮЖБ" + +#: ../js/ui/status/power.js:201 +msgid "Monitor" +msgstr "Монитор" + +#: ../js/ui/status/power.js:203 +msgid "Mouse" +msgstr "Чычкан" + +#: ../js/ui/status/power.js:207 +msgid "PDA" +msgstr "ЧПК" + +#: ../js/ui/status/power.js:209 +msgid "Cell phone" +msgstr "Мобильдик телефон" + +#: ../js/ui/status/power.js:211 +msgid "Media player" +msgstr "Медиаплеер" + +#: ../js/ui/status/power.js:213 +msgid "Tablet" +msgstr "Планшет" + +#: ../js/ui/status/power.js:215 +msgid "Computer" +msgstr "Компьютер" + +#: ../js/ui/status/power.js:217 +msgctxt "device" +msgid "Unknown" +msgstr "Белгисиз" + +#. Translators: This is the label for audio volume +#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 +msgid "Volume" +msgstr "Катуулук" + +#: ../js/ui/status/volume.js:59 +msgid "Microphone" +msgstr "Микрофон" + +#: ../js/ui/unlockDialog.js:176 +#, fuzzy +#| msgid "Login as another user" +msgid "Log in as another user" +msgstr "Башка колдонуучу катары кирүү" + +#: ../js/ui/userMenu.js:175 +msgid "Available" +msgstr "Жеткиликтүү" + +#: ../js/ui/userMenu.js:178 +msgid "Busy" +msgstr "Бош эмес" + +#: ../js/ui/userMenu.js:181 +msgid "Invisible" +msgstr "Көрүнбөс" + +#: ../js/ui/userMenu.js:184 +msgid "Away" +msgstr "Кетти" + +#: ../js/ui/userMenu.js:187 +msgid "Idle" +msgstr "Аракет кылган жок" + +#: ../js/ui/userMenu.js:190 +msgid "Unavailable" +msgstr "Жеткиликсиз" + +#: ../js/ui/userMenu.js:613 ../js/ui/userMenu.js:754 +msgid "Switch User" +msgstr "Колдонуучуну которуу" + +#: ../js/ui/userMenu.js:614 +msgid "Switch Session" +msgstr "Сеансты которуу" + +#: ../js/ui/userMenu.js:738 +msgid "Notifications" +msgstr "Эскертүүлөр" + +#: ../js/ui/userMenu.js:746 +msgid "System Settings" +msgstr "Системалык параметрлер" + +#: ../js/ui/userMenu.js:759 +msgid "Log Out" +msgstr "Системадан чыгуу" + +#: ../js/ui/userMenu.js:764 +msgid "Lock" +msgstr "Камалоо" + +#: ../js/ui/userMenu.js:779 +msgid "Install Updates & Restart" +msgstr "Жаңыртмаларды орнотуп жана кайта жүргүзүү" + +#: ../js/ui/userMenu.js:797 +msgid "Your chat status will be set to busy" +msgstr "Чат статусу «бош эмес» дегенине коюлат" + +#: ../js/ui/userMenu.js:798 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" + +#: ../js/ui/viewSelector.js:85 +msgid "Windows" +msgstr "Терезелер" + +#: ../js/ui/viewSelector.js:89 +msgid "Applications" +msgstr "Тиркемелер" + +#: ../js/ui/viewSelector.js:93 +msgid "Search" +msgstr "Издөө" + +#: ../js/ui/wanda.js:119 +#, c-format +msgid "" +"Sorry, no wisdom for you today:\n" +"%s" +msgstr "" +"Кечириңиз, бүгүнкүгө эч кандай кеңештер жок:\n" +"%s" + +#: ../js/ui/wanda.js:123 +#, c-format +msgid "%s the Oracle says" +msgstr "«%s» деп оракул айтып жатат" + +#: ../js/ui/wanda.js:164 +msgid "Your favorite Easter Egg" +msgstr "Сиз жакшы көргөн «пасха жумуртасы»" + +#: ../js/ui/windowAttentionHandler.js:19 +#, c-format +msgid "'%s' is ready" +msgstr "«%s» терезеси даяр" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution жылнаамасы" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1089 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u чыгыш" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1099 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u кириш" + +#: ../src/gvc/gvc-mixer-control.c:1397 +msgid "System Sounds" +msgstr "Системалык үндөр" + +#: ../src/main.c:330 +msgid "Print version" +msgstr "Версиянын номерин көрсөтүү" + +#: ../src/main.c:336 +msgid "Mode used by GDM for login screen" +msgstr "Кирүү экранына GDM менен колдонулуучу режим" + +#: ../src/main.c:342 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "Кирүү экраны үчүн белгилүү бир режимди колдонуу, мисалы «gdm»" + +#: ../src/main.c:348 +msgid "List possible modes" +msgstr "Мүмкүн болгон режимдеринин тизмеси" + +#: ../src/shell-app.c:621 +#, c-format +msgid "Failed to launch '%s'" +msgstr "" + +#: ../src/shell-keyring-prompt.c:708 +msgid "Passwords do not match." +msgstr "Сырсөздөр дал келген жок." + +#: ../src/shell-keyring-prompt.c:716 +msgid "Password cannot be blank" +msgstr "Сырсөз бош боло албайт" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "Улуу Британия" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "Жарыяланбас" + +#: ../src/shell-polkit-authentication-agent.c:343 +msgid "Authentication dialog was dismissed by the user" +msgstr "Аутентификация диалогун колдонуучу кабыл албады" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "өчүрүлгөн OpenSearch провайдерлери" + +#~ msgid "Retry" +#~ msgstr "Кайталоо" + +#~ msgid "Connect to..." +#~ msgstr "Туташуу…" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ОРУНДАР ЖАНА ОРНОТМОЛОР" + +#~ msgid "Passphrase" +#~ msgstr "Сырсүйлөм" + +#~ msgid "Home" +#~ msgstr "Үйдүк папка" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..08a5aef --- /dev/null +++ b/po/lt.po @@ -0,0 +1,2619 @@ +# Lithuanian translation for gnome-shell. +# Copyright © 2010-2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Žygimantas Beručka , 2010, 2011, 2012. +# Algimantas Margevičius , 2011. +# Mantas Kriaučiūnas , 2012, 2013. +# Aurimas Černius , 2013-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-03 10:16+0000\n" +"PO-Revision-Date: 2019-03-03 18:54+0200\n" +"Last-Translator: Aurimas Černius \n" +"Language-Team: Lietuvių \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2)\n" +"X-Generator: Gtranslator 3.30.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Rodyti pranešimų sąrašą" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokusuoti aktyvų pranešimą" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Rodyti apžvalgą" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Rodyti visas programas" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Atverti programų meniu" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell plėtiniai" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Konfigūruoti GNOME Shell plėtinius" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell aplinka" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Langų tvarkymas ir programų paleidimas" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Įjungti vidinius, Alt-F2 klavišų pagalba pasiekiamus įrankius, naudingus " +"programuotojams ir bandytojams" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Suteikia prieigą prie vidinio derinimo ir stebėjimo įrankių, naudojant Alt-" +"F2 dialogą." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Įjungtų plėtinių UUID" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell plėtiniai turi UUID savybę; šiame rakte išvardinti plėtiniai, " +"kurie turėtų būti įkelti. Bet kuris plėtinys, kuris nori būti įkeltas, turi " +"būti šiame sąraše. Šį sąrašą taip pat galima keisti naudojant org.gnome." +"Shell D-Bus metodus EnableExtension ir DisableExtension." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Išjungti naudotojo plėtinius" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Išjungti visus naudotojo įjungtus plėtinius nepakeičiant „enabled-extension“ " +"nustatymo." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Išjungia plėtinio versijos suderinamumo tikrinimą" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell leidžia įkelti tik šiuo metu veikiančios versijos plėtinius. Šio " +"parametro įjungimas išjungs šį tikrinimą ir bandys įkelti visus plėtinius " +"nepaisant jų nurodomos palaikomos versijos." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Mėgstamų programų darbalaukio failų ID sąrašas" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programos, atitinkančios šiuos identifikatorius, bus rodomos mėgstamų " +"srityje." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Programos pasirinkimo vaizdas" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Šiuo metu pasirinkto vaizdo programų vaizde indeksas." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Komandų (Alt-F2) dialogo retrospektyva" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Didinamojo stiklo dialogo retrospektyva" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Visada rodyti naudotojo meniu punktą „Atsijungti“." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Šis raktas perrašo automatinį meniu punkto „Atsijungti“ slėpimą vieno " +"naudotojo, vieno seanso situacijose." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Ar atsiminti slaptažodį prijungiant šifruotas ar nutolusias failų sistemas" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Apvalkalas prašys slaptažodžio, kai prijungiamas šifruotas įrenginys ar " +"nutolusi failų sistema. Jei slaptažodis gali būti įrašytas ateičiai, " +"žymimasis langelis „Įsiminti slaptažodį“ bus rodomas. Šis raktas nustato " +"numatytąją žymimojo langelio būseną." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Ar numatytasis Bluetooth adapteris buvo nusistatęs su juo susietus įrenginius" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Apvalkalas rodys Bluetooth meniu elementą tik tuo atveju, jei Bluetooth " +"adapteris yra pajungtas arba jei buvo nustatyti įrenginiai, susieti su " +"numatytuoju adapteriu. Tai bus atstatyta, jeigu kada nors bus pastebėta, kad " +"numatytasis adapteris neturi su juo susietų įrenginių." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Įjungti nagrinėjimo sąsają" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Įjungia D-Bus sąsają, kuri leidžia nagrinėti apvalkalo programos būseną." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Klavišų susiejimas, kuriuo atveriamas rodinys „rodyti programas“" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Klavišų susiejimas, kuriuo atveriamas rodinys „rodyti programas“ veiklų " +"apžvalgoje." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Klavišų susiejimas, kuriuo atveriama apžvalga" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Klavišų susiejimas, kuriuo atveriama veiklų apžvalga." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Klavišų susiejimas pranešimų juostos matomumui perjungti" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Klavišų susiejimas pranešimų juostos matomumui perjungti." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Klavišų susiejimas, kuriuo fokusuojamas aktyvus pranešimas" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Klavišų susiejimas, kuriuo fokusuojamas aktyvus pranešimas." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Klavišų susiejimas, kuris sustabdo ir pratęsia visus veikiančius elementus, " +"derinimui" + +#: data/org.gnome.shell.gschema.xml.in:150 +#| msgid "Show Applications" +msgid "Switch to application 1" +msgstr "Pereiti į programą 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Pereiti į programą 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Pereiti į programą 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Pereiti į programą 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Pereiti į programą 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Pereiti į programą 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Pereiti į programą 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Pereiti į programą 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Pereiti į programą 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Kurią klaviatūrą naudoti" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Naudotinas klaviatūros tipas." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Apriboti perjungėją dabartine darbo sritimi." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Jei teigiama, perjungimo lange bus rodomos tik programos, turinčios langų " +"dabartinėje darbo srityje. Priešingu atveju įtraukiamos visos programos." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Programos piktogramos veiksena." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Nustato, kaip langai yra rodomi perjungimo lange. Galimi pasirinkimai yra " +"„thumbnail-only“ (rodo lango miniatiūrą), „app-icon-only“ (rodo tik " +"programos piktogramą) arba „both“ (abu)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Jei teigiama, perjungimo lange rodomi tik langai iš dabartinės darbo " +"srities. Priešingu atveju įtraukiami visi langai." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Prikabinti modalinį dialogą prie tėvinio lango" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Šis raktas perrašo org.gnome.mutter raktą, kai vykdoma GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Įjungti kraštų išplėtimą, kai langai numetami ekrano kraštuose" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Darbo sritys yra tvarkomos dinamiškai" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Darbo sritys tik pagrindiniame monitoriuje" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Atidėti fokuso pakeitimus pelei iki žymiklis nustos judėti" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Tinklo prisijungimas" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Atsitiko kažkas negero" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Atsiprašome, bet kilo problema: šio plėtinio nustatymų parodyti nepavyksta. " +"Rekomenduojame pranešti apie problemą plėtinio autoriams." + +#: js/extensionPrefs/main.js:130 +#| msgid "Show Details" +msgid "Technical Details" +msgstr "Techninė informacija" + +#: js/extensionPrefs/main.js:165 +#| msgid "Show Errors" +msgid "Copy Error" +msgstr "Kopijuoti klaidą" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Namų tinklalapis" + +#: js/extensionPrefs/main.js:186 +#| msgid "UUIDs of extensions to enable" +msgid "Visit extension homepage" +msgstr "Aplankyti plėtinio namų tinklalapį" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Nėra įdiegtų plėtinių" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Plėtinius galima įdiegti per Programinę įrangą arba extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Naršyti Programinėje įrangoje" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Atsisakyti" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Kitas" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Atrakinti" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Prisijungti" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Pasirinkite seansą" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Nėra sąraše?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(pvz., naudotojas arba %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Naudotojo vardas: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Prisijungimo langas" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Tapatybės patvirtinimo klaida" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(arba perbraukite pirštu)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Išjungti" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "išjungti;perleisti;perkrauti;" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Užrakinti ekraną" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "užrakinti ekraną" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Atsijungti" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "atsijungti" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Pristabdyti" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "pristabdyti;užmigdyti" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Keisti naudotoją" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "keisti naudotoją" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Užrakinti orientaciją" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "orientacijos užrakinimas;ekranas;pasukimas" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Komanda nerasta" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Nepavyko perskaityti komandos:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Nepavyko įvykdyti „%s“:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Ką tik" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Prieš %d minutę" +msgstr[1] "Prieš %d minutes" +msgstr[2] "Prieš %d minučių" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Prieš %d valandą" +msgstr[1] "Prieš %d valandas" +msgstr[2] "Prieš %d valandų" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Vakar" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Prieš %d dieną" +msgstr[1] "Prieš %d dienas" +msgstr[2] "Prieš %d dienų" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Prieš %d savaitę" +msgstr[1] "Prieš %d savaites" +msgstr[2] "Prieš %d savaičių" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Prieš %d mėnesį" +msgstr[1] "Prieš %d mėnesius" +msgstr[2] "Prieš %d mėnesių" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Prieš %d metus" +msgstr[1] "Prieš %d metus" +msgstr[2] "Prieš %d metų" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Vakar, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%B %-d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%Y %m %-d, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Vakar, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%B %-d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%Y %m %-d, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Prisijungimas prie prieigos taško" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Jūsų prisijungimas prie šio prieigos taško yra nesaugus. Slaptažodžius bei " +"kitą šiame puslapyje jūsų įvedamą informaciją gali matyti kiti asmenys." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Atmesti prieigą" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Suteikti prieigą" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Čia bus matomos dažnai naudojamos programos" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Dažnai naudojamos" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Visos" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Naujas langas" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Paleisti naudojant dedikuotą grafikos kortą" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Pašalinti iš mėgstamų" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Pridėti prie mėgstamų" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Rodyti detalią informaciją" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s pridėta prie jūsų mėgstamų." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s pašalinta iš jūsų mėgstamų." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Pasirinkite garso įrenginį" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Garso nustatymai" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Ausinės" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Ausinės su mikrofonu" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofonas" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Keisti foną…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Ekrano nustatymai" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Nustatymai" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "A" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "K" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "Š" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Ankstesnis mėnuo" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Kitas mėnuo" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Savaitė %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Visa diena" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %B %-d." + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %Y %B %-d." + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Nėra pranešimų" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Nėra įvykių" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Išvalyti" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "„%s“ neatsiliepia." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Galite dar palaukti ir duoti programai laiko arba galite priverstinai " +"išjungti programą." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Priverstinai išjungti" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Laukti" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Prijungta išorinė laikmena" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Atjungta išorinė laikmena" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Atverti su %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Slaptažodis:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Įveskite dar kartą:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Taip pat galite prisijungti paspausdami „WPS“ mygtuką savo maršrutizatoriuje." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Prisijungti" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Slaptažodis: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Raktas: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Privataus rakto slaptažodis: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Tapatybė: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Tarnyba: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Belaidžiam tinklui reikia patvirtinti tapatybę" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Slaptažodžiai arba šifravimo raktai yra būtini priėjimui prie belaidžio " +"tinklo „%s“." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Laidinis 802.1X tapatybės patvirtinimas" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Tinklo vardas: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL tapatybės patvirtinimas" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Reikalingas PIN kodas" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Reikalingas PIN kodas mobiliajam plačiajuosčiam įrenginiui" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mobiliojo plačiajuosčio tinklo slaptažodis" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Būtinas slaptažodis norint prisijungti prie „%s“." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Tinklo tvarkymas" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Reikia patvirtinti tapatybę" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administratorius" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Patvirtinti tapatybę" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Atsiprašome, tai nesuveikė. Bandykite dar kartą." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s nuo šiol vadinasi %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Langai" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Paleisti programas" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Paleidimo sritis" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%Y %B %-d." + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %Y m. %B %d d." + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Pridėti pasaulio laikrodžius…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Pasaulio laikrodžiai" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Orai" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Pasirinkite vietą…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Įkeliama…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Prisijunkite prie tinklo orų informacijai gauti" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Orų informacija šiuo metu yra neprieinama" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Atjungti naudotoją %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Atsijungti" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s bus automatiškai atjungta (-s) už %d sekundės." +msgstr[1] "%s bus automatiškai atjungta (-s) už %d sekundžių." +msgstr[2] "%s bus automatiškai atjungta (-s) už %d sekundžių." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Jūs būsite automatiškai atjungti už %d sekundės." +msgstr[1] "Jūs būsite automatiškai atjungti už %d sekundžių." +msgstr[2] "Jūs būsite automatiškai atjungti už %d sekundžių." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Atsijungti" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Išjungti" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Įdiegti atnaujinimus ir išjungti" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistema automatiškai išsijungs po %d sekundės." +msgstr[1] "Sistema automatiškai išsijungs po %d sekundžių." +msgstr[2] "Sistema automatiškai išsijungs po %d sekundžių." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Įdiegti programinės įrangos atnaujinimus" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Paleisti iš naujo" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Išjungti" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Paleisti iš naujo" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistema bus paleista iš naujo po %d sekundės." +msgstr[1] "Sistema bus paleista iš naujo po %d sekundžių." +msgstr[2] "Sistema bus paleista iš naujo po %d sekundžių." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Perleisti ir įdiegti atnaujinimus" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sistema bus paleista iš naujo ir įdiegs atnaujinimus po %d sekundės." +msgstr[1] "" +"Sistema bus paleista iš naujo ir įdiegs atnaujinimus po %d sekundžių." +msgstr[2] "" +"Sistema bus paleista iš naujo ir įdiegs atnaujinimus po %d sekundžių." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Perleisti ir įdiegti" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Įdiegti ir išjungti" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Išjungti baigus diegti atnaujinimus" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Perleisti ir įdiegti atnaujinimą" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s bus įdiegta po perleidimo. Sistemos atnaujinimas gali ilgai užtrukti: " +"įsitikinkite, kad pasidarėte atsarginę duomenų kopiją, ir kad kompiuteris " +"yra įjungtas į elektros tinklą." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Veikia naudojant baterijos energiją: įjunkite į elektros tinklą prieš " +"įdiegdami atnaujinimus." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Kai kurios programos dirba arba turi neįrašyto darbo." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Yra prisijungusių kitų naudotojų" + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (nutolęs)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (komandų eilutė)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Įdiegti" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Parsiųsti ir įdiegti „%s“ iš extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s nori talpinti trumpinius" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Programa nori talpinti trumpinius" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Galite atstatyti trumpinius paspaudę %s" + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Neleisti" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Leisti" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Lėtieji klavišai įjungti" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Lėtieji klavišai išjungti" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Ką tik palaikėte nuspaudę 8 sekundes Lyg2 klavišą. Tai yra lėtųjų klavišų " +"trumpinus, kuris keičia klaviatūros veikseną." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Kibieji klavišai įjungti" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Kibieji klavišai išjungti" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Ką tik paspaudėte Lyg2 klavišą 5 kartus iš eilės. Tai yra kibiųjų klavišų " +"trumpinys, kuris pakeičia klaviatūros veikseną." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Ką tik vienu metu paspaudėte du klavišus arba paspaudėte Lyg2 klavišą 5 " +"kartus iš eilės. Tai įjungia kibiuosius klavišus ir pakeičia klaviatūros " +"veikseną." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Palikti įjungtą" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Įjungti" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Išjungti" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Palikti išjungtą" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Regiono ir kalbos nustatymai" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Nėra įdiegtų plėtinių" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nepranešė apie jokias klaidas." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Slėpti klaidas" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Rodyti klaidas" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Įjungta" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Išjungta" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Klaida" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Pasenęs" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Atsiunčiama" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Žiūrėti šaltinį" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Tinklalapis" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Sistemos informacija" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Nežinomas atlikėjas" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Nežinomas pavadinimas" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Garsumas" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Atšaukti" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Apžvalga" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Rašykite, ko ieškote…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Naujas trumpinys…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Programos nustatytas" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Rodyti pagalbą ekrane" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Keisti monitorių" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Priskirti klavišų kombinaciją" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Atlikta" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Keisti…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nėra" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Spauskite mygtuką konfigūravimui" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Spauskit Esc išėjimui" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Išėjimui spauskite bet kurį klavišą" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Užverti" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Apžvalga" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "Viršutinė juosta" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Įveskite komandą" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Užverti" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Perleisti Wayland aplinkoje negalima" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Perleidžiama…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %B %d d." + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d naujas pranešimas" +msgstr[1] "%d nauji pranešimai" +msgstr[2] "%d naujų pranešimų" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d naujas pranešimas" +msgstr[1] "%d nauji pranešimai" +msgstr[2] "%d naujų pranešimų" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Užrakinti" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME aplinkai reikia užrakinti ekraną" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Nepavyksta užrakinti" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Programa užblokavo užrakinimą" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Ieškoma…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Nerasta atitikmenų." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "dar %d" +msgstr[1] "dar %d" +msgstr[2] "dar %d" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopijuoti" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Įdėti" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Rodyti tekstą" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Slėpti tekstą" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Slaptažodis" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Atsiminti slaptažodį" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Universali prieiga" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Priartinimas" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Ekrano skaityklė" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Klaviatūra ekrane" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Vaizdo įspėjimai" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Kibieji klavišai" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Lėtieji klavišai" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Pasikartojantieji klavišai" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Pelės mygtukai" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Didelis kontrastas" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Didelis tekstas" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth nustatymai" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d prijungtas" +msgstr[1] "%d prijungti" +msgstr[2] "%d prijungta" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Išjungta" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Įjungta" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Ryškumas" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Klaviatūra" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Rodyti klaviatūros išdėstymą" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Vietos nustatymas įjungtas" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Išjungti" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Privatumo nustatymai" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Vietos nustatymas naudojamas" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Vietos nustatymas išjungtas" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Įjungti" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Suteikti %s prieigą prie jūsų būvimo vietos?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Prieigą prie vietos bet kada galima pakeisti privatumo nustatymuose." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s išjungtas" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "Prisijungta prie %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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s netvarkomas" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Atsijungiama nuo %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "Jungiamasi prie %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:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s reikalauja patvirtinti tapatybę" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s trūksta integruotos programinės įrangos" + +#. 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nepasiekiamas" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Nepavyko prisijungti prie %s" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Laidinio ryšio nustatymai" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Mobiliojo plačiajuosčio tinklo nustatymai" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s aparatinė įranga išjungta" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s išjungtas" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Prisijungti prie interneto" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Skrydžio veiksena įjungta" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Belaidis ryšys yra išjungta skrydžio veiksenoje." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Išjungti skrydžio veikseną" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Belaidžio ryšys išjungtas" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Norint prisijungti prie tinklo reikia įjungti belaidį ryšį." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Įjungti belaidį ryšį" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi tinklai" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Pasirinkite tinklą" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Nėra tinklų" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Išjungimui naudoti aparatinį jungiklį" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Pasirinkite tinklą" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Belaidžio ryšio nustatymai" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Prieigos taškas %s aktyvus" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "Neprisijungta prie %s" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "jungiamasi…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "reikia patvirtinti tapatybę" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "nepavyko prisijungti" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "VPN nustatymai" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN išjungtas" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Tinklo nustatymai" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s laidinis ryšys" +msgstr[1] "%s laidiniai ryšiai" +msgstr[2] "%s laidinių ryšių" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s belaidis ryšys" +msgstr[1] "%s belaidžiai ryšiai" +msgstr[2] "%s belaidžių ryšių" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemo ryšys" +msgstr[1] "%s modemo ryšiai" +msgstr[2] "%s modemo ryšių" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "Nepavyko prisijungti" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "Tinklo ryšio nepavyko aktyvuoti" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Naktinis apšvietimas išjungtas" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Naktinis apšvietimas įjungtas" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Tęsti" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Išjungti iki rytojaus" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Energijos valdymo nustatymai" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Pilnai įkrauta" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Nekraunama" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Įvertinama…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Liko %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d iki pilno (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Ekranas yra bendrinamas" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Išjungti" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Skrydžio veiksena įjungta" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Keisti naudotoją" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Atsijungti" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Paskyros nustatymai" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Padėties užrakinimas" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Pristabdyti" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Išjungti" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Nežinoma Thunderbolt įrenginys" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Jums nesant aptiktas naujas įrenginys. Atjunkite ir vėl prijunkite įrenginį, " +"jei norite jį naudoti." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Neleidžiamas Thunderbolt įrenginys" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Buvo aptiktas naujas įrenginys, kurį turi leisti administratorius." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt autorizacijos klaida" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nepavyko autorizuoti Thunderbolt įrenginio: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Garsumas pakeistas" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Veidrodis" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Sujungti vaizduoklius" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Tik išorinis" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Tik vidinis" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Prisijungti kitu naudotoju" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Atrakinimo langas" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Programos" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Ieškoti" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "„%s“ yra pasirengusi" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Ar norite įrašyti šiuos vaizduoklio nustatymus?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Grąžinti nustatymus" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Įrašyti pakeitimus" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Pakeitimai bus grąžinti po %d sekundės" +msgstr[1] "Pakeitimai bus grąžinti po %d sekundžių" +msgstr[2] "Pakeitimai bus grąžinti po %d sekundžių" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Sumažinti" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Grąžinti iš išdidinimo" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Išdidinti" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Perkelti" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Keisti dydį" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Perkelti pavadinimo juostą į ekraną" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Visada viršuje" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Visada matomoje darbo srityje" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Perkelti į kairiau esančią darbo sritį" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Perkelti į dešiniau esančią darbo sritį" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Perkelti į aukščiau esančią darbo sritį" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Perkelti į žemiau esančią darbo sritį" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Perkelti į aukščiau esantį monitorių" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Perkelti į žemiau esantį monitorių" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Perkelti į kairiau esantį monitorių" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Perkelti į dešiniau esantį monitorių" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution kalendorius" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Išvesti versijos numerį" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Veiksena, naudojama GDM prisijungimo ekrane" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Naudoti konkrečią veikseną, pvz., „gdm“ prisijungimo ekranui" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Išvardinti galimas veiksenas" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Nežinoma" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Nepavyko paleisti „%s“" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Slaptažodžiai nesutampa." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Slaptažodis negali būti tuščias" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u išvestis" +msgstr[1] "%u išvestys" +msgstr[2] "%u išvesčių" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u įvestis" +msgstr[1] "%u įvestys" +msgstr[2] "%u įvesčių" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Sistemos garsai" + +#~ msgid "%s all day." +#~ msgstr "%s visą dieną." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, o vėliau %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, tuomet %s, o po to vėliau %s." + +#~ msgid "Feels like %s." +#~ msgstr "Jaučiama kaip %s." + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Kilo klaida įkeliant %s nuostatų dialogą:" + +#~| msgid "Power Off" +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Išjungti" + +#~| msgid "Log Out" +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Atsijungti" + +#~| msgid "Switch User" +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Keisti naudotoją" + +#~ msgid "Hide tray" +#~ msgstr "Slėpti dėklą" + +#~ msgid "Status Icons" +#~ msgstr "Būsenos piktogramos" + +#~ msgid "Events" +#~ msgstr "Įvykiai" + +#~ msgid "Notifications" +#~ msgstr "Pranešimai" + +#~ msgid "Clear section" +#~ msgstr "Išvalyti skiltį" + +#~ msgid "Media" +#~ msgstr "Medija" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Shell plėtinių nuostatos" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Reikia patvirtinti tapatybę internete" + +#~ msgid "Not In Use" +#~ msgstr "Naudojamas" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Rodyti savaitės dienas kalendoriuje" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Jeigu reikšmė teigiama, kalendoriuje rodyti ISO savaičių datą." + +#~ msgid "Use as Internet connection" +#~ msgstr "Naudoti kaip interneto ryšį" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s prašo prieigos prie jūsų buvimo vietos." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (wayland kompozitorius)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d prijungtas įrenginys" +#~ msgstr[1] "%d prijungti įrenginiai" +#~ msgstr[2] "%d prijungtų įrenginių" + +#~ msgid "Authentication required" +#~ msgstr "Reikia patvirtinti tapatybę" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Baterija" + +#~ msgid "Airplane Mode" +#~ msgstr "Skrydžio veiksena" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l:%M" + +#~ msgid "Invitation" +#~ msgstr "Kvietimas" + +#~ msgid "Call" +#~ msgstr "Skambutis" + +#~ msgid "File Transfer" +#~ msgstr "Failo persiuntimas" + +#~ msgid "Chat" +#~ msgstr "Pokalbiai" + +#~ msgid "Invitation to %s" +#~ msgstr "Kvietimas į %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s jus kviečia prisijungti prie %s" + +#~ msgid "Decline" +#~ msgstr "Atmesti" + +#~ msgid "Accept" +#~ msgstr "Priimti" + +#~ msgid "Video call from %s" +#~ msgstr "Vaizdo skambutis nuo %s" + +#~ msgid "Call from %s" +#~ msgstr "Skambutis nuo %s" + +#~ msgid "Answer" +#~ msgstr "Atsiliepti" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s jums siunčia %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s pageidauja matyti, kai esate prisijungę prie interneto" + +#~ msgid "Authentication failed" +#~ msgstr "Nepavyko patvirtinti tapatybės" + +#~ msgid "Encryption error" +#~ msgstr "Šifravimo klaida" + +#~ msgid "Certificate not provided" +#~ msgstr "Liudijimas nepateiktas" + +#~ msgid "Certificate untrusted" +#~ msgstr "Liudijimas nepatikimas" + +#~ msgid "Certificate expired" +#~ msgstr "Liudijimo galiojimas pasibaigęs" + +#~ msgid "Certificate not activated" +#~ msgstr "Liudijimas neaktyvuotas" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Liudijimo serverio vardo nesutapimas" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Liudijimo piršto atspaudo nesutapimas" + +#~ msgid "Certificate self-signed" +#~ msgstr "Liudijimas pačių pasirašytas" + +#~ msgid "Status is set to offline" +#~ msgstr "Nustatyta atsijungimo būsena" + +#~ msgid "Certificate is invalid" +#~ msgstr "Liudijimas netinkamas" + +#~ msgid "Connection has been refused" +#~ msgstr "Ryšys atmestas" + +#~ msgid "Connection can't be established" +#~ msgstr "Nepavyko užmegzti ryšio" + +#~ msgid "Connection has been lost" +#~ msgstr "Ryšys nutrūko" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Ši paskyra jau prijungta prie serverio" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Ryšys pakeistas nauju ryšiu naudojant tą patį išteklių" + +#~ msgid "The account already exists on the server" +#~ msgstr "Tokia paskyra serveryje jau yra" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Šiuo metu serveris per daug užimtas šiai užklausai apdoroti" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Liudijimas atšauktas" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Liudijimui naudojamas nesaugus šifravimo algoritmas arba jis " +#~ "kriptografiškai silpnas" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Serverio liudijimo ilgis arba liudijimų eilės dydis viršija " +#~ "kriptografijos bibliotekos apribojimus" + +#~ msgid "Internal error" +#~ msgstr "Vidinė klaida" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Nepavyksta prisijungti prie %s" + +#~ msgid "View account" +#~ msgstr "Rodyti paskyrą" + +#~| msgid "Show the message tray" +#~ msgid "Show the message list" +#~ msgstr "Rodyti pranešimų sąrašą" + +#~ msgid "Captive Portal" +#~ msgstr "Pagavimo portalas" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Sk" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Pr" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "An" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Tr" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Kt" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Pn" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Št" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nieko nesuplanuota" + +#~ msgid "Today" +#~ msgstr "Šiandien" + +#~ msgid "Tomorrow" +#~ msgstr "Rytoj" + +#~ msgid "This week" +#~ msgstr "Šią savaitę" + +#~ msgid "Next week" +#~ msgstr "Kitą savaitę" + +#~ msgid "Removable Devices" +#~ msgstr "Išimami įrenginiai" + +#~ msgid "Eject" +#~ msgstr "Išimti" + +#~ msgid "Unmute" +#~ msgstr "Įjungti garsą" + +#~ msgid "Mute" +#~ msgstr "Nutildyti" + +#~ msgid "Open Calendar" +#~ msgstr "Atverti kalendorių" + +#~ msgid "Open" +#~ msgstr "Atverti" + +#~ msgid "Remove" +#~ msgstr "Pašalinti" + +#~ msgid "Clear Messages" +#~ msgstr "Išvalyti pranešimus" + +#~ msgid "Notification Settings" +#~ msgstr "Pranešimų nustatymai" + +#~ msgid "Tray Menu" +#~ msgstr "Dėklo meniu" + +#~ msgid "No Messages" +#~ msgstr "Nėra pranešimų" + +#~ msgid "Message Tray" +#~ msgstr "Pranešimų juosta" diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..6dda49a --- /dev/null +++ b/po/lv.po @@ -0,0 +1,2341 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# +# Rudolfs , 2011. +# Rūdofls Mazurs , 2011, 2012, 2013, 2014. +# Pēteris Krišjānis , 2011. +# Rūdolfs Mazurs , 2014, 2015, 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-02 10:57+0000\n" +"PO-Revision-Date: 2019-03-03 16:17+0200\n" +"Last-Translator: Rūdolfs Mazurs \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :" +" 2);\n" +"X-Generator: Lokalize 2.0\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistēma" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Rādīt paziņojumu sarakstu" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokusēt aktīvo paziņojumu" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Rādīt pārskatu" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Rādīt visas lietotnes" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Atvērt lietotnes izvēlni" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Čaulas paplašinājumi" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Konfigurēt GNOME Shell paplašinājumus" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME čaula" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Logu pārvaldība un lietotņu palaišana" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Aktivēt iekšējos rīkus, kas pieejami no Alt-F2; noder izstrādātājiem un " +"testētājiem" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Ļauj piekļūt iekšējiem atkļūdošanas un pārraudzības rīkiem, izmantojot Alt-" +"F2 dialoglodziņu." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID paplašinājumiem, kurus aktivēt" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell paplašinājumiem ir UUID īpašība; šī atslēga uzskaita " +"paplašinājumus, kurus vajadzētu ielādēt. Katram paplašinājumam, kas grib " +"tikt ielādēts, jābūt šajā sarakstā. Šo sarakstu var mainīt arī ar " +"EnableExtension un DisableExtension D-Bus metodēm uz org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Izslēgt lietotāju paplašinājumus" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Izslēgt visus paplašinājumus, ko ir ieslēdzis lietotājs, neietekmējot " +"iestatījumu “enabled-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Deaktivē paplašinājumu versijas savietojamības pārbaudīšanu" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME čaula ielādēs tikai tos paplašinājumus, kuri apgalvos, ka atbalsta " +"pašlaik palaisto versiju. Šīs opcijas aktivēšana deaktivēs šo pārbaudi un " +"mēģinās ielādēt visus paplašinājumus, neatkarīgi no tā, kādu čaulas versiju " +"tie atbalsta." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Uzskaitīt iecienīto lietotņu darbvirsmas datņu ID" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Lietotnes, kas atbilst šiem identifikatoriem, tiks rādītas izlases laukā." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Lietotņu izvēles skats" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Pašlaik izvēlētā skata rādītājs lietotņu izvēlē." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Komandu (Alt-F2) dialoglodziņa vēsture" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Looking glass dialoglodziņa vēsture" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Lietotāja izvēlnē vienmēr rādīt izvēlnes vienumu “Izrakstīties”." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Šī atslēga pārraksta automātisko “Izrakstīties” izvēlnes vienuma slēpšanu " +"situācijās, kad ir tikai viens lietotājs vai viena sesija." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "Vai atcerēties paroli šifrētu vai attālinātu datņu sistēmu montēšanai" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Čaula prasīs paroli, kad tiks montēta šifrēta ierīce vai attālināta datņu " +"sistēma. Ja paroli var saglabāt turpmākai lietošanai, būs redzama izvēles " +"rūtiņa “Atcerēties paroli”. Šī atslēga iestata šīs izvēles rūtiņas " +"noklusējuma stāvokli." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Vai noklusējuma Bluetooth adapterim ir iestatītas ar to asociētās ierīces" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Čaula rādīs Bluetooth izvēlnes vienumu tikai tad, ja Bluetooth adapteris ir " +"ieslēgts vai ja ir iestatītas ierīces, kas ir saistītas ar noklusējuma " +"adapteri. Tas tiks atiestatīts, ja noklusējuma adapteris jebkad tiks redzēts " +"bez saistītajām ierīcēm." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Ieslēgt introspekcijas API" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "Ieslēdz D-Bus API, kas ļauj izpētīt lietotnes stāvokli." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Taustiņu sasaiste, kas atver lietotnes izvēlni" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Taustiņu sasaiste, kas atver lietotnes izvēlni." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Taustiņu sasaiste, kas atver “Rādīt lietotnes” skatu" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Taustiņu sasaiste, kas atver “Rādīt lietotnes” aktivitāšu pārskata skatu." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Taustiņu sasaiste, kas atver pārskatu" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Taustiņu sasaiste, kas atver aktivitāšu pārskatu." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Taustiņu sasaiste, kas pārslēdz paziņojumu saraksta redzamību" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Taustiņu sasaiste, kas pārslēdz paziņojumu saraksta redzamību." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Taustiņu sasaiste, kas fokusē aktīvo paziņojumu" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Taustiņu sasaiste, kas fokusē aktīvo paziņojumu." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Taustiņu sasaiste, kas pauzē un turpina visus tvīnus (tweens) atkļūdošanas " +"nolūkiem" + +#: data/org.gnome.shell.gschema.xml.in:150 +#| msgid "Show Applications" +msgid "Switch to application 1" +msgstr "Pārslēgties uz lietotni 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Pārslēgties uz lietotni 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Pārslēgties uz lietotni 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Pārslēgties uz lietotni 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Pārslēgties uz lietotni 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Pārslēgties uz lietotni 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Pārslēgties uz lietotni 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Pārslēgties uz lietotni 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Pārslēgties uz lietotni 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Kuru tastatūru izmantot" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Izmantojamās tastatūras tips." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Ierobežot pārslēdzēju uz pašreizējo darbvietu." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ja patiess, pārslēdzējā tiek rādītas tikai lietotnes, kas ir pašreizējā " +"darbvietā. Citādi tiek iekļautas visas lietotnes." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Lietotnes ikonas režīms." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Konfigurē, kā pārslēdzējā tiek parādīts logs. Derīgās iespējas ir “thumbnail-" +"only” (rāda loga sīktēlu), “app-icon-only” (rāda tikai lietotnes ikonu) vai " +"“both” (abi)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ja patiess, pārslēdzējā tiek rādītas tikai lietotnes no pašreizējās " +"darbvietas. Citādi tiek iekļautas visas lietotnes." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Pievienot modālo dialoglodziņu vecāka logam" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Šī atslēga pārraksta org.gnome.mutter atslēgu, darbinot GNOME čaulu." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Aktivēt logu sānisko izklāšanu, kad to nomet uz ekrāna malas" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Darbvietas tiek pārvaldītas dinamiski" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Darbvietas tikai uz galvenā monitora" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Peles režīmā aizkavēt fokusa izmaiņas, līdz rādītājs pārstāj kustēties" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Tīkla ierakstīšanās" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Kaut kas nogāja greizi" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Mums ir ļoti žēl, bet gadījās problēma: nevar parādīt šī paplašinājuma" +" iestatījumus. Mēs iesakām jums ziņot par šo problēmu paplašinājuma autoriem." + +#: js/extensionPrefs/main.js:130 +#| msgid "Show Details" +msgid "Technical Details" +msgstr "Tehniskā informācija" + +#: js/extensionPrefs/main.js:165 +#| msgid "Show Errors" +msgid "Copy Error" +msgstr "Kopēšanas kļūda" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Mājaslapa" + +#: js/extensionPrefs/main.js:186 +#| msgid "UUIDs of extensions to enable" +msgid "Visit extension homepage" +msgstr "Apmeklēt paplašinājum mājaslapu" + +#: js/extensionPrefs/main.js:449 +#| msgid "No extensions installed" +msgid "No Extensions Installed" +msgstr "Nav instalētu paplašinājumu" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Paplašinājumus var instalēt ar lietotni “Programma” vai extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Pārlūkot “Programmatūrā”" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Atcelt" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Nākamais" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Atbloķēt" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Ierakstīties" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Izvēlieties sesiju" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Nav sarakstā?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(piemēram, lietotājs vai %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Lietotājvārds: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Ierakstīšanās logs" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Autentifikācijas kļūda" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(vai velciet pirkstu)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Izslēgt" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "izslēgt;beidzēt;pārstartēt;restartēt" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Bloķēt ekrānu" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "bloķēt ekrānu" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Izrakstīties" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "izrakstīties;atteikties;izsaiņoties;logautoties" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Iesnaudināt" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "iesnaudināt;suspendot;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Mainīt lietotāju" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "mainīt lietotāju" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Noslēgt orientāciju" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "noslēgt orientāciju;ekrāns;rotācija;pagriešana" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Komanda nav atrasta" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Neizdevās apstrādāt komandu:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” izpilde neizdevās:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Tikko" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Pirms %d minūtes" +msgstr[1] "Pirms %d minūtēm" +msgstr[2] "Pirms %d minūtēm" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Pirms %d stundas" +msgstr[1] "Pirms %d stundām" +msgstr[2] "Pirms %d stundām" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Vakar" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pirms %d dienas" +msgstr[1] "Pirms %d dienām" +msgstr[2] "Pirms %d dienām" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pirms %d nedēļas" +msgstr[1] "Pirms %d nedēļām" +msgstr[2] "Pirms %d nedēļām" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Pirms %d mēneša" +msgstr[1] "Pirms %d mēnešiem" +msgstr[2] "Pirms %d mēnešiem" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Pirms %d gada" +msgstr[1] "Pirms %d gadiem" +msgstr[2] "Pirms %d gadiem" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H.%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Vakar, %H.%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H.%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +#| msgid "%B %d, %H∶%M" +msgid "%B %-d, %H∶%M" +msgstr "%-d. %B, %H.%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +#| msgid "%B %d %Y, %H∶%M" +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d. %B, %Y., %H.%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l.%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Vakar, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l.%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +#| msgid "%B %d, %l∶%M %p" +msgid "%B %-d, %l∶%M %p" +msgstr "%-d. %B, %l.%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +#| msgid "%B %d %Y, %l∶%M %p" +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d. %B, %Y., %l.%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Tīklāja ierakstīšanās" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Jūsu savienojums ar šo tīklāju nav drošs. Paroles un cita informācija, ko " +"jūs ievadāt šajā lapā var būt redzama tuvumā esošiem cilvēkiem." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Liegt pieeju" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Piešķirt pieeju" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Šeit parādīsies biežāk izmantotās lietotnes" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Biežāk izmantotās" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Visas" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Jauns logs" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Palaist, izmantojot atvēlēto grafikas karti" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Izņemt no izlases" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Pievienot izlasei" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Rādīt sīkāku informāciju" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ir pievienots izlasei." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s ir izņemts no izlases." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Izvēlieties audio ierīci" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Skaņas Iestatījumi" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Austiņas" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Austiņas ar mikrofonu" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofons" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Mainīt fonu…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Displeja iestatījumi" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Iestatījumi" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "Sv" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "Pr" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "Ot" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "Tr" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "Ce" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "Pk" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "Se" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y." + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Iepriekšējais mēnesis" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Nākamais mēnesis" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Nedēļa %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Visu dienu" + +#: js/ui/calendar.js:819 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d. %B" + +#: js/ui/calendar.js:823 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d, %Y" +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d. %B, %Y." + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Nav paziņojumu" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Nav notikumu" + +#: js/ui/calendar.js:1075 +#| msgid "Clear All" +msgid "Clear" +msgstr "Attīrīt" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” nereaģē." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Var uzgaidīt neilgu brīdi, līdz lietotne atgūstas, vai arī aizvērt to " +"piespiedu kārtā." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Piespiedu apturēšana" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Gaidīt" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Pievienots ārējs dzinis" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Atvienots ārējs dzinis" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Atvērt ar %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Parole:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Ierakstiet vēlreiz:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "Varat arī savienoties, uz sava maršrutētāja spiežot pogu “WPS”." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Savienot" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Parole: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Atslēga: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Privātās atslēgas parole: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identitāte: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Serviss: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Bezvadu tīkls pieprasa autentifikāciju" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Lai piekļūtu bezvadu tīklam “%s”, ir nepieciešamas paroles vai šifrēšanas " +"atslēgas." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Vadu 802.1X autentifikācija" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Tīkla nosaukums: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL autentifikācija" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Nepieciešams PIN kods" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Mobilā platjoslas tīkla ierīcei ir vajadzīgs PIN kods" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mobilās platjoslas tīkla parole" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Lai savienotos ar “%s”, ir nepieciešama parole." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Tīkla pārvaldnieks" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Nepieciešama autentifikācija" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrators" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Autentificēt" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Diemžēl tas nenostrādāja. Lūdzu, mēģiniet vēlreiz." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s tagad zināms kā %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Logi" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Rādīt lietotnes" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Panelis" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +#| msgid "%B %e %Y" +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %e. %B, %Y." + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Pievienot pasaules pulksteņus…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Pasaules pulksteņi" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Laikapstākļi" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Izvēlieties vietu…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Ielādē…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Laika ziņas skatīt tiešsaistē" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Laika ziņas pašlaik nav pieejamas" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Izrakstīt %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Izrakstīties" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s tiks automātiski izrakstīts no sesijas pēc %d sekundes." +msgstr[1] "%s tiks automātiski izrakstīts no sesijas pēc %d sekundēm." +msgstr[2] "%s tiks automātiski izrakstīts no sesijas pēc %d sekundēm." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Jūs tiksiet automātiski izrakstīts no sesijas pēc %d sekundes." +msgstr[1] "Jūs tiksiet automātiski izrakstīts no sesijas pēc %d sekundēm." +msgstr[2] "Jūs tiksiet automātiski izrakstīts no sesijas pēc %d sekundēm." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Izrakstīties" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Izslēgt" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalēt atjauninājumus un izslēgt" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistēma tiks izslēgta automātiski pēc %d sekundes." +msgstr[1] "Sistēma tiks izslēgta automātiski pēc %d sekundēm." +msgstr[2] "Sistēma tiks izslēgta automātiski pēc %d sekundēm." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalēt sagatavotos programmatūras atjauninājumus" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Pārstartēt" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Izslēgt" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Pārstartēt" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistēma tiks automātiski pārstartēta pēc %d sekundes." +msgstr[1] "Sistēma tiks automātiski pārstartēta pēc %d sekundēm." +msgstr[2] "Sistēma tiks automātiski pārstartēta pēc %d sekundēm." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Pārstartēt un instalēt atjauninājumus" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sistēma tiks automātiski pārstartēta un instalēs atjauninājumus pēc %d " +"sekundes." +msgstr[1] "" +"Sistēma tiks automātiski pārstartēta un instalēs atjauninājumus pēc %d " +"sekundēm." +msgstr[2] "" +"Sistēma tiks automātiski pārstartēta un instalēs atjauninājumus pēc %d " +"sekundēm." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Pārstartēt un instalēt" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalēt un izslēgt" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Izslēgt pēc atjauninājumu instalēšanas" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Pārstartēt un instalēt uzlabojumus" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"Pēc pārstartēšanas tiks instalēts %s %s. Uzlabošana var aizņemt daudz laika: " +"pārliecinieties, ka esat izveidojši rezerves kopijas un ka dators ir " +"pievienots strāvai." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Izmanto baterijas enerģiju — lūdzu pieslēdziet elektrībai, pirms instalējat " +"atjauninājumus." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Dažas lietotnes ir aizņemtas vai ir nesaglabāts darbs." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Citi lietotāji ir ierakstījušies." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (attālināts)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsole)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Instalēt" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Lejupielādēt un instalēt “%s” no extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vēlas nomākt saīsnes" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Lietotne vēlas nomākt saīsnes" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Varat atjaunot saīsnes, nospiežot %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Liegt" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Atļaut" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Lēnie taustiņi ieslēgti" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Lēnie taustiņi izslēgti" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Jūs nupat noturējāt Shift taustiņu piespiestu vairāk kā 8 sekundes. Tā ir " +"tastatūras lēno taustiņu funkcijas saīsne, kas ietekmē to, kā darbojas jūsu " +"tastatūra." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Lipīgie taustiņi ieslēgti" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Lipīgie taustiņi izslēgti" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Jūs tikko piespiedāt Shift taustiņu 5 reizes pēc kārtas. Tā ir tastatūras " +"Lipīgo taustiņu funkcijas saīsne, kas ietekmē to kā darbojas jūsu tastatūra." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Jūs tikko vienlaicīgi piespiedāt divus taustiņus vai Shift taustiņu 5 reizes " +"pēc kārtas. Tas atslēdz tastatūras lipīgo taustiņu funkciju, kas ietekmē to " +"kā darbojas jūsu tastatūra." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Atstāt ieslēgtu" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Ieslēgt" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Izslēgt" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Atstāt izslēgtu" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Vietas un valodas iestatījumi" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Nav instalētu paplašinājumu" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nav izdevis nevienu kļūdu." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Slēpt kļūdas" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Rādīt kļūdas" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Aktivēta" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Deaktivēta" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Kļūda" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Nav aktuāls" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Lejupielādē" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Skatīt avotu" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Tīmekļa lapa" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Sistēmas informācija" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Nezināms izpildītājs" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Nezināms nosaukums" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Skaļums" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Atsaukt" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Pārskats" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Rakstiet, lai meklētu…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Jauna saīsne…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Definētā lietotne" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Rādīt palīdzību uz ekrāna" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Pārslēgt monitoru" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Piešķirt taustiņsitienu" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Gatavs" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Rediģēt…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nekas" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Spiediet pogu, lai konfigurētu" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Spiediet ESC, lai izietu" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Spiediet jebkuru taustiņu, lai izietu" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Iziet" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Aktivitātes" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistēma" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Augšējā josla" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Ievadiet komandu" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Aizvērt" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Uz Wayland pārstartēšana nav pieejama" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Pārstartē…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d jauns ziņojums" +msgstr[1] "%d jauni ziņojumi" +msgstr[2] "%d jaunu ziņojumu" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d jauns paziņojums" +msgstr[1] "%d jauni paziņojumi" +msgstr[2] "%d jaunu paziņojumu" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Bloķēt" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME vajag bloķēt ekrānu" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Nevar bloķēt" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Lietotne neļāva bloķēt" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Meklē…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Nav rezultātu." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d vairāk" +msgstr[1] "%d vairāk" +msgstr[2] "%d vairāk" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopēt" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Ielīmēt" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Rādīt tekstu" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Slēpt tekstu" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Parole" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Atcerēties paroli" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Pieejamība" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Palielinājums" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Ekrāna lasītājs" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Ekrāna tastatūra" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Vizuālie brīdinājumi" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Lipīgie taustiņi" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Lēnie taustiņi" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Atlecošie taustiņi" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Peles taustiņi" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Augsts kontrasts" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Liels teksts" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth iestatījumi" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d savienots" +msgstr[1] "%d savienoti" +msgstr[2] "%d savienotu" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Izslēgts" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Ieslēgts" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Gaišums" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Tastatūra" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Rādīt tastatūras izkārtojumu" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Atrašanās vieta ieslēgta" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Izslēgt" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Privātuma iestatījumi" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Atrašanās vieta tiek izmantota" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Atrašanās vieta ir izslēgta" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Ieslēgt" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Dot %s pieeju jūsu atrašanās vietai?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Pieeju atrašanās vietai var mainīt jebkurā brīdī privātuma iestatījumos." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s ir izslēgta" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s ir savienots" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s nav pārvaldīts" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s atvienojas" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s savienojas" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s pieprasa autentificēšanos" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s trūkst aparātprogrammatūras" + +#. 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nav pieejams" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s neizdevās savienoties" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Vadu tīkla iestatījumi" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Mobilās platjoslas iestatījumi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s ir izslēgts aparatūrā" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s ir izslēgts" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Savienoties ar internetu" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Lidmašīnas režīms ir ieslēgts" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi tiek izslēgts, kad ir ieslēgts lidmašīnas režīms." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Izslēgt lidmašīnas režīmu" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi ir izslēgts" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Lai savienotos ar tīklu, jāieslēdz Wi-Fi." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Ieslēgt Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Bezvadu tīkli" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Izvēlieties tīklu" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Nav tīklu" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Lai izslēgtu, izmantot aparatūras slēdzi" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Izvēlieties tīklu" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi iestatījumi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s tīklājs ir aktīvs" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nav savienots" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "savienojas…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "nepieciešama autentifikācija" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "savienojums neizdevās" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPN iestatījumi" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN ir izslēgts" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Tīkla iestatījumi" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s vadu savienojums" +msgstr[1] "%s vadu savienojumi" +msgstr[2] "%s vadu savienojumu" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi savienojums" +msgstr[1] "%s Wi-Fi savienojumi" +msgstr[2] "%s Wi-Fi savienojumu" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modema savienojums" +msgstr[1] "%s modema savienojumi" +msgstr[2] "%s modema savienojumu" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Neizdevās savienoties" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Neizdevās tīkla savienojuma aktivēšana" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Nakts gaisma ir izslēgta" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Nakts gaisma ir ieslēgta" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Turpināt" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Izslēgt līdz rītdienai" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Barošanas iestatījumi" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Pilnībā uzlādēta" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Nelādējas" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Novērtē…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Atlicis %d.%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Līdz pilnai %d.%02d (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Ekrāns tiek koplietots" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Izslēgt" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Lidmašīnas režīms ir ieslēgts" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Mainīt lietotāju" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Izrakstīties" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Konta iestatījumi" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Orientācijas slēdzis" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Iesnaudināt" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Izslēgt" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Nezināma Thunderbolt ierīce" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Kamēr nebijāt klāt, tika atklāta jauna ierīce. Lūdzu, atvienojiet un no " +"jauna pievienojiet to ierīci, lai sāktu to izmantot." + +#: js/ui/status/thunderbolt.js:326 +#| msgid "Unknown Thunderbolt device" +msgid "Unauthorized Thunderbolt device" +msgstr "Nepilnvarota Thunderbolt ierīce" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Ir atklāta jauna ierīce un to administratoram tā ir jāpilnvaro." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt pilnvarošanas kļūda" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nevarēja autorizēt Thunderbolt ierīci: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Skaļums ir mainīts" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Dublēt" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Savienot displejus" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Tikai ārējais" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Tikai iebūvētais" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Ierakstīties kā citam lietotājam" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Atbloķēšanas logs" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Lietotnes" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Meklēt" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” ir gatavs" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Vai vēlaties paturēt šos displeja iestatījumus?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Atjaunot iestatījumus" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Paturēt izmaiņas" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Izmaiņas tiks atgrieztas pēc %d sekundes" +msgstr[1] "Izmaiņas tiks atgrieztas pēc %d sekundēm" +msgstr[2] "Izmaiņas tiks atgrieztas pēc %d sekundēm" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimizēt" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Atjaunot" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maksimizēt" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Pārvietot" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Mainīt izmēru" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Pārvietot virsraksta joslu uz ekrāna" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Vienmēr virspusē" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Vienmēr redzamajā darbvietā" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Pārvietot uz darbvietu pa kreisi" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Pārvietot uz darbvietu pa labi" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Pārvietot uz augstāku darbvietu" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Pārvietot uz zemāku darbvietu" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Pārvietot uz augstāku monitoru" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Pārvietot uz zemāku monitoru" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Pārvietot uz monitoru pa kreisi" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Pārvietot uz monitoru pa labi" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution kalendārs" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Drukāt versiju" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Režīms, ko izmantot GDM ierakstīšanās ekrānam" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Izmantot specifisku metodi, piemēram, “gdm” ierakstīšanās ekrānam" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Uzskaitīt iespējamos režīmus" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Nezināma" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Neizdevās palaist “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Paroles nesakrīt." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Parole nevar būt tukša" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Lietotājs noraidīja autentifikācijas dialoglodziņu" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u izvadkanāls" +msgstr[1] "%u izvadkanāli" +msgstr[2] "%u izvadkanāli" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ievadkanāls" +msgstr[1] "%u ievadkanāli" +msgstr[2] "%u ievadkanāli" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Sistēmas skaņas" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Ielādējot %s iestatījumu dialogu, gadījās kļūda:" + +#~ msgid "%s all day." +#~ msgstr "%s visu dienu." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, pēc tam %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, pēc tam %s, vēl pēc tam %s." + +#~ msgid "Feels like %s." +#~ msgstr "Komforta temperatūra %s." diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000..e9b77d7 --- /dev/null +++ b/po/meson.build @@ -0,0 +1 @@ +i18n.gettext(meson.project_name(), preset: 'glib') diff --git a/po/mk.po b/po/mk.po new file mode 100644 index 0000000..2f95cdd --- /dev/null +++ b/po/mk.po @@ -0,0 +1,1640 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: 3.4\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-12-08 16:50+0000\n" +"PO-Revision-Date: 2011-12-08 22:37+0100\n" +"Last-Translator: Jovan N\n" +"Language-Team: mk_MK \n" +"Language: mk\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%10==1 ? 0 : 1;\n" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Менаџмент на прозорци и пуштање на апликации" + +#: ../data/org.gnome.shell.gschema.xml.in.h:1 +msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog." +msgstr "Овозможува пристап до внатрешни алатки за дебагирање и мониторирање со користење на дијалогот на Alt-F2." + +#: ../data/org.gnome.shell.gschema.xml.in.h:2 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Овозможи ги внатрешните алатки кои се корисни за програмерите и тестерите преку Alt-F2" + +#: ../data/org.gnome.shell.gschema.xml.in.h:3 +msgid "File extension used for storing the screencast" +msgstr "Наставка на датотека која се користи за зачувување на снимката од екран" + +#: ../data/org.gnome.shell.gschema.xml.in.h:4 +msgid "Framerate used for recording screencasts." +msgstr "Рата на рамки која се користи при снимање на снимки од екран." + +#: ../data/org.gnome.shell.gschema.xml.in.h:5 +msgid "GNOME Shell extensions have a uuid property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension DBus methods on org.gnome.Shell." +msgstr "Додатоците за Gnome Shell имаат uuid својство; овој клуч ги листа додатоците кои ќе се вчитаат. Секој додаток кој треба да биде вчитан мора да стои во оваа листа. Можете да манипулирате со оваа листа со DBus методите EnableExtension и DisableExtension на org.gnome.Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.h:6 +msgid "History for command (Alt-F2) dialog" +msgstr "Историја на дијалогот за команди (Alt-F2)" + +#: ../data/org.gnome.shell.gschema.xml.in.h:7 +msgid "History for the looking glass dialog" +msgstr "Историја на стаклениот дијалог" + +#: ../data/org.gnome.shell.gschema.xml.in.h:8 +msgid "If true, display date in the clock, in addition to time." +msgstr "Ако е точно, прикажи го датумот на часовникот, покрај времето." + +#: ../data/org.gnome.shell.gschema.xml.in.h:9 +msgid "If true, display seconds in time." +msgstr "Ако е точно, прикажи ги секундите во часовникот." + +#: ../data/org.gnome.shell.gschema.xml.in.h:10 +msgid "If true, display the ISO week date in the calendar." +msgstr "Ако е точно, прикажи го ISO датумот во календарот." + +#: ../data/org.gnome.shell.gschema.xml.in.h:11 +msgid "List of desktop file IDs for favorite applications" +msgstr "Листа на ID на desktop датотеки за омилените апликации" + +#: ../data/org.gnome.shell.gschema.xml.in.h:13 +#, no-c-format +msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system." +msgstr "Го поставува GStreamer цевководот за енкодирање на снимки. Ја следи синтаксата која се користи за gst-launch. Цевководот треба да има неповрзан одвод каде се зачувува сниманото видео. Вообичаено тој има неповрзан извор; излезните податоци ќе бидат запишани во излезната датотека. Сепак, цевководот може да се грижи за својот излез - тоа најчесто може да се користи за испраќање на излезните податоци на icecast сервер преку shout2send или слично. Кога не е поставен или пак е поставен на празна вредност, се користи стандардниот цевковод. Оваа вредност моментално е „videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux“ и снима во WEBM со користење на кодекот VP8. %T се користи за определување на оптималниот број на нишки за системот." + +#: ../data/org.gnome.shell.gschema.xml.in.h:14 +msgid "Show date in clock" +msgstr "Прикажи го датумот во часовникот" + +#: ../data/org.gnome.shell.gschema.xml.in.h:15 +msgid "Show the week date in the calendar" +msgstr "Покажи ја неделата во календарот" + +#: ../data/org.gnome.shell.gschema.xml.in.h:16 +msgid "Show time with seconds" +msgstr "Покажи го времето со секунди" + +#: ../data/org.gnome.shell.gschema.xml.in.h:17 +msgid "The applications corresponding to these identifiers will be displayed in the favorites area." +msgstr "Апликациите на кои се однесуваат овие идентификатори ќе бидат прикажани во површината за омилени." + +#: ../data/org.gnome.shell.gschema.xml.in.h:18 +msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format." +msgstr "Името на датотеката за зачуваните снимки од екранот ќе бидее уникатно според тековниот датум и ќе ја има оваа наставка. Таа треба да се промени кога снимањето се прави со различен формат на контејнерот. " + +#: ../data/org.gnome.shell.gschema.xml.in.h:19 +msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second." +msgstr "Ратата на рамки, во рамки/секунда, на добиената снимка на екранот снимана од алатката за правење снимки од екранот на GNOME Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.h:20 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "Цевководот на gstreamer кој се користи за енкодирање на снимката од екран" + +#: ../data/org.gnome.shell.gschema.xml.in.h:21 +msgid "The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data." +msgstr "Школката обично ги набљудува активните апликации за да прикаже кои се најкористени (пр. во пуштачите). Иако овие податоци се се чуваат како приватни, може да го оневозможите ова за поголема приватност. Имајте во предвид дека со тоа нема да се отстранат тековно сниманите податоци." + +#: ../data/org.gnome.shell.gschema.xml.in.h:22 +msgid "The type of keyboard to use." +msgstr "Типот на тастатура кој се користи." + +#: ../data/org.gnome.shell.gschema.xml.in.h:23 +msgid "Uuids of extensions to enable" +msgstr "Uuid на екстензиите кои ќе се овозможат" + +#: ../data/org.gnome.shell.gschema.xml.in.h:24 +msgid "Whether to collect stats about applications usage" +msgstr "Дали да се собира статистика за користењето на апликациите" + +#: ../data/org.gnome.shell.gschema.xml.in.h:25 +msgid "Which keyboard to use" +msgstr "Која тастатура да се користи" + +#: ../data/org.gnome.shell.gschema.xml.in.h:26 +msgid "disabled OpenSearch providers" +msgstr "оневозможени OpenSearch провајдери" + +#: ../js/gdm/loginDialog.js:623 +msgid "Session..." +msgstr "Сесија..." + +#: ../js/gdm/loginDialog.js:785 +msgctxt "title" +msgid "Sign In" +msgstr "Најави се" + +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/loginDialog.js:830 +msgid "(or swipe finger)" +msgstr "(или поминете со прстот)" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:851 +msgid "Not listed?" +msgstr "Не сте во листата?" + +#: ../js/gdm/loginDialog.js:1019 +#: ../js/ui/endSessionDialog.js:418 +#: ../js/ui/extensionSystem.js:516 +#: ../js/ui/networkAgent.js:145 +#: ../js/ui/polkitAuthenticationAgent.js:175 +#: ../js/ui/status/bluetooth.js:462 +msgid "Cancel" +msgstr "Откажи" + +#: ../js/gdm/loginDialog.js:1024 +msgctxt "button" +msgid "Sign In" +msgstr "Најави се" + +#: ../js/gdm/loginDialog.js:1376 +msgid "Login Window" +msgstr "Најавен прозорец" + +#: ../js/gdm/powerMenu.js:113 +#: ../js/ui/userMenu.js:578 +#: ../js/ui/userMenu.js:580 +#: ../js/ui/userMenu.js:649 +msgid "Suspend" +msgstr "Суспендирај" + +#: ../js/gdm/powerMenu.js:118 +msgid "Restart" +msgstr "Рестартирај се" + +#: ../js/gdm/powerMenu.js:123 +msgid "Power Off" +msgstr "Исклучи се" + +#: ../js/misc/util.js:92 +msgid "Command not found" +msgstr "Командата не е пронајдена" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:119 +msgid "Could not parse command:" +msgstr "Не можев да ја испарсирам командата:" + +#: ../js/misc/util.js:127 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "Извршувањето на „%s“ не успеа:" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:251 +msgid "All" +msgstr "Сите" + +#: ../js/ui/appDisplay.js:310 +msgid "APPLICATIONS" +msgstr "АПЛИКАЦИИ" + +#: ../js/ui/appDisplay.js:366 +msgid "SETTINGS" +msgstr "ПОСТАВУВАЊА" + +#: ../js/ui/appDisplay.js:664 +msgid "New Window" +msgstr "Нов прозорец" + +#: ../js/ui/appDisplay.js:667 +msgid "Remove from Favorites" +msgstr "Отстрани од омилените" + +#: ../js/ui/appDisplay.js:668 +msgid "Add to Favorites" +msgstr "Додај во омилени" + +#: ../js/ui/appFavorites.js:87 +#, c-format +msgid "%s has been added to your favorites." +msgstr "%s е веќе постои во омилените." + +#: ../js/ui/appFavorites.js:118 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "%s е отстранет од листата на омилени." + +#: ../js/ui/autorunManager.js:265 +msgid "Removable Devices" +msgstr "Отстранливи уреди" + +#: ../js/ui/autorunManager.js:560 +#, c-format +msgid "Open with %s" +msgstr "Отвори со %s" + +#: ../js/ui/autorunManager.js:586 +msgid "Eject" +msgstr "Извади" + +#. 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:62 +msgctxt "event list time" +msgid "All Day" +msgstr "Цел ден" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:67 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H:%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:74 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:114 +msgctxt "grid sunday" +msgid "S" +msgstr "Н" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:116 +msgctxt "grid monday" +msgid "M" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:118 +msgctxt "grid tuesday" +msgid "T" +msgstr "В" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:120 +msgctxt "grid wednesday" +msgid "W" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:122 +msgctxt "grid thursday" +msgid "T" +msgstr "Ч" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:124 +msgctxt "grid friday" +msgid "F" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:126 +msgctxt "grid saturday" +msgid "S" +msgstr "С" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:139 +msgctxt "list sunday" +msgid "Su" +msgstr "Нед" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:141 +msgctxt "list monday" +msgid "M" +msgstr "Пон" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:143 +msgctxt "list tuesday" +msgid "T" +msgstr "Вто" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:145 +msgctxt "list wednesday" +msgid "W" +msgstr "Сре" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:147 +msgctxt "list thursday" +msgid "Th" +msgstr "Чет" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:149 +msgctxt "list friday" +msgid "F" +msgstr "Пет" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:151 +msgctxt "list saturday" +msgid "S" +msgstr "Саб" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:681 +msgid "Nothing Scheduled" +msgstr "Нема ништо закажано" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:697 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:700 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:710 +msgid "Today" +msgstr "Денес" + +#: ../js/ui/calendar.js:714 +msgid "Tomorrow" +msgstr "Утре" + +#: ../js/ui/calendar.js:723 +msgid "This week" +msgstr "Оваа недела" + +#: ../js/ui/calendar.js:731 +msgid "Next week" +msgstr "Следната недела" + +#: ../js/ui/contactDisplay.js:63 +#: ../js/ui/notificationDaemon.js:466 +#: ../js/ui/status/power.js:215 +#: ../src/shell-app.c:350 +msgid "Unknown" +msgstr "Непознато" + +#: ../js/ui/contactDisplay.js:84 +#: ../js/ui/userMenu.js:127 +msgid "Available" +msgstr "Достапен" + +#: ../js/ui/contactDisplay.js:89 +#: ../js/ui/userMenu.js:136 +msgid "Away" +msgstr "Отсутен" + +#: ../js/ui/contactDisplay.js:93 +#: ../js/ui/userMenu.js:130 +msgid "Busy" +msgstr "Зафатен" + +#: ../js/ui/contactDisplay.js:97 +msgid "Offline" +msgstr "Офлајн" + +#: ../js/ui/contactDisplay.js:141 +msgid "CONTACTS" +msgstr "КОНТАКТИ" + +#: ../js/ui/dash.js:169 +#: ../js/ui/messageTray.js:1204 +msgid "Remove" +msgstr "Отстрани" + +#: ../js/ui/dateMenu.js:96 +msgid "Date and Time Settings" +msgstr "Поставувања за датум и време" + +#: ../js/ui/dateMenu.js:122 +msgid "Open Calendar" +msgstr "Отвори го календарот" + +#. Translators: This is the time format with date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:180 +msgid "%a %b %e, %R:%S" +msgstr "%a %b %e, %R:%S" + +#: ../js/ui/dateMenu.js:181 +msgid "%a %b %e, %R" +msgstr "%a %b %e, %R" + +#. Translators: This is the time format without date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:185 +msgid "%a %R:%S" +msgstr "%a %R:%S" + +#: ../js/ui/dateMenu.js:186 +msgid "%a %R" +msgstr "%a %R" + +#. Translators: This is a time format with date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:193 +msgid "%a %b %e, %l:%M:%S %p" +msgstr "%a %b %e, %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:194 +msgid "%a %b %e, %l:%M %p" +msgstr "%a %b %e, %l:%M %p" + +#. Translators: This is a time format without date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:198 +msgid "%a %l:%M:%S %p" +msgstr "%a %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:199 +msgid "%a %l:%M %p" +msgstr "%a %l:%M %p" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). +#. +#: ../js/ui/dateMenu.js:210 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/docDisplay.js:13 +msgid "RECENT ITEMS" +msgstr "СКОРЕШНИ ПРЕДМЕТИ" + +#: ../js/ui/endSessionDialog.js:61 +#, c-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Одјави го „%s“" + +#: ../js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Log Out" +msgstr "Одјави се" + +#: ../js/ui/endSessionDialog.js:63 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "Кликнете „Одјави се“ за да се исклучат овие апликации и за одјавување од системот." + +#: ../js/ui/endSessionDialog.js:65 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s ќе биде автоматски одјавен од системот за %d секунда." +msgstr[1] "%s ќе биде автоматски одјавен од системот за %d секунди." + +#: ../js/ui/endSessionDialog.js:70 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Ќе бидете автоматски одјавен од системот за %d секунда." +msgstr[1] "Ќе бидете автоматски одјавен од системот за %d секунди." + +#: ../js/ui/endSessionDialog.js:74 +msgid "Logging out of the system." +msgstr "Одјавување од системот." + +#: ../js/ui/endSessionDialog.js:76 +msgctxt "button" +msgid "Log Out" +msgstr "Одјави се" + +#: ../js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Power Off" +msgstr "Исклучи се" + +#: ../js/ui/endSessionDialog.js:82 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "Кликнете „Исклучи се“ за да ги исклучите овие апликации и да го исклучите системот." + +#: ../js/ui/endSessionDialog.js:84 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Системот ќе се исклучи автоматски за %d секунда." +msgstr[1] "Системот ќе се исклучи автоматски за %d секунди." + +#: ../js/ui/endSessionDialog.js:88 +msgid "Powering off the system." +msgstr "Го исклучувам системот." + +#: ../js/ui/endSessionDialog.js:90 +#: ../js/ui/endSessionDialog.js:107 +msgctxt "button" +msgid "Restart" +msgstr "Рестартирај се" + +#: ../js/ui/endSessionDialog.js:92 +msgctxt "button" +msgid "Power Off" +msgstr "Исклучи се" + +#: ../js/ui/endSessionDialog.js:98 +msgctxt "title" +msgid "Restart" +msgstr "Рестартирај се" + +#: ../js/ui/endSessionDialog.js:99 +msgid "Click Restart to quit these applications and restart the system." +msgstr "Кликнете „Рестартирај се“ за да ги исклучите овие апликации и да го рестартирате системот." + +#: ../js/ui/endSessionDialog.js:101 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Системот ќе се рестартира автоматски за %d секунда." +msgstr[1] "Системот ќе се рестартира автоматски за %d секунди." + +#: ../js/ui/endSessionDialog.js:105 +msgid "Restarting the system." +msgstr "Го рестартирам системот." + +#: ../js/ui/extensionSystem.js:520 +msgid "Install" +msgstr "Инсталирај" + +#: ../js/ui/extensionSystem.js:524 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "Да го преземам и инсталирам „%s“ од extensions.gnome.org?" + +#: ../js/ui/keyboard.js:322 +msgid "tray" +msgstr "место за известување" + +#: ../js/ui/keyboard.js:539 +#: ../js/ui/status/power.js:203 +msgid "Keyboard" +msgstr "Тастатура" + +#: ../js/ui/lookingGlass.js:724 +msgid "No extensions installed" +msgstr "Не е инсталиран додаток" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:779 +#, c-format +msgid "%s has not emitted any errors." +msgstr "%s не испрати никакви грешки." + +#: ../js/ui/lookingGlass.js:785 +msgid "Hide Errors" +msgstr "Скриј ги грешките" + +#: ../js/ui/lookingGlass.js:789 +#: ../js/ui/lookingGlass.js:840 +msgid "Show Errors" +msgstr "Прикажи ги грешките" + +#: ../js/ui/lookingGlass.js:798 +msgid "Enabled" +msgstr "Овозможено" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:801 +#: ../src/gvc/gvc-mixer-control.c:1093 +msgid "Disabled" +msgstr "Оневозможено" + +#: ../js/ui/lookingGlass.js:803 +msgid "Error" +msgstr "Грешка" + +#: ../js/ui/lookingGlass.js:805 +msgid "Out of date" +msgstr "Застарено" + +#: ../js/ui/lookingGlass.js:807 +msgid "Downloading" +msgstr "Преземам" + +#: ../js/ui/lookingGlass.js:828 +msgid "View Source" +msgstr "Погледни го изворот" + +#: ../js/ui/lookingGlass.js:834 +msgid "Web Page" +msgstr "Веб страница" + +#: ../js/ui/messageTray.js:1197 +msgid "Open" +msgstr "Отвори" + +#: ../js/ui/messageTray.js:1214 +msgid "Unmute" +msgstr "Пушти го гласот" + +#: ../js/ui/messageTray.js:1214 +msgid "Mute" +msgstr "Исклучи го гласот" + +#: ../js/ui/messageTray.js:2444 +msgid "System Information" +msgstr "Информации за системот" + +#: ../js/ui/networkAgent.js:140 +msgid "Connect" +msgstr "Поврзи се" + +#. Cisco LEAP +#: ../js/ui/networkAgent.js:235 +#: ../js/ui/networkAgent.js:247 +#: ../js/ui/networkAgent.js:274 +#: ../js/ui/networkAgent.js:294 +#: ../js/ui/networkAgent.js:304 +msgid "Password: " +msgstr "Лозинка:" + +#. static WEP +#: ../js/ui/networkAgent.js:240 +msgid "Key: " +msgstr "Клуч:" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/ui/networkAgent.js:272 +#: ../js/ui/networkAgent.js:290 +msgid "Username: " +msgstr "Корисничко име:" + +#: ../js/ui/networkAgent.js:278 +msgid "Identity: " +msgstr "Идентитет:" + +#: ../js/ui/networkAgent.js:280 +msgid "Private key password: " +msgstr "Лозинка на приватниот клуч:" + +#: ../js/ui/networkAgent.js:292 +msgid "Service: " +msgstr "Сервис:" + +#: ../js/ui/networkAgent.js:321 +msgid "Authentication required by wireless network" +msgstr "Потребна е автентикација од безжичната мрежа" + +#: ../js/ui/networkAgent.js:322 +#, c-format +msgid "Passwords or encryption keys are required to access the wireless network '%s'." +msgstr "Потребни се лозинки или клучеви за енкрипција за пристап на безжичната мрежа „%s“." + +#: ../js/ui/networkAgent.js:326 +msgid "Wired 802.1X authentication" +msgstr "Жичена 802.1X автентикација" + +#: ../js/ui/networkAgent.js:328 +msgid "Network name: " +msgstr "Име на мрежа:" + +#: ../js/ui/networkAgent.js:333 +msgid "DSL authentication" +msgstr "DSL автентикација" + +#: ../js/ui/networkAgent.js:340 +msgid "PIN code required" +msgstr "Потребен е PIN код" + +#: ../js/ui/networkAgent.js:341 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Потребен е PIN кодот за мобилниот уред" + +#: ../js/ui/networkAgent.js:342 +msgid "PIN: " +msgstr "PIN:" + +#: ../js/ui/networkAgent.js:348 +msgid "Mobile broadband network password" +msgstr "Лозинка за мобилна широкопојасна мрежа " + +#: ../js/ui/networkAgent.js:349 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "Потребна е лозинка за поврзување со „%s“." + +#: ../js/ui/overview.js:89 +msgid "Undo" +msgstr "Врати" + +#: ../js/ui/overview.js:198 +msgid "Windows" +msgstr "Прозорци" + +#: ../js/ui/overview.js:201 +msgid "Applications" +msgstr "Апликации" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:223 +msgid "Dash" +msgstr "Лента" + +#. TODO - _quit() doesn't really work on apps in state STARTING yet +#: ../js/ui/panel.js:532 +#, c-format +msgid "Quit %s" +msgstr "Исклучи го %s" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:565 +msgid "Activities" +msgstr "Активности" + +#: ../js/ui/panel.js:953 +msgid "Top Bar" +msgstr "Горна лента" + +#: ../js/ui/placeDisplay.js:115 +#, c-format +msgid "Failed to unmount '%s'" +msgstr "Не успеав да го одмонтирам „%s“" + +#: ../js/ui/placeDisplay.js:118 +msgid "Retry" +msgstr "Обиди се повторно" + +#: ../js/ui/placeDisplay.js:156 +msgid "Connect to..." +msgstr "Поврзи се со..." + +#: ../js/ui/placeDisplay.js:364 +msgid "PLACES & DEVICES" +msgstr "МЕСТА И УРЕДИ" + +#: ../js/ui/polkitAuthenticationAgent.js:71 +msgid "Authentication Required" +msgstr "Потребна е автентикација" + +#: ../js/ui/polkitAuthenticationAgent.js:109 +msgid "Administrator" +msgstr "Администратор" + +#: ../js/ui/polkitAuthenticationAgent.js:179 +msgid "Authenticate" +msgstr "Автентицирај се" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/polkitAuthenticationAgent.js:260 +msgid "Sorry, that didn't work. Please try again." +msgstr "Жалам, но тоа не успеа. Пробајте пак." + +#: ../js/ui/polkitAuthenticationAgent.js:272 +msgid "Password:" +msgstr "Лозинка:" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:717 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:205 +msgid "Please enter a command:" +msgstr "Ве молам, внесете команда:" + +#: ../js/ui/searchDisplay.js:333 +msgid "Searching..." +msgstr "Барам..." + +#: ../js/ui/searchDisplay.js:356 +msgid "No matching results." +msgstr "Нема резултати." + +#: ../js/ui/shellEntry.js:26 +msgid "Copy" +msgstr "Копирај" + +#: ../js/ui/shellEntry.js:31 +msgid "Paste" +msgstr "Вметни" + +#: ../js/ui/shellEntry.js:77 +msgid "Show Text" +msgstr "Прикажи текст" + +#: ../js/ui/shellEntry.js:79 +msgid "Hide Text" +msgstr "Скриј го текстот" + +#: ../js/ui/shellMountOperation.js:269 +msgid "Wrong password, please try again" +msgstr "Грешна лозинка, пробајте пак" + +#: ../js/ui/status/accessibility.js:52 +msgid "Zoom" +msgstr "Зумирај" + +#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, +#. 'screen-reader-enabled'); +#. this.menu.addMenuItem(screenReader); +#: ../js/ui/status/accessibility.js:63 +msgid "Screen Keyboard" +msgstr "Екранска тастатура" + +#: ../js/ui/status/accessibility.js:67 +msgid "Visual Alerts" +msgstr "Визуелни аларми" + +#: ../js/ui/status/accessibility.js:70 +msgid "Sticky Keys" +msgstr "Лепливи копчиња" + +#: ../js/ui/status/accessibility.js:73 +msgid "Slow Keys" +msgstr "Бавни копчиња" + +#: ../js/ui/status/accessibility.js:76 +msgid "Bounce Keys" +msgstr "Враќачки копчиња" + +#: ../js/ui/status/accessibility.js:79 +msgid "Mouse Keys" +msgstr "Копчиња на глушец" + +#: ../js/ui/status/accessibility.js:83 +msgid "Universal Access Settings" +msgstr "Поставувања за универзален пристап" + +#: ../js/ui/status/accessibility.js:117 +msgid "High Contrast" +msgstr "Висок контраст" + +#: ../js/ui/status/accessibility.js:154 +msgid "Large Text" +msgstr "Голем текст" + +#: ../js/ui/status/bluetooth.js:35 +#: ../js/ui/status/bluetooth.js:258 +#: ../js/ui/status/bluetooth.js:341 +#: ../js/ui/status/bluetooth.js:371 +#: ../js/ui/status/bluetooth.js:407 +#: ../js/ui/status/bluetooth.js:436 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:48 +msgid "Visibility" +msgstr "Видливост" + +#: ../js/ui/status/bluetooth.js:62 +msgid "Send Files to Device..." +msgstr "Испрати датотеки до уред..." + +#: ../js/ui/status/bluetooth.js:63 +msgid "Set up a New Device..." +msgstr "Постави нов уред..." + +#: ../js/ui/status/bluetooth.js:87 +msgid "Bluetooth Settings" +msgstr "Поставувања за bluetooth" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:107 +#: ../js/ui/status/network.js:255 +msgid "hardware disabled" +msgstr "уредот е оневозможен" + +#: ../js/ui/status/bluetooth.js:203 +msgid "Connection" +msgstr "Врска" + +#: ../js/ui/status/bluetooth.js:214 +#: ../js/ui/status/network.js:477 +msgid "disconnecting..." +msgstr "ја прекинувам врската..." + +#: ../js/ui/status/bluetooth.js:227 +#: ../js/ui/status/network.js:483 +msgid "connecting..." +msgstr "се поврзувам..." + +#: ../js/ui/status/bluetooth.js:245 +msgid "Send Files..." +msgstr "Испраќам датотеки..." + +#: ../js/ui/status/bluetooth.js:250 +msgid "Browse Files..." +msgstr "Прелистај низ датотеките..." + +#: ../js/ui/status/bluetooth.js:259 +msgid "Error browsing device" +msgstr "Грешка при прелистувањето низ уредот" + +#: ../js/ui/status/bluetooth.js:260 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "Низ побараниот уред не може да се прелистува, грешката е „%s“" + +#: ../js/ui/status/bluetooth.js:268 +msgid "Keyboard Settings" +msgstr "Поставувања за тастатура" + +#: ../js/ui/status/bluetooth.js:271 +msgid "Mouse Settings" +msgstr "Поставувања за глушец" + +#: ../js/ui/status/bluetooth.js:276 +#: ../js/ui/status/volume.js:58 +msgid "Sound Settings" +msgstr "Поставувања за звук" + +#: ../js/ui/status/bluetooth.js:372 +#, c-format +msgid "Authorization request from %s" +msgstr "Барање за авторизација од %s" + +#: ../js/ui/status/bluetooth.js:378 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "Уредот %s бара пристап до сервисот „%s“" + +#: ../js/ui/status/bluetooth.js:380 +msgid "Always grant access" +msgstr "Секогаш доделувај му пристап" + +#: ../js/ui/status/bluetooth.js:381 +msgid "Grant this time only" +msgstr "Додели му само овој пат" + +#: ../js/ui/status/bluetooth.js:382 +#: ../js/ui/telepathyClient.js:1181 +msgid "Reject" +msgstr "Одбиј" + +#: ../js/ui/status/bluetooth.js:408 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "Потврда за спарување за %s" + +#: ../js/ui/status/bluetooth.js:414 +#: ../js/ui/status/bluetooth.js:444 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "Уредот %s сака да се спари со компјутерот" + +#: ../js/ui/status/bluetooth.js:415 +#, c-format +msgid "Please confirm whether the PIN '%s' matches the one on the device." +msgstr "Потврдете дека PIN-от „%s“ одговара со тој на уредот." + +#: ../js/ui/status/bluetooth.js:417 +msgid "Matches" +msgstr "Одговара" + +#: ../js/ui/status/bluetooth.js:418 +msgid "Does not match" +msgstr "Не одговара" + +#: ../js/ui/status/bluetooth.js:437 +#, c-format +msgid "Pairing request for %s" +msgstr "Барање за спарување со %s" + +#: ../js/ui/status/bluetooth.js:445 +msgid "Please enter the PIN mentioned on the device." +msgstr "Внесете го PIN-от кој се појавува на уредот." + +#: ../js/ui/status/bluetooth.js:461 +msgid "OK" +msgstr "Во ред" + +#: ../js/ui/status/keyboard.js:68 +msgid "Show Keyboard Layout" +msgstr "Прикажи го распоредот на тастатурата" + +#: ../js/ui/status/keyboard.js:73 +msgid "Region and Language Settings" +msgstr "Поставувања за регион и јазик" + +#: ../js/ui/status/network.js:96 +msgid "" +msgstr "<непознато>" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:277 +msgid "disabled" +msgstr "оневозможена" + +#. 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) +#: ../js/ui/status/network.js:475 +msgid "unmanaged" +msgstr "неменаџирана" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:486 +msgid "authentication required" +msgstr "потребна е автентикација" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:496 +msgid "firmware missing" +msgstr "недостасува firmware" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:503 +msgid "cable unplugged" +msgstr "кабелот е откачен" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:508 +msgid "unavailable" +msgstr "нема пристап" + +#: ../js/ui/status/network.js:510 +msgid "connection failed" +msgstr "не успеа врската" + +#: ../js/ui/status/network.js:566 +#: ../js/ui/status/network.js:1508 +msgid "More..." +msgstr "Повеќе..." + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:602 +#: ../js/ui/status/network.js:1443 +msgid "Connected (private)" +msgstr "Поврзан (приватен)" + +#: ../js/ui/status/network.js:677 +msgid "Auto Ethernet" +msgstr "Автоматски ethernet" + +#: ../js/ui/status/network.js:738 +msgid "Auto broadband" +msgstr "Автоматски широкопојасен" + +#: ../js/ui/status/network.js:741 +msgid "Auto dial-up" +msgstr "Автоматски dial-up" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:860 +#: ../js/ui/status/network.js:1455 +#, c-format +msgid "Auto %s" +msgstr "Aвтоматски %s" + +#: ../js/ui/status/network.js:862 +msgid "Auto bluetooth" +msgstr "Автоматски bluetooth" + +#: ../js/ui/status/network.js:1457 +msgid "Auto wireless" +msgstr "Автоматски безжично" + +#: ../js/ui/status/network.js:1551 +msgid "Enable networking" +msgstr "Овозможи мрежа" + +#: ../js/ui/status/network.js:1563 +msgid "Wired" +msgstr "Жичена" + +#: ../js/ui/status/network.js:1574 +msgid "Wireless" +msgstr "Безжична" + +#: ../js/ui/status/network.js:1584 +msgid "Mobile broadband" +msgstr "Мобилна широкопојасна мрежа" + +#: ../js/ui/status/network.js:1594 +msgid "VPN Connections" +msgstr "VPN врски" + +#: ../js/ui/status/network.js:1605 +msgid "Network Settings" +msgstr "Поставувања за мрежата" + +#: ../js/ui/status/network.js:1742 +msgid "Connection failed" +msgstr "Врската не успеа" + +#: ../js/ui/status/network.js:1743 +msgid "Activation of network connection failed" +msgstr "Активирањето на мрежата не успеа" + +#: ../js/ui/status/network.js:1993 +msgid "Networking is disabled" +msgstr "Мрежата е оневозможена" + +#: ../js/ui/status/network.js:2117 +msgid "Network Manager" +msgstr "Менаџер на мрежи" + +#: ../js/ui/status/power.js:77 +msgid "Power Settings" +msgstr "Поставувања за енергијата" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:98 +msgid "Estimating..." +msgstr "Проценувам..." + +#: ../js/ui/status/power.js:105 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "преостанува уште %d час" +msgstr[1] "преостануваат уште %d часа" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:108 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "преостануваат уште %d %s %d %s" + +#: ../js/ui/status/power.js:110 +msgid "hour" +msgid_plural "hours" +msgstr[0] "час" +msgstr[1] "часа" + +#: ../js/ui/status/power.js:110 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "минута" +msgstr[1] "минути" + +#: ../js/ui/status/power.js:113 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "преостанува уште %d минута" +msgstr[1] "преостануваат уште %d минути" + +#: ../js/ui/status/power.js:116 +#: ../js/ui/status/power.js:186 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d%%" + +#: ../js/ui/status/power.js:193 +msgid "AC adapter" +msgstr "Адаптер" + +#: ../js/ui/status/power.js:195 +msgid "Laptop battery" +msgstr "Батерија од лаптоп" + +#: ../js/ui/status/power.js:197 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:199 +msgid "Monitor" +msgstr "Монитор" + +#: ../js/ui/status/power.js:201 +msgid "Mouse" +msgstr "Глушец" + +#: ../js/ui/status/power.js:205 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:207 +msgid "Cell phone" +msgstr "Мобилен телефон" + +#: ../js/ui/status/power.js:209 +msgid "Media player" +msgstr "Плеер" + +#: ../js/ui/status/power.js:211 +msgid "Tablet" +msgstr "Таблет" + +#: ../js/ui/status/power.js:213 +msgid "Computer" +msgstr "Компјутер" + +#: ../js/ui/status/volume.js:38 +msgid "Volume" +msgstr "Гласност" + +#: ../js/ui/status/volume.js:50 +msgid "Microphone" +msgstr "Микрофон" + +#. We got the TpContact +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/telepathyClient.js:256 +msgid "Invitation" +msgstr "Покана" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:324 +msgid "Call" +msgstr "Повик" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:354 +msgid "File Transfer" +msgstr "Пренос на датотеки" + +#: ../js/ui/telepathyClient.js:435 +msgid "Subscription request" +msgstr "Барање за претплата" + +#: ../js/ui/telepathyClient.js:471 +msgid "Connection error" +msgstr "Грешка во поврзувањето" + +#: ../js/ui/telepathyClient.js:735 +#, c-format +msgid "%s is online." +msgstr "%s е онлајн." + +#: ../js/ui/telepathyClient.js:740 +#, c-format +msgid "%s is offline." +msgstr "%s е офлајн." + +#: ../js/ui/telepathyClient.js:743 +#, c-format +msgid "%s is away." +msgstr "%s е отсутен/на." + +#: ../js/ui/telepathyClient.js:746 +#, c-format +msgid "%s is busy." +msgstr "%s е зафатен(а)." + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/telepathyClient.js:977 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "Испратено на %X на %A" + +#. Translators: this is a time format in the style of "Wednesday, May 25", +#. shown when you get a chat message in the same year. +#: ../js/ui/telepathyClient.js:983 +#, no-c-format +msgid "Sent on %A, %B %d" +msgstr "Испратено на %A, %d %B" + +#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", +#. shown when you get a chat message in a different year. +#: ../js/ui/telepathyClient.js:988 +#, no-c-format +msgid "Sent on %A, %B %d, %Y" +msgstr "Испратено на %A, %B %d, %Y" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/telepathyClient.js:1030 +#, c-format +msgid "%s is now known as %s" +msgstr "%s е сега познат(а) како %s" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/telepathyClient.js:1132 +#, c-format +msgid "Invitation to %s" +msgstr "Покана до %s" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/telepathyClient.js:1140 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "%s Ве поканува да се придружите во %s" + +#: ../js/ui/telepathyClient.js:1142 +#: ../js/ui/telepathyClient.js:1222 +#: ../js/ui/telepathyClient.js:1320 +msgid "Decline" +msgstr "Одбиј" + +#: ../js/ui/telepathyClient.js:1143 +#: ../js/ui/telepathyClient.js:1223 +#: ../js/ui/telepathyClient.js:1321 +msgid "Accept" +msgstr "Прифати" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1173 +#, c-format +msgid "Video call from %s" +msgstr "Видео повик од %s" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1176 +#, c-format +msgid "Call from %s" +msgstr "Повик од %s" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/telepathyClient.js:1183 +msgid "Answer" +msgstr "Одговори" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/telepathyClient.js:1216 +#, c-format +msgid "%s is sending you %s" +msgstr "%s Ви праќа %s" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/telepathyClient.js:1285 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "%s бара дозвола да гледа кога сте онлајн" + +#: ../js/ui/telepathyClient.js:1378 +msgid "Network error" +msgstr "Грешка во мрежата" + +#: ../js/ui/telepathyClient.js:1380 +msgid "Authentication failed" +msgstr "Автентикацијата не успеа" + +#: ../js/ui/telepathyClient.js:1382 +msgid "Encryption error" +msgstr "Грешка во енкрипцијата" + +#: ../js/ui/telepathyClient.js:1384 +msgid "Certificate not provided" +msgstr "Не е обезбеден сертификат" + +#: ../js/ui/telepathyClient.js:1386 +msgid "Certificate untrusted" +msgstr "Сертификатот не е доверлив" + +#: ../js/ui/telepathyClient.js:1388 +msgid "Certificate expired" +msgstr "Сертификатот е истечен" + +#: ../js/ui/telepathyClient.js:1390 +msgid "Certificate not activated" +msgstr "Сертификатот не е активиран" + +#: ../js/ui/telepathyClient.js:1392 +msgid "Certificate hostname mismatch" +msgstr "Името на хостот на сертификатот не одговара" + +#: ../js/ui/telepathyClient.js:1394 +msgid "Certificate fingerprint mismatch" +msgstr "Отпечатокот на сертификатот не одговара" + +#: ../js/ui/telepathyClient.js:1396 +msgid "Certificate self-signed" +msgstr "Сертификатот е самопотпишан" + +#: ../js/ui/telepathyClient.js:1398 +msgid "Status is set to offline" +msgstr "Статусот е поставен на „офлајн“" + +#: ../js/ui/telepathyClient.js:1400 +msgid "Encryption is not available" +msgstr "Енкрипцијата не е достапна" + +#: ../js/ui/telepathyClient.js:1402 +msgid "Certificate is invalid" +msgstr "Сертификатот не е валиден" + +#: ../js/ui/telepathyClient.js:1404 +msgid "Connection has been refused" +msgstr "Врската беше одбиена" + +#: ../js/ui/telepathyClient.js:1406 +msgid "Connection can't be established" +msgstr "Врската не може да се воспостави" + +#: ../js/ui/telepathyClient.js:1408 +msgid "Connection has been lost" +msgstr "Врската е загубена" + +#: ../js/ui/telepathyClient.js:1410 +msgid "This resource is already connected to the server" +msgstr "Ресурсот е веќе поврзан на серверот" + +#: ../js/ui/telepathyClient.js:1412 +msgid "Connection has been replaced by a new connection using the same resource" +msgstr "Врската е заменета со нова врска со користење на истиот ресурс" + +#: ../js/ui/telepathyClient.js:1414 +msgid "The account already exists on the server" +msgstr "Сметката веќе постои на серверот" + +#: ../js/ui/telepathyClient.js:1416 +msgid "Server is currently too busy to handle the connection" +msgstr "Серверот е моментално презафатен за да се справи со врската" + +#: ../js/ui/telepathyClient.js:1418 +msgid "Certificate has been revoked" +msgstr "Сертификатот е отповикан" + +#: ../js/ui/telepathyClient.js:1420 +msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "Сертификатот користи небезбеден алгоритам за шифрирање или е криптографски слаб" + +#: ../js/ui/telepathyClient.js:1422 +msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library" +msgstr "Должината на сертификатот од серверот или длабочината на веригата од сертификати ги надминува границите на библиотеката за криптографија" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/telepathyClient.js:1432 +#, c-format +msgid "Connection to %s failed" +msgstr "Врската со %s не успеа" + +#: ../js/ui/telepathyClient.js:1441 +msgid "Reconnect" +msgstr "Поврзи се пак" + +#: ../js/ui/telepathyClient.js:1442 +msgid "Edit account" +msgstr "Уреди ја сметката" + +#: ../js/ui/telepathyClient.js:1488 +msgid "Unknown reason" +msgstr "Непозната причина" + +#: ../js/ui/userMenu.js:133 +msgid "Hidden" +msgstr "Скриен" + +#: ../js/ui/userMenu.js:139 +msgid "Idle" +msgstr "Неактивен" + +#: ../js/ui/userMenu.js:142 +msgid "Unavailable" +msgstr "Недостапен" + +#: ../js/ui/userMenu.js:576 +#: ../js/ui/userMenu.js:580 +#: ../js/ui/userMenu.js:650 +msgid "Power Off..." +msgstr "Исклучи се..." + +#: ../js/ui/userMenu.js:612 +msgid "Notifications" +msgstr "Известувања" + +#: ../js/ui/userMenu.js:620 +msgid "Online Accounts" +msgstr "Онлајн сметки" + +#: ../js/ui/userMenu.js:624 +msgid "System Settings" +msgstr "Поставувања за системот" + +#: ../js/ui/userMenu.js:631 +msgid "Lock Screen" +msgstr "Заклучи го екранот" + +#: ../js/ui/userMenu.js:636 +msgid "Switch User" +msgstr "Смени корисник" + +#: ../js/ui/userMenu.js:641 +msgid "Log Out..." +msgstr "Одјави се..." + +#: ../js/ui/userMenu.js:669 +msgid "Your chat status will be set to busy" +msgstr "Вашиот статус на разговорите ќе биде поставен на „зафатен“" + +#: ../js/ui/userMenu.js:670 +msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages." +msgstr "Известувањата сега се оневозможени, вклучувајќи ги и тие на разговорите. Вашиот онлајн статус е прилагоден за да им се каже на другите дека Вие нема да ги видите нивните пораки." + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/viewSelector.js:113 +msgid "Type to search..." +msgstr "Внесете текст за пребарување..." + +#: ../js/ui/viewSelector.js:131 +#: ../src/shell-util.c:244 +msgid "Search" +msgstr "Пребарај" + +#: ../js/ui/windowAttentionHandler.js:33 +#, c-format +msgid "'%s' is ready" +msgstr "„%s“ е подготвен" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1100 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u излез" +msgstr[1] "%u излези" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1110 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u излез" +msgstr[1] "%u излези" + +#: ../src/gvc/gvc-mixer-control.c:1408 +msgid "System Sounds" +msgstr "Системски звуци" + +#: ../src/main.c:508 +msgid "Print version" +msgstr "Печатена верзија" + +#: ../src/main.c:514 +msgid "Mode used by GDM for login screen" +msgstr "Модулот кој се користи од GDM за најавниот екран" + +#: ../src/shell-app.c:567 +#, c-format +msgid "Failed to launch '%s'" +msgstr "Не успеав да го пуштам „%s“" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "Обединетото Кралство" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "Стандардно" + +#: ../src/shell-polkit-authentication-agent.c:334 +msgid "Authentication dialog was dismissed by the user" +msgstr "Дијалогот за автентикација беше исклучен од корисникот" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:89 +msgid "Home" +msgstr "Дома" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:98 +msgid "File System" +msgstr "Датотечен систем" + +#. Translators: the first string is the name of a gvfs +#. * method, and the second string is a path. For +#. * example, "Trash: some-directory". It means that the +#. * directory called "some-directory" is in the trash. +#. +#: ../src/shell-util.c:294 +#, c-format +msgid "%1$s: %2$s" +msgstr "%1$s: %2$s" + diff --git a/po/ml.po b/po/ml.po new file mode 100644 index 0000000..15dec42 --- /dev/null +++ b/po/ml.po @@ -0,0 +1,2852 @@ +# Malayalam translation for gnome-shell. +# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Anish A , 2010, 2011, 2013. +# Mohammed Sadiq , 2012. +# Praveen Arimbrathodiyil , 2012. +# Ani Peter , 2012, 2013. +# Ranjith Siji , 2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2018-10-10 19:07+0000\n" +"PO-Revision-Date: 2018-10-26 13:50+0530\n" +"Last-Translator: Ranjith Siji \n" +"Language-Team: American English \n" +"Language: ml\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.2\n" +"X-DamnedLies-Scope: partial\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "സിസ്റ്റം" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "അറിയിപ്പുകള്‍ കാണിക്കുക" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "സജീവമായ അറിയിപ്പിനെ കേന്ദ്രീകരിക്കുക" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "പൊതുവായ അവലോകനം കാണിക്കുക" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "എല്ലാ പ്രയോഗങ്ങളും കാണിയ്ക്കുക" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "പ്രയോഗത്തിന്റെ മെനു തുറക്കുക" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 js/extensionPrefs/main.js:142 +msgid "Shell Extensions" +msgstr "ഷെല്‍ എക്സ്റ്റെന്‍ഷനുകള്‍" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷനുകള്‍ ക്രമീകരിയ്ക്കുക" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "ഗ്നോം ഷെല്‍" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "വിന്‍ഡോ കൈകാര്യം ചെയ്യലും പ്രയോഗം ലഭ്യമാക്കലും" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Alt-F2-ല്‍ ഡവലപ്പര്‍മാര്‍ക്കും ടെസ്റ്റേര്‍സിനും പ്രയോജനകരമായ ആന്തരിക പ്രയോഗങ്ങള്‍ പ്രവര്‍ത്തന സജ്ജമാക്കുന്നു" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog." +msgstr "Alt-F2 ഡയലോഗ് ഉപയോഗിച്ച് ആന്തരിക ഡീബഗ്ഗിലേക്കും നീരീക്ഷണ പ്രയോഗങ്ങളിലേക്കും പ്രവേശനം അനുവദിയ്ക്കുക." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "പ്രവര്‍ത്തന സജ്ജമാക്കുന്നതിനുള്ള എക്സ്റ്റെന്‍ഷനുകളുടെ യുയുഐഡികള്‍" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which should be loaded. Any extension " +"that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension " +"and DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷനുകള്‍ക്ക് ഒരു യുയുഐഡി വിശേഷതയുണ്ട്; ലഭ്യമാക്കേണ്ട എക്സ്റ്റെന്‍ഷനുകള്‍ ഈ കീ പട്ടികപ്പെടുത്തുന്നു. ലഭ്യമാക്കേണ്ട ഏതു് എക്സ്റ്റെന്‍" +"ഷനും ഈ പട്ടികയിലുണ്ടാവണം. org.gnome.Shell-ല്‍ നിങ്ങള്‍ക്കു് EnableExtension, DisableExtension എന്നീ ഡീബസ് രീതികളിലൂടെ ഈ " +"പട്ടിക കൈകാര്യം ചെയ്യുവാനും സാധിയ്ക്കുന്നു." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "ഉപയോക്തൃ എക്സ്റ്റന്‍ഷനുകള്‍ പ്രവര്‍ത്തനരഹിതമാക്കുക" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "Disable all extensions the user has enabled without affecting the “enabled-extension” setting." +msgstr "“enabled-extension” എന്ന ക്രമീകരണത്തിനെ ബാധിക്കാതെ യൂസര്‍ പ്രവര്‍ത്തിപ്പിച്ച എല്ലാ എക്സ്റ്റന്‍ഷനുകളും പ്രവര്‍ത്തനരഹിതമാക്കുക." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "എക്സ്റ്റന്‍ഷന്റെ വെര്‍ഷന്‍ പൊരുത്ത സാധുത പരിശോധന പ്രവര്‍ത്തനരഹിതമാക്കുക" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current running version. Enabling this " +"option will disable this check and try to load all extensions regardless of the versions they claim to " +"support." +msgstr "" +"ഇപ്പോള്‍ പ്രവര്‍ത്തിച്ചുകൊണ്ടിരിക്കുന്ന വെര്‍ഷനെ പിന്‍തുണയ്ക്കുന്ന എക്സ്റ്റന്‍ഷനുകളെമാത്രമേ ഗ്നോം ഷെല്‍ പ്രവര്‍ത്തിപ്പിക്കുകയുള്ളു. ഈ ഓപ്ഷന്‍ ഓണാക്കിയാല്‍ ഈ " +"പരിശോധന ഇല്ലാതാവുകയും എല്ലാ എക്സ്റ്റന്‍ഷനുകളെയും പ്രവര്‍ത്തിപ്പിക്കാന്‍ ശ്രമിക്കുകയും ചെയ്യും, അതില്‍ വെര്‍ഷന്‍ പിന്‍തുണ പരിഗണിക്കുകയില്ല." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "ഇഷ്ടമുള്ള പ്രയോഗങ്ങള്‍ക്കുള്ള പണിയിട ഫയല്‍ ഐഡികളുടെ പട്ടിക" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "The applications corresponding to these identifiers will be displayed in the favorites area." +msgstr "ഈ ഐഡന്റിഫയറുകള്‍ക്കുള്ള പ്രയോഗങ്ങള്‍ ഉചിതമായ സ്ഥലങ്ങളില്‍ കാണിയ്ക്കുന്നു." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "ആപ്പ് പിക്കര്‍ കാഴ്ച" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "ആപ്ലിക്കേഷന്‍ പിക്കറില്‍ ഇപ്പോള്‍ തിരഞ്ഞെടുത്ത കാഴ്ചരീതിയുടെ ഉള്ളടക്കം." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "കമാന്‍ഡ് (Alt-F2) ഡയലോഗിന്റെ നാള്‍വഴി" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "തെരച്ചില്‍ ഡയലോഗിനുള്ള നാള്‍വഴി" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "ഉപയോക്തൃ മെനുവില്‍ 'പുറത്തിറങ്ങുക' കാണിക്കുക." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-user, single-session situations." +msgstr "സിംഗിള്‍ യൂസര്‍, സിംഗിള്‍ സെഷനില്‍ 'ലോഗൌട്ട്' മെനുവസ്തു തനിയെ അദൃശ്യമാകുന്നത് ഈ കീ മറികടക്കുന്നു." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "Whether to remember password for mounting encrypted or remote filesystems" +msgstr "എന്‍ക്രിപ്റ്റ് ചെയ്തതോ വിദൂരമോ ആയ ഫയല്‍സിസ്റ്റങ്ങള്‍ മൌണ്ട് ചെയ്യുമ്പോഴുള്ള രഹസ്യവാക്ക് ഓര്‍മ്മിക്കണോ എന്ന്" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote filesystem is mounted. If the " +"password can be saved for future use a “Remember Password” checkbox will be present. This key sets the " +"default state of the checkbox." +msgstr "" +"ഒരു എന്‍ക്രിപ്റ്റ് ചെയ്ത ഡിവൈസ് അല്ലെങ്കില്‍ വിദൂര ഫയല്‍സിസ്റ്റം മൌണ്ട് ചെയ്യുമ്പോള്‍ ഷെല്‍ ഒരു രഹസ്യവാക്ക് ആവശ്യപ്പെടുന്നു. രഹസ്യവാക്ക് സൂക്ഷിയ്ക്കുവാന്‍ " +"സാധ്യമെങ്കില്‍, 'രഹസ്യവാക്ക് ഓര്‍ത്തു്വയ്ക്കുക' ചെക്ക്ബോക്സ് കാണാം. ഈ കീ ചെക്ക്ബോക്സിന്റെ സ്വതവേയുള്ള അവസ്ഥ സജ്ജമാക്കുന്നു." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "സ്വതേയുള്ള ബ്ലൂടൂത്ത് അഡാപ്റ്റര്‍ അതുമായി ബന്ധമുള്ള ഉപകരണങ്ങളുമായി സെറ്റപ്പ് ചെയ്തുവോ" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is powered, or if there were devices " +"set up associated with the default adapter. This will be reset if the default adapter is ever seen not to " +"have devices associated to it." +msgstr "" +"ബ്ലൂടൂത്ത് അഡാപ്റ്ററിന് വൈദ്യുതി ലഭിച്ചാല്‍ മാത്രമേ ഷെല്‍ ബ്ലൂടൂത്ത് മെനു പ്രദര്‍ശിപ്പിക്കുകയുള്ളു, അല്ലെങ്കില്‍ സ്വതേയുള്ള ബ്ലൂടൂത്ത് അഡാപ്റ്ററുമായി " +"ഉപകരണങ്ങള്‍ ബന്ധപ്പെടുത്തിയിരിക്കണം. ഇത് സ്വതേയുള്ള ബ്ലൂടൂത്ത് അഡാപ്റ്റര്‍ കാണുകയും അതുമായി ഉപകരണങ്ങള്‍ ബന്ധപ്പെടുത്തിയിട്ടില്ലെങ്കിലും റീസെറ്റ് " +"ചെയ്യും." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "പ്രയോഗത്തിന്റെ മെനു തുറക്കുന്നതിനുള്ള കീക്കൂട്ടം" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "പ്രയോഗത്തിന്റെ മെനു തുറക്കുന്നതിനുള്ള കീക്കൂട്ടം." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "\"പ്രയോഗങ്ങള്‍ കാണിയ്ക്കുക\" എന്ന കാഴ്ച തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "പ്രവര്‍ത്തികളുടെ അവലോകനത്തിന്റെ \"പ്രയോഗങ്ങള്‍ കാണിയ്ക്കുക\" എന്ന കാഴ്ച തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "പൊതുവായ അവലോകനം തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "പ്രയോഗങ്ങളുടെ പൊതുവായ അവലോകനം എന്ന കാഴ്ച തുറക്കുന്നതിനുള്ള കീബൈന്‍ഡിങ്." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "അറിയിപ്പ് പട്ടികയുടെ ദൃശ്യത ടൊഗ്ഗിള്‍ ചെയ്യുന്നതിനുള്ള കീക്കൂട്ടം" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "അറിയിപ്പ് പട്ടികയുടെ ദൃശ്യത ടൊഗ്ഗിള്‍ ചെയ്യുന്നതിനുള്ള കീക്കൂട്ടം." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "സജീവമായ അറിയിപ്പിനുള്ള കീബൈന്‍ഡിങ്" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "സജീവമായ അറിയിപ്പിനുള്ള കീബൈന്‍ഡിങ്." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "ഡീബഗ്ഗിംഗ് ആവശ്യങ്ങള്‍ക്കായി പ്രവര്‍ത്തിച്ചുകൊണ്ടിരിക്കുന്ന എല്ലാ ട്വീനുകളെയും നിറുത്തുകയോ തുടരുകയോ ചെയ്യാനുള്ള കീബന്ധനങ്ങള്‍" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "ഏതു് കീബോര്‍ഡ് ഉപയോഗിയ്ക്കണം" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "ഏതു് തരം കീബോര്‍ഡ് ഉപയോഗിയ്ക്കണം." + +#: data/org.gnome.shell.gschema.xml.in:158 data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "സ്വിച്ചറിനെ ഇപ്പോഴുള്ള പ്രവര്‍ത്തനസ്ഥലത്തുമാത്രമായി തടയുക." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are shown in the switcher. Otherwise, " +"all applications are included." +msgstr "" +"വില true എന്നാണെങ്കില്‍, ഇപ്പോഴുള്ള പ്രവര്‍ത്തനയിടത്തില്‍ ജാലകങ്ങളുള്ള ആപ്ലിക്കേഷനുകള്‍ മാത്രം സ്വിച്ചറില്‍ കാണിക്കുക. അല്ലെങ്കില്‍ എല്ലാ " +"ആപ്ലിക്കേഷനുകളും കാണിക്കും." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "പ്രയോഗത്തിന്റെ ഐക്കണ്‍ മോഡ്." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities are “thumbnail-only” (shows a " +"thumbnail of the window), “app-icon-only” (shows only the application icon) or “both”." +msgstr "" +"സ്വിച്ചറില്‍ ജാലകങ്ങള്‍ എങ്ങനെ കാണിയ്ക്കുന്നു എന്നു് ക്രമീകരിയ്ക്കുന്നു. ശരിയായ സാധ്യതകള്‍: 'thumbnail-only' (ജാലകത്തിന്റെ പ്രതിരൂപം " +"കാണിയ്ക്കുന്നു), 'app-icon-only' (പ്രയോഗത്തിന്റെ പ്രതിരൂപം കാണിയ്ക്കുന്നു) അല്ലെങ്കില്‍ 'both'." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. Otherwise, all windows are " +"included." +msgstr "" +"വില true എന്നാണെങ്കില്‍, ഇപ്പോഴുള്ള പ്രവര്‍ത്തനയിടത്തിലുള്ള ജാലകങ്ങള്‍ മാത്രം സ്വിച്ചറില്‍ കാണിക്കുക. അല്ലെങ്കില്‍ എല്ലാ ജാലകങ്ങളും കാണിക്കും." + +#: data/org.gnome.shell.gschema.xml.in:198 +msgid "Attach modal dialog to the parent window" +msgstr "പേരന്റ് ജാലകത്തിലേക്കു് ഡയലോഗ് ചേര്‍ക്കുക" + +#: data/org.gnome.shell.gschema.xml.in:199 data/org.gnome.shell.gschema.xml.in:208 +#: data/org.gnome.shell.gschema.xml.in:216 data/org.gnome.shell.gschema.xml.in:224 +#: data/org.gnome.shell.gschema.xml.in:232 +msgid "This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "ഗ്നോം ഷെല്‍ പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ org.gnome.mutter-ലുള്ള കീ ഈ കീ തിരുത്തിയെഴുതുന്നു." + +#: data/org.gnome.shell.gschema.xml.in:207 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "സ്ക്രീന്‍ കോണുകളില്‍ ജാലകങ്ങള്‍ എത്തിയ്ക്കുമ്പോള്‍ കോണ്‍ ചരിയ്ക്കുന്നതിനായി പ്രവര്‍ത്തന സജ്ജമാക്കുക" + +#: data/org.gnome.shell.gschema.xml.in:215 +msgid "Workspaces are managed dynamically" +msgstr "പണിയിടങ്ങള്‍ ഡയനാമിക്കായി കൈകാര്യം ചെയ്തിരിക്കുന്നു" + +#: data/org.gnome.shell.gschema.xml.in:223 +msgid "Workspaces only on primary monitor" +msgstr "പ്രധാന മോണിറ്ററില്‍ മാത്രം പണിയിടങ്ങള്‍" + +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "പോയന്ററിന്റെ ചലനം അവസാനിക്കുന്നതുവരെ മൗസ് മോഡില്‍ ഫോക്കസ് മാറുന്നത് തടയുക" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "നെറ്റ്​വര്‍ക്ക് ലോഗിന്‍" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:112 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s നുള്ള മുന്‍ഗണനാ ഡയലോഗ് ലഭ്യമാക്കുന്നതില്‍ പിശക്:" + +#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:62 js/ui/components/networkAgent.js:117 +#: js/ui/components/polkitAgent.js:153 js/ui/endSessionDialog.js:442 js/ui/extensionDownloader.js:197 +#: js/ui/shellMountOperation.js:345 js/ui/status/network.js:905 +msgid "Cancel" +msgstr "റദ്ദാക്കുക" + +#: js/gdm/authPrompt.js:166 js/gdm/authPrompt.js:209 js/gdm/authPrompt.js:441 +msgid "Next" +msgstr "അടുത്തത്" + +#: js/gdm/authPrompt.js:205 js/ui/shellMountOperation.js:349 js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "പൂട്ട് തുറക്കുക" + +#: js/gdm/authPrompt.js:207 +msgctxt "button" +msgid "Sign In" +msgstr "അകത്തുകയറുക" + +#: js/gdm/loginDialog.js:319 +msgid "Choose Session" +msgstr "സെഷന്‍ തെരഞ്ഞെടുക്കുക" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:462 +msgid "Not listed?" +msgstr "ലഭ്യമല്ലേ?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:891 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(e.g., ഉപയോക്താവു് അല്ലെങ്കില്‍ %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 js/ui/components/networkAgent.js:263 +#: js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "ഉപയോക്തൃ നാമം: " + +#: js/gdm/loginDialog.js:1234 +msgid "Login Window" +msgstr "പ്രവേശന ജാലകം" + +#: js/gdm/util.js:345 +msgid "Authentication error" +msgstr "തിരിച്ചറിയല്‍ പിശക്" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:485 +msgid "(or swipe finger)" +msgstr "(അല്ലെങ്കില്‍ ഫിംഗര്‍ സ്വൈപ്പ് ചെയ്യുക)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:97 +msgctxt "search-result" +msgid "Power Off" +msgstr "നിറുത്തുക" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:100 +msgid "power off;shutdown;reboot;restart" +msgstr "power off;shutdown;reboot;restart" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:104 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "സ്ക്രീൻ പൂട്ടുക" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:107 +msgid "lock screen" +msgstr "സ്ക്രീന്‍ പൂട്ടുക" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:111 +msgctxt "search-result" +msgid "Log Out" +msgstr "പുറത്തിറങ്ങുക" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:114 +msgid "logout;sign off" +msgstr "logout;sign off" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:118 +msgctxt "search-result" +msgid "Suspend" +msgstr "താത്കാലികമായി നിര്‍ത്തുക" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:121 +msgid "suspend;sleep" +msgstr "suspend;sleep" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:125 +msgctxt "search-result" +msgid "Switch User" +msgstr "ഉപയോക്താവിനെ മാറ്റുക" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:128 +msgid "switch user" +msgstr "ഉപയോക്താവിനെ മാറ്റുക" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:132 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "വിന്യാസം ബന്ധിക്കുക" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:135 +msgid "lock orientation;screen;rotation" +msgstr "lock orientation;screen;rotation" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "ആജ്ഞ കണ്ടില്ല" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "ആജ്ഞ പ്രാവര്‍ത്തികമാക്കാന്‍ സാധ്യമായില്ല:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "\"%s\" നടപ്പിലാക്കുന്നതില്‍ പരാജയപ്പെട്ടു :" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "ഇപ്പോള്‍ മാത്രം" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d മിനിറ്റ് മുന്‍പ്" +msgstr[1] "%d മിനിറ്റുകള്‍ക്ക് മുന്‍പ്" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d മണിക്കൂര്‍ മുന്‍പ്" +msgstr[1] "%d മണിക്കൂറുകള്‍ മുന്‍പ്" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "ഇന്നലെ" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d ദിവസം മുന്‍പ്" +msgstr[1] "%d ദിവസങ്ങള്‍ക്ക് മുന്‍പ്" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d ആഴ്ച മുന്‍പ്" +msgstr[1] "%d ആഴ്ചകള്‍ക്ക് മുന്‍പ്" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d മാസം മുമ്പ്" +msgstr[1] "%d മാസങ്ങള്‍ക്ക് മുമ്പ്" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d വര്‍ഷം മുമ്പ്" +msgstr[1] "%d വര്‍ഷങ്ങള്‍ക്കു മുമ്പ്" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "ഇന്നലെ, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "ഇന്നലെ, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:49 +msgid "Hotspot Login" +msgstr "ഹോട്സ്പോട്ട് ലോഗിന്‍" + +#: js/portalHelper/main.js:95 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other information you enter on this page " +"can be viewed by people nearby." +msgstr "ഈ ഹോട്സ്പോട്ടിലേക്ക് ലോഗിന്‍ ചെയ്യുന്നത് സുരക്ഷിതമല്ല. ഈ പേജില്‍ നിങ്ങള്‍ ചേര്‍ക്കുന്ന രഹസ്യവാക്ക് ചുറ്റുമുള്ളവര്‍ക്ക് കാണാം." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:46 js/ui/status/location.js:376 +msgid "Deny Access" +msgstr "അനുമതി റദ്ദാക്കുക" + +#: js/ui/accessDialog.js:47 js/ui/status/location.js:379 +msgid "Grant Access" +msgstr "അനുമതി നല്‍കുക" + +#: js/ui/appDisplay.js:790 +msgid "Frequently used applications will appear here" +msgstr "ഇടയ്ക്കിടയ്ക്ക് ഉപയോഗിക്കുന്ന പ്രയോഗങ്ങള്‍ ഇവിടെ പ്രത്യക്ഷമാകും" + +#: js/ui/appDisplay.js:911 +msgid "Frequent" +msgstr "ഇടയ്ക്കിടെ" + +#: js/ui/appDisplay.js:918 +msgid "All" +msgstr "എല്ലാം" + +#: js/ui/appDisplay.js:1887 +msgid "New Window" +msgstr "പുതിയ വിന്‍ഡോ" + +#: js/ui/appDisplay.js:1901 +msgid "Launch using Dedicated Graphics Card" +msgstr "ഇതിനായുള്ള ഗ്രാഫിക്ക്സ് കാര്‍ഡ് ഉപയോഗിച്ച് ലോഞ്ച് ചെയ്യുക" + +#: js/ui/appDisplay.js:1928 js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "ഇഷ്ടപ്പെട്ടവയില്‍ നിന്നും നീക്കം ചെയ്യുക" + +#: js/ui/appDisplay.js:1934 +msgid "Add to Favorites" +msgstr "ഇഷ്ടപ്പെട്ടവയിലേക്ക് ചേര്‍ക്കുക" + +#: js/ui/appDisplay.js:1944 +msgid "Show Details" +msgstr "വിവരങ്ങള്‍ കാണിക്കുക" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s നിങ്ങള്‍ക്കിഷ്ടപ്പെട്ടവയിലേക്ക് ചേര്‍ത്തിട്ടുണ്ട്." + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s നിങ്ങള്‍ക്കിഷ്ടപ്പെട്ടവയില്‍ നിന്നും നീക്കം ചെയ്തിട്ടുണ്ട്." + +#: js/ui/audioDeviceSelection.js:50 +msgid "Select Audio Device" +msgstr "ഡിവൈസിലേക്കു് ഫയലുകള്‍ അയയ്ക്കുക" + +#: js/ui/audioDeviceSelection.js:60 +msgid "Sound Settings" +msgstr "ശബ്ദത്തിന്റെ ക്രമീകരണങ്ങള്‍" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headphones" +msgstr "ഹെഡ്ഫോണ്‍സ്" + +#: js/ui/audioDeviceSelection.js:71 +msgid "Headset" +msgstr "ഹെഡ്സെറ്റ്" + +#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:255 +msgid "Microphone" +msgstr "മൈക്രോഫോണ്‍" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "പശ്ചാത്തലം മാറ്റുക…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:47 +msgid "Display Settings" +msgstr "ദൃശ്യക്രമീകരണങ്ങള്‍" + +#: js/ui/backgroundMenu.js:22 +msgid "Settings" +msgstr "സജ്ജീകരണങ്ങള്‍" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:44 +msgctxt "calendar-no-work" +msgid "06" +msgstr "[calender-no-work]06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:73 +msgctxt "grid sunday" +msgid "S" +msgstr "ഞാ" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:75 +msgctxt "grid monday" +msgid "M" +msgstr "തി" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:77 +msgctxt "grid tuesday" +msgid "T" +msgstr "ചൊ" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:79 +msgctxt "grid wednesday" +msgid "W" +msgstr "ബു" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:81 +msgctxt "grid thursday" +msgid "T" +msgstr "വ്യാ" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:83 +msgctxt "grid friday" +msgid "F" +msgstr "വെ" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:85 +msgctxt "grid saturday" +msgid "S" +msgstr "ശ" + +#. * +#. * 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:380 +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:390 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:447 +msgid "Previous month" +msgstr "കഴിഞ്ഞ മാസം" + +#: js/ui/calendar.js:457 +msgid "Next month" +msgstr "അടുത്ത മാസം" + +#: js/ui/calendar.js:610 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "[date day number format]%d" + +#: js/ui/calendar.js:665 +msgid "Week %V" +msgstr "ആഴ്ച %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:734 +msgctxt "event list time" +msgid "All Day" +msgstr "ദിനം മുഴുവനും" + +#: js/ui/calendar.js:869 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:873 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: js/ui/calendar.js:1103 +msgid "No Notifications" +msgstr "അറിയിപ്പുകളില്ല" + +#: js/ui/calendar.js:1106 +msgid "No Events" +msgstr "ഇവന്റുകളില്ല" + +#: js/ui/calendar.js:1134 +msgid "Clear All" +msgstr "എല്ലാം മായ്ക്കുക" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:50 +#, javascript-format +msgid "“%s” is not responding." +msgstr "\"%s\" പ്രതികരിക്കുന്നില്ല." + +#: js/ui/closeDialog.js:51 +msgid "You may choose to wait a short while for it to continue or force the application to quit entirely." +msgstr "" +"പ്രയോഗം പ്രവര്‍ത്തിച്ചു തുടങ്ങാന്‍ കുറച്ചു സമയം കൂടി കാത്തു നില്‍ക്കുകയോ അല്ലെങ്കില്‍ പ്രവര്‍ത്തനം നിര്‍ത്താന്‍ ഫോഴ്സ് ക്വിറ്റ് ചെയ്യുകയോ ചെയ്യാം." + +#: js/ui/closeDialog.js:67 +msgid "Force Quit" +msgstr "ഫോഴ്സ് ക്വിറ്റ്" + +#: js/ui/closeDialog.js:70 +msgid "Wait" +msgstr "കാത്തുനില്‍ക്കുക" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "പുറമേയുള്ള ഡ്രൈവ് ബന്ധിപ്പിച്ചു" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "പുറമേയുള്ള ഡ്രൈവ് വിച്ഛേദിച്ചു" + +#: js/ui/components/autorunManager.js:348 +#, javascript-format +msgid "Open with %s" +msgstr "%s ഉപയോഗിച്ചു തുറക്കുക" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 +msgid "Password:" +msgstr "രഹസ്യവാക്ക്:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "വീണ്ടും അമര്‍ത്തുക:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:229 js/ui/status/network.js:320 +#: js/ui/status/network.js:908 +msgid "Connect" +msgstr "കണക്ട് ചെയ്യുക" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "നിശബ്ദമാക്കുക: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "കീ: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "സ്വകാര്യ കീ രഹസ്യവാക്ക്: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "ഐഡന്റിറ്റി: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "സേവനം: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:688 +msgid "Authentication required by wireless network" +msgstr "വയര്‍ലെസ്സ് ശൃംഖല നിങ്ങളെ തിരിച്ചറിയണം" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:689 +#, javascript-format +msgid "Passwords or encryption keys are required to access the wireless network “%s”." +msgstr "വയര്‍ലെസ് നെറ്റ്‌വര്‍ക്ക് \"%s\" ലേക്ക് പ്രവേശിക്കുന്നതിനായി രഹസ്യവാക്കുകള്‍ അല്ലെങ്കില്‍ എന്‍ക്രിപ്ഷന്‍ കീകള്‍ ആവശ്യമുണ്ട്." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:692 +msgid "Wired 802.1X authentication" +msgstr "വയര്‍ഡ് 802.1X ആധികാരികത" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "നെറ്റ്​വര്‍ക്ക് പേര്: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:696 +msgid "DSL authentication" +msgstr "DSL ആധികാരികത ഉറപ്പാക്കല്‍" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:702 +msgid "PIN code required" +msgstr "PIN കോട് ആവശ്യമാണ്" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:703 +msgid "PIN code is needed for the mobile broadband device" +msgstr "മൊബൈല്‍ ബ്രോഡ്ബാന്‍ഡ് ഉപകരണത്തിന് പിന്‍ കോഡ് ആവശ്യമുണ്ടു്" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:709 +msgid "Mobile broadband network password" +msgstr "മൊബൈല്‍ ബ്രോഡ്ബാന്‍ഡ് നെറ്റ്‌വര്‍ക്കിനുള്ള രഹസ്യവാക്ക്" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:693 +#: js/ui/components/networkAgent.js:697 js/ui/components/networkAgent.js:710 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "\"%s\" ലേക്ക് കണക്റ്റ് ചെയ്യുന്നതിന് ഒരു രഹസ്യവാക്ക് ആവശ്യമുണ്ട്." + +#: js/ui/components/networkAgent.js:677 js/ui/status/network.js:1690 +msgid "Network Manager" +msgstr "നെറ്റ്‌വര്‍ക്ക് മാനേജര്‍" + +#: js/ui/components/polkitAgent.js:48 +msgid "Authentication Required" +msgstr "തിരിച്ചറിയണം" + +#: js/ui/components/polkitAgent.js:76 +msgid "Administrator" +msgstr "അഡ്മിനിസ്ട്രേറ്റര്‍" + +#: js/ui/components/polkitAgent.js:156 +msgid "Authenticate" +msgstr "തിരിച്ചറിയുക" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:329 +msgid "Sorry, that didn’t work. Please try again." +msgstr "ക്ഷമിക്കണം, അതു ശരിയല്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:795 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s ഇപ്പോള്‍ %s ആയിട്ടാണ് അറിയപ്പെടുന്നത്" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "ജാലകങ്ങള്‍" + +#: 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:444 +msgid "Dash" +msgstr "ഡാഷ്" + +#. 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:74 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "ലോക ഘടികാരം കൂട്ടിച്ചേര്‍ക്കുക…" + +#: js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "ലോക ഘടികാരം" + +#: js/ui/dateMenu.js:227 +msgid "Weather" +msgstr "കാലാവസ്ഥ" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:291 +#, javascript-format +msgid "%s all day." +msgstr "%s എല്ലാ ദിവസവും." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:297 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, എന്നിട്ട് %s ഒടുവില്‍." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:303 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, ഉടനെ %s, തുടര്‍ന്ന് %s ഒടുവില്‍." + +#: js/ui/dateMenu.js:314 +msgid "Select a location…" +msgstr "ഒരു പ്രദേശം സെലക്റ്റ് ചെയ്യുക…" + +#: js/ui/dateMenu.js:317 +msgid "Loading…" +msgstr "ലോഡിങ്ങ്…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:323 +#, javascript-format +msgid "Feels like %s." +msgstr "%s പോലെ തോന്നുന്നു." + +#: js/ui/dateMenu.js:326 +msgid "Go online for weather information" +msgstr "കാലാവസ്ഥ വിവരങ്ങള്‍ ലഭിക്കാന്‍ ഓണ്‍ലൈന്‍ ആകുക" + +#: js/ui/dateMenu.js:328 +msgid "Weather information is currently unavailable" +msgstr "കാലാവസ്ഥാ വിവരം നിലവില്‍ ലഭ്യമല്ല" + +#: js/ui/endSessionDialog.js:51 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s ല്‍ നിന്നു പുറത്ത് കടക്കുക" + +#: js/ui/endSessionDialog.js:52 +msgctxt "title" +msgid "Log Out" +msgstr "പുറത്ത് കടക്കുക" + +#: js/ui/endSessionDialog.js:54 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s %d നിമിഷത്തിനുള്ളില്‍ സ്വയമേ പുറത്ത് കടക്കുന്നതാണു്." +msgstr[1] "%s %d നിമിഷങ്ങള്‍ക്കുള്ളില്‍ സ്വയമേ പുറത്ത് കടക്കുന്നതാണു്." + +#: js/ui/endSessionDialog.js:59 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "നിങ്ങള്‍ %d നിമിഷത്തിനുള്ളില്‍ സ്വയമേ പുറത്ത് കടക്കുന്നതാണു്." +msgstr[1] "നിങ്ങള്‍ %d നിമിഷങ്ങള്‍ക്കുള്ളില്‍ സ്വയമേ പുറത്ത് കടക്കുന്നതാണു്." + +#: js/ui/endSessionDialog.js:65 +msgctxt "button" +msgid "Log Out" +msgstr "പുറത്ത് കടക്കുക" + +#: js/ui/endSessionDialog.js:71 +msgctxt "title" +msgid "Power Off" +msgstr "നിര്‍ത്തുക" + +#: js/ui/endSessionDialog.js:72 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്ത് പവര്‍ ഓഫ് ആക്കുക" + +#: js/ui/endSessionDialog.js:74 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "സിസ്റ്റം %d നിമിഷത്തിനുള്ളില്‍ സ്വയമേ ഓഫ് ചെയ്യപ്പെടുന്നതാണ്." +msgstr[1] "സിസ്റ്റം %d നിമിഷങ്ങള്‍ക്കുള്ളില്‍ സ്വയമേ ഓഫ് ചെയ്യപ്പെടുന്നതാണ്." + +#: js/ui/endSessionDialog.js:78 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "ബാക്കി ഉള്ള സോഫ്റ്റ്വെയര്‍ പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യുക" + +#: js/ui/endSessionDialog.js:81 js/ui/endSessionDialog.js:98 +msgctxt "button" +msgid "Restart" +msgstr "പുനരാരംഭിക്കൂ" + +#: js/ui/endSessionDialog.js:83 +msgctxt "button" +msgid "Power Off" +msgstr "നിര്‍ത്തുക" + +#: js/ui/endSessionDialog.js:90 +msgctxt "title" +msgid "Restart" +msgstr "പുനരാരംഭിക്കുക" + +#: js/ui/endSessionDialog.js:92 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "സിസ്റ്റം %d നിമിഷത്തിനുള്ളില്‍ സ്വയമേ വീണ്ടും ആരംഭിയ്ക്കുന്നു." +msgstr[1] "സിസ്റ്റം %d നിമിഷങ്ങള്‍ക്കുള്ളില്‍ സ്വയമേ വീണ്ടും ആരംഭിയ്ക്കുന്നു." + +#: js/ui/endSessionDialog.js:106 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "പുനരാരംഭിക്കവേ പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യുക" + +#: js/ui/endSessionDialog.js:108 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "The system will automatically restart and install updates in %d seconds." +msgstr[0] "സിസ്റ്റം %d നിമിഷത്തിനുള്ളില്‍ സ്വയമേ പുനരാരംഭിച്ച് പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യും." +msgstr[1] "സിസ്റ്റം %d നിമിഷങ്ങള്‍ക്കുള്ളില്‍ സ്വയമേ പുനരാരംഭിച്ച് പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യും." + +#: js/ui/endSessionDialog.js:114 js/ui/endSessionDialog.js:134 +msgctxt "button" +msgid "Restart & Install" +msgstr "പുനരാരംഭിക്കുക & ഇന്‍സ്റ്റാള്‍ ചെയ്യുക" + +#: js/ui/endSessionDialog.js:115 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ഇന്‍സ്റ്റാള്‍ ചെയ്യുക & പവര്‍ ഓഫ് ചെയ്യുക" + +#: js/ui/endSessionDialog.js:116 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റാളായ ശേഷം പവര്‍ ഓഫ് ചെയ്യുക" + +#: js/ui/endSessionDialog.js:124 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "പുനരാരംഭിക്കവേ പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യുക" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:129 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long time: ensure that you have " +"backed up and that the computer is plugged in." +msgstr "" +"%s %s റീസ്റ്റാര്‍ട്ടിനു ശേഷം ഇന്‍സ്റ്റാളാകും. ഈ ഇന്‍സ്റ്റാളേഷന്‍ ഒരുപാട് സമയം എടുത്തേക്കാം: നിങ്ങള്‍ ആവശ്യമുള്ള ബാക്ക് അപ്പ് എടുത്തു എന്നും " +"കമ്പ്യൂട്ടര്‍ പ്ലഗ്ഡ് ഇന്‍ ആണെന്നും ഉറപ്പാക്കുക." + +#: js/ui/endSessionDialog.js:321 +msgid "Running on battery power: please plug in before installing updates." +msgstr "ബാറ്ററി ശേഷിയിലാണ് പ്രവര്‍ത്തിക്കുന്നത്. പരിഷ്കരണങ്ങള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യുന്നതിനു മുന്നേ പ്ലഗ് ഇന്‍ ചെയ്യുക." + +#: js/ui/endSessionDialog.js:338 +msgid "Some applications are busy or have unsaved work." +msgstr "ചില പ്രയോഗങ്ങള്‍ തിരക്കിലാണ് അല്ലെങ്കില്‍ സംരക്ഷിക്കാത്ത വര്‍ക്ക് ഉണ്ട്." + +#: js/ui/endSessionDialog.js:345 +msgid "Other users are logged in." +msgstr "വേറേ ഉപയോക്താക്കള്‍ ലോഗിന്‍ ചെയ്തിട്ടുണ്ട്." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:626 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (വിദൂരം)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:629 +#, javascript-format +msgid "%s (console)" +msgstr "%s (കണ്‍സോള്‍)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "ഇന്‍സ്റ്റോള്‍" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "\"%s\" എന്നത് extenstions.gnome.org ല്‍ നിന്നും ഡൌണ്‍ലോഡ് ചെയ്ത് ഇന്‍സ്റ്റാള്‍ ചെയ്യണമോ ?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s കുറുക്കുവഴികള്‍ തടയാന്‍ ആഗ്രഹിക്കുന്നു" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "പ്രയോഗം കുറുക്കുവഴികള്‍ തടയാന്‍ ആഗ്രഹിക്കുന്നു" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "കുറുക്കുവഴികള്‍ പഴയപടിയാക്കാന്‍ %s അമര്‍ത്താം." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "നിഷേധിക്കുക" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "അനുവദിക്കുക" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned On" +msgstr "സ്ലോ കീകള്‍ പ്രവര്‍ത്തിപ്പിക്കുക" + +#: js/ui/kbdA11yDialog.js:34 +msgid "Slow Keys Turned Off" +msgstr "സ്ലോ കീകള്‍ പ്രവര്‍ത്തനരഹിതമാക്കുക" + +#: 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 "" +"താങ്കള്‍ ഷിഫ്റ്റ് കീ 8 സെക്കന്റ് അമര്‍ത്തിപ്പിടിച്ചു. ഇത് സ്ലോ കീകള്‍ക്കുള്ള കീകുറുക്കുവഴിയാണ്, ഇത് കീബോര്‍ഡ് പ്രവര്‍ത്തിക്കുന്നവിധത്തിനെ ബാധിക്കും." + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned On" +msgstr "സ്റ്റിക്കി കീകള്‍ പ്രവര്‍ത്തിപ്പിക്കുക" + +#: js/ui/kbdA11yDialog.js:43 +msgid "Sticky Keys Turned Off" +msgstr "സ്റ്റിക്കി കീകള്‍ പ്രവര്‍ത്തനരഹിതമാക്കുക" + +#: 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 "" +"താങ്കള്‍ ഷിഫ്റ്റ് കീ 5 പ്രാവശ്യം തുടര്‍ച്ചയായി അമര്‍ത്തി. ഇത് സ്റ്റിക്കി കീകള്‍ക്കുള്ള കീകുറുക്കുവഴിയാണ്, ഇത് കീബോര്‍ഡ് പ്രവര്‍ത്തിക്കുന്നവിധത്തിനെ " +"ബാധിക്കും." + +#: 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 "" +"താങ്കള്‍ രണ്ട് കീകള്‍ ഒരുമിച്ചോ, ഷിഫ്റ്റ് കീ 5പ്രാവശ്യം തുടര്‍ച്ചയായോ അമര്‍ത്തി. ഇത് സ്റ്റിക്കി കീ ഓഫാക്കാനുള്ള കീകുറുക്കുവഴിയാണ്, ഇത് കീബോര്‍ഡ് " +"പ്രവര്‍ത്തിക്കുന്നവിധത്തിനെ ബാധിക്കും." + +#: js/ui/kbdA11yDialog.js:59 +msgid "Leave On" +msgstr "ലീവ് ഓണ്‍" + +#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:138 js/ui/status/network.js:1280 +msgid "Turn On" +msgstr "ഓണ്‍ ചെയ്യുക" + +#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:138 js/ui/status/network.js:138 +#: js/ui/status/network.js:321 js/ui/status/network.js:1280 js/ui/status/network.js:1395 +#: js/ui/status/nightLight.js:43 js/ui/status/rfkill.js:85 js/ui/status/rfkill.js:112 +msgid "Turn Off" +msgstr "ഓഫ് ചെയ്യുക" + +#: js/ui/kbdA11yDialog.js:67 +msgid "Leave Off" +msgstr "ലീവ് ഓഫ്" + +#: js/ui/keyboard.js:198 +msgid "Region & Language Settings" +msgstr "സ്ഥലം, ഭാഷ സജ്ജീകരണങ്ങള്‍" + +#: js/ui/lookingGlass.js:644 +msgid "No extensions installed" +msgstr "ഒരു എക്സ്റ്റെന്‍ഷനും ഇന്‍സ്റ്റോള്‍ ചെയ്തിട്ടില്ല" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:698 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ഒരു പിശകും കാണിച്ചുട്ടില്ല." + +#: js/ui/lookingGlass.js:704 +msgid "Hide Errors" +msgstr "പിശകുകള്‍ മറച്ചുവെക്കുക" + +#: js/ui/lookingGlass.js:708 js/ui/lookingGlass.js:768 +msgid "Show Errors" +msgstr "പിശകുകള്‍ കാണിക്കുക" + +#: js/ui/lookingGlass.js:717 +msgid "Enabled" +msgstr "പ്രവര്‍ത്തനക്ഷമമാക്കി" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:720 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "പ്രവര്‍ത്തനരഹിതമാക്കി" + +#: js/ui/lookingGlass.js:722 +msgid "Error" +msgstr "പിശക്" + +#: js/ui/lookingGlass.js:724 +msgid "Out of date" +msgstr "തിയതി കഴിഞ്ഞത്" + +#: js/ui/lookingGlass.js:726 +msgid "Downloading" +msgstr "ഡൗണ്‍ലോട് ചെയ്യുന്നു" + +#: js/ui/lookingGlass.js:750 +msgid "View Source" +msgstr "സ്രോതസ്സ് കാണിക്കുക" + +#: js/ui/lookingGlass.js:759 +msgid "Web Page" +msgstr "വെബ് താള്‍" + +#: js/ui/messageTray.js:1495 +msgid "System Information" +msgstr "സിസ്റ്റത്തെക്കുറിച്ചുള്ള വിവരം" + +#: js/ui/mpris.js:185 +msgid "Unknown artist" +msgstr "അജ്ഞാതനായ ആര്‍ട്ടിസ്റ്റ്" + +#: js/ui/mpris.js:186 +msgid "Unknown title" +msgstr "അജ്ഞാതമായ ടൈറ്റില്‍" + +#: js/ui/osdWindow.js:32 js/ui/status/volume.js:204 +msgid "Volume" +msgstr "ഒച്ച" + +#: js/ui/overview.js:83 +msgid "Undo" +msgstr "വേണ്ട" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:112 +msgid "Overview" +msgstr "അവലോകനം" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:239 +msgid "Type to search…" +msgstr "തിരയുന്നതിനായി ഇവിടെ ടൈപ്പ് ചെയ്യുക…" + +#: js/ui/padOsd.js:107 +msgid "New shortcut…" +msgstr "പുതിയ കുറുക്കുവഴി…" + +#: js/ui/padOsd.js:158 +msgid "Application defined" +msgstr "പ്രയോഗങ്ങള്‍ നിര്‍വചിച്ചിരിക്കുന്നു" + +#: js/ui/padOsd.js:159 +msgid "Show on-screen help" +msgstr "on-screen സഹായം ദൃശ്യമാക്കുക" + +#: js/ui/padOsd.js:160 +msgid "Switch monitor" +msgstr "മോണിറ്റര്‍ മാറ്റുക" + +#: js/ui/padOsd.js:161 +msgid "Assign keystroke" +msgstr "കീസ്ട്രോക്ക് അസൈന്‍ ചെയ്യുക" + +#: js/ui/padOsd.js:228 +msgid "Done" +msgstr "തീര്‍ന്നു" + +#: js/ui/padOsd.js:744 +msgid "Edit…" +msgstr "തിരുത്തുക…" + +#: js/ui/padOsd.js:786 js/ui/padOsd.js:891 +msgid "None" +msgstr "ഒന്നുമില്ല" + +#: js/ui/padOsd.js:845 +msgid "Press a button to configure" +msgstr "കോണ്‍ഫിഗര്‍ ചെയ്യാന്‍ ഒരു ബട്ടണ്‍ അമര്‍ത്തുക" + +#: js/ui/padOsd.js:846 +msgid "Press Esc to exit" +msgstr "പുറത്തുകടക്കാന്‍ Esc അമര്‍ത്തുക" + +#: js/ui/padOsd.js:849 +msgid "Press any key to exit" +msgstr "പുറത്തു കടക്കാന്‍ ഏതെങ്കിലും കീ അമര്‍ത്തുക" + +#: js/ui/panel.js:359 +msgid "Quit" +msgstr "നിര്‍ത്തുക" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:415 +msgid "Activities" +msgstr "പ്രവര്‍ത്തനങ്ങള്‍" + +#: js/ui/panel.js:696 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "സിസ്റ്റം" + +#: js/ui/panel.js:820 +msgid "Top Bar" +msgstr "മുകളിലുള്ള ബാര്‍" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:300 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:74 +msgid "Enter a Command" +msgstr "ഒരു കമാന്‍ഡ് നല്‍കുക" + +#: js/ui/runDialog.js:114 js/ui/windowMenu.js:174 +msgid "Close" +msgstr "അടക്കുക" + +#: js/ui/runDialog.js:276 +msgid "Restart is not available on Wayland" +msgstr "വേയ്ലാന്‍ഡില്‍ പുനരാരംഭം എന്ന ഓപ്ഷന്‍ ലഭ്യമല്ല" + +#: js/ui/runDialog.js:281 +msgid "Restarting…" +msgstr "പുനരാരംഭിക്കുന്നു…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d പുതിയ സന്ദേശം" +msgstr[1] "%d പുതിയ സന്ദേശങ്ങള്‍" + +#: js/ui/screenShield.js:148 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d പുതിയ അറിയിപ്പു്" +msgstr[1] "%d പുതിയ അറിയിപ്പുകള്‍" + +#: js/ui/screenShield.js:451 js/ui/status/system.js:294 +msgid "Lock" +msgstr "പൂട്ടുക" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "ഗ്നോമിന് സ്ക്രീന്‍ പൂട്ടണം" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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:1309 +msgid "Unable to lock" +msgstr "പൂട്ടുവാന്‍ സാധ്യമല്ല" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1310 +msgid "Lock was blocked by an application" +msgstr "പൂട്ടുന്ന സംവിധാനം ഒരു പ്രയോഗം തടസ്സപ്പെടുത്തിയിരിയ്ക്കുന്നു" + +#: js/ui/search.js:660 +msgid "Searching…" +msgstr "തിരയുന്നു…" + +#: js/ui/search.js:662 +msgid "No results." +msgstr "ഫലങ്ങളില്ല." + +#: js/ui/search.js:786 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d കൂടുതല്‍" +msgstr[1] "%d കൂടുതല്‍" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "പകര്‍ത്തുക" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "ഒട്ടിയ്ക്കുക" + +#: js/ui/shellEntry.js:96 +msgid "Show Text" +msgstr "പദാവലി കാണിക്കുക" + +#: js/ui/shellEntry.js:98 +msgid "Hide Text" +msgstr "പദാവലി മറക്കുക" + +#: js/ui/shellMountOperation.js:316 +msgid "Password" +msgstr "രഹസ്യവാക്ക്" + +#: js/ui/shellMountOperation.js:337 +msgid "Remember Password" +msgstr "രഹസ്യവാക്ക് ഓര്‍ത്തു് വയ്ക്കുക" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "ആക്സസിബിളിറ്റി" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "വലുതാക്കുക" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "സ്ക്രീന്‍ റീഡര്‍" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "സ്ക്രീന്‍ കീബോര്‍ഡ്" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "വിഷ്വല്‍ അറിയിപ്പുകള്‍" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "സ്റ്റിക്കി കീകള്‍" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "സ്ലോ കീകള്‍" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "ബൌണ്‍സ് കീകള്‍" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "മൌസ് കീകള്‍" + +#: js/ui/status/accessibility.js:165 +msgid "High Contrast" +msgstr "ഹൈ കോണ്ട്രാസ്റ്റ്" + +#: js/ui/status/accessibility.js:200 +msgid "Large Text" +msgstr "വലുപ്പത്തിലുളള ടെകസ്റ്റിന്റെ ശൈലി" + +#: js/ui/status/bluetooth.js:43 +msgid "Bluetooth" +msgstr "ബ്ളുടൂത്ത്" + +#: js/ui/status/bluetooth.js:52 js/ui/status/network.js:600 +msgid "Bluetooth Settings" +msgstr "ബ്ളുടൂത്ത് ക്രമീകരണങ്ങള്‍" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:132 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d കണക്റ്റായി" +msgstr[1] "%d കണക്റ്റായി" + +#: js/ui/status/bluetooth.js:134 +msgid "Off" +msgstr "ഓഫ്​" + +#: js/ui/status/bluetooth.js:136 +msgid "On" +msgstr "ഓണ്‍" + +#: js/ui/status/brightness.js:41 +msgid "Brightness" +msgstr "തെളിച്ചം" + +#: js/ui/status/keyboard.js:781 +msgid "Keyboard" +msgstr "കീബോര്‍ഡ്" + +#: js/ui/status/keyboard.js:804 +msgid "Show Keyboard Layout" +msgstr "കീബോര്‍ഡ് വിന്യാസം കാണിയ്ക്കുക" + +#: js/ui/status/location.js:72 js/ui/status/location.js:180 +msgid "Location Enabled" +msgstr "ലൊക്കേഷന്‍ ഇനേബിള്‍ ചെയ്തു" + +#: js/ui/status/location.js:73 js/ui/status/location.js:181 +msgid "Disable" +msgstr "പ്രവര്‍ത്തനരഹിതമാക്കി" + +#: js/ui/status/location.js:74 +msgid "Privacy Settings" +msgstr "സ്വകാര്യതാ ക്രമീകരണങ്ങള്‍" + +#: js/ui/status/location.js:179 +msgid "Location In Use" +msgstr "ലൊക്കേഷന്‍ ഉപയോഗത്തിലാണ്" + +#: js/ui/status/location.js:183 +msgid "Location Disabled" +msgstr "ലൊക്കേഷന്‍ ഡിസേബിള്‍ ചെയ്തു" + +#: js/ui/status/location.js:184 +msgid "Enable" +msgstr "പ്രവര്‍ത്തനക്ഷമമാക്കി" + +#. Translators: %s is an application name +#: js/ui/status/location.js:369 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "%s ന് ലൊക്കേഷനിലേക്ക് അനുമതി നല്‍കണോ ?" + +#: js/ui/status/location.js:370 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "ലൊക്കേഷന്‍ അനുമതി എപ്പോള്‍ വേണമെങ്കിലും പ്രൈവസി ക്രമീകരണങ്ങളില്‍ നിന്ന് മാറ്റാവുന്നതാണ്." + +#: js/ui/status/network.js:74 +msgid "" +msgstr "<അജ്ഞാതം>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 js/ui/status/network.js:1309 +#, javascript-format +msgid "%s Off" +msgstr "%s ഓഫ്" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:430 +#, javascript-format +msgid "%s Connected" +msgstr "%s കണക്റ്റ് ചെയ്തു" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:435 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s കൈകാര്യം ചെയ്തിട്ടില്ലാത്തത്" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:438 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s വിച്ഛേദിക്കുന്നു" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:445 js/ui/status/network.js:1301 +#, javascript-format +msgid "%s Connecting" +msgstr "%s കണക്റ്റ് ചെയ്യുന്നു" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:448 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s തിരിച്ചറിയല്‍ ആവശ്യപ്പെടുന്നു" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:456 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s നുള്ള ഫേംവെയര്‍ ഇപ്പോള്‍ ലഭ്യമല്ല" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:460 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s ലഭ്യമല്ല" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:463 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s കണക്ഷന്‍ പരാജയപ്പെട്ടു" + +#: js/ui/status/network.js:479 +msgid "Wired Settings" +msgstr "വയേഡ് സെറ്റിങ്സ്" + +#: js/ui/status/network.js:521 +msgid "Mobile Broadband Settings" +msgstr "മൊബൈല്‍ ബ്രോഡ്ബാന്‍ഡ് ക്രമീകരണങ്ങള്‍" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:564 js/ui/status/network.js:1306 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s ഹാര്‍ഡ്‌വെയര്‍ പ്രവര്‍ത്തന രഹിതം" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:568 +#, javascript-format +msgid "%s Disabled" +msgstr "%s പ്രവര്‍ത്തനരഹിതമാക്കി" + +#: js/ui/status/network.js:608 +msgid "Connect to Internet" +msgstr "ഇന്റര്‍നെറ്റുമായി കണക്റ്റ് ചെയ്യുക" + +#: js/ui/status/network.js:802 +msgid "Airplane Mode is On" +msgstr "എയര്‍പ്ലെയിന്‍ മോഡ് ഓണ്‍ ആണ്" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "എയര്‍പ്ലെയിന്‍ മോഡ് ഓണ്‍ ആകവേ വൈ-ഫൈ പ്രവര്‍ത്തനരഹിതമാകും." + +#: js/ui/status/network.js:804 +msgid "Turn Off Airplane Mode" +msgstr "എര്‍പ്ലെയിന്‍ മോഡ് ഓഫ് ചെയ്യുക" + +#: js/ui/status/network.js:813 +msgid "Wi-Fi is Off" +msgstr "വൈ-ഫൈ ഓഫ് ആണ്" + +#: js/ui/status/network.js:814 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "നെറ്റ്വര്‍ക്കിലേക്ക് കണക്റ്റ് ചെയ്യാന്‍ വൈഫൈ ഓണ്‍ ചെയ്യുക." + +#: js/ui/status/network.js:815 +msgid "Turn On Wi-Fi" +msgstr "വൈഫൈ ഓണ്‍ ചെയ്യുക" + +#: js/ui/status/network.js:840 +msgid "Wi-Fi Networks" +msgstr "വൈഫൈ നെറ്റ്വര്‍ക്കുകള്‍" + +#: js/ui/status/network.js:842 +msgid "Select a network" +msgstr "നെറ്റ്വര്‍ക്ക് തിരഞ്ഞെടുക്കുക" + +#: js/ui/status/network.js:872 +msgid "No Networks" +msgstr "നെറ്റ്വര്‍ക്കുകളില്ല" + +#: js/ui/status/network.js:893 js/ui/status/rfkill.js:110 +msgid "Use hardware switch to turn off" +msgstr "നിര്‍ത്തുവാന്‍ ഹാര്‍ഡ്വെയര്‍ സ്വിച്ച് ഉപയോഗിക്കുക" + +#: js/ui/status/network.js:1172 +msgid "Select Network" +msgstr "നെറ്റ്വര്‍ക്ക് തിരഞ്ഞെടുക്കുക" + +#: js/ui/status/network.js:1178 +msgid "Wi-Fi Settings" +msgstr "വൈഫൈ സജ്ജീകരണങ്ങള്‍" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1297 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s ഹോട്സ്പോട്ട് ആക്റ്റീവ് ആയി" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1312 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s കണക്റ്റഡ് അല്ല" + +#: js/ui/status/network.js:1412 +msgid "connecting…" +msgstr "ബന്ധിപ്പിക്കുന്നു…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1415 +msgid "authentication required" +msgstr "ആധികാരികത ഉറപ്പ് വരുത്തല്‍ ആവശ്യമുണ്ട്" + +#: js/ui/status/network.js:1417 +msgid "connection failed" +msgstr "ബന്ധം പരാജയപ്പെട്ടു" + +#: js/ui/status/network.js:1471 +msgid "VPN Settings" +msgstr "വിപിഎന്‍ സജ്ജീകരണങ്ങള്‍" + +#: js/ui/status/network.js:1484 +msgid "VPN" +msgstr "വി പി എന്‍" + +#: js/ui/status/network.js:1494 +msgid "VPN Off" +msgstr "വിപിഎന്‍ ഓഫ്" + +#: js/ui/status/network.js:1558 js/ui/status/rfkill.js:88 +msgid "Network Settings" +msgstr "നെറ്റ്‌വര്‍ക്ക് സജ്ജീകരണങ്ങള്‍" + +#: js/ui/status/network.js:1587 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s വയേഡ് കണക്ഷന്‍" +msgstr[1] "%s വയേഡ് കണക്ഷനുകള്‍" + +#: js/ui/status/network.js:1591 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s വൈഫൈ കണക്ഷന്‍" +msgstr[1] "%s വൈഫൈ കണക്ഷനുകള്‍" + +#: js/ui/status/network.js:1595 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s മോഡം കണക്ഷന്‍" +msgstr[1] "%s മോഡം കണക്ഷനുകള്‍" + +#: js/ui/status/network.js:1727 +msgid "Connection failed" +msgstr "കണക്ഷന്‍ പരാജയപ്പെട്ടു" + +#: js/ui/status/network.js:1728 +msgid "Activation of network connection failed" +msgstr "നെറ്റ്‌വര്‍ക്ക് കണക്ഷന്‍ സജീവമാക്കല്‍ പരാജയപ്പെട്ടു" + +#: js/ui/status/nightLight.js:64 +msgid "Night Light Disabled" +msgstr "നൈറ്റ് ലൈറ്റ് പ്രവര്‍ത്തന രഹിതം" + +#: js/ui/status/nightLight.js:65 +msgid "Night Light On" +msgstr "നൈറ്റ് ലൈറ്റ് ഓണ്‍" + +#: js/ui/status/nightLight.js:66 +msgid "Resume" +msgstr "വീണ്ടും തുടങ്ങുക" + +#: js/ui/status/nightLight.js:67 +msgid "Disable Until Tomorrow" +msgstr "നാളെ വരെ പ്രവര്‍ത്തനരഹിതമാക്കുക" + +#: js/ui/status/power.js:52 +msgid "Power Settings" +msgstr "ഊര്‍ജ്ജ ക്രമീകരണങ്ങള്‍" + +#: js/ui/status/power.js:68 +msgid "Fully Charged" +msgstr "ചാര്‍ജ് നിറഞ്ഞിരിക്കുന്നു" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:75 js/ui/status/power.js:81 +msgid "Estimating…" +msgstr "കണക്കുകൂട്ടുന്നു…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d ബാക്കിയുണ്ട് (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:94 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d നിറയുന്നതുവരെ (%d %%)" + +#: js/ui/status/power.js:122 js/ui/status/power.js:124 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:46 +msgid "Screen is Being Shared" +msgstr "സ്ക്രീന്‍ പങ്കുവയ്ക്കപ്പെടുന്നു" + +#: js/ui/status/remoteAccess.js:48 +msgid "Turn off" +msgstr "ഓഫാക്കുക" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:83 +msgid "Airplane Mode On" +msgstr "വിമാനം മോഡ് ഓണ്‍ ചെയ്യുക" + +#: js/ui/status/system.js:227 +msgid "Switch User" +msgstr "ഉപയോക്താവിനെ മാറ്റുക" + +#: js/ui/status/system.js:239 +msgid "Log Out" +msgstr "പുറത്ത് കടക്കുക" + +#: js/ui/status/system.js:251 +msgid "Account Settings" +msgstr "അക്കൌണ്ട് ക്രമീകരണങ്ങള്‍" + +#: js/ui/status/system.js:279 +msgid "Orientation Lock" +msgstr "വിന്യാസ ബന്ധനം" + +#: js/ui/status/system.js:305 +msgid "Suspend" +msgstr "താത്കാലികമായി നിര്‍ത്തുക" + +#: js/ui/status/system.js:315 +msgid "Power Off" +msgstr "നിര്‍ത്തുക" + +#: js/ui/status/thunderbolt.js:268 +msgid "Thunderbolt" +msgstr "തണ്ടര്‍ബോള്‍ട്ട്" + +#. we are done +#: js/ui/status/thunderbolt.js:324 +msgid "Unknown Thunderbolt device" +msgstr "അറിയില്ലാത്ത തണ്ടര്‍ബോള്‍ട്ട് ഉപകരണം" + +#: js/ui/status/thunderbolt.js:325 +msgid "" +"New device has been detected while you were away. Please disconnect and reconnect the device to start using " +"it." +msgstr "" +"താങ്കള്‍ സ്ഥലത്തില്ലാത്തപ്പോള്‍ പുതിയ ഉപകരണം ബന്ധിപ്പിച്ചിരിക്കുന്നു. ഉപകരണം ഉപയോഗിക്കുന്നതിന് വിച്ഛേദിക്കുകയും പുനര്‍ബന്ധിപ്പിക്കുയും ചെയ്യുക." + +#: js/ui/status/thunderbolt.js:330 +msgid "Thunderbolt authorization error" +msgstr "തണ്ടര്‍ബോള്‍ട്ട് സാധുതാ പിഴവ്" + +#: js/ui/status/thunderbolt.js:331 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "തണ്ടര്‍ബോള്‍ട്ട് ഉപകരണത്തിന് സാധുതനല്‍കാന്‍ കഴിഞ്ഞില്ല: %s" + +#: js/ui/status/volume.js:135 +msgid "Volume changed" +msgstr "ഒച്ച മാറ്റി" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "മിറര്‍" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "ഡിസ്പ്ലേകള്‍ ചേര്‍ക്കുക" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "പുറമേ മാത്രം" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "ഉള്ളിലേത് മാത്രം" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "മറ്റൊരു ഉപയോക്താവായി പ്രവേശിയ്ക്കുക" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "ജാലകത്തിന്റെ പൂട്ടു തുറക്കുക" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "പ്രയോഗങ്ങള്‍" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "തിരയല്‍" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "\"%s\" തയ്യാറാണ്" + +#: js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "ഈ ദൃശ്യക്രമീകരണം സൂക്ഷിക്കണോ ?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:75 +msgid "Revert Settings" +msgstr "ക്രമീകരണങ്ങള്‍ തിരിച്ചാക്കുക" + +#: js/ui/windowManager.js:78 +msgid "Keep Changes" +msgstr "മാറ്റങ്ങള്‍ സംരക്ഷിക്കുക" + +#: js/ui/windowManager.js:96 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "ക്രമീകരണങ്ങള്‍ %d സെക്കന്‍ഡില്‍ തിരിച്ചാകും" +msgstr[1] "ക്രമീകരണങ്ങള്‍ %d സെക്കന്‍ഡുകളില്‍ തിരിച്ചാകും" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:681 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "ചെറുതാക്കുക" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "പരമാവധി ആക്കാതിരിക്കുക" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "പരമാവധി ആക്കുക" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "നീക്കുക" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "വലിപ്പം മാറ്റുക" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "ടൈറ്റില്‍ ബാര്‍ സ്ക്രീനില്‍ നീക്കുക" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "എപ്പോഴും മുകളില്‍" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "എപ്പോഴും ദൃശ്യമായ പണിയിടത്തില്‍ ഉണ്ടാകുക" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "പണിയിടം ഇടത്തേക്ക് നീക്കുക" + +#: js/ui/windowMenu.js:109 +msgid "Move to Workspace Right" +msgstr "പണിയിടം വലത്തേക്ക് നീക്കുക" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "പണിയിടം മുകളിലേക്ക് നീക്കുക" + +#: js/ui/windowMenu.js:121 +msgid "Move to Workspace Down" +msgstr "പണിയിടം താഴേക്ക് നീക്കുക" + +#: js/ui/windowMenu.js:139 +msgid "Move to Monitor Up" +msgstr "മോണിറ്ററിന്റെ മുകള്‍ഭാഗത്തേക്ക് നീക്കുക" + +#: js/ui/windowMenu.js:148 +msgid "Move to Monitor Down" +msgstr "മോണിറ്ററിന്റെ താഴ്ഭാഗത്തേക്ക് നീക്കുക" + +#: js/ui/windowMenu.js:157 +msgid "Move to Monitor Left" +msgstr "മോണിറ്ററിന്റെ ഇടത്തേക്ക് നീക്കുക" + +#: js/ui/windowMenu.js:166 +msgid "Move to Monitor Right" +msgstr "മോണിറ്ററിന്റെ വലത്തേക്ക് നീക്കുക" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "ഇവല്യൂഷന്‍ കലണ്ടര്‍" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:410 +msgid "Print version" +msgstr "പ്രിന്റ് ചെയ്യുവാന്‍ സാധിയ്ക്കുന്ന പതിപ്പു്" + +#: src/main.c:416 +msgid "Mode used by GDM for login screen" +msgstr "പ്രവേശന സ്ക്രീനില്‍ ജിഡിഎം ഉപയോഗിയ്ക്കുന്ന മോഡ്" + +#: src/main.c:422 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "ഒരു പ്രത്യേക മോഡ് ഉപയോഗിയ്ക്കുക, ഉദാ. പ്രവേശന സ്ക്രീനിന് gdm" + +#: src/main.c:428 +msgid "List possible modes" +msgstr "സാധ്യമായ മോഡുകള്‍ ലഭ്യമാക്കുക" + +#: src/shell-app.c:272 +msgctxt "program" +msgid "Unknown" +msgstr "അജ്ഞാതം" + +#: src/shell-app.c:523 +#, c-format +msgid "Failed to launch “%s”" +msgstr "\"%s\" ലഭ്യമാക്കുന്നതില്‍ പരാജയം" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "രഹസ്യവാക്കുകള്‍ സമാനമല്ല." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "രഹസ്യവാക്ക് കാലിയാകുവാന്‍ പാടില്ല" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "ഉപയോക്താവു് ആധികാരികത ഉറപ്പാക്കല്‍ ഡയലോഗ് നിര്‍ത്തുന്നു" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u ഔട്ട്പുട്ട്" +msgstr[1] "%u ഔട്ട്പുട്ടുകള്‍" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ഇന്‍പുട്ട്" +msgstr[1] "%u ഇന്‍പുട്ടുകള്‍" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +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 "Screenshots" +#~ msgstr "സ്ക്രീന്‍ഷോട്ടുകള്‍" + +#~ msgid "Record a screencast" +#~ msgstr "ഒരു സ്ക്രീന്‍കാസ്റ്റ് റിക്കോര്‍ഡ് ചെയ്യുക" + +#~ msgid "Show the message tray" +#~ msgstr "സന്ദേശത്തിന്റെ ട്രേ കാണിയ്ക്കുക" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷന്‍ മുന്‍ഗണനകള്‍" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "പ്രയോഗങ്ങളുടെ ഉപയോഗത്തെപ്പറ്റിയുള്ള സ്ഥിതിവിവരക്കണക്കുകള്‍ ശേഖരിയ്ക്കണമോ എന്നു്" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the most used ones (e.g. in " +#~ "launchers). While this data will be kept private, you may want to disable this for privacy reasons. " +#~ "Please note that doing so won't remove already saved data." +#~ msgstr "" +#~ "ഏറ്റവും കൂടുതല്‍ തവണ ഉപയോഗിയ്ക്കുന്ന പ്രയോഗങ്ങള്‍ ലഭ്യമാക്കുന്നതിനായി ഷെല്‍ സാധാരണയായി സജീവമായ പ്രയോഗങ്ങളെ നിരീക്ഷിയ്ക്കുന്നു. " +#~ "(ഉദാഹരണത്തിനു്, ലോഞ്ചേര്‍സ്). ഈ ഡേറ്റാ സ്വകാര്യമായി സൂക്ഷിയ്ക്കുന്നെങ്കിലും, ചില കാരണങ്ങളാല്‍ ഇതു് പ്രവര്‍ത്തന രഹിതമാക്കേണ്ടതുണ്ടു്. ഇങ്ങനെ " +#~ "ചെയ്യുന്നതു് നിങ്ങള്‍ സൂക്ഷിച്ച ഡേറ്റയെ ബാധിയ്ക്കുന്നതല്ല." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "ഫോള്‍ഡറുകളായി കാണിയ്ക്കേണ്ട വിഭാഗങ്ങളുടെ പട്ടിക" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the application view, rather than being " +#~ "displayed inline in the main view." +#~ msgstr "" +#~ "ഈ പട്ടികയിലുള്ള ഓരോ വിഭാഗത്തിന്റെ പേരും, പ്രധാന കാഴ്ചയില്‍ ഓരോ വരിയായി കാണിയ്ക്കുന്നതിനു് പകരം പ്രയോഗങ്ങളുടെ കാഴ്ചയില്‍ ഫോള്‍" +#~ "ഡറായി കാണിയ്ക്കുന്നു. " + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. The value here is from the " +#~ "TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "ഉപയോക്താവു് സജ്ജമാക്കിയ അവസാന ഐഎം ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം TpConnectionPresenceType " +#~ "തരത്തിലുള്ളതാകുന്നു." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. The value here is from the " +#~ "GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "ഉപയോക്താവിനുള്ള അവസാന സെഷന്‍ അവസ്ഥ ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം GsmPresenceStatus തരത്തിലുള്ളതാകുന്നു." + +#~ msgid "Show the week date in the calendar" +#~ msgstr "കലണ്ടറിലുള്ള ആഴ്ച തീയിതി കാണിയ്ക്കുക" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "true എങ്കില്‍, കലണ്ടറില്‍ ഐഎസ്ഒ ആഴ്ച തീയതി കാണിയ്ക്കുക." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ ടൊഗ്ഗിള്‍ ചെയ്യുന്നതിനുള്ള കീക്കൂട്ടം" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "ബിള്‍ട്ടിന്‍ സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ തുടങ്ങുവാന്‍/നിര്‍ത്തുന്നതിനുള്ള കീക്കൂട്ടം." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "സ്ക്രീന്‍കാസ്റ്റുകള്‍ റിക്കോര്‍ഡ് ചെയ്യുന്നതിനുള്ള ഫ്രെയിം റേറ്റ്." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-" +#~ "second." +#~ msgstr "" +#~ "ഗ്നോം ഷെല്ലിന്റെ സ്ക്രീന്‍കാസ്റ്റ് റിക്കോര്‍ഡര്‍ റീക്കോര്‍ഡ് ചെയ്തിട്ടുള്ള സ്ക്രീന്‍കാസ്റ്റിന്റെ ഫ്രെയിംറേറ്റ്, ഒരു സെക്കന്‍ഡില്‍ ഒരു ഫ്രെയിം." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "സ്ക്രീന്‍കാസ്റ്റ് എന്‍കോഡ് ചെയ്യുന്നതിനുള്ള gstreamer പൈപ്പ്‌ലൈന്‍" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The " +#~ "pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have " +#~ "a unconnected source pad; output from that pad will be written into the output file. However the pipeline " +#~ "can also take care of its own output - this might be used to send the output to an icecast server via " +#~ "shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is " +#~ "currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! " +#~ "webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal " +#~ "thread count on the system." +#~ msgstr "" +#~ "റിക്കോര്‍ഡിങുകള്‍ എന്‍കോഡ് ചെയ്യുന്നതിനായി GStreamer പൈപ്പ് ലൈന്‍ ഉപയോഗിയ്ക്കുന്നു. gst-launch-നുള്ള സിന്റാക്സ് ഉപയോഗിയ്ക്കുന്നു. " +#~ "കാലിയായി സജ്ജമാക്കുമ്പോള്‍ കാലിയാകുന്നു.ഇതു് നിലവില്‍ 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 " +#~ "deadline=1000000 threads=%T ! queue ! webmmux' ആകുന്നുസ WEBM VP8 കോഡ് ഉപയോഗിച്ചു് റിക്കോര്‍ഡ് ചെയ്യുന്നു." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "സ്ക്രീന്‍കാസ്റ്റ് സൂക്ഷിയ്ക്കുന്നതിനുള്ള ഫയല്‍ എക്സ്റ്റെന്‍ഷന്‍" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on the current date, and use this " +#~ "extension. It should be changed when recording to a different container format." +#~ msgstr "" +#~ "റിക്കോര്‍ഡ് ചെയ്ത സ്ക്രീന്‍കാസ്റ്റുകള്‍ക്കുള്ള ഫയല്‍നാമം നിലവിലുള്ള തീയതി, എക്സ്റ്റെന്‍ഷന്‍ എന്നിവ അനുസരിച്ചാകുന്നു. മറ്റൊരു ശൈലിയിലേക്കു് റിക്കോര്‍" +#~ "ഡ് ചെയ്യുമ്പോള്‍ ഇതു് മാറ്റണം." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "തലക്കെട്ടിനുള്ള ബാറില്‍ ബട്ടണുകളുടെ ക്രമീകരണം" + +#~ msgid "This key overrides the key in org.gnome.desktop.wm.preferences when running GNOME Shell." +#~ msgstr "ഗ്നോം ഷെല്‍ പ്രവര്‍ത്തിയ്ക്കുമ്പോള്‍ org.gnome.desktop.wm.preferences-ലുള്ള കീ ഈ കീ തിരുത്തിയെഴുതുന്നു." + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "മുകളിലുള്ള കോമ്പോ ബോക്സ് ഉപയോഗിച്ചു് ക്രമീകരിയ്ക്കുന്നതിനുള്ളൊരു എക്സ്റ്റെന്‍ഷന്‍ തെര‍ഞ്ഞെടുക്കുക." + +#~ msgid "Session…" +#~ msgstr "പ്രവര്‍ത്തനവേള..." + +#~ msgid "Power" +#~ msgstr "ഓഫ്" + +#~ msgid "Restart" +#~ msgstr "പുനരാരംഭിക്കുക" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "ഞാ" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "തി" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "ചൊ" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "ബു" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "വ്യാ" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "വെ" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "ശ" + +#~ msgid "Nothing Scheduled" +#~ msgstr "ഒന്നും ക്രമീകരിച്ചിട്ടില്ല" + +#~ msgid "Today" +#~ msgstr "ഇന്നു്" + +#~ msgid "Tomorrow" +#~ msgstr "നാളെ" + +#~ msgid "This week" +#~ msgstr "ഈ ആഴ്ച" + +#~ msgid "Next week" +#~ msgstr "അടുത്ത ആഴ്ച" + +#~ msgid "Removable Devices" +#~ msgstr "നീക്കം ചെയ്യാവുന്ന ഡിവൈസുകള്‍" + +#~ msgid "Eject" +#~ msgstr "പുറന്തള്ളുക" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d-ല്‍ നിന്നുള്ള സ്ക്രീന്‍കാസ്റ്റ്, %t-ല്‍" + +#~ msgid "Invitation" +#~ msgstr "ക്ഷണം" + +#~ msgid "Call" +#~ msgstr "വിളിക്കുക" + +#~ msgid "File Transfer" +#~ msgstr "ഫയല്‍ നീക്കുക" + +#~ msgid "Chat" +#~ msgstr "സല്ലാപം" + +#~ msgid "Unmute" +#~ msgstr "ശബ്ദം നിര്‍ത്തുക" + +#~ msgid "Mute" +#~ msgstr "നിശബ്ദമാക്കുക" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Invitation to %s" +#~ msgstr "%s ലേക്കുള്ള ക്ഷണം" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s നിങ്ങളെ %sഇലേക്കു ചേരാന്‍ ക്ഷണിക്കുന്നുണ്ട്" + +#~ msgid "Decline" +#~ msgstr "നിരസിക്കുക" + +#~ msgid "Accept" +#~ msgstr "സ്വീകരിക്കുക" + +#~ msgid "Video call from %s" +#~ msgstr "%s-ല്‍ നിന്നുള്ള വീഡിയോ കോള്‍" + +#~ msgid "Call from %s" +#~ msgstr "%s-ല്‍ നിന്നുള്ള കോള്‍" + +#~ msgid "Answer" +#~ msgstr "എടുക്കുക" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s നിങ്ങള്‍ക്കു് %s അയച്ചിരിയ്ക്കുന്നു" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "നിങ്ങള്‍ ഓണ്‍ലൈന്‍ ആകുമ്പോള്‍ കാണുന്നതിനുള്ള അനുമതി %s-നു് ആവശ്യമുണ്ടു്" + +#~ msgid "Authentication failed" +#~ msgstr "തിരിച്ചറിയല്‍ പ്രക്രിയ പരാജയപ്പെട്ടു" + +#~ msgid "Encryption error" +#~ msgstr "എന്‍ക്രിപ്ഷനില്‍ പിശകു്" + +#~ msgid "Certificate not provided" +#~ msgstr "സാക്ഷ്യപത്രം നല്‍കിയില്ല" + +#~ msgid "Certificate untrusted" +#~ msgstr "സാക്ഷ്യംപത്രം വിശ്വാസമില്ലാത്തു്" + +#~ msgid "Certificate expired" +#~ msgstr "സാക്ഷ്യപത്രം കാലാവധി തീര്‍ന്നതു്" + +#~ msgid "Certificate not activated" +#~ msgstr "സാക്ഷ്യപത്രം സജീകമാക്കാത്തതു്" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "സാക്ഷ്യപത്രത്തിലെ ഹോസ്റ്റിന്റെ പേരു് പൊരുത്തമില്ല" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "സാക്ഷ്യപത്രത്തിലെ ഒപ്പു് പൊരുത്തമില്ല" + +#~ msgid "Certificate self-signed" +#~ msgstr "സാക്ഷ്യപത്രം സ്വയം ഒപ്പിട്ടതാണു്" + +#~ msgid "Status is set to offline" +#~ msgstr "അവസ്ഥ ഓഫ്‌ലൈന്‍ ആയി സജ്ജമാക്കിയിരിയ്ക്കുന്നു" + +#~ msgid "Certificate is invalid" +#~ msgstr "സാക്ഷ്യപത്രം തെറ്റാണു്" + +#~ msgid "Connection has been refused" +#~ msgstr "കണക്ഷന്‍ നിഷേധിച്ചിരിയ്ക്കുന്നു" + +#~ msgid "Connection can't be established" +#~ msgstr "കണക്ഷന്‍ സ്ഥാപിയ്ക്കുവാന്‍ സാധ്യമല്ല" + +#~ msgid "Connection has been lost" +#~ msgstr "കണക്ഷന്‍ നഷ്ടമായിരിയ്ക്കുന്നു" + +#~ msgid "This account is already connected to the server" +#~ msgstr "ഈ അക്കൌണ്ട് നിലവില്‍ സര്‍വറിലേക്കു് കണക്ട് ചെയ്തിരിയ്ക്കുന്നു" + +#~ msgid "Connection has been replaced by a new connection using the same resource" +#~ msgstr "അതേ ശ്രോതസ്സ് ഉപയോഗിച്ചു് ഒരു പുതിയ കണക്ഷന്‍ ഉപയോഗിച്ചു് ഈ കണക്ഷന്‍ മാറ്റിസ്ഥാപിയ്ക്കുന്നു" + +#~ msgid "The account already exists on the server" +#~ msgstr "അക്കൌണ്ട് സര്‍വറില്‍ നിലവിലുണ്ടു്" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "കണക്ഷന്‍ കൈകാര്യം ചെയ്യുന്നതിനായി സര്‍വറിനു് സാധ്യമല്ല, തിരക്കിലാണു്" + +#~ msgid "Certificate has been revoked" +#~ msgstr "സമ്മതപത്രം വീണ്ടും ആവശ്യപ്പെട്ടിരിയ്ക്കുന്നു" + +#~ msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "സമ്മതപത്രം സുരക്ഷിതമല്ലാത്തൊരു സിഫര്‍ ആല്‍ഗോരിഥം ഉപയോഗിയ്ക്കുന്നു അല്ലെങ്കില്‍ ഉചിതമല്ല" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server certificate chain, exceed the limits " +#~ "imposed by the cryptography library" +#~ msgstr "സര്‍വറിന്റെ സമ്മതപത്രത്തിന്റെ വ്യാപ്തി, അല്ലെങ്കില്‍ സര്‍വര്‍ സമ്മതപത്ര ചെയിന്റെ വ്യാപ്തി, എന്നിവ പരിധിയില്‍ കൂടുന്നു" + +#~ msgid "Internal error" +#~ msgstr "ആന്തരിക പിശക്" + +#~ msgid "Unable to connect to %s" +#~ msgstr "%s -ലേക്ക് കണക്ട് ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#~ msgid "View account" +#~ msgstr "അക്കൌണ്ട് കാണുക" + +#~ msgid "Open Calendar" +#~ msgstr "കലണ്ടര്‍ തുറക്കുക" + +#~ msgid "Date & Time Settings" +#~ msgstr "തീയതി, സമയ ക്രമീകരണങ്ങള്‍" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പുറത്തു കടക്കുക ക്ലിക്ക് ചെയ്തു് സിസ്റ്റത്തില്‍ നിന്നും പുറത്തു് കടക്കുക." + +#~ msgid "Logging out of the system." +#~ msgstr "സിസ്റ്റത്തില്‍ നിന്നു പുറത്തു കടക്കുന്നു." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പവര്‍ ഓഫ് ചെയ്യുക ക്ലിക്ക് ചെയ്തു സിസ്റ്റിന്റെ പവര്‍ ഓഫ് ചെയ്യുക." + +#~ msgid "Powering off the system." +#~ msgstr "സിസ്റ്റത്തിന്റെ പവര്‍ ഓഫ് ചെയ്യുന്നു." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "ഈ പ്രയോഗങ്ങള്‍ നിറുത്തി സിസ്റ്റം പുനരാരംഭിക്കുവാന്‍ പുനരാരംഭിക്കൂ അമര്‍ത്തുക" + +#~ msgid "Restarting the system." +#~ msgstr "സിസ്റ്റം പുനരാരംഭിക്കുന്നു." + +#~ msgid "Remove" +#~ msgstr "നീക്കം ചെയ്യുക" + +#~ msgid "Clear Messages" +#~ msgstr "സന്ദേശങ്ങള്‍ വെടിപ്പാക്കുക" + +#~ msgid "Notification Settings" +#~ msgstr "അറിയിപ്പു് ക്രമീകരണങ്ങള്‍" + +#~ msgid "No Messages" +#~ msgstr "സന്ദേശങ്ങളില്ല" + +#~ msgid "Message Tray" +#~ msgstr "സന്ദേശത്തിന്റെ ട്രേ" + +#~ msgid "Universal Access Settings" +#~ msgstr "സാര്‍വ്വജനികലഭ്യതാ സജ്ജീകരണങ്ങള്‍" + +#~ msgid "Visibility" +#~ msgstr "കാഴ്ച" + +#~ msgid "Set Up a New Device…" +#~ msgstr "പുതിയൊരു ഡിവൈസ് സജ്ജമാക്കുക..." + +#~ msgid "Send Files…" +#~ msgstr "ഫയലുകള്‍ അയയ്ക്കുക..." + +#~ msgid "Keyboard Settings" +#~ msgstr "കീബോര്‍ഡ് ക്രമീകരണങ്ങള്‍" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s-ല്‍ നിന്നുള്ള ആധികാരികത ഉറപ്പാക്കല്‍ ആവശ്യം" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "%s ഉപകരണത്തിനു് '%s' സേവനത്തിനുള്ള അനുവാദം ആവശ്യമുണ്ടു്." + +#~ msgid "Grant this time only" +#~ msgstr "ഇത്തവണ മാത്രം " + +#~ msgid "Reject" +#~ msgstr "നിരസിക്കു" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s-നുള്ള ജോടി ഉറപ്പിക്കല്‍" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "%s ഉപകരണത്തിനു് ഈ കമ്പ്യൂട്ടറുമായി ജോടി ചേരണം" + +#~ msgid "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgstr "PIN '%06d' ഉപകരണത്തിലുള്ളതുമായി ചേരുന്നു എന്നു് ദയവായി ഉറപ്പാക്കുക." + +#~ msgid "Matches" +#~ msgstr "ചേ‌ര്‍ച്ചകള്‍" + +#~ msgid "Does not match" +#~ msgstr "ചേരുന്നില്ല" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s-നുള്ള ജോടി ആവശ്യപ്പെടുന്നു" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "ഉപകരണത്തില്‍ പറഞ്ഞിരിക്കുന്ന പിന്‍ ദയവായി നല്‍കുക." + +#~ msgid "OK" +#~ msgstr "ശരി" + +#~ msgid "Volume, network, battery" +#~ msgstr "വോള്യം, നെറ്റ്‌വര്‍ക്ക്, ബാട്ടറി" + +#~ msgid "disabled" +#~ msgstr "പ്രവര്‍ത്തനരഹിതമാക്കി" + +#~ msgid "cable unplugged" +#~ msgstr "കേബിള്‍ ഊരി" + +#~ msgid "unavailable" +#~ msgstr "ലഭ്യമല്ല" + +#~ msgid "More…" +#~ msgstr "കൂടുതല്‍..." + +#~ msgid "Connected (private)" +#~ msgstr "കണക്ട് ചെയ്തിരിയ്ക്കുന്നു (സ്വകാര്യം)" + +#~ msgid "Wired" +#~ msgstr "വയര്‍ഡ്" + +#~ msgid "Auto Ethernet" +#~ msgstr "ഓട്ടോ ഇഥര്‍നെറ്റ്" + +#~ msgid "Auto broadband" +#~ msgstr "ഓട്ടോ ബ്രോഡ്ബാന്‍ഡ്" + +#~ msgid "Auto dial-up" +#~ msgstr "ഓട്ടോ ഡയല്‍-അപ്പ്" + +#~ msgid "Auto %s" +#~ msgstr "ഓട്ടോ %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "ഓട്ടോ ബ്ലൂടൂത്" + +#~ msgid "Auto wireless" +#~ msgstr "ഓട്ടോ വയര്‍ലെസ്സ് " + +#~ msgid "Wi-Fi" +#~ msgstr "വയര്‍ലസ്സ്" + +#~ msgid "Battery" +#~ msgstr "ബാറ്ററി" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d മണിക്കൂര്‍ ബാക്കി" +#~ msgstr[1] "%d മണിക്കൂറുകള്‍ ബാക്കി" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s ബാക്കിയുണ്ട്" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "മണിക്കൂര്‍" +#~ msgstr[1] "മണിക്കൂറുകള്‍" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "മിനുട്ട്" +#~ msgstr[1] "മിനുട്ടുകള്‍" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d മിനുട്ട് ബാക്കി" +#~ msgstr[1] "%d മിനുട്ടുകള്‍ ബാക്കി" + +#~ msgid "AC Adapter" +#~ msgstr "എസി അഡാപ്റ്റര്‍" + +#~ msgid "Laptop Battery" +#~ msgstr "ലാപ്പ്‌ടോപ്പ് ബാറ്ററി" + +#~ msgid "UPS" +#~ msgstr "യുപിഎസ്" + +#~ msgid "Monitor" +#~ msgstr "മോണിറ്റര്‍" + +#~ msgid "Mouse" +#~ msgstr "മൗസ്" + +#~ msgid "PDA" +#~ msgstr "പിഡിഎ" + +#~ msgid "Cell Phone" +#~ msgstr "സെല്‍ ഫോണ്‍" + +#~ msgid "Media Player" +#~ msgstr "മീഡിയ പ്ലേയര്‍" + +#~ msgid "Tablet" +#~ msgstr "ടാബ്‌ലെറ്റ്" + +#~ msgid "Computer" +#~ msgstr "കമ്പ്യൂട്ടര്‍" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "അജ്ഞാതം" + +#~ msgid "Available" +#~ msgstr "ലഭ്യമാണ്" + +#~ msgid "Busy" +#~ msgstr "തിരക്കിലാണ്" + +#~ msgid "Invisible" +#~ msgstr "അദൃശ്യം" + +#~ msgid "Away" +#~ msgstr "വിദൂരെയാണ്" + +#~ msgid "Idle" +#~ msgstr "പ്രവര്‍ത്തനത്തിലല്ല" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "നിങ്ങളുടെ ചാറ്റ് അവസ്ഥ - തിരക്കില്‍" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online status has been adjusted to let " +#~ "others know that you might not see their messages." +#~ msgstr "" +#~ "ചാറ്റ് സന്ദേശങ്ങള്‍ എന്ന പോലെ അറിയിപ്പുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുന്നു. മറ്റുള്ളവരുടെ ചാറ്റ് സന്ദേശങ്ങള്‍ നിങ്ങള്‍ക്കു് കാണുവാന്‍ സാധ്യമല്ല എന്നു് " +#~ "നിങ്ങളുടെ ഓണ്‍ലൈന്‍ അവസ്ഥയില്‍ വ്യക്തമാക്കുന്നു." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "അടച്ചുപൂട്ടുന്നത് അവരുടെ സൂക്ഷിക്കാത്ത ജോലികള്‍ നഷ്ട്ടപ്പെടുത്താം." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "ക്ഷമിയ്ക്കണം, ഇന്നത്തേക്കു് ഒന്നും ലഭ്യമല്ല:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s എന്ന ഒറക്കിള്‍ പറയുന്നു" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "അകത്തുകയറുക" + +#~ msgid "tray" +#~ msgstr "ട്രേ" + +#~ msgid "More..." +#~ msgstr "കൂടുതല്‍..." + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "APPLICATIONS" +#~ msgstr "പ്രയോഗങ്ങള്‍" + +#~ msgid "SETTINGS" +#~ msgstr "ക്രമീകരണങ്ങള്‍" + +#~ msgid "Subscription request" +#~ msgstr "വരിക്കാരനാകാനുള്ള അപേക്ഷ" + +#~ msgid "Sent at %X on %A" +#~ msgstr "%X-നു് %A-ല്‍ അയച്ചിരിയ്ക്കുന്നു" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "%A, %B %d, %Y-നു് അയച്ചിരിയ്ക്കുന്നു" + +#~ msgid "Connection to %s failed" +#~ msgstr "%s-ലേക്കുള്ള കണക്ഷന്‍ പരാജയപ്പെട്ടു" + +#~ msgid "Reconnect" +#~ msgstr "വീണ്ടും കണക്ട് ചെയ്യുക" + +#~ msgid "Browse Files..." +#~ msgstr "ഫയലുകള്‍ നോക്കുക..." + +#~ msgid "Error browsing device" +#~ msgstr "ബ്രൌസ് ചെയ്യുന്ന ഡിവൈസില്‍ പിശക്" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "ആവശ്യപ്പെട്ട ഡിവൈസ് തെരയുവാന്‍ സാധ്യമല്ല, പിശക് '%s'" + +#~ msgid "Wireless" +#~ msgstr "വയര്‍ലെസ്സ്" + +#~ msgid "VPN Connections" +#~ msgstr "VPN കണക്ഷനുകള്‍" + +#~ msgid "System Settings" +#~ msgstr "സിസ്റ്റം ക്രമീകരണങ്ങള്‍" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "നിങ്ങള്‍ക്കു് ഇഷ്ടമുള്ള ഈസ്റ്റര്‍ മുട്ട" + +#~ msgid "United Kingdom" +#~ msgstr "യുണൈറ്റഡ് കിങ്ഡം" + +#~ msgid "Default" +#~ msgstr "സഹജം" + +#, fuzzy +#~ msgid "disabled OpenSearch providers" +#~ msgstr "OpenSearch വെബ്സൈറ്റ് ചേര്‍ക്കുക" + +#~ msgid "Show time with seconds" +#~ msgstr "സമയം സെക്കന്റ് ഉള്‍പ്പെടെ കാണിക്കുക" + +#, fuzzy +#~ msgid "If true, display seconds in time." +#~ msgstr "ശരി (ട്രൂ) എങ്കില്‍, സെക്കന്‍ഡുകളും സമയത്തില് കാണിക്കുക." + +#~ msgid "Show date in clock" +#~ msgstr "ഘടികാരത്തില്‍ തിയതി കാണിക്കുക" + +#, fuzzy +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "ശരി (ട്രൂ) എങ്കില്‍,ഘടികാരത്തില്‍ സമയത്തിനു പുറമെ തീയതിയും കാണിക്കുക" + +#, fuzzy +#~ msgid "CONTACTS" +#~ msgstr "വിലാസങ്ങള്‍" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#, fuzzy +#~ msgid "Failed to unmount '%s'" +#~ msgstr "%V അണ്‍മൌണ്ടു് ചെയ്യാന്‍ കഴിഞ്ഞില്ല." + +#~ msgid "Retry" +#~ msgstr "വിണ്ടും ശ്രമിക്കുക" + +#, fuzzy +#~ msgid "Connect to..." +#~ msgstr "സര്‍വറിലേക്കു് കണക്ടു് ചെയ്യുക" + +#, fuzzy +#~ msgid "PLACES & DEVICES" +#~ msgstr "ഹാര്‍ഡ്‍വയര്‍ ഡിവൈസുകള്‍" + +#~ msgid "Wrong password, please try again" +#~ msgstr "തെറ്റായ രഹസ്യവാക്ക്, വീണ്ടും ശ്രമിക്കുക" + +#, fuzzy +#~ msgid "%s is online." +#~ msgstr "ബട്ടണ്‍ ഓണ്‍ലൈന്‍ ആണു്" + +#, fuzzy +#~ msgid "%s is offline." +#~ msgstr "റിപ്പോസിറ്ററി ഓഫ് ലൈന്‍ ആണ്" + +#~ msgid "%s is away." +#~ msgstr "%s ദൂരെയാണ്." + +#~ msgid "%s is busy." +#~ msgstr "%s തിരക്കിലാണ്." + +#~ msgid "Hidden" +#~ msgstr "മറഞ്ഞ" + +#~ msgid "Power Off..." +#~ msgstr "നിര്‍ത്തുക..." + +#, fuzzy +#~ msgid "Online Accounts" +#~ msgstr "അക്കൌണ്ടുകളുടെ പട്ടിക" + +#~ msgid "Log Out..." +#~ msgstr "പുറത്ത് കടക്കുക..." + +#~ msgid "Home" +#~ msgstr "വീട്" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Custom format of the clock" +#~ msgstr "ഘടികാരത്തിന്റെ പ്രത്യേക ശൈലി" + +#~ msgid "Hour format" +#~ msgstr "മണിക്കുര്‍ ശൈലി" + +#~ msgid "Clock Preferences" +#~ msgstr "ഘടികാര മുന്‍ഗണനകള്‍" + +#~ msgid "Preferences" +#~ msgstr "മുന്‍ഗണനകള്‍" + +#~ msgid "Search your computer" +#~ msgstr "നിങ്ങളുടെ കമ്പ്യൂട്ടര്‍ തിരയുക" + +#~ msgid "Home Folder" +#~ msgstr "ആസ്ഥാന ഫോള്‍ഡര്‍" diff --git a/po/mr.po b/po/mr.po new file mode 100644 index 0000000..a119c09 --- /dev/null +++ b/po/mr.po @@ -0,0 +1,2455 @@ +# translation of mr.po to Marathi +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Sandeep Shedmake , 2011, 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: mr\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-15 07:36+0000\n" +"PO-Revision-Date: 2014-09-16 10:06+0530\n" +"Last-Translator: Sandeep Shedmake \n" +"Language-Team: Marathi \n" +"Language: mr\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: Lokalize 1.5\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "प्रणाली" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "संदेश ट्रे दाखवा" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "सक्रीय सूचनावर फोकस करा" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "पूर्वावलोकन दाखवा" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "सर्व ॲप्लिकेशन्स दाखवा" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "ॲप्लिकेशन मेन्यु उघडा" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME शेल" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "पटल व्यवस्थापन व ॲप्लिकेशन सुरू करणे" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME शेल एक्सटेंशन पसंती" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME शेल एक्सटेंशन्स् संरचीत करा" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME शेल (वेलँड कम्पोजिटर)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Alt-F2 पासून डेव्लपर्स् व चाचणीकर्त्यांसाठी आंतरिक साधणे सुरू करा" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "आंतरिक डिबगिंग व Alt-F2 संवादचा वापर करून निंयत्रणकरीता प्रवेश देतो." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +#| msgid "Uuids of extensions to enable" +msgid "UUIDs of extensions to enable" +msgstr "सुरू करण्याजोगी एक्सटेंशन्स्चे UUIDs" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +#| msgid "" +#| "GNOME Shell extensions have a uuid property; this key lists extensions " +#| "which should be loaded. Any extension that wants to be loaded needs to be " +#| "in this list. You can also manipulate this list with the EnableExtension " +#| "and DisableExtension DBus methods on org.gnome.Shell." +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME शेल एक्सटेंशन्सकडे UUID गुणधर्म असते; हि कि एक्सटेंशन्स दाखवते ज्यास " +"लोड करणे आवश्यक " +"आहे. लोड करण्याजोगी कोणत्याहि एक्सटेंशला सूचीमध्ये समाविष्टीत असणे आवश्यक " +"आहे. org.gnome.Shell वरील " +"EnableExtension व DisableExtension D-Bus मेथड्ससह या सूचीमध्ये बदल करणे शक्य " +"आहे." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "एक्सटेंशन आवृत्ती सहत्वताची वैधता बंद करते" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME शेल फक्त एक्सटेंशन्स लोड करेल जे सध्याच्या आवृत्तीला समर्थन पुरवते. या " +"पर्यायला सुरू केल्याने या तपासाला बंद करेल आणि सर्व एक्सटेंशन्स लोड करायचा " +"प्रयत्न करेल समर्थनजोगी आवृत्ती असेल किंवा नसेल." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "पसंतीच्या ॲप्लिकेशन्स् करीता डेस्कटॉप फाइल IDs ची सूची" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "या आइडेंटिफायर्स् सह परस्पर ॲप्लिकेशन्स् पसंतीचे कक्षात दाखवले जाईल." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "ॲप पिकर अवलोकन" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "ॲप्लिकेशन पिकरमधील आत्ता पसंत केलेल्या अवलोकनचे इंडेक्स." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "आदेश (Alt-F2) संवादकरीता इतिहास" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "लूकिंग ग्लास संवादकरीता इतिहास" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +#| msgid "Always show the 'Log out' menuitem in the user menu." +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "नेहमी वापरकर्ता मेन्युमध्ये 'बाहेर पडा' मेन्यु घटक दाखवा." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +#| msgid "" +#| "This key overrides the automatic hiding of the 'Log out' menuitem in " +#| "single-user, single-session situations." +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"हि कि एकमेव-वापरकर्ता, एक-सत्र घटनांमध्ये 'बाहेर पडा' मेन्युघटकाला स्व छुपे " +"करणे ओव्हरराइड करतो." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"एनक्रिप्टेड किंवा रिमोट फाइलसिस्टम माउंट करण्यासाठी पासवर्ड लक्षात ठेवायचे " +"किंवा नाही" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"एनक्रिप्टेड साधन किंवा रिमोट फाइलसिस्टम माउंट केल्यानंतर शेल पासवर्डकरीता " +"विनंती करेल. " +"पासवर्डला भविष्यातील वापरकरीता साठवायचे असल्यास 'पासवर्ड लक्षात ठेवा' " +"चेकबॉक्सचा वापर " +"करा. हि कि चेकबॉक्सचे पूर्वनिर्धारित स्तर ठरवते." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "दिनदर्शिकामध्ये सप्ताह दिनांक दाखवा" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "खरे असल्यास, दिनदर्शिकमध्ये ISO सप्ताह दिनांक दाखवा." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "ॲप्लिकेशन मेन्यु उघडण्यासाठी किबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "ॲप्लिकेशन मेन्यु उघडण्यासाठी किबाइंडिंग." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"ॲप्लिकेशन्स दाखवा\" दृष्य उघडण्यासाठी किबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "क्रिया अवलोकनचे \"ॲप्लिकेशन्स दाखवा\" दृष्य उघडण्यासाठी किबाइंडिंग." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +#| msgid "Keybinding to open the \"Show Applications\" view" +msgid "Keybinding to open the overview" +msgstr "पूर्वावलोकन उघडण्यासाठी किबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +#| msgid "Keybinding to open the \"Show Applications\" view" +msgid "Keybinding to open the Activities Overview." +msgstr "कृती पूर्वावलोकन उघडण्यासाठी किबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "संदेश ट्रेचे अवलोकन बदलण्यासाठी वापरण्याजोगी किबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "संदेश ट्रेचे अवलोकन बदलण्यासाठी वापरण्याजोगी किबाइंडिंग." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "सक्रीय सूचनावर फोकस करण्यासाठी किबाइंडिंग" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "सक्रीय सूचनावर फोकस करण्यासाठी किबाइंडिंग." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"किबाइंडिंग जी थांबते आणि पुन्हा कार्यरत ट्विन्स सक्रीय करते, डिबगिंग कारणास्तव" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "कुठले किबोर्ड वापरायचे" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "वापरण्याजोगी किबोर्डचे प्रकार." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "आत्ताच्या कार्यक्षेत्रकरिता लिमिट स्विचर." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"खरे असल्यास, फक्त आत्ताच्या कार्यक्षेत्रवरील पटलांच्या ॲप्लिकेसन्सना स्वीचर " +"मध्ये दाखवले जाते. नाहीतर, सर्व ॲप्लिकेशन्स समाविष्ट केले जातील." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "ॲप्लिकेशन चिन्ह मोड." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"स्विचरमध्ये पटल कसे दाखवले जातात ते संरचीत करते. वैध पर्याय 'फक्त थंबनेल' " +"(पटलाचे थंबनेल " +"दाखवते), 'फक्त-ॲप-चिन्ह' (फक्त ॲप्लिकेशन चिन्ह दाखवते) किंवा 'दोंही'." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"खरे असल्यास, फक्त आत्ताच्या कार्यक्षेत्रवरील पटलांना स्वीचरमध्ये दाखवले जाते. " +"नाहीतर, सर्व पटल समाविष्ट केले जातात." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "पॅरेंट पटलाला मोडल संवाद जोडा" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "GNOME शेल चालवतेवेळी हि कि org.gnome.mutter मधील कि खोडून पुनः लिहते." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "स्क्रीन एड्जेसवर पटलांना वगळतेवेळी एड्ज टाइलिंग सुरू करा" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "वर्कस्पेसेस्ना गतियरित्या व्यवस्थापीत केले जाते" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "फक्त प्रारंभिक मॉनिटरवरील वर्कस्पेसेस" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "पाँटरची हालचाल बंद होईपर्यंत माउस मोडमधील फोकस बदलावमध्ये विलंब करा" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "कॅप्टिव्ह पोर्टल" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s करीता पसंती संवाद लोड करतेवेळी त्रुटी आढळली:" + +#: ../js/extensionPrefs/main.js:155 +#| msgid "Configure GNOME Shell Extensions" +msgid "GNOME Shell Extensions" +msgstr "GNOME शेल एक्सटेंशन्स" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "रद्द करा" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "पुढील" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "कुलूपबंद अशक्य करा" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "प्रवेश करा" + +#: ../js/gdm/loginDialog.js:269 +#| msgid "Switch Session" +msgid "Choose Session" +msgstr "सत्र पसंत करा" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "सूचीत नाही?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(उ.दा., वापरकर्ता किंवा %s)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "वापरकर्तानाव: " + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "प्रवेश पटल" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "ओळखपटवतेवेळी त्रुटी" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(किंवा बोट फिरवा)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "आदेश आढळले नाही" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "आदेश वाचणे अशक्य:" + +#: ../js/misc/util.js:156 +#, javascript-format +#| msgid "Execution of '%s' failed:" +msgid "Execution of “%s” failed:" +msgstr "“%s” चालवणे अपयशी:" + +#: ../js/portalHelper/main.js:85 +#| msgid "Authentication Required" +msgid "Web Authentication Redirect" +msgstr "वेबवरील ओळख पटवणे पुन्हा निर्देशीत केले" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "नेहमी वापरण्याजोगी ॲप्लिकेशन्स येथे आढळेल" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "वारंवारता" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "सर्व" + +#: ../js/ui/appDisplay.js:1789 +msgid "New Window" +msgstr "नविन पटल" + +#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "पंसतीतून काढून टाका" + +#: ../js/ui/appDisplay.js:1821 +msgid "Add to Favorites" +msgstr "पसंतीमध्ये समाविष्ट करा" + +#: ../js/ui/appDisplay.js:1830 +#| msgid "Show Text" +msgid "Show Details" +msgstr "तपशील दाखवा" + +#: ../js/ui/appFavorites.js:124 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ला पसंतीमध्ये समाविष्ट केले आहे." + +#: ../js/ui/appFavorites.js:158 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s ला पसंतीतून काढून टाकले." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "सेटिंग्ज" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "पार्श्वभूमी बदला…" + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "सर्व दिवस" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "Su" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "M" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "T" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "W" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "Th" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "F" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "मागील महिना" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "पुढील महिना" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "काहीच वेळपत्रानुरूप नाही" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "आज" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "उद्या" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "हा सप्ताह" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "पुढचा सप्ताह" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "बाहेरिल ड्राइव्ह जोडा" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "बाहेरील ड्राइव्ह खंडीत केले" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "काढूनटाकण्याजोगी साधने" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s सह उघडा" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "बाहेर काढा" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "पासवर्ड:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "पुनः टाइप करा:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "जोडणी करा" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "पासवर्ड: " + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "कि: " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "आइडेंटिटि: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "प्राइव्हेट कि पासवर्ड: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "सर्व्हिस: " + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "वायरलेस नेटवर्कतर्फे आवश्यक ओळखपटवणे" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +#| msgid "" +#| "Passwords or encryption keys are required to access the wireless network " +#| "'%s'." +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"वायरलेस नेटवर्क “%s” करिता प्रवेश प्राप्त करण्यासाठी पासवर्डज किंवा " +"एनक्रिप्शन किज आवश्यक आहे." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "वायर्ड 802.1X ओळखपटवणे" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "नेटवर्क नाव: " + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL ओळख पटवणे" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "PIN कोड आवश्यक" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "मोबाइल ब्रॉडबँड साधनकरीता PIN कोड आवश्यक आहे" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "मोबाईल ब्रॉडबँड नेटवर्क पासवर्ड" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +#| msgid "A password is required to connect to '%s'." +msgid "A password is required to connect to “%s”." +msgstr "“%s” सह जोडणीकरिता पासवर्ड आवश्यक आहे." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "ओळख पटवणे आवश्यक" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "प्रशासक" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "ओळख पटवा" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "माफ करा, ते कार्य करू शकले नाही. कृपया पुनःप्रयत्न करा." + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "आमंत्रण" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "कॉल" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "फाइल स्थानांतरन" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "गप्पा" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "बंद करणे अशक्य करा" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "बंद करा" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +#| msgid "Yesterday, %H:%M" +msgid "Yesterday, %H∶%M" +msgstr "काल, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +#| msgid "%A, %B %d" +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +#| msgctxt "event list time" +#| msgid "%l:%M %p" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "काल, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +#| msgid "%a %l:%M %p" +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +#| msgid "%a %b %e, %l:%M %p" +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +#| msgid "%a %b %e, %l:%M %p" +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s ला %s म्हणून ओळखले जाते" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s करीता आमंत्रण" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s तुम्हाला %s सह जोडणीकरीता आमंत्रण देत आहे" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "नकारा" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "स्वीकारा" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s पासून व्हिडीओ कॉल्स्" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s पासून कॉल" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "उत्तर" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s तुम्हाला %s पाठवत आहे" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "ऑनलाइन असल्यावर %s परवानगी दृष्यास्पद करायची" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "नेटवर्क त्रुटी" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "ओळख पटवणे अपयशी" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "एंक्रिप्शन त्रुटी" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "प्रमाणपत्र पुरवले नाही" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "प्रमाणपत्र अविश्वासर्ह आहे" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "प्रमाणपत्राची वेळसमाप्ति" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "प्रमाणपत्र सुरू केले नाही" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "प्रमाणपत्र यजमाननाव जुळत नाही" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "प्रमाणपत्र फिंग्ररप्रिंट जुळत नाही" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "प्रमाणपत्र स्वयं स्वाक्षरि" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "स्थिती ऑफलाइनकरीता ठरवली आहे" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "एंक्रिप्शन अनुपलब्ध" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "प्रमाणपत्र अवैध आहे" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "जोडणी नकारली गेली" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "जोडणी स्थापीत करणे अशक्य" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "जोडणी खंडीत झाली" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "हे खाते आधिपासूनच सर्व्हरसह जुळले आहे" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "समान स्रोतचा वापर करून जोडणीला नविन जोडणीसह बदलाबदल केले आहे" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "खाते आधिपासूनच सर्व्हरवर अस्तित्वात आहे" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "जोडणी हाताळण्यासाठी सर्व्हर सध्या खूप व्यस्थ आहे" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "प्रमाणपत्र रद्द केले" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"प्रमाणपत्र असुरक्षित सिफर अल्गोरिदमचा वापर करते किंवा क्रिप्टोग्राफिकरित्या " +"खूप कमजोर आहे" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"सर्व्हर प्रमाणपत्राची लांबी, किंवा सर्व्हर प्रमाणपत्र चैनचे गांभीर्य, " +"क्रिप्टोग्राफि " +"लाइब्ररितर्फे लादलेल्या मर्यादापेक्षा जास्त आहे" + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "आंतरिक त्रुटी" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s सह जोडणी अशक्य" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "खाते दृष्य" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "अपरिचीत कारण" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "पटल" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "ॲप्लिकेशन्स् दाखवा" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "डॅश" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "दिनदर्शिका उघडा" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "क्लॉक्स उघडा" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "दिनांक व वेळ सेटिंग्ज" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s पासून बाहेर पडा" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "बाहेर पडा" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s स्वयं, %d सेकंदात बाहेर पडेल." +msgstr[1] "%s स्वयं, %d सेकंदात बाहेर पडेल." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "%d सेकंदात तुम्ही स्वयं बाहेर पडाल." +msgstr[1] "%d सेकंदात तुम्ही स्वयं बाहेर पडाल." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "बाहेर पडा" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "बंद करा" + +#: ../js/ui/endSessionDialog.js:85 +#| msgid "Install Updates & Restart" +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "अद्यावत इंस्टॉल करा आणि बंद करा" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "प्रणाली स्वयं %d सेकंदात बंद होईल." +msgstr[1] "प्रणाली स्वयं %d सेकंदात बंद होईल." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "उर्वरित सॉफ्टवेअर अद्यावत इंस्टॉल करा" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "पुनः सुरू करा" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "बंद करा" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "पुनः सुरू करा" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "प्रणाली स्वयं %d सेकंदात पुनः सुरू होईल." +msgstr[1] "प्रणाली स्वयं %d सेकंदामध्ये पुनः सुरू होईल" + +#: ../js/ui/endSessionDialog.js:119 +#| msgid "Install Updates & Restart" +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "पुन्हा सुरू करा आणि अद्यावत इंस्टॉल करा" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +#| msgid "The system will restart automatically in %d second." +#| msgid_plural "The system will restart automatically in %d seconds." +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"प्रणाली स्व पुन्हा सुरू होईल आणि %d सेकंदमध्ये अद्यावत इंस्टॉल करेल." +msgstr[1] "" +"प्रणाली स्व पुन्हा सुरू होईल आणि %d सेकंदमध्ये अद्यावत इंस्टॉल करेल." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "पुन्हा सुरू करा & इंस्टॉल करा" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "इंस्टॉल & बंद करा" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "अद्यावत इंस्टॉल झाल्यानंतर बंद करा" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "बॅटरी पावरवर सुरू आहे: अद्यावत इंस्टॉल करण्यापूर्वी कृपया प्लग इन करा." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "काही ॲप्लिकेशन्स व्यस्थ असतात किंवा काही न साठवलेली कार्य असतात." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "इतर वापरकर्त्यांनी प्रवेश केला आहे." + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (रिमोट)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (कंसोल)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "प्रतिष्ठापीत करा" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +#| msgid "Download and install '%s' from extensions.gnome.org?" +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org पासून “%s” डाउनलोड आणि इंस्टॉल करायचे?" + +#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "कळफलक" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "एक्सटेंशन्स् प्रतिष्ठापीत केले नाही" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ने कोणत्याहि त्रुटी दाखवले नाही." + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "त्रुटी लपवा" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "त्रुटी दाखवा" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "सुरू केले" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "बंद केले" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "त्रुटी" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "जुणे झाले" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "डाऊनलोड करत आहे" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "स्त्रोत पहा" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "वेब पृष्ठ" + +#: ../js/ui/messageTray.js:1326 +msgid "Open" +msgstr "उघडा" + +#: ../js/ui/messageTray.js:1333 +msgid "Remove" +msgstr "काढून टाका" + +#: ../js/ui/messageTray.js:1630 +msgid "Notifications" +msgstr "सूचना" + +#: ../js/ui/messageTray.js:1637 +msgid "Clear Messages" +msgstr "संदेश नष्ट करा" + +#: ../js/ui/messageTray.js:1656 +msgid "Notification Settings" +msgstr "सूचना सेटिंग्ज" + +#: ../js/ui/messageTray.js:1709 +msgid "Tray Menu" +msgstr "ट्रे मेन्यु" + +#: ../js/ui/messageTray.js:1926 +msgid "No Messages" +msgstr "संदेश नाही" + +#: ../js/ui/messageTray.js:1968 +msgid "Message Tray" +msgstr "संदेश ट्रे" + +#: ../js/ui/messageTray.js:2971 +msgid "System Information" +msgstr "प्रणाली माहिती" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "अपरिचीत" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d नवीन संदेश" +msgstr[1] "%d नवीन संदेश" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "पूर्ववत् करा" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "पूर्वावलोकन" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "शोधण्याकरीता टाइप करा…" + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "बाहेर पडा" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "क्रिया" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "वरची पट्टी" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "आदेश द्या" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "बंद करा" + +#: ../js/ui/runDialog.js:277 +#| msgid "Estimating…" +msgid "Restarting…" +msgstr "पुन्हा सुरू करत आहे…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d नवीन सूचना" +msgstr[1] "%d नवीन सूचना" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "कुलूपबंद" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "GNOME ने पडदा बंद करायला हवे" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "बंद करणे अशक्य" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "ॲप्लिकेशनतर्फे लॉक रोखले गेले" + +#: ../js/ui/search.js:594 +msgid "Searching…" +msgstr "शोधत आहे..." + +#: ../js/ui/search.js:596 +msgid "No results." +msgstr "परिणाम नाही." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "प्रत बनवा" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "चिकटवा" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "मजकूर दाखवा" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "मजकूर लपवा" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "पासवर्ड" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "पासवर्ड लक्षात ठेवा" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "ॲक्सेसिबिलिटि" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "झूम" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "स्क्रीन रिडर" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "स्क्रीन किबोर्ड" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "दृष्टीविषयक सतर्कता" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "स्टीकी किज्" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "स्लो किज्" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "बाऊंस् किज्" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "माऊस किज्" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "उच्च विरोधाभास" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "मोठे मजकूर" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ब्ल्यूटूथ" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "बंद करा" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ब्ल्यूटूथ सेटिंग्ज" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +#| msgid "Connected (private)" +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d जुळलेले साधन" +msgstr[1] "%d जुळलेल्या साधने" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +#| msgid "Connect" +msgid "Not Connected" +msgstr "जुळलेले नाही" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "उजळपणा" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "किबोर्ड लेआऊट दाखवा" + +#: ../js/ui/status/location.js:65 +#| msgid "Notifications" +msgid "Location" +msgstr "ठिकाण" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +#| msgid "Disabled" +msgid "Disable" +msgstr "बंद करा" + +#: ../js/ui/status/location.js:73 +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "गोपणीय सेटिंग्ज" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "वापरात आहे" + +#: ../js/ui/status/location.js:180 +#| msgid "Enabled" +msgid "Enable" +msgstr "सुरू करा" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "<अपरिचीत>" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +#| msgid "Offline" +msgid "Off" +msgstr "बंद करा" + +#: ../js/ui/status/network.js:459 +#| msgid "Connect" +msgid "Connected" +msgstr "जोडणी केली" + +#. 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) */ +#: ../js/ui/status/network.js:463 +#| msgid "unmanaged" +msgid "Unmanaged" +msgstr "अव्यवस्थापीत" + +#: ../js/ui/status/network.js:465 +#| msgid "disconnecting..." +msgid "Disconnecting" +msgstr "खंडीत करत आहे" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +#| msgid "Connection" +msgid "Connecting" +msgstr "जोडणी" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +#| msgid "authentication required" +msgid "Authentication required" +msgstr "ओळख पटवणे आवश्यक" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +#| msgid "firmware missing" +msgid "Firmware missing" +msgstr "फर्मवेअर आढळले नाही" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "अनुपलब्ध" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "जोडणी अपयशी" + +#: ../js/ui/status/network.js:504 +#| msgid "Settings" +msgid "Wired Settings" +msgstr "वायर्ड सेटिंग्ज" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +#| msgid "Mobile broadband" +msgid "Mobile Broadband Settings" +msgstr "मोबाईल ब्रॉडबँड सेटिंग्ज" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +#| msgid "hardware disabled" +msgid "Hardware Disabled" +msgstr "हार्डवेअर बंद केले" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "इंटरनेट जोडणी म्हणून वापर करा" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "एयरप्लेन मोड सुरू आहे" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "एयरप्लेन मोड सुरू असतेवेळी वाय-फाय बंद असते." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "एयरप्लेन मोड बंद करा" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "वाय-फाय बंद आहे" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "नेटवर्कशी जोडणी करण्यासाठी वाय-फायला सुरू करणे आवश्यक आहे." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "वाय-फाय सुरू करा" + +#: ../js/ui/status/network.js:851 +#| msgid "Network" +msgid "Wi-Fi Networks" +msgstr "वाय-फाय नेटवर्क्स" + +#: ../js/ui/status/network.js:853 +#| msgid "Enable networking" +msgid "Select a network" +msgstr "नेटवर्क पसंत करा" + +#: ../js/ui/status/network.js:882 +#| msgid "Network" +msgid "No Networks" +msgstr "नेटवर्क नाही" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "बंद करण्यासाठी या हार्डवेअर स्विचचा वापर करा" + +#: ../js/ui/status/network.js:1173 +#| msgid "Network" +msgid "Select Network" +msgstr "नेटवर्क नीवडा" + +#: ../js/ui/status/network.js:1179 +#| msgid "Settings" +msgid "Wi-Fi Settings" +msgstr "वाय-फाय सेटिंग्ज" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "सुरू करा" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "हॉटस्पॉट सुरू करा" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "जोडणी करत आहे..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "ओळख पटवणे आवश्यक आहे" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "जोडणी अपयशी" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "जाळं संयोजना" + +#: ../js/ui/status/network.js:1482 +#| msgid "Settings" +msgid "VPN Settings" +msgstr "VPN सेटिंग्ज" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "नेटवर्क मॅनेजर" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "नेटवर्क जोडणी सुरू करणे अपयशी" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "पावर सेटिंग्ज" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "संपूर्णतया चार्ज झाले" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "अंदाज घेत आहे…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d उर्वरित (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d पूर्ण होईपर्यंत (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "बॅटरि" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "एयरप्लेन मोड" + +#: ../js/ui/status/rfkill.js:85 +#| msgid "Open" +msgid "On" +msgstr "सुरू करा" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "उपयोक्ता बदला" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "बाहेर पडा" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "निर्देशन कुलूपबंद" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "निलंबित" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "बंद करा" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ध्वनी बदलले" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "आवाज" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "माइक्रोफोन" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "इतर वापरकर्ता म्हणून प्रवेश करा" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "पटल उघडा" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "ॲप्लिकेशन्स्" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "शोधा" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +#| msgid "'%s' is ready" +msgid "“%s” is ready" +msgstr "“%s” सज्ज आहे" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "तुम्हाला या डिस्पले सेटिंग्ज जपवून ठेवायचे?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +#| msgid "Power Settings" +msgid "Revert Settings" +msgstr "सेटिंग्जना मूळस्थितीत आणा" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "बदल जपवून ठेवा" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "सेटिंग्ज बदल %d सेकंदनंतर मूळस्थितीत येतील" +msgstr[1] "सेटिंग्ज बदल %d सेकंदनंतर मूळस्थितीत येतील" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "छोटे करा" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "छोटे अशक्य करा" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "मोठे करा" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "हलवा" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "पुन्हा आकार द्या" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "शीर्षकपट्टीला ऑनस्क्रीनरित्या हलवा" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "नेहमी शीर्षवरील" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "नेहमी दृष्यास्पद कार्यक्षेत्रवर आढळते" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "वर्कस्पेस अपकडे जा" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "वर्कस्पेस डाउनकडे जा" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "एव्हल्युशन दिनदर्शिका" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u आऊटपुट" +msgstr[1] "%u आऊटपुट" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u इंपुट" +msgstr[1] "%u इंपुट" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "प्रणाली आवाज" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "छपाई आवृत्ती" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "प्रवेश पडद्याकरीता GDM तर्फे वापरण्याजोगी मोड" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "निर्देशीत मोडचा वापर करा, उ.दा. प्रवेश स्क्रीनकरीता \"gdm\"" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "संभाव्य मोड्स्ची सूची दाखवा" + +#: ../src/shell-app.c:666 +#, c-format +#| msgid "Failed to launch '%s'" +msgid "Failed to launch “%s”" +msgstr "“%s” सुरू करण्यास अपयशी" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "पासवर्डस् जुळत नाही." + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "पासवर्ड रिकामे असणे अशक्य" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "ओळख पटवा संवाद वापरकर्त्याद्वारे वगळले" + +#~ msgid "Screenshots" +#~ msgstr "स्क्रीनशॉटस्" + +#~ msgid "Record a screencast" +#~ msgstr "स्क्रीनकास्ट रेकॉर्ड करा" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "ॲप्लिकेशन वापरविषयी स्थिती गोळा करायची" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). हा डाटा व्यक्तिगत असेपर्यंत, यांस गोपणीय " +#~ "कारणास्तव you may want to disable this for privacy reasons. कृपया लक्षात ठेवा " +#~ "असे केल्यास आधिपासूनच साठवलेला डाटा काढून टाकणे अशक्य होईल." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "फोल्डर्स नुरूप दाखवण्याजोगी विभागांची सूची" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "या सूचीतील प्रत्येक विभागाचे नाव ॲप्लिकेशन दृष्यमध्ये फोल्डर म्हणून प्रस्तुत केले जाईल, मुख्य " +#~ "दृष्यमध्ये इनलाइन दाखवण्याऐवजी." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "वापरकर्तातर्फे ठरवलेले शेवटचे IM हाजेरी साठवण्याकरीता आंतरिकपणे वापरले जाते. येथील मूल्य " +#~ "TpConnectionPresenceType एन्युमरेशनपासूनचे आहे." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "वापरकर्तातर्फे ठरवलेले शेवटचे सत्र हाजेरी साठवण्याकरीता आंतरिकपणे वापरले जाते. येथील मूल्य " +#~ "GsmPresenceStatus एन्युमरेशनपासूनचे आहे." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "स्क्रीन रेकॉर्डरमधील बदलसाठी किबाइंडिंग" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "बिल्टइन स्क्रीन रेकॉर्डर सुरू किंवा थांबवण्यासाठी किबाइंडिंग." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "स्क्रिनकास्ट्स् रेकॉर्ड करण्यासाठी वापरलेले फ्रेमरेट." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "फ्रेम्स्-दर-सेकंदमध्ये GNOME शेलच्या सक्रीनकास्ट रेकॉर्डरद्वारे रेकॉर्ड केलेल्या परिणामक " +#~ "सक्रीनकास्टचा फ्रेमरेट." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "स्क्रीनकास्ट एंकोड करण्यासाठी वापरलेले gstreamer पाइपलाइन" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "रेकॉर्डिंग्स् एंकोड करण्यासाठी GStreamer पाइपलाइन ठरवतो. gst-launch सुरू करण्यासाठी " +#~ "मांडणीचा वापर करतो. पाइपलाइनमध्ये जोडणी अशक्य सिंक पॅड असायला हवे जेथे रेकॉर्डेड " +#~ "व्हिडीओ रेकॉर्ड केले जाते. सहसा जोडणी अशक्य स्रोत पॅड असते; पॅडपासूनचे आऊटपुट, आऊटपुट " +#~ "फाइलमध्ये लिहले जाते. तरी पाइपलाइन स्वतःच्या आऊटपुटची काळजी घेतो - याचा वापर " +#~ "shout2send किंवा समानतर्फे icecast सर्व्हरकरीता आऊटपुट पाठवण्याकरीता केला जातो. " +#~ "रिकामे मूल्यकरीता सेट अशक्य किंवा शक्य केल्यावर, मूळ पाइपलाइनचा वापर केला जातो. हे " +#~ "सध्या 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 " +#~ "deadline=1000000 threads=%T ! queue ! webmmux' आहे व VP8 कोडेकचा वापर करून " +#~ "WEBM करीता रेकॉर्डिंग करतो. %T चा वापर प्रणालीवरील कमाल थ्रेड गणणा ओळखण्यासाठी " +#~ "प्लेसहोल्डर म्हणून केला जातो." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "स्क्रिनकास्ट साठवण्याकरीता वापरलेले फाइल एक्सटेंशन" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "सध्याच्या दिनांकवर आधारित रेकॉर्डेड स्क्रिनकास्ट्स्करीता फाइलचेना एकमेव फाइलनाव असणार, " +#~ "व या एक्सटेंशनचा वापर करा. वेगळ्या कंटेनर स्वरूपकरीता रेकॉर्डिंग करतेवेळी बदलणे आवश्यक आहे." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "शीर्षकपट्टीवर बटनांची मांडणी" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "GNOME शेल चालवतेवेळी हि कि org.gnome.desktop.wm.preferences मधील कि खोडून पुनः " +#~ "लिहते." + +#~ msgid "Extension" +#~ msgstr "एक्सटेंशन" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "वरील कॉम्बोबॉक्सचा वापर करून संरचनाकरीता एक्सटेंशनचा वापर करा." + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "सत्र…" + +#~ msgid "Power" +#~ msgstr "पावर" + +#~ msgid "Restart" +#~ msgstr "पुनः सुरू करा" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t पासून स्क्रीनकास्ट" + +#~| msgid "Sent on %A, %B %d" +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~| msgid "Sent on %A, %B %d" +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "ॲप्लिकेशन्स् मधून बाहेर पडण्यासाठी बाहेर पडा क्लिक करा व प्रणालीतून बाहेर पडा." + +#~ msgid "Logging out of the system." +#~ msgstr "प्रणालीतून बाहेर पडत आहे." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "ॲप्लिकेशन्स् बंद करण्यासाठी बंद करा क्लिक करा व प्रणाली बंद करा." + +#~ msgid "Powering off the system." +#~ msgstr "प्रणाली बंद करत आहे." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "ॲप्लिकेशन्स् बंद करण्यासाठी पुनः सुरू करा क्लिक करा व प्रणाली पुनः सुरू करा." + +#~ msgid "Restarting the system." +#~ msgstr "प्रणाली पुनःसुरू करत आहे." + +#~ msgid "Universal Access Settings" +#~ msgstr "जागतीक प्रवेश संयोजना" + +#~ msgid "Visibility" +#~ msgstr "दर्शनियता" + +#~| msgid "Send Files to Device..." +#~ msgid "Send Files to Device…" +#~ msgstr "साधनाकडे फाइल्स पाठवा…" + +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "नवीन साधनची मांडणी करा…" + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "फाइल्स पाठवा..." + +#~ msgid "Keyboard Settings" +#~ msgstr "कळफलक सेटिंग्ज" + +#~ msgid "Mouse Settings" +#~ msgstr "माऊस सेटिंग्ज" + +#~ msgid "Sound Settings" +#~ msgstr "आवाज सेटिंग्ज" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s पासून ओळख पटवण्याची विनंती" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "साधन %s ला सर्व्हिस '%s' करीता प्रवेश पाहिजे" + +#~ msgid "Always grant access" +#~ msgstr "नेहमी प्रवेश द्या" + +#~ msgid "Grant this time only" +#~ msgstr "फक्त याचवेळी मान्य करा" + +#~ msgid "Reject" +#~ msgstr "नकारा" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s करीता जोड पुष्टी करा" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "साधन %s ला या संगणकाशी जोडणी करायची" + +#~ msgid "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgstr "कृपया PIN '%06d' साधनावरील पिनशी जुळते, याची खात्री करा." + +#~ msgid "Matches" +#~ msgstr "जोड" + +#~ msgid "Does not match" +#~ msgstr "जुळत नाही" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s करीता जोड विनंती" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "कृपया साधनावर निर्देशीत PIN द्या." + +#~ msgid "OK" +#~ msgstr "ठीक आहे" + +#~| msgid "Region and Language Settings" +#~ msgid "Region & Language Settings" +#~ msgstr "क्षेत्र व भाषांचे सेटिंग्ज" + +#~ msgid "Volume, network, battery" +#~ msgstr "वॉल्यूम, नेटवर्क, बॅटरि" + +#~ msgid "disabled" +#~ msgstr "बंद केले" + +#~ msgid "cable unplugged" +#~ msgstr "केबल जोडले नाही" + +#~ msgid "unavailable" +#~ msgstr "अनुपलब्ध" + +#~ msgid "More…" +#~ msgstr "आणखी…" + +#~ msgid "Wired" +#~ msgstr "वायर्ड्" + +#~ msgid "Auto Ethernet" +#~ msgstr "स्वयं इथरनेट" + +#~ msgid "Auto broadband" +#~ msgstr "स्वयं ब्रॉडबँड" + +#~ msgid "Auto dial-up" +#~ msgstr "स्वयं डायल-अप" + +#~ msgid "Auto %s" +#~ msgstr "स्वयं %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "स्वयं ब्ल्यूटूथ" + +#~ msgid "Auto wireless" +#~ msgstr "स्वयं वायरलेस्" + +#~ msgid "Wi-Fi" +#~ msgstr "वाय-फाय" + +#~ msgid "Networking is disabled" +#~ msgstr "नेटवर्किंग बंद आहे" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d तास उर्वरित" +#~ msgstr[1] "%d तास उर्वरित" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s उर्वरित" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "तास" +#~ msgstr[1] "तास" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "मिनिट" +#~ msgstr[1] "मिनिट" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d मिनीट उर्वरित" +#~ msgstr[1] "%d मिनीटे उर्वरित" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~| msgid "AC adapter" +#~ msgid "AC Adapter" +#~ msgstr "AC अडॅप्टर" + +#~| msgid "Laptop battery" +#~ msgid "Laptop Battery" +#~ msgstr "लॅपटॉप बॅटरि" + +#~ msgid "Monitor" +#~ msgstr "मॉनीटर" + +#~ msgid "Mouse" +#~ msgstr "माउस" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~| msgid "Cell phone" +#~ msgid "Cell Phone" +#~ msgstr "सेल फोन" + +#~| msgid "Media player" +#~ msgid "Media Player" +#~ msgstr "मिडीया वादक" + +#~ msgid "Tablet" +#~ msgstr "टॅबलेट" + +#~ msgid "Computer" +#~ msgstr "संगणक" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "अपरिचीत" + +#~ msgid "Available" +#~ msgstr "उपलब्ध" + +#~ msgid "Busy" +#~ msgstr "व्यस्त" + +#~ msgid "Invisible" +#~ msgstr "अदृष्य" + +#~ msgid "Away" +#~ msgstr "दूर आहे" + +#~ msgid "Idle" +#~ msgstr "रिकामे" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "तुमची चॅट स्थिती व्यस्थकरीता ठरवले जाईल" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "सूचना आता बंद केले आहे, चॅट संदेश समाविष्टीत. इतरांना तुमचे संदेश दिसणार नाही हे " +#~ "कळवण्यासाठी ऑनलाइन स्थिती सुस्थीत केली आहे." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "बंद केल्याने न साठवलेले कार्य गमवण्याची शक्यता आहे." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "माफ करा, चातुर्या आढळले नाही:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s ऑरॅकल म्हणतो" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "प्रवेश करा" + +#~ msgid "APPLICATIONS" +#~ msgstr "APPLICATIONS" + +#~ msgid "SETTINGS" +#~ msgstr "SETTINGS" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Subscription request" +#~ msgstr "सबस्क्रिप्शन विनंती" + +#~ msgid "Connection error" +#~ msgstr "जोडणी त्रुटी" + +#~ msgid "Sent at %X on %A" +#~ msgstr "%X वेळी, %A ला पाठवले" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "%A, %B %d, %Y वेळी पाठवले" + +#~ msgid "Connection to %s failed" +#~ msgstr "%s सह जोडणी अपयशी" + +#~ msgid "Reconnect" +#~ msgstr "पुनःजोडणी करा" + +#~ msgid "tray" +#~ msgstr "ट्रे" + +#~ msgid "Browse Files..." +#~ msgstr "फाइल्स् तपासा..." + +#~ msgid "Error browsing device" +#~ msgstr "साधनाची तपासणी करतेवेळी त्रुटी" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "विनंती केलेल्या साधनाची तपासणी अशक्य, त्रुटी '%s' आहे" + +#~ msgid "More..." +#~ msgstr "अधिक..." + +#~ msgid "Wireless" +#~ msgstr "वायरलेस्" + +#~ msgid "VPN Connections" +#~ msgstr "VPN जोडणी" + +#~ msgid "System Settings" +#~ msgstr "प्रणाली मांडणी" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "तुमच्या पसंतीचा इस्टर एग" + +#~ msgid "United Kingdom" +#~ msgstr "यूनाइटेड किंगडम" + +#~ msgid "Default" +#~ msgstr "मुलभूत" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "'%s' माऊंट अशक्य करण्यास अपयशी" + +#~ msgid "Retry" +#~ msgstr "पुनःप्रयत्न करा" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "PLACES & DEVICES" + +#~ msgid "Home" +#~ msgstr "होम" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "OpenSearch प्रोव्हाइडर्स् बंद केले" + +#~ msgid "Connect to..." +#~ msgstr "यासह जोडणी करा..." + +#~ msgid "Passphrase" +#~ msgstr "पासफ्रेज" + +#~ msgid "Show time with seconds" +#~ msgstr "सेकंदात वेळ दाखवा" + +#~ msgid "If true, display seconds in time." +#~ msgstr "खरे असल्यास, वेळेत सेकंद दाखवा." + +#~ msgid "Show date in clock" +#~ msgstr "घड्याळात दिनांक दाखवा" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "खरे असल्यास,वेळेबरोबर तारीख पण घड्याळात दाखवा." + +#~ msgid "CONTACTS" +#~ msgstr "संपर्क" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "चुकिचा पासवर्ड, कृपया पुनः प्रयत्न करा" + +#~ msgid "%s is online." +#~ msgstr "%s ऑनलाइन आहे." + +#~ msgid "%s is offline." +#~ msgstr "%s ऑफलाइन आहे." + +#~ msgid "%s is away." +#~ msgstr "%s दूर आहे." + +#~ msgid "%s is busy." +#~ msgstr "%s व्यग्र आहे." + +#~ msgid "Hidden" +#~ msgstr "लवपलेले" + +#~ msgid "Power Off..." +#~ msgstr "बंद करा..." + +#~ msgid "Online Accounts" +#~ msgstr "ऑनलाइन खाते" + +#~ msgid "Lock Screen" +#~ msgstr "पडदा कुलूपबंद करा" + +#~ msgid "Log Out..." +#~ msgstr "बाहेर पडा..." + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should not be loaded." +#~ msgstr "" +#~ "GNOME शेल एक्सटेंशन्स्मध्ये uuid गुणधर्म आढळते; या किमध्ये एक्सटेंशन्स् आहेत ज्यांना लोड " +#~ "करायची आवश्यकता नाही." + +#~ msgid "RECENT ITEMS" +#~ msgstr "RECENT ITEMS" + +#~ msgid "Localization Settings" +#~ msgstr "भाषांतरन सेटिंग्ज" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "तुम्ही आत्ता मोबाईल ब्रॉडबँड जोडणी '%s' शी जुळले आहात" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "तुम्ही आत्ता वायरलेस नेटवर्क '%s' शी जुळले आहात" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "तुम्ही आत्ता वायर्ड् नेटवर्क '%s' शी जुळले आहात" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "तुम्ही आत्ता VPN नेटवर्क '%s' शी जुळले आहात" + +#~ msgid "%s has finished starting" +#~ msgstr "%s ने सुरवात पूर्ण केले" + +#~ msgid "Less than a minute ago" +#~ msgstr "एका मिनीटापूर्वी" + +#~ msgid "%d minute ago" +#~ msgid_plural "%d minutes ago" +#~ msgstr[0] "%d मिनीट पूर्वी" +#~ msgstr[1] "%d मिनीट पूर्वी" + +#~ msgid "%d hour ago" +#~ msgid_plural "%d hours ago" +#~ msgstr[0] "%d तास पूर्वी" +#~ msgstr[1] "%d तास पूर्वी" + +#~ msgid "%d day ago" +#~ msgid_plural "%d days ago" +#~ msgstr[0] "%d दिवस पूर्वी" +#~ msgstr[1] "%d दिवस पूर्वी" + +#~ msgid "%d week ago" +#~ msgid_plural "%d weeks ago" +#~ msgstr[0] "%d आठवडा पूर्वी" +#~ msgstr[1] "%d आठवडा पूर्वी" + +#~ msgid "Home Folder" +#~ msgstr "होम फोल्डर" diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000..a328c9f --- /dev/null +++ b/po/ms.po @@ -0,0 +1,1870 @@ +# Malay translations for gnome-shell package. +# Copyright (C) 2011 Listed translators +# This file is distributed under the same license as the gnome-shell package. +# Andi Rady Kurniawan , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master ms\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-12 17:00+0000\n" +"PO-Revision-Date: 2014-09-15 19:21+0730\n" +"Last-Translator: Umarzuki Mochlis Moktar \n" +"Language-Team: GNOME Malay Team \n" +"Language: ms\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" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +#| msgid "File System" +msgid "System" +msgstr "Sistem" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "Tunjukkan talam mesej" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "Fokus pada notifikasi yang aktif" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "Tunjukkan gambaran keseluruhan" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +#| msgid "No such application" +msgid "Show all applications" +msgstr "Tunjuk semua aplikasi" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +#| msgid "No such application" +msgid "Open the application menu" +msgstr "Buka menu aplikasi" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Pengurusan tetingkap dan pelancaran aplikasi" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Bolehkan radas dalaman yang berguna untuk para pembangun dan penguji menerusi Alt-F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog." +msgstr "Membolehkan radas menyahpepijat dan memantau dalaman dicapai dengan dialog Alt-F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +#| msgid "Uuids of extensions to enable" +msgid "UUIDs of extensions to enable" +msgstr "UUID ciri tambahan yang hendak dibenarkan" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +#| msgid "" +#| "GNOME Shell extensions have a uuid property; this key lists extensions " +#| "which should not be loaded. This setting overrides enabled-extensions for " +#| "extensions that appear in both lists." +msgid "GNOME Shell extensions have a UUID property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "Ciri tambahan GNOME Shell menpunyai sifat UUID. Senarai utama ciri tambahan ini yang patut dimuatkan. Sebarang ciri tambahan yang hendak dimuatkan perlu berada di dalam senarai ini. Anda boleh mengubah senarai ini dengan kaedah D-Bus EnableExtension dan DisableExtension yang terdapat di org.gnome.Shell." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "GNOME Shell will only load extensions that claim to support the current running version. Enabling this option will disable this check and try to load all extensions regardless of the versions they claim to support." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "Senarai ID fail desktop untuk aplikasi kegemaran" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "The applications corresponding to these identifiers will be displayed in the favorites area." +msgstr "Aplikasi-aplikasi bagi setiap pengenal pasti ini akan dipaparkan di kawasan kegemaran." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "Sejarah untuk dialog perintah (Alt-F2)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "Sejarah untuk dialog looking glass" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "This key overrides the automatic hiding of the 'Log out' menu item in single-user, single-session situations." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "The shell will request a password when an encrypted device or a remote filesystem is mounted. If the password can be saved for future use a 'Remember Password' checkbox will be present. This key sets the default state of the checkbox." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "Tunjuk minggu pada kalendar" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "Jika benar, papar tarikh minggu ISO pada kalendar." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "Pilih papan kekunci" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "Jenis papan kekunci untuk digunakan." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "If true, only applications that have windows on the current workspace are shown in the switcher. Otherwise, all applications are included." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "Configures how the windows are shown in the switcher. Valid possibilities are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only' (shows only the application icon) or 'both'." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "If true, only windows from the current workspace are shown in the switcher. Otherwise, all windows are included." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "" + +#: ../js/extensionPrefs/main.js:155 +#| msgid "GNOME Shell" +msgid "GNOME Shell Extensions" +msgstr "Ciri Tambahan GNOME Shell" + +#: ../js/gdm/authPrompt.js:147 +#: ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 +#: ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 +#: ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "Batal" + +#: ../js/gdm/authPrompt.js:169 +#: ../js/gdm/authPrompt.js:217 +#| msgid "Next week" +msgid "Next" +msgstr "Seterusnya" + +#: ../js/gdm/authPrompt.js:213 +#: ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "Daftar Masuk" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "Tidak tersenarai?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "" + +#: ../js/gdm/loginDialog.js:619 +#: ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "Nama pengguna:" + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "Tetingkap Log Masuk" + +#: ../js/gdm/util.js:323 +#| msgid "Authentication Required" +msgid "Authentication error" +msgstr "Ralat pengesahan" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "Perintah tidak ditemui" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "Tidak dapat menghurai perintah:" + +#: ../js/misc/util.js:156 +#, javascript-format +#| msgid "Execution of '%s' failed:" +msgid "Execution of “%s” failed:" +msgstr "Perlaksanaan “%s” telah gagal:" + +#: ../js/portalHelper/main.js:85 +#| msgid "Authentication Required" +msgid "Web Authentication Redirect" +msgstr "Lencongan Pengesahan Web" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "Semua" + +#: ../js/ui/appDisplay.js:1789 +msgid "New Window" +msgstr "Tetingkap Baru" + +#: ../js/ui/appDisplay.js:1815 +#: ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "Buang daripada Kegemaran" + +#: ../js/ui/appDisplay.js:1821 +msgid "Add to Favorites" +msgstr "Tambah ke Kegemaran" + +#: ../js/ui/appDisplay.js:1830 +msgid "Show Details" +msgstr "" + +#: ../js/ui/appFavorites.js:124 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s telah ditambah ke kegemaran anda." + +#: ../js/ui/appFavorites.js:158 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s telah dibuang daripada kegemaran anda." + +#: ../js/ui/backgroundMenu.js:19 +#: ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +#| msgid "Mouse Settings" +msgid "Settings" +msgstr "Tetapan" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "" + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "Sepanjang Hari" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "A" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "I" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "R" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "K" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "A" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "I" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "Se" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "R" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "K" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "J" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "Jadual Kosong" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d %B %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "Hari ini" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "Esok" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "Minggu ini" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "Minggu depan" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "Buka dengan %s" + +#: ../js/ui/components/autorunManager.js:622 +#| msgid "Reject" +msgid "Eject" +msgstr "Lentingkan" + +#: ../js/ui/components/keyring.js:94 +#: ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "Katalaluan:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "" + +#: ../js/ui/components/networkAgent.js:138 +#: ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 +#: ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "Sambung" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "Kata laluan:" + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "Kekunci:" + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "Identiti:" + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "Katalaluan kekunci peribadi:" + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "Perkhidmatan:" + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "Pengesahan diperlukan untuk rangkaian wayarles" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +#| msgid "" +#| "Passwords or encryption keys are required to access the wireless network " +#| "'%s'." +msgid "Passwords or encryption keys are required to access the wireless network “%s”." +msgstr "Katalaluan atau kekunci penyulitan diperlukan untuk mencapai rangkaian wayarles “%s”." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "Pengesahan berwayar 802.1X" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "Nama rangkaian:" + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "Pengesahan DSL" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "Kod PIN diperlukan" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Kod PIN diperlukan untuk peranti jalur lebar mudah alih" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN:" + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "Kata laluan rangkaian jalur lebar mudah alih" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +#| msgid "A password is required to connect to '%s'." +msgid "A password is required to connect to “%s”." +msgstr "Kata laluan diperlukan untuk disambungkan ke “%s”." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "Pengesahan Diperlukan" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "Pengurus" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "Pengesahan" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 +#: ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "Maaf, tidak berjaya. Sila cuba lagi." + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "Jemputan" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "Panggilan" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "Pemindahan Fail" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +#| msgctxt "event list time" +#| msgid "%l:%M %p" +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +#| msgid "%a %l:%M %p" +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +#| msgid "%a %b %e, %l:%M %p" +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +#| msgid "%a %b %e, %l:%M %p" +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s kini dikenali sebagai %s" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "Jemputan untuk %s" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s menjemput anda untuk menyertai %s" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "Tolak" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "Terima" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "Panggilan video dari %s" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "Panggilan dari %s" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "Jawapan" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s menghantarkan %s kepada anda" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "%s mahukan kebenaran untuk melihat bila anda akan ada di talian" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "Ralat rangkaian" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "Pengesahan gagal" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "Ralat penyulitan" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "Perakuan tidak diberikan" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "Perakuan tidak dipercayai" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "Perakuan habis tempoh" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "Perakuan tidak diaktifkan" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "Nama hos perakuan tak padan" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "Fingerprint perakuan tak padan" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "Perakuan didaftar sendiri" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "Status ditetapkan kepada luar talian" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "Penyulitan tiada" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "Perakuan tak sah" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "Sambungan telah ditolak" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "Sambungan tidak dapat dibuat" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "Sambungan telah terputus" + +#: ../js/ui/components/telepathyClient.js:1369 +#| msgid "This resource is already connected to the server" +msgid "This account is already connected to the server" +msgstr "Akaun ini telah pun disambungkan ke pelayan" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "Connection has been replaced by a new connection using the same resource" +msgstr "Sambungan telah digantikan dengan sambungan baru dengan sumber yang sama" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "Akaun berkenaan telah pun wujud pada pelayan" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "Pelayan sedang terlalu sibuk untuk mengendalikan sambungan" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "Perakuan telah dibatalkan" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "Perakuan menggunakan algoritma sifer yang tak selamat atau rapuh dari segi kriptografi" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library" +msgstr "Panjang perakuan pelayan, atau kedalaman rantai perakuan pelayan, melebihi had yang dikenakan oleh pustaka kriptografi" + +#: ../js/ui/components/telepathyClient.js:1383 +#| msgid "Connection error" +msgid "Internal error" +msgstr "Ralat dalaman" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "" + +#: ../js/ui/components/telepathyClient.js:1398 +#| msgid "Edit account" +msgid "View account" +msgstr "Tunjukkan akaun" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "Sebab tak diketahui" + +#: ../js/ui/ctrlAltTab.js:29 +#: ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "Tetingkap" + +#: ../js/ui/dash.js:249 +#: ../js/ui/dash.js:287 +#| msgid "Applications" +msgid "Show Applications" +msgstr "Tunjukkan Aplikasi" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "Dash" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "Buka Kalendar" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "" + +#: ../js/ui/dateMenu.js:107 +#| msgid "Date and Time Settings" +msgid "Date & Time Settings" +msgstr "Tetapan Tarikh dan Waktu" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %e %B %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +#| msgid "Log Out %s" +msgctxt "title" +msgid "Log Out %s" +msgstr "Log Keluar %s" + +#: ../js/ui/endSessionDialog.js:65 +#| msgid "Log Out" +msgctxt "title" +msgid "Log Out" +msgstr "Log Keluar" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s akan dilog keluar secara automatik dalam %d saat." +msgstr[1] "%s akan dilog keluar secara automatik dalam %d saat." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +#| msgid "You will be logged out automatically in %d seconds." +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Anda akan dilog keluar secara automatik dalam %d saat." +msgstr[1] "Anda akan dilog keluar secara automatik dalam %d saat." + +#: ../js/ui/endSessionDialog.js:78 +#| msgid "Log Out" +msgctxt "button" +msgid "Log Out" +msgstr "Log Keluar" + +#: ../js/ui/endSessionDialog.js:84 +#| msgid "Power Off" +msgctxt "title" +msgid "Power Off" +msgstr "Matikan" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +#| msgid "The system will power off automatically in %d seconds." +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistem akan dimatikan secara automatik dalam %d saat." +msgstr[1] "Sistem akan dimatikan secara automatik dalam %d saat." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "" + +#: ../js/ui/endSessionDialog.js:94 +#: ../js/ui/endSessionDialog.js:111 +#| msgid "Restart" +msgctxt "button" +msgid "Restart" +msgstr "Mula Semula" + +#: ../js/ui/endSessionDialog.js:96 +#| msgid "Power Off" +msgctxt "button" +msgid "Power Off" +msgstr "Matikan" + +#: ../js/ui/endSessionDialog.js:103 +#| msgid "Restart" +msgctxt "title" +msgid "Restart" +msgstr "Mula Semula" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +#| msgid "The system will restart automatically in %d seconds." +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistem akan mula semula secara automatik dalam %d saat." +msgstr[1] "Sistem akan mula semula secara automatik dalam %d saat." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +#| msgid "The system will restart automatically in %d seconds." +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "The system will automatically restart and install updates in %d seconds." +msgstr[0] "Sistem akan mula semula secara automatik dan mengemaskini dalam %d saat." +msgstr[1] "Sistem akan mula semula secara automatik dan mengemaskini dalam %d saat." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "" + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "" + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Pasang" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +#| msgid "Download and install '%s' from extensions.gnome.org?" +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Muat turun dan pasang “%s” dari extensions.gnome.org?" + +#: ../js/ui/keyboard.js:692 +#: ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "Papan kekunci" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "Tiada sambungan dipasang" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "" + +#: ../js/ui/lookingGlass.js:703 +#| msgid "Error" +msgid "Hide Errors" +msgstr "Sembunyikan Ralat" + +#: ../js/ui/lookingGlass.js:707 +#: ../js/ui/lookingGlass.js:767 +#| msgid "Error" +msgid "Show Errors" +msgstr "Tunjukkan Ralat" + +#: ../js/ui/lookingGlass.js:716 +#: ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "Dibolehkan" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 +#: ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 +#: ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "Dilumpuhkan" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "Ralat" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "Lapuk" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "Memuat turun" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "Lihat Sumber" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "Laman Web" + +#: ../js/ui/messageTray.js:1326 +msgid "Open" +msgstr "Buka" + +#: ../js/ui/messageTray.js:1333 +msgid "Remove" +msgstr "Buang" + +#: ../js/ui/messageTray.js:1630 +msgid "Notifications" +msgstr "Makluman" + +#: ../js/ui/messageTray.js:1637 +msgid "Clear Messages" +msgstr "" + +#: ../js/ui/messageTray.js:1656 +#| msgid "Notifications" +msgid "Notification Settings" +msgstr "Tetapan Makluman" + +#: ../js/ui/messageTray.js:1709 +msgid "Tray Menu" +msgstr "" + +#: ../js/ui/messageTray.js:1926 +msgid "No Messages" +msgstr "" + +#: ../js/ui/messageTray.js:1968 +msgid "Message Tray" +msgstr "" + +#: ../js/ui/messageTray.js:2971 +msgid "System Information" +msgstr "Maklumat Sistem" + +#: ../js/ui/notificationDaemon.js:513 +#: ../src/shell-app.c:425 +#| msgid "Unknown" +msgctxt "program" +msgid "Unknown" +msgstr "Tidak diketahui" + +#: ../js/ui/overviewControls.js:482 +#: ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "Buat asal" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +#| msgid "Type to search..." +msgid "Type to search…" +msgstr "Taip untuk cari..." + +#: ../js/ui/panel.js:515 +#| msgid "Quit %s" +msgid "Quit" +msgstr "Berhenti" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "Aktiviti" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "Bar Atas" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +#| msgid "Please enter a command:" +msgid "Enter a Command" +msgstr "Masukkan arahan" + +#: ../js/ui/runDialog.js:110 +#: ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "" + +#: ../js/ui/runDialog.js:277 +#| msgid "Restart" +msgid "Restarting…" +msgstr "Memulakan semula..." + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +#| msgid "Notifications" +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notifikasi baharu" +msgstr[1] "%d notifikasi baharu" + +#: ../js/ui/screenShield.js:472 +#: ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "" + +#: ../js/ui/screenShield.js:833 +#: ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "" + +#: ../js/ui/screenShield.js:834 +#: ../js/ui/screenShield.js:1305 +#| msgid "No such application" +msgid "Lock was blocked by an application" +msgstr "Kunci disekat oleh suatu aplikasi" + +#: ../js/ui/search.js:594 +#| msgid "Searching..." +msgid "Searching…" +msgstr "Mencari..." + +#: ../js/ui/search.js:596 +#| msgid "No matching results." +msgid "No results." +msgstr "Tiada padanan." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "" + +#: ../js/ui/shellEntry.js:99 +#| msgid "Large Text" +msgid "Hide Text" +msgstr "Sembunyikan Teks" + +#: ../js/ui/shellMountOperation.js:370 +#| msgid "Password:" +msgid "Password" +msgstr "Katalaluan" + +#: ../js/ui/shellMountOperation.js:391 +#| msgid "Password:" +msgid "Remember Password" +msgstr "Ingatkan Katalaluan" + +#: ../js/ui/status/accessibility.js:42 +#| msgid "Visibility" +msgid "Accessibility" +msgstr "Ketersampaian" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Zum" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Pembaca Skrin" + +#: ../js/ui/status/accessibility.js:68 +#| msgid "Screen Reader" +msgid "Screen Keyboard" +msgstr "Papan Kekunci Skrin" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Awasan Visual" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Kekunci Sticky" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Kekunci Lembab" + +# Kekunci untuk OKU yang tangan bergetar. +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Kekunci Lantun" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Kekunci Tetikus" + +# contrast boleh juga diterjemah "beza jelas", tapi "senjang" (/sénjang/) dipilih kerana lebih pendek. +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "Kontras Tinggi" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "Teks Besar" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: ../js/ui/status/bluetooth.js:51 +#: ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 +#: ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 +#: ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "Tetapan Bluetooth" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +#| msgid "Connected (private)" +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d Peranti Tersambung" +msgstr[1] "%d Peranti Tersambung" + +#: ../js/ui/status/bluetooth.js:106 +#: ../js/ui/status/network.js:1309 +#| msgid "Connect" +msgid "Not Connected" +msgstr "Tidak Disambung" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "Tunjuk Susun Atur Papan Kekunci" + +#: ../js/ui/status/location.js:65 +#| msgid "Notifications" +msgid "Location" +msgstr "Lokasi" + +#: ../js/ui/status/location.js:72 +#: ../js/ui/status/location.js:177 +#| msgid "Disabled" +msgid "Disable" +msgstr "Lumpuhkan" + +#: ../js/ui/status/location.js:73 +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "Tetapan Privasi" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "" + +#: ../js/ui/status/location.js:180 +#| msgid "Enabled" +msgid "Enable" +msgstr "Bolehkan" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "" + +#: ../js/ui/status/network.js:457 +#: ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +#| msgid "Offline" +msgid "Off" +msgstr "Tutup" + +#: ../js/ui/status/network.js:459 +#| msgid "Connect" +msgid "Connected" +msgstr "Tersambung" + +#. 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) */ +#: ../js/ui/status/network.js:463 +#| msgid "unmanaged" +msgid "Unmanaged" +msgstr "Tidak diuruskan" + +#: ../js/ui/status/network.js:465 +#| msgid "disconnecting..." +msgid "Disconnecting" +msgstr "Memutuskan" + +#: ../js/ui/status/network.js:471 +#: ../js/ui/status/network.js:1301 +#| msgid "Connection" +msgid "Connecting" +msgstr "Menyambung" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +#| msgid "authentication required" +msgid "Authentication required" +msgstr "Pengesahan diperlukan" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +#| msgid "firmware missing" +msgid "Firmware missing" +msgstr "Perisian tegar tidak dijumpai" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "Tiada" + +#: ../js/ui/status/network.js:488 +#: ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "Gagal menyambung" + +#: ../js/ui/status/network.js:504 +#| msgid "Sound Settings" +msgid "Wired Settings" +msgstr "Tetapan Berwayar" + +#: ../js/ui/status/network.js:546 +#: ../js/ui/status/network.js:624 +#| msgid "Mobile broadband" +msgid "Mobile Broadband Settings" +msgstr "Tetapan Jalurlebar Mudahalih" + +#: ../js/ui/status/network.js:588 +#: ../js/ui/status/network.js:1305 +#| msgid "hardware disabled" +msgid "Hardware Disabled" +msgstr "Perkakas dilumpuhkan" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "" + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "" + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "" + +#: ../js/ui/status/network.js:853 +#| msgid "Enable networking" +msgid "Select a network" +msgstr "Pilih satu rangkaian" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "" + +#: ../js/ui/status/network.js:903 +#: ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "" + +#: ../js/ui/status/network.js:1179 +#| msgid "Mouse Settings" +msgid "Wi-Fi Settings" +msgstr "Tetapan Wi-Fi" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "menyambung..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "pengesahan diperlukan" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "sambungan gagal" + +#: ../js/ui/status/network.js:1480 +#: ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "Tetapan-tetapan Rangkaian" + +#: ../js/ui/status/network.js:1482 +#| msgid "Power Settings" +msgid "VPN Settings" +msgstr "Tetapan VPN" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "Pengurus Rangkaian" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "Pengaktifan sambungan rangkaian gagal" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "Tetapan Kuasa" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "" + +#: ../js/ui/status/power.js:72 +#: ../js/ui/status/power.js:78 +#| msgid "Estimating..." +msgid "Estimating…" +msgstr "Menganggar..." + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "" + +#: ../js/ui/status/rfkill.js:85 +#| msgid "Open" +msgid "On" +msgstr "Buka" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "Tukar Pengguna" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "Log Keluar" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "Tangguh" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "Matikan" + +#: ../js/ui/status/volume.js:127 +#| msgid "Volume" +msgid "Volume changed" +msgstr "Tetapan bunyi diubah" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "Jilid" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "Mikrofon" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "" + +#: ../js/ui/unlockDialog.js:84 +#| msgid "Login Window" +msgid "Unlock Window" +msgstr "Buka Tetingkap" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "Aplikasi" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "Cari" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +#| msgid "'%s' is ready" +msgid "“%s” is ready" +msgstr "“%s” telah sedia" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +#| msgid "Power Settings" +msgid "Revert Settings" +msgstr "Kembali Ke Tetapan Asal" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "Kekalkan Perubahan" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Minimum" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Berbalik dari saiz maksima" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Maksima" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Pindah" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Ubah saiz" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Sentiasa Di Atas" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "Pindah ke Ruangkerja Atas" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "Pindah ke Ruangkerja Bawah" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +#| msgid "Open Calendar" +msgid "Evolution Calendar" +msgstr "Kalendar Evolution" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u Output" +msgstr[1] "%u Output" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u Input" +msgstr[1] "%u Input" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "Bunyi Sistem" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "Cetak versi" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "Mod GDM untuk skrin log masuk" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "Senarai modus" + +#: ../src/shell-app.c:666 +#, c-format +#| msgid "Failed to launch '%s'" +msgid "Failed to launch “%s”" +msgstr "Gagal melancarkan “%s”" + +#: ../src/shell-keyring-prompt.c:714 +#| msgid "Does not match" +msgid "Passwords do not match." +msgstr "Kata laluan tidak padan" + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "Katalaluan tidak boleh kosong" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "Dialog pengesahan telah digugurkan oleh pengguna" + diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..4d783b8 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,2087 @@ +# Norwegian bokmål translation of gnome-shell. +# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Åka Sikrom , 2014-2015. +# Kjartan Maraas , 2009-2017. +# Torstein Adolf Winterseth , 2010. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell 3.27.x\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-21 11:40+0000\n" +"PO-Revision-Date: 2017-11-09 20:20+0100\n" +"Last-Translator: Kjartan Maraas \n" +"Language-Team: Norwegian bokmål \n" +"Language: nb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.4\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "System" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Vis varslingsliste" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokuser på aktiv varsling" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Vis oversikt" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Vis alle programmer" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Åpne programmenyen" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "Utvidelser for GNOME Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Sett opp utvidelser for GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Vindushåndtering og oppstart av programmer" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Slå på interne verktøy for utviklere og testere fra Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Tillat tilgang til interne feilsøkings- og overvåkingsverktøy ved å bruke " +"Alt-F2-dialogen." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID-er for utvidelser som skal slås på" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell-utvidelser har en UUID-egenskap. Denne nøkkelen viser utvidelser " +"som skal lastes inn. Alle utvidelser som ønsker å bli lastet inn må være med " +"på denne lista. Du kan også manipulere lista med DBus-metodene " +"EnablExtension og DisableExtension på org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Slå av brukerutvideleser" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Slå av alle utvidelser bruker har aktivert uten å påvirke innstillingen for " +"«enabled-extension»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" +"Slår av gyldighetssjekk av hvorvidt programversjoner passer med utvidelser" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell laster bare inn utvidelser som hevder å støtte kjørende versjon. " +"Hvis du slår på dette valget, slår du av denne sjekken, og alle utvidelser " +"lastes inn uavhengig av hvilke versjoner de hevder å støtte." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Liste av skrivebordsfil-id-er for favorittprogrammer" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programmene som passer til disse identifikatorene vises i favorittområdet." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Visning av programvelger" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indeks for valgt visning i programvelgeren." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historikk for kommandodialog (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historikk for forstørrelsesglass-dialogen" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Alltid vis menyoppføringen «Logg ut» i brukermenyen." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Denne nøkkelen overstyrer automatisk skjuling av menyoppføringen «Logg ut» i " +"situasjonen én bruker, én sesjon." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "Om passord til eksterne eller krypterte filsystemer skal huskes." + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Skallet spør etter passord når du monterer en kryptert enhet eller et " +"eksternt filsystem. Hvis passordet kan lagres for fremtidig bruk, vises en " +"avkryssingsboks med teksten «Husk passord». Denne nøkkelen bestemmer " +"standardverdien for avkryssingsboksen." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Hvorvidt forvalgt Bluetooth-enhet hadde ferdigoppsatte enheter assosiert med " +"seg" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Tastaturbinding som åpner programmenyen" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Tastaturbinding som åpner programmenyen." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Tastaturbinding som åpner visningen «Vis programmer»" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Tastaturbinding som åpner visningen «Vis programmer» i aktivitetsoversikten." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Tastaturbinding som åpner oversikten" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Tastaturbinding som åpner aktivitetsoversikten." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Tastaturbinding som slår av/på visning av varslingsliste" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Tastaturbinding som slår av/på visning av varslingsliste." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Tastaturbinding som fokuserer aktiv varsling" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Tastaturbinding som fokuserer aktiv varsling." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Hurtigtast som stanser og fortsetter pågående bevegelser til " +"feilsøkingsformål" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Tastatur som skal brukes" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Type tastatur som skal brukes." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Begrens programveksling til gjeldende arbeidsområde." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Hvis verdien er sann («true»), er det bare programmer med vinduer på " +"gjeldende arbeidsområder som vises i programveksleren. I motsatt fall kan du " +"veksle mellom programmer på tvers av arbeidsområder." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Ikonmodus for programmet." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Bestemmer hvordan vinduene vises i programveksleren. Gyldige " +"valgalternativer er «thumbnail-only» (viser miniatyrbilde av vinduet), «app-" +"icon-only» (viser bare programikonet) og «both» (viser begge forannevnte)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Hvis verdien er sann («true»), er det bare vinduer på gjeldende " +"arbeidsområder som vises i programveksleren. I motsatt fall vises vinduer " +"fra alle arbeidsområder." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Fest modal dialog til opphavsvinduet" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Denne nøkkelen overstyrer nøkkelen i org.gnome.mutter når GNOME Shell kjøres." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Del opp skjermkantene i fliser når brukeren drar og slipper vinduer på dem" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Arbeidsområder håndteres dynamisk" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Arbeidsområder vises kun på hovedskjerm" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Utsett fokusendringer i musmodus til peker slutter å bevege seg" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Nettverkspålogging" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Det oppsto en feil ved lasting av brukervalgdialog for %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 +msgid "Cancel" +msgstr "Avbryt" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "Neste" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Lås opp" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "Logg inn" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "Velg økt" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "Ikke listet?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(f.eks. bruker eller %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Brukernavn: " + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "Innloggingsvindu" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "Autentiseringsfeil" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +msgid "(or swipe finger)" +msgstr "(eller dra finger)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +msgctxt "search-result" +msgid "Power off" +msgstr "Slå av" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +msgid "power off;shutdown" +msgstr "slå av;steng ned" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +msgctxt "search-result" +msgid "Lock screen" +msgstr "Lås skjerm" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +msgid "lock screen" +msgstr "lås skjerm" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +msgctxt "search-result" +msgid "Log out" +msgstr "Logg ut" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "logg ut;logg av" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +msgctxt "search-result" +msgid "Suspend" +msgstr "Hvilemodus" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +msgid "suspend;sleep" +msgstr "hvilemodus;sov;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:127 +msgctxt "search-result" +msgid "Switch user" +msgstr "Bytt bruker" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:130 +msgid "switch user" +msgstr "bytt bruker" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:134 +msgctxt "search-result" +msgid "Lock orientation" +msgstr "Lås orientering" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:137 +msgid "lock orientation" +msgstr "lås orientering" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Kommando ikke funnet" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Klarte ikke å lese kommando:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Kjøring av «%s» mislyktes:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Akkurat nå" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minutt siden" +msgstr[1] "%d minutter siden" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d time siden" +msgstr[1] "%d timer siden" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "I går" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag siden" +msgstr[1] "%d dager siden" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d uke siden" +msgstr[1] "%d uker siden" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d måned siden" +msgstr[1] "%d måneder siden" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d år siden" +msgstr[1] "%d år siden" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H.%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "I går, %H.%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H.%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d %B, %H.%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d %B %Y, %H.%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%H.%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "I går, %H.%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %H.%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d %B, %H.%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d %B %Y, %H.%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "Pålogging for trådløst aksesspunkt" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Påloggingen din til dette trådløse aksesspunktet er ikke sikker. Passord " +"eller annen informasjon du oppgir på denne siden kan ses av andre i nærheten." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "Nekt tilgang" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "Gi tilgang" + +#: js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "Ofte brukte programmer vises her" + +#: js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "Ofte" + +#: js/ui/appDisplay.js:937 +msgid "All" +msgstr "Alle" + +#: js/ui/appDisplay.js:1915 +msgid "New Window" +msgstr "Nytt vindu" + +#: js/ui/appDisplay.js:1929 +msgid "Launch using Dedicated Graphics Card" +msgstr "Start med dedikert skjermkort" + +#: js/ui/appDisplay.js:1956 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Fjern fra favoritter" + +#: js/ui/appDisplay.js:1962 +msgid "Add to Favorites" +msgstr "Legg til i favoritter" + +#: js/ui/appDisplay.js:1972 +msgid "Show Details" +msgstr "Vis detaljer" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ble lagt til i favoritter." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s ble fjernet fra favoritter." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Velg lydenhet" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Innstillinger for lyd" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Hodetelefoner" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Headset" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Bytt bakgrunn …" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Innstillinger for skjerm" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:265 +msgid "Settings" +msgstr "Innstillinger" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "O" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "L" + +#: js/ui/calendar.js:449 +msgid "Previous month" +msgstr "Forrige måned" + +#: js/ui/calendar.js:459 +msgid "Next month" +msgstr "Neste måned" + +#: js/ui/calendar.js:612 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:667 +msgid "Week %V" +msgstr "Uke %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:736 +msgctxt "event list time" +msgid "All Day" +msgstr "Hele dagen" + +#: js/ui/calendar.js:869 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A %B %d" + +#: js/ui/calendar.js:873 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A %B %d, %Y" + +#: js/ui/calendar.js:1093 +msgid "No Notifications" +msgstr "Ingen varslinger" + +#: js/ui/calendar.js:1096 +msgid "No Events" +msgstr "Ingen hendelser" + +#: js/ui/calendar.js:1124 +msgid "Clear All" +msgstr "Fjern alle" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» svarer ikke." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "Du kan vente en liten stund for å se om det fortsetter eller tvinge programmet til å avsluttes." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Tvunget avslutting" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Vent" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Ekstern stasjon koblet til" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Ekstern stasjon koblet fra" + +#: js/ui/components/autorunManager.js:358 +#, javascript-format +msgid "Open with %s" +msgstr "Åpne med %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "Passord:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Skriv på nytt:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261 +#: js/ui/status/network.js:355 js/ui/status/network.js:939 +msgid "Connect" +msgstr "Koble til" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Passord: " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Nøkkel: " + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Identitet: " + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Passord for privat nøkkel: " + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Tjeneste: " + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638 +msgid "Authentication required by wireless network" +msgstr "Autentisering kreves av trådløst nettverk" + +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Passord eller krypteringsnøkler kreves for å koble til trådløst nettverk " +"«%s»." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "802.1X autentisering for trådbundet nettverk" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Navn på nettverk: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "DSL-autentisering" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "PIN-kode kreves" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN-kode kreves for mobil bredbåndsenhet" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659 +msgid "Mobile broadband network password" +msgstr "Nettverkspassord for mobilt bredbånd" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643 +#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Du må oppgi et passord for å koble til «%s»." + +#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720 +msgid "Network Manager" +msgstr "Nettverkshåndtering" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "Autentisering kreves" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "Autentiser" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Beklager, det virket ikke. Prøv igjen." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s er nå kjent som %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Vinduer" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +msgid "Show Applications" +msgstr "Vis programmer" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:449 +msgid "Dash" +msgstr "Favoritter" + +#. 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:76 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:83 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "Legg til verdensklokker …" + +#: js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "Verdensklokker" + +#: js/ui/dateMenu.js:225 +msgid "Weather" +msgstr "Vær" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:289 +#, javascript-format +msgid "%s all day." +msgstr "%s hele dagen." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:295 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s så %s senere." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:301 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, så %s etterfulgt av %s senere." + +#: js/ui/dateMenu.js:312 +msgid "Select a location…" +msgstr "Velg en lokasjon …" + +#: js/ui/dateMenu.js:315 +msgid "Loading…" +msgstr "Laster …" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:321 +#, javascript-format +msgid "Feels like %s." +msgstr "Føles som %s." + +#: js/ui/dateMenu.js:324 +msgid "Go online for weather information" +msgstr "Gå på nettet for informasjon om været" + +#: js/ui/dateMenu.js:326 +msgid "Weather information is currently unavailable" +msgstr "Værinformasjon er for tiden utilgjengelig" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Logg ut %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Logg ut" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s logges ut automatisk om %d sekund." +msgstr[1] "%s logges ut automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Du blir logget ut automatisk om %d sekund." +msgstr[1] "Du blir logget ut automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Logg ut" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Slå av" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Installer oppdateringer og slå av" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Systemet slås av automatisk om %d sekund." +msgstr[1] "Systemet slås av automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Installer utestående programvareoppdateringer" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Start på nytt" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Slå av" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Start på nytt" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Systemet starter på nytt automatisk om %d sekund." +msgstr[1] "Systemet starter på nytt automatisk om %d sekunder." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Start på nytt og installer oppdateringer" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Systemet starter på nytt og installere oppdateringer automatisk om %d sekund." +msgstr[1] "" +"Systemet starter på nytt og installere oppdateringer automatisk om %d " +"sekunder." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Start på nytt og installer" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installer og slå av" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Slå av etter at oppdateringer er installert" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Start på nytt og installer oppgradering" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s vil bli installert etter omstart. Installering av oppgraderinger kan " +"ta lang tid: sjekk at du har en sikkerhetskopi og at datamaskinen er koblet " +"til strøm." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Kjører på batteristrøm: vennligst koble til strøm før oppdateringer blir " +"installert." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "Noen programmer er opptatt eller har arbeid som ikke er lagret." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Andre brukere er logget inn." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (ekstern)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsoll)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Installer" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Vil du laste ned og installere «%s» fra extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vil hindre snarveier" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Programmet vil hindre snarveier" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Du kan gjenopprette snarveier ved å trykke %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Nekt" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Tillat" + +#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "Tastatur" + +#: js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "Ingen utvidelser installert" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s har ikke avgitt noen feil." + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "Skjul feil" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "Vis feil" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "Slått på" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Slått av" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "Feil" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "Utdatert" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "Laster ned" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "Vis kildekode" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "Nettside" + +#: js/ui/messageTray.js:1494 +msgid "System Information" +msgstr "Systeminformasjon" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Ukjent artist" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Ukjent tittel" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Angre" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Oversikt" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Skriv for å søke …" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "Ny snarvei …" + +#: js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "Definert program" + +#: js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "Vis hjelp på skjermen" + +#: js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "Bytt skjerm" + +#: js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "Tildel tastatursnarvei" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "Ferdig" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "Rediger …" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "Ingen" + +#: js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "Trykk en knapp for å konfigurere" + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "Trykk Esc for å avslutte" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "Trykk en tast for å avslutte" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Avslutt" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Aktiviteter" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "System" + +#: js/ui/panel.js:811 +msgid "Top Bar" +msgstr "Topp-panel" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Skriv inn en kommando" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "Lukk" + +#: js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "Omstart er ikke tilgjengelig i Wayland" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "Starter på nytt …" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d ny melding" +msgstr[1] "%d nye meldinger" + +#: js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ny varsling" +msgstr[1] "%d nye varslinger" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:284 +msgid "Lock" +msgstr "Lås" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "GNOME må låse skjermen" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr "Klarte ikke å låse" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 +msgid "Lock was blocked by an application" +msgstr "Låsing ble stoppet av et program" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "Søker …" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "Ingen resultater." + +#: js/ui/search.js:777 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d flere" +msgstr[1] "%d flere" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Kopier" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Lim inn" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Vis tekst" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Skjul tekst" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "Passord" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "Husk passord" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Tilgjengelighet" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Zoom" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Skjermleser" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Tastatur på skjermen" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Synlig varsling" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Klebrige taster" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Trege taster" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Spretne taster" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Mustaster" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Høy kontrast" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Stor tekst" + +#: js/ui/status/bluetooth.js:48 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:627 +msgid "Bluetooth Settings" +msgstr "Bluetooth-innstillinger" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:137 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d koblet til" +msgstr[1] "%d koblet til" + +#: js/ui/status/bluetooth.js:139 +msgid "Off" +msgstr "Av" + +#: js/ui/status/bluetooth.js:141 +msgid "On" +msgstr "På" + +#: js/ui/status/bluetooth.js:143 js/ui/status/network.js:1299 +msgid "Turn On" +msgstr "Slå på" + +#: js/ui/status/bluetooth.js:143 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 "Slå av" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Lysstyrke" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "Vis tastaturutforming" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Plassering slått på" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Slå av" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Innstillinger for personvern" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Plassering i bruk" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Plassering slått av" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Slå på" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Gi %s tilgang til din plassering?" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Tilgang til plassering kan endres når som helst fra innstillinger for " +"personvern." + +#: js/ui/status/network.js:104 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 js/ui/status/network.js:1328 +#, javascript-format +msgid "%s Off" +msgstr "%s av" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:457 +#, javascript-format +msgid "%s Connected" +msgstr "%s koblet til" + +#. 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 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s håndteres ikke" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:465 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s kobler fra" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:472 js/ui/status/network.js:1320 +#, javascript-format +msgid "%s Connecting" +msgstr "%s kobler til" + +#. 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 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s krever autentisering" + +#. 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 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Fastvare mangler for %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 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s er ikke tilgjengelig" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:490 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s tilkobling mislyktes" + +#: js/ui/status/network.js:506 +msgid "Wired Settings" +msgstr "Innstillinger for trådbundet nettverk" + +#: js/ui/status/network.js:548 +msgid "Mobile Broadband Settings" +msgstr "Innstillinger for mobilt bredbånd" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:591 js/ui/status/network.js:1325 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s maskinvare slått av" + +#. 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 +#, javascript-format +msgid "%s Disabled" +msgstr "%s slått av" + +#: js/ui/status/network.js:635 +msgid "Connect to Internet" +msgstr "Koble til internett" + +#: js/ui/status/network.js:833 +msgid "Airplane Mode is On" +msgstr "Flymodus er slått på" + +#: js/ui/status/network.js:834 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Trådløst blir slått av når flymodus slås på." + +#: js/ui/status/network.js:835 +msgid "Turn Off Airplane Mode" +msgstr "Slå av flymodus" + +#: js/ui/status/network.js:844 +msgid "Wi-Fi is Off" +msgstr "Trådløs er av" + +#: js/ui/status/network.js:845 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Trådløs må slås på for å koble til et nettverk." + +#: js/ui/status/network.js:846 +msgid "Turn On Wi-Fi" +msgstr "Slå på trådløs" + +#: js/ui/status/network.js:871 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi nettverk" + +#: js/ui/status/network.js:873 +msgid "Select a network" +msgstr "Velg et nettverk" + +#: js/ui/status/network.js:903 +msgid "No Networks" +msgstr "Ingen nettverk" + +#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Bruk maskinvarebryter til å slå av" + +#: js/ui/status/network.js:1191 +msgid "Select Network" +msgstr "Velg nettverk" + +#: js/ui/status/network.js:1197 +msgid "Wi-Fi Settings" +msgstr "Innstillinger" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1316 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s aksesspunkt aktivt" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1331 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s ikke koblet til" + +#: js/ui/status/network.js:1435 +msgid "connecting…" +msgstr "kobler til …" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1438 +msgid "authentication required" +msgstr "autentisering kreves" + +#: js/ui/status/network.js:1440 +msgid "connection failed" +msgstr "tilkobling mislyktes" + +#: js/ui/status/network.js:1494 +msgid "VPN Settings" +msgstr "Innstillinger for VPN" + +#: js/ui/status/network.js:1498 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1508 +msgid "VPN Off" +msgstr "VPN av" + +#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Innstillinger for nettverk" + +#: js/ui/status/network.js:1603 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s kablet tilkobling" +msgstr[1] "%s kablede tilkoblinger" + +#: js/ui/status/network.js:1607 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s trådløs tilkobling" +msgstr[1] "%s trådløse tilkoblinger" + +#: js/ui/status/network.js:1611 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s tilkobling med modem" +msgstr[1] "%s tilkoblinger med modem" + +#: js/ui/status/network.js:1759 +msgid "Connection failed" +msgstr "Tilkobling mislyktes" + +#: js/ui/status/network.js:1760 +msgid "Activation of network connection failed" +msgstr "Aktivering av nettverkstilkobling mislyktes" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "Nattlys slått av" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Nattlys slått på" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Gjenoppta" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Slå av til i morgen" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Innstillinger for strøm" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Fullt oppladet" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Estimerer …" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d:%02d gjenstår (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d til batteriet er fullt (%d %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Flymodus er slått på" + +#: js/ui/status/system.js:228 +msgid "Switch User" +msgstr "Bytt bruker" + +#: js/ui/status/system.js:240 +msgid "Log Out" +msgstr "Logg ut" + +#: js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "Innstillinger for konto" + +#: js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "Lås for orientering" + +#: js/ui/status/system.js:295 +msgid "Suspend" +msgstr "Hvilemodus" + +#: js/ui/status/system.js:305 +msgid "Power Off" +msgstr "Slå av" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "Volum endret" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Volum" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Speil" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Slå sammen skjermer" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Kun ekstern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Kun innebygget" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Logg inn som en annen bruker" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Lås opp vindu" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Programmer" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Søk" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» er klar" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Vil du beholde disse skjerminnstillingene?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Forkast innstillinger" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Behold endringer" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Endringer i innstillingene forkastes om %d sekund" +msgstr[1] "Endringer i innstillingene forkastes om %d sekunder" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Minimer" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "De-maksimer" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Maksimer" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Flytt" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Endre størrelse" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Flytt tittellinja på skjermen" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Alltid øverst" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Alltid på synlig arbeidsområde" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Flytt til arbeidsområdet til venstre" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "Flytt til arbeidsområdet til høyre" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "Flytt til arbeidsområdet over" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "Flytt til arbeidsområdet under" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Flytt til skjermen over" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Flytt til skjermen under" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "Flytt til skjermen til venstre" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "Flytt til skjermen til høyre" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution kalender" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:380 +msgid "Print version" +msgstr "Vis versjon" + +#: src/main.c:386 +msgid "Mode used by GDM for login screen" +msgstr "Modus som brukes av GDM for innloggingsskjermen" + +#: src/main.c:392 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Bruk spesifikt modus, f.eks. «gdm» for innloggingsskjerm" + +#: src/main.c:398 +msgid "List possible modes" +msgstr "Vis mulige modi" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Ukjent" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Klarte ikke å starte «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Passordene er ikke like." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Passordet kan ikke være tomt" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Autentiseringsdialogen ble lukket av brukeren" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u utgang" +msgstr[1] "%u utganger" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u inngang" +msgstr[1] "%u innganger" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Systemlyder" diff --git a/po/ne.po b/po/ne.po new file mode 100644 index 0000000..52dcc62 --- /dev/null +++ b/po/ne.po @@ -0,0 +1,2235 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Nepali Translation Gnome 3.26 dev\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-07-20 03:49+0000\n" +"PO-Revision-Date: 2017-07-24 17:09+0545\n" +"Last-Translator: Pawan Chitrakar \n" +"Language-Team: Nepali Translation Team \n" +"Language: ne\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-Poedit-SourceCharset: UTF-8\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "प्रणाली" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "सूचना सुची देखाउनुहोस्" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "सक्रिय सुचना फोकस" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "अधिलेखन हेर्नुहोस्" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "सबै अनुप्रयोगहरू देखाउनुहोस्" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "अनुप्रयोग मेनु खोल्नुहोस्" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "सेल विस्तारहरू" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "जिनोम सेल विस्तारहरू कन्फिगर" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "जिनोम शेल" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "सञ्झ्याल प्रबन्ध र अनुप्रयोग सुरुआत " + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:16 +#, fuzzy +msgid "UUIDs of extensions to enable" +msgstr "विस्तारहरू..." + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "सेल विस्तारहरू असक्षम पार्नुहोस्" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "अनुप्रयोग पिकर संवाद" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:108 +#, fuzzy +#| msgid "Keybinding to open the application menu" +msgid "Keybinding to open the “Show Applications” view" +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:109 +#, fuzzy +#| msgid "Keybinding to open the application menu." +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:116 +#, fuzzy +msgid "Keybinding to open the overview" +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:117 +#, fuzzy +msgid "Keybinding to open the Activities Overview." +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:123 +#, fuzzy +#| msgid "Keybinding to open the application menu" +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:124 +#, fuzzy +#| msgid "Keybinding to open the application menu." +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "मेनुबारलाई सक्रिय गर्न किबाइन्डिङ्ग" + +#: data/org.gnome.shell.gschema.xml.in:130 +#, fuzzy +msgid "Keybinding to focus the active notification" +msgstr "सक्रिय सुचना फोकस" + +#: data/org.gnome.shell.gschema.xml.in:131 +#, fuzzy +msgid "Keybinding to focus the active notification." +msgstr "सक्रिय सुचना फोकस" + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:146 +#, fuzzy +msgid "Which keyboard to use" +msgstr "'extcmd' को कुन कार्यन्वयन प्रयोग गर्ने" + +#: data/org.gnome.shell.gschema.xml.in:147 +#, fuzzy +msgid "The type of keyboard to use." +msgstr "गतिशील कुञ्जीपाटी सर्टकट प्रयोग गर्नुहोस्" + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +#, fuzzy +msgid "Limit switcher to current workspace." +msgstr "कार्यस्थान स्विचर" + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "अनुप्रयोग प्रतिमा मात्रै" + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:214 +#, fuzzy +msgid "Workspaces are managed dynamically" +msgstr "यो यन्त्र रङ व्यवस्थित छैन।" + +#: data/org.gnome.shell.gschema.xml.in:222 +#, fuzzy +msgid "Workspaces only on primary monitor" +msgstr "प्राथमिक मोनिटर" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +#, fuzzy +#| msgid "Network error" +msgid "Network Login" +msgstr "सञ्जाल" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +#, fuzzy +#| msgid "Network error" +msgid "network-workgroup" +msgstr "एसएमबी (SMB) कार्यसमूह" + +#: js/extensionPrefs/main.js:120 +#, fuzzy, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "पीएनजी फाइल लोड गर्दा त्रुटि: %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:947 +msgid "Cancel" +msgstr "_रद्द" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "पछिल्लो" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "ताल्चा खोल्नुहोस्" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "लगइन गर्दै" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "सेसन छान।नुहोस्" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "सूचीमा नभएको ?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, fuzzy, javascript-format +msgid "(e.g., user or %s)" +msgstr "%s: अज्ञात प्रयोगकर्ता %s\n" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "प्रयोगकर्ता नाम :" + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "सञ्झ्याल लगइन गर्नुहोस्" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "प्रमाणीकरण त्रुति" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +#, fuzzy +msgid "(or swipe finger)" +msgstr "मेटाउन स्वाइप गर्नुहोस्" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "आदेश फेला परेन ।" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "आदेश पद वर्णन गर्न सकेन" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "\"%s\" कार्यान्वयन असफल।" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "अहिले" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "हिजो" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "" +msgstr[1] "" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "" +msgstr[1] "" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "" +msgstr[1] "" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "हिजो %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "हिजो %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%b %d %l:%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "हटस्पट लगईन" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "अस्वीकार गर्नुहोस्" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "अनुमति दिनुहोस्" + +#: js/ui/appDisplay.js:806 +msgid "Frequently used applications will appear here" +msgstr "" + +#: js/ui/appDisplay.js:927 +msgid "Frequent" +msgstr "" + +#: js/ui/appDisplay.js:934 +msgid "All" +msgstr "सबै" + +#: js/ui/appDisplay.js:1895 +msgid "New Window" +msgstr "नयाँ सञ्झ्याल" + +#: js/ui/appDisplay.js:1909 +msgid "Launch using Dedicated Graphics Card" +msgstr "" + +#: js/ui/appDisplay.js:1936 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "मनपर्नेबाट हताउनुहोस्" + +#: js/ui/appDisplay.js:1942 +msgid "Add to Favorites" +msgstr "मनपर्ने " + +#: js/ui/appDisplay.js:1952 +msgid "Show Details" +msgstr "अरू धेरै विवरण देखाउनुहोस्" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "" + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "" + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "ध्वनी यन्त्र छन्नुहोस्" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "ध्वोनिका सेटिङ्स" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "हेडफोनहरू" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "हेडसेट" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "माईक्रोफोन" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "पृष्ठभूमि परिवर्तन गर्नुहोस्" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "अनुकूलता देखाउ" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:407 +msgid "Settings" +msgstr "सेटिङ" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "पहिलो महिना:" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr " अर्को महिना:" + +#: js/ui/calendar.js:605 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:660 +msgid "Week %V" +msgstr "%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 +msgctxt "event list time" +msgid "All Day" +msgstr "दिनभर" + +#: js/ui/calendar.js:862 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:866 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: js/ui/calendar.js:1086 +msgid "No Notifications" +msgstr "सूचनाहरू छैन" + +#: js/ui/calendar.js:1089 +msgid "No Events" +msgstr "घटनाहरू छैन" + +#: js/ui/calendar.js:1117 +msgid "Clear All" +msgstr "सबै खाली गर्नुहोस्" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "%s ले जवाफ दिन बन्द गरेको छ." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"तपाईँले अनुप्रयोगलाई जारी राख्न केही समय प्रतिक्षा गर्नुहोस् रोज्न वा यसलाई पूर्ण रूपमा " +"अन्त्य गर्न दवाब दिन सक्नुहुन्छ ।" + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "_अन्त्य गर्न दवाब दिनुहोस्" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "_प्रतिक्षा गर्नुहोस्" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "बाहिरि ड्राइभ जडान भयो" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "बाहिरि ड्राइभ विच्छेद भयो" + +#: js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "%s सँग खोल्नुहोस्" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "पासवर्ड:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "फेरि टाईप गर्नुहोस्" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:272 +#: js/ui/status/network.js:366 js/ui/status/network.js:950 +msgid "Connect" +msgstr "जडान गर्नुहोस्" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "पासवर्ड: " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "कुञ्जी:" + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "परिचय" + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "निजी कुञ्जी पासवर्ड:" + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "सेवा" + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638 +#, fuzzy +msgid "Authentication required by wireless network" +msgstr "संजाल , बिना तार, आपी ," + +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "Wired 802.1X प्रमाणीकरण" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "सञ्जाल नाम:" + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "DSL प्रमाणीकरण " + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "पिन कोड आवश्यक" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653 +msgid "PIN code is needed for the mobile broadband device" +msgstr "" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "पिन" + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659 +#, fuzzy +msgid "Mobile broadband network password" +msgstr "मोबाइल ब्रोडब्यान्ड सेटिङ्ग" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643 +#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s” जडान गर्न पासवर्ड चाहिने छ" + +#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1760 +msgid "Network Manager" +msgstr "सञ्जाल प्रबन्धक" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "प्रमाणीकरण आवश्यक" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "प्रशासक" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "प्रमाणीकरण" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "त्यो कार्य भएन : पुन प्रयास गर्नुस।. " + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s अब %s भएको छ" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:179 +msgid "Windows" +msgstr "सञ्झ्यालहरू" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +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 +msgid "Dash" +msgstr "ड्यास" + +#. 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 +#| msgid "%A %B %e, %Y" +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:82 +#| msgid "%A %B %e, %Y" +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:144 +#, fuzzy +msgid "Add world clocks…" +msgstr "विश्व " + +#: js/ui/dateMenu.js:145 +#, fuzzy +#| msgid "Open Clocks" +msgid "World Clocks" +msgstr "विश्व " + +#: js/ui/dateMenu.js:224 +msgid "Weather" +msgstr "मौसम" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:281 +#, fuzzy, javascript-format +msgid "%s all day." +msgstr "दिनभर" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:287 +#, fuzzy, javascript-format +msgid "%s, then %s later." +msgstr "%s: पछि फेरी प्रयास गर्नुहोस्\n" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:293 +#, fuzzy, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "फाँट नाम `%.*s' विरामचिन्ह द्धारा साथ दिनु पर्छ" + +#: js/ui/dateMenu.js:300 +#, fuzzy +msgid "Select a location…" +msgstr "_स्थान छान्नुहोस्" + +#: js/ui/dateMenu.js:303 +msgid "Loading…" +msgstr "लोड गर्दैछ..." + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:309 +#, fuzzy, javascript-format +msgid "Feels like %s." +msgstr "हवस् त, %s । तपाईं के चाहनुहुन्छ..." + +#: js/ui/dateMenu.js:312 +msgid "Go online for weather information" +msgstr "" + +#: js/ui/dateMenu.js:314 +#, fuzzy +msgid "Weather information is currently unavailable" +msgstr "प्याकेज क्यास उपलब्ध छैन ।" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "लगआउट %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "लगआउट" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "लगआउट" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "पावर बन्द" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "अपडेट स्थापना पछि पावर बन्द गर्ने" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "बाकि अनुप्रयोग स्थापना गर्नुहोस्" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "फेरि सुरू गर्नुहोस्" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "पावर बन्द" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "फेरि सुरू गर्नुहोस्" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: js/ui/endSessionDialog.js:119 +#, fuzzy +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "स्थापना गर्न कुनै पनि अद्यावधिहरू छैनन्" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +#, fuzzy +msgctxt "button" +msgid "Restart & Install" +msgstr "_पुन: सुचारु गर्नुहोस्..." + +#: js/ui/endSessionDialog.js:128 +#, fuzzy +msgctxt "button" +msgid "Install & Power Off" +msgstr "अपडेट स्थापना पछि पावर बन्द गर्ने" + +#: js/ui/endSessionDialog.js:129 +#, fuzzy +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "अपडेट स्थापना पछि पावर बन्द गर्ने" + +#: js/ui/endSessionDialog.js:137 +#, fuzzy +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "अपग्रेड गर्नुहोस्" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "" + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "अरू प्रयोगकर्ताहरू लग्इन गरेका छन् " + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s टाढा" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (कन्सोल)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "स्थापना गर्नुहोस्" + +#: js/ui/extensionDownloader.js:206 +#, fuzzy, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "%s: लाई '%s' बाट स्थापना गर्नुहोस्\n" + +#: js/ui/keyboard.js:740 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "कुञ्जीपाटी" + +#. translators: 'Hide' is a verb +#: js/ui/legacyTray.js:65 +#, fuzzy +#| msgid "Hide Text" +msgid "Hide tray" +msgstr "लुकाउनुहोस्" + +#: js/ui/legacyTray.js:106 +#, fuzzy +msgid "Status Icons" +msgstr "प्रतिमाहरू" + +#: js/ui/lookingGlass.js:642 +#, fuzzy +msgid "No extensions installed" +msgstr "विस्तारहरू..." + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "" + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "त्रुटि लुकाउनुहोस्" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "त्रुटि देखाउनुहोस्" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "सक्षम पारिएको" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "अक्षम पारिएको" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "त्रुटि:" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "मिति भन्दा बाहिर छ" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "डाउनलोड हुँदैछ" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "स्रोत हेर्नुहोस्" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "वेब पृष्ठ" + +#: js/ui/messageTray.js:1493 +msgid "System Information" +msgstr "प्रणाली जानकारी" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "अज्ञात कलाकार" + +#: js/ui/mpris.js:212 +#, fuzzy +msgid "Unknown title" +msgstr "अज्ञात " + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "पूर्वस्थितिमा फर्काउनुहोस्" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "अधिलेखन गर्नुहोस्" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr " खोजी गर्न टाईप गर्नुहोस्" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "नयाँ शर्टकर्ट..." + +#: js/ui/padOsd.js:152 +#, fuzzy +#| msgid "Applications" +msgid "Application defined" +msgstr "अनुप्रयोग" + +#: js/ui/padOsd.js:153 +#, fuzzy +msgid "Show on-screen help" +msgstr "सिहर्स मद्दत देखाउनुहोस्" + +#: js/ui/padOsd.js:154 +#, fuzzy +#| msgid "Switch User" +msgid "Switch monitor" +msgstr "मोनिटर बदल्नुहोस् " + +#: js/ui/padOsd.js:155 +#, fuzzy +msgid "Assign keystroke" +msgstr "कुञ्जी स्ट्रोक पठाउनुस्" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "गरियो" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "सम्पादन" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "None" + +#: js/ui/padOsd.js:833 +#, fuzzy +msgid "Press a button to configure" +msgstr "बटन थिच्नुहोस्..." + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "निस्कन ESC थिच्नुहोस्" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "निस्कनको लागि कुनै कुञ्जी थिच्नुहोस्..." + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "अन्त्य गर्नुहोस्" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "गतिविधिहरू" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "प्रणाली" + +#: js/ui/panel.js:812 +msgid "Top Bar" +msgstr "माथिल्लो पट्टी" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +#, fuzzy +msgid "toggle-switch-us" +msgstr "उल्टनू" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "आदेश " + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "बन्द गर्नुहोस्" + +#: js/ui/runDialog.js:277 +#, fuzzy +msgid "Restart is not available on Wayland" +msgstr "उपलब्ध" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "पुन: सुरुआत गर्दै" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d नयाँ सन्देश" +msgstr[1] "%d नयाँ सन्देशहरू" + +#: js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d नयाँ सन्देश" +msgstr[1] "%d नयाँ सन्देश" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:415 +msgid "Lock" +msgstr "ताल्चा लगाउनुहोस्" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "प्रयोगकर्तालाई उसको पर्दामा ताल्चा लगाउन पर्‌यो " + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr " ताल्चा मार्न असक्षम" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 +#, fuzzy +msgid "Lock was blocked by an application" +msgstr "माफ गर्नुहोस्, तपाईंको %{ 1 } अब रोकिएको छ।" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "खोजी गर्दै" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "नतिजा छैन" + +#: js/ui/search.js:768 +#, javascript-format +msgid "%d more" +msgstr "अरु %d " + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "प्रतिलिपि बनाउनुहोस्..." + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "टाँस्नुहोस्" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "पाठ देखाऊ" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "प्रविष्टि पाठ लुकाउनुहोस्" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "पासवर्ड" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "पासवर्ड सम्झनुहोस्" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "पहुँचता" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "जूम गर्नुहोस्" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "दृष्टि वाचक" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "कुञ्जिपाटी " + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "दृश्यात्मक सावधानि" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "टाँसिने कुञ्जि" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "सुस्त कुञ्जीहरू" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "बाउन्स कुञ्जीहरू" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "माउस कुञ्जीहरू" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "उच्च व्यतिरेक" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "ठूलो पाठ शैली" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "ब्लुटुठ" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:638 +msgid "Bluetooth Settings" +msgstr "ब्लुटुठ सेटिङ" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d जडान गरियो" +msgstr[1] "%d जडान गरियो" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "बन्द" + +#: js/ui/status/bluetooth.js:140 +msgid "On" +msgstr "खुला छ" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1310 +msgid "Turn On" +msgstr "सुरु गर्नुहोस" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181 +#: js/ui/status/network.js:367 js/ui/status/network.js:1310 +#: js/ui/status/network.js:1429 js/ui/status/nightLight.js:47 +#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117 +msgid "Turn Off" +msgstr "बन्द गर्नुहोस्" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "चम्लिकोपना:" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "किबोर्ड लेआउट देखाउनुहोस्" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +#, fuzzy +msgid "Location Enabled" +msgstr "_स्थान " + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "अक्षम पार्नुहोस्" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "गोपनीयता सेटिङहरू" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "स्थान प्रयोगमा छ" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "स्थान अक्षम पारिएको" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "सक्षम पार्नुहोस्" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +#, fuzzy, javascript-format +msgid "Give %s access to your location?" +msgstr "%1% तपाइको हालको स्थान थाहा पाउन चाहन्छ ।" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" + +#: js/ui/status/network.js:104 +msgid "" +msgstr "<अज्ञात>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:465 js/ui/status/network.js:1339 +#, javascript-format +msgid "%s Off" +msgstr "%s बन्द छ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:468 +#, javascript-format +msgid "%s Connected" +msgstr "%s जडान भएको छ" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:473 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s अव्यवस्थित" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:476 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s जडान हटाउदै" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:483 js/ui/status/network.js:1331 +#, javascript-format +msgid "%s Connecting" +msgstr "%s मा जडान गरिदैछ" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:486 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s प्रमाणीकरण आवश्यक छ" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:494 +#, fuzzy, javascript-format +msgid "Firmware Missing For %s" +msgstr "फर्मवेयर छैन" + +#. 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:498 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s उपलब्ध छैन" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:501 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s जडान असफल" + +#: js/ui/status/network.js:517 +msgid "Wired Settings" +msgstr "तारजडिट सेटिङ्ग" + +#: js/ui/status/network.js:559 +msgid "Mobile Broadband Settings" +msgstr "मोबाइल ब्रोडब्यान्ड सेटिङ्ग" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:602 js/ui/status/network.js:1336 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s हार्डवेयरअक्षम " + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:606 +#, javascript-format +msgid "%s Disabled" +msgstr "%s अक्षम " + +#: js/ui/status/network.js:646 +msgid "Connect to Internet" +msgstr "इन्टरनेट जडान गर्ने" + +#: js/ui/status/network.js:844 +msgid "Airplane Mode is On" +msgstr "एअरप्लेन मोड राख्नु" + +#: js/ui/status/network.js:845 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "" + +#: js/ui/status/network.js:846 +msgid "Turn Off Airplane Mode" +msgstr "एअरप्लेन मोड हटाऊनु" + +#: js/ui/status/network.js:855 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi बन्द छ" + +#: js/ui/status/network.js:856 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "" + +#: js/ui/status/network.js:857 +msgid "Turn On Wi-Fi" +msgstr "वाइफाइ खोल्नुहोस्" + +#: js/ui/status/network.js:882 +msgid "Wi-Fi Networks" +msgstr "वाई-फाई सञ्जाल" + +#: js/ui/status/network.js:884 +msgid "Select a network" +msgstr "सञ्जाल चयन गर्नुहोस" + +#: js/ui/status/network.js:914 +msgid "No Networks" +msgstr "सञ्जाल छैन" + +#: js/ui/status/network.js:935 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "" + +#: js/ui/status/network.js:1202 +msgid "Select Network" +msgstr "सञ्जाल चयन गर्नुहोस" + +#: js/ui/status/network.js:1208 +msgid "Wi-Fi Settings" +msgstr "वाई-फाई सेटिङ्ग" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1327 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "सक्रिय हटस्पट %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1342 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s जडान भएको छैन ।" + +#: js/ui/status/network.js:1446 +msgid "connecting…" +msgstr "जडान गर्दै....." + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1449 +msgid "authentication required" +msgstr "प्रमाणीकरण आवश्यक" + +#: js/ui/status/network.js:1451 +msgid "connection failed" +msgstr "जडान असफल" + +#: js/ui/status/network.js:1517 js/ui/status/network.js:1612 +#: js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "सञ्जाल सेटिङ" + +#: js/ui/status/network.js:1519 +msgid "VPN Settings" +msgstr "भीपीएन सेटिङ" + +#: js/ui/status/network.js:1538 +msgid "VPN" +msgstr "भीपीएन" + +#: js/ui/status/network.js:1548 +msgid "VPN Off" +msgstr "भीपीएन बन्द गर्नुहोस्" + +#: js/ui/status/network.js:1643 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s तार जडान" +msgstr[1] "%s तारहरू जडान" + +#: js/ui/status/network.js:1647 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s वाई-फाई जडान" +msgstr[1] "%s वाई-फाईहरू जडान" + +#: js/ui/status/network.js:1651 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s मोडेम जडान" +msgstr[1] "%s मोडेमहरू जडान" + +#: js/ui/status/network.js:1799 +msgid "Connection failed" +msgstr "जडान असफल" + +#: js/ui/status/network.js:1800 +msgid "Activation of network connection failed" +msgstr "सञ्जालमा जडान असफल भयो ।" + +#: js/ui/status/nightLight.js:68 +#, fuzzy +msgid "Night Light Disabled" +msgstr "(अक्षम पारिएको)" + +#: js/ui/status/nightLight.js:69 +#, fuzzy +msgid "Night Light On" +msgstr "प्रकाश छैन" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "पुन: निरन्तरता दिनुहोस्" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "भोलि सम्म निस्क्रिय" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "पावर सेटिङ" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "पुरा चार्ज भयो" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "आँकलन गर्दै..." + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d बाँकि (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +#| msgid "%d∶%02d Remaining (%d%%)" +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d पूरा हुन (%d %%) बाँकि" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "एअरप्लेन मोड राख्नु" + +#: js/ui/status/system.js:384 +msgid "Switch User" +msgstr "स्विच प्रयोगकर्ता" + +#: js/ui/status/system.js:389 +msgid "Log Out" +msgstr "लगआउट" + +#: js/ui/status/system.js:394 +msgid "Account Settings" +msgstr "खाता सेटिङ्ग" + +#: js/ui/status/system.js:411 +#, fuzzy +msgid "Orientation Lock" +msgstr "अभिमुखिकरण:" + +#: js/ui/status/system.js:419 +msgid "Suspend" +msgstr "निश्क्रिय गर्ने" + +#: js/ui/status/system.js:422 +msgid "Power Off" +msgstr "पावर बन्द" + +#: js/ui/status/volume.js:128 +#, fuzzy +msgid "Volume changed" +msgstr "परिवर्तित रेखा" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "भोल्युम" + +#: js/ui/unlockDialog.js:67 +#, fuzzy +msgid "Log in as another user" +msgstr "अन्य प्रयोगकर्तालाई तपाईँको डेस्कटप हेरिरहेको छ" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "ताल्चा हटाउनुहोस्" + +#: js/ui/viewSelector.js:183 +msgid "Applications" +msgstr "अनुप्रयोग" + +#: js/ui/viewSelector.js:187 +msgid "Search" +msgstr "खोजी गर्नुहोस्" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” तयार छ" + +#: js/ui/windowManager.js:71 +msgid "Do you want to keep these display settings?" +msgstr "के तपाई यी डिस्प्ले सेटिङ्ग राख्न चाहनुहुन्छ?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:83 +msgid "Revert Settings" +msgstr "सेटिङ्ग उल्टाउनुहोस्" + +#: js/ui/windowManager.js:86 +msgid "Keep Changes" +msgstr "परिवर्तनहरू राख्नुहोस्" + +#: js/ui/windowManager.js:104 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:659 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "सानो बनाउनुहोस्" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "पूर्वावस्थामा ल्याउनुहोस्" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "ठूलो बनाउनुहोस्" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "सार्नुहोस्" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "पुन:आकार" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "शीर्षकपट्टीलाई पर्दामा सार्नुहोस्" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "सधै माथि" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "सधैँ दृश्यात्मक कार्यस्थानमा" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "कार्यक्षेत्र बायाँ सार्नुहोस्" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "कार्यक्षेत्र दायाँ सार्नुहोस्" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "कार्यस्थानलाई माथि सार्नुहोस्" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "कार्यस्थानलाई तल सार्नुहोस्" + +#: js/ui/windowMenu.js:134 +#, fuzzy +#| msgid "Move to Workspace Up" +msgid "Move to Monitor Up" +msgstr "माथि सार्नु" + +#: js/ui/windowMenu.js:140 +#, fuzzy +#| msgid "Move to Workspace Down" +msgid "Move to Monitor Down" +msgstr "ट्याब बायाँतिर सार्नुहोस्" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "ट्याब बायाँतिर सार्नुहोस्" + +#: js/ui/windowMenu.js:152 +#, fuzzy +msgid "Move to Monitor Right" +msgstr "दाँया सार्नुहोस्" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "इभोल्युसन पात्रो" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:372 +msgid "Print version" +msgstr "मुद्रण संस्करण" + +#: src/main.c:378 +msgid "Mode used by GDM for login screen" +msgstr "" + +#: src/main.c:384 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "" + +#: src/main.c:390 +#, fuzzy +msgid "List possible modes" +msgstr "प्रतिमाहरूमा सम्भाव्य क्याप्सनहरूको सूची" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "अज्ञात" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "%s सुरु गर्न असफल" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "पासवर्ड मिलेन" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "पासवर्ड खालि हुन सक्दैन" + +#: src/shell-polkit-authentication-agent.c:353 +#, fuzzy +msgid "Authentication dialog was dismissed by the user" +msgstr "संवाद त्यागियो (%s, %d): " + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u निर्गत" +msgstr[1] "%u निर्गतहरू" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u आगत" +msgstr[1] "%u आगत" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "प्रणाली ध्वनिहरू" + +#~ msgid "Show the message tray" +#~ msgstr "सन्देश पूर्वावलोकन देखाउनुहोस्" + +#, fuzzy +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME को आँखाका लागि प्राथमिकताहरू" + +#, fuzzy +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "व्यल्यान्ड जिनोम" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "क्यालेन्डरमा हप्ता नम्बर देखाउनुहोस्" + +#, fuzzy +#~ msgid "Web Authentication Redirect" +#~ msgstr "अस्थायी प्रमाणीकरण असफल" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Su" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "M" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "T" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "W" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Th" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "F" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "S" + +#, fuzzy +#~ msgid "Nothing Scheduled" +#~ msgstr "केही पनि होइन" + +#~ msgid "Today" +#~ msgstr "आज" + +#~ msgid "Tomorrow" +#~ msgstr "भोलि" + +#~ msgid "This week" +#~ msgstr "यो हप्ता" + +#~ msgid "Next week" +#~ msgstr "गएको हप्ता" + +#~ msgid "Removable Devices" +#~ msgstr "छुट्याउन मिल्ने यन्त्र" + +#~ msgid "Eject" +#~ msgstr "निकाल" + +#~ msgid "Invitation" +#~ msgstr "निमन्त्रना" + +#~ msgid "Call" +#~ msgstr "कल" + +#~ msgid "File Transfer" +#~ msgstr "फाइल स्थानान्तरण" + +#~ msgid "Chat" +#~ msgstr "कुराकानी" + +#~ msgid "Unmute" +#~ msgstr "मौन हटाउनुहोस्" + +#~ msgid "Mute" +#~ msgstr "मौन" + +#~ msgid "Invitation to %s" +#~ msgstr " %sलाई निमन्त्रणा" + +#, fuzzy +#~ msgid "%s is inviting you to join %s" +#~ msgstr "के तपाईँ वार्तालाप जडान गर्न चाहानुहुन्छ ?" + +#~ msgid "Decline" +#~ msgstr "घटाउनुहोस्" + +#~ msgid "Accept" +#~ msgstr "स्विकार गर्नुहोस्" + +#, fuzzy +#~ msgid "Video call from %s" +#~ msgstr "inetd बाट आह्वान गरिएको" + +#, fuzzy +#~ msgid "Call from %s" +#~ msgstr "%s बाट विच्छेदन गर्नुहोस्..." + +#~ msgid "Answer" +#~ msgstr "उत्तर" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s ले %s पठाएको छ" + +#~ msgid "Authentication failed" +#~ msgstr "प्रमाणीकरण असफल भयो ।" + +#~ msgid "Encryption error" +#~ msgstr "गुप्तीकरण त्रुति" + +#~ msgid "Certificate not provided" +#~ msgstr "प्रमाणपत्र उपलब्ध छैन" + +#~ msgid "Certificate untrusted" +#~ msgstr "प्रमाणपत्र विश्वासिलो भएन" + +#~ msgid "Certificate expired" +#~ msgstr "मिति नाघेको प्रमाणपत्र " + +#, fuzzy +#~ msgid "Certificate not activated" +#~ msgstr "" + +#, fuzzy +#~ msgid "Certificate hostname mismatch" +#~ msgstr "AKID/SKID बेमेल" + +#, fuzzy +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "AKID/SKID बेमेल" + +#~ msgid "Certificate self-signed" +#~ msgstr "श्रींखलामा आफै-हस्ताक्षर गरिएको प्रमाणपत्र" + +#, fuzzy +#~ msgid "Status is set to offline" +#~ msgstr "जीकन्फ कुञ्जी \"%s\" लाई अमान्य प्रकारमा सेट गरिएको छ\n" + +#~ msgid "Certificate is invalid" +#~ msgstr "अवैध प्रमाणपत्र" + +#~ msgid "Connection has been refused" +#~ msgstr "सञ्जाल जडान विच्छेदन भयो ।" + +#~ msgid "Connection can't be established" +#~ msgstr "जडान स्थापना गर्नसकिएन" + +#~ msgid "Connection has been lost" +#~ msgstr "सञ्जाल जडान विच्छेदन भयो ।" + +#~ msgid "This account is already connected to the server" +#~ msgstr "खाता पहिले नै सर्भरसंग जडित छ" + +#~ msgid "The account already exists on the server" +#~ msgstr "खाता पहिले नै सर्भरमा अवस्थित छ" + +#, fuzzy +#~ msgid "Certificate has been revoked" +#~ msgstr "यो कुञ्जी खारेज गरिएको छ" + +#~ msgid "Internal error" +#~ msgstr "आन्तरिक त्रुटि" + +#~ msgid "Unable to connect to %s" +#~ msgstr "%s जडान गर्न असफल" + +#~ msgid "View account" +#~ msgstr "खाता हेर्नुहोस्" + +#~ msgid "Open Calendar" +#~ msgstr "पात्रो खोल्नुहोस्" + +#~ msgid "Date & Time Settings" +#~ msgstr " मिति र समय सेटिङ्ग" + +#~ msgid "Open" +#~ msgstr "खोल्नुहोस्" + +#~ msgid "Remove" +#~ msgstr "हटाउनुहोस्" + +#~ msgid "Clear Messages" +#~ msgstr "सूचना मेट्नुहोस्" + +#~ msgid "Notification Settings" +#~ msgstr "सुचना सेटिङ" + +#, fuzzy +#~ msgid "Tray Menu" +#~ msgstr "टेयरअफ मेनु" + +#~ msgid "No Messages" +#~ msgstr "अरू सूचना सन्देशहरू छैनन् ।" + +#, fuzzy +#~ msgid "Message Tray" +#~ msgstr "ट्रेको अभिमुखीकरण ।" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d जडित यन्त्र" +#~ msgstr[1] "%d जडित यन्त्रहरू" + +#~ msgid "In Use" +#~ msgstr "प्रयोग मा" + +#~ msgid "Authentication required" +#~ msgstr "प्रमाणीकरण आवश्यक" + +#~ msgid "connecting..." +#~ msgstr "जडान गर्दै....." + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "बेटरि" + +#, fuzzy +#~ msgid "Airplane Mode" +#~ msgstr "पार्टी मोड" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..ad1bec3 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,2371 @@ +# Dutch translation for gnome-shell +# This file is distributed under the same license as the gnome-shell package. +# Aangezien dit een erg zichtbare module is graag eerst contact opnemen met +# Wouter Bolsterlee alvorens zaken te wijzigen! +# Message tray - Berichtenoverzicht +# Sander Dijkhuis , 2009–2010. +# Reinout van Schouwen , 2010, 2013, 2014. +# Wouter Bolsterlee , 2011–2014. +# Erwin Poeze , 2013. +# Nathan Follens , 2015-2019. +# Hannie Dumoleyn , 2015, 2017, 2018. +# Justin van Steijn , 2016, 2018. +# Philip Goto , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-10 10:37+0000\n" +"PO-Revision-Date: 2019-02-10 14:33+0100\n" +"Last-Translator: Nathan Follens \n" +"Language-Team: Nederlands \n" +"Language: nl\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.2.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Systeem" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "De notificatielijst tonen" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Actieve notificatie focus geven" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Het overzicht tonen" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Alle toepassingen tonen" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Toepassingenmenu openen" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell-uitbreidingen" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Gnome Shell-uitbreidingen configureren" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Gnome Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Vensterbeheer en toepassingen starten" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Interne hulpprogramma’s inschakelen die nuttig zijn voor ontwikkelaars en " +"testers via Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Geeft toegang tot interne debugging- en observatieprogramma’s met behulp van " +"het Alt-F2-dialoogvenster." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs van in te schakelen uitbreidingen" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Gnome Shell-uitbreidingen hebben een UUID-eigenschap; deze instelling somt " +"de uitbreidingen op die geladen moeten worden. Alle te laden uitbreiden " +"moeten in deze lijst voorkomen. Deze lijst is ook te manipuleren met de DBus-" +"methodes ‘EnableExtension’ en ‘DisableExtension’ op org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Gebruikersuitbreidingen uitschakelen" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Schakel alle door de gebruiker ingeschakelde uitbreidingen uit, zonder de " +"instelling ‘enabled-extension’ te wijzigen." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Schakelt de validatie van versiecompatibiliteit voor uitbreidingen uit" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Gnome Shell zal alleen uitbreidingen laden die aangeven de huidige versie te " +"ondersteunen. Door deze optie in te schakelen wordt deze controle " +"overgeslagen en worden alle uitbreidingen geladen, ongeacht de versies die " +"ze zouden moeten ondersteunen." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lijst van bureaubladbestand-id’s voor favoriete toepassingen" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"De toepassingen die aan deze identifiers voldoen worden in het " +"favorietengebied weergegeven." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Toepassingskiezer-weergave" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Index van de momenteel geselecteerde weergave in de toepassingskiezer." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Geschiedenis voor het opdrachtvenster (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Geschiedenis voor het ‘looking glass’-venster" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Menu-item ‘afmelden’ altijd tonen in gebruikersmenu." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Deze instelling voorkomt het automatisch verbergen van het menu-item " +"‘afmelden’ indien slechts een enkele gebruiker met een enkele sessie is " +"aangemeld." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Of wachtwoorden voor versleutelde bestandssystemen of bestandssystemen op " +"afstand onthouden moeten worden" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"De shell vraagt om een wachtwoord als een versleuteld bestandssysteem of een " +"bestandssysteem op afstand aangekoppeld wordt. Als het wachtwoord voor " +"toekomstig gebruik opgeslagen kan worden, dan zal een ‘Wachtwoord onthouden’-" +"vinkje getoond worden. Deze instelling bepaalt de standaardwaarde hiervoor." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Of er apparaten met de standaard Bluetooth-adapter geassocieerd waren" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"De shell zal enkel een Bluetooth-menu-item weergeven indien een Bluetooth-" +"adapter is ingeschakeld, of indien er apparaten ingesteld zijn geassocieerd " +"met de standaardadapter. Dit zal opnieuw ingesteld worden indien de " +"standaardadapter geen apparaten met zich geassocieerd blijkt te hebben." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Introspectie-API inschakelen" + +# ? - Nathan +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Schakelt een D-Bus-API in die u de mogelijkheid biedt een introspectie uit " +"te voeren op de toepassingsstatus van de shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Sneltoets om het toepassingenmenu te openen" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Sneltoets om het toepassingenmenu te openen." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Sneltoets voor de toepassingenweergave" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Sneltoets voor de toepassingenweergave in het activiteitenoverzicht." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Sneltoets voor het overzicht" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Sneltoets voor het openen van het Activiteitenoverzicht." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Sneltoets om de notificatielijst te tonen of te verbergen" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Sneltoets om de notificatielijst te tonen of te verbergen." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Sneltoets om de actieve notificatie de focus te geven" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Sneltoets om de actieve notificatie de focus te geven." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Sneltoets die alle actieve tweens pauzeert en hervat, voor debug-doeleinden" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Schakelen naar toepassing 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Schakelen naar toepassing 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Schakelen naar toepassing 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Schakelen naar toepassing 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Schakelen naar toepassing 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Schakelen naar toepassing 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Schakelen naar toepassing 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Schakelen naar toepassing 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Schakelen naar toepassing 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Het gebruikte toetsenbord" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Het te gebruiken type toetsenbord." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Beperk wisselaar tot huidig werkblad." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Indien ingeschakeld, worden alleen toepassingen die vensters op het huidige " +"werkblad hebben getoond in de wisselaar. Anders worden alle toepassingen " +"meegenomen." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Weergave van toepassingspictogrammen." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Geeft aan hoe vensters in het overzicht getoond worden. Geldige waarden zijn " +"‘thumbnail-only’ (alleen een miniatuur tonen), ‘app-icon-only’ (alleen het " +"pictogram van de toepassing tonen) of ‘both’ (beide tonen)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Indien ingeschakeld, worden alleen vensters op het huidige werkblad getoond " +"in de wisselaar. Anders worden alle vensters meegenomen." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Modale dialoogvensters aan hoofdvenster vastmaken" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Deze waarde overschrijft de waarde in org.gnome.mutter in Gnome Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Vensters langs de randen positioneren bij verslepen naar de rand van het " +"scherm" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Werkbladen dynamisch beheren" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Alleen werkbladen op hoofdmonitor" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Focus pas wijzigen nadat de muisaanwijzer is gestopt met bewegen" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Netwerkaanmelding" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Er is iets misgegaan" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Het spijt ons, maar er is een probleem opgetreden: de instellingen voor deze " +"uitbreiding kunnen niet worden weergegeven. We raden u aan dit probleem te " +"melden aan de ontwikkelaars van de uitbreiding." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Technische details" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Fout kopiëren" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Startpagina" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Website van uitbreiding openen" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Geen uitbreidingen geïnstalleerd" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Uitbreidingen kunnen worden geïnstalleerd via Software, of extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Bladeren in Software" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Annuleren" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Volgende" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Ontgrendelen" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Aanmelden" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Kies een sessie" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Niet in de lijst?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(bijv. gebruiker of %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Gebruikersnaam: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Aanmeldvenster" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Authenticatie mislukt" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(of vinger aanbieden)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Uitschakelen" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"power off;shutdown;reboot;restart;uitschakelen;uitzetten;herstarten;opnieuw " +"opstarten" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Vergrendelingsscherm" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "lock screen;vergrendelingsscherm;vergrendelscherm" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Afmelden" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;afmelden;uitloggen" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Pauzestand" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;pauzestand;slaapmodus" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Gebruiker wisselen" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "gebruiker wisselen" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Oriëntatievergrendeling" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "" +"lock orientation;screen;rotation;oriëntatievergrendeling;scherm;draaiing;" +"rotatie" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Opdracht niet gevonden" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Kon opdracht niet parsen:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Uitvoeren van ‘%s’ mislukt:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Zojuist" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuut geleden" +msgstr[1] "%d minuten geleden" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d uur geleden" +msgstr[1] "%d uur geleden" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Gisteren" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag geleden" +msgstr[1] "%d dagen geleden" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d week geleden" +msgstr[1] "%d weken geleden" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d maand geleden" +msgstr[1] "%d maand geleden" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d jaar geleden" +msgstr[1] "%d jaar geleden" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Gisteren, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A,%H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Gisteren, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Hotspotaanmelding" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Uw verbinding met deze hotspotaanmelding is niet beveiligd. Wachtwoorden of " +"andere informatie die u op deze pagina invoert kunnen door anderen in de " +"buurt gelezen worden." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Toegang weigeren" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Toegang verlenen" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Vaak gebruikte toepassingen verschijnen hier" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Vaak gebruikt" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Alles" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Nieuw venster" + +# Dedicated niet vertaald +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Met grafische kaart opstarten" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Uit favorieten verwijderen" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Aan favorieten toevoegen" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Details tonen" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s is toegevoegd aan uw favorieten." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s is verwijderd uit uw favorieten." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Kies audioapparaat" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Geluidsinstellingen" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Hoofdtelefoon" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Headset" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Microfoon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Achtergrond aanpassen…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Scherminstellingen" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Instellingen" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "Z" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "Z" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "Vorige maand" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "Volgende maand" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +msgid "Week %V" +msgstr "Week %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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "Gehele dag" + +#: js/ui/calendar.js:829 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A %-d %B" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A %-d %B %Y" + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "Geen notificaties" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "Geen gebeurtenissen" + +#: js/ui/calendar.js:1085 +msgid "Clear" +msgstr "Wissen" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "‘%s’ reageert niet." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"U kan even wachten tot de toepassing weer reageert, of ze dwingen " +"onmiddellijk af te sluiten." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Afsluiten dwingen" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Wachten" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Verbinding met externe schijf gemaakt" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Verbinding met externe schijf verbroken" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Openen met %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Wachtwoord:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Nogmaals:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"U kunt ook verbinding maken door op de ‘WPS’-knop op uw router te drukken." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Verbinden" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Wachtwoord: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Sleutel: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Wachtwoord van privésleutel: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identiteit: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Service: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Authenticatie nodig voor draadloos netwerk" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Voor toegang tot het draadloze netwerk ‘%s’ is een wachtwoord of sleutel " +"benodigd." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "802.1X-authenticatie (bekabeld)" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Netwerknaam: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL-authenticatie" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN-code vereist" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN-code vereist voor het apparaat voor mobiel breedband" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Netwerkwachtwoord voor mobiel breedband" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Er is een wachtwoord nodig om met ‘%s’ te verbinden." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Netwerk-manager" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Authenticatie nodig" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Beheerder" + +# Vrij vertaald (Wouter Bolsterlee) +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Verifiëren" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Helaas, dat werkte niet. Probeer het opnieuw." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s heet vanaf nu %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Vensters" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Toepassingen tonen" + +# Betere vertaling is welkom (Wouter Bolsterlee) +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Zijbalk" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Wereldklokken toevoegen…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Wereldklokken" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Weer" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Selecteer een locatie…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Laden…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Ga online voor informatie over het weer" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Informatie over het weer is momenteel niet beschikbaar" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s afmelden" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Afmelden" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s wordt automatisch afgemeld over %d seconde." +msgstr[1] "%s wordt automatisch afgemeld over %d seconden." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "U wordt automatisch afgemeld over %d seconde." +msgstr[1] "U wordt automatisch afgemeld over %d seconden." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Afmelden" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Uitschakelen" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Updates installeren en uitschakelen" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "De computer wordt automatisch afgesloten over %d seconde." +msgstr[1] "De computer wordt automatisch afgesloten over %d seconden." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Gereedstaande software-updates installeren" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Opnieuw opstarten" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Uitschakelen" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Opnieuw opstarten" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "De computer wordt opnieuw opgestart over %d seconde." +msgstr[1] "De computer wordt opnieuw opgestart over %d seconden." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Opnieuw opstarten en updates installeren" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"De computer zal opnieuw opstarten en updates installeren over %d seconde." +msgstr[1] "" +"De computer zal opnieuw opstarten en updates installeren over %d seconden." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Herstarten en installeren" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installeren en uitschakelen" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Uitschakelen na installatie van updates" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Opnieuw opstarten en upgrades installeren" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s zal de herstart worden geïnstalleerd. De installatie van de upgrade " +"kan lang duren: zorg ervoor dat u een reservekopie heeft gemaakt en dat de " +"computer is aangesloten op netstroom." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"De computer gebruikt accustroom. Sluit de adapter aan alvorens de " +"installatie te starten." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Sommige toepassingen zijn bezig of hebben niet opgeslagen werk." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Er zijn andere gebruikers aangemeld." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (op afstand)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (console)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Installeren" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "‘%s’ downloaden van extensions.gnome.org en daarna installeren?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s wil sneltoetsen blokkeren" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Toepassing wil sneltoetsen blokkeren" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "U kan sneltoetsen herstellen door op %s te drukken." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Weigeren" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Toestaan" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Trage Toetsen ingeschakeld" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Trage Toetsen uitgeschakeld" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"U heeft zojuist de Shift-toets gedurende 8 seconden ingedrukt gehouden. Dat " +"is de sneltoets voor de Trage Toetsen-modus, hetgeen invloed heeft op de " +"manier waarop het toetsenbord functioneert." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Plaktoetsen ingeschakeld" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Plaktoetsen uitgeschakeld" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"U heeft zojuist de Shift-toets 5 keer op een rij ingedrukt. Dat is de " +"sneltoets voor de Plaktoetsen-modus, hetgeen invloed heeft op de manier " +"waarop uw toetsenbord functioneert." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"U heeft zojuist twee toetsen tegelijk ingedrukt, of de Shift-toets 5 keer op " +"een rij ingedrukt. Dat zet de Plaktoetsen-modus uit, hetgeen invloed heeft " +"op de manier waarop uw toetsenbord functioneert." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Aan laten" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Inschakelen" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Uitschakelen" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Uit laten" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Regio- & taalinstellingen" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Geen uitbreidingen geïnstalleerd" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s heeft geen fouten gemeld." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Fouten verbergen" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Fouten tonen" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Ingeschakeld" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Uitgeschakeld" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Fout" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Gedateerd" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Downloaden" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Broncode weergeven" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Webpagina" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Systeeminformatie" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Onbekende artiest" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Onbekend nummer" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volume" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Ongedaan maken" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Overzicht" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Typ om te zoeken…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Nieuwe sneltoets…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Toepassing gedefinieerd" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Hulptekst op scherm tonen" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Van beeldscherm wisselen" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Toetsaanslag toewijzen" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Klaar" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Bewerken…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Geen" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Druk op een toets om te configueren" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Druk op Esc om af te sluiten" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Druk op een willekeurige toets om af te sluiten" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Afsluiten" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Activiteiten" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Systeem" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Menubalk" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Voer opdracht in" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Sluiten" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Herstarten is niet beschikbaar op Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Herstarten…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nieuw bericht" +msgstr[1] "%d nieuwe berichten" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nieuwe notificatie" +msgstr[1] "%d nieuwe notificaties" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Vergrendelen" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "Gnome moet het scherm vergrendelen" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Kon niet vergrendelen" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Vergrendelen is door een toepassing voorkomen" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Zoeken…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Geen resultaten." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d meer" +msgstr[1] "%d meer" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopiëren" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Plakken" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Tekst tonen" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Tekst verbergen" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Wachtwoord" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Wachtwoord onthouden" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Toegankelijkheid" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zoomen" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Schermlezer" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Schermtoetsenbord" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Visuele alerteringen" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Plaktoetsen" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Trage Toetsen" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Springende toetsen" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Muistoetsen" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Hoog contrast" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Grote tekst" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth-instellingen" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d verbonden apparaat" +msgstr[1] "%d verbonden apparaten" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Uit" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Aan" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Helderheid" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Toetsenbord" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Toetsenbordindeling tonen" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Locatie ingeschakeld" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Uitschakelen" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Privacyinstellingen" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Locatie in gebruik" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Locatie uitgeschakeld" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Inschakelen" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "%s toegang tot uw locatie geven?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Locatietoegang kan op elk moment worden gewijzigd in de privacyinstellingen." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s uit" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s verbonden" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s onbeheerd" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s verbinding verbreken" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s verbinden" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s vereist authenticatie" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware ontbreekt voor %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s niet beschikbaar" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Verbinding van %s is mislukt" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Instellingen voor bekabeld netwerk" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Instellingen voor mobiel breedband" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s uitgeschakeld in 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s uitgeschakeld" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Met internet verbinden" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Vliegtuigstand is aan" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wifi is uitgeschakeld in vliegtuigstand." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Vliegtuigstand uitschakelen" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wifi is uitgeschakeld" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wifi moet ingeschakeld zijn om met een netwerk te kunnen verbinden." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Wifi inschakelen" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wifi-netwerken" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Selecteer een netwerk" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Geen netwerken" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Gebruik de hardware-schakelaar om uit te schakelen" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Netwerk selecteren" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wifi-instellingen" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s-hotspot actief" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s niet verbonden" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "verbinden…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "authenticatie nodig" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "verbinding mislukt" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPN-instellingen" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN uit" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Netwerkinstellingen" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s bekabelde verbinding" +msgstr[1] "%s bekabelde verbindingen" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s wifi-verbinding" +msgstr[1] "%s wifi-verbindingen" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemverbinding" +msgstr[1] "%s modemverbindingen" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Verbinding mislukt" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Activeren van netwerkverbinding mislukt" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Nachtlicht uitgeschakeld" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Nachtlicht aan" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Hervatten" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Uitschakelen tot morgen" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Energie-instellingen" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Volledig opgeladen" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Niet aan het opladen" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Schatten…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d:%02d resterend (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d tot opgeladen (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Scherm wordt gedeeld" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Uitschakelen" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Vliegtuigstand aan" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Gebruiker wisselen" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Afmelden" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Accountinstellingen" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Oriëntatievergrendeling" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Pauzestand" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Uitschakelen" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Onbekend Thunderbolt-apparaat" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Terwijl u weg was is er een nieuw apparaat gedetecteerd. Koppel het apparaat " +"los en verbind het opnieuw om het te gebruiken." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Ongeautoriseerd Thunderbolt-apparaat" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Er is een nieuw apparaat gedetecteerd, dit moet worden geautoriseerd door " +"een systeembeheerder." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt-autorisatiefout" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Kon het Thunderbolt-apparaat niet autoriseren: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volume gewijzigd" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Spiegel" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Schermen samenvoegen" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Enkel extern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Enkel ingebouwd" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Aanmelden als andere gebruiker" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Venster voor ontgrendelen" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Toepassingen" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Zoeken" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "‘%s’ is gereed" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Wilt u deze scherminstellingen behouden?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Terugzetten" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Behouden" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Instellingswijzigingen worden teruggezet in %d seconde" +msgstr[1] "Instellingswijzigingen worden teruggezet in %d seconden" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimaliseren" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Herstellen" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximaliseren" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Verplaatsen" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Vergroten/verkleinen" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Titelbalk op scherm plaatsen" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Altijd voorop" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Altijd op zichtbaar werkblad" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Naar werkblad links" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Naar werkblad rechts" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Naar werkblad hierboven" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Naar werkblad hieronder" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Naar monitor hierboven" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Naar monitor hieronder" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Naar monitor links" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Naar monitor rechts" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution-agenda" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Versie weergeven" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "De modus die door GDM voor het aanmeldscherm gebruikt wordt" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Specifieke modus gebruiken, bijv. ‘gdm’ voor het aanmeldscherm" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Mogelijke modi tonen" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Onbekend" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Kon ‘%s’ niet starten" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "De wachtwoorden komen niet overeen." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Het wachtwoord mag niet leeg blijven" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Authenticatievenster is door de gebruiker afgesloten" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u uitvoerkanalen" +msgstr[1] "%u uitvoerkanalen" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u invoerkanaal" +msgstr[1] "%u invoerkanalen" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Systeemgeluiden" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Fout bij laden van het voorkeurenvenster voor %s:" + +#~ msgid "%s all day." +#~ msgstr "De hele dag %s." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, daarna %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, daarna %s, gevolgd door %s." + +#~ msgid "Feels like %s." +#~ msgstr "Voelt aan als %s." + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Uitschakelen" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Afmelden" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Gebruiker wisselen" + +#~ msgid "Hide tray" +#~ msgstr "Systeemvak verbergen" + +#~ msgid "Status Icons" +#~ msgstr "Statuspictogrammen" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Voorkeuren voor Gnome Shell-uitbreidingen" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Webauthenticatie-omleiding" + +#~ msgid "Events" +#~ msgstr "Gebeurtenissen" + +#~ msgid "Notifications" +#~ msgstr "Notificaties" + +#~ msgid "Clear section" +#~ msgstr "Sectie wissen" + +#~ msgid "Media" +#~ msgstr "Media" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Not In Use" +#~ msgstr "Niet in gebruik" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Weeknummers tonen in kalender" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Indien ingeschakeld worden weeknummers in de kalender getoond." + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s vraagt toegang tot uw locatie." + +#~ msgid "Use as Internet connection" +#~ msgstr "Voor internetverbinding gebruiken" diff --git a/po/nn.po b/po/nn.po new file mode 100644 index 0000000..769153c --- /dev/null +++ b/po/nn.po @@ -0,0 +1,1713 @@ +# Norwegian Nynorsk translation for gnome-shell. +# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Torstein Adolf Winterseth , 2010. +# Torstein Winterseth , 2010. +# Andreas N. , 2011. +# Åsmund Skjæveland , 2011. +# Kjartan Maraas , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-10 15:17+0200\n" +"PO-Revision-Date: 2012-07-10 15:21+0200\n" +"Last-Translator: Kjartan Maraas \n" +"Language-Team: Norsk (nynorsk) \n" +"Language: nn\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-Poedit-Language: Norwegian Nynorsk\n" +"X-Poedit-Country: NORWAY\n" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "Vindaugshandsaming og programstarting" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +#: ../js/extensionPrefs/main.js:153 +msgid "GNOME Shell Extension Preferences" +msgstr "" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Slå på interne verktøy for utviklarar og testarar frå Alt + F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Tillèt tilgang til interne feilfiksings- og overvakingsverktøy gjennom «Alt " +"+ F2»-dialogvindauget." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "Uuids of extensions to enable" +msgstr "Uuid-ar til utvidingar som skal slåast på" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +#, fuzzy +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension DBus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell-utvidingar har ein uuid-eigenskap. Denne nøkkelen viser ei liste " +"over utvidingane som skal lastast. disabled-extensions overstyrer denne " +"innstillinga for utvidingar som finst i begge listene." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Whether to collect stats about applications usage" +msgstr "Om statistikk om programbruk skal innsamlast" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" +"Shell overvakar aktive program for å visa dei mest brukte (t.d. i " +"oppstartaren). Sjølv om desse data vil haldast private, så kan det henda at " +"du ønskjer å slå dette av med omsyn til personvern. Legg merke til at det " +"vil ikkje fjerna data som alt er lagra." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "Liste over skrivebordsfil-ID-ar for favorittprogram" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programma som korresponderer til desse identifikatorane vil verta viste i " +"favorittområdet." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "disabled OpenSearch providers" +msgstr "OpenSearch-tilbydarar slått av" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "History for command (Alt-F2) dialog" +msgstr "Historikk for kommandovindauget (Alt + F2)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for the looking glass dialog" +msgstr "Historikk for forstørringsglasvindauget" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "" +"Internally used to store the last IM presence explicitly set by the user. " +"The value here is from the TpConnectionPresenceType enumeration." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "" +"Internally used to store the last session presence status for the user. The " +"value here is from the GsmPresenceStatus enumeration." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "Show the week date in the calendar" +msgstr "Vis vekedag i kalenderen" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "If true, display the ISO week date in the calendar." +msgstr "Viss sann, vis ISO-vekedag i kalenderen." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "Keybinding to open the application menu" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Keybinding to open the application menu." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "Keybinding to toggle the screen recorder" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to start/stop the builtin screen recorder." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Which keyboard to use" +msgstr "Tastatur som skal brukast" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "The type of keyboard to use." +msgstr "Type tastatur som skal brukast." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Framerate used for recording screencasts." +msgstr "Biletrate brukt for filming av skjermvideo." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" +"Biletfrekvensen til den ferdige skjermvideoen, teken opp med " +"skjermvideoopptakaren i GNOME Shell, i bilete per sekund." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "GStreamer-kanalen brukt til å koda skjermvideoen" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM " +"using the VP8 codec. %T is used as a placeholder for a guess at the optimal " +"thread count on the system." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "File extension used for storing the screencast" +msgstr "Filtype brukt for å lagra skjermvideoen" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" +"Filnamnet for skjermvideoopptak vil vera eit unikt filnamn basert på " +"gjeldande dato, og vil bruka dette filetternamnet. Det bør endrast når du " +"gjer opptak til eit anna oppbevaringsformat." + +#: ../js/extensionPrefs/main.js:125 +#, c-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "" + +#: ../js/extensionPrefs/main.js:165 +msgid "Extension" +msgstr "" + +#: ../js/extensionPrefs/main.js:189 +msgid "Select an extension to configure using the combobox above." +msgstr "" + +#: ../js/gdm/loginDialog.js:629 +msgid "Session..." +msgstr "Økt …" + +#: ../js/gdm/loginDialog.js:800 +msgctxt "title" +msgid "Sign In" +msgstr "Logg inn" + +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/loginDialog.js:845 +msgid "(or swipe finger)" +msgstr "(eller dra finger)" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:866 +msgid "Not listed?" +msgstr "Ikkje oppført?" + +#: ../js/gdm/loginDialog.js:1046 ../js/ui/endSessionDialog.js:410 +#: ../js/ui/extensionDownloader.js:138 ../js/ui/networkAgent.js:153 +#: ../js/ui/polkitAuthenticationAgent.js:176 +#: ../js/ui/shellMountOperation.js:339 ../js/ui/status/bluetooth.js:431 +msgid "Cancel" +msgstr "Avbryt" + +#: ../js/gdm/loginDialog.js:1051 +msgctxt "button" +msgid "Sign In" +msgstr "Logg inn" + +#: ../js/gdm/loginDialog.js:1411 +msgid "Login Window" +msgstr "Innloggingsvindauge" + +#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:612 +#: ../js/ui/userMenu.js:616 ../js/ui/userMenu.js:730 +msgid "Suspend" +msgstr "Kvilemodus" + +#: ../js/gdm/powerMenu.js:135 +msgid "Restart" +msgstr "Start på nytt" + +#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:614 +#: ../js/ui/userMenu.js:616 ../js/ui/userMenu.js:729 +msgid "Power Off" +msgstr "Slå av" + +#: ../js/misc/util.js:95 +msgid "Command not found" +msgstr "Fann ikkje kommando" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:128 +msgid "Could not parse command:" +msgstr "Klarte ikkje lesa kommando:" + +#: ../js/misc/util.js:136 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "Klarte ikkje køyra «%s»:" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:252 +msgid "All" +msgstr "Alle" + +#: ../js/ui/appDisplay.js:310 +msgid "APPLICATIONS" +msgstr "PROGRAM" + +#: ../js/ui/appDisplay.js:370 +msgid "SETTINGS" +msgstr "INNSTILLINGAR" + +#: ../js/ui/appDisplay.js:675 +msgid "New Window" +msgstr "Nytt vindauge" + +#: ../js/ui/appDisplay.js:678 +msgid "Remove from Favorites" +msgstr "Fjern frå favorittar" + +#: ../js/ui/appDisplay.js:679 +msgid "Add to Favorites" +msgstr "Legg til i favorittar" + +#: ../js/ui/appFavorites.js:87 +#, c-format +msgid "%s has been added to your favorites." +msgstr "%s har vorte lagt til i dine favorittar." + +#: ../js/ui/appFavorites.js:118 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "%s har vorte fjerna frå dine favorittar." + +#: ../js/ui/autorunManager.js:261 +msgid "Removable Devices" +msgstr "Flyttbare einingar" + +#: ../js/ui/autorunManager.js:549 +#, c-format +msgid "Open with %s" +msgstr "Opna med %s" + +#: ../js/ui/autorunManager.js:575 +msgid "Eject" +msgstr "Løys ut" + +#. 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:62 +msgctxt "event list time" +msgid "All Day" +msgstr "Heile dagen" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:67 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H.%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:74 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l.%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:114 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:116 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:118 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:120 +msgctxt "grid wednesday" +msgid "W" +msgstr "O" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:122 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:124 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:126 +msgctxt "grid saturday" +msgid "S" +msgstr "L" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:139 +msgctxt "list sunday" +msgid "Su" +msgstr "S" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:141 +msgctxt "list monday" +msgid "M" +msgstr "M" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:143 +msgctxt "list tuesday" +msgid "T" +msgstr "T" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:145 +msgctxt "list wednesday" +msgid "W" +msgstr "O" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:147 +msgctxt "list thursday" +msgid "Th" +msgstr "To" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:149 +msgctxt "list friday" +msgid "F" +msgstr "F" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:151 +msgctxt "list saturday" +msgid "S" +msgstr "L" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:681 +msgid "Nothing Scheduled" +msgstr "Ingenting er planlagt" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:697 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A %d. %B" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:700 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A %d. %B %Y" + +#: ../js/ui/calendar.js:710 +msgid "Today" +msgstr "I dag" + +#: ../js/ui/calendar.js:714 +msgid "Tomorrow" +msgstr "I morgon" + +#: ../js/ui/calendar.js:723 +msgid "This week" +msgstr "Denne veka" + +#: ../js/ui/calendar.js:731 +msgid "Next week" +msgstr "Neste veke" + +#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1287 +msgid "Remove" +msgstr "Fjern" + +#: ../js/ui/dateMenu.js:94 +msgid "Date and Time Settings" +msgstr "Innstillingar for dato og tid" + +#: ../js/ui/dateMenu.js:120 +msgid "Open Calendar" +msgstr "Opna kalender" + +#. 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:161 +msgid "%A %B %e, %Y" +msgstr "%a %e. %B %Y" + +#: ../js/ui/endSessionDialog.js:60 +#, c-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Logg ut %s" + +#: ../js/ui/endSessionDialog.js:61 +msgctxt "title" +msgid "Log Out" +msgstr "Logg ut" + +#: ../js/ui/endSessionDialog.js:62 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "Vel «Logg ut» for å avslutta desse programma og logga ut av systemet." + +#: ../js/ui/endSessionDialog.js:64 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s vil verta logga ut automatisk om %d sekund." +msgstr[1] "%s vil verta logga ut automatisk om %d sekund." + +#: ../js/ui/endSessionDialog.js:69 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Du vil verta logga ut automatisk om %d sekund." +msgstr[1] "Du vil verta logga ut automatisk om %d sekund." + +#: ../js/ui/endSessionDialog.js:73 +msgid "Logging out of the system." +msgstr "Loggar ut av systemet." + +#: ../js/ui/endSessionDialog.js:75 +msgctxt "button" +msgid "Log Out" +msgstr "Logg ut" + +#: ../js/ui/endSessionDialog.js:80 +msgctxt "title" +msgid "Power Off" +msgstr "Slå av" + +#: ../js/ui/endSessionDialog.js:81 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "Vel «Slå av» for å avslutta desse programma og slå av systemet." + +#: ../js/ui/endSessionDialog.js:83 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Systemet vil slå seg av automatisk om %d sekund." +msgstr[1] "Systemet vil slå seg av automatisk om %d sekund." + +#: ../js/ui/endSessionDialog.js:87 +msgid "Powering off the system." +msgstr "Slår av systemet." + +#: ../js/ui/endSessionDialog.js:89 ../js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Restart" +msgstr "Start på nytt" + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "button" +msgid "Power Off" +msgstr "Slå av" + +#: ../js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart" +msgstr "Start på nytt" + +#: ../js/ui/endSessionDialog.js:98 +msgid "Click Restart to quit these applications and restart the system." +msgstr "" +"Vel «Start på nytt» for å avslutta desse programma og starta systemet på " +"nytt." + +#: ../js/ui/endSessionDialog.js:100 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Systemet vil startast på nytt om %d sekund." +msgstr[1] "Systemet vil startast på nytt om %d sekund." + +#: ../js/ui/endSessionDialog.js:104 +msgid "Restarting the system." +msgstr "Startar systemet på nytt." + +#: ../js/ui/extensionDownloader.js:142 +msgid "Install" +msgstr "Installer" + +#: ../js/ui/extensionDownloader.js:146 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "Lasta ned og installera «%s» frå extensions.gnome.org?" + +#: ../js/ui/keyboard.js:327 +msgid "tray" +msgstr "varslingsområde" + +#: ../js/ui/keyboard.js:545 ../js/ui/status/keyboard.js:42 +#: ../js/ui/status/power.js:203 +msgid "Keyboard" +msgstr "Tastatur" + +#: ../js/ui/keyringPrompt.js:85 ../js/ui/polkitAuthenticationAgent.js:273 +msgid "Password:" +msgstr "Passord:" + +#: ../js/ui/keyringPrompt.js:101 +msgid "Type again:" +msgstr "" + +#: ../js/ui/lookingGlass.js:696 +msgid "No extensions installed" +msgstr "Ingen utvidingar er installerte" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:750 +#, c-format +msgid "%s has not emitted any errors." +msgstr "" + +#: ../js/ui/lookingGlass.js:756 +msgid "Hide Errors" +msgstr "Gøym feil" + +#: ../js/ui/lookingGlass.js:760 ../js/ui/lookingGlass.js:811 +msgid "Show Errors" +msgstr "Vis feil" + +#: ../js/ui/lookingGlass.js:769 +msgid "Enabled" +msgstr "Påslått" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:772 ../src/gvc/gvc-mixer-control.c:1082 +msgid "Disabled" +msgstr "Avslått" + +#: ../js/ui/lookingGlass.js:774 +msgid "Error" +msgstr "Feil" + +#: ../js/ui/lookingGlass.js:776 +msgid "Out of date" +msgstr "Utgått på dato" + +#: ../js/ui/lookingGlass.js:778 +msgid "Downloading" +msgstr "Lastar ned" + +#: ../js/ui/lookingGlass.js:799 +msgid "View Source" +msgstr "Vis kjeldekode" + +#: ../js/ui/lookingGlass.js:805 +msgid "Web Page" +msgstr "Nettside" + +#. Translators: this is a filename used for screencast recording +#: ../js/ui/main.js:129 +#, no-c-format +msgid "Screencast from %d %t" +msgstr "" + +#: ../js/ui/messageTray.js:1280 +msgid "Open" +msgstr "Opna" + +#: ../js/ui/messageTray.js:1297 +msgid "Unmute" +msgstr "Fjern demping" + +#: ../js/ui/messageTray.js:1297 +msgid "Mute" +msgstr "Demp" + +#: ../js/ui/messageTray.js:2575 +msgid "System Information" +msgstr "Systeminformasjon" + +#: ../js/ui/networkAgent.js:148 +msgid "Connect" +msgstr "Kopla til" + +#. Cisco LEAP +#: ../js/ui/networkAgent.js:243 ../js/ui/networkAgent.js:255 +#: ../js/ui/networkAgent.js:282 ../js/ui/networkAgent.js:302 +#: ../js/ui/networkAgent.js:312 +msgid "Password: " +msgstr "Passord:" + +#. static WEP +#: ../js/ui/networkAgent.js:248 +msgid "Key: " +msgstr "Nøkkel:" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/ui/networkAgent.js:280 ../js/ui/networkAgent.js:298 +msgid "Username: " +msgstr "Brukarnamn:" + +#: ../js/ui/networkAgent.js:286 +msgid "Identity: " +msgstr "Identitet:" + +#: ../js/ui/networkAgent.js:288 +msgid "Private key password: " +msgstr "Passord for privat nøkkel:" + +#: ../js/ui/networkAgent.js:300 +msgid "Service: " +msgstr "Teneste:" + +#: ../js/ui/networkAgent.js:329 +msgid "Authentication required by wireless network" +msgstr "Trådlaust nettverk krev autentisering" + +#: ../js/ui/networkAgent.js:330 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"'%s'." +msgstr "" +"Passord eller krypteringsnøklar er nødvendig for å kopla til det trådlause " +"nettverket «%s»." + +#: ../js/ui/networkAgent.js:334 +msgid "Wired 802.1X authentication" +msgstr "Kabla 802.1X-autentisering" + +#: ../js/ui/networkAgent.js:336 +msgid "Network name: " +msgstr "Nettverksnamn:" + +#: ../js/ui/networkAgent.js:341 +msgid "DSL authentication" +msgstr "DSL-autentisering" + +#: ../js/ui/networkAgent.js:348 +msgid "PIN code required" +msgstr "PIN-kode påkravd" + +#: ../js/ui/networkAgent.js:349 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Mobilt breibandeining krev PIN-kode" + +#: ../js/ui/networkAgent.js:350 +msgid "PIN: " +msgstr "PIN:" + +#: ../js/ui/networkAgent.js:356 +msgid "Mobile broadband network password" +msgstr "Nettverkspassord for mobilt breiband" + +#: ../js/ui/networkAgent.js:357 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "Passord er nødvendig for å kopla til «%s»." + +#: ../js/ui/notificationDaemon.js:486 ../src/shell-app.c:374 +msgctxt "program" +msgid "Unknown" +msgstr "Ukjend" + +#: ../js/ui/overview.js:88 +msgid "Undo" +msgstr "Angra" + +#: ../js/ui/overview.js:128 +msgid "Overview" +msgstr "Oversikt" + +#: ../js/ui/overview.js:198 +msgid "Windows" +msgstr "Vindauge" + +#: ../js/ui/overview.js:201 +msgid "Applications" +msgstr "Program" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:226 +msgid "Dash" +msgstr "Favorittar" + +#: ../js/ui/panel.js:564 +msgid "Quit" +msgstr "Avslutt" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:596 +msgid "Activities" +msgstr "Aktivitetar" + +#: ../js/ui/panel.js:962 +msgid "Top Bar" +msgstr "Toppanel" + +#: ../js/ui/placeDisplay.js:115 +#, c-format +msgid "Failed to unmount '%s'" +msgstr "Klarte ikkje avmontera «%s»" + +#: ../js/ui/placeDisplay.js:118 +msgid "Retry" +msgstr "Prøv på nytt" + +#: ../js/ui/placeDisplay.js:156 +msgid "Connect to..." +msgstr "Kopla til …" + +#: ../js/ui/placeDisplay.js:367 +msgid "PLACES & DEVICES" +msgstr "PLASSERING OG EININGAR" + +#: ../js/ui/polkitAuthenticationAgent.js:71 +msgid "Authentication Required" +msgstr "Autentisering påkravd" + +#: ../js/ui/polkitAuthenticationAgent.js:109 +msgid "Administrator" +msgstr "Administrator" + +#: ../js/ui/polkitAuthenticationAgent.js:180 +msgid "Authenticate" +msgstr "Autentiser" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/polkitAuthenticationAgent.js:261 +#: ../js/ui/shellMountOperation.js:324 +msgid "Sorry, that didn't work. Please try again." +msgstr "Det verka ikkje. Prøv på nytt." + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:728 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:205 +msgid "Please enter a command:" +msgstr "Skriv inn kommando:" + +#: ../js/ui/searchDisplay.js:320 +msgid "Searching..." +msgstr "Søker …" + +#: ../js/ui/searchDisplay.js:373 +msgid "No matching results." +msgstr "Ingen treff." + +#: ../js/ui/shellEntry.js:26 +msgid "Copy" +msgstr "Kopier" + +#: ../js/ui/shellEntry.js:31 +msgid "Paste" +msgstr "Lim inn" + +#: ../js/ui/shellEntry.js:77 +msgid "Show Text" +msgstr "Vis tekst" + +#: ../js/ui/shellEntry.js:79 +msgid "Hide Text" +msgstr "Gøym tekst" + +#: ../js/ui/shellMountOperation.js:311 +msgid "Passphrase" +msgstr "" + +#: ../js/ui/shellMountOperation.js:332 +msgid "Remember Passphrase" +msgstr "" + +#: ../js/ui/shellMountOperation.js:343 +#, fuzzy +msgid "Unlock" +msgstr "Klokke" + +#: ../js/ui/status/accessibility.js:47 +msgid "Accessibility" +msgstr "" + +#: ../js/ui/status/accessibility.js:52 +msgid "Zoom" +msgstr "Forstørring" + +#: ../js/ui/status/accessibility.js:59 +msgid "Screen Reader" +msgstr "Skjermlesar" + +#: ../js/ui/status/accessibility.js:63 +msgid "Screen Keyboard" +msgstr "Skjermtastatur" + +#: ../js/ui/status/accessibility.js:67 +msgid "Visual Alerts" +msgstr "Synleg varsling" + +#: ../js/ui/status/accessibility.js:70 +msgid "Sticky Keys" +msgstr "Faste valtastar" + +#: ../js/ui/status/accessibility.js:73 +msgid "Slow Keys" +msgstr "Treige tastar" + +#: ../js/ui/status/accessibility.js:76 +msgid "Bounce Keys" +msgstr "Sprettetastar" + +#: ../js/ui/status/accessibility.js:79 +msgid "Mouse Keys" +msgstr "Musetastar" + +#: ../js/ui/status/accessibility.js:83 +msgid "Universal Access Settings" +msgstr "Innstillingar for tilgjenge" + +#: ../js/ui/status/accessibility.js:117 +msgid "High Contrast" +msgstr "Høg kontrast" + +#: ../js/ui/status/accessibility.js:154 +msgid "Large Text" +msgstr "Stor tekst" + +#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35 +#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/bluetooth.js:308 +#: ../js/ui/status/bluetooth.js:339 ../js/ui/status/bluetooth.js:375 +#: ../js/ui/status/bluetooth.js:404 ../js/ui/status/network.js:844 +msgid "Bluetooth" +msgstr "Blåtann" + +#: ../js/ui/status/bluetooth.js:48 +msgid "Visibility" +msgstr "Synleg" + +#: ../js/ui/status/bluetooth.js:62 +msgid "Send Files to Device..." +msgstr "Send filer til eining …" + +#: ../js/ui/status/bluetooth.js:63 +msgid "Set up a New Device..." +msgstr "Set opp ei ny eining …" + +#: ../js/ui/status/bluetooth.js:87 +msgid "Bluetooth Settings" +msgstr "Innstillingar for blåtann" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/network.js:211 +msgid "hardware disabled" +msgstr "eining slått av" + +#: ../js/ui/status/bluetooth.js:200 +msgid "Connection" +msgstr "Tilkopling" + +#: ../js/ui/status/bluetooth.js:211 ../js/ui/status/network.js:445 +msgid "disconnecting..." +msgstr "koplar frå …" + +#: ../js/ui/status/bluetooth.js:224 ../js/ui/status/network.js:451 +#: ../js/ui/status/network.js:911 +msgid "connecting..." +msgstr "koplar til …" + +#: ../js/ui/status/bluetooth.js:242 +msgid "Send Files..." +msgstr "Send filer …" + +#: ../js/ui/status/bluetooth.js:247 +msgid "Browse Files..." +msgstr "Bla gjennom filer …" + +#: ../js/ui/status/bluetooth.js:256 +msgid "Error browsing device" +msgstr "Klarte ikkje lesa eining" + +#: ../js/ui/status/bluetooth.js:257 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "Kan ikkje bla gjennom eininga. Feilen er «%s»" + +#: ../js/ui/status/bluetooth.js:265 +msgid "Keyboard Settings" +msgstr "Innstillingar for tastatur" + +#: ../js/ui/status/bluetooth.js:268 +msgid "Mouse Settings" +msgstr "Innstillingar for mus" + +#: ../js/ui/status/bluetooth.js:273 ../js/ui/status/volume.js:59 +msgid "Sound Settings" +msgstr "Innstillingar for lyd" + +#: ../js/ui/status/bluetooth.js:340 +#, c-format +msgid "Authorization request from %s" +msgstr "Førespurnad om autorisering frå %s" + +#: ../js/ui/status/bluetooth.js:346 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "Eininga %s vil ha tilgang til tenesta «%s»" + +#: ../js/ui/status/bluetooth.js:348 +msgid "Always grant access" +msgstr "Gje tilgang alltid" + +#: ../js/ui/status/bluetooth.js:349 +msgid "Grant this time only" +msgstr "Gje tilgang berre denne gongen" + +#: ../js/ui/status/bluetooth.js:350 ../js/ui/telepathyClient.js:1097 +msgid "Reject" +msgstr "Avvis" + +#: ../js/ui/status/bluetooth.js:376 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "Tilkopling for %s stadfesta" + +#: ../js/ui/status/bluetooth.js:382 ../js/ui/status/bluetooth.js:412 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "Eininga %s vil kopla seg saman med denne datamaskina" + +#: ../js/ui/status/bluetooth.js:383 +#, c-format +msgid "Please confirm whether the PIN '%06d' matches the one on the device." +msgstr "Kontroller at PIN-koden «%06d» samsvarer med koden på eininga." + +#: ../js/ui/status/bluetooth.js:385 +msgid "Matches" +msgstr "Samsvarer" + +#: ../js/ui/status/bluetooth.js:386 +msgid "Does not match" +msgstr "Samsvarer ikkje" + +#: ../js/ui/status/bluetooth.js:405 +#, c-format +msgid "Pairing request for %s" +msgstr "Førespurnad om tilkopling for %s" + +#: ../js/ui/status/bluetooth.js:413 +msgid "Please enter the PIN mentioned on the device." +msgstr "Skriv inn PIN-koden oppgjeve på eininga." + +#: ../js/ui/status/bluetooth.js:430 +msgid "OK" +msgstr "OK" + +#: ../js/ui/status/keyboard.js:69 +msgid "Show Keyboard Layout" +msgstr "Vis tastaturutforming" + +#: ../js/ui/status/keyboard.js:71 +msgid "Region and Language Settings" +msgstr "Innstillingar for region og språk" + +#: ../js/ui/status/network.js:96 +msgid "" +msgstr "" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:233 +msgid "disabled" +msgstr "slått av" + +#. 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) +#: ../js/ui/status/network.js:443 +msgid "unmanaged" +msgstr "ikkje handsama" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:454 ../js/ui/status/network.js:914 +msgid "authentication required" +msgstr "autentisering påkravd" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:464 +msgid "firmware missing" +msgstr "fastvare manglar" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:471 +msgid "cable unplugged" +msgstr "kabel kopla frå" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:476 +msgid "unavailable" +msgstr "utilgjengeleg" + +#: ../js/ui/status/network.js:478 ../js/ui/status/network.js:916 +msgid "connection failed" +msgstr "klarte ikkje kopla til" + +#: ../js/ui/status/network.js:539 ../js/ui/status/network.js:1537 +msgid "More..." +msgstr "Meir …" + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:575 ../js/ui/status/network.js:1467 +msgid "Connected (private)" +msgstr "Tilkopla (privat)" + +#: ../js/ui/status/network.js:650 +msgid "Auto Ethernet" +msgstr "Automatisk Ethernet" + +#: ../js/ui/status/network.js:708 +msgid "Auto broadband" +msgstr "Automatisk breiband" + +#: ../js/ui/status/network.js:711 +msgid "Auto dial-up" +msgstr "Automatisk oppringd" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:830 ../js/ui/status/network.js:1484 +#, c-format +msgid "Auto %s" +msgstr "Automatisk %s" + +#: ../js/ui/status/network.js:832 +msgid "Auto bluetooth" +msgstr "Automatisk blåtann" + +#: ../js/ui/status/network.js:1486 +msgid "Auto wireless" +msgstr "Automatisk trådlaus" + +#: ../js/ui/status/network.js:1595 +msgid "Enable networking" +msgstr "Slå på nettverk" + +#: ../js/ui/status/network.js:1617 +msgid "Wired" +msgstr "Kabla" + +#: ../js/ui/status/network.js:1628 +msgid "Wireless" +msgstr "Trådlaus" + +#: ../js/ui/status/network.js:1638 +msgid "Mobile broadband" +msgstr "Mobilt breiband" + +#: ../js/ui/status/network.js:1648 +msgid "VPN Connections" +msgstr "VPN-tilkoplingar" + +#: ../js/ui/status/network.js:1655 +msgid "Network Settings" +msgstr "Innstillingar for nettverk" + +#: ../js/ui/status/network.js:1703 +msgid "Network Manager" +msgstr "Nettverkshandsaming" + +#: ../js/ui/status/network.js:1796 +msgid "Connection failed" +msgstr "Klarte ikkje kopla til" + +#: ../js/ui/status/network.js:1797 +msgid "Activation of network connection failed" +msgstr "Klarte ikkje slå på nettverkstilkopling" + +#: ../js/ui/status/network.js:2060 +msgid "Networking is disabled" +msgstr "Nettverk er slått av" + +#: ../js/ui/status/power.js:59 +msgid "Battery" +msgstr "Batteri" + +#: ../js/ui/status/power.js:76 +msgid "Power Settings" +msgstr "Innstillingar for straum" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:98 +msgid "Estimating..." +msgstr "Reknar ut …" + +#: ../js/ui/status/power.js:105 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "%d time står att" +msgstr[1] "%d timar står att" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:108 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "%d %s %d %s står att" + +#: ../js/ui/status/power.js:110 +msgid "hour" +msgid_plural "hours" +msgstr[0] "time" +msgstr[1] "timar" + +#: ../js/ui/status/power.js:110 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "minutt" +msgstr[1] "minutt" + +#: ../js/ui/status/power.js:113 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "%d minutt står att" +msgstr[1] "%d minutt står att" + +#: ../js/ui/status/power.js:116 ../js/ui/status/power.js:186 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d %%" + +#: ../js/ui/status/power.js:193 +msgid "AC adapter" +msgstr "Straumadapter" + +#: ../js/ui/status/power.js:195 +msgid "Laptop battery" +msgstr "Batteri" + +#: ../js/ui/status/power.js:197 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:199 +msgid "Monitor" +msgstr "Skjerm" + +#: ../js/ui/status/power.js:201 +msgid "Mouse" +msgstr "Mus" + +#: ../js/ui/status/power.js:205 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:207 +msgid "Cell phone" +msgstr "Mobiltelefon" + +#: ../js/ui/status/power.js:209 +msgid "Media player" +msgstr "Mediaspelar" + +#: ../js/ui/status/power.js:211 +msgid "Tablet" +msgstr "Nettbrett" + +#: ../js/ui/status/power.js:213 +msgid "Computer" +msgstr "Datamaskin" + +#: ../js/ui/status/power.js:215 +msgctxt "device" +msgid "Unknown" +msgstr "Ukjend" + +#. Translators: This is the label for audio volume +#: ../js/ui/status/volume.js:25 ../js/ui/status/volume.js:39 +msgid "Volume" +msgstr "Lydstyrke" + +#: ../js/ui/status/volume.js:51 +msgid "Microphone" +msgstr "Mikrofon" + +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/telepathyClient.js:226 +msgid "Invitation" +msgstr "Invitasjon" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:284 +msgid "Call" +msgstr "Ring" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:300 +msgid "File Transfer" +msgstr "Filoverføring" + +#: ../js/ui/telepathyClient.js:381 +msgid "Subscription request" +msgstr "Førespurnad om abonnering" + +#: ../js/ui/telepathyClient.js:418 +msgid "Connection error" +msgstr "Tilkoplingsfeil" + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/telepathyClient.js:908 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "Sendt %A %X" + +#. Translators: this is a time format in the style of "Wednesday, May 25", +#. shown when you get a chat message in the same year. +#: ../js/ui/telepathyClient.js:914 +#, no-c-format +msgid "Sent on %A, %B %d" +msgstr "Sendt %A %d. %B" + +#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", +#. shown when you get a chat message in a different year. +#: ../js/ui/telepathyClient.js:919 +#, no-c-format +msgid "Sent on %A, %B %d, %Y" +msgstr "Sendt %A %d. %B %Y" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/telepathyClient.js:948 +#, c-format +msgid "%s is now known as %s" +msgstr "%s er no kjend som %s" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/telepathyClient.js:1048 +#, c-format +msgid "Invitation to %s" +msgstr "Invitasjon til %s" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/telepathyClient.js:1056 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "%s inviterer deg til å vera med i %s" + +#: ../js/ui/telepathyClient.js:1058 ../js/ui/telepathyClient.js:1137 +#: ../js/ui/telepathyClient.js:1201 +msgid "Decline" +msgstr "Avslå" + +#: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1138 +#: ../js/ui/telepathyClient.js:1202 +msgid "Accept" +msgstr "Godta" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1089 +#, c-format +msgid "Video call from %s" +msgstr "Videooppringing frå %s" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1092 +#, c-format +msgid "Call from %s" +msgstr "Oppringing frå %s" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/telepathyClient.js:1099 +msgid "Answer" +msgstr "Svar" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/telepathyClient.js:1131 +#, c-format +msgid "%s is sending you %s" +msgstr "%s sender deg %s" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/telepathyClient.js:1166 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "%s ønskjer å sjå når du er tilkopla" + +#: ../js/ui/telepathyClient.js:1259 +msgid "Network error" +msgstr "Nettverksfeil" + +#: ../js/ui/telepathyClient.js:1261 +msgid "Authentication failed" +msgstr "Feil under autentisering" + +#: ../js/ui/telepathyClient.js:1263 +msgid "Encryption error" +msgstr "Krypteringsfeil" + +#: ../js/ui/telepathyClient.js:1265 +msgid "Certificate not provided" +msgstr "Sertifikat ikkje oppgjeve" + +#: ../js/ui/telepathyClient.js:1267 +msgid "Certificate untrusted" +msgstr "Sertifikatet er upåliteleg" + +#: ../js/ui/telepathyClient.js:1269 +msgid "Certificate expired" +msgstr "Sertifikatet er utgått" + +#: ../js/ui/telepathyClient.js:1271 +msgid "Certificate not activated" +msgstr "Sertifikatet er ikkje slått på" + +#: ../js/ui/telepathyClient.js:1273 +msgid "Certificate hostname mismatch" +msgstr "Feil vertsnamn for sertifikatet" + +#: ../js/ui/telepathyClient.js:1275 +msgid "Certificate fingerprint mismatch" +msgstr "Fingeravtrykket til sertifikatet er feil" + +#: ../js/ui/telepathyClient.js:1277 +msgid "Certificate self-signed" +msgstr "Sertifikatet er sjølvsignert" + +#: ../js/ui/telepathyClient.js:1279 +msgid "Status is set to offline" +msgstr "Status er sett til fråkopla" + +#: ../js/ui/telepathyClient.js:1281 +msgid "Encryption is not available" +msgstr "Kryptering er ikkje tilgjengeleg" + +#: ../js/ui/telepathyClient.js:1283 +msgid "Certificate is invalid" +msgstr "Sertifikatet er ugyldig" + +#: ../js/ui/telepathyClient.js:1285 +msgid "Connection has been refused" +msgstr "Tilkopling nekta" + +#: ../js/ui/telepathyClient.js:1287 +msgid "Connection can't be established" +msgstr "Kan ikkje kopla til" + +#: ../js/ui/telepathyClient.js:1289 +msgid "Connection has been lost" +msgstr "Mista tilkoplinga" + +#: ../js/ui/telepathyClient.js:1291 +msgid "This account is already connected to the server" +msgstr "Denne kontoen er allereie kopla til tenaren" + +#: ../js/ui/telepathyClient.js:1293 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "Tilkoplinga er bytt ut med ei ny tilkopling som bruker same ressurs" + +#: ../js/ui/telepathyClient.js:1295 +msgid "The account already exists on the server" +msgstr "Kontoen finst allereie på tenaren" + +#: ../js/ui/telepathyClient.js:1297 +msgid "Server is currently too busy to handle the connection" +msgstr "Tenaren er for oppteken til å ta i mot tilkoplinga" + +#: ../js/ui/telepathyClient.js:1299 +msgid "Certificate has been revoked" +msgstr "Sertifikatet er trekt tilbake" + +#: ../js/ui/telepathyClient.js:1301 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"Sertifikatet brukar ei usikker sifferalgoritme eller er kryptografisk svakt" + +#: ../js/ui/telepathyClient.js:1303 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"Lengda på tenarsertifikatet eller djupna på sertifikatkjeda oversteig grensa " +"som er sett i kryptografibiblioteket" + +#: ../js/ui/telepathyClient.js:1305 +msgid "Internal error" +msgstr "Intern feil" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/telepathyClient.js:1315 +#, c-format +msgid "Connection to %s failed" +msgstr "Klarte ikkje kopla til %s" + +#: ../js/ui/telepathyClient.js:1324 +msgid "Reconnect" +msgstr "Kopla til på nytt" + +#: ../js/ui/telepathyClient.js:1325 +msgid "Edit account" +msgstr "Endra konto" + +#: ../js/ui/telepathyClient.js:1371 +msgid "Unknown reason" +msgstr "Ukjend årsak" + +#: ../js/ui/userMenu.js:130 +msgid "Available" +msgstr "Tilgjengeleg" + +#: ../js/ui/userMenu.js:133 +msgid "Busy" +msgstr "Oppteken" + +#: ../js/ui/userMenu.js:136 +msgid "Invisible" +msgstr "Usynleg" + +#: ../js/ui/userMenu.js:139 +msgid "Away" +msgstr "Vekke" + +#: ../js/ui/userMenu.js:142 +msgid "Idle" +msgstr "Uverksam" + +#: ../js/ui/userMenu.js:145 +msgid "Unavailable" +msgstr "Utilgjengeleg" + +#: ../js/ui/userMenu.js:567 ../js/ui/userMenu.js:706 +msgid "Switch User" +msgstr "Byt brukar" + +#: ../js/ui/userMenu.js:568 +msgid "Switch Session" +msgstr "Byt økt" + +#: ../js/ui/userMenu.js:689 +msgid "Notifications" +msgstr "Varslingar" + +#: ../js/ui/userMenu.js:698 +msgid "System Settings" +msgstr "Systeminnstillingar" + +#: ../js/ui/userMenu.js:711 +msgid "Log Out" +msgstr "Logg ut" + +#: ../js/ui/userMenu.js:716 +msgid "Lock" +msgstr "" + +#: ../js/ui/userMenu.js:724 +msgid "Install Updates & Restart" +msgstr "" + +#: ../js/ui/userMenu.js:749 +msgid "Your chat status will be set to busy" +msgstr "Nettpratstatusen din vil verta sett til oppteken" + +#: ../js/ui/userMenu.js:750 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" +"Varslingar er no slått av, òg for nettpratmeldingar. Nettstatusen din er " +"endra, slik at andre får vite at du kanskje ikkje ser meldingane deira." + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/viewSelector.js:113 +msgid "Type to search..." +msgstr "Skriv for å søkja …" + +#: ../js/ui/viewSelector.js:131 ../src/shell-util.c:253 +msgid "Search" +msgstr "Søk" + +#: ../js/ui/wanda.js:124 +#, c-format +msgid "" +"Sorry, no wisdom for you today:\n" +"%s" +msgstr "" + +#: ../js/ui/wanda.js:128 +#, c-format +msgid "%s the Oracle says" +msgstr "" + +#: ../js/ui/wanda.js:168 +msgid "Your favorite Easter Egg" +msgstr "" + +#: ../js/ui/windowAttentionHandler.js:19 +#, c-format +msgid "'%s' is ready" +msgstr "«%s» er klar" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution kalender" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1089 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u utgang" +msgstr[1] "%u utgangar" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1099 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u inngang" +msgstr[1] "%u inngangar" + +#: ../src/gvc/gvc-mixer-control.c:1397 +msgid "System Sounds" +msgstr "Systemlydar" + +#: ../src/main.c:327 +msgid "Print version" +msgstr "Skriv ut versjon" + +#: ../src/main.c:333 +msgid "Mode used by GDM for login screen" +msgstr "Modus brukt av GDM for innloggingskjermen" + +#: ../src/main.c:339 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "" + +#: ../src/main.c:345 +msgid "List possible modes" +msgstr "" + +#: ../src/shell-app.c:622 +#, c-format +msgid "Failed to launch '%s'" +msgstr "Klarte ikkje starta «%s»" + +#: ../src/shell-keyring-prompt.c:708 +msgid "Passwords do not match." +msgstr "Passorda samsvarer ikkje." + +#: ../src/shell-keyring-prompt.c:716 +msgid "Password cannot be blank" +msgstr "" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "Storbritannia" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "Standard" + +#: ../src/shell-polkit-authentication-agent.c:340 +msgid "Authentication dialog was dismissed by the user" +msgstr "Autentiseringsvindauget vart lata att av brukaren" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:97 +msgid "Home" +msgstr "Heim" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:107 +msgid "File System" +msgstr "Filsystem" + +#. Translators: the first string is the name of a gvfs +#. * method, and the second string is a path. For +#. * example, "Trash: some-directory". It means that the +#. * directory called "some-directory" is in the trash. +#. +#: ../src/shell-util.c:303 +#, c-format +msgid "%1$s: %2$s" +msgstr "%1$s: %2$s" diff --git a/po/oc.po b/po/oc.po new file mode 100644 index 0000000..887d0b7 --- /dev/null +++ b/po/oc.po @@ -0,0 +1,3146 @@ +# Occitan translations for gnome-shell package. +# Copyright (C) 2009-2015 Listed translators +# This file is distributed under the same license as the gnome-shell package. +# Cédric Valmary (Tot en Òc) , 2015. +# Cédric Valmary (totenoc.eu) , 2016, 2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master fr\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2018-04-13 19:54+0000\n" +"PO-Revision-Date: 2018-07-05 11:45+0200\n" +"Last-Translator: Cédric Valmary (totenoc.eu) \n" +"Language-Team: Tot En Òc\n" +"Language: oc\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: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistèma" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Afichar la lista de las notificacions" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Balhar lo focus a la notificacion activa" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Afichar la vista d'ensemble." + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Afichar totas las aplicacions" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Dobrir lo menú de l'aplicacion" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:150 +#| msgid "GNOME Shell Extensions" +msgid "Shell Extensions" +msgstr "Extensions Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurar las extensions GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gestion de las fenèstras e aviada de las aplicacions" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Activar las aisinas intèrnas pels desvolopaires e los testaires dempuèi Alt-" +"F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Autorizar l'accès a las aisinas intèrnas de desbugatge e de susvelhança " +"gràcia a la bóstia de dialòg d'aviada d'aplicacion (Alt-F2)." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Identificants UUID de las extensions d'activar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Las extensions GNOME Shell an una proprietat UUID. Aquesta clau enumèra las " +"extensions que devon èsser cargadas. Tota extension que voldriá èsser " +"cargada deu èsser aponduda dins aquesta lista. Podètz tanben manipular " +"aquesta lista amb los metòdes DBus EnableExtension e DisableExtension de org." +"gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Desactivar las extensions utilizaire" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Desactivar l’ensemble de las extensions activadas per l’utilizaire sens " +"afectar la proprietat « enabled-extension »." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Desactiva la verificacion de compatibilitat de version" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell carga unicament las extensions qu'anóncia lor gestion de la " +"version en cors. Activar aquesta opcion desactiva aquesta verificacion e " +"ensaja de cargar totas las extensions, sens considerar las versions " +"qu'anóncian prene en carga." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Lista d'identificants de fichièrs desktop per las aplicacions favoritas" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Las aplicacions que correspondon a aqueles identificants son afichadas dins " +"la zòna dels favorits." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Vista del selector d'aplicacions" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Indèx de la vista actualament seleccionada dins lo selector d'aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Istoric de la bóstia de dialòg de las comandas (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Istoric de la bóstia de dialòg d'inspeccion" + +#: data/org.gnome.shell.gschema.xml.in:67 +#| msgid "Always show the 'Log out' menu item in the user menu." +msgid "Always show the “Log out” menu item in the user menu." +msgstr "" +"Totjorn afichar l’element « Se desconnectar » dins lo menú utilizaire." + +#: data/org.gnome.shell.gschema.xml.in:68 +#| msgid "" +#| "This key overrides the automatic hiding of the 'Log out' menu item in " +#| "single-user, single-session situations." +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Aquesta clau aficha l’element « Se desconnectar » del menú utilizaire " +"normalament amagat automaticament dins lo cas d’una session o d’un " +"utilizaire unic." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Se remembrar dels senhals pels montatges dels sistèmas de fichièrs chifrats " +"o distants" + +#: data/org.gnome.shell.gschema.xml.in:76 +#| msgid "" +#| "The shell will request a password when an encrypted device or a remote " +#| "filesystem is mounted. If the password can be saved for future use a " +#| "'Remember Password' checkbox will be present. This key sets the default " +#| "state of the checkbox." +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Lo shell demandarà un senhal al montatge d’un periferic chifrat o d’" +"un sistèma de fichièrs distant. Se lo senhal pòt èsser enregistrat per " +"una utilizacion ulteriora, una casa de marcar « Se remembrar del senhal »" +" serà presenta. Aquesta clau determina l’estat per defaut d'aquesta casa de marcar." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Indica se l’adaptator Bluetooth a de periferics associats" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Lo shell aficharà pas d’element de menú Bluetooth que se un adaptator " +"Bluetooth es alucat o se i a de periferics associats amb l’" +"adaptator per defaut. Aquò sera reïnicializat se l’adaptator per defaut se " +"retròba sens cap de periferic associat." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Combinason de tòcas per dobrir lo menú de l'aplicacion" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Combinason de tòcas per dobrir lo menú de l'aplicacion." + +#: data/org.gnome.shell.gschema.xml.in:108 +#| msgid "Keybinding to open the \"Show Applications\" view" +msgid "Keybinding to open the “Show Applications” view" +msgstr "Combinason de tòcas per dobrir la vista « Afichar las aplicacions »" + +#: data/org.gnome.shell.gschema.xml.in:109 +#| msgid "" +#| "Keybinding to open the \"Show Applications\" view of the Activities " +#| "Overview." +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Combinason de tòcas per dobrir la vista « Afichar las aplicacions » de " +"la vista d’ensemble de las activitats." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Combinason de tòcas per dobrir la vista d'ensemble" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Combinason de tòcas per dobrir la vista d'ensemble de las aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Combinason de tòcas per inversar la visibilitat de la lista de las " +"notificacions" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Combinason de tòcas per inversar la visibilitat de la lista de las " +"notificacions" + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Combinason de tòcas per donar lo focus a la notificacion activa" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Combinason de tòcas per donar lo focus a la notificacion activa." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Combinason de tòcas per arrestar e tampar totas las transicions amb una tòca " +"de desbugatge" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Lo clavièr utilizat" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Lo tipe de clavièr utilizat." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Limita lo selector de fenèstras a l'espaci de trabalh actual." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Se verai, solas las aplicacions qu'an de fenèstras dobèrtas sus l'espaci de " +"trabalh actual son afichadas dins lo selector. Siquenon, totas las " +"aplicacions i son inclusas." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Lo tipe d'icòna de las aplicacions." + +#: data/org.gnome.shell.gschema.xml.in:177 +#| msgid "" +#| "Configures how the windows are shown in the switcher. Valid possibilities " +#| "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +#| "only' (shows only the application icon) or 'both'." +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configura lo biais que las fenèstras son afichadas dins lo selector. Las " +"causidas possiblas son « thumbnail-only » (aficha una miniatura de la fenèstra)" +", « app-icon-only » (aficha unicament l’icòna de l’aplicacion), o « both " +"» (aficha los dos)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Se verai, solas las fenèstras de l'espaci de trabalh actual son afichadas " +"dins lo selector. Siquenon, totas las fenèstras i son inclusas." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Estacar los dialògs modals a lor fenèstra parenta" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Aquesta clau pren lo pas sus la clau dins org.gnome.mutter quand GNOME Shell " +"es aviat." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Activar l'empilatge de las fenèstras depausadas suls bòrds de l'ecran" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Los espacis de trabalh son gerits dinamicament" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Los espacis de trabalh son unicament sus l'ecran principal" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Retardar los cambiaments de focus en mòde mirga fins al moment que lo " +"puntador arrestarà de bolegar" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Identificacion ret" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +#| msgid "Network error" +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "" +"Una error s'es produita al moment del cargament de la bóstia de dialòg de " +"las preferéncias de %s :" + +#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 +#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 +#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 +msgid "Cancel" +msgstr "Anullar" + +#: js/gdm/authPrompt.js:166 js/gdm/authPrompt.js:209 js/gdm/authPrompt.js:441 +msgid "Next" +msgstr "Seguent" + +#: js/gdm/authPrompt.js:205 js/ui/shellMountOperation.js:347 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Desverrolhar" + +#: js/gdm/authPrompt.js:207 +msgctxt "button" +msgid "Sign In" +msgstr "Se connectar" + +#: js/gdm/loginDialog.js:315 +msgid "Choose Session" +msgstr "Causir una session" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "Absent de la lista ?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:887 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(per ex. utilizaire o %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Nom d'utilizaire : " + +#: js/gdm/loginDialog.js:1228 +msgid "Login Window" +msgstr "Fenèstra de connexion" + +#: js/gdm/util.js:345 +msgid "Authentication error" +msgstr "Error d'autentificacion" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(o fasètz lisar lo det)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +#| msgid "Power Off" +msgctxt "search-result" +msgid "Power Off" +msgstr "Atudar" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +msgid "power off;shutdown;reboot;restart" +msgstr "atudar;tampar;desbrancar;reaviar;ralucar;reboot;" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Verrolhatge de l’ecran" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +msgid "lock screen" +msgstr "verrolhatge;ecran;" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +#| msgid "Log Out" +msgctxt "search-result" +msgid "Log Out" +msgstr "Tampar la session" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "tampar;session;desconnectar;" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +#| msgid "Suspend" +msgctxt "search-result" +msgid "Suspend" +msgstr "Metre en velha" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +#| msgid "Suspend" +msgid "suspend;sleep" +msgstr "metre en velha;sòm;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:127 +#| msgid "Switch User" +msgctxt "search-result" +msgid "Switch User" +msgstr "Cambiar d’utilizaire" + +#. 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;utilizaire;" + +#. 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 "Verrolhatge de l’orientacion" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:137 +msgid "lock orientation;screen;rotation" +msgstr "verrolhatge;orientacion;ecran;rotacion;" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Comanda pas trobada" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Impossible d'analisar la comanda :" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Execucion de « %s » impossibla :" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Ara meteis" + +#: js/misc/util.js:182 +#, javascript-format, javascript-format +#| msgid "%d minute remaining" +#| msgid_plural "%d minutes remaining" +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Fa %d minuta" +msgstr[1] "Fa %d minutas" + +#: js/misc/util.js:185 +#, javascript-format, javascript-format +#| msgid "%d hour remaining" +#| msgid_plural "%d hours remaining" +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Fa %d ora" +msgstr[1] "Fa %d oras" + +#: js/misc/util.js:188 +#| msgid "Yesterday, %H∶%M" +msgid "Yesterday" +msgstr "Ièr" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Fa %d jorn" +msgstr[1] "Fa %d jorns" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Fa %d setmana" +msgstr[1] "Fa %d setmanas" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Fa %d mes" +msgstr[1] "Fa %d meses" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Fa %d an" +msgstr[1] "Fa %d ans" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ièr, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ièr, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +#| msgid "Network Login" +msgid "Hotspot Login" +msgstr "Identificacion del punt d’accès" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"La connexion a aqueste punt d’accès es pas securizada. Los senhals e " +"las autras informacions picatz sus aquesta pagina pòdon èsser " +"interceptats per de personas a l'entorn de vos." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:393 +msgid "Deny Access" +msgstr "Refusar l'accès" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:396 +msgid "Grant Access" +msgstr "Acordar l'accès" + +#: js/ui/appDisplay.js:793 +msgid "Frequently used applications will appear here" +msgstr "Las aplicacions utilizadas frequentament apareisseràn aicí" + +#: js/ui/appDisplay.js:914 +msgid "Frequent" +msgstr "Utilizadas frequentament" + +#: js/ui/appDisplay.js:921 +msgid "All" +msgstr "Totes" + +#: js/ui/appDisplay.js:1886 +msgid "New Window" +msgstr "Novèla fenèstra" + +#: js/ui/appDisplay.js:1900 +msgid "Launch using Dedicated Graphics Card" +msgstr "Aviar en utilizant la carta grafica dedicada" + +#: js/ui/appDisplay.js:1927 js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "Levar dels favorits" + +#: js/ui/appDisplay.js:1933 +msgid "Add to Favorites" +msgstr "Apondre als favorits" + +#: js/ui/appDisplay.js:1943 +msgid "Show Details" +msgstr "Afichar los detalhs" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s es estat apondut a vòstres favorits." + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s es estat suprimit de vòstres favorits." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Seleccionar lo perfieric àudio" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Paramètres del son" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Casc àudio" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Microcasc" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Microfòn" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Modificar lo rèireplan…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Afichar los paramètres" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:264 +msgid "Settings" +msgstr "Paramètres" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:44 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:73 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:75 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:77 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:79 +msgctxt "grid wednesday" +msgid "W" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:81 +msgctxt "grid thursday" +msgid "T" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:83 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:85 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:379 +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:389 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:446 +msgid "Previous month" +msgstr "Mes precedent" + +#: js/ui/calendar.js:456 +msgid "Next month" +msgstr "Mes seguent" + +#: js/ui/calendar.js:609 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:664 +msgid "Week %V" +msgstr "Setmana %V" + +# luc: Trying alternatives: +# 123456789|123456789| +# Toute la jornada bad +# Journée entière bad +# Jour entier +# La jornada +# Journée +# +# All Day +# +# lo calendrier (mal) francisé : +# http://blog.arkezis.com/wp-content/uploads/2011/04/Captura.png +# +# See also https://bugzilla.gnome.org/show_bug.cgi?id=658679 +# +# +# +# lo calendrier (mal) francisé : +# http://blog.arkezis.com/wp-content/uploads/2011/04/Capture.png +# +# +#. 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:733 +msgctxt "event list time" +msgid "All Day" +msgstr "Tota la jornada" + +#: js/ui/calendar.js:864 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A %d %B" + +#: js/ui/calendar.js:868 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A %d %B, %Y" + +#: js/ui/calendar.js:1086 +msgid "No Notifications" +msgstr "Pas cap de notificacion" + +#: js/ui/calendar.js:1089 +msgid "No Events" +msgstr "Pas cap d'eveniment" + +#: js/ui/calendar.js:1117 +msgid "Clear All" +msgstr "Escafar tot" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format, javascript-format +#| msgid "“%s” is ready" +msgid "“%s” is not responding." +msgstr "« %s » respond pas." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Podètz siá esperar un pauc per contunhar, siá forçar l’aplicacion a " +"quitar." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Forçar a quitar" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Esperar" + +#: js/ui/components/automountManager.js:90 +msgid "External drive connected" +msgstr "Disc extèrne connectat" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Disc extèrne desconnectat" + +#: js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "Dobrir amb %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 +msgid "Password:" +msgstr "Senhal :" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Picatz tornamai :" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245 +#: js/ui/status/network.js:336 js/ui/status/network.js:922 +msgid "Connect" +msgstr "Se connectar" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Senhal : " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Clau : " + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Identitat : " + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Senhal de la clau privada : " + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Servici : " + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659 +msgid "Authentication required by wireless network" +msgstr "L'autentificacion es requesida per la ret sens fial" + +#: 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 "" +"Cal un senhal o una clau de chiframent per accedir a la ret sens fial « %s »" + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663 +msgid "Wired 802.1X authentication" +msgstr "Autentificacion filara 802.1X" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Nom de la ret : " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667 +msgid "DSL authentication" +msgstr "Autentificacion DSL" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673 +msgid "PIN code required" +msgstr "Còdi PIN requesit" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Un còdi PIN es necessari pels telefòns mobils de benda larga" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN : " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680 +msgid "Mobile broadband network password" +msgstr "Senhal del telefòn mobil de benda larga" + +#: 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 "Un senhal es requesit per se connectar a « %s »." + +#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1691 +msgid "Network Manager" +msgstr "Gestionari de ret" + +#: js/ui/components/polkitAgent.js:48 +msgid "Authentication Required" +msgstr "Autentificacion necessària" + +#: js/ui/components/polkitAgent.js:76 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:156 +msgid "Authenticate" +msgstr "S'autentificar" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 +#| msgid "Sorry, that didn't work. Please try again." +msgid "Sorry, that didn’t work. Please try again." +msgstr "Fracàs de l’autentificacion. Ensajar tornamai." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:795 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s es ara conegut jol nom de %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Fenèstras" + +#: js/ui/dash.js:246 js/ui/dash.js:287 +msgid "Show Applications" +msgstr "Afichar las aplicacions" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:443 +msgid "Dash" +msgstr "Dash" + +# luc: FIXME: how to have a capitalized weekday (start of sentence)? +# %a (abbreviated) %A (full weekday) %^A (full weekday all uppercase) +# https://bugzilla.gnome.org/show_bug.cgi?id=658686 +# +# luc: TODO: to test, this possibly explodes on dimanche 25 septembre 2011 +# L M M J V S D +#. 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:74 +msgid "%B %e %Y" +msgstr "%-e %B %Y" + +# luc: FIXME: how to have a capitalized weekday (start of sentence)? +# %a (abbreviated) %A (full weekday) %^A (full weekday all uppercase) +# https://bugzilla.gnome.org/show_bug.cgi?id=658686 +# +# luc: TODO: to test, this possibly explodes on dimanche 25 septembre 2011 +# L M M J V S D +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:145 +msgid "Add world clocks…" +msgstr "Apondre de relòtges locals…" + +#: js/ui/dateMenu.js:146 +msgid "World Clocks" +msgstr "Relòtges locals" + +#: js/ui/dateMenu.js:227 +msgid "Weather" +msgstr "Metèo" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:291 +#, javascript-format +msgid "%s all day." +msgstr "%s tota la jornada." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:297 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, puèi %s mai tard." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:303 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, puèi %s, seguit per %s mai tard." + +#: js/ui/dateMenu.js:314 +#| msgid "Select a network" +msgid "Select a location…" +msgstr "Causir un emplaçament…" + +#: js/ui/dateMenu.js:317 +#| msgid "Searching…" +msgid "Loading…" +msgstr "Cargament…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:323 +#, javascript-format +msgid "Feels like %s." +msgstr "Temperatura ressentida : %s." + +#: js/ui/dateMenu.js:326 +msgid "Go online for weather information" +msgstr "Cercar las informacions meteorologicas en linha" + +#: js/ui/dateMenu.js:328 +#| msgid "Encryption is not available" +msgid "Weather information is currently unavailable" +msgstr "Las informacions meteorologicas son pas disponiblas actualament" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Tampar la session de %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Tampar la session" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s serà desconnectat automaticament dins %d segonda." +msgstr[1] "%s serà desconnectat automaticament dins %d segondas." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Seretz desconnectat automaticament dins %d segonda." +msgstr[1] "Seretz desconnectat automaticament dins %d segondas." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Tampar la session" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Atudar" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Installar las mesas a jorn e atudar" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Aqueste ordenador s'atudarà automaticament dins %d segonda." +msgstr[1] "Aqueste ordenador s'atudarà automaticament dins %d segondas." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Installar las mesas a jorn logicialles en espèra" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Reaviar" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Atudar" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Reaviar" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Aqueste ordenador se reaviarà automaticament dins %d segonda." +msgstr[1] "Aqueste ordenador se reaviarà automaticament dins %d segondas." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reaviar e installar las mesas a jorn" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Lo sistèma se reaviarà automaticament e installarà las mesas a jorn dins %d " +"segonda." +msgstr[1] "" +"Lo sistèma se reaviarà automaticament e installarà las mesas a jorn dins %d " +"segondas." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reaviar e installar" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installar e atudar" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Atudar aprèp l'installacion de las mesas a jorn" + +#: js/ui/endSessionDialog.js:137 +#| msgctxt "title" +#| msgid "Restart & Install Updates" +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reaviar e installar la mesa a nivèl" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s sera installat aprèp la reaviada. L’installacion d’una mesa a nivèl " +"pòt prene fòrça temps : verificatz que dispausatz de salvaments e que l’" +"ordenador es brancat sul sector." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Foncionament sus batariá : brancatz-vos abans d'installar las mesas a jorn." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "D'unas aplicacions son ocupadas o an de trabalhs pas salvats." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "D'autres utilizaires son connectats." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:666 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (distant)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:669 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consòla)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Installar" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Telecargar e installar « %s » a partir de extensions.gnome.org ?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vòl neutralizar los acorchis" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "L’aplicacion vòl neutralizar los acorchis" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Per restablir los acorchis, quichatz sus %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Refusar" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Autorizar" + +#: js/ui/kbdA11yDialog.js:33 +#| msgid "Slow Keys" +msgid "Slow Keys Turned On" +msgstr "Tòcas lentas activadas" + +#: js/ui/kbdA11yDialog.js:34 +#| msgid "Slow Keys" +msgid "Slow Keys Turned Off" +msgstr "Tòcas 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 "" +"Venètz de quichar pendent 8 segondas sus la tòca Maj. Aquò es l'" +"acorchi d’activacion de las tòcas lentas e afècta lo biais que vòstre " +"clavièr reagís." + +#: js/ui/kbdA11yDialog.js:42 +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned On" +msgstr "Tòcas remanentas activadas" + +#: js/ui/kbdA11yDialog.js:43 +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned Off" +msgstr "Tòcas remanentas 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 "" +"Venètz de quichar 5 còps de seguida sus la tòca Maj. Aquò es l'" +"acorchi d’activacion de las tòcas remanentas e afècta lo biais que vòstre " +"clavièr reagís." + +#: 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 "" +"Venètz de quichar sus doas tòcas en même temps, o 5 còps de seguida sus " +"la tòca Maj. Aquò desactiva la foncion tòcas remanentas e afècta lo " +"biais que vòstre clavièr reagís." + +#: js/ui/kbdA11yDialog.js:59 +msgid "Leave On" +msgstr "Daissar activat" + +#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 +#: js/ui/status/network.js:1281 +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:337 +#: js/ui/status/network.js:1281 js/ui/status/network.js:1396 +#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90 +#: js/ui/status/rfkill.js:117 +msgid "Turn Off" +msgstr "Atudar" + +#: js/ui/kbdA11yDialog.js:67 +msgid "Leave Off" +msgstr "Daissar atudat" + +#: js/ui/keyboard.js:198 +msgid "Region & Language Settings" +msgstr "Paramètres de region e de lenga" + +#: js/ui/lookingGlass.js:644 +msgid "No extensions installed" +msgstr "Cap d'extension pas installada" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:698 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s a pas emés cap d'error." + +#: js/ui/lookingGlass.js:704 +msgid "Hide Errors" +msgstr "Amagar las errors" + +#: js/ui/lookingGlass.js:708 js/ui/lookingGlass.js:768 +msgid "Show Errors" +msgstr "Afichar las errors" + +#: js/ui/lookingGlass.js:717 +msgid "Enabled" +msgstr "Activat" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:720 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Desactivat" + +#: js/ui/lookingGlass.js:722 +msgid "Error" +msgstr "Error" + +#: js/ui/lookingGlass.js:724 +msgid "Out of date" +msgstr "Perimit" + +#: js/ui/lookingGlass.js:726 +msgid "Downloading" +msgstr "Telecargament" + +#: js/ui/lookingGlass.js:750 +msgid "View Source" +msgstr "Afichar la font" + +#: js/ui/lookingGlass.js:759 +msgid "Web Page" +msgstr "Pagina Web" + +#: js/ui/messageTray.js:1493 +msgid "System Information" +msgstr "Informacions del sistèma" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Artista desconegut" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Títol desconegut" + +#: js/ui/overview.js:83 +msgid "Undo" +msgstr "Anullar" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:112 +msgid "Overview" +msgstr "Vista d'ensemble" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:239 +msgid "Type to search…" +msgstr "Recercar…" + +#: js/ui/padOsd.js:105 +msgid "New shortcut…" +msgstr "Novèl acorchi…" + +#: js/ui/padOsd.js:156 +#| msgid "Applications" +msgid "Application defined" +msgstr "Aplicacions definidas" + +#: js/ui/padOsd.js:157 +msgid "Show on-screen help" +msgstr "Afichar l’ajuda a l’ecran" + +#: js/ui/padOsd.js:158 +#| msgid "Switch User" +msgid "Switch monitor" +msgstr "Cambiar d’ecran" + +#: js/ui/padOsd.js:159 +msgid "Assign keystroke" +msgstr "Associar una tòca" + +#: js/ui/padOsd.js:226 +msgid "Done" +msgstr "Acabat" + +#: js/ui/padOsd.js:740 +msgid "Edit…" +msgstr "Edicion…" + +#: js/ui/padOsd.js:782 js/ui/padOsd.js:887 +msgid "None" +msgstr "Pas cap" + +#: js/ui/padOsd.js:841 +msgid "Press a button to configure" +msgstr "Quichatz sus un boton per lo configurar" + +#: js/ui/padOsd.js:842 +msgid "Press Esc to exit" +msgstr "Quichatz sus Escap. per quitar" + +#: js/ui/padOsd.js:845 +msgid "Press any key to exit" +msgstr "Quichatz sus una tòca per quitar" + +#: js/ui/panel.js:355 +msgid "Quit" +msgstr "Quitar" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:411 +msgid "Activities" +msgstr "Activitats" + +#: js/ui/panel.js:692 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistèma" + +#: js/ui/panel.js:811 +msgid "Top Bar" +msgstr "Barra superiora" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Picatz una comanda" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:175 +msgid "Close" +msgstr "Tampar" + +#: js/ui/runDialog.js:273 +#| msgid "Encryption is not available" +msgid "Restart is not available on Wayland" +msgstr "La reaviada es pas disponibla sus Wayland" + +#: js/ui/runDialog.js:278 +msgid "Restarting…" +msgstr "Reaviada en cors…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A %d %B" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d messatge novèl" +msgstr[1] "%d messatges novèls" + +#: js/ui/screenShield.js:148 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notificacion novèla" +msgstr[1] "%d notificacions novèlas" + +#: js/ui/screenShield.js:451 js/ui/status/system.js:283 +msgid "Lock" +msgstr "Verrolhar" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "GNOME a besonh de verrolhar l'ecran" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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:1309 +msgid "Unable to lock" +msgstr "Impossible de verrolhar" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1310 +msgid "Lock was blocked by an application" +msgstr "Lo verrolhatge es estat blocat per una aplicacion" + +#: js/ui/search.js:653 +msgid "Searching…" +msgstr "Recèrca en cors…" + +#: js/ui/search.js:655 +msgid "No results." +msgstr "Pas cap de resultat." + +#: js/ui/search.js:779 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d mai" +msgstr[1] "%d mai" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Copiar" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Pegar" + +#: js/ui/shellEntry.js:96 +msgid "Show Text" +msgstr "Afichar lo tèxte" + +#: js/ui/shellEntry.js:98 +msgid "Hide Text" +msgstr "Amagar lo tèxte" + +#: js/ui/shellMountOperation.js:314 +msgid "Password" +msgstr "Senhal" + +#: js/ui/shellMountOperation.js:335 +msgid "Remember Password" +msgstr "Se remembrar del senhal" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Accessibilitat" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Zoom" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Lector d'ecran" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Clavièr visual" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Alèrtas visualas" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Tòcas remanentas" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Tòcas lentas" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Rebombs de tòcas" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Tòcas de la mirga" + +#: js/ui/status/accessibility.js:165 +msgid "High Contrast" +msgstr "Contraste elevat" + +#: js/ui/status/accessibility.js:200 +msgid "Large Text" +msgstr "Grand tèxte" + +#: js/ui/status/bluetooth.js:48 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:614 +msgid "Bluetooth Settings" +msgstr "Paramètres Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: 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:139 +msgid "Off" +msgstr "Desactivat" + +#: js/ui/status/bluetooth.js:141 +msgid "On" +msgstr "Activat" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Luminositat" + +#: js/ui/status/keyboard.js:781 +msgid "Keyboard" +msgstr "Clavièr" + +#: js/ui/status/keyboard.js:804 +msgid "Show Keyboard Layout" +msgstr "Afichar la disposicion del clavièr" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Localizacion activada" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Desactivar" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Paramètres de confidencialitat" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Localizacion activada" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Localizacion desactivada" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Activar" + +#. Translators: %s is an application name +#: js/ui/status/location.js:386 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Donar accès a vòstra posicion a %s ?" + +#: js/ui/status/location.js:387 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Las règlas d’accès a la localizacion pòdon a tot moment èsser modificadas " +"dins los paramètres de confidencialitat." + +#: js/ui/status/network.js:90 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:441 js/ui/status/network.js:1310 +#, javascript-format +msgid "%s Off" +msgstr "%s atudat" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:444 +#, javascript-format +msgid "%s Connected" +msgstr "%s connectat" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s pas gerit" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Desconnexion de %s en cors" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:459 js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Connecting" +msgstr "Connexion de %s en cors" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:462 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "Autentificacion necessària per %s" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:470 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Micrologicial mancant 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:474 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s pas disponible" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:477 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Fracàs de connexion a %s" + +#: js/ui/status/network.js:493 +msgid "Wired Settings" +msgstr "Paramètres de la connexion filara" + +#: js/ui/status/network.js:535 +msgid "Mobile Broadband Settings" +msgstr "Paramètres del telefòn mobil de benda larga" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:578 js/ui/status/network.js:1307 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Equipament %s desactivat" + +#. 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:582 +#, javascript-format +msgid "%s Disabled" +msgstr "%s desactivat" + +#: js/ui/status/network.js:622 +#| msgid "Connection error" +msgid "Connect to Internet" +msgstr "Se connectar a Internet" + +#: js/ui/status/network.js:816 +msgid "Airplane Mode is On" +msgstr "Lo mòde avion es activat" + +#: js/ui/status/network.js:817 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Lo Wi-Fi es desactivat quand lo mòde avion es activat." + +#: js/ui/status/network.js:818 +msgid "Turn Off Airplane Mode" +msgstr "Desactivar lo mòde avion" + +#: js/ui/status/network.js:827 +msgid "Wi-Fi is Off" +msgstr "Lo Wi-fi es desactivat" + +#: js/ui/status/network.js:828 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Lo Wi-Fi a besonh d'èsser activat per se connectar a una ret." + +#: js/ui/status/network.js:829 +msgid "Turn On Wi-Fi" +msgstr "Activar lo Wi-Fi" + +#: js/ui/status/network.js:854 +msgid "Wi-Fi Networks" +msgstr "Rets Wi-Fi" + +#: js/ui/status/network.js:856 +msgid "Select a network" +msgstr "Causir una ret" + +#: js/ui/status/network.js:886 +msgid "No Networks" +msgstr "Cap de ret pas disponibla" + +#: js/ui/status/network.js:907 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Utilizar l'interruptor material per atudar" + +#: js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "Seleccionar una ret" + +#: js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "Paramètres del Wifi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1298 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspot %s activat" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1313 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s desconnectat" + +#: js/ui/status/network.js:1413 +#| msgid "connecting..." +msgid "connecting…" +msgstr "connexion…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1416 +msgid "authentication required" +msgstr "autentificacion necessària" + +#: js/ui/status/network.js:1418 +msgid "connection failed" +msgstr "fracàs de connexion" + +#: js/ui/status/network.js:1472 +msgid "VPN Settings" +msgstr "Paramètres VPN" + +#: js/ui/status/network.js:1485 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1495 +msgid "VPN Off" +msgstr "VPN atudat" + +#: js/ui/status/network.js:1559 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Paramètres de la ret" + +#: js/ui/status/network.js:1588 +#, javascript-format, javascript-format +#| msgid "%s Connecting" +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s connexion filària." +msgstr[1] "%s connexions filàrias." + +#: js/ui/status/network.js:1592 +#, javascript-format, javascript-format +#| msgid "%s Connecting" +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s connexion Wi-Fi." +msgstr[1] "%s connexions Wi-Fi." + +#: js/ui/status/network.js:1596 +#, javascript-format, javascript-format +#| msgid "%s Connecting" +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s connexion a un modèm." +msgstr[1] "%s connexions a de modèm." + +#: js/ui/status/network.js:1728 +msgid "Connection failed" +msgstr "Fracàs de connexion" + +#: js/ui/status/network.js:1729 +msgid "Activation of network connection failed" +msgstr "L'activacion de la connexion a la ret a fracassat" + +#: js/ui/status/nightLight.js:68 +#| msgid "Networking is disabled" +msgid "Night Light Disabled" +msgstr "Mòde nuèit desactivat" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Mòde nuèit activat" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Reprene" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Desactivar fins a deman" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Paramètres de gestion de l'energia" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Carga completa" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Estimacion en cors…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d restant (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d abans cargament complet (%d %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Lo mòde avion es activat" + +#: js/ui/status/system.js:227 +msgid "Switch User" +msgstr "Cambiar d'utilizaire" + +#: js/ui/status/system.js:239 +msgid "Log Out" +msgstr "Tampar la session" + +#: js/ui/status/system.js:251 +msgid "Account Settings" +msgstr "Paramètres del compte" + +#: js/ui/status/system.js:268 +msgid "Orientation Lock" +msgstr "Verrolhatge de l'orientacion" + +#: js/ui/status/system.js:294 +msgid "Suspend" +msgstr "Metre en velha" + +#: js/ui/status/system.js:304 +msgid "Power Off" +msgstr "Atudar" + +#: js/ui/status/thunderbolt.js:294 +msgid "Thunderbolt" +msgstr "Interfàcia Thunderbolt" + +#. we are done +#: js/ui/status/thunderbolt.js:350 +msgid "Unknown Thunderbolt device" +msgstr "Periferic Thunderbolt desconegut" + +#: js/ui/status/thunderbolt.js:351 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Un novèl periferic es estat detectat pendent vòstra abséncia. " +"Desbrancatz-lo e rebrancatz-lo abans de començar de l’utilizar" + +#: js/ui/status/thunderbolt.js:356 +msgid "Thunderbolt authorization error" +msgstr "Error d’autorizacion Thunderbolt" + +#: js/ui/status/thunderbolt.js:357 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Impossible d’autorizar lo periferic Thunderbolt : %s" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "Volum modificat" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Volum" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +#| msgid "Error" +msgid "Mirror" +msgstr "Clonar" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Jónher ecrans" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Pas que l’extèrne" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Pas que l’integrat" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Se connectar en tant qu'un autre utilizaire" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Fenèstra de desverrolhatge" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Aplicacions" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Recèrca" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "« %s » es prèst" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Volètz conservar aqueles paramètres d'afichatge ?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Restablir los paramètres" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Conservar las modificacions" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Los paramètres seràn restablits dins %d segonda" +msgstr[1] "Los paramètres seràn restablits dins %d segondas" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Minimizar" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Reduire" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Maximizar" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Desplaçar" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Redimensionar" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Desplaçar la barra de títol sus l'ecran" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Totjorn en naut" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Totjorn sus l'espaci de trabalh visible" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Desplaçar cap a l'espaci de trabalh d'esquèrra" + +#: js/ui/windowMenu.js:109 +msgid "Move to Workspace Right" +msgstr "Desplaçar cap a l'espaci de trabalh a dreita" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Desplaçar cap a l'espaci de trabalh superior" + +#: js/ui/windowMenu.js:121 +msgid "Move to Workspace Down" +msgstr "Desplaçar cap a l'espaci de trabalh inferior" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Up" +msgstr "Desplaçar cap a l'ecran superior" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Down" +msgstr "Desplaçar cap a l'ecran inferior" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Left" +msgstr "Desplaçar cap a l'ecran d'esquèrra" + +#: js/ui/windowMenu.js:167 +msgid "Move to Monitor Right" +msgstr "Desplaçar cap a l'ecran de dreita" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Agenda d'Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:432 +msgid "Print version" +msgstr "Aficha la version" + +#: src/main.c:438 +msgid "Mode used by GDM for login screen" +msgstr "Mòde utilizat per GDM per l'ecran de connexion" + +#: src/main.c:444 +#| msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Utilizar un mòde particular, per ex. « gdm » per l’ecran de connexion" + +#: src/main.c:450 +msgid "List possible modes" +msgstr "Far la lista dels mòdes possibles" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Desconegut" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Impossible d'aviar « %s »" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Los senhals correspondon pas" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Lo senhal pòt pas èsser void" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "La fenèstra d'autentificacion es estada escartada per l'utilizaire" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u sortida" +msgstr[1] "%u sortidas" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entradas" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sons sistèma" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferéncias per las extensions GNOME Shell" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Afichar la numerotacion de las setmanas dins lo calendièr" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Se verai, afichar lo numèro de setmana ISO dins lo calendièr." + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Redireccion de l'autentificacion Web" + +#~ msgid "Events" +#~ msgstr "Eveniments" + +#~ msgid "Notifications" +#~ msgstr "Notificacions" + +#~ msgid "Hide tray" +#~ msgstr "Amagar lo tirador" + +#~ msgid "Status Icons" +#~ msgstr "Icònas d'estat" + +#~ msgid "Clear section" +#~ msgstr "Escafar la seccion" + +#~ msgid "Media" +#~ msgstr "Mèdias" + +#~ msgid "Not In Use" +#~ msgstr "Pas en cors d'utilizacion" + +#~ msgid "Use as Internet connection" +#~ msgstr "Utilizar per la connexion Internet" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the message tray" +#~ msgstr "Afichar lo tirador de messatjariá" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (gestionari de fenèstras composit Wayland)" + +#~ msgid "Uuids of extensions to enable" +#~ msgstr "Identificants UUID de las extensions d'activar" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. Any extension that wants to be loaded needs to be " +#~ "in this list. You can also manipulate this list with the EnableExtension " +#~ "and DisableExtension DBus methods on org.gnome.Shell." +#~ msgstr "" +#~ "Las extensions GNOME Shell an una proprietat UUID. Aquesta clau enumèra " +#~ "las extensions que devon èsser cargadas. Tota extension que voldriá èsser " +#~ "cargada deu èsser aponduda dins aquesta lista. Tanben podètz manipular " +#~ "aquesta lista amb los metòdes DBus EnableExtension e DisableExtension de " +#~ "org.gnome.Shell." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "" +#~ "Lista de las categorias que deurián èsser afichadas coma de dorsièrs" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Cada nom de categoria dins aquesta lista serà representada coma un " +#~ "dorsièr dins la vista de las aplicacions, pluslèu qu'alinhada dins la " +#~ "vista principala." + +#~ msgid "Always show the 'Log out' menuitem in the user menu." +#~ msgstr "" +#~ "Afichar totjorn l'element « Se desconnectar » dins lo menú utilizaire." + +#~ msgid "" +#~ "This key overrides the automatic hiding of the 'Log out' menuitem in " +#~ "single-user, single-session situations." +#~ msgstr "" +#~ "Aquesta clau aficha l'element « Se desconnectar » del menú utilizaire " +#~ "normalament amagat automaticament dins lo cas d'una session o d'un " +#~ "utilizaire unique." + +#~ msgid "Keybinding to toggle the visibility of the message tray" +#~ msgstr "" +#~ "Combinason de tòcas per bascular la visibilitat del tirador de messatjariá" + +#~ msgid "Keybinding to toggle the visibility of the message tray." +#~ msgstr "" +#~ "Combinason de tòcas per bascular la visibilitat del tirador de " +#~ "messatjariá." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "La disposicion dels botons dins la barra de títol" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Aquesta clau pren lo pas sus la clau dins org.gnome.desktop.wm." +#~ "preferences quand GNOME Shell es aviat." + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Seleccionatz una extension de configurar en utilizant la bóstia combinada " +#~ "çaisús." + +#~ msgid "Execution of '%s' failed:" +#~ msgstr "Execucion de « %s » impossibla :" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l:%M %p" + +# luc: Lun. Mar. Mer. Jeu. Ven. | Lu Ma Me Je Ve | L M M J V in a column +# I checked a bunch of calendars +# (including the complete collection of Aubade calendars), +# most of them use either the one-letter either the full text version. +# Here I set it to the two-letters version because I think it is +# visually better, more readable and as much understandable than alternatives +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "D" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Lu" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Ma" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Mè" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Jò" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Ve" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Sa" + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Pas res de previst" + +#~ msgid "Today" +#~ msgstr "Uèi" + +#~ msgid "Tomorrow" +#~ msgstr "Deman" + +#~ msgid "This week" +#~ msgstr "Aquesta setmana" + +#~ msgid "Next week" +#~ msgstr "La setmana que ven" + +#~ msgid "Removable Devices" +#~ msgstr "Periferics amovibles" + +#~ msgid "Eject" +#~ msgstr "Ejectar" + +#~ msgid "" +#~ "Passwords or encryption keys are required to access the wireless network " +#~ "'%s'." +#~ msgstr "" +#~ "Cal un senhal o una clau de chiframent per accedir a la ret sens fial « " +#~ "%s »" + +#~ msgid "A password is required to connect to '%s'." +#~ msgstr "Un senhal es requesit per se connectar a « %s »." + +#~ msgid "Convidation" +#~ msgstr "Convit" + +#~ msgid "Call" +#~ msgstr "Apèl" + +#~ msgid "File Transfer" +#~ msgstr "Transferiment de fichièrs" + +#~ msgid "Chat" +#~ msgstr "Discussion" + +#~ msgid "Unmute" +#~ msgstr "Pas mut" + +#~ msgid "Mute" +#~ msgstr "Mut" + +#~ msgid "Yesterday, %H:%M" +#~ msgstr "Ièr, %H:%M" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d %B %Y, %H:%M " + +#~ msgid "Convidation to %s" +#~ msgstr "Convit cap a %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s vos convida a rejónher %s" + +#~ msgid "Decline" +#~ msgstr "Refusar" + +#~ msgid "Accept" +#~ msgstr "Acceptar" + +#~ msgid "Video call from %s" +#~ msgstr "Apèl vidèo de %s" + +#~ msgid "Call from %s" +#~ msgstr "Apèl que proven de %s" + +#~ msgid "Answer" +#~ msgstr "Respondre" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s vos manda %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s aimariá èsser autorizat a saber quand sètz en linha" + +#~ msgid "Authentication failed" +#~ msgstr "L'autentificacion a fracassat" + +#~ msgid "Encryption error" +#~ msgstr "Error de chiframent" + +#~ msgid "Certificate not provided" +#~ msgstr "Certificat pas provesit" + +#~ msgid "Certificate untrusted" +#~ msgstr "Certificat pas validat" + +#~ msgid "Certificate expired" +#~ msgstr "Certificat expirat" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificat pas activat" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Lo nom de l'òste del certificat correspond pas" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "L'emprenta del certificat correspond pas" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificat autosignat" + +#~ msgid "Status is set to offline" +#~ msgstr "L'estatut es fòra linha" + +#~ msgid "Certificate is invalid" +#~ msgstr "Certificat invalid" + +#~ msgid "Connection has been refused" +#~ msgstr "La connexion es estada refusada" + +#~ msgid "Connection can't be established" +#~ msgstr "La connexion pòt pas èsser establida" + +#~ msgid "Connection has been lost" +#~ msgstr "La connexion es estada perduda" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Aqueste compte es ja connectat al servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "La connexion es estada remplaçada per una novèla connexion qu'utiliza la " +#~ "meteissa ressorsa" + +#~ msgid "The account already exists on the server" +#~ msgstr "Aqueste compte existís ja sul servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Lo servidor es actualament tròp cargat per tractar la connexion" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Lo certificat es estat revocat" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Lo certificat utiliza un algoritme de chiframent dobtós, o es feble " +#~ "criptograficament" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "La longor del certificat del servidor, o la talha de sa cadena de " +#~ "certificacion, depassa los limits de la bibliotèca de criptografia" + +#~ msgid "Internal error" +#~ msgstr "Error intèrna" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Impossible de se connectar a %s" + +#~ msgid "View account" +#~ msgstr "Afichar lo compte" + +#~ msgid "Open Calendar" +#~ msgstr "Dobrir l'agenda" + +#~ msgid "Open Clocks" +#~ msgstr "Dobrir Relòtges" + +#~ msgid "Date & Time Settings" +#~ msgstr "Paramètres de data e ora" + +# luc: FIXME: how to have a capitalized weekday (start of sentence)? +# %a (abbreviated) %A (full weekday) %^A (full weekday all uppercase) +# https://bugzilla.gnome.org/show_bug.cgi?id=658686 +# +# luc: TODO: to test, this possibly explodes on dimanche 25 septembre 2011 +# L M M J V S D +#~ msgid "%A %B %e, %Y" +#~ msgstr "%A %e %B %Y" + +#~ msgctxt "button" +#~ msgid "Restart & Install" +#~ msgstr "Reamodar e installar" + +#~ msgid "Download and install '%s' from extensions.gnome.org?" +#~ msgstr "Telecargar e installar « %s » a partir de extensions.gnome.org ?" + +#~ msgid "Open" +#~ msgstr "Dobrir" + +#~ msgid "Remove" +#~ msgstr "Levar" + +#~ msgid "Clear Messages" +#~ msgstr "Escafar los messatges" + +#~ msgid "Notification Settings" +#~ msgstr "Paramètres de notificacions" + +#~ msgid "Tray Menu" +#~ msgstr "Menú del tirador de messatjariá" + +#~ msgid "No Messages" +#~ msgstr "Pas cap de messatge" + +#~ msgid "Message Tray" +#~ msgstr "Tirador de messatjariá" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d periferic connectat" +#~ msgstr[1] "%d periferics connectats" + +#~ msgid "Authorization request from %s" +#~ msgstr "Demanda d'autorizacion de « %s »" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Lo periferic « %s » se vòl connectar a aqueste ordenador" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Lo periferic %s vòl accedir al servici « %s »" + +#~ msgid "Grant this time only" +#~ msgstr "Acordar l'accès aqueste còp unicament" + +#~ msgid "Reject" +#~ msgstr "Refusar" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Confirmacion de la demanda de ligason per « %s »" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Confirmatz que la clau secreta (Passkey) « %06d » correspond a la del " +#~ "periferic." + +#~ msgid "Matches" +#~ msgstr "Correspond" + +#~ msgid "Does not match" +#~ msgstr "Correspond pas" + +#~ msgid "Pairing request for %s" +#~ msgstr "Demanda de ligason per « %s »" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "" +#~ "Picatz lo numèro d'identificacion personala (PIN) mencionat sul periferic." + +#~ msgid "OK" +#~ msgstr "Validar" + +#~ msgid "unmanaged" +#~ msgstr "pas gerit" + +#~ msgid "disconnecting..." +#~ msgstr "desconnexion..." + +#~ msgid "firmware missing" +#~ msgstr "micrologicial absent" + +#~ msgid "unavailable" +#~ msgstr "pas disponible" + +#~ msgid "Battery" +#~ msgstr "Batariá" + +#~ msgid "Airplane Mode" +#~ msgstr "Mòde avion" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "O planhèm, pas cap de saviesa per vos uèi :\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "L'Oracle %s declara" + +#~ msgid "'%s' is ready" +#~ msgstr "« %s » es prèst" + +#~ msgid "Failed to launch '%s'" +#~ msgstr "Impossible d'aviar « %s »" + +#~ msgid "Extension" +#~ msgstr "Extension" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Settings Menu" +#~ msgstr "Menú dels paramètres" + +#~ msgid "Screenshots" +#~ msgstr "Capturas d'ecran" + +#~ msgid "Record a screencast" +#~ msgstr "Enregistrar una vidèo d'ecran" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Collecter des statistiques sus l'utilizacion des applications" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "Normalament GNOME Shell survelha las aplicacions activas per fin de " +#~ "determinar las mai utilizadas (per ex. pels aviadors). Quitament se " +#~ "aquestas donadas son gardadas secretas, de motius de confidencialitat vos " +#~ "pòdon butar a desactivar aquesta foncionalitat. Remarcatz qu'aquesta " +#~ "desactivacion suprimís pas d'eventualas donadas ja enregistradas." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Utilizat en intèrne per enregistrar la darrièra preséncia de messatjariá " +#~ "instantanèa IM explicitament definida per l'utilizaire. Aicí la valor es " +#~ "tirada de l'enumeracion TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Utilizat en interne per enregistrar lo darrièr estatut de preséncia de la " +#~ "session per l'utilizaire. Aici la valor es tirada de l'enumeracion " +#~ "GsmPresenceStatus." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Combinason de tòcas per bascular l'enregistrador d'ecran" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "" +#~ "Combinason de tòcas per aviar/arrestar l'enregistrador d'ecran integrat." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "" +#~ "Nombre d'imatges per segonda per l'enregistrament de las animacions " +#~ "d'ecran." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Lo nombre d'imatges per segonda de las animacions d'ecran enregistradas " +#~ "per l'aisina idònia de GNOME Shell." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "Lo pipeline GStreamer utilizat per encodar l'animacion d'ecran" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Definicion del pipeline GStreamer utilizat per encodar los " +#~ "enregistraments vidèo. La sintaxi es identica a la de gst-launch. Lo " +#~ "connectador d'entrada (sink pad) del pipeline deuriá èsser non connectat " +#~ "là où la vidèo es enregistrada. Lo connectador font deuriá normalement " +#~ "èsser non connectat ; la sortida de ce connectador es escrita dins lo " +#~ "fichièr de sortida. Pasmens, lo pipeline pòt tanben se cargar de sa " +#~ "pròpria sortida, per exemple per diriger la sortida cap a un servidor " +#~ "icecast via shout2send o autre. Se aquesta clau es pas definida o se es " +#~ "voida, es lo pipeline per defaut qu'es utilizat. Aqueste es actualament « " +#~ "vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +#~ "threads=%T ! queue ! webmmux' » e l'enregistrament utiliza lo format WEBM " +#~ "e lo codec VP8. %T es utilizat coma paramètre per una suposicion quant al " +#~ "nombre optimal de threads d'utilizar sul sistèma." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Extension de fichièr d'utilizar per enregistrar l'animacion d'ecran" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Lo nom de fichièr de las animacions d'ecran es unic, se basa sus la data, " +#~ "e utiliza aquesta extension. Deuriá èsser modificada se lo format del " +#~ "contenidor utilizat per l'enregistrament es diferent." + +#~ msgid "Session…" +#~ msgstr "Session…" + +#~ msgid "Power" +#~ msgstr "Energia" + +#~ msgid "Restart" +#~ msgstr "Reaviar" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Vidèo d'ecran %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Clicatz sus « Tampar la session » per quitar aquestas aplicacions e " +#~ "tampar la session." + +#~ msgid "Logging out of the system." +#~ msgstr "Desconnexion del sistèma." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Clicatz sus « Atudar » per quitar aquestas aplicacions e atudar " +#~ "l'ordenador." + +#~ msgid "Powering off the system." +#~ msgstr "Extinction del sistèma." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Clicatz sus « Reaviar » per quitar aquestas aplicacions e reaviar " +#~ "l'ordenador." + +#~ msgid "Restarting the system." +#~ msgstr "Reaviada del sistèma." + +#~ msgid "Universal Access Settings" +#~ msgstr "Paramètres de l'accès universel" + +#~ msgid "Visibility" +#~ msgstr "Visibilitat" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Configurar un novèl periferic…" + +#~ msgid "Connection" +#~ msgstr "Connexion" + +#~ msgid "Send Files…" +#~ msgstr "Mandar de fichièrs…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Paramètres del clavièr" + +#~ msgid "Mouse Settings" +#~ msgstr "Paramètres de la mirga" + +#~ msgid "Volume, network, battery" +#~ msgstr "Volum, ret, batariá" + +#~ msgid "disabled" +#~ msgstr "desactivat" + +#~ msgid "cable unplugged" +#~ msgstr "cable desbrancat" + +#~ msgid "More…" +#~ msgstr "Mai…" + +#~ msgid "Wired" +#~ msgstr "Filara" + +#~ msgid "Auto Ethernet" +#~ msgstr "Ethernet automatic" + +#~ msgid "Auto broadband" +#~ msgstr "Connexion benda larga automatica" + +#~ msgid "Auto dial-up" +#~ msgstr "Connexion per telefòn automatica" + +#~ msgid "Auto %s" +#~ msgstr "Auto %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth automatique" + +#~ msgid "Auto wireless" +#~ msgstr "Sens fial automatic" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s restantas" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ora" +#~ msgstr[1] "oras" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minuta" +#~ msgstr[1] "minutas" + +#~ msgid "AC Adapter" +#~ msgstr "Adaptador secteur" + +#~ msgid "Laptop Battery" +#~ msgstr "Batariá de l'ordenador" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Monitor" +#~ msgstr "Ecran" + +#~ msgid "Mouse" +#~ msgstr "Mirga" + +#~ msgid "PDA" +#~ msgstr "Assistent personal" + +#~ msgid "Cell Phone" +#~ msgstr "Telefòn portable" + +#~ msgid "Media Player" +#~ msgstr "Lector multimèdia" + +#~ msgid "Tablet" +#~ msgstr "Tauleta" + +#~ msgid "Computer" +#~ msgstr "Ordenador" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Desconegut" + +#~ msgid "Available" +#~ msgstr "Disponible" + +#~ msgid "Busy" +#~ msgstr "Ocupat" + +#~ msgid "Invisible" +#~ msgstr "Invisible" + +#~ msgid "Away" +#~ msgstr "Absent" + +#~ msgid "Idle" +#~ msgstr "Inactiu" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Vòstre estatut per las discussions serà definit a ocupat" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Les notifications son maintenant desactivadas, y compris les messages de " +#~ "discussion. Votre statut en linha a été modificat per fin que les autres " +#~ "sachent qu'il se pòt que vous ne voyez pas leurs messages." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "L'extinction pourrait lor far pèrdre lor travaux non enregistrats." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Connexion" + +#~ msgid "APPLICATIONS" +#~ msgstr "APLICACIONS" + +#~ msgid "SETTINGS" +#~ msgstr "PARAMÈTRES" + +# +# luc: https://bugzilla.gnome.org/show_bug.cgi?id=658675 +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Subscription request" +#~ msgstr "Demanda d'abonnement" + +# +# luc: TODO: double check with source code. %A is weekday « Mandat lundi a 8:23» +#~ msgid "Sent at %X on %A" +#~ msgstr "Mandat %A a %X" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Mandat lo %A %-d %B %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "La connexion a %s a fracassat" + +#~ msgid "Reconnect" +#~ msgstr "Se reconnectar" + +#~ msgid "tray" +#~ msgstr "tirador de messatjariá" + +#~ msgid "Browse Files..." +#~ msgstr "Percórrer los fichièrs..." + +#~ msgid "Error browsing device" +#~ msgstr "Error en percorrent lo periferic" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Lo periferic demandat pòt pas èsser percorrut, l'error es « %s »" + +#~ msgid "More..." +#~ msgstr "Mai..." + +#~ msgid "Wireless" +#~ msgstr "Sens fial" + +#~ msgid "VPN Connections" +#~ msgstr "Connexions per VPN" + +#~ msgid "System Settings" +#~ msgstr "Paramètres sistèma" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Vòstre uòu de Pascas favorit" + +#~ msgid "United Kingdom" +#~ msgstr "Reialme Unit" + +#~ msgid "Default" +#~ msgstr "Defaut" + +#~ msgid "Authentication required" +#~ msgstr "Autentificacion necessària" + +#~ msgid "Show the message list" +#~ msgstr "Afichar la lista de messatges" + +#~ msgid "Captive Portal" +#~ msgstr "Portal captiu" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Lo nivèl de precision de localizacion maximal" + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Configure lo nivèl maximal de precision de localizacion que las " +#~ "aplicacions son autorizadas a veire. Las opcions validas son « off " +#~ "» (desactivar lo seguiment de l'emplaçament), « country » (país), « city " +#~ "» (vila), « neighborhood » (quartièr), « street » (carrièra) e « exact " +#~ "» (emplaçament exacte, necessita generalament un receptor GPS). Gardatz " +#~ "en cap qu'aqueste paramètre contraròtla unicament çò que GeoClue " +#~ "autorizarà las aplicacions a veire mas que demòran pr'aquò capablas de " +#~ "determinar l'emplaçament de l'utilizaire d'ela-meteissa en utilizant las " +#~ "ressorsas ret (amb al pus melhor un nivèl de precision limitat a la " +#~ "carrièra)." + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Atudar" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Tampar la session" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Cambiar d’utilizaire" diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000..e3e4e08 --- /dev/null +++ b/po/or.po @@ -0,0 +1,2368 @@ +# Oriya translation for gnome-shell. +# Copyright (C) 2011 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Manoj Kumar Giri , 2011, 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-18 07:41+0000\n" +"PO-Revision-Date: 2014-09-18 17:43+0530\n" +"Last-Translator: Manoj Kumar Giri \n" +"Language-Team: Oriya \n" +"Language: or\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: Lokalize 1.5\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "ତନ୍ତ୍ର" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "ସନ୍ଦେଶ ପାତ୍ରକୁ ଦର୍ଶାନ୍ତୁ" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "ସକ୍ରିୟ ବିଜ୍ଞପ୍ତିକୁ ଲକ୍ଷ୍ୟ କରନ୍ତୁ" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "ସମୀକ୍ଷାକୁ ଦର୍ଶାନ୍ତୁ" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "ସମସ୍ତ ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "ପ୍ରୟୋଗ ତାଲିକାକୁ ଖୋଲନ୍ତୁ" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME ସେଲ" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "ୱିଣ୍ଡୋ ପରିଚାଳନା ଏବଂ ପ୍ରୟୋଗ ପ୍ରାରମ୍ଭ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME ସେଲ ଅନୁଲଗ୍ନ ପସନ୍ଦଗୁଡ଼ିକ" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME ସେଲ ଅନୁଲଗ୍ନଗୁଡ଼ିକ" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME ସେଲ (ୱେଲ୍ୟାଣ୍ଡ ଯୋଜନାକାରୀ)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"ଆଭ୍ୟନ୍ତରୀଣ ସାଧନଗୁଡ଼ିକୁ Alt-F2 ରୁ ବିକାଶକାରୀ ଏବଂ ପରୀକ୍ଷକମାନଙ୍କ ପାଇଁ ସକ୍ରିୟ " +"କରନ୍ତୁ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"ଆଭ୍ୟନ୍ତରୀଣ ତ୍ରୁଟିନିବାରଣ ଏବଂ ନିରୀକ୍ଷଣ ସାଧନଗୁଡ଼ିକୁ Alt-F2 ସଂଳାପ ବ୍ୟବହାର କରି " +"ଅନୁମତି ପ୍ରଦାନ କରନ୍ତୁ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "ସକ୍ରିୟ କରିବା ପାଇଁ ଥିବା ଅନୁଲଗ୍ନଗୁଡ଼ିକର UUID ଗୁଡ଼ିକ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME ସେଲ ଅନୁଲଗ୍ନଗୁଡ଼ିକରେ ଗୋଟିଏ UUID ଗୁଣଧର୍ମ ଅଛି; ଏହି କି ଅନୁଲଗ୍ନଗୁଡ଼ିକୁ " +"ତାଲିକାଭୁକ୍ତ କରିଥାଏ ଯାହାକୁ " +"ଧାରଣ କରିବା ଉଚିତ। ସକ୍ରିୟ ଅନୁଲଗ୍ନ ଏବଂ ନିଷ୍କ୍ରିୟ-ଅନୁଲଗ୍ନଗୁଡ଼ିକ ସହିତ D-Bus " +"ପଦ୍ଧତିରେ ଆପଣ ତାଲିକାକୁ " +"ସଙ୍କଳନ କରିପାରିବେ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "ଅନୁଲଗ୍ନ ସଂସ୍କରଣ ସୁସଙ୍ଗତତାର ବୈଧତାକୁ ନିଷ୍କ୍ରିୟ କରିଥାଏ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME ସେଲ କେବଳ ଅନୁଲଗ୍ନଗୁଡ଼ିକୁ ଧାରଣ କରିବ ଯାହାକି ପ୍ରଚଳିତ ସଂସ୍କରଣକୁ ସହାୟତା ଦେବା " +"ପାଇଁ ଉଦ୍ଦିଷ୍ଟ।" +"ଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରିବା ଫଳରେ ତାହା ଏହି ଯାଞ୍ଚକୁ ନିଷ୍କ୍ରିୟ କରିବ ଏବଂ ସହାୟତା " +"ପାଇଁ ଉଦ୍ଦିଷ୍ଟ " +"ସଂସ୍କରଣଗୁଡ଼ିକୁ ଅଦେଖା କରି ସମସ୍ତ ଅନୁଲଗ୍ନଗୁଡ଼ିକୁ ଧାରଣ କରିବା ପାଇଁ ଚେଷ୍ଟା କରିବ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "ମନପସନ୍ଦ ପ୍ରୟୋଗଗୁଡ଼ିକ ପାଇଁ ଡେସ୍କଟପ ଫାଇଲ ID ଗୁଡ଼ିକର ତାଲିକା" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"ଏହି ପରିଚାୟକମାନଙ୍କ ସହିତ ସମ୍ପୃକ୍ତ ପ୍ରୟୋଗଗୁଡ଼ିକୁ ମନପସନ୍ଦ ସ୍ଥାନରେ ଦର୍ଶାଯିବ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "ଆପ ଗୋଟାଳୀ ଦୃଶ୍ୟ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "ପ୍ରୟୋଗ ଗୋଟାଳୀରେ ବର୍ତ୍ତମାନ ବଚ୍ଛିତ ଦୃଶ୍ୟର ଅନୁକ୍ରମ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "ନିର୍ଦ୍ଦେଶ (Alt-F2) ସଂଳାପ ପାଇଁ ପୁରୁଣା ତଥ୍ୟ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "କାଚ ସଂଳାପ ଦେଖିବା ପାଇଁ ପୁରୁଣା ତଥ୍ୟ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "ସର୍ବଦା 'ଲଗଆଉଟ' ତାଲିକା ବସ୍ତୁକୁ ବ୍ୟବହାରକାରୀ ତାଲିକାରେ ଦର୍ଶାନ୍ତୁ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"ଏହି ଚାବିଟି ସ୍ୱୟଂଚାଳିତ ଭାବରେ 'ଲଗଆଉଟ' ତାଲିକା ବସ୍ତୁକୁ ଲୁଚାଇବାକୁ ଏକକ-ବ୍ୟବହାରକାରୀ, " +"ଏକକ-ଅଧିବେଶନ " +"ପରିସ୍ଥିତିରେ ନବଲିଖନ କରିଥାଏ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"ସଂଗୁପ୍ତ ଅଥବା ସୁଦୂର ଫାଇଲତନ୍ତ୍ରଗୁଡ଼ିକୁ ସ୍ଥାପନ କରିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତକୁ " +"ମନେରଖିବା ଉଚିତ କି" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"ସେଲ ଏକ ପ୍ରବେଶ ସଂକେତ ମାଗିବ ଯେତେବେଳେ ଏକ ସଂଗୁପ୍ତ ଉପକରଣ ଅଥବା ସୁଦୂର ଫାଇଲତନ୍ତ୍ରକୁ " +"ସ୍ଥାପନ " +"କରାଯିବ। ଯଦି ପ୍ରବେଶ ସଂକେତକୁ ଭବିଷ୍ୟତ ପାଇଁ ସଂରକ୍ଷଣ କରାଯାଇପାରିବ ତେବେ'ପ୍ରବେଶ ସଂକେତ " +"ମନେରଖନ୍ତୁ' " +"ଯାଞ୍ଚବାକ୍ସ ଥିବା ଉଚିତ। ଏହି ଚାବି ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସ୍ଥିତିକୁ ସେଟ କରିଥାଏ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "କ୍ୟାଲେଣ୍ଡରରେ ସାପ୍ତାହିକ ତାରିଖ ଦର୍ଶାନ୍ତୁ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "ସତ ହେଲେ, କାଲେଣ୍ଡରରେ ISO ସପ୍ତାହ ତାରିଖ ଦେଖାନ୍ତୁ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "ପ୍ରୟୋଗ ମେନୁକୁ ସକ୍ରିୟ କରିବା ପାଇଁ କି ବନ୍ଧନ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "ପ୍ରୟୋଗ ମେନୁକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ\" ଦୃଶ୍ୟକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"କାର୍ଯ୍ୟକଳାପ ସମୀକ୍ଷାର \"ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ\" ଦୃଶ୍ୟକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "ସମୀକ୍ଷାକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "କାର୍ଯ୍ୟକଳାପ ସମୀକ୍ଷାକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "ସନ୍ଦେଶ ଟ୍ରେର ଦୃଶ୍ୟମାନ୍ୟତାକୁ ଆଗପଛ କରିବା ପାଇଁ କି ବନ୍ଧନ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "ସନ୍ଦେଶ ଟ୍ରେର ଦୃଶ୍ୟମାନ୍ୟତାକୁ ଆରମ୍ଭ/ବନ୍ଦ କରିବା ପାଇଁ କି ବନ୍ଧନ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "ସକ୍ରିୟ ବିଜ୍ଞପ୍ତିକୁ ଲକ୍ଷ୍ଯ କରିବା ପାଇଁ କି ବନ୍ଧନ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "ସକ୍ରିୟ ବିଜ୍ଞପ୍ତିକୁ ଲକ୍ଷ୍ଯ କରିବା ପାଇଁ କି ବନ୍ଧନ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"ଚାଲୁଥିବା ସମସ୍ତ ଟ୍ୱୀନଗୁଡ଼ିକୁ ସ୍ଥିର ରଖିବା ଏବଂ ପୁନଃଚାଳନ କରିବା ପାଇଁ ଥିବା କି " +"ବନ୍ଧନ, ତୃଟି ନିବାରଣ " +"ଉଦ୍ଦେଶ୍ୟରେ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "କେଉଁ କିବୋର୍ଡକୁ ବ୍ୟବହାର କରିବା ଉଚିତ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "ବ୍ୟବହାର କରିବାକୁ ଥିବା କିବୋର୍ଡ ପ୍ରକାର" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "ପରିବର୍ତ୍ତକକୁ ପ୍ରଚଳିତ କାର୍ଯ୍ୟକ୍ଷେତ୍ର ପାଇଁ ସିମୀତ ରଖନ୍ତୁ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"ଯଦି true, ତେବେ କେବଳ ପ୍ରଚଳିତ କାର୍ଯ୍ୟକ୍ଷେତ୍ରରେ ଥିବା ପ୍ରୟୋଗଗୁଡ଼ିକ ପରିବର୍ତ୍ତକରେ " +"ଦର୍ଶାଯାଇଥାଏ।" +"ଅନ୍ୟଥା, ସମସ୍ତ ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଥାଏ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "ପ୍ରୟୋଗ ଚିତ୍ରସଂକେତ ଧାରା।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"ସ୍ୱୀଚରରେ ୱିଣ୍ଡୋଗୁଡ଼ିକ କିପରି ଦର୍ଶାଯିବ ତାହା ପାଇଁ ବିନ୍ୟାସ କରନ୍ତୁ। ବୈଧ " +"ସମ୍ଭାବ୍ୟଗୁଡ଼ିକ ହେଉଛି 'କେବଳ-" +"ଅଙ୍ଗିଳିଚିହ୍ନ' (ୱିଣ୍ଡୋର ଏକ ଅଙ୍ଗୁଳି ଚିହ୍ନକୁ ଦର୍ଶାନ୍ତୁ), 'app-icon-only' (କେବଳ " +"ପ୍ରୟୋଗ ଚିତ୍ର ସଂକେତ " +"ଦର୍ଶାଇଥାଏ) ଅଥବା 'ଉଭୟ'।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"ଯଦି true, ତେବେ କେବଳ ପ୍ରଚଳିତ କାର୍ଯ୍ୟକ୍ଷେତ୍ରରୁ ୱିଣ୍ଡୋଗୁଡ଼ିକ ପରିବର୍ତ୍ତକରେ " +"ଦର୍ଶାଯାଇଥାଏ।ଅନ୍ୟଥା, " +"ସମସ୍ତ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଥାଏ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "ମୂଖ୍ୟ ୱିଣ୍ଡୋରେ ମଡେଲ ସଂଳାପ ସଂଲଗ୍ନ କରନ୍ତୁ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"GNOME ସେଲ ଚାଲିଥିବା ସମୟରେ ଏହି ଚାବିଟି org.gnome.mutter ରେ ଥିବା ଚାବିକୁ ନବଲିଖନ " +"କରିଥାଏ।" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରଦା ଧାରରେ ରଖିବା ସମୟରେ ଧାର ଟାଇଲକୁ ସକ୍ରିୟ କରନ୍ତୁ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "କାର୍ଯ୍ୟକ୍ଷେତ୍ରଗୁଡ଼ିକ ଅସ୍ଥାୟୀ ଭାବରେ ପରିଚାଳିତ ହୋଇଥାଏ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "କାର୍ଯ୍ୟକ୍ଷେତ୍ର କେବଳ ପ୍ରାଥମିକ ମନିଟରରେ ଥାଏ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"ସୂଚକ ଗତି କରିବା ବନ୍ଦ ନହେଲା ପର୍ଯ୍ୟନ୍ତ ମାଉସ ଧାରାରେ ଲକ୍ଷ୍ଯସ୍ଥଳ ପରିବର୍ତ୍ତନକୁ " +"ବିଳମ୍ବ କରନ୍ତୁ" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "କେପଟିଭ୍‌ ପୋର୍ଟାଲ" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s ପାଇଁ ପସନ୍ଦ ସଂଳାପ ଧାରଣ କରିବା ସମୟରେ ତ୍ରୁଟି:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "GNOME ସେଲ ଅନୁଲଗ୍ନଗୁଡ଼ିକ" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "ବାତିଲ କରନ୍ତୁ" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "ପରବର୍ତ୍ତୀ" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "ଖୋଲନ୍ତୁ" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "ସାଇନ ଇନ" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "ଅଧିବେଶନ ବାଛନ୍ତୁ" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "ତାଲିକାଭୁକ୍ତ ନୁହଁ କି?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ଯେପରିକି, %s ପାଇଁ ଚାଳକ)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "ଚାଳକ ନାମ: " + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "ଲଗଇନ ୱିଣ୍ଡୋ" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "ବୈଧିକରଣ ତ୍ରୁଟି" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(ଅଥବା ଅଙ୍ଗୁଳି ବୁଲାନ୍ତୁ)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "ନିର୍ଦ୍ଦେଶ ମିଳିଲା ନାହିଁ" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "ନିର୍ଦ୍ଦେଶ ବିଶ୍ଲେଷିତ କରିହେଲା ନାହିଁ:" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” ର ନିଷ୍ପାଦନ ବିଫଳ ହୋଇଛି:" + +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "ୱେବ ବୈଧିକରଣ ଦିଗ ପରିବର୍ତ୍ତନ" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "ବାରମ୍ବାର ବ୍ୟବହୃତ ପ୍ରୟୋଗଗୁଡ଼ିକ ଏଠାରେ ଦୃଶ୍ୟମାନ ହେବ" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "ବାରମ୍ବାର" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "ସମସ୍ତ" + +#: ../js/ui/appDisplay.js:1789 +msgid "New Window" +msgstr "ନୂତନ ୱିଣ୍ଡୋ" + +#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "ମନପସନ୍ଦଗୁଡ଼ିକ ମଧ୍ଯରୁ କାଢ଼ନ୍ତୁ" + +#: ../js/ui/appDisplay.js:1821 +msgid "Add to Favorites" +msgstr "ମନପସନ୍ଦ ମଧ୍ଯରେ ଯୋଗକରନ୍ତୁ" + +#: ../js/ui/appDisplay.js:1830 +msgid "Show Details" +msgstr "ବିସ୍ତୃତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s କୁ ଆପଣଙ୍କର ମନପସନ୍ଦରେ ଯୋଗ କରାଯାଇଛି।" + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s କୁ ମନପସନ୍ଦରୁ ବାହାର କରିଦିଆଯାଇଛି।" + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "ବିନ୍ଯାସ" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "ପୃଷ୍ଠଭୂମିକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ…" + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "ସାରା ଦିନ" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "Su" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "M" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "T" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "W" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "Th" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "F" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "S" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "ପୂର୍ବ ମାସ" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "ପର ମାସ" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "କିଛି ଯୋଜନା କରାହୋଇନାହିଁ" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "ଆଜି" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "ଆସନ୍ତାକାଲି" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "ଏହି ସପ୍ତାହ" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "ପରବର୍ତ୍ତୀ ସପ୍ତାହ" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "ବାହ୍ୟ ଡ୍ରାଇଭ ସଂଯକ୍ତ ଅଛି" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "ବାହ୍ୟ ଡ୍ରାଇଭ ସଂଯକ୍ତ ଅଛି" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "କଢ଼ାଯୋଗ୍ୟ ଉପକରଣଗୁଡ଼ିକ" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s ସହିତ ଖୋଲନ୍ତୁ" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "ବାହାର କରନ୍ତୁ" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "ପ୍ରବେଶ ସଙ୍କେତ:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "ପୁଣିଥରେ ଲେଖନ୍ତୁ:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "ସଂଯୋଗ କରନ୍ତୁ" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "ପ୍ରବେଶ ସଙ୍କେତ: " + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "କି: " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "ପରିଚୟ: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "ବ୍ୟକ୍ତିଗତ କି ପ୍ରବେଶ ସଂକେତ: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "ସର୍ଭିସ: " + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "ବେତାର ନେଟୱର୍କ ପାଇଁ ପ୍ରାଧିକରଣ ଆବଶ୍ୟକ" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"ବେତାର ନେଟୱର୍କ “%s” କୁ ଅଭିଗମ୍ୟ କରିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ କିମ୍ବା ସଂଗୁପ୍ତ କିଗୁଡ଼ିକ " +"ଆବଶ୍ୟକ।" + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "ତାରଯୁକ୍ତ 802.1X ବୈଧିକରଣ" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "ନେଟୱାର୍କ ନାମ: " + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL ବୈଧିକରଣ" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "PIN ସଂକେତ ଆବଶ୍ୟକ" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "ମୋବାଇଲ ବ୍ରୋଡବ୍ୟାଣ୍ଡ ଉପକରଣ ପାଇଁ PIN ସଂକେତ ଆବଶ୍ୟକ" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "ମୋବାଇଲ ବ୍ରୋଡ଼ବ୍ୟାଣ୍ଡ ନେଟୱର୍କ ପ୍ରବେଶ ସଂକେତ" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s” ସହିତ ସଂଯୁକ୍ତ ହେବା ପାଇଁ ଗୋଟିଏ ପ୍ରବେଶ ସଂକେତ ଆବଶ୍ୟକ।" + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "ବୈଧିକରଣ ଆବଶ୍ୟକ" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "ପ୍ରଶାସକ" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "ବୈଧିକୃତ" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "ଦୁଖିତଃ, ତାହା କାର୍ଯ୍ୟକାରୀ ହେଲା ନହିଁ। ଦୟାକରି ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।" + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "ଆମନ୍ତ୍ରଣ" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "ଡାକରା" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "ଫାଇଲ ସ୍ଥାନାନ୍ତରଣ" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "ଆଳାପ" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "ଧ୍ୱନି ଚାଲୁ କରନ୍ତୁ" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "ଧ୍ୱନିକୁ ମୁକ କରନ୍ତୁ" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "ଗତକାଲି,%H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "ଗତକାଲି, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s ବର୍ତ୍ତମାନ %s ଭାବରେ ପରିଚିତ" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s କୁ ଆମନ୍ତ୍ରଣ" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s ଆପଣଙ୍କୁ %s ରେ ଯୋଗଦାନ କରିବା ପାଇଁ ଆମନ୍ତ୍ରଣ କରୁଛନ୍ତି" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "ମନା କରନ୍ତୁ" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "ଗ୍ରହଣ କରନ୍ତୁ" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s ଠାରୁ ଭିଡିଓ ଡାକରା" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s ଠାରୁ ଡାକରା" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "ଉତ୍ତର" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s ଆପଣଙ୍କୁ %s ପଠାଉଅଛି" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "ଆପଣ କେତେ ବେଳେ ଅନଲାଇନ ଆସୁଛନ୍ତି ଦେଖିବା ପାଇଁ %s କୁ ଅନୁମତି ଆବଶ୍ୟକ କରୁଛି" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "ନେଟୱର୍କ ତ୍ରୁଟି" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "ବୈଧିକରଣ ବିଫଳ ହେଲା" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "ସଂଗୁପ୍ତ ତ୍ରୁଟି" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "ପ୍ରମାଣପତ୍ର ଦିଆଯାଇନାହିଁ" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "ପ୍ରମାଣପତ୍ର ବିଶ୍ୱସ୍ଥ ନୁହଁ" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "ପ୍ରମାଣପତ୍ରର ସମୟ ସମାପ୍ତ" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "ପ୍ରମାଣପତ୍ର ସକ୍ରିୟ କରାଯାଇନାହିଁ" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "ପ୍ରମାଣପତ୍ର ହୋଷ୍ଟ ନାମ ମେଳଖାଉ ନାହିଁ" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "ପ୍ରମାଣପତ୍ର ଅଙ୍ଗୁଳିଚିହ୍ନ ମେଳଖାଉନାହିଁ" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "ପ୍ରମାଣପତ୍ର ନିଜ ଦ୍ୱାରା ହସ୍ତାକ୍ଷର ହୋଇଛି" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "ସ୍ଥିତିକୁ ଅଫଲାଇନ ସେଟ କରାଯାଇଛି" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "ସଂଗୁପ୍ତ ଉପଲବ୍ଧ ନାହିଁ" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "ପ୍ରମାଣପତ୍ରଟି ଅବୈଧ ଅଟେ" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "ସଂଯୋଗକୁ ବାରଣ ହୋଇଛି" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "ସଂଯୋଗ ସ୍ଥାପନ କରିପାରିବେ ନାହିଁ" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ ହୋଇଛି" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "ଏହି ଖାତାଟି ସର୍ଭର ସହିତ ପୂର୍ବରୁ ସଂଯୁକ୍ତ ଅଛି" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" +"ସମାନ ଉତ୍ସ ବ୍ୟବହାର କରି ଏହି ସଂଯୋଗଟି ଏକ ନୂତନ ସଂଯୋଗ ଦ୍ୱାରା ପରିବର୍ତ୍ତିତ ହୋଇଛି" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "ସର୍ଭରରେ ଏହି ଖାତାଟି ପୂର୍ବରୁ ଅବସ୍ଥିତ ଅଛି" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "ଏହି ସଂଯୋଗକୁ କାର୍ଯ୍ୟକାରୀ କରିବା ପାଇଁ ସର୍ଭର ବର୍ତ୍ତମାନ ବ୍ୟସ୍ତ ଅଛି" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "ପ୍ରମାଣପତ୍ରଟିର ସମୟ ସମାପ୍ତ ହୋଇଛି" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"ପ୍ରମାଣପତ୍ରଟି ଗୋଟିଏ ଅସୁରକ୍ଷିତ ଆଲଗୋରିଦମ ବ୍ୟବହାର କରିଥାଏ କିମ୍ବା ତାହା " +"କ୍ରିପ୍ଟୋଗ୍ରାଫି ଅନୁଯାୟୀ ଦୁର୍ବଳ " +"ଅଟେ" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"ସର୍ଭର ପ୍ରମାଣପତ୍ରର ଲମ୍ବ, ଅଥବା ସର୍ଭର ପ୍ରମାଣପତ୍ର ସୃଙ୍ଖଳର ଗଭୀରତା, କ୍ରିପ୍ଟୋଗ୍ରାଫି " +"ଲାଇବ୍ରେରୀ " +"ଦ୍ୱାରା ନିୟୋଜିତ ସୀମାକୁ ଅତିକ୍ରମ କରିଥାଏ" + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "ଆଭ୍ଯନ୍ତରୀଣ ତ୍ରୁଟି" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s ସହିତ ସଂଯୋଗ ହେବାରେ ଅସମର୍ଥ" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "ଖାତା ଦେଖନ୍ତୁ" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "ଅଜ୍ଞାତ କାରଣ" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "Windows" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "ଡ୍ୟାସ" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "କ୍ୟାଲେଣ୍ଡର ଖୋଲନ୍ତୁ" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "ଘଡ଼ିଗୁଡ଼ିକୁ ଖୋଲନ୍ତୁ" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "ତାରିଖ ଏବଂ ସମୟ ସେଟିଙ୍ଗ" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "ଲଗଆଉଟ %s" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "ଲଗ ଆଉଟ" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।" +msgstr[1] "%s ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।" + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "ଆପଣ ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।" +msgstr[1] "ଆପଣ ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।" + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "ଲଗଆଉଟ" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରନ୍ତୁ ଏବଂ ଅଫ୍‌ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "ତନ୍ତ୍ରଟି ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ ହେବ।" +msgstr[1] "ତନ୍ତ୍ରଟି ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ ହେବ।" + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "ବଳକା ସଫ୍ଟୱେର ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "ପୂନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "ପୂନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "ତନ୍ତ୍ର ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ପୁନଃପ୍ରାରମ୍ଭ ହେବ।" +msgstr[1] "ତନ୍ତ୍ର ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ପୁନଃପ୍ରାରମ୍ଭ ହେବ।" + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "ପୁନଃଚାଳନ କରନ୍ତୁ ଏବଂ ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"ତନ୍ତ୍ର ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ପୁନଃପ୍ରାରମ୍ଭ ହେବ ଏବଂ ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ " +"କରିବ।" +msgstr[1] "" +"ତନ୍ତ୍ର ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ପୁନଃପ୍ରାରମ୍ଭ ହେବ ଏବଂ ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ " +"କରିବ।" + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "ପୁନଃଚାଳନ କରନ୍ତୁ ଏବଂ ସ୍ଥାପନ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ସ୍ଥାପନ କରନ୍ତୁ ଏବଂ ଅଫ୍‌ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "ଅଦ୍ୟତନଗୁଡ଼ିକ ସ୍ଥାପିତ ହୋଇସାରିବା ପରେ ଅଫ୍‌ କରନ୍ତୁ" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"ବ୍ୟାଟେରୀରେ ଚାଲୁଅଛି: ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରିବା ପୂର୍ବରୁ ପ୍ଲଗଇନ୍‌ କରନ୍ତୁ।" + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "କିଛି ପ୍ରୟୋଗଗୁଡ଼ିକ ବ୍ୟସ୍ତ ଅଛି କିମ୍ବା ସେଥିରେ କିଛି କାମ ଅସଂରକ୍ଷିତ ଅଛି।" + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "ଅନ୍ୟ ବ୍ୟବହାରକାରୀମାନେ ଲଗଇନ ହୋଇଛନ୍ତି।" + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (ଦୂରବର୍ତ୍ତୀ)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (କୋନସୋଲ)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "ସ୍ଥାପନ କରନ୍ତୁ" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "“%s” କୁ extensions.gnome.org ରୁ ଆହରଣ କରି ସ୍ଥାପନ କରିବେ କି?" + +#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "କିବୋର୍ଡ" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "କୌଣସି ଅନୁଲଗ୍ନ ସ୍ଥାପିତ ହୋଇନାହିଁ" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s କୌଣସି ତ୍ରୁଟି ଚିହ୍ନଟ କରିନାହିଁ।" + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "ତୃଟିଗୁଡ଼ିକୁ ଲୁଚାନ୍ତୁ" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "ତୃଟି ଗୁଡିକୁ ଦର୍ଶାନ୍ତୁ" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "ସକ୍ରିୟ" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "ନିଷ୍କ୍ରିୟ" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "ତୃଟି" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "ତାରିଖ ବାହାରେ" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "ଆହରଣ କରୁଅଛି" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "ଉତ୍ସକୁ ଦେଖନ୍ତୁ" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "ୱେବ ପୃଷ୍ଠା" + +#: ../js/ui/messageTray.js:1327 +msgid "Open" +msgstr "ଖୋଲନ୍ତୁ" + +#: ../js/ui/messageTray.js:1334 +msgid "Remove" +msgstr "ବାହାର କରନ୍ତୁ" + +#: ../js/ui/messageTray.js:1631 +msgid "Notifications" +msgstr "ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ" + +#: ../js/ui/messageTray.js:1638 +msgid "Clear Messages" +msgstr "ସନ୍ଦେଶଗୁଡ଼ିକୁ ସଫାକରନ୍ତୁ" + +#: ../js/ui/messageTray.js:1657 +msgid "Notification Settings" +msgstr "ବିଜ୍ଞପ୍ତି ବିନ୍ୟାସ" + +#: ../js/ui/messageTray.js:1710 +msgid "Tray Menu" +msgstr "ଟ୍ରେ ତାଲିକା" + +#: ../js/ui/messageTray.js:1934 +msgid "No Messages" +msgstr "କୌଣସି ସନ୍ଦେଶ ନାହିଁ" + +#: ../js/ui/messageTray.js:1979 +msgid "Message Tray" +msgstr "ସନ୍ଦେଶ ଟ୍ରେ" + +#: ../js/ui/messageTray.js:2992 +msgid "System Information" +msgstr "ତନ୍ତ୍ର ସୂଚନା" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "ଅଜଣା" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d ଟି ନୂତନ ସନ୍ଦେଶ" +msgstr[1] "%d ଟି ନୂତନ ସନ୍ଦେଶ" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "ପଦକ୍ଷେପ ବାତିଲ କରନ୍ତୁ" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "ସମୀକ୍ଷା" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "ସନ୍ଧାନ କରିବା ପାଇଁ ଲେଖନ୍ତୁ…" + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "ବିଦାୟ ନିଅନ୍ତୁ" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "କାର୍ଯ୍ୟକ୍ରମଗୁଡ଼ିକ" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "ଉପର ପଟି" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "ଗୋଟିଏ ନିର୍ଦ୍ଦେଶକୁ ଭରଣ କରନ୍ତୁ" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "ବନ୍ଦକରନ୍ତୁ" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "ପୁନଃଚାଳନ କରୁଅଛି…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ଟି ନୂତନ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ" +msgstr[1] "%d ଟି ନୂତନ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "ଅପରିବର୍ତ୍ତନୀୟ କରନ୍ତୁ" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "GNOME ପରଦାକୁ ତାଲା ପକାଇବା ଆବଶ୍ୟକ କରିଥାଏ" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "ତାଲା ପକାଇବାରେ ଅସମର୍ଥ" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "ତାଲାଟି ଏକ ପ୍ରୟୋଗ ଦ୍ୱାରା ଅଟକ ହୋଇଛି" + +#: ../js/ui/search.js:594 +msgid "Searching…" +msgstr "ସନ୍ଧାନ କରୁଅଛି…" + +#: ../js/ui/search.js:596 +msgid "No results." +msgstr "କୌଣସି ଫଳାଫଳ ନାହିଁ।" + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "ନକଲ କରନ୍ତୁ" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "ଲଗାନ୍ତୁ" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "ପାଠ୍ୟ ଦର୍ଶାନ୍ତୁ" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "ପାଠ୍ଯ ଲୁଚାନ୍ତୁ" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "ପ୍ରବେଶ ସଙ୍କେତ" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "ପ୍ରବେଶ ସଂକେତ ମନେରଖନ୍ତୁ" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "ଅଭିଗମ୍ୟତା" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "ଛୋଟବଡ଼ କରନ୍ତୁ" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "ପରଦା ପାଠକ" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "ପରଦା କିବୋର୍ଡ" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "ଦୃଶ୍ଯମାନ ସତର୍କତା" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "ସାମୟିକ କିଗୁଡ଼ିକ" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "ମନ୍ଥର କିଗୁଡ଼ିକ" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "ଡେଉଁଥିବା କିଗୁଡ଼ିକ" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "ମାଉସ କିଗୁଡ଼ିକ" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "ଅଧିକ ସ୍ପଷ୍ଟତା" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "ବୃହତ ପାଠ୍ୟ" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ବ୍ଲୁଟୁଥ" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "ଅଫ୍‌ କରନ୍ତୁ" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ବ୍ଲୁଟୁଥ ସଂରଚନାଗୁଡ଼ିକ" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d ଟି ସଂଯୁକ୍ତ ଉପକରଣ" +msgstr[1] "%d ଟି ସଂଯୁକ୍ତ ଉପକରଣଗୁଡ଼ିକ" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +msgid "Not Connected" +msgstr "ସଂଯୁକ୍ତ ହୋଇନାହିଁ" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "ଉଜ୍ଜ୍ବଳତା" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "କି-ବୋର୍ଡ ବିନ୍ଯାସ ଦର୍ଶାନ୍ତୁ" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "ଅବସ୍ଥାନ" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "ନିଷ୍କ୍ରିୟ" + +#: ../js/ui/status/location.js:73 +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "ଗୋପନୀୟତା ସେଟିଙ୍ଗ" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "ବ୍ଯବହୃତ ହେଉଅଛି" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "ସକ୍ରିୟ" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +msgid "Off" +msgstr "ଅଫ" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "ସଂଯୁକ୍ତ" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "ଅପରିଚାଳିତ" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ କରୁଅଛି" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +msgid "Connecting" +msgstr "ସଂଯୋଗ କରୁଅଛି" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "ବୈଧିକରଣ ଆବଶ୍ଯକ" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "ଫର୍ମୱେର ଅନୁପସ୍ଥିତ ଅଛି" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "ଉପଲବ୍ଧ ନାହିଁ" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "ସଂଯୋଗ ବିଫଳ ହୋଇଛି" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "ତାରମୟ ସଂରଚନା" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "ମୋବାଇଲ ବ୍ରୋଡ଼ବ୍ୟାଣ୍ଡ ସଂରଚନା" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +msgid "Hardware Disabled" +msgstr "ହାର୍ଡୱେର ନିଷ୍କ୍ରିୟ ଅଛି" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "ଇଣ୍ଟରନେଟ ସଂଯୋଗ ବ୍ୟବହାର କରନ୍ତୁ" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "ବିମାନ ଧାରା ଅନ୍‌ ଅଛି" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "ବିମାନ ଧାରା ଅନ୍‌ ଥିବା ସମୟରେ ୱାଇ-ଫାଇ ନିଷ୍କ୍ରିୟ ଅଛି।" + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "ବିମାନ ଧାରାକୁ ଅଫ୍‌ କରନ୍ତୁ" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi ଅଫ୍‌ ଅଛି" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "ନେଟୱର୍କ ସହିତ ସଂଯୋଗ କରିବା ପାଇଁ ୱାଇ-ଫାଇକୁ ଅନ୍‌ କରିବା ଆବଶ୍ୟକ।" + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi କୁ ଅନ୍‌ କରନ୍ତୁ" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "ୱାଇ-ଫାଇ ନେଟୱର୍କଗୁଡ଼ିକ" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "ଗୋଟିଏ ନେଟୱର୍କ ବାଛନ୍ତୁ" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "କୌଣସି ନେଟୱର୍କ ନାହିଁ" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "ଅଫ୍‌ କରିବାକୁ ଥିବା ବ୍ୟବହାରକାରୀ ହାର୍ଡୱେର ସ୍ୱୀଚ" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "ନେଟୱର୍କ ବାଛନ୍ତୁ" + +#: ../js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "ୱାଇ-ଫାଇ ସଂରଚନା" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "ଅନ୍‌ କରନ୍ତୁ" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "ହଟସ୍ପଟ୍‌ ସକ୍ରିୟ ଅଛି" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "ସଂଯୋଗ କରୁଅଛି..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "ବୈଧିକରଣ ଆବଶ୍ୟକ" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "ସଂଯୋଗ ବିଫଳ ହୋଇଛି" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "ନେଟୱର୍କ ସଂରଚନା" + +#: ../js/ui/status/network.js:1482 +msgid "VPN Settings" +msgstr "VPN ସଂରଚନା" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "ନେଟୱର୍କ ପରିଚାଳକ" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "ନେଟୱର୍କ ସଂଯୋଗ ବିଫଳ ହୋଇଛି" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "ବିଦ୍ୟୁତ ଶକ୍ତି ବିନ୍ଯାସ" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଚାର୍ଜ ହୋଇଛି" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "ହିସାବ କରୁଅଛି ..." + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d ବଳିଅଛି (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d ସମ୍ପୂର୍ଣ୍ଣ ହେବା ପର୍ଯ୍ୟନ୍ତ (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "ବ୍ଯାଟେରୀ" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "ବିମାନ ଧାରା" + +#: ../js/ui/status/rfkill.js:85 +msgid "On" +msgstr "ଅନ୍‌" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "ଚାଳକଙ୍କୁ ବଦଳାନ୍ତୁ" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "ଲଗଆଉଟ କରନ୍ତୁ" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "ଆବର୍ତ୍ତନ ତାଲା" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "ନିଲମ୍ବନ କରନ୍ତୁ" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁ" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ଆକାର ପରିବର୍ତ୍ତିତ" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "ଭଲ୍ଯୁମ" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "ମାଇକ୍ରଫୋନ" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "ଅନ୍ୟ ଏକ ଚାଳକ ଭାବରେ ଲଗଇନ କରନ୍ତୁ" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "ୱିଣ୍ଡୋକୁ ଖୋଲନ୍ତୁ" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "ପ୍ରୟୋଗଗୁଡ଼ିକ" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "ସନ୍ଧାନ କରନ୍ତୁ" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” ପ୍ରସ୍ତୁତ ଅଛି" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "ଆପଣ ଏହି ପ୍ରଦର୍ଶନୀ ସଂରଚନାକୁ ରଖିବାକୁ ଚାହୁଁଛନ୍ତି କି?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "ସଂରଚନାକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ରଖନ୍ତୁ" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "ସଂରଚନା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ %d ସେକେଣ୍ଡରେ ପ୍ରତ୍ୟାବୃତ ହେବ" +msgstr[1] "ସଂରଚନା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ %d ସେକେଣ୍ଡରେ ପ୍ରତ୍ୟାବୃତ ହେବ" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "ଛୋଟକରନ୍ତୁ" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "ବଡ଼କରନ୍ତୁ ନାହିଁ" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "ବଡ଼କରନ୍ତୁ" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "ଘୁଞ୍ଚାନ୍ତୁ" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "ଆକାର ବଦଳାନ୍ତୁ" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "ଶୀର୍ଷକ ପଟିକୁ ପରଦା ଉପରେ ଘୁଞ୍ଚାନ୍ତୁ" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "ସର୍ବଦା ଉପରେ" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "ସଦାବେଳେ ଦୃଶ୍ଯମାନ କାର୍ଯ୍ଯକ୍ଷେତ୍ରରେ ଥାଏ" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "ଉପର କାର୍ଯ୍ଯକ୍ଷେତ୍ରକୁ ପଠାନ୍ତୁ" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "ତଳ କାର୍ଯ୍ଯକ୍ଷେତ୍ରକୁ ପଠାନ୍ତୁ" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution କ୍ୟାଲେଣ୍ଡର" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u ଫଳାଫଳ" +msgstr[1] "%u ଫଳାଫଳଗୁଡ଼ିକ" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ନିବେଶ" +msgstr[1] "%u ନିବେଶଗୁଡ଼ିକ" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "ତନ୍ତ୍ର ଧ୍ୱନି" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "ମୁଦ୍ରଣ ସଂସ୍କରଣ" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "ଲଗଇନ ପରଦା ପାଇଁ ବ୍ୟବହୃତ GDM" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ଧାରା ବ୍ୟବହାର କରନ୍ତୁ, ଯେପରିକି ଲଗଇନ ପରଦା ପାଇଁ \"gdm\"" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "ସମ୍ଭାବ୍ୟ ଧାରାଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” କୁ ଆରମ୍ଭ କରିବାରେ ବିଫଳ" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "ପ୍ରବେଶ ସଙ୍କେତ ଦ୍ବୟ ମିଶୁ ନାହିଁ।" + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "ପ୍ରବେଶ ସଙ୍କେତଟି ଖାଲି ହୋଇ ପାରିବ ନାହିଁ" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "ବୈଧିକରଣ ସଂଳାପଟି ଚାଳକ ଦ୍ୱାରା ବାତିଲ ହୋଇଛି" + +#~ msgid "Screenshots" +#~ msgstr "ପରଦା ପ୍ରତିଛବିଗୁଡ଼ିକ" + +#~ msgid "Record a screencast" +#~ msgstr "ସ୍କ୍ରିନକାଷ୍ଟକୁ ଲିପିବଦ୍ଧ କରନ୍ତୁ" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "ପ୍ରୟୋଗ ଉପଯୋଗ ବିଷୟରେ ସ୍ଥିତି ସଂଗ୍ରହ କରିବା ଉଚିତ କି" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "ବହୁଳ ଭାବରେ ବ୍ୟବହୃତ ପ୍ରୟୋଗକୁ ଉପସ୍ଥାପନ କରିବା ପାଇଁ ସେଲ ସାଧାରଣତଃ ସକ୍ରିୟ ପ୍ରୟୋଗଗୁଡ଼ିକୁ ନିରୀକ୍ଷଣ " +#~ "କରିଥାଏ। ଯେତେବେଳେ ଏହି ତଥ୍ୟକୁ ବ୍ୟକ୍ତିଗତ ରଖାଯାଇଥାଏ, ସେତେବେଳେ ଆପଣ ଏହାକୁ ବ୍ୟକ୍ତିଗତ କାରଣ " +#~ "ହେତୁ ନିଷ୍କ୍ରିୟ କରିପାରିବେ। ଦୟାକରିମନେରଖନ୍ତୁ ଯେ ଏହା କରିବା ଫଳରେ ତାହା ସଂରକ୍ଷିତ ତଥ୍ୟକୁ ବାହାର " +#~ "କରିନଥାଏ।" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "ବିଭାଗଗୁଡ଼ିକର ତାଲିକା ଯାହାକୁ ଫୋଲଡର୍‌ ଭାବରେ ଦର୍ଶାଯାଇଥାଏ" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "ମୂଖ୍ୟ ଦୃଶ୍ୟରେ ଦର୍ଶାଇବା ପରିବର୍ତ୍ତେ, ଏହି ତାଲିକାରେ ପ୍ରତ୍ୟେକ ବିଭାଗ ନାମକୁ ପ୍ରୟୋଗ ଦୃଶ୍ୟରେ ଫୋଲଡର୍‌ " +#~ "ଭାବରେ ଉପସ୍ଥାପନା କରାଯାଇଥାଏ।" + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "ଶେଷ IM ଉପସ୍ଥିତିକୁ ସଂରକ୍ଷଣ କରିବା ପାଇଁ ଆଭ୍ୟନ୍ତରୀଣ ବ୍ୟବହାର ପାଇଁ ବ୍ୟବହାରକାରୀ ଦ୍ୱାରା ସେଟ " +#~ "କରାଯାଇଥାଏ। ଏଠାରେ ଥିବା ମୂଲ୍ଯଟି ହେଉଛି TpConnectionPresenceType enumeration." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "ବ୍ୟବହାରକାରୀ ପାଇଁ ଅନ୍ତିମ ଅଧିବେଶନ ଉପସ୍ଥିତିକୁ ସଂରକ୍ଷଣ କରିବା ପାଇଁ ଆଭ୍ୟନ୍ତରିଣ ଭାବରେ ବ୍ୟବହାର " +#~ "କରାଯାଇଥାଏ। ଏଠାରେ ଥିବା ମୂଲ୍ଯଟି ହେଉଛି GsmPresenceStatus enumeration." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "ପରଦା ଲେଖକକୁ ଆଗପଛ କରିବା ପାଇଁ କି ବନ୍ଧନ" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "ପୂର୍ବନିର୍ମିତ ପରଦା ଲେଖକକୁ ଆରମ୍ଭ/ବନ୍ଦ କରିବା ପାଇଁ କି ବନ୍ଧନ।" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "ସ୍କ୍ରିନକାଷ୍ଟଗୁଡ଼ିକୁ ଲିପିବଦ୍ଧ କରିବା ପାଇଁ ବ୍ୟବହୃତ ଫ୍ରେମ ହାର।" + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "GNOME ସେଲ ସ୍କ୍ରିନକାଷ୍ଟ ଲେଖକ ଦ୍ୱାରା ଲିପିବଦ୍ଧ ଫଳାଫଳ ସ୍କ୍ରିନକାଷ୍ଟର ଫ୍ରେମ ହାର ହେଉଛି ସେକଣ୍ଡ " +#~ "ପ୍ରତି ଫ୍ରେମ ସଂଖ୍ୟା।" + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "ସ୍କ୍ରିନକାଷ୍ଟକୁ ସାଙ୍କେତିକରଣ କରିବା ପାଇଁ ବ୍ୟବହୃତ gstreamer" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "ଲିପିବଦ୍ଧ କରିବା ପାଇଁ ସାଙ୍କେତିକରଣରେ ବ୍ୟବହୃତ GStreamer ପାଇପଲାଇନ। ଏହା gst-launch ପାଇଁ " +#~ "ବ୍ୟବହୃତ ବାକ୍ୟ ବିନ୍ୟାସକୁ ଅନୁସରଣ କରିଥାଏ। ସେହି ପାଇପଲାଇନରେ ଅସଂଯୁକ୍ତ ସିଙ୍କ ପ୍ୟାଡ଼ ଥାଏ " +#~ "ଯେଉଁଠିଲିପିବଦ୍ଧ ଭିଡ଼ିଓକୁ ରଖାଯାଇଥାଏ। ଏଥିରେ ସାଧାରଣତଃ ଅସଂଯୁକ୍ତ ଉତ୍ସ ପ୍ୟାଡ଼ ଥାଏ; ସେହି ପ୍ୟାଡ଼ର " +#~ "ଫଳାଫଳକୁ ଫଳାଫଳ ଫାଇଲରେ ଲେଖାଯାଇଥାଏ। ତଥାପି ସେହି ପାଇପଲାଇନ ତାହାର ଯତ୍ନ ନେଇପାରିବ -ଏହା " +#~ "ହୁଏତଃଫଳାଫଳକୁ icecast ସର୍ଭରକୁ shout2send କିମ୍ବା ସେହିପରି କିଛି ମାଧ୍ଯମରେପଠାଇବାରେ ବ୍ୟବହାର " +#~ "କରାଯାଇପାରିବ। ଯେତେବେଳେ ସେଟ କରାଯାଇନଥାଏ କିମ୍ବା ଖାଲି ମୂଲ୍ୟ ସେଟ ହୋଇଥାଏ, ସେତେବେଳେ " +#~ "ପୂର୍ବନିର୍ଦ୍ଧାରିତ ପାଇପଲାଇନକୁ ବ୍ୟବହାର କରାଯିବ। ଏହା ବର୍ତ୍ତମାନ 'vp8enc min_quantizer=13 " +#~ "max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! " +#~ "webmmux' ଏବଂ WEBM ରେ VP8 କୋଡେକ ବ୍ୟବହାର କରି ଲିପିବଦ୍ଧ କରିଥାଏ। %T କୁ ତନ୍ତ୍ରରେ ଏକ ସ୍ଥାନ " +#~ "ରକ୍ଷକ ଭାବରେ ବ୍ୟବହାର କରାଯାଇଥାଏ।" + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "ସ୍କ୍ରିନକାଷ୍ଟକୁ ସଂରକ୍ଷଣ କରିବା ପାଇଁ ବ୍ୟବହୃତ ଫାଇଲ ଅନୁଲଗ୍ନ" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "ଲିପିବଦ୍ଧ ସ୍କ୍ରିନକାଷ୍ଟ ପାଇଁ ଫାଇଲ ନାମଟି ବର୍ତ୍ତମାନ ତାରିଖ ଅନୁସାରେ ଏକ ଅନନ୍ୟ ଫାଇଲନାମ " +#~ "ଦିଆଯାଇଥାଏ, ଏବଂ ଏହି ଅନୁଲଗ୍ନକୁ ବ୍ୟବହାର କରାଯାଇଥାଏ। ଏହାକୁ ବିଭିନ୍ନ ଧାରଣକର୍ତ୍ତା ଶୈଳୀରେ " +#~ "ପରିବର୍ତ୍ତନ କରିବା ଉଚିତ।" + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "ଶୀର୍ଷକ ପଟିରେ ଚାବିର ସଜ୍ଜା" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "GNOME ସେଲ ଚାଲିଥିବା ସମୟରେ ଏହି ଚାବିଟି org.gnome.desktop.wm.preferences ରେ ଥିବା " +#~ "ଚାବିକୁ ନବଲିଖନ କରିଥାଏ।" + +#~ msgid "Extension" +#~ msgstr "ଅନୁଲଗ୍ନ" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "ଉପରେ ଥିବା କମ୍ବୋବକ୍ସ ବ୍ୟବହାର କରି ବିନ୍ୟାସ କରିବା ପାଇଁ ଏକ ଅନୁଲଗ୍ନ ବାଛନ୍ତୁ।" + +#~| msgid "Session..." +#~ msgid "Session…" +#~ msgstr "ଅଧିବେଶନ…" + +#~| msgid "Power Off" +#~ msgid "Power" +#~ msgstr "ବିଦ୍ୟୁତ ଶକ୍ତି" + +#~ msgid "Restart" +#~ msgstr "ପୂନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t ରୁ ସ୍କ୍ରିନକାଷ୍ଟ" + +#~| msgid "Sent on %A, %B %d" +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~| msgid "Sent on %A, %B %d" +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "ଏହି ପ୍ରୟୋଗଗୁଡ଼ିକରୁ ପ୍ରସ୍ଥାନ କରିବା ପାଇଁ ଲଗ ଆଉଟ କ୍ଲିକ କରନ୍ତୁ ଏବଂ ତନ୍ତ୍ରରୁ ଲଗ ଆଉଟ କରନ୍ତୁ।" + +#~ msgid "Logging out of the system." +#~ msgstr "ତନ୍ତ୍ରରୁ ଲଗ ଆଉଟ କରୁଅଛି।" + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "ଏହି ପ୍ରୟୋଗଗୁଡ଼ିକରୁ ପ୍ରସ୍ଥାନ କରିବା ପାଇଁ ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁକୁ କ୍ଲିକ କରନ୍ତୁ ଏବଂ ତନ୍ତ୍ରର ବିଦ୍ୟୁତ " +#~ "ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁ।" + +#~ msgid "Powering off the system." +#~ msgstr "ତନ୍ତ୍ରର ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ ହେଉଅଛି।" + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "ଏହି ପ୍ରୟୋଗଗୁଡ଼ିକରୁ ପ୍ରସ୍ଥାନ କରିବା ପାଇଁ ପୁନଃପ୍ରାରମ୍ଭ କରନ୍ତୁକୁ କ୍ଲିକ କରନ୍ତୁ ଏବଂ ତନ୍ତ୍ରକୁ ପୁନଃପ୍ରାରମ୍ଭ " +#~ "କରନ୍ତୁ।" + +#~ msgid "Restarting the system." +#~ msgstr "ତନ୍ତ୍ରକୁ ପୁନଃଚାଳନ କରୁଅଛି।" + +#~ msgid "Universal Access Settings" +#~ msgstr "ସାର୍ବଜନିକ ଅଭିଗମ୍ୟତା ବିନ୍ଯାସ" + +#~ msgid "Visibility" +#~ msgstr "ଦେଖିବା କ୍ଷମତା" + +#~| msgid "Send Files to Device..." +#~ msgid "Send Files to Device…" +#~ msgstr "ଉପକରଣ ମଧ୍ଯକୁ ଫାଇଲଗୁଡ଼ିକୁ ପଠାନ୍ତୁ…" + +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "ଏକ ନୂଆ ଉପକରଣ ବ୍ୟବସ୍ଥା କରନ୍ତୁ ..." + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "ଫାଇଲଗୁଡ଼ିକୁ ପଠାନ୍ତୁ…" + +#~ msgid "Keyboard Settings" +#~ msgstr "କିବୋର୍ଡ ବିନ୍ୟାସଗୁଡ଼ିକ" + +#~ msgid "Mouse Settings" +#~ msgstr "ମାଉସ ସେଟିଙ୍ଗଗୁଡିକ" + +#~ msgid "Sound Settings" +#~ msgstr "ଧ୍ୱନି ସେଟିଙ୍ଗଗୁଡିକ" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s ରୁ ବୈଧିକରଣ ଅନୁରୋଧ" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "ଉପକରଣ %s ସର୍ଭିସ '%s' ପାଇଁ ଅଭିଗମ୍ୟତା ଆଶା କରିଥାଏ।" + +#~ msgid "Always grant access" +#~ msgstr "ସର୍ବଦା ଅନୁମତି ପ୍ରଦାନ କରନ୍ତୁ" + +#~ msgid "Grant this time only" +#~ msgstr "କେବଳ ବର୍ତ୍ତମାନ ପାଇଁ ଅନୁମତି ପ୍ରଦାନ କରନ୍ତୁ" + +#~ msgid "Reject" +#~ msgstr "ଅସ୍ବୀକାର କରନ୍ତୁ" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s ପାଇଁ ଯୁଗଳ ନିଶ୍ଚିତକରଣ" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "ଉପକରଣ %s ଏହି କମ୍ପୁଟର ସହିତ ଯୁଗଳ ହେବାକୁ ଇଚ୍ଛାପ୍ରକାଶ କରୁଅଛି" + +#~ msgid "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgstr "ଦୟାକରି ନିଶ୍ଚିତ କରନ୍ତୁ ଯେ PIN '%06d' ଉପକରଣ ସହିତ ମେଳ ଖାଇଥାଏ।" + +#~ msgid "Matches" +#~ msgstr "ମେଳଗୁଡିକ" + +#~ msgid "Does not match" +#~ msgstr "ମେଳ ଖାଉନାହିଁ" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s ପାଇଁ ଯୁଗଳ ଅନୁରୋଧ" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "ଉପକରଣରେ ନିର୍ଦ୍ଦିଷ୍ଟ PIN କୁ ଭରଣ କରନ୍ତୁ।" + +#~ msgid "OK" +#~ msgstr "ଠିକ ଅଛି" + +#~| msgid "Region and Language Settings" +#~ msgid "Region & Language Settings" +#~ msgstr "ସ୍ଥାନ ଏବଂ ଭାଷା ସେଟିଙ୍ଗଗୁଡିକ" + +#~ msgid "Volume, network, battery" +#~ msgstr "ଭଲ୍ୟୁମ, ନେଟୱର୍କ, ବ୍ୟାଟେରୀ" + +#~ msgid "disabled" +#~ msgstr "ନିଷ୍କ୍ରିୟ ହୋଇଛି" + +#~ msgid "cable unplugged" +#~ msgstr "କେବଲ ଲଗାହୋଇ ନାହିଁ" + +#~ msgid "unavailable" +#~ msgstr "ଉପଲବ୍ଧ ନାହିଁ" + +#~ msgid "More…" +#~ msgstr "ଅଧିକ…" + +#~ msgid "Wired" +#~ msgstr "ତାରଯୁକ୍ତ" + +#~ msgid "Auto Ethernet" +#~ msgstr "ସ୍ୱୟଂଚାଳିତ ଇଥରନେଟ" + +#~ msgid "Auto broadband" +#~ msgstr "ସ୍ୱୟଂଚାଳିତ ବ୍ରୋଡ଼ବ୍ୟାଣ୍ଡ" + +#~ msgid "Auto dial-up" +#~ msgstr "ସ୍ୱୟଂଚାଳିତ ଡାଏଲ-ଅପ" + +#~ msgid "Auto %s" +#~ msgstr "ସ୍ବୟଂଚାଳିତ %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "ସ୍ବୟଂଚାଳିତ ବ୍ଲୁଟୁଥ" + +#~ msgid "Auto wireless" +#~ msgstr "ସ୍ବୟଂଚାଳିତ ବେତାର" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "Networking is disabled" +#~ msgstr "ନେଟୱର୍କିଙ୍ଗ ନିଷ୍କ୍ରିୟ ହୋଇଛି" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d ଘଣ୍ଟା ବଳିଛି" +#~ msgstr[1] "%d ଘଣ୍ଟା ବଳିଛି" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s ବଳିଅଛି" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ଘଣ୍ଟା" +#~ msgstr[1] "ଘଣ୍ଟା" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "ମିନିଟ" +#~ msgstr[1] "ମିନିଟ" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d ମିନଟ ବଳିଅଛି" +#~ msgstr[1] "%d ମିନଟ ବଳିଅଛି" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~| msgid "AC adapter" +#~ msgid "AC Adapter" +#~ msgstr "AC ଏଡପଟର" + +#~| msgid "Laptop battery" +#~ msgid "Laptop Battery" +#~ msgstr "ଲାପଟପ ବ୍ଯାଟେରୀ" + +#~ msgid "Monitor" +#~ msgstr "ମନିଟର" + +#~ msgid "Mouse" +#~ msgstr "ମାଉସ" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~| msgid "Cell phone" +#~ msgid "Cell Phone" +#~ msgstr "ସେଲ ଫୋନ" + +#~| msgid "Media player" +#~ msgid "Media Player" +#~ msgstr "ମେଡ଼ିଆ ଚାଲକ" + +#~ msgid "Tablet" +#~ msgstr "ଟ୍ୟାବଲେଟ" + +#~ msgid "Computer" +#~ msgstr "କମ୍ପୁଟର" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "ଅଜଣା" + +#~ msgid "Available" +#~ msgstr "ଉପଲବ୍ଧ " + +#~ msgid "Busy" +#~ msgstr "ବ୍ଯସ୍ତ" + +#~ msgid "Invisible" +#~ msgstr "ଅଦୃଶ୍ଯ" + +#~ msgid "Away" +#~ msgstr "ଅନୁପସ୍ଥିତ" + +#~ msgid "Idle" +#~ msgstr "ନିଷ୍କ୍ରିୟ" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "ଆପଣଙ୍କର ଚାଟ ସ୍ଥିତିକୁ ବ୍ୟସ୍ତ ବୋଲି ସେଟ କରାଯିବ" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "ଆଳାପ ସନ୍ଦେଶଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରି ବିଜ୍ଞପ୍ତିକୁ ବର୍ତ୍ତମାନ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି। ଆପଣ ଅନ୍ୟମାନଙ୍କର " +#~ "ସନ୍ଦେଶଗୁଡ଼ିକୁ ଦେଖିପାରୁଛନ୍ତି କି ନାହିଁ ତାହା ଜଣାଇବା ପାଇଁ ଆପଣଙ୍କର ଅନଲାଇନ ସ୍ଥିତିକୁ ସଜଡ଼ାଯାଇଛି।" + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "ବନ୍ଦ କରିବା ଫଳରେ ହୁଏତ ସେମାନେ ତାଙ୍କର ଅସଂରକ୍ଷିତ କାର୍ଯ୍ୟକୁ ହରାଇପାରନ୍ତି।" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "କ୍ଷମା କରିବେ, ଆପଣଙ୍କ ପାଇଁ ଆଜି କୌଣସି ଜ୍ଞାନ ନାହିଁ:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s Oracle କହିଥାଏ" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "ସାଇନ ଇନ" + +#~ msgid "APPLICATIONS" +#~ msgstr "ପ୍ରୟୋଗଗୁଡ଼ିକ" + +#~ msgid "SETTINGS" +#~ msgstr "ସେଟିଙ୍ଗଗୁଡିକ" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Subscription request" +#~ msgstr "ସଦସ୍ୟତା ‍ଅନୁରୋଧ" + +#~ msgid "Connection error" +#~ msgstr "ସଂଯୋଗ ତ୍ରୁଟି" + +#~ msgid "Sent at %X on %A" +#~ msgstr "%X କୁ %A ଉପରେ ପଠାଯାଇଛି" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "%A ଉପରେ ପଠାଯାଇଛି, %B %d, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "%s ସହିତ ସଂଯୋଗ ବିଫଳ ହୋଇଛି" + +#~ msgid "Reconnect" +#~ msgstr "ପୁନଃସଂଯୋଗ କରନ୍ତୁ" + +#~ msgid "tray" +#~ msgstr "ଟ୍ରେ" + +#~ msgid "Browse Files..." +#~ msgstr "ଫାଇଲଗୁଡ଼ିକୁ ବ୍ରାଉଜ କରନ୍ତୁ..." + +#~ msgid "Error browsing device" +#~ msgstr "ଉପକରଣକୁ ବ୍ରାଉଜ କରିବାରେ ତ୍ରୁଟି" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "ଅନୁରୋଧ କରାଯାଇଥିବା ଉପକରଣକୁ ବ୍ରାଉଜ କରିହେବ ନାହିଁ, ତ୍ରୁଟି ହେଉଛି '%s'" + +#~ msgid "More..." +#~ msgstr "ଅଧିକ..." + +#~ msgid "Wireless" +#~ msgstr "ବେତାର" + +#~ msgid "VPN Connections" +#~ msgstr "VPN ସଂୟୋଗଗୁଡିକ" + +#~ msgid "System Settings" +#~ msgstr "ତନ୍ତ୍ର ବିନ୍ୟାସ" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "ଆପଣଙ୍କର ମନପସନ୍ଦ ଇଷ୍ଟର ଏଗ" + +#~ msgid "United Kingdom" +#~ msgstr "ଯୁକ୍ତ ରାଜ୍ଯ" + +#~ msgid "Default" +#~ msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "ସତ ଥିଲେ, ଘଣ୍ଟାରେ ସମୟ ସହିତ ତାରିଖ ଦେଖାନ୍ତୁ।" + +#~ msgid "If true, display seconds in time." +#~ msgstr "ସତ ଥିଲେ, ସମୟରେ ସେକେଣ୍ଡ ଦେଖାନ୍ତୁ।" + +#~ msgid "Show date in clock" +#~ msgstr "ଘଣ୍ଟାରେ ତାରିଖ ଦେଖାନ୍ତୁ" + +#~ msgid "Show time with seconds" +#~ msgstr "ସମୟରେ ସେକେଣ୍ଡ ଦେଖାନ୍ତୁ" + +#~ msgid "CONTACTS" +#~ msgstr "ସମ୍ପର୍କଗୁଡ଼ିକ" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ସାମ୍ପ୍ରତିକ ବସ୍ତୁଗୁଡ଼ିକ" + +#~ msgid "Show password" +#~ msgstr "ପ୍ରବେଶ ସଂକେତ ଦର୍ଶାନ୍ତୁ" + +#~ msgid "Retry" +#~ msgstr "ପୁଣି ଚେଷ୍ଟାକରନ୍ତୁ" + +#~ msgid "Connect to..." +#~ msgstr "ଏହା ସହିତ ସଂଯୋଗ କରନ୍ତୁ..." + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ସ୍ଥାନ ଏବଂ ଉପକରଣଗୁଡ଼ିକ" + +#~ msgid "%s is online." +#~ msgstr "%s ଅନଲାଇନ ଅଛି।" + +#~ msgid "%s is offline." +#~ msgstr "%s ଅଫଲାଇନ ଅଛି।" + +#~ msgid "%s is away." +#~ msgstr "%s ଅନୁପସ୍ଥିତ ଅଛି।" + +#~ msgid "%s is busy." +#~ msgstr "%s ବ୍ୟସ୍ତ ଅଛି।" + +#~ msgid "Hidden" +#~ msgstr "ଲୁକ୍କାଇତ" + +#~ msgid "Power Off..." +#~ msgstr "ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁ..." + +#~ msgid "Online Accounts" +#~ msgstr "ଅନଲାଇନ ଖାତାଗୁଡ଼ିକ" + +#~ msgid "Lock Screen" +#~ msgstr "ପରଦାକୁ ତାଲା ଦେଇ ରଖନ୍ତୁ" + +#~ msgid "Log Out..." +#~ msgstr "ଲଗ ଆଉଟ..." + +#~ msgid "Home Folder" +#~ msgstr "ମୂଳ ଫୋଲଡର" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "calendar:week_start:0" +#~ msgstr "calendar:week_start:0" diff --git a/po/pa.po b/po/pa.po new file mode 100644 index 0000000..e3c6b85 --- /dev/null +++ b/po/pa.po @@ -0,0 +1,3361 @@ +# Punjabi translation for gnome-shell. +# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# A S Alam , 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-01-25 15:02+0000\n" +"PO-Revision-Date: 2019-01-27 14:15-0800\n" +"Last-Translator: A S Alam \n" +"Language-Team: Punjabi \n" +"Language: pa\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: Lokalize 2.0\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "ਸਿਸਟਮ" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੂਚੀ ਵੇਖਾਓ" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "ਸਰਗਰਮ ਸੂਚਨਾ ਉੱਤੇ ਫੋਕਸ" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "ਸੰਖੇਪ ਵੇਖਾਓ" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "ਸਭ ਐਪਲੀਕੇਸ਼ਨ ਵੇਖੋ" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਮੇਨੂ ਖੋਲ੍ਹੋ" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:139 +msgid "Shell Extensions" +msgstr "ਸ਼ੈਲ ਇਕਸਟੈਸ਼ਨ" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "ਗਨੋਮ ਸ਼ੈਲ ਇਕਸਟੈਸ਼ਨ ਸੰਰਚਨਾ" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "ਗਨੋਮ ਸ਼ੈਲ" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "ਵਿੰਡੋ ਇੰਤਜ਼ਾਮ ਅਤੇ ਐਪਲੀਕੇਸ਼ਨ ਚਲਾਉਣਾ" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Alt-F2 ਤੋਂ ਡਿਵੈਲਪਰਾਂ ਤੇ ਟੈਸਟਰਾਂ ਲਈ ਫਾਇਦੇਮੰਦ ਅੰਦਰੂਨੀ ਟੂਲ ਚਾਲੂ ਕਰਦਾ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 ਡਾਈਲਾਗ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅੰਦਰੂਨੀ ਡੀਬੱਗਿਗ ਤੇ ਮਾਨੀਟਰਿੰਗ ਟੂਲ ਵਰਤੋਂ ਕਰਨ ਲਈ" +" ਸਹਾਇਕ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "ਚਾਲੂ ਕਰਨ ਲਈ ਇਕਟੈਨਸ਼ਨ ਦੀ UUID" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"ਗਨੋਮ ਸ਼ੈਲ ਇਕਸਟੈਨਸ਼ਨ ਲਈ ਇੱਕ UUID ਵਿਸ਼ੇਸ਼ਤਾ ਹੈ; ਇਹ ਕੁੰਜੀ ਇਕਸਟੈਨਸ਼ਨ ਦਰਸਾਉਂਦੀ ਹੈ," +" ਜੋ ਲੋਡ ਹੋਣੀ " +"ਚਾਹੀਦੀ ਹੈ। ਕੋਈ ਵੀ ਇਕਸਟੈਸ਼ਨ, ਜੋ ਲੋਡ ਹੋਣਾ ਚਾਹੁੰਦੀ ਹੈ, ਨੂੰ ਇਹ ਸੂਚੀ ਵਿੱਚ ਹੋਣਾ" +" ਚਾਹੀਦਾ ਹੈ। ਤੁਸੀਂ ਵੀ " +"ਇਹ ਸੂਚੀ ਨੂੰ org.gnome.shell ਉੱਤੇ EnableExtension ਅਤੇ DisableExtension D-Bus" +" ਢੰਗ ਨਾਲ " +"ਬਦਲ ਸਕਦੇ ਹੋ।" + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "ਵਰਤੋਂਕਾਰ ਇਕਸਟੈਨਸ਼ਨਾਂ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"“enabled-extension” ਸੈਟਿੰਗ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕੀਤੇ ਬਿਨਾਂ ਵਰਤੋਂਕਾਰ ਵਲੋਂ ਸਮਰੱਥ ਕੀਤੀਆਂ" +" ਸਾਰੀਆਂ " +"ਇਕਸਟੈਨਸ਼ਨਾਂ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ।" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "ਇਕਸਟੈਨਸ਼ਨ ਵਰਜਨ ਅਨੁਕੂਲਤਾ ਦੀ ਵੈਧਤਾ ਨੂੰ ਬੰਦ ਕਰੋ" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"ਗਨੋਮ ਸ਼ੈਲ ਕੇਵਲ ਉਹਨਾਂ ਹੀ ਇਕਸਟੈਨਸ਼ਨਾਂ ਨੂੰ ਲੋਡ ਕਰਦੀ ਹੈ, ਜੋ ਕਿ ਮੌਜੂਦਾ ਚਾਲੂ ਵਰਜਨ ਨਾਲ" +" ਸਹਾਇਤਾ ਦਾ " +"ਦਾਅਵਾ ਕਰਦੀਆਂ ਹਨ। ਇਹ ਚੋਣ ਕਰਨ ਨਾਲ ਇਹ ਜਾਂਚ ਬੰਦ ਹੋ ਜਾਵੇਗੀ ਅਤੇ ਸਭ ਇਕਸਟੈਨਸ਼ਨਾਂ ਨੂੰ" +" ਲੋਡ ਕਰਨ ਦੀ " +"ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ, ਭਾਵੇਂ ਕਿ ਉਹ ਵਰਜਨ ਲਈ ਸਹਾਇਤਾ ਬਾਰੇ ਕੁਝ ਵੀ ਦਾਆਵਾ ਕਰਨ।" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "ਪਸੰਦੀਦਾ ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਡੈਸਕਟਾਪ ਫਾਇਲ ID ਦੀ ਲਿਸਟ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"ਇਹਨਾਂ ਐਂਡਟਟੀਫਾਇਰ ਨਾਲ ਸਬੰਧਿਤ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਪਸੰਦੀਦਾ ਖੇਤਰ 'ਚ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "ਐਪ ਚੁਣਨ ਝਲਕ" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਚੋਣਕਾਰ ਵਿੱਚ ਮੌਜੂਦਾ ਚੁਣੀ ਝਲਕ ਦਾ ਇੰਡੈਕਸ।" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "ਕਮਾਂਡ (Alt-F2) ਡਾਈਲਾਗ ਲਈ ਅਤੀਤ" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "ਗਲਾਸ ਡਾਈਲਾਗ ਖੋਜ ਲਈ ਅਤੀਤ" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "ਵਰਤੋਂਕਾਰ ਮੇਨੂ ਵਿੱਚ “ਲਾਗ ਆਉਟ “ ਮੇਨੂ ਆਈਟਮ ਹਮੇਸ਼ਾ ਵੇਖਾਉ।" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"ਇਹ ਕੁੰਜੀ ਇੱਕਲੇ ਵਰਤੋਂਕਾਰ, ਸਿੰਗਲ-ਸ਼ੈਸ਼ਨ ਸਥਿਤੀ ਵਿੱਚ “ਲਾਗ ਆਉਟ“ ਮੇਨੂ-ਆਈਟਮ ਨੂੰ" +" ਆਪਣੇ-ਆਪ ਓਹਲੇ ਕਰਨ ਨੂੰ " +"ਅਣਡਿੱਠਾ ਕਰਦੀ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "ਕੀ ਇੰਕ੍ਰਿਪਟ ਜਾਂ ਰਿਮੋਟ ਫਾਇਲ-ਸਿਸਟਮਾਂ ਲਈ ਪਾਸਵਰਡ ਯਾਦ ਰੱਖਣਾ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"ਸੈੱਲ ਨੂੰ ਇਹ ਪਾਸਵਰਡ ਚਾਹੀਦਾ ਹੋਵੇਗਾ, ਜਦੋਂ ਇੰਕ੍ਰਿਪਟ ਕੀਤਾ ਜੰਤਰ ਜਾਂ ਰਿਮੋਟ ਫਾਇਲ" +" ਸਿਸਟਮ ਮਾਊਂਟ ਕੀਤਾ " +"ਜਾਂਦਾ ਹੈ। ਜੇ ਇਹ ਪਾਸਵਰਡ ਭਵਿੱਖ ਵਿੱਚ ਵਰਤਣ ਸੰਭਾਲਿਆ ਜਾ ਸਕਦਾ ਹੋਇਆ ਤਾਂ “ਪਾਸਵਰਡ ਯਾਦ" +" ਰੱਖੋ“ ਬਾਕਸ " +"ਦਿੱਤਾ ਜਾਵੇਗਾ। ਇਹ ਕੁੰਜੀ ਚੋਣ-ਬਾਕਸ ਦੀ ਸਥਿਤੀ ਨੂੰ ਡਿਫਾਲਟ ਲਈ ਸੈੱਟ ਕਰਦੀ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "ਕੀ ਡਿਫਾਲਟ ਬਲੂਟੁੱਥ ਅਡੈਪਟਰ ਇਸ ਨਾਲ ਸਬੰਧਿਤ ਡਿਵਾਈਸਾਂ ਲਈ ਸੈੱਟ ਅੱਪ ਕੀਤਾ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"ਸ਼ੈੱਲ ਬਲੂਟੁੱਥ ਮੇਨੂ ਆਈਟਮ ਨੂੰ ਕੇਵਲ ਤਾਂ ਹੀ ਦਿਖਾਏਗੀ, ਜੇ ਬਲੂਟੁੱਥ ਅਡੈਪਟਰ ਚਾਲੂ ਹੈ ਜਾਂ" +" ਡਿਫਾਲਟ ਅਡੈਪਟਰ ਨਾਲ " +"ਸੰਬੰਧਿਤ ਡਿਵਾਈਸ ਸੈਟਅੱਪ ਮੌਜੂਦ ਹੈ। ਇਸ ਨੂੰ ਮੁੜ-ਸੈੱਟ ਕੀਤਾ ਜਾਵੇਗਾ, ਜੇ ਡਿਫਾਲਟ ਅਡੈਪਟਰ" +" ਨੂੰ ਇਸ ਨਾਲ " +"ਸੰਬੰਧਿਤ ਕੀਤਾ ਡਿਵਾਈਸ ਨਾ ਮਿਲਿਆ।" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਮੇਨੂ ਖੋਲ੍ਹਣ ਲਈ ਕੀਬਾਈਡਿੰਗ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਮੇਨੂ ਖੋਲ੍ਹਣ ਲਈ ਕੀਬਾਈਡਿੰਗ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "“ਐਪਲੀਕੇਸ਼ਨ ਵੇਖੋ“ ਮੇਨੂ ਖੋਲ੍ਹਣ ਲਈ ਕੀਬਾਈਡਿੰਗ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "ਸਰਗਰਮੀ ਝਲਕ ਵਿੱਚ “ਐਪਲੀਕੇਸ਼ਨ ਵੇਖੋ“ ਮੇਨੂ ਖੋਲ੍ਹਣ ਲਈ ਕੀਬਾਈਡਿੰਗ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "ਸੰਖੇਪ ਖੋਲ੍ਹਣ ਲਈ ਕੀਬਾਈਡਿੰਗ" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "ਸਰਗਰਮੀ ਸੰਖੇਪ ਖੋਲ੍ਹਣ ਲਈ ਕੀਬਾਈਡਿੰਗ" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੂਚੀ ਦੀ ਦਿੱਖਣ ਨੂੰ ਬਦਲਣ ਲਈ ਕੀਬਾਈਡਿੰਗ" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੂਚੀ ਦੀ ਦਿੱਖਣ ਨੂੰ ਬਦਲਣ ਲਈ ਕੀਬਾਈਡਿੰਗ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "ਸਰਗਰਮ ਸੂਚਨਾ ਉੱਤੇ ਫੋਕਸ ਲਈ ਕੀਬਾਈਡਿੰਗ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "ਸਰਗਰਮ ਸੂਚਨਾ ਉੱਤੇ ਫੋਕਸ ਲਈ ਕੀਬਾਈਡਿੰਗ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"ਕੀਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਡੀਬੱਗ ਕਰਨ ਵਾਸਤੇ ਸਭ ਚੱਲ ਰਹੀਆਂ ਟਵੀਨਸ ਨੂੰ ਰੌਕਦੀ ਅਤੇ ਚਲਾਉਂਦੀ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Which keyboard to use" +msgstr "ਕਿਹੜਾ ਕੀਬੋਰਡ ਵਰਤਣਾ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:155 +msgid "The type of keyboard to use." +msgstr "ਵਰਤਣ ਲਈ ਕੀਬੋਰਡ ਦੀ ਕਿਸਮ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:166 +#: data/org.gnome.shell.gschema.xml.in:193 +msgid "Limit switcher to current workspace." +msgstr "ਸਵਿੱਚਰ ਨੂੰ ਮੌਜੂਦਾ ਵਰਕਸਪੇਸ ਤੱਕ ਸੀਮਿਤ ਕਰੋ।" + +#: data/org.gnome.shell.gschema.xml.in:167 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"ਜੇ ਠੀਕ ਹੈ ਤਾਂ ਕੇਵਲ ਐਪਲੀਕੇਸ਼ਨ ਜਿਹਨਾਂ ਲਈ ਵਿੰਡੋ ਮੌਜੂਦਾ ਵਰਕਸਪੇਸ ਵਿੱਚ ਹਨ ਨੂੰ ਹੀ" +" ਸਵਿੱਚਰ ਵਿੱਚ ਵਿਖਾਇਆ " +"ਜਾਂਦਾ ਹੈ, ਨਹੀਂ ਤਾਂ ਸਭ ਐਪਲੀਕੇਸ਼ਨਾਂ ਸ਼ਾਮਿਲ ਹੁੰਦੀਆਂ ਹਨ।" + +#: data/org.gnome.shell.gschema.xml.in:184 +msgid "The application icon mode." +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਆਈਕਾਨ ਮੋਡ।" + +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"ਸੰਰਚਨਾ ਕਰੋ ਕਿ ਸਵਿੱਚਰ ਵਿੱਚ ਵਿੰਡੋਜ਼ ਕਿਵੇਂ ਵੇਖਾਈਆਂ ਜਾਣ। ਸੰਭਵ ਚੋਣਾਂ ਹਨ ਕੇਵਲ ਥੰਮਨੇਲ" +" (“thumbnail-" +"only“) (ਵਿੰਡੋ ਦਾ ਥੰਮਨੇਲ ਵੇਖਾਇਆ ਜਾਵੇਗਾ), ਕੇਵਲ ਐਪਸ ਆਈਕਾਨ (“app-icon-only“)" +" (ਕੇਵਲ " +"ਐਪਲੀਕੇਸ਼ਨ ਆਈਕਾਨ ਵੇਖਾਇਆ ਜਾਵੇਗਾ) ਜਾਂ ਦੋਵੇਂ (“both“)" + +#: data/org.gnome.shell.gschema.xml.in:194 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"ਜੇ ਠੀਕ ਹੈ ਤਾਂ ਕੇਵਲ ਮੌਜੂਦਾ ਵਰਕਸਪੇਸ ਤੋਂ ਵਿੰਡੋ ਨੂੰ ਹੀ ਸਵਿੱਚਰ ਵਿੱਚ ਵਿਖਾਇਆ ਜਾਂਦਾ" +" ਹੈ, ਨਹੀਂ ਤਾਂ ਸਭ ਵਿੰਡੋ " +"ਸ਼ਾਮਿਲ ਹੁੰਦੀਆਂ ਹਨ।" + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Attach modal dialog to the parent window" +msgstr "ਮੂਲ ਵਿੰਡੋ ਵਿੱਚ ਮਾਡਲ ਡਾਈਲਾਗ ਜੋੜੋ" + +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:216 +#: data/org.gnome.shell.gschema.xml.in:224 +#: data/org.gnome.shell.gschema.xml.in:232 +#: data/org.gnome.shell.gschema.xml.in:240 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"ਇਹ ਕੁੰਜੀ ਗਨੋਮ ਸ਼ੈੱਲ ਚੱਲਣ ਦੇ ਦੌਰਾਨ org.gnome.mutter ਕੁੰਜੀ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰਦੀ ਹੈ।" + +#: data/org.gnome.shell.gschema.xml.in:215 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "ਕੋਨਾ ਟਿੱਲ ਨੂੰ ਚਾਲੂ ਕਰੋ, ਜਦੋਂ ਵਿੰਡੋ ਸਕਰੀਨ ਕੋਨਿਆਂ ਤੋਂ ਹਿਲਦੀ ਹੈ" + +#: data/org.gnome.shell.gschema.xml.in:223 +msgid "Workspaces are managed dynamically" +msgstr "ਵਰਕਸਪੇਸ ਚੱਲਦੇ ਰੂਪ ਵਿੱਚ ਰੱਖੇ ਜਾਂਦੇ ਹਨ" + +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "Workspaces only on primary monitor" +msgstr "ਪ੍ਰਾਈਮਰੀ ਮਾਨੀਟਰ ਉੱਤੇ ਕੇਵਲ ਵਰਕਸਪੇਸ" + +#: data/org.gnome.shell.gschema.xml.in:239 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "ਪੁਆਇੰਟਰ ਦੇ ਹਿਲਣ ਤੋਂ ਰੁਕਣ ਤੱਕ ਮਾਊਸ ਮੋਡ ਵਿੱਚ ਫੋਕਸ ਬਦਲਾਅ ਵਿੱਚ ਦੇਰੀ" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "ਨੈੱਟਵਰਕ ਲਾਗਇਨ" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:109 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s ਲਈ ਪਸੰਦ ਡਾਈਲਾਗ ਨੂੰ ਲੋਡ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ:" + +#: js/gdm/authPrompt.js:143 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:331 js/ui/status/network.js:895 +msgid "Cancel" +msgstr "ਰੱਦ ਕਰੋ" + +#: js/gdm/authPrompt.js:162 js/gdm/authPrompt.js:205 js/gdm/authPrompt.js:437 +msgid "Next" +msgstr "ਅੱਗੇ" + +#: js/gdm/authPrompt.js:201 js/ui/shellMountOperation.js:335 +#: js/ui/unlockDialog.js:56 +msgid "Unlock" +msgstr "ਅਣ-ਲਾਕ" + +#: js/gdm/authPrompt.js:203 +msgctxt "button" +msgid "Sign In" +msgstr "ਸਾਇਨ ਇਨ" + +#: js/gdm/loginDialog.js:312 +msgid "Choose Session" +msgstr "ਸ਼ੈਸ਼ਨ ਚੁਣੋ" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:455 +msgid "Not listed?" +msgstr "ਲਿਸਟ ਵਿੱਚ ਨਹੀਂ ਹੈ?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:889 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ਜਿਵੇਂ ਕਿ ਵਰਤੋਂਕਾਰ ਜਾਂ %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:894 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "ਵਰਤੋਂਂਕਾਰ ਨਾਂ: " + +#: js/gdm/loginDialog.js:1232 +msgid "Login Window" +msgstr "ਲਾਗਇਨ ਵਿੰਡੋ" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "ਪਰਮਾਣਕਿਤਾ ਗਲਤੀ" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(ਜਾਂ ਉਂਗਲ ਰੱਖੋ)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "ਬੰਦ ਕਰੋ" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +msgid "power off;shutdown;reboot;restart" +msgstr "ਬੰਦ ਕਰੋ;ਪਾਵਰ ਆਫ਼;ਮੁੜ-ਚਾਲੂ ਕਰੋ;ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ;ਰੀਸਟਾਰਟ" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:101 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:104 +msgid "lock screen" +msgstr "ਸਕਰੀਨ ਲਾਕ" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "ਲਾਗ ਆਉਟ" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "ਲਾਗਆਉਟ;ਸਾਈਨ ਆਫ਼;ਲਾਗ-ਆਉਟ" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "ਸਸਪੈਂਡ ਕਰੋ" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "ਸਸਪੈਂਡ;ਸਲੀਪ" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +msgid "Switch User" +msgstr "ਵਰਤੋਂਂਕਾਰ ਬਦਲੋ" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:125 +msgid "switch user" +msgstr "ਵਰਤੋਂਕਾਰ ਬਦਲੋ" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "ਸਥਿਤੀ ਨੂੰ ਲਾਕ ਕਰੋ" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:132 +msgid "lock orientation;screen;rotation" +msgstr "ਸਥਿਤੀ ਲਾਕ ਕਰੋ;ਸਕਰੀਨ;ਘੁੰਮਾਉਣਾ;ਘੁੰਮਾਓ" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "ਕਮਾਂਡ ਨਹੀਂ ਲੱਭੀ" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "ਕਮਾਂਡ ਪਾਰਸ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” ਚਲਾਉਣ ਲਈ ਫੇਲ੍ਹ:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "ਹੁਣੇ ਹੀ" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ" +msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ" +msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "ਕੱਲ੍ਹ" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ" +msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ" +msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d ਮਹੀਨਾ ਪਹਿਲਾਂ" +msgstr[1] "%d ਮਹੀਨੇ ਪਹਿਲਾਂ" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d ਸਾਲ ਪਹਿਲਾਂ" +msgstr[1] "%d ਸਾਲ ਪਹਿਲਾਂ" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "ਕੱਲ੍ਹ, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +#| msgid "%B %d, %H∶%M" +msgid "%B %-d, %H∶%M" +msgstr "%-d %B %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +#| msgid "%B %d %Y, %H∶%M" +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "ਕੱਲ੍ਹ, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +#| msgid "%B %d, %l∶%M %p" +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +#| msgid "%B %d %Y, %l∶%M %p" +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "ਹਾਟਸਪਾਟ ਲਾਗਇਨ" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"ਇਸ ਹਾਟਸਪਾਟ ਨਾਲ ਤੁਹਾਡਾ ਕਨੈਕਸ਼ਨ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਹੈ। ਇਸ ਸਫ਼ੇ ਉੱਤੇ ਤੁਹਾਡੇ ਵਲੋਂ ਭਰੇ ਗਏ" +" ਪਾਸਵਰਡ ਜਾਂ " +"ਦਿੱਤੀ ਹੋਰ ਜਾਣਾਕਰੀ ਨੂੰ ਨੇੜਲੇ ਲੋਕਾਂ ਵਲੋਂ ਵੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "ਪਹੁੰਚ ਉੱਤ ਪਾਬੰਦੀ" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "ਪਹੁੰਚ ਲਈ ਮਨਜ਼ੂਰੀ" + +#: js/ui/appDisplay.js:775 +msgid "Frequently used applications will appear here" +msgstr "ਆਮ ਵਰਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨ ਇੱਥੇ ਵਿਖਾਈ ਦੇਣਗੀਆਂ" + +#: js/ui/appDisplay.js:890 +msgid "Frequent" +msgstr "ਅਕਸਰ" + +#: js/ui/appDisplay.js:897 +msgid "All" +msgstr "ਸਭ" + +#: js/ui/appDisplay.js:1854 +msgid "New Window" +msgstr "ਨਵੀਂ ਵਿੰਡੋ" + +#: js/ui/appDisplay.js:1868 +msgid "Launch using Dedicated Graphics Card" +msgstr "ਵੱਖਰੇ ਗਰਾਫ਼ਿਕਸ ਕਾਰਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਚਲਾਓ" + +#: js/ui/appDisplay.js:1895 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ" + +#: js/ui/appDisplay.js:1901 +msgid "Add to Favorites" +msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ" + +#: js/ui/appDisplay.js:1911 +msgid "Show Details" +msgstr "ਵੇਰਵਾ ਵੇਖੋ" + +#: js/ui/appFavorites.js:138 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।" + +#: js/ui/appFavorites.js:172 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਤੋਂ ਹਟਾਇਆ ਜਾ ਚੁੱਕਿਆ ਹੈ।" + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "ਆਡੀਓ ਜੰਤਰ ਨੂੰ ਚੁਣੋ" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "ਸਾਊਂਡ ਸੈਟਿੰਗਾਂ" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "ਹੈੱਡਫ਼ੋਨ" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "ਹੈੱਡਸੈੱਟ" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "ਮਾਈਕਰੋਫੋਨ" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "…ਬੈਕਗਰਾਊਂਡ ਬਦਲੋ" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "ਡਿਸਪਲੇਅ ਸੈਟਿੰਗਾਂ" + +#: js/ui/backgroundMenu.js:18 +msgid "Settings" +msgstr "ਸੈਟਿੰਗਾਂ" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:43 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:72 +msgctxt "grid sunday" +msgid "S" +msgstr "ਐ" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:74 +msgctxt "grid monday" +msgid "M" +msgstr "ਸੋ" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:76 +msgctxt "grid tuesday" +msgid "T" +msgstr "ਮੰ" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:78 +msgctxt "grid wednesday" +msgid "W" +msgstr "ਬੁੱ" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:80 +msgctxt "grid thursday" +msgid "T" +msgstr "ਵੀ" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:82 +msgctxt "grid friday" +msgid "F" +msgstr "ਸ਼ੁੱ" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:84 +msgctxt "grid saturday" +msgid "S" +msgstr "ਸ਼" + +#. * +#. * 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:347 +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:357 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:414 +msgid "Previous month" +msgstr "ਪਿੱਛੇ ਮਹੀਨੇ" + +#: js/ui/calendar.js:425 +msgid "Next month" +msgstr "ਅਗਲੇ ਮਹੀਨੇ" + +#: js/ui/calendar.js:579 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:634 +msgid "Week %V" +msgstr "ਹਫ਼ਤਾ %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:702 +msgctxt "event list time" +msgid "All Day" +msgstr "ਸਭ ਦਿਨ" + +#: js/ui/calendar.js:834 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d %B" + +#: js/ui/calendar.js:838 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d, %Y" +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d %B %Y" + +#: js/ui/calendar.js:1061 +msgid "No Notifications" +msgstr "ਕੋਈ ਨੋਟੀਫਿਕੇਸ਼ਨ" + +#: js/ui/calendar.js:1064 +msgid "No Events" +msgstr "ਕੋਈ ਘਟਨਾ ਨਹੀਂ" + +#: js/ui/calendar.js:1090 +#| msgid "Clear All" +msgid "Clear" +msgstr "ਸਾਫ਼ ਕਰੋ" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” ਜਵਾਬ ਨਹੀਂ ਦਿੰਦਾ ਹੈ।" + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"ਤੁਸੀਂ ਇਸ ਲਈ ਕੁਝ ਸਮੇਂ ਵਾਸਤੇ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕਾਰਜ ਨੂੰ ਧੱਕੇ ਨਾਲ ਬੰਦ ਕਰ ਸਕਦੇ" +" ਹੋ।" + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "ਧੱਕੇ ਨਾਲ ਬੰਦ ਕਰੋ" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "ਉਡੀਕੋ" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "ਬਾਹਰੀ ਡਰਾਇਵ ਕਨੈਕਟ ਹੋਈ" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "ਬਾਹਰੀ ਡਰਾਇਵ ਡਿਸ-ਕਨੈਕਟ ਹੈ" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "%s ਨਾਲ ਖੋਲ੍ਹੋ" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "ਪਾਸਵਰਡ:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"ਬਦਲੇ ਰੂਪ ਵਿੱਚ ਤੁਸੀਂ ਆਪਣੇ ਰਾਊਂਟਰ ਉੱਤੇ \"WPS\" ਬਟਨ ਨੂੰ ਦਬਾ ਕੇ ਕਨੈਕਟ ਕਰ ਸਕਦੇ ਹੋ।" + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:226 +#: js/ui/status/network.js:316 js/ui/status/network.js:898 +msgid "Connect" +msgstr "ਕਨੈਕਟ ਕਰੋ" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "ਪਾਸਵਰਡ: " + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "ਸਵਿੱਚ: " + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ ਪਾਸਵਰਡ: " + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "ਪਛਾਣ: " + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "ਸਰਵਿਸ: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "ਬੇਤਾਰ ਨੈੱਟਵਰਕ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "ਬੇਤਾਰ ਨੈੱਟਵਰਕ “%s” ਵਰਤਣ ਲਈ ਪਾਸਵਰਡ ਜਾਂ ਇੰਕ੍ਰਿਪਸ਼ਨ ਕੁੰਜੀਆਂ ਦੀ ਲੋੜ ਹੈ।" + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "ਤਾਰ 802.1X ਪਰਮਾਣਕਿਤਾ" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "ਨੈੱਟਵਰਕ ਨਾਂ: " + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "DSL ਪਰਮਾਣਕਿਤਾ" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "PIN ਕੋਡ ਲੋੜੀਦਾ ਹੈ" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +msgid "PIN code is needed for the mobile broadband device" +msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਜੰਤਰ ਲਈ ਪਿੰਨ ਕੋਡ ਚਾਹੀਦਾ ਹੈ" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "ਪਿੰਨ:" + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਨੈੱਟਵਰਕ ਪਾਸਵਰਡ" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s” ਨਾਲ ਕੁਨੈਕਟ ਹੋਣ ਲਈ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ। " + +#: js/ui/components/networkAgent.js:682 js/ui/status/network.js:1672 +msgid "Network Manager" +msgstr "ਨੈੱਟਵਰਕ ਮੈਨੇਜਰ" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "ਪਰਸ਼ਾਸ਼ਕ" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "ਪਰਮਾਣਿਤ" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:315 +msgid "Sorry, that didn’t work. Please try again." +msgstr "ਅਫਸੋਸ, ਉਹ ਕੰਮ ਨਹੀਂ ਕਰਦਾ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:786 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s ਨੂੰ ਹੁਣ %s ਵਜੋਂ ਜਾਣਿਆ ਜਾਵੇਗਾ" + +#: js/ui/ctrlAltTab.js:26 js/ui/viewSelector.js:177 +msgid "Windows" +msgstr "ਵਿੰਡੋ" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +msgid "Show Applications" +msgstr "ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੇਖੋ" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:397 +msgid "Dash" +msgstr "ਡੈਸ਼" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:73 +#| msgid "%B %e %Y" +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:80 +msgid "%A %B %e %Y" +msgstr "%A, %e %B %Y" + +#: js/ui/dateMenu.js:142 +msgid "Add world clocks…" +msgstr "...ਸੰਸਾਰ ਘੜੀਆਂ ਜੋੜੋ" + +#: js/ui/dateMenu.js:143 +msgid "World Clocks" +msgstr "ਸੰਸਾਰ ਘੜੀਆਂ" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "ਮੌਸਮ" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:286 +#, javascript-format +msgid "%s all day." +msgstr "ਸਾਰਾ ਦਿਨ %s।" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:292 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, ਤਦ ਬਾਅਦ ਵਿੱਚ %s।" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:298 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, ਤਦ %s, ਉਸ ਤੋਂ ਬਾਅਦ %s।" + +#: js/ui/dateMenu.js:309 +msgid "Select a location…" +msgstr "…ਟਿਕਾਣਾ ਚੁਣੋ" + +#: js/ui/dateMenu.js:312 +msgid "Loading…" +msgstr "…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:318 +#, javascript-format +msgid "Feels like %s." +msgstr "%s ਵਾਂਗੂੰ ਮਹਿਸੂਸ ਹੁੰਦਾ ਹੈ।" + +#: js/ui/dateMenu.js:321 +msgid "Go online for weather information" +msgstr "ਮੌਸਮ ਦੀ ਜਾਣਕਾਰੀ ਲਈ ਆਨਲਾਈਨ ਜਾਓ" + +#: js/ui/dateMenu.js:323 +msgid "Weather information is currently unavailable" +msgstr "ਮੌਸਮ ਦੀ ਜਾਣਕਾਰੀ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s ਲਾਗਆਉਟ" + +#: js/ui/endSessionDialog.js:51 +msgctxt "title" +msgid "Log Out" +msgstr "ਲਾਗਆਉਟ" + +#: js/ui/endSessionDialog.js:53 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s ਨੂੰ %d ਸਕਿੰਟ ਵਿੱਚ ਆਪਣੇ-ਆਪ ਹੀ ਲਾਗ ਆਉਟ ਕੀਤਾ ਜਾਵੇਗਾ।" +msgstr[1] "%s ਨੂੰ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਆਪਣੇ-ਆਪ ਹੀ ਲਾਗ ਆਉਟ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#: js/ui/endSessionDialog.js:58 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "ਤੁਹਾਨੂੰ %d ਸਕਿੰਟ ਵਿੱਚ ਆਪਣੇ-ਆਪ ਹੀ ਲਾਗਆਉਟ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।" +msgstr[1] "ਤੁਹਾਨੂੰ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਆਪਣੇ-ਆਪ ਹੀ ਲਾਗਆਉਟ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।" + +#: js/ui/endSessionDialog.js:64 +msgctxt "button" +msgid "Log Out" +msgstr "ਲਾਗਆਉਟ" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Power Off" +msgstr "ਬੰਦ ਕਰੋ" + +#: js/ui/endSessionDialog.js:71 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰੋ ਤੇ ਬੰਦ ਕਰੋ" + +#: js/ui/endSessionDialog.js:73 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "ਸਿਸਟਮ ਨੂੰ ਆਪਣੇ-ਆਪ ਹੀ %d ਸਕਿੰਟ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ।" +msgstr[1] "ਸਿਸਟਮ ਨੂੰ ਆਪਣੇ-ਆਪ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#: js/ui/endSessionDialog.js:77 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "ਬਾਕੀ ਰਹਿੰਦੇ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰੋ" + +#: js/ui/endSessionDialog.js:80 js/ui/endSessionDialog.js:97 +msgctxt "button" +msgid "Restart" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ" + +#: js/ui/endSessionDialog.js:82 +msgctxt "button" +msgid "Power Off" +msgstr "ਬੰਦ ਕਰੋ" + +#: js/ui/endSessionDialog.js:89 +msgctxt "title" +msgid "Restart" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ" + +#: js/ui/endSessionDialog.js:91 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "ਸਿਸਟਮ ਨੂੰ ਆਪਣੇ-ਆਪ ਹੀ %d ਸਕਿੰਟ ਵਿੱਚ ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾਵੇਗਾ।" +msgstr[1] "ਸਿਸਟਮ ਨੂੰ ਆਪਣੇ-ਆਪ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#: js/ui/endSessionDialog.js:105 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ ਤੇ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰੋ" + +#: js/ui/endSessionDialog.js:107 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"ਸਿਸਟਮ ਨੂੰ ਆਪਣੇ-ਆਪ ਹੀ %d ਸਕਿੰਟ ਵਿੱਚ ਮੁੜ-ਚਾਲੂ ਅਤੇ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕੀਤੇ ਜਾਣਗੇ।" +msgstr[1] "" +"ਸਿਸਟਮ ਨੂੰ ਆਪਣੇ-ਆਪ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਮੁੜ-ਚਾਲੂ ਅਤੇ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕੀਤੇ ਜਾਣਗੇ।" + +#: js/ui/endSessionDialog.js:113 js/ui/endSessionDialog.js:133 +msgctxt "button" +msgid "Restart & Install" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ ਅਤੇ ਇੰਸਟਾਲ ਕਰੋ" + +#: js/ui/endSessionDialog.js:114 +msgctxt "button" +msgid "Install & Power Off" +msgstr "ਇੰਸਟਾਲ ਕਰੋ ਅਤੇ ਬੰਦ ਕਰੋ" + +#: js/ui/endSessionDialog.js:115 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਦੇ ਬਾਅਦ ਬੰਦ ਕਰੋ" + +#: js/ui/endSessionDialog.js:123 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ ਤੇ ਅੱਪਗਰੇਡ ਇੰਸਟਾਲ ਕਰੋ" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:128 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"ਮੁੜ-ਚਾਲੂ ਹੋਣ ਦੇ ਬਾਅਦ %s %s ਨੂੰ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ। ਅੱਪਗਰੇਡ ਇੰਸਟਾਲੇਸ਼ਨ ਨੂੰ ਲੰਮਾ" +" ਸਮਾਂ ਲੱਗ ਸਕਦਾ " +"ਹੈ: ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਬੈਕਅੱਪ ਲੈ ਲਿਆ ਹੈ ਅਤੇ ਕੰਪਿਊਟਰ ਦਾ ਪਲੱਗ ਲੱਗਾ ਹੈ।" + +#: js/ui/endSessionDialog.js:317 +msgid "Running on battery power: please plug in before installing updates." +msgstr "ਬੈਟਰੀ ਉੱਤੇ ਚੱਲ ਰਿਹਾ ਹੈ: ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਲੱਗ ਲਗਾਉ ਜੀ।" + +#: js/ui/endSessionDialog.js:334 +msgid "Some applications are busy or have unsaved work." +msgstr "ਕੁਝ ਐਪਲੀਕੇਸ਼ਨ ਰੁੱਝੀਆਂ ਹਨ ਜਾਂ ਕੁਝ ਨਾ-ਸੰਭਾਲਿਆ ਕੰਮ ਪਿਆ ਹੈ।" + +#: js/ui/endSessionDialog.js:341 +msgid "Other users are logged in." +msgstr "ਹੋਰ ਵਰਤੋਂਕਾਰ ਲਾਗਇਨ ਹੈ।" + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:622 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (ਰਿਮੋਟ)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:625 +#, javascript-format +msgid "%s (console)" +msgstr "%s (ਕਨਸੋਲ)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "ਇੰਸਟਾਲ ਕਰੋ" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "ਕੀ extensions.gnome.org ਤੋਂ “%s” ਡਾਊਨਲੋਡ ਅਤੇ ਇੰਸਟਾਲ ਕਰਨੀ ਹੈ?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s ਸ਼ਾਰਟਕੱਟਾਂ ਲਈ ਰੁਕਾਵਟ ਚਾਹੁੰਦੀ ਹੈ" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਸ਼ਾਰਟਕੱਟਾਂ ਲਈ ਰੁਕਾਵਟ ਚਾਹੁੰਦੀ ਹੈ" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "ਤੁਸੀਂ ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ %s ਦਬਾ ਕੇ ਬਹਾਲ ਕਰ ਸਕਦੇ ਹੋ।" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "ਇਨਕਾਰ" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "ਮਨਜ਼ੂਰ" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "ਹੌਲੀ ਸਵਿੱਚਾਂ ਚਾਲੂ ਕੀਤੀਆਂ" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "ਹੌਲੀ ਸਵਿੱਚਾਂ ਬੰਦ ਕੀਤੀਆਂ" + +#: js/ui/kbdA11yDialog.js:34 +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 "" +"ਤੁਸੀ ਸਿਫਟ (Shift) ਸਵਿੱਚ ਨੂੰ ਸਿਰਫ 8 ਸਕਿੰਟਾਂ ਲਈ ਦਬਾਉਣਾ ਹੈ। ਇਹ ਹੌਲੀ-ਸਵਿੱਚ ਫੀਚਰ" +" ਦਾ ਸ਼ਾਰਟਕੱਟ " +"ਹੈ, ਜੋ ਕਿ ਤੁਹਾਡੇ ਕੀ-ਬੋਰਡ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਢੰਗ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰੇਗਾ।" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned On" +msgstr "ਸਟਿੱਕੀ ਸਵਿੱਚਾਂ ਚਾਲੂ ਕੀਤੀਆਂ" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "ਸਟਿੱਕੀ ਸਵਿੱਚਾਂ ਬੰਦ ਕੀਤੀਆਂ" + +#: js/ui/kbdA11yDialog.js:44 +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 "" +"ਤੁਸੀ ਸਿਫਟ (Shift) ਸਵਿੱਚ ਨੂੰ ਸਿਰਫ 5 ਵਾਰ ਦਬਾਉਣਾ ਹੈ। ਇਹ ਸਟਿੱਕੀ-ਸਵਿੱਚ ਫੀਚਰ ਦਾ" +" ਸ਼ਾਰਟਕੱਟ ਹੈ, " +"ਜੋ ਕਿ ਤੁਹਾਡੇ ਕੀ-ਬੋਰਡ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਢੰਗ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰੇਗਾ।" + +#: js/ui/kbdA11yDialog.js:46 +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 "" +"ਤੁਸੀ ਲਗਾਤਾਰ ਦੋ ਕੀ ਇੱਕ ਵਾਰ ਦਬਾ ਸਕਦੇ ਹੋ ਜਾਂ ਸਿਫਟ (Shift) ਸਵਿੱਚ ਨੂੰ 5 ਵਾਰ ਇਹ" +" ਸਟਿੱਕੀ ਸਵਿੱਚ " +"ਫੀਚਰ ਨੂੰ ਚਾਲੂ ਕਰ ਸਕਦੇ ਹੋ, ਜੋ ਕਿ ਤੁਹਾਡਾ ਕੀ-ਬੋਰਡ ਤੇ ਕੰਮ ਕਰਨ ਦੇ ਢੰਗ ਨੂੰ ਤਬਦੀਲ" +" ਕਰਦਾ ਹੈ।" + +#: js/ui/kbdA11yDialog.js:58 +msgid "Leave On" +msgstr "ਚਾਲੂ ਛੱਡੋ" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1271 +msgid "Turn On" +msgstr "ਚਾਲੂ ਕਰੋ" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:135 js/ui/status/network.js:317 +#: js/ui/status/network.js:1271 js/ui/status/network.js:1383 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "ਬੰਦ ਕਰੋ" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "ਬੰਦ ਰਹਿਣ ਦਿਓ" + +#: js/ui/keyboard.js:191 +msgid "Region & Language Settings" +msgstr "ਖੇਤਰ ਅਤੇ ਭਾਸ਼ਾ ਸੈਟਿੰਗਾਂ" + +#: js/ui/lookingGlass.js:628 +msgid "No extensions installed" +msgstr "ਕੋਈ ਇਕਸਟੈਨਸ਼ਨ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:682 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ਨੇ ਕੋਈ ਗਲਤੀ ਨਹੀਂ ਦਿੱਤੀ।" + +#: js/ui/lookingGlass.js:688 +msgid "Hide Errors" +msgstr "ਗਲਤੀਆਂ ਓਹਲੇ ਕਰੋ" + +#: js/ui/lookingGlass.js:692 js/ui/lookingGlass.js:752 +msgid "Show Errors" +msgstr "ਗਲਤੀਆਂ ਵੇਖਾਓ" + +#: js/ui/lookingGlass.js:701 +msgid "Enabled" +msgstr "ਚਾਲੂ ਹੈ" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:704 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "ਬੰਦ ਹੈ" + +#: js/ui/lookingGlass.js:706 +msgid "Error" +msgstr "ਗਲਤੀ" + +#: js/ui/lookingGlass.js:708 +msgid "Out of date" +msgstr "ਪੁਰਾਣਾ" + +#: js/ui/lookingGlass.js:710 +msgid "Downloading" +msgstr "ਡਾਊਨਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#: js/ui/lookingGlass.js:734 +msgid "View Source" +msgstr "ਸਰੋਤ ਵੇਖੋ" + +#: js/ui/lookingGlass.js:743 +msgid "Web Page" +msgstr "ਵੈੱਬ ਪੇਜ਼" + +#: js/ui/messageTray.js:1460 +msgid "System Information" +msgstr "ਸਿਸਟਮ ਜਾਣਕਾਰੀ" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "ਅਣਪਛਾਤਾ ਕਲਾਕਾਰ" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "ਅਣਪਛਾਤਾ ਟਾਈਟਲ" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "ਵਾਲੀਅਮ" + +#: js/ui/overview.js:80 +msgid "Undo" +msgstr "ਵਾਪਸ" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:107 +msgid "Overview" +msgstr "ਸੰਖੇਪ" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:234 +msgid "Type to search…" +msgstr "…ਲੱਭਣ ਲਈ ਲਿਖੋ" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "...ਨਵਾਂ ਸ਼ਾਰਟਕੱਟ" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "ਨਿਰਧਾਰਿਤ ਕੀਤੀ ਐਪਲੀਕੇਸ਼ਨ" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "ਆਨ-ਸਕਰੀਨ ਮਦਦ ਵੇਖਾਓ" + +#: js/ui/padOsd.js:153 +msgid "Switch monitor" +msgstr "ਮਾਨੀਟਰ ਨੂੰ ਬਦਲੋ" + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "ਕੀ-ਸਟਰੋਕ ਦਿਓ" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "ਮੁਕੰਮਲ" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "…ਸੋਧੋ" + +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "ਕੋਈ ਨਹੀਂ" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "ਸੰਰਚਨਾ ਲਈ ਬਟਨ ਨੂੰ ਦੱਬੋ" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "ਬਾਹਰ ਜਾਣ ਲਈ ਕੋਈ ਵੀ Esc ਦੱਬੋ" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "ਬਾਹਰ ਜਾਣ ਲਈ ਕੋਈ ਵੀ ਸਵਿੱਚ ਦੱਬੋ" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "ਬਾਹਰ" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:410 +msgid "Activities" +msgstr "ਸਰਗਰਮੀਆਂ" + +#: js/ui/panel.js:685 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "ਸਿਸਟਮ" + +#: js/ui/panel.js:808 +msgid "Top Bar" +msgstr "ਉੱਤਲੀ ਪੱਟੀ" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:290 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "ਕਮਾਂਡ ਦਿਓ" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:170 +msgid "Close" +msgstr "ਬੰਦ ਕਰੋ" + +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "ਵੇਅਲੈਂਡ ਉੱਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ ਉਪਲਬਧ ਨਹੀਂ" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "...ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d ਨਵਾਂ ਸੁਨੇਹਾ" +msgstr[1] "%d ਨਵੇਂ ਸੁਨੇਹੇ" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ਨਵਾਂ ਸੂਚਨਾ" +msgstr[1] "%d ਨਵੀਆਂ ਸੂਚਨਾਵਾਂ" + +#: js/ui/screenShield.js:443 js/ui/status/system.js:291 +msgid "Lock" +msgstr "ਲਾਕ" + +#: js/ui/screenShield.js:707 +msgid "GNOME needs to lock the screen" +msgstr "ਗਨੋਮ ਨੂੰ ਸਕਰੀਨ ਲਾਕ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:828 js/ui/screenShield.js:1301 +msgid "Unable to lock" +msgstr "ਅਣਲਾਕ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#: js/ui/screenShield.js:829 js/ui/screenShield.js:1302 +msgid "Lock was blocked by an application" +msgstr "ਲਾਕ ਨੂੰ ਐਪਲੀਕੇਸ਼ਨ ਵਲੋਂ ਪਾਬੰਦੀ ਲਗਾਈ" + +#: js/ui/search.js:645 +msgid "Searching…" +msgstr "…ਖੋਜ ਜਾਰੀ ਹੈ" + +#: js/ui/search.js:647 +msgid "No results." +msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ।" + +#: js/ui/search.js:771 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d ਹੋਰ" +msgstr[1] "%d ਹੋਰ" + +#: js/ui/shellEntry.js:21 +msgid "Copy" +msgstr "ਕਾਪੀ ਕਰੋ" + +#: js/ui/shellEntry.js:26 +msgid "Paste" +msgstr "ਚੇਪੋ" + +#: js/ui/shellEntry.js:92 +msgid "Show Text" +msgstr "ਟੈਕਸਟ ਵੇਖੋ" + +#: js/ui/shellEntry.js:94 +msgid "Hide Text" +msgstr "ਟੈਕਸਟ ਓਹਲੇ" + +#: js/ui/shellMountOperation.js:302 +msgid "Password" +msgstr "ਪਾਸਵਰਡ" + +#: js/ui/shellMountOperation.js:323 +msgid "Remember Password" +msgstr "ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ" + +#: js/ui/status/accessibility.js:40 +msgid "Accessibility" +msgstr "ਅਸੈੱਸਬਿਲਟੀ" + +#: js/ui/status/accessibility.js:55 +msgid "Zoom" +msgstr "ਜ਼ੂਮ" + +#: js/ui/status/accessibility.js:62 +msgid "Screen Reader" +msgstr "ਸਕਰੀਨ ਰੀਡਰ" + +#: js/ui/status/accessibility.js:66 +msgid "Screen Keyboard" +msgstr "ਸਕਰੀਨ ਕੀਬੋਰਡ" + +#: js/ui/status/accessibility.js:70 +msgid "Visual Alerts" +msgstr "ਦਿੱਖ ਚੇਤਾਵਨੀ" + +#: js/ui/status/accessibility.js:73 +msgid "Sticky Keys" +msgstr "ਸਟਿੱਕੀ ਸਵਿੱਚਾਂ" + +#: js/ui/status/accessibility.js:76 +msgid "Slow Keys" +msgstr "ਹੌਲੀ ਸਵਿੱਚਾਂ" + +#: js/ui/status/accessibility.js:79 +msgid "Bounce Keys" +msgstr "ਬਾਊਂਸ ਸਵਿੱਚਾਂ" + +#: js/ui/status/accessibility.js:82 +msgid "Mouse Keys" +msgstr "ਮਾਊਸ ਸਵਿੱਚਾਂ" + +#: js/ui/status/accessibility.js:163 +msgid "High Contrast" +msgstr "ਵੱਧ ਕਨਟਰਾਸਟ" + +#: js/ui/status/accessibility.js:198 +msgid "Large Text" +msgstr "ਵੱਡੇ ਅੱਖਰ" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "ਬਲੂਟੁੱਥ" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:592 +msgid "Bluetooth Settings" +msgstr "ਬਲੂਟੁੱਥ ਸੈਟਿੰਗਾਂ" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d ਕਨੈਕਟ ਹੈ" +msgstr[1] "%d ਕਨੈਕਟ ਹੈ" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "ਬੰਦ" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "ਚਾਲੂ" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "ਚਮਕ" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "ਕੀਬੋਰਡ" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "ਕੀਬੋਰਡ ਲੇਆਉਟ ਵੇਖਾਓ" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "ਟਿਕਾਣਾ ਸਮਰੱਥ ਹੈ" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "ਬੰਦ" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "ਪਰਦੇਦਾਰੀ ਸੈਟਿੰਗਾਂ" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "ਟਿਕਾਣਾ ਵਰਤੋਂ ਵਿੱਚ ਹੈ" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "ਟਿਕਾਣਾ ਅਸਮਰੱਥ ਹੈ" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "ਚਾਲੂ" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "ਕੀ ਆਪਣੇ ਟਿਕਾਣੇ ਲਈ %s ਨੂੰ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"ਟਿਕਾਣਾ ਪਹੁੰਚ ਨੂੰ ਪਰਦੇਦਾਰੀ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ ਕਿਸੇ ਵੀ ਸਮੇਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।" + +#: js/ui/status/network.js:73 +msgid "" +msgstr "<ਅਣਪਛਾਤਾ>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:423 js/ui/status/network.js:1300 +#, javascript-format +msgid "%s Off" +msgstr "%s ਬੰਦ ਹੈ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:426 +#, javascript-format +msgid "%s Connected" +msgstr "%s ਕਨੈਕਟ ਹੈ" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:431 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s ਬਿਨ-ਇੰਤਜ਼ਾਮ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s ਡਿਸ-ਕੁਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:441 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Connecting" +msgstr "%s ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:444 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s ਲਈ ਫਿਰਮਵੇਅਰ ਮੌਜੂਦ ਨਹੀਂ ਹੈ" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:456 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s ਨਾ-ਮੌਜੂਦ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:459 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s ਕਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ" + +#: js/ui/status/network.js:471 +msgid "Wired Settings" +msgstr "ਤਾਰ ਸੈਟਿੰਗਾਂ" + +#: js/ui/status/network.js:513 +msgid "Mobile Broadband Settings" +msgstr "ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਸੈਟਿੰਗਾਂ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:560 js/ui/status/network.js:1297 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s ਹਾਰਡਵੇਅਰ ਅਸਮਰੱਥ ਹੈ" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:564 +#, javascript-format +msgid "%s Disabled" +msgstr "%s ਅਸਮਰੱਥ ਹੈ" + +#: js/ui/status/network.js:604 +msgid "Connect to Internet" +msgstr "ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਕਰੋ" + +#: js/ui/status/network.js:793 +msgid "Airplane Mode is On" +msgstr "ਏਅਰਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੈ" + +#: js/ui/status/network.js:794 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "ਜਦੋਂ ਏਅਰ-ਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੁੰਦਾ ਹੈ ਤਾਂ ਵਾਈ-ਫਾਈ ਬੰਦ ਹੁੰਦਾ ਹੈ" + +#: js/ui/status/network.js:795 +msgid "Turn Off Airplane Mode" +msgstr "ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਕਰੋ" + +#: js/ui/status/network.js:804 +msgid "Wi-Fi is Off" +msgstr "ਵਾਈ-ਫਾਈ ਬੰਦ ਹੈ" + +#: js/ui/status/network.js:805 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "ਨੈੱਟਵਰਕ ਨਾਲ ਕੁਨੈਕਟ ਕਰਨ ਲਈ ਵਾਈ-ਫਾਈ ਨੂੰ ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ" + +#: js/ui/status/network.js:806 +msgid "Turn On Wi-Fi" +msgstr "ਵਾਈ-ਫਾਈ ਚਾਲੂ" + +#: js/ui/status/network.js:831 +msgid "Wi-Fi Networks" +msgstr "ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ" + +#: js/ui/status/network.js:833 +msgid "Select a network" +msgstr "ਨੈੱਟਵਰਕ ਚੁਣੋ" + +#: js/ui/status/network.js:862 +msgid "No Networks" +msgstr "ਕੋਈ ਨੈੱਟਵਰਕ ਨਹੀਂ" + +#: js/ui/status/network.js:883 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "ਬੰਦ ਕਰਨ ਲਈ ਹਾਰਡਵੇਅਰ ਸਵਿੱਚ ਵਰਤੋਂ" + +#: js/ui/status/network.js:1159 +msgid "Select Network" +msgstr "ਨੈੱਟਵਰਕ ਚੁਣੋ" + +#: js/ui/status/network.js:1165 +msgid "Wi-Fi Settings" +msgstr "ਵਾਈ-ਫਾਈ ਸੈਟਿੰਗਾਂ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1288 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s ਹਾਟਸਪਾਟ ਸਰਗਰਮ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1303 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s ਕੁਨੈਕਟ ਨਹੀਂ ਹੈ" + +#: js/ui/status/network.js:1400 +msgid "connecting…" +msgstr "…ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1403 +msgid "authentication required" +msgstr "ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ" + +#: js/ui/status/network.js:1405 +msgid "connection failed" +msgstr "ਕਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ" + +#: js/ui/status/network.js:1455 +msgid "VPN Settings" +msgstr "VPN ਸੈਟਿੰਗਾਂ" + +#: js/ui/status/network.js:1472 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1482 +msgid "VPN Off" +msgstr "VPN ਬੰਦ ਹੈ" + +#: js/ui/status/network.js:1543 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s ਤਾਰ ਵਾਲਾ ਕਨੈਕਸ਼ਨ" +msgstr[1] "%s ਤਾਰ ਵਾਲੇ ਕਨੈਕਸ਼ਨ" + +#: js/ui/status/network.js:1576 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Wi-Fi ਕਨੈਕਸ਼ਨ" +msgstr[1] "%s Wi-Fi ਕਨੈਕਸ਼ਨ" + +#: js/ui/status/network.js:1580 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s ਮਾਡਮ ਕਨੈਕਸ਼ਨ" +msgstr[1] "%s ਮਾਡਮ ਕਨੈਕਸ਼ਨ" + +#: js/ui/status/network.js:1709 +msgid "Connection failed" +msgstr "ਕਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ" + +#: js/ui/status/network.js:1710 +msgid "Activation of network connection failed" +msgstr "ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦੀ ਐਕਟੀਵੇਸ਼ਨ ਫੇਲ੍ਹ ਹੋਈ" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "ਰਾਤ ਦੀ ਰੌਸ਼ਨੀ ਅਸਮਰੱਥ ਹੈ" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "ਰਾਤ ਦੀ ਰੋਸ਼ਨੀ ਚਾਲੂ ਹੈ" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰੋ" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "ਭਲਕੇ ਤੱਕ ਅਸਮਰੱਥ ਕਰੋ" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "ਪਾਵਰ ਸੈਟਿੰਗਾਂ" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "ਪੂਰੀ ਚਾਰਜ" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਹੀ" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "…ਅੰਦਾਜ਼ਾ ਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d ਬਾਕੀ (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d ਪੂਰਾ ਹੋਣ ਲਈ (%d %%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "ਸਕਰੀਨ ਸਾਂਝੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + +#: js/ui/status/remoteAccess.js:44 +#| msgid "Turn Off" +msgid "Turn off" +msgstr "ਬੰਦ ਕਰੋ" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "ਏਅਰਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੈ" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "ਵਰਤੋਂਂਕਾਰ ਬਦਲੋ" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "ਲਾਗ ਆਉਟ" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "ਖਾਤਾ ਸੈਟਿੰਗਾਂ" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "ਸਥਿਤੀ ਲਾਕ" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "ਸਸਪੈਂਡ" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "ਬੰਦ ਕਰੋ" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "ਥੰਡਰਬੋਲਟ" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "ਅਣਪਛਾਤਾ ਥੰਡਰਬੋਲਟ ਯੰਤਰ" + +#: js/ui/status/thunderbolt.js:326 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"ਜਦੋਂ ਤੁਸੀਂ ਦੂਰ ਸੀ ਤਾਂ ਨਵਾਂ ਡਿਵਾਈਸ ਖੋਜਿਆ ਗਿਆ ਹੈ। ਡਿਵਾਈਸ ਨੂੰ ਵਰਤਣਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ" +" ਇਸ ਨੂੰ ਡਿਸ-" +"ਕਨੈਕਟ ਕਰਕੇ ਮੁੜ ਕਨੈਕਟ ਕਰੋ।" + +#: js/ui/status/thunderbolt.js:329 +#| msgid "Unknown Thunderbolt device" +msgid "Unauthorized Thunderbolt device" +msgstr "ਨਾ-ਪ੍ਰਮਾਣਿਤ ਕੀਤਾ ਥੰਡਰਬੋਲਟ ਯੰਤਰ" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"ਨਵਾਂ ਡਿਵਾਈਸ ਖੋਜਿਆ ਜਾ ਚੁੱਕਿਆ ਗਿਆ ਹੈ ਅਤੇ ਪਰਸ਼ਾਸ਼ਕ ਵਲੋਂ ਪਰਮਾਣਿਤ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ" +" ਹੈ।" + +#: js/ui/status/thunderbolt.js:336 +msgid "Thunderbolt authorization error" +msgstr "ਥੰਡਰਬੋਲਟ ਪਰਮਾਣਕਿਤਾ ਗ਼ਲਤੀ" + +#: js/ui/status/thunderbolt.js:337 +#, javascript-format +#| msgid "Could not authorize the thunderbolt device: %s" +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "ਥੰਡਰਬੋਲਟ ਡਿਵਾਈਸ ਨੂੰ ਪਰਮਾਣਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: %s" + +#: js/ui/status/volume.js:136 +msgid "Volume changed" +msgstr "ਵਾਲੀਅਮ ਬਦਲਿਆ ਗਿਆ" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "ਮਿੱਰਰ" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "ਡਿਸਪਲੇਅ ਨੂੰ ਜੋੜੋ" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "ਕੇਵਲ ਬਾਹਰੀ" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "ਕੇਵਲ ਬਿਲਟ-ਇਨ" + +#: js/ui/unlockDialog.js:64 +msgid "Log in as another user" +msgstr "ਹੋਰ ਵਰਤੋਂਕਾਰ ਵਜੋਂ ਲਾਗਇਨ" + +#: js/ui/unlockDialog.js:81 +msgid "Unlock Window" +msgstr "ਵਿੰਡੋ ਨੂੰ ਅਣਲਾਕ ਕਰੋ" + +#: js/ui/viewSelector.js:181 +msgid "Applications" +msgstr "ਐਪਲੀਕੇਸ਼ਨ" + +#: js/ui/viewSelector.js:185 +msgid "Search" +msgstr "ਖੋਜ" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” ਤਿਆਰ ਹੈ" + +#: js/ui/windowManager.js:59 +msgid "Do you want to keep these display settings?" +msgstr "ਕੀ ਤੁਸੀਂ ਇਹ ਡਿਸਪਲੇਅ ਸੈਟਿੰਗਾਂ ਲਾਗੂ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:71 +msgid "Revert Settings" +msgstr "ਸੈਟਿੰਗਾਂ ਵਾਪਿਸ ਲਵੋ" + +#: js/ui/windowManager.js:74 +msgid "Keep Changes" +msgstr "ਬਦਲਾਅ ਲਾਗੂ ਰੱਖੋ" + +#: js/ui/windowManager.js:92 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "ਸੈਟਿੰਗਾਂ ਬਦਲਾਅ ਨੂੰ %d ਸਕਿੰਟ ਵਿੱਚ ਵਾਪਿਸ ਕੀਤਾ ਜਾਵੇਗਾ" +msgstr[1] "ਸੈਟਿੰਗਾਂ ਬਦਲਾਅ ਨੂੰ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਵਾਪਿਸ ਕੀਤਾ ਜਾਵੇਗਾ" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:668 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:30 +msgid "Minimize" +msgstr "ਘੱਟੋ-ਘੱਟ" + +#: js/ui/windowMenu.js:37 +msgid "Unmaximize" +msgstr "ਅਣ-ਵੱਧੋ-ਵੱਧ" + +#: js/ui/windowMenu.js:41 +msgid "Maximize" +msgstr "ਵੱਧੋ-ਵੱਧ" + +#: js/ui/windowMenu.js:48 +msgid "Move" +msgstr "ਭੇਜੋ" + +#: js/ui/windowMenu.js:54 +msgid "Resize" +msgstr "ਮੁੜ-ਆਕਾਰ" + +#: js/ui/windowMenu.js:61 +msgid "Move Titlebar Onscreen" +msgstr "ਟਾਈਟਲ-ਪੱਟੀ ਆਨ-ਸਕਰੀਨ ਹਿਲਾਓ" + +#: js/ui/windowMenu.js:66 +msgid "Always on Top" +msgstr "ਹਮੇਸ਼ਾ ਉੱਤੇ ਰੱਖੋ" + +#: js/ui/windowMenu.js:85 +msgid "Always on Visible Workspace" +msgstr "ਹਮੇਸ਼ਾ ਵਿਖਾਈ ਦਿੰਦੇ ਵਰਕਸਪੇਸ ਉੱਤੇ" + +#: js/ui/windowMenu.js:99 +msgid "Move to Workspace Left" +msgstr "ਖੱਬੇ ਵਰਕਸਪੇਸ ਵਿੱਚ ਭੇਜੋ" + +#: js/ui/windowMenu.js:105 +msgid "Move to Workspace Right" +msgstr "ਸੱਜੇ ਵਰਕਸਪੇਸ ਵਿੱਚ ਭੇਜੋ" + +#: js/ui/windowMenu.js:111 +msgid "Move to Workspace Up" +msgstr "ਉੱਤਲੇ ਵਰਕਸਪੇਸ ਵਿੱਚ ਭੇਜੋ" + +#: js/ui/windowMenu.js:117 +msgid "Move to Workspace Down" +msgstr "ਹੇਠਲੇ ਵਰਕਸਪੇਸ ਵਿੱਚ ਭੇਜੋ" + +#: js/ui/windowMenu.js:135 +msgid "Move to Monitor Up" +msgstr "ਉੱਤਲੇ ਮਾਨੀਟਰ ਵਿੱਚ ਭੇਜੋ" + +#: js/ui/windowMenu.js:144 +msgid "Move to Monitor Down" +msgstr "ਹੇਠਲੇ ਮਾਨੀਟਰ ਵਿੱਚ ਭੇਜੋ" + +#: js/ui/windowMenu.js:153 +msgid "Move to Monitor Left" +msgstr "ਖੱਬੇ ਮਾਨੀਟਰ ਵਿੱਚ ਭੇਜੋ" + +#: js/ui/windowMenu.js:162 +msgid "Move to Monitor Right" +msgstr "ਸੱਜੇ ਮਾਨੀਟਰ ਵਿੱਚ ਭੇਜੋ" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "ਈਵੇਲੂਸ਼ਨ ਕੈਲੰਡਰ" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:410 +msgid "Print version" +msgstr "ਵਰਜ਼ਨ ਛਾਪੋ" + +#: src/main.c:416 +msgid "Mode used by GDM for login screen" +msgstr "ਲਾਗਇਨ ਸਕਰੀਨ ਲਈ GDM ਵਲੋਂ ਵਰਤਿਆ ਮੋਡ" + +#: src/main.c:422 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "ਲਾਗਇਨ ਸਕਰੀਨ ਉੱਤੇ ਖਾਸ ਮੋਡ ਜਿਵੇਂ ਕਿ “gdm“ ਵਰਤੋਂ" + +#: src/main.c:428 +msgid "List possible modes" +msgstr "ਸੰਭਵ ਮੋਡ ਵੇਖਾਓ" + +#: src/shell-app.c:272 +msgctxt "program" +msgid "Unknown" +msgstr "ਅਣਪਛਾਤਾ" + +#: src/shell-app.c:523 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” ਚਲਾਉਣ ਲਈ ਫੇਲ੍ਹ" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "ਪਾਸਵਰਡ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਵਰਤੋਂਂਕਾਰ ਵਲੋਂ ਰੱਦ ਕੀਤਾ" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u ਆਉਟਪੁੱਟ" +msgstr[1] "%u ਆਉਟਪੁੱਟ" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ਇੰਪੁੱਟ" +msgstr[1] "%u ਇੰਪੁੱਟ" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "ਸਿਸਟਮ ਸਾਊਂਡ" + +#~| msgid "Power Off" +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "ਬੰਦ ਕਰੋ" + +#~| msgid "Log Out" +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "ਲਾਗ ਆਉਟ" + +#~| msgid "Switch User" +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "ਵਰਤੋਂਕਾਰ ਨੂੰ ਬਦਲੋ" + +#~ msgid "Hide tray" +#~ msgstr "ਟਰੇ ਓਹਲੇ ਕਰੋ" + +#~ msgid "Status Icons" +#~ msgstr "ਹਾਲਤ ਆਈਕਾਨ" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "ਗਨੋਮ ਸ਼ੈੱਲ ਇਕਸਟੈਨਸ਼ਨ ਪਸੰਦ" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "ਵੈੱਬ ਪਰਮਾਣਕਿਤਾ ਰੀ-ਡਾਇਰੈਕਟ" + +#~ msgid "Events" +#~ msgstr "ਘਟਨਾਵਾਂ" + +#~ msgid "Notifications" +#~ msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ" + +#~ msgid "Clear section" +#~ msgstr "ਭਾਗ ਖਾਲੀ ਕਰੋ" + +#~ msgid "Media" +#~ msgstr "ਮੀਡੀਆ" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Not In Use" +#~ msgstr "ਵਰਤੋਂ ਵਿੱਚ ਨਹੀਂ" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "ਕੈਲੰਡਰ ਵਿੱਚ ਹਫ਼ਤਾ ਮਿਤੀ ਵੇਖੋ" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "ਜੇ ਚੋਣ ਕੀਤੀ ਤਾਂ ਕੈਲੰਡਰ ਵਿੱਚ ISO ਹਫਤਾ ਮਿਤੀ ਵੇਖਾਈ ਜਾਵੇਗੀ।" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s ਵਲੋਂ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ।" + +#~ msgid "Use as Internet connection" +#~ msgstr "ਇੰਟਰਨੈੱਟ ਕੁਨੈਕਸ਼ਨ ਵਜੋਂ ਵਰਤੋਂ" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "ਗਨੋਮ ਸ਼ੈਲ (ਵੇਲੈਂਡ ਨਿਰਮਾਤਾ)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d ਕੁਨੈਕਟ ਹੋਇਆ ਜੰਤਰ" +#~ msgstr[1] "%d ਕੁਨੈਕਟ ਹੋਏ ਜੰਤਰ" + +#~ msgid "Authentication required" +#~ msgstr "ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "ਬੈਟਰੀ" + +#~ msgid "Airplane Mode" +#~ msgstr "ਏਅਰਪਲੇਨ ਮੋਡ" + +#~ msgid "Show the message tray" +#~ msgstr "ਸੁਨੇਹਾ ਟਰੇ ਵੇਖਾਓ" + +#~ msgid "Captive Portal" +#~ msgstr "ਕੈਪਟਿਵ ਪੋਰਟਲ" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "ਐ" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "ਸੋ" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "ਮੰ" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "ਬੁੱ" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "ਵੀ" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "ਸ਼ੁੱ" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "ਸ਼" + +#~ msgid "Nothing Scheduled" +#~ msgstr "ਕੋਈ ਵੀ ਸੈਡਿਊਲ ਨਹੀਂ ਹੈ" + +#~ msgid "Today" +#~ msgstr "ਅੱਜ" + +#~ msgid "Tomorrow" +#~ msgstr "ਭਲਕ" + +#~ msgid "This week" +#~ msgstr "ਇਹ ਹਫ਼ਤਾ" + +#~ msgid "Next week" +#~ msgstr "ਹਫ਼ਤਾ ਅੱਗੇ" + +#~ msgid "Removable Devices" +#~ msgstr "ਹਟਾਉਣਯੋਗ ਜੰਤਰ" + +#~ msgid "Eject" +#~ msgstr "ਬਾਹਰ ਕੱਢੋ" + +#~ msgid "Invitation" +#~ msgstr "ਸੱਦਾ" + +#~ msgid "Call" +#~ msgstr "ਕਾਲ ਕਰੋ" + +#~ msgid "File Transfer" +#~ msgstr "ਫਾਇਲ ਟਰਾਂਸਫਰ" + +#~ msgid "Chat" +#~ msgstr "ਗੱਲਬਾਤ" + +#~ msgid "Unmute" +#~ msgstr "ਸੁਣਾਓ" + +#~ msgid "Mute" +#~ msgstr "ਚੁੱਪ" + +#~ msgid "Invitation to %s" +#~ msgstr "%s ਲਈ ਸੱਦਾ" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s ਤੁਹਾਨੂੰ %s ਜੁਆਇੰਨ ਕਰਨ ਲਈ ਸੱਦ ਰਿਹਾ ਹੈ" + +#~ msgid "Decline" +#~ msgstr "ਇਨਕਾਰ" + +#~ msgid "Accept" +#~ msgstr "ਮਨਜ਼ੂਰ" + +#~ msgid "Video call from %s" +#~ msgstr "%s ਵਲੋਂ ਵਿਡੀਓ ਕਾਲ" + +#~ msgid "Call from %s" +#~ msgstr "%s ਵਲੋਂ ਕਾਲ" + +#~ msgid "Answer" +#~ msgstr "ਜਵਾਬ ਦਿਓ" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s ਤੁਹਾਨੂੰ %s ਭੇਜ ਰਿਹਾ/ਰਹੀ ਹੈ" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s ਤੁਹਾਨੂੰ ਵੇਖਣ ਦਾ ਅਧਿਕਾਰ ਚਾਹੁੰਦਾ/ਚਾਹੁੰਦੀ ਹੈ, ਜਦੋਂ ਵੀ ਤੁਸੀਂ ਆਨਲਾਈਨ ਹੋਵੋ" + +#~ msgid "Authentication failed" +#~ msgstr "ਪਰਮਾਣਕਿਤਾ ਫੇਲ੍ਹ ਹੋਈ" + +#~ msgid "Encryption error" +#~ msgstr "ਇੰਕ੍ਰਿਪਸ਼ਨ ਗਲਤੀ" + +#~ msgid "Certificate not provided" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਨਹੀਂ ਦਿੱਤਾ" + +#~ msgid "Certificate untrusted" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਬੇਭਰੋਸੇਯੋਗ" + +#~ msgid "Certificate expired" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਦੀ ਮਿਆਦ ਪੁੱਗੀ" + +#~ msgid "Certificate not activated" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਸਰਗਰਮ ਨਹੀਂ ਹੈ" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਹੋਸਟ-ਨਾਂ ਨਹੀਂ ਮਿਲਦਾ" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਫਿੰਗਰ-ਪਰਿੰਟ ਮਿਲਦਾ ਨਹੀਂ" + +#~ msgid "Certificate self-signed" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਖੁਦ-ਦਸਤਖਤੀ ਹੈ" + +#~ msgid "Status is set to offline" +#~ msgstr "ਹਾਲਤ ਆਫਲਾਈਨ ਸੈੱਟ ਕੀਤੀ ਗਈ ਹੈ" + +#~ msgid "Certificate is invalid" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਗਲਤ ਹੈ" + +#~ msgid "Connection has been refused" +#~ msgstr "ਕੁਨੈਕਸ਼ਨ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ ਗਿਆ" + +#~ msgid "Connection can't be established" +#~ msgstr "ਕੁਨੈਕਸ਼ਨ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#~ msgid "Connection has been lost" +#~ msgstr "ਕੁਨੈਕਸ਼ਨ ਖਤਮ ਹੋ ਗਿਆ" + +#~ msgid "This account is already connected to the server" +#~ msgstr "ਇਹ ਅਕਾਊਂਟ ਪਹਿਲਾਂ ਹੀ ਸਰਵਰ ਨਾਲ ਕੁਨੈਕਟ ਹੈ" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "ਉਸੇ ਸਰੋਤ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੁਨੈਕਸ਼ਨ ਨੂੰ ਨਵੇਂ ਕੁਨੈਕਸ਼ਨ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ" + +#~ msgid "The account already exists on the server" +#~ msgstr "ਅਕਾਊਂਟ ਸਰਵਰ ਉੱਤੇ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "ਸਰਵਰ ਇਸ ਵੇਲੇ ਐਨਾ ਰੁੱਝਿਆ ਹੋਇਆ ਹੈ ਕਿ ਕੁਨੈਕਸ਼ਨ ਸੰਭਾਲ ਨਹੀਂ ਸਕਦਾ" + +#~ msgid "Certificate has been revoked" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਮਨਸੂਖ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "ਸਰਟੀਫਿਕੇਟ ਅਸੁਰੱਖਿਅਤ ਸੀਫ਼ਰ ਐਲਗੋਰਿਥਮ ਵਰਤਦਾ ਹੈ ਜਾਂ ਕਮਜ਼ੋਰ ਕ੍ਰਿਪਟੋਗਰਾਫਿਕਲ ਵਰਤਦਾ ਹੈ" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "ਸਰਵਰ ਸਰਟੀਫਿਕੇਟ ਦੀ ਲੰਬਾਈ ਜਾਂ ਸਰਵਰ ਸਰਟੀਫਿਕੇਟ ਚੇਨ ਦੀ ਡੂੰਘਾਈ ਕ੍ਰਿਪਟੂਗਰਾਫ਼ੀ ਲਾਇਬਰੇਰੀ ਵਲੋਂ " +#~ "ਰੱਖੀ ਗਈ ਲਿਮਟ ਤੋਂ ਵੱਧ ਗਈ ਹੈ।" + +#~ msgid "Internal error" +#~ msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ" + +#~ msgid "Unable to connect to %s" +#~ msgstr "%s ਨਾਲ ਕੁਨੈਕਟ ਹੋਣ ਲਈ ਅਸਮਰੱਥ" + +#~ msgid "View account" +#~ msgstr "ਅਕਾਊਂਟ ਵੇਖੋ" + +#~ msgid "Open Calendar" +#~ msgstr "ਕੈਲੰਡਰ ਖੋਲ੍ਹੋ" + +#~ msgid "Date & Time Settings" +#~ msgstr "ਮਿਤੀ ਤੇ ਸਮਾਂ ਸੈਟਿੰਗ" + +#~ msgid "Open" +#~ msgstr "ਖੋਲ੍ਹੋ" + +#~ msgid "Remove" +#~ msgstr "ਹਟਾਓ" + +#~ msgid "Clear Messages" +#~ msgstr "ਸੁਨੇਹੇ ਸਾਫ਼ ਕਰੋ" + +#~ msgid "Notification Settings" +#~ msgstr "ਸੂਚਨਾ ਸੈਟਿੰਗ" + +#~ msgid "Tray Menu" +#~ msgstr "ਟਰੇ ਮੇਨੂ" + +#~ msgid "No Messages" +#~ msgstr "ਕੋਈ ਸੁਨੇਹਾ ਨਹੀਂ" + +#~ msgid "Message Tray" +#~ msgstr "ਸੁਨੇਹਾ ਟਰੇ" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "ਟਿਕਾਣੇ ਦੀ ਵੱਧ ਤੋਂ ਵੱਧ ਸ਼ੁੱਧਤਾ ਦਾ ਪੱਧਰ।" + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "ਟਿਕਾਣੇ ਦੀ ਵੱਧ ਤੋਂ ਵੱਧ ਸ਼ੁੱਧਤਾ ਦਰਸਾਉਣ ਦੀ ਸੰਰਚਨਾ ਕਰੋ, ਜੋ ਕਿ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਵੇਖਣ ਦੀ ਮਨਜ਼ੂਰੀ ਹੈ। " +#~ "ਢੁੱਕਵੀਆਂ ਚੋਣਾਂ ਵਿੱਚ ਹਨ 'ਬੰਦ' (ਟਿਕਾਣਾ ਸਾਂਝਾ ਕਰਨਾ ਬੰਦ), 'ਦੇਸ਼', 'ਸ਼ਹਿਰ', 'ਆਂਢ-ਗੁਆਂਢ', " +#~ "'ਗਲੀ' ਅਤੇ 'ਠੀਕ' (ਅਕਸਰ ਜੀਪੀਐਸ ਰਸੀਵਰ ਚਾਹੀਦਾ ਹੈ)। ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਵਿੱਚ ਰੱਖੋ ਕਿ ਇਹ " +#~ "ਕੇਵਲ GeoClue ਰਾਹੀਂ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਵਿਖਾਏ ਜਾਣ ਵਾਲੇ ਨੂੰ ਕੰਟਰੋਲ ਕਰਦਾ ਹੈ ਅਟੇ ਉਹ ਆਪਣੇ ਨੈੱਟਵਰਕ " +#~ "ਸਰੋਤਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਯੂਜ਼ਰ ਦਾ ਟਿਕਾਣਾ ਲੱਭ ਸਕਦੇ ਹਨ (ਹਾਲਾਂਕਿ ਸ਼ੁੱਧ ਰੂਪ ਵਿੱਚ ਵੱਧ ਤੋਂ ਵੱਧ ਕੇਵਲ ਗਲੀ-" +#~ "ਪੱਧਰ ਤੱਕ ਹੀ)।" + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "ਟਾਈਟਲ-ਪੱਟੀ ਵਿੱਚ ਬਟਨਾਂ ਦਾ ਪ੍ਰਬੰਧ" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "ਇਹ ਕੁੰਜੀ ਗਨੋਮ ਸ਼ੈੱਲ ਚੱਲਣ ਦੇ ਦੌਰਾਨ org.gnome.desktop.wm.preference ਕੁੰਜੀ ਨੂੰ ਅਣਡਿੱਠਾ " +#~ "ਕਰਦੀ ਹੈ।" + +#~ msgid "Extension" +#~ msgstr "ਇਕਸਟੈਸ਼ਨ" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "ਉੱਤੇ ਦਿੱਤੇ ਕੰਬੋਬਾਕਸ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇਕਸਟੈਸ਼ਨ ਦੀ ਸੰਰਚਨਾ ਕਰਨ ਲਈ ਚੋਣ ਕਰੋ।" + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "unavailable" +#~ msgstr "ਨਾ-ਉਪਲੱਬਧ" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "ਕੈਟਾਗਰੀਆਂ ਦੀ ਸੂਚੀ, ਜੋ ਕਿ ਫੋਲਡਰ ਵਜੋਂ ਵੇਖਾਈਆਂ ਜਾਣੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "ਇਹ ਸੂਚੀ ਵਿੱਚ ਹਰੇਕ ਕੈਟਾਗਰੀ ਨਾਂ ਨੂੰ ਐਪਲੀਕੇਸ਼ਨ ਝਲਕ ਵਿੱਚ ਫੋਲਡਰ ਵਜੋਂ ਵੇਖਾਇਆ ਜਾਵੇਗਾ, ਨਾ ਕਿ ਮੁੱਖ " +#~ "ਝਲਕ ਵਿੱਚ ਲਾਈਨ ਵਿੱਚ ਵੇਖਾਇਆ।" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d %B,%H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d %B %Y, %H:%M " + +#~ msgid "Authorization request from %s" +#~ msgstr "'%s' ਤੋਂ ਪਰਮਾਣਕਿਤਾ ਮੰਗ" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "ਜੰਤਰ %s ਇਸ ਕੰਪਿਊਟਰ ਨਾਲ ਪੇਅਰ ਹੋਣਾ ਚਾਹੁੰਦਾ ਹੈ" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "ਜੰਤਰ %s ਸਰਵਿਸ '%s' ਨੂੰ ਵਰਤਣੀ ਚਾਹੁੰਦਾ ਹੈ।" + +#~ msgid "Grant this time only" +#~ msgstr "ਕੇਵਲ ਇਸ ਸਮੇਂ ਹੀ ਮਨਜ਼ੂਰ" + +#~ msgid "Reject" +#~ msgstr "ਨਾ-ਮਨਜ਼ੂਰ" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s ਲਈ ਪੇਅਰ ਕਰਨ ਦੀ ਪੁਸ਼ਟੀ" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "ਪੁਸ਼ਟੀ ਕਰੋ ਜੀ ਕਿ ਪਾਸ-ਕੀ '%06d' ਜੰਤਰ ਉੱਤੇ ਮੌਜੂਦ ਪਿੰਨ ਨਾਲ ਮਿਲਦਾ ਹੈ।" + +#~ msgid "Matches" +#~ msgstr "ਮਿਲਦਾ ਹੈ" + +#~ msgid "Does not match" +#~ msgstr "ਮਿਲਦਾ ਨਹੀਂ ਹੈ" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s ਲਈ ਪੇਅਰ ਕਰਨ ਦੀ ਮੰਗ" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "ਜੰਤਰ ਉੱਤੇ ਦਿੱਤਾ ਗਿਆ ਪਿੰਨ ਦਿਉ ਜੀ।" + +#~ msgid "OK" +#~ msgstr "ਠੀਕ ਹੈ" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "ਅਫਸੋਸ, ਅੱਜ ਤੁਹਾਡੇ ਲਈ ਕੋਈ ਨਸੀਹਤ ਨਹੀਂ:\n" +#~ "%s " + +#~ msgid "%s the Oracle says" +#~ msgstr "%s ਓਰੇਕਲ ਨੇ ਕਿਹਾ" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Settings Menu" +#~ msgstr "ਸੈਟਿੰਗ ਮੇਨੂ" + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "ਯੂਜ਼ਰ ਵਲੋਂ ਆਖਰੀ IM ਵਿੱਚ ਮੌਜੂਦਗੀ ਸਥਿਤੀ ਸਟੋਰ ਕਰਨ ਲਈ ਅੰਦਰੂਨੀ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। " +#~ "TpConnectionPresenceType ਤੋਂ ਇੱਥੇ ਮੁੱਲ।" + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "ਯੂਜ਼ਰ ਵਲੋਂ ਆਖਰੀ ਸ਼ੈਸ਼ਨ ਵਿੱਚ ਮੌਜੂਦਗੀ ਸਥਿਤੀ ਸਟੋਰ ਕਰਨ ਲਈ ਅੰਦਰੂਨੀ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। " +#~ "GsmPresenceStatus ਤੋਂ ਇੱਥੇ ਮੁੱਲ।" + +#~| msgid "Session…" +#~ msgid "Session" +#~ msgstr "ਸ਼ੈਸ਼ਨ" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰਨ ਤੇ ਸਿਸਟਮ ਨੂੰ ਲਾਗਆਉਟ ਕਰਨ ਲਈ ਲਾਗਆਉਟ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।" + +#~ msgid "Logging out of the system." +#~ msgstr "ਸਿਸਟਮ ਲਾਗ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨਾਂ ਬੰਦ ਕਰਨ ਅਤੇ ਸਿਸਟਮ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਬੰਦ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।" + +#~ msgid "Powering off the system." +#~ msgstr "ਸਿਸਟਮ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰਨ ਤੇ ਸਿਸਟਮ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।" + +#~ msgid "Restarting the system." +#~ msgstr "ਸਿਸਟਮ ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "ਬੰਦ ਕਰਨ ਨਾਲ ਉਹਨਾਂ ਵਲੋਂ ਨਾ-ਸੰਭਾਲਿਆ ਕੰਮ ਖਰਾਬ ਹੋ ਸਕਦਾ ਹੈ।" + +#~ msgid "Screenshots" +#~ msgstr "ਸਕਰੀਨਸ਼ਾਟ" + +#~ msgid "Record a screencast" +#~ msgstr "ਸਕਰੀਨਕਾਸਟ ਰਿਕਾਰਡ ਕਰੋ" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ ਵਰਤੋਂ ਬਾਰੇ ਅੰਕੜੇ ਇੱਕਠੇ ਕਰਨੇ ਹਨ" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "ਸ਼ੈੱਲ ਲਗਾਤਾਰ ਸਰਗਰਮ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦੀ ਰਹਿੰਦੀ ਹੈ ਤਾਂ ਕਿ ਸਭ ਤੋਂ ਵੱਧ ਵਰਤੀਆਂ " +#~ "ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਵੇਖਾਇਆ ਜਾ ਸਕੇ (ਜਿਵੇਂ ਕਿ ਲਾਂਚਰ ਵਿੱਚ)। ਹਾਲਾਂਕਿ ਇਹ ਡਾਟਾ ਪ੍ਰਾਈਵੇਟ ਹੀ ਰੱਖਿਆ " +#~ "ਜਾਵੇਗਾ, ਤਾਂ ਵੀ ਜੇ ਤੁਸੀਂ ਚਾਹੋ ਤਾਂ ਇਸ ਨੂੰ ਸੁਰੱਖਿਆ ਕਾਰਨਾਂ ਕਰਕੇ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ। ਯਾਦ ਰੱਖੋ ਕਿ ਇੰਝ " +#~ "ਕਰਨ ਨਾਲ ਪਹਿਲਾਂ ਸੰਭਾਲਿਆ ਗਿਆ ਡਾਟਾ ਹਟਾਇਆ ਨਹੀਂ ਜਾਵੇਗਾ।" + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "ਸਕਰੀਨ ਰਿਕਾਡਰ ਨੂੰ ਬਦਲਣ ਲਈ ਕੀਬਾਈਡਿੰਗ" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "ਬਿਲਟ-ਇਨ ਸਕਰੀਨ ਰਿਕਾਰਡ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ/ਰੋਕਣ ਲਈ ਕੀਬਾਈਡਿੰਗ" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "ਸਕਰੀਨਕਾਸਟ ਰਿਕਾਰਡ ਕਰਨ ਲਈ ਫਰੇਮਰੇਟ ਹੈ।" + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "ਗਨੋਮ ਸ਼ੈੱਲ ਦੇ ਸਕਰੀਨਕਾਸਟ ਰਿਕਾਰਡਰ ਵਲੋਂ ਰਿਕਾਰਡ ਕਰਕੇ ਬਣਾਈ ਗਈ ਸਕਰੀਨਕਾਸਟ ਦਾ ਫਰੇਮਰੇਟ ਫਰੇਮ " +#~ "ਪ੍ਰਤੀ ਸਕਿੰਟ 'ਚ ਹੈ।" + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "ਸਕਰੀਨਕਾਸਟ ਇੰਕੋਡ ਕਰਨ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਜੀਸਟਰੀਮਰ ਪਾਇਪਲਾਇਨ" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "ਰਿਕਾਰਡਿੰਗ ਇੰਕੋਡ ਕਰਨ ਲਈ ਜੀਸਟੀਮਰ ਪਾਇਪਲਾਈਨ ਸੈੱਟ ਕਰੋ। ਇਹ gst-launch ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ " +#~ "ਸੰਟੈਕਸ ਵਰਤਦਾ ਹੈ। ਪਾਇਪਲਾਈਨ ਲਈ ਸਿੰਕ ਪੈਡ ਲਈ ਕੁਨੈਕਟ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਜਿੱਥੇ ਰਿਕਾਰਡ ਹੋਣ " +#~ "ਵਾਲੀ ਵਿਡੀਓ ਰਿਕਾਰਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਇਹ ਆਮ ਤੌਰ ਉੱਤੇ ਨਾ-ਕੁਨੈਕਟ ਕੀਤਾ ਸਰੋਤ ਪੈਡ ਹੋਵੇਗਾ, ਉਸ " +#~ "ਪੈਡ ਤੋਂ ਆਉਟਪੁੱਟ ਨੂੰ ਆਉਟਪੁੱਟ ਫਾਇਲ ਵਿੱਚ ਲਿਖਿਆ ਜਾਵੇਗਾ। ਪਰ ਪਾਈਪਲਾਈਨ ਖੁਦ ਦੀ ਆਉਟਪੁੱਟ ਦਾ ਧਿਆਨ " +#~ "ਵੀ ਰੱਖ ਸਕਦੀ ਹੈ - ਇਸ ਨਾਲ ਆਉਟਪੁੱਟ ਨੂੰ icecast ਸਰਵਰ ਉੱਤੇ shout2send ਜਾਂ ਕਿਸੇ ਹੋਰ ਰਾਹੀਂ " +#~ "ਵੀ ਭੇਜਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਜਦੋਂ ਅਣ-ਸੈੱਟ ਕੀਤਾ ਜਾਂ ਖਾਲੀ ਮੁੱਲ ਨਾਲ ਸੈੱਟ ਕੀਤਾ ਤਾਂ, ਡਿਫਾਲਟ " +#~ "ਪਾਈਪਲਾਈਨ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। ਇਸ ਇਸ ਵੇਲੇ 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' ਹੈ ਅਤੇ VP8 codec " +#~ "ਦੀ ਵਰਤੋਂ ਕਰਕੇ WEBM ਨਾਲ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। %T ਸਿਸਟਮ ਉੱਤੇ ਢੁੱਕਵੀ ਥਰਿੱਡ ਗਿਣਤੀ ਦਾ " +#~ "ਅੰਦਾਜ਼ਾ ਲਗਾਉਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।" + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "ਸਕਰੀਨਕਾਸਟ ਸੰਭਾਲਣ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਫਾਇਲ ਇਕਟੈਨਸ਼ਨ" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "ਰਿਕਾਰਡ ਕੀਤੇ ਸਕਰੀਨਕਾਸਟ ਲਈ ਫਾਇਲ ਨਾਂ ਮੌਜੂਦਾ ਮਿਤੀ ਦੇ ਮੁਤਾਬਕ ਵਿਲੱਖਣ ਫਾਇਲ ਨਾਂ ਹੋਵੇਗਾ ਅਤੇ " +#~ "ਇਹ ਇਕਸਟੈਨਸ਼ਨ ਵਰਤੀ ਜਾਵੇਗੀ। ਇਸ ਨੂੰ ਬਦਲਿਆ ਜਾਵੇਗਾ, ਜਦੋਂ ਵੱਖਰੇ ਕੰਨਟੇਨਰ ਫਾਰਮੈਟ ਵਿੱਚ ਰਿਕਾਰਡ " +#~ "ਕੀਤਾ ਜਾਵੇਗਾ।" + +#~ msgid "Power" +#~ msgstr "ਪਾਵਰ" + +#~ msgid "Restart" +#~ msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t ਤੋਂ ਸਕਰੀਨਕਾਸਟ" + +#~ msgid "Universal Access Settings" +#~ msgstr "ਯੂਨੀਵਰਸਲ ਅਸੈੱਸ ਸੈਟਿੰਗ" + +#~ msgid "Visibility" +#~ msgstr "ਦਿੱਖ" + +#~| msgid "Set Up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "…ਨਵਾਂ ਜੰਤਰ ਸੈਟਅੱਪ ਕਰੋ" + +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "…ਫਾਇਲਾਂ ਭੇਜੋ" + +#~ msgid "Keyboard Settings" +#~ msgstr "ਕੀਬੋਰਡ ਸੈਟਿੰਗ" + +#~ msgid "Mouse Settings" +#~ msgstr "ਮਾਊਸ ਸੈਟਿੰਗ" + +#~ msgid "Volume, network, battery" +#~ msgstr "ਵਾਲੀਅਮ, ਨੈੱਟਵਰਕ, ਬੈਟਰੀ" + +#~ msgid "disabled" +#~ msgstr "ਬੰਦ ਹੈ" + +#~ msgid "cable unplugged" +#~ msgstr "ਕੇਬਲ ਕੱਢੀ ਹੋਈ ਹੈ" + +#~ msgid "More…" +#~ msgstr "…ਹੋਰ" + +#~ msgid "Wired" +#~ msgstr "ਤਾਰ" + +#~ msgid "Auto Ethernet" +#~ msgstr "ਆਟੋ ਈਥਰਨੈੱਟ" + +#~ msgid "Auto broadband" +#~ msgstr "ਆਟੋ ਬਰਾਡਬੈਂਡ" + +#~ msgid "Auto dial-up" +#~ msgstr "ਆਟੋ ਡਾਇਲ-ਅੱਪ" + +#~ msgid "Auto %s" +#~ msgstr "ਆਟੋ %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "ਆਟੋ ਬਲਿਊਟੁੱਥ" + +#~ msgid "Auto wireless" +#~ msgstr "ਆਟੋ ਬੇਤਾਰ" + +#~ msgid "Wi-Fi" +#~ msgstr "ਵਾਈ-ਫਾਈ" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "%d ਘੰਟਾ ਬਾਕੀ" +#~ msgstr[1] "%d ਘੰਟੇ ਬਾਕੀ" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s ਬਾਕੀ" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ਘੰਟਾ" +#~ msgstr[1] "ਘੰਟੇ" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "ਮਿੰਟ" +#~ msgstr[1] "ਮਿੰਟ" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "%d ਮਿੰਟ ਬਾਕੀ" +#~ msgstr[1] "%d ਮਿੰਟ ਬਾਕੀ" + +#~ msgid "AC Adapter" +#~ msgstr "AC ਐਡਪਟਰ" + +#~ msgid "Laptop Battery" +#~ msgstr "ਲੈਪਟਾਪ ਬੈਟਰੀ" + +#~ msgid "Monitor" +#~ msgstr "ਮਾਨੀਟਰ" + +#~ msgid "Mouse" +#~ msgstr "ਮਾਊਸ" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "ਸੈੱਲ ਫੋਨ" + +#~ msgid "Media Player" +#~ msgstr "ਮੀਡਿਆ ਪਲੇਅਰ" + +#~ msgid "Tablet" +#~ msgstr "ਟੇਬਲੇਟ" + +#~ msgid "Computer" +#~ msgstr "ਕੰਪਿਊਟਰ" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "ਅਣਜਾਣ" + +#~ msgid "Available" +#~ msgstr "ਉਪਲੱਬਧ" + +#~ msgid "Busy" +#~ msgstr "ਰੁਝਿਆ" + +#~ msgid "Invisible" +#~ msgstr "ਅਦਿੱਖ" + +#~ msgid "Away" +#~ msgstr "ਦੂਰ" + +#~ msgid "Idle" +#~ msgstr "ਵੇਹਲਾ" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "ਤੁਹਾਡੀ ਚੈਟ ਹਾਲਤ ਰੁੱਝੇ ਵਜੋਂ ਸੈੱਟ ਕੀਤੀ ਜਾਵੇਗੀ" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "ਨੋਟੀਫਿਕੇਸ਼ਨ ਹੁਣ ਬੰਦ ਕੀਤੇ ਹੋਏ ਹਨ, ਜਿਸ ਵਿੱਚ ਗੱਲਬਾਤ (ਚੈਟ) ਸੁਨੇਹੇ ਵੀ ਹਨ। ਤੁਹਾਡੇ ਆਨਲਾਈਨ ਹਾਲਤ " +#~ "ਨੂੰ ਵੀ ਅਡਜੱਸਟ ਕੀਤਾ ਜਾਵੇਗਾ ਤਾਂ ਕਿ ਹੋਰਾਂ ਨੂੰ ਇਹ ਪਤਾ ਲੱਗ ਸਕੇ ਕਿ ਤੁਸੀਂ ਉਹਨਾਂ ਦੇ ਸੁਨੇਹੇ ਸ਼ਾਇਦ ਨਾ " +#~ "ਵੇਖੋਗੇ।" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "ਸਾਇਨ ਇਨ" + +#~ msgid "tray" +#~ msgstr "ਟਰੇ" + +#~ msgid "More..." +#~ msgstr "ਹੋਰ..." + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "United Kingdom" +#~ msgstr "ਬਰਤਾਨੀਆ" + +#~ msgid "Default" +#~ msgstr "ਡਿਫਾਲਟ" + +#~ msgid "Show full name in the user menu" +#~ msgstr "ਯੂਜ਼ਰ ਮੇਨੂ ਵਿੱਚ ਪੂਰਾ ਨਾਂ ਵੇਖਾਓ" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "ਕੀ ਯੂਜ਼ਰ ਮੇਨੂ ਵਿੱਚ ਪੂਰਾ ਯੂਜ਼ਰ ਨਾਂ ਵੇਖਾਉਣਾ ਹੈ ਜਾਂ ਨਹੀਂ।" + +#~ msgid "APPLICATIONS" +#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ" + +#~ msgid "SETTINGS" +#~ msgstr "ਸੈਟਿੰਗ" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "ਤੁਹਾਡਾ ਪਸੰਦੀਦਾ ਈਸਟਰ ਅੰਡਾ" + +#~ msgid "Subscription request" +#~ msgstr "ਮੈਂਬਰੀ ਦੀ ਮੰਗ" + +#~ msgid "Sent at %X on %A" +#~ msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "%A %B %d, %Y ਨੂੰ ਭੇਜਿਆ" + +#~ msgid "Connection to %s failed" +#~ msgstr "%s ਲਈ ਕੁਨੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੈ" + +#~ msgid "Reconnect" +#~ msgstr "ਮੁੜ-ਕੁਨੈਕਟ ਕਰੋ" + +#~ msgid "Browse Files..." +#~ msgstr "...ਫਾਇਲਾਂ ਦੀ ਝਲਕ" + +#~ msgid "Error browsing device" +#~ msgstr "ਜੰਤਰ ਬਰਾਊਜ਼ ਕਰਨ ਲਈ ਗਲਤੀ" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "ਮੰਗ ਕੀਤੇ ਗਏ ਜੰਤਰ ਨੂੰ ਬਰਾਊਜ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਗਲਤੀ ਸੀ '%s'" + +#~ msgid "Wireless" +#~ msgstr "ਬੇਤਾਰ" + +#~ msgid "VPN Connections" +#~ msgstr "VPN ਕੁਨੈਕਸ਼ਨ" + +#~ msgid "System Settings" +#~ msgstr "ਸਿਸਟਮ ਸੈਟਿੰਗ" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "ਓਪਨਸਰਚ ਉਪਲੱਬਧ ਕਰਵਾਉਣ ਵਾਲੇ ਬੰਦ ਹਨ" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "'%s' ਅਣ-ਮਾਊਂਟ ਕਰਨ ਲਈ ਫੇਲ੍ਹ" + +#~ msgid "Retry" +#~ msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ਥਾਵਾਂ ਅਤੇ ਜੰਤਰ" + +#~ msgid "Home" +#~ msgstr "ਘਰ" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "...ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ" + +#~ msgid "Passphrase" +#~ msgstr "ਵਾਕ" + +#~| msgid "Unknown" +#~ msgctxt "contact" +#~ msgid "Unknown" +#~ msgstr "ਅਣਜਾਣ" + +#~ msgid "CONTACTS" +#~ msgstr "ਸੰਪਰਕ" + +#~ msgid "%s is online." +#~ msgstr "%s ਆਨਲਾਈਨ ਹੈ।" + +#~ msgid "%s is offline." +#~ msgstr "%s ਆਫਲਾਈਨ ਹੈ।" + +#~ msgid "%s is away." +#~ msgstr "%s ਦੂਰ ਹੈ।" + +#~ msgid "%s is busy." +#~ msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।" + +#~ msgid "Show time with seconds" +#~ msgstr "ਸਮਾਂ ਵਿੱਚ ਸਕਿੰਟ ਵੇਖੋ" + +#~ msgid "If true, display seconds in time." +#~ msgstr "ਜੇ ਸੱਚ ਹੈ ਤਾਂ ਸਮਾਂ ਵਿੱਚ ਸਕਿੰਟ ਵੀ ਵੇਖਾਏ ਜਾਣਗੇ।" + +#~ msgid "Show date in clock" +#~ msgstr "ਘੜੀ ਵਿੱਚ ਮਿਤੀ ਵੇਖੋ" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "ਜੇ ਸੱਚ ਹੈ ਤਾਂ, ਘੜੀ ਵਿਚ ਸਮਾਂ ਨਾਲ ਮਿਤੀ ਵੀ ਵੇਖਾਈ ਜਾਵੇਗੀ।" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a, %e %b %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e %b, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "ਗਲਤ ਪਾਸਵਰਡ; ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ" + +#~ msgid "Hidden" +#~ msgstr "ਲੁਕਵਾਂ" + +#~ msgid "Power Off..." +#~ msgstr "...ਬੰਦ ਕਰੋ" + +#~ msgid "Online Accounts" +#~ msgstr "ਆਨਲਾਈਨ ਅਕਾਊਂਟ" + +#~ msgid "Log Out..." +#~ msgstr "...ਲਾਗਆਉਟ" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. disabled-extensions overrides this setting for " +#~ "extensions that appear in both lists." +#~ msgstr "" +#~ "ਗਨੋਮ ਸ਼ੈਲ ਇਕਸਟੈਨਸ਼ਨ ਲਈ ਇੱਕ uuid ਵਿਸ਼ੇਸ਼ਤਾ ਹੈ; ਇਹ ਕੁੰਜੀ ਇਕਸਟੈਨਸ਼ਨ ਦਰਸਾਉਂਦੀ ਹੈ, ਜੋ ਲੋਡ ਹਨ। " +#~ "disabled-extensions ਇਹ ਸੈਟਿੰਗ ਉਹਨਾਂ ਇਕਸਟੈਨਸ਼ਨਾਂ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰਦੀ ਹੈ, ਜੋ ਦੋਵੇਂ ਲਿਸਟਾਂ ਵਿੱਚ " +#~ "ਹੁੰਦੀਆਂ ਹਨ।" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ਤਾਜ਼ਾ ਆਈਟਮਾਂ" + +#~ msgid "Show password" +#~ msgstr "ਪਾਸਵਰਡ ਵੇਖਾਓ" + +#~ msgid "%s has finished starting" +#~ msgstr "%s ਸ਼ੁਰੂ ਹੋਣਾ ਖਤਮ ਹੋਇਆ" + +#~ msgid "Home Folder" +#~ msgstr "ਘਰ ਫੋਲਡਰ" + +#~ msgid "If true, display onscreen keyboard." +#~ msgstr "ਜੇ ਚੋਣ ਕੀਤੀ ਤਾਂ ਆਨਸਕਰੀਨ ਕੀਬੋਰਡ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।" + +#~ msgid "Connectivity lost" +#~ msgstr "ਕੁਨੈਕਸ਼ਨ ਟੁੱਟ ਗਿਆ" + +#~| msgid "You're no longer connected to the network" +#~ msgid "You are no longer connected to the network" +#~ msgstr "ਹੁਣ ਤੁਸੀਂ ਨੈੱਟਵਰਕ ਨਾਲ ਕੁਨਕੈਟ ਨਹੀਂ ਰਹੇ ਹੋ" + +#~ msgid "Do Not Disturb" +#~ msgstr "ਤੰਗ ਨਾ ਕਰੋ" + +#~ msgid "calendar:week_start:0" +#~ msgstr "calendar:week_start:1" + +#~ msgid "Uuids of extensions to disable" +#~ msgstr "ਇਕਟੈਨਸ਼ਨ ਦੀ Uuids ਬੰਦ ਹੈ" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "ਹੁਣ ਤੁਸੀਂ ਮੋਬਾਇਲ ਬਰਾਡਬੈਂਡ ਨੈੱਟਵਰਕ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ ਗਏ ਹੋ" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "ਹੁਣ ਤੁਸੀਂ ਬੇਤਾਰ ਨੈੱਟਵਰਕ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ ਗਏ ਹੋ" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "ਤੁਸੀਂ ਹੁਣ VPN ਨੈੱਟਵਰਕ '%s' ਨਾਲ ਕੁਨੈਕਟ ਹੋ ਚੁੱਕੇ ਹੋ" + +#~ msgid "Localization Settings" +#~ msgstr "ਲੋਕਲਾਈਜ਼ੇਸ਼ਨ ਸੈਟਿੰਗ" + +#~ msgid "Less than a minute ago" +#~ msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ" + +#~ msgid "Shut Down" +#~ msgstr "ਬੰਦ ਕਰੋ" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰਕੇ ਸਿਸਟਮ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਬੰਦ ਕਰੋ ਨੂੰ ਕਲਿੱਕ ਕਰੋ।" + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "ਸਿਸਟਮ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ %d ਸਕਿੰਟਾਂ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#~ msgid "Shutting down the system." +#~ msgstr "ਸਿਸਟਮ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" + +#~ msgid "Confirm" +#~ msgstr "ਪੁਸ਼ਟੀ" + +#~ msgid "PREFERENCES" +#~ msgstr "ਪਸੰਦ" + +#~ msgid "Clip the crosshairs at the center" +#~ msgstr "ਸੈਂਟਰ ਉੱਤੇ ਕਰਾਂਸਹੇਅਰ ਕਲਿੱਪ ਕਰੋ" + +#~ msgid "Color of the crosshairs" +#~ msgstr "ਕਰਾਂਸਹੇਅਰ ਦਾ ਰੰਗ" + +#~ msgid "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." +#~ msgstr "ਵਰਟੀਕਲ ਤੇ ਹਰੀਜੱਟਲ ਲਾਈਨਾਂ ਦੀ ਲੰਬਾਈ ਦੱਸੋ, ਜੋ ਕਿ ਕਰਾਂਸਹੇਅਰ ਬਣਾਉਂਦੀਆਂ ਹਨ।" + +#~ msgid "" +#~ "Determines the transparency of the crosshairs, from fully opaque to fully " +#~ "transparent." +#~ msgstr "ਕਰਾਂਸਹੇਅਰ ਦੀ ਟਰਾਂਸਪਰੇਸੀ ਤਹਿ ਕਰੋ, ਪੂਰੀ ਤਰ੍ਹਾਂ ਧੁੰਦਲੇ ਤੋਂ ਪਾਰਦਰਸ਼ੀ ਹੀ।" + +#~ msgid "Enable lens mode" +#~ msgstr "ਲੈਨਜ਼ ਮੋਡ ਚਾਲੂ" + +#~ msgid "" +#~ "Enables/disables display of crosshairs centered on the magnified mouse " +#~ "sprite." +#~ msgstr "ਵੱਡਦਰਸ਼ੀ ਮਾਊਸ ਸਪਰਿਟ ਉੱਤੇ ਸੈਂਟਰ ਕੀਤੇ ਕਰਾਂਸਹੇਅਰ ਵੇਖਾਉਣਾ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰੋ।" + +#~ msgid "" +#~ "For centered mouse tracking, when the system pointer is at or near the " +#~ "edge of the screen, the magnified contents continue to scroll such that " +#~ "the screen edge moves into the magnified view." +#~ msgstr "" +#~ "ਸੈਂਟਰਡ ਮਾਊਸ ਟਰੈਕ ਕਰਨ ਲਈ, ਜਦੋਂ ਸਿਸਟਮ ਪੁਆਇੰਟਰ ਸਕਰੀਨ ਦੇ ਕਿਸੇ ਕੋਨੇ ਕੋਲ ਜਾਂਦਾ ਹੈ ਤਾਂ ਵੱਡੇ ਰੂਪ " +#~ "ਵਿੱਚ ਵੇਖਾਈ ਜਾਂਦੀ ਸਮੱਗਰੀ ਇੰਝ ਸਕਰੋਲ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਤਾਂ ਕਿ ਸਕਰੀਨ ਕੋਨੇ ਵੱਡਦਰਸ਼ ਝਲਕ ਦੇ ਰੂਪ ਵਿੱਚ " +#~ "ਵੇਖਾਈ ਜਾਂਦੇ ਰਹਿੰਦੇ ਹਨ।" + +#~ msgid "Length of the crosshairs" +#~ msgstr "ਕਰਾਂਸਹੇਅਰ ਦੀ ਲੰਬਾਈ" + +#~ msgid "Magnification factor" +#~ msgstr "ਵੱਡਦਰਸ਼ੀ ਗੁਣਾਂਕ" + +#~ msgid "Mouse Tracking Mode" +#~ msgstr "ਮਾਊਸ ਟਰੈਕਿੰਗ ਮੋਡ" + +#~ msgid "Opacity of the crosshairs" +#~ msgstr "ਕਰਾਂਸਹੇਅਰ ਦਾ ਧੁੰਦਲਾਪਨ" + +#~ msgid "Scroll magnified contents beyond the edges of the desktop" +#~ msgstr "ਡੈਸਕਟਾਪ ਦੇ ਕੋਨਿਆਂ ਤੋਂ ਪਾਰ ਵੱਡਦਰਸ਼ੀ ਸਮੱਗਰੀ ਸਕਰੋਲ ਕਰੋ" + +#~ msgid "Show or hide crosshairs" +#~ msgstr "ਕਰਾਂਸਹੇਅਰ ਵੇਖੋ ਜਾਂ ਓਹਲੇ ਕਰੋ" + +#~ msgid "Show or hide the magnifier" +#~ msgstr "ਵੱਡਦਰਸ਼ੀ ਵੇਖੋ ਜਾਂ ਓਹਲੇ ਕਰੋ" + +#~ msgid "Show or hide the magnifier and all of its zoom regions." +#~ msgstr "ਵੱਡਦਰਸ਼ੀ ਵੇਖੋ ਜਾਂ ਓਹਲੇ ਕਰੋ ਤੇ ਇਸ ਦੇ ਸਭ ਖੇਤਰਾਂ ਨੂੰ ਜ਼ੂਮ ਕਰੋ।" + +#~ msgid "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." +#~ msgstr "ਵਰਟੀਕਲ ਤੇ ਹਰੀਜੱਟਲ ਲਾਈਨਾਂ ਦਾ ਰੰਗ, ਜੋ ਕਿ ਕਰਾਂਸਹੇਅਰ ਬਣਾਉਂਦੀਆਂ ਹਨ" + +#~ msgid "" +#~ "The magnified view either fills the entire screen, or occupies the top-" +#~ "half, bottom-half, left-half, or right-half of the screen." +#~ msgstr "" +#~ "ਵੱਡਦਰਸ਼ੀ ਝਲਕ ਪੂਰੀ ਸਕਰੀਨ ਨੂੰ ਭਰ ਸਕਦਾ ਹੈ ਜਾਂ ਅੱਧਾ-ਉੱਤੇ, ਅੱਧਾ ਹੇਠਾਂ, ਅੱਧਾ ਖੱਬੇ ਜਾਂ ਅੱਧਾ-ਸੱਜੇ ਭਾਗ " +#~ "ਨੂੰ ਭਰ ਸਕਦਾ ਹੈ।" + +#~ msgid "" +#~ "The power of the magnification. A value of 1.0 means no magnification. A " +#~ "value of 2.0 doubles the size." +#~ msgstr "" +#~ "ਵੱਡਦਰਸ਼ੀ ਦੀ ਤਾਕਤ ਹੈ। ੧.੦ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਕੋਈ ਵੀ ਨਹੀਂ। ੨.੦ ਦਾ ਮਤਲਬ ਹੈ ਆਕਾਰ ਦਾ ਦੋ ਗੁਣਾ।" + +#~ msgid "Thickness of the crosshairs" +#~ msgstr "ਕਰਾਂਸਹੇਅਰ ਦੀ ਮੋਟਾਈ" + +#~ msgid "" +#~ "Whether the magnified view should be centered over the location of the " +#~ "system mouse and move with it." +#~ msgstr "ਕੀ ਵੱਡਦਰਸ਼ੀ ਝਲਕ ਦੀ ਸਥਿਤੀ ਸਿਸਟਮ ਮਾਊਂਸ ਦੁਆਲੇ ਕੇਂਦਰਤ ਰਹੇ ਅਤੇ ਉਸ ਨਾਲ ਹੀ ਹਿੱਲੇ।" + +#~ msgid "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." +#~ msgstr "ਵਰਟੀਕਲ ਤੇ ਹਰੀਜੱਟਲ ਲਾਈਨਾਂ ਦੀ ਚੌੜਾਈ, ਜੋ ਕਿ ਕਰਾਂਸਹੇਅਰ ਬਣਾਉਂਦੀਆਂ ਹਨ" + +#~ msgid "Shut Down..." +#~ msgstr "ਬੰਦ ਕਰੋ..." + +#~ msgid "Bluetooth Agent" +#~ msgstr "ਬਲਿਊਟੁੱਥ ਏਜੰਟ" + +#~ msgid "Search your computer" +#~ msgstr "ਆਪਣੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਲੱਭੋ" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "" +#~ "ਨਵਾਂ ਵਰਕਸਪੇਸ ਜੋੜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਵਰਕਸਪੇਸਾਂ ਦੀ ਵੱਧੋ-ਵੱਧ ਗਿਣਤੀ ਪੂਰੀ ਹੋ ਚੁੱਕੀ ਹੈ।" + +#~ msgid "Can't remove the first workspace." +#~ msgstr "ਪਹਿਲਾਂ ਵਰਕਸਪੇਸ ਨਹੀਂ ਹਟਾਇਆ ਜਾ ਸਕਦਾ।" + +#~ msgid "Customize the panel clock" +#~ msgstr "ਪੈਨਲ ਘੜੀ ਕਸਟਮਾਈਜ਼ ਕਰੋ" + +#~ msgid "Custom format of the clock" +#~ msgstr "ਘੜੀ ਲਈ ਪਸੰਦੀਦਾ ਫਾਰਮੈਟ" + +#~ msgid "Hour format" +#~ msgstr "ਘੰਟਾ ਫਾਰਮੈਟ" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." +#~ msgstr "ਜੇ ਚੋਣ ਕੀਤੀ ਤਾਂ ਸਮੇਂ ਵਿੱਚ \"12-hour\" ਜਾਂ \" 24-hour\" ਸਕਿੰਟ ਵੇਖਾਏ ਜਾਣਗੇ।" + +#~ msgid "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." +#~ msgstr "" +#~ "ਇਹ ਕੁੰਜੀ ਪੈਨਲ ਘੜੀ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਫਾਰਮੈਟ ਦਿੰਦੀ ਹੈ, ਜਦੋਂ ਕਿ ਫਾਰਮੈਟ ਕੁੰਜੀ \"ਕਸਟਮ\" ਸੈੱਟ " +#~ "ਕੀਤੀ ਹੋਵੇ। ਤੁਸੀਂ ਖਾਸ ਫਾਰਮੈਟ ਦੇਣ ਲਈ ਹਦਾਇਤਾਂ ਵਾਸਤੇ strftime () ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ। ਹੋਰ " +#~ "ਜਾਣਕਾਰੀ ਲਈ strftime () ਦਸਤਾਵੇਜ਼ ਵੇਖੋ।" + +#~ msgid "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." +#~ msgstr "" +#~ "ਇਹ ਕੁੰਜੀ ਤਹਿ ਕਰਦੀ ਹੈ ਕਿ ਕਿਹੜਾ ਪੈਨਲ ਘੜੀ ਵਿੱਚ ਘੰਟਾ ਫਾਰਮੈਟ ਵਰਤਿਆ ਜਾਵੇ। ਸੰਭਵ ਮੁੱਲ ਹਨ " +#~ "\"12-hour\"(੧੨-ਘੰਟੇ), \"24-hour\" (੨੪-ਘੰਟੇ), \"unix\" (ਯੂਨੈਕਸ) ਅਤੇ \"custom" +#~ "\" (ਪਸੰਦੀਦਾ)। ਜੇ \"ਯੂਨੈਕਸ\" ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਤਾਂ ਘੜੀ ਨੂੰ ਈਪੋਚ (੦੧-ਜਨਵਰੀ-੧੯੭੦) ਤੋਂ ਵੇਖਾਇਆ\n" +#~ "ਜਾਵੇਗਾ। ਜੇ \"ਪਸੰਦੀਦਾ\" ਲਈ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਤਾਂ, ਘੜੀ ਨੂੰ custom_format ਕੁੰਜੀ ਵਿੱਚ ਦਿੱਤੇ " +#~ "ਫਾਰਮੈਟ ਮੁਤਾਬਕ ਵੇਖਾਇਆ ਜਾਵੇਗਾ। ਯਾਦ ਰੱਖੋ ਕਿ ਜੇ \"ਯੂਨੈਕਸ\" ਜਾਂ \"ਪਸੰਦੀਦਾ\" ਸੈੱਟ ਕੀਤਾ ਤਾਂ " +#~ "ਅੱਪਗਰੇਡ ਮਿਤੀ ਵੇਖਾਓ ਤੇ ਸਕਿੰਟ ਵੇਖਾਓ ਨੂੰ ਅਣਡਿੱਠਾ ਕੀਤਾ ਜਾਵੇਗਾ।" + +#~ msgid "Clock Preferences" +#~ msgstr "ਘੜੀ ਪਸੰਦ" + +#~ msgid "Show seco_nds" +#~ msgstr "ਸਕਿੰਟ ਵੇਖੋ(_n)" + +#~ msgid "_12 hour format" +#~ msgstr "_੧੨ ਘੰਟੇ ਫਾਰਮੈਟ" + +#~ msgid "_24 hour format" +#~ msgstr "_੨੪ ਘੰਟੇ ਫਾਰਮੈਟ" + +#~ msgid "Preferences" +#~ msgstr "ਮੇਰੀ ਪਸੰਦ" + +#~ msgid "Overview workspace view mode" +#~ msgstr "ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਦੀ ਝਲਕ" + +#~ msgid "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." +#~ msgstr "" +#~ "ਸੰਖੇਪ ਵਿੱਚ ਚੁਣੇ ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਹੈ। ਸਹਾਇਕ ਮੁੱਲ ਹਨ \"single\"(ਇੱਕਲਾ) ਜਾਂ \"grid" +#~ "\" (ਗਰਿੱਡ)।" + +#~ msgid "Drag here to add favorites" +#~ msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜਨ ਲਈ ਇੱਥੇ ਸੁੱਟੋ" + +#~ msgid "Find" +#~ msgstr "ਖੋਜ" + +#~| msgid "Preferences" +#~ msgid "System Preferences..." +#~ msgstr "ਸਿਸਟਮ ਪਸੰਦ..." + +#~ msgid "Sidebar" +#~ msgstr "ਬਾਹੀ" + +#~ msgid "Recent Documents" +#~ msgstr "ਤਾਜ਼ਾ ਡੌਕੂਮੈਂਟ" + +#~ msgid "(see all)" +#~ msgstr "(ਸਭ ਵੇਖੋ)" + +#~ msgid "PLACES" +#~ msgstr "ਥਾਵਾਂ" + +#~ msgid "SEARCH RESULTS" +#~ msgstr "ਖੋਜ ਨਤੀਜੇ" + +#~ msgid "Can't lock screen: %s" +#~ msgstr "ਸਕਰੀਨ ਲਾਕ ਨਹੀਂ ਹੋ ਸਕਦੀ: %s" + +#~ msgid "Can't temporarily set screensaver to blank screen: %s" +#~ msgstr "ਸਕਰੀਨ ਬੰਦ ਕਰਨ ਲਈ ਆਰਜ਼ੀ ਰੂਪ ਵਿੱਚ ਸਕਰੀਨ-ਸੇਵਰ ਨਹੀਂ ਸੈੱਟ ਕੀਤਾ ਜਾ ਸਕਦਾ: %s" + +#~ msgid "Can't logout: %s" +#~ msgstr "ਲਾਗਆਉਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ: %s" + +#~ msgid "Browse" +#~ msgstr "ਝਲਕ" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..5ec8faa --- /dev/null +++ b/po/pl.po @@ -0,0 +1,2320 @@ +# Polish translation for gnome-shell. +# Copyright © 2009-2019 the gnome-shell authors. +# This file is distributed under the same license as the gnome-shell package. +# Piotr Drąg , 2009-2019. +# Tomasz Dominikowski , 2009. +# Wojciech Szczęsny , 2013. +# Aviary.pl , 2009-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-05 17:26+0000\n" +"PO-Revision-Date: 2019-02-06 21:57+0100\n" +"Last-Translator: Piotr Drąg \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "System" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Wyświetlenie listy powiadomień" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Aktywacja bieżącego powiadomienia" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Wyświetlenie ekranu podglądu" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Wyświetlenie wszystkich programów" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Otwarcie menu programu" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:221 +msgid "Shell Extensions" +msgstr "Rozszerzenia powłoki" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Konfiguracja rozszerzeń powłoki GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Powłoka środowiska GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Zarządzanie oknami i uruchamianiem programów" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Włącza wewnętrzne narzędzia przydatne programistom i testerom w oknie " +"dialogowym Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Umożliwia dostęp do wewnętrznych narzędzi debugowania i monitorowania, " +"używając okna dialogowego Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Lista UUID rozszerzeń do włączenia" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Rozszerzenia powłoki GNOME mają własność UUID; ten klucz zawiera " +"rozszerzenia, które powinny zostać wczytane. Każde rozszerzenie, które ma " +"zostać wczytane, musi znajdować się na tej liście. Można także manipulować " +"tą listą za pomocą metod EnableExtension i DisableExtension usługi D-Bus na " +"org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Wyłączenie rozszerzeń użytkownika" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Wyłączenie wszystkich rozszerzeń włączonych przez użytkownika bez zmiany " +"ustawienia „enabled-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Wyłącza sprawdzanie zgodności wersji rozszerzeń" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Powłoka GNOME będzie wczytywała tylko rozszerzenia, które obsługują obecnie " +"uruchomioną wersję. Włączenie tej opcji wyłączy sprawdzanie zgodności " +"i spowoduje próbę wczytania wszystkich rozszerzeń, niezależnie od wersji, " +"jakie obsługują." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lista identyfikatorów plików .desktop ulubionych programów" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programy odpowiadające tym identyfikatorom będą wyświetlane w obszarze " +"ulubionych." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Widok ekranu wyboru programów" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indeks obecnie wybranego widoku na ekranie wyboru programów." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historia okna dialogowego poleceń (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historia okna dialogowego „Looking Glass”" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Wyświetlanie elementu menu „Wyloguj się” w menu użytkownika." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Ten klucz zastępuje automatyczne ukrywanie elementu menu „Wyloguj się” " +"w sytuacji, gdy istnieje tylko jeden użytkownik i jedna sesja." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Określa, czy pamiętać hasła do montowania zaszyfrowanych lub zdalnych " +"systemów plików" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Powłoka poprosi o hasło podczas montowania zaszyfrowanego urządzenia lub " +"zdalnego systemu plików. Jeśli hasło może zostać zapisane do późniejszego " +"użycia, to obecne będzie pole wyboru „Zapamiętanie hasła”. Ten klucz ustawia " +"domyślną wartość tego pola." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Czy domyślny adapter Bluetooth ma powiązane ustawione urządzenia" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Powłoka będzie wyświetlała menu Bluetooth tylko, jeśli adapter Bluetooth " +"jest włączony lub są ustawione urządzenia powiązane z domyślnym adapterem. " +"Zostanie to przywrócone, kiedy tylko domyślny adapter nie będzie miał " +"żadnych powiązanych urządzeń." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "API badania" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "Włącza API usługi D-Bus umożliwiające badanie stanu programu powłoki." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Skrót do otwarcia menu programu" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Skrót do otwarcia menu programu." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Skrót do otwarcia widoku „Wyświetl programy”" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Skrót do otwarcia widoku „Wyświetl programy” ekranu podglądu." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Skrót do otwarcia ekranu podglądu" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Skrót do otwarcia ekranu podglądu." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Skrót do przełączenia widoczności listy powiadomień" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Skrót do przełączenia widoczności listy powiadomień." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Skrót do aktywacji bieżącego powiadomienia" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Skrót do aktywacji bieżącego powiadomienia." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Skrót wstrzymujący i wznawiający wszystkie działające klatki pośrednie (do " +"celów debugowania)" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Przełączenie na 1. program" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Przełączenie na 2. program" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Przełączenie na 3. program" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Przełączenie na 4. program" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Przełączenie na 5. program" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Przełączenie na 6. program" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Przełączenie na 7. program" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Przełączenie na 8. program" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Przełączenie na 9. program" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Której klawiatury używać" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Typ używanej klawiatury." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Ograniczenie przełącznika do bieżącego obszaru roboczego." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Jeśli wynosi wartość „true”, to tylko programy mające okna na bieżącym " +"obszarze roboczym są wyświetlane w przełączniku. W przeciwnym przypadku " +"wszystkie programy są załączone." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Tryb ikon programów." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Konfiguruje, jak wyświetlać okna w przełączniku. Prawidłowe wartości to " +"„thumbnail-only” (wyświetla miniaturę okna), „app-icon-only” (wyświetla " +"tylko ikonę programu) lub „both” (wyświetla oba)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Jeśli wynosi wartość „true”, to tylko okna z bieżącego obszaru roboczego są " +"wyświetlane w przełączniku. W przeciwnym przypadku wszystkie okna są " +"załączone." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Dołączanie modalnych okien dialogowych do okien nadrzędnych" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ten klucz zastępuje klucz w „org.gnome.mutter”, kiedy uruchomiona jest " +"powłoka GNOME." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Włączenie kafelkowania przy krawędziach podczas przenoszenia okien do " +"krawędzi ekranu" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Dynamiczne zarządzanie obszarami roboczymi" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Obszary robocze tylko na pierwszym monitorze" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Opóźnienie zmiany aktywności w trybie myszy do momentu, w którym kursor się " +"zatrzymuje" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Logowanie do sieci" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:121 +msgid "Something’s gone wrong" +msgstr "Coś się nie powiodło" + +#: js/extensionPrefs/main.js:128 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Wystąpił problem: nie można wyświetlić ustawień tego rozszerzenia. Zalecamy " +"zgłoszenie problemu autorom rozszerzenia." + +#: js/extensionPrefs/main.js:135 +msgid "Technical Details" +msgstr "Informacje techniczne" + +#: js/extensionPrefs/main.js:170 +msgid "Copy Error" +msgstr "Skopiuj błąd" + +#: js/extensionPrefs/main.js:190 +msgid "Homepage" +msgstr "Strona WWW" + +#: js/extensionPrefs/main.js:191 +msgid "Visit extension homepage" +msgstr "Otwiera stronę WWW rozszerzenia" + +#: js/extensionPrefs/main.js:454 +msgid "No Extensions Installed" +msgstr "Nie zainstalowano rozszerzeń" + +#: js/extensionPrefs/main.js:464 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Można instalować rozszerzenia przez Menedżera oprogramowania lub stronę extensions.gnome.org." + +#: js/extensionPrefs/main.js:479 +msgid "Browse in Software" +msgstr "Przeglądaj w Menedżerze oprogramowania" + +#: js/gdm/authPrompt.js:144 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:437 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:330 js/ui/status/network.js:894 +msgid "Cancel" +msgstr "Anuluj" + +#: js/gdm/authPrompt.js:163 js/gdm/authPrompt.js:206 js/gdm/authPrompt.js:438 +msgid "Next" +msgstr "Dalej" + +#: js/gdm/authPrompt.js:202 js/ui/shellMountOperation.js:334 +#: js/ui/unlockDialog.js:55 +msgid "Unlock" +msgstr "Odblokuj" + +#: js/gdm/authPrompt.js:204 +msgctxt "button" +msgid "Sign In" +msgstr "Zaloguj" + +#: js/gdm/loginDialog.js:311 +msgid "Choose Session" +msgstr "Wybór sesji" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:455 +msgid "Not listed?" +msgstr "Inny użytkownik?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:889 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(np. użytkownik lub %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:894 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Nazwa użytkownika: " + +#: js/gdm/loginDialog.js:1232 +msgid "Login Window" +msgstr "Okno logowania" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "Błąd uwierzytelniania" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(lub przeciągnięcie palca)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "Wyłącz komputer" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"wyłącz komputer;wyłączanie komputera;zakończ;power off;shutdown;uruchom " +"ponownie;restartuj;zrestartuj;reboot;restart" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:101 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Zablokuj ekran" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:104 +msgid "lock screen" +msgstr "" +"zablokuj ekran;zablokowanie ekranu;blokowanie ekranu;blokada ekranu;lock " +"screen" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "Wyloguj się" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "wyloguj się;wylogowanie;log out;logout;sign off" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "Uśpij" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "uśpij;uśpienie;wstrzymaj;wstrzymanie;suspend;sleep" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +msgid "Switch User" +msgstr "Przełącz użytkownika" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:125 +msgid "switch user" +msgstr "przełącz użytkownika;przełączanie użytkowników;switch user" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Zablokuj orientację" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:132 +msgid "lock orientation;screen;rotation" +msgstr "" +"zablokuj orientację;zablokowanie orientacji;blokowanie orientacji;blokada " +"orientacji;lock orientation;ekran;monitor;wyświetlacz;screen;obrót;obracanie;" +"rotation" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Nie odnaleziono polecenia" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Nie można przetworzyć polecenia:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Wykonanie polecenia „%s” się nie powiodło:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Przed chwilą" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuta temu" +msgstr[1] "%d minuty temu" +msgstr[2] "%d minut temu" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d godzina temu" +msgstr[1] "%d godziny temu" +msgstr[2] "%d godzin temu" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Wczoraj" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dzień temu" +msgstr[1] "%d dni temu" +msgstr[2] "%d dni temu" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d tydzień temu" +msgstr[1] "%d tygodnie temu" +msgstr[2] "%d tygodni temu" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d miesiąc temu" +msgstr[1] "%d miesiące temu" +msgstr[2] "%d miesięcy temu" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d rok temu" +msgstr[1] "%d lata temu" +msgstr[2] "%d lat temu" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Wczoraj o %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%-l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Wczoraj o %-l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %-l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, %-l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %-l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "Logowanie do hotspotu" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Połączenie z tym hotspotem nie jest bezpieczne. Hasła i inne informacje " +"wpisywane na tej stronie mogą być widoczne dla osób w pobliżu." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "Odmów dostępu" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "Udziel dostępu" + +#: js/ui/appDisplay.js:671 +msgid "Frequently used applications will appear here" +msgstr "W tym miejscu pojawią się często używane programy" + +#: js/ui/appDisplay.js:786 +msgid "Frequent" +msgstr "Często używane" + +#: js/ui/appDisplay.js:793 +msgid "All" +msgstr "Wszystkie" + +#: js/ui/appDisplay.js:1748 +msgid "New Window" +msgstr "Nowe okno" + +#: js/ui/appDisplay.js:1762 +msgid "Launch using Dedicated Graphics Card" +msgstr "Uruchom za pomocą dedykowanej karty graficznej" + +#: js/ui/appDisplay.js:1789 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "Usuń z ulubionych" + +#: js/ui/appDisplay.js:1795 +msgid "Add to Favorites" +msgstr "Dodaj do ulubionych" + +#: js/ui/appDisplay.js:1805 +msgid "Show Details" +msgstr "Wyświetl szczegóły" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Dodano program „%s” do ulubionych." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Usunięto program „%s” z ulubionych." + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "Wybór urządzenia dźwiękowego" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "Ustawienia dźwięku" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "Słuchawki" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "Słuchawki z mikrofonem" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "Zmień tło…" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Ustawienia ekranu" + +#: js/ui/backgroundMenu.js:18 +msgid "Settings" +msgstr "Ustawienia" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:42 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:71 +msgctxt "grid sunday" +msgid "S" +msgstr "N" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:73 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:75 +msgctxt "grid tuesday" +msgid "T" +msgstr "W" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:77 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ś" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:79 +msgctxt "grid thursday" +msgid "T" +msgstr "C" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:81 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:83 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:346 +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:356 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:413 +msgid "Previous month" +msgstr "Poprzedni miesiąc" + +#: js/ui/calendar.js:424 +msgid "Next month" +msgstr "Następny miesiąc" + +#: js/ui/calendar.js:578 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:633 +msgid "Week %V" +msgstr "%V. tydzień" + +#. 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:701 +msgctxt "event list time" +msgid "All Day" +msgstr "Cały dzień" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d %B" + +#: js/ui/calendar.js:837 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d %B %Y" + +#: js/ui/calendar.js:1060 +msgid "No Notifications" +msgstr "Brak powiadomień" + +#: js/ui/calendar.js:1063 +msgid "No Events" +msgstr "Brak wydarzeń" + +#: js/ui/calendar.js:1089 +msgid "Clear" +msgstr "Wyczyść" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "Okno „%s” nie odpowiada." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "Można poczekać chwilę dłużej lub wymusić zakończenie programu." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Zakończ" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Czekaj" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "Podłączono dysk zewnętrzny" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Odłączono dysk zewnętrzny" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "Otwórz za pomocą „%s”" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "Hasło:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "Proszę wpisać ponownie:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "Można także połączyć naciskając przycisk „WPS” na routerze." + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:225 +#: js/ui/status/network.js:315 js/ui/status/network.js:897 +msgid "Connect" +msgstr "Połącz" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Hasło: " + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "Klucz: " + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Hasło klucza prywatnego: " + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Tożsamość: " + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Usługa: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "Sieć bezprzewodowa wymaga uwierzytelnienia" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Do uzyskania dostępu do sieci bezprzewodowej „%s” wymagane jest hasło lub " +"klucze szyfrowania." + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "Uwierzytelnianie przewodowe 802.1X" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Nazwa sieci: " + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "Uwierzytelnienie DSL" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "Wymagany jest kod PIN" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Do korzystania z urządzenia komórkowego wymagane jest podanie kodu PIN" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "Kod PIN: " + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "Hasło sieci komórkowej" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Do połączenia z siecią „%s” wymagane jest hasło." + +#: js/ui/components/networkAgent.js:682 js/ui/status/network.js:1671 +msgid "Network Manager" +msgstr "Menedżer sieci" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "Wymagane jest uwierzytelnienie" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "Uwierzytelnij" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:314 +msgid "Sorry, that didn’t work. Please try again." +msgstr "To nie zadziałało. Proszę spróbować ponownie." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:785 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Użytkownik „%s” jest teraz znany jako „%s”" + +#: js/ui/ctrlAltTab.js:25 js/ui/viewSelector.js:176 +msgid "Windows" +msgstr "Okna" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +msgid "Show Applications" +msgstr "Wyświetl programy" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:397 +msgid "Dash" +msgstr "Ulubione" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:74 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A, %-d %B %Y" + +#: js/ui/dateMenu.js:143 +msgid "Add world clocks…" +msgstr "Dodaj zegar światowy…" + +#: js/ui/dateMenu.js:144 +msgid "World Clocks" +msgstr "Zegar światowy" + +#: js/ui/dateMenu.js:234 +msgid "Weather" +msgstr "Pogoda" + +#: js/ui/dateMenu.js:317 +msgid "Select a location…" +msgstr "Wybierz położenie…" + +#: js/ui/dateMenu.js:325 +msgid "Loading…" +msgstr "Wczytywanie…" + +#: js/ui/dateMenu.js:335 +msgid "Go online for weather information" +msgstr "Prognoza pogody wymaga połączenia z Internetem" + +#: js/ui/dateMenu.js:337 +msgid "Weather information is currently unavailable" +msgstr "Prognoza pogody jest obecnie niedostępna" + +#: js/ui/endSessionDialog.js:49 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Wylogowanie użytkownika %s" + +#: js/ui/endSessionDialog.js:50 +msgctxt "title" +msgid "Log Out" +msgstr "Wylogowanie" + +#: js/ui/endSessionDialog.js:52 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Użytkownik %s zostanie wylogowany za %d sekundę." +msgstr[1] "Użytkownik %s zostanie wylogowany za %d sekundy." +msgstr[2] "Użytkownik %s zostanie wylogowany za %d sekund." + +#: js/ui/endSessionDialog.js:57 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Wylogowanie nastąpi za %d sekundę." +msgstr[1] "Wylogowanie nastąpi za %d sekundy." +msgstr[2] "Wylogowanie nastąpi za %d sekund." + +#: js/ui/endSessionDialog.js:63 +msgctxt "button" +msgid "Log Out" +msgstr "Wyloguj" + +#: js/ui/endSessionDialog.js:69 +msgctxt "title" +msgid "Power Off" +msgstr "Wyłączenie komputera" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalacja aktualizacji i wyłączenie komputera" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Wyłączenie komputera nastąpi za %d sekundę." +msgstr[1] "Wyłączenie komputera nastąpi za %d sekundy." +msgstr[2] "Wyłączenie komputera nastąpi za %d sekund." + +#: js/ui/endSessionDialog.js:76 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalacja oczekujących aktualizacji oprogramowania" + +#: js/ui/endSessionDialog.js:79 js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Restart" +msgstr "Uruchom ponownie" + +#: js/ui/endSessionDialog.js:81 +msgctxt "button" +msgid "Power Off" +msgstr "Wyłącz komputer" + +#: js/ui/endSessionDialog.js:88 +msgctxt "title" +msgid "Restart" +msgstr "Ponowne uruchomienie" + +#: js/ui/endSessionDialog.js:90 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Ponowne uruchomienie komputera nastąpi za %d sekundę." +msgstr[1] "Ponowne uruchomienie komputera nastąpi za %d sekundy." +msgstr[2] "Ponowne uruchomienie komputera nastąpi za %d sekund." + +#: js/ui/endSessionDialog.js:104 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Ponowne uruchomienie i instalacja aktualizacji" + +#: js/ui/endSessionDialog.js:106 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Ponowne uruchomienie komputera i instalacja aktualizacji nastąpi za %d " +"sekundę." +msgstr[1] "" +"Ponowne uruchomienie komputera i instalacja aktualizacji nastąpi za %d " +"sekundy." +msgstr[2] "" +"Ponowne uruchomienie komputera i instalacja aktualizacji nastąpi za %d " +"sekund." + +#: js/ui/endSessionDialog.js:112 js/ui/endSessionDialog.js:132 +msgctxt "button" +msgid "Restart & Install" +msgstr "Uruchom ponownie i zainstaluj" + +#: js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Zainstaluj i wyłącz komputer" + +#: js/ui/endSessionDialog.js:114 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Wyłączenie komputera po zainstalowaniu aktualizacji" + +#: js/ui/endSessionDialog.js:122 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Ponowne uruchomienie i instalacja aktualizacji" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:127 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"System %s %s zostanie zainstalowany po ponownym uruchomieniu. Instalacja " +"aktualizacji może zająć dużo czasu. Proszę się upewnić, że wykonano kopię " +"zapasową danych i podłączono komputer do prądu." + +#: js/ui/endSessionDialog.js:316 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Działanie na zasilaniu z akumulatora: proszę podłączyć komputer do prądu " +"przed instalowaniem aktualizacji." + +#: js/ui/endSessionDialog.js:333 +msgid "Some applications are busy or have unsaved work." +msgstr "Niektóre programy są używane lub mają niezapisane dane." + +#: js/ui/endSessionDialog.js:340 +msgid "Other users are logged in." +msgstr "Inni użytkownicy są zalogowani." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:621 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (zdalnie)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:624 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsola)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "Zainstaluj" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "" +"Pobrać i zainstalować rozszerzenie „%s” ze strony extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "Program „%s” prosi o wyłączenie skrótów" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "Program prosi o wyłączenie skrótów" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Można je włączyć naciskając klawisze %s." + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "Odmów" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "Zezwól" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "Włączono powolne klawisze" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "Wyłączono powolne klawisze" + +#: js/ui/kbdA11yDialog.js:34 +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 "" +"Przytrzymano klawisz Shift przez osiem sekund. Jest to skrót klawiszowy dla " +"funkcji powolnych klawiszy, która wpływa na sposób pracy klawiatury." + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned On" +msgstr "Włączono trwałe klawisze" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "Wyłączono trwałe klawisze" + +#: js/ui/kbdA11yDialog.js:44 +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 "" +"Przyciśnięto klawisz Shift pięć razy z rzędu. Jest to skrót klawiszowy dla " +"funkcji trwałych klawiszy, która wpływa na sposób pracy klawiatury." + +#: js/ui/kbdA11yDialog.js:46 +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 "" +"Przyciśnięto dwa klawisze naraz lub przyciśnięto klawisz Shift pięć razy " +"z rzędu. Wyłącza to funkcję trwałych klawiszy, która wpływa na sposób pracy " +"klawiatury." + +#: js/ui/kbdA11yDialog.js:58 +msgid "Leave On" +msgstr "Pozostaw włączone" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1270 +msgid "Turn On" +msgstr "Włącz" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:134 js/ui/status/network.js:316 +#: js/ui/status/network.js:1270 js/ui/status/network.js:1382 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Wyłącz" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "Pozostaw wyłączone" + +#: js/ui/keyboard.js:209 +msgid "Region & Language Settings" +msgstr "Ustawienia regionu i języka" + +#: js/ui/lookingGlass.js:627 +msgid "No extensions installed" +msgstr "Nie zainstalowano rozszerzeń" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:681 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "Rozszerzenie „%s” nie wysłało żadnych błędów." + +#: js/ui/lookingGlass.js:687 +msgid "Hide Errors" +msgstr "Ukryj błędy" + +#: js/ui/lookingGlass.js:691 js/ui/lookingGlass.js:751 +msgid "Show Errors" +msgstr "Wyświetl błędy" + +#: js/ui/lookingGlass.js:700 +msgid "Enabled" +msgstr "Włączone" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:703 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Wyłączone" + +#: js/ui/lookingGlass.js:705 +msgid "Error" +msgstr "Błąd" + +#: js/ui/lookingGlass.js:707 +msgid "Out of date" +msgstr "Nieaktualne" + +#: js/ui/lookingGlass.js:709 +msgid "Downloading" +msgstr "Pobieranie" + +#: js/ui/lookingGlass.js:733 +msgid "View Source" +msgstr "Wyświetl źródło" + +#: js/ui/lookingGlass.js:742 +msgid "Web Page" +msgstr "Strona WWW" + +#: js/ui/messageTray.js:1483 +msgid "System Information" +msgstr "Informacje systemowe" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "Nieznany wykonawca" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "Nieznany tytuł" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "Głośność" + +#: js/ui/overview.js:78 +msgid "Undo" +msgstr "Cofnij" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:105 +msgid "Overview" +msgstr "Podgląd" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:231 +msgid "Type to search…" +msgstr "Wyszukiwanie…" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "Nowy skrót…" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "Określone przez program" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "Ekran pomocy" + +#: js/ui/padOsd.js:153 +msgid "Switch monitor" +msgstr "Przełączenie monitora" + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "Przydzielenie klawiszy" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "Gotowe" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "Modyfikuj…" + +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "Brak" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "Naciśnięcie przycisku skonfiguruje" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "Klawisz Esc zakończy" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "Naciśnięcie dowolnego przycisku zakończy" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Zakończ" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:410 +msgid "Activities" +msgstr "Podgląd" + +#: js/ui/panel.js:685 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Menu systemowe" + +#: js/ui/panel.js:806 +msgid "Top Bar" +msgstr "Górny pasek" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Proszę wprowadzić polecenie:" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:169 +msgid "Close" +msgstr "Zamknij" + +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "Ponowne uruchamianie jest niedostępne w technologii Wayland" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "Ponowne uruchamianie…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %-d %B" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nowa wiadomość" +msgstr[1] "%d nowe wiadomości" +msgstr[2] "%d nowych wiadomości" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nowe powiadomienie" +msgstr[1] "%d nowe powiadomienia" +msgstr[2] "%d nowych powiadomień" + +#: js/ui/screenShield.js:458 js/ui/status/system.js:291 +msgid "Lock" +msgstr "Zablokuj ekran" + +#: js/ui/screenShield.js:722 +msgid "GNOME needs to lock the screen" +msgstr "Środowisko GNOME musi zablokować ekran" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:843 js/ui/screenShield.js:1316 +msgid "Unable to lock" +msgstr "Nie można zablokować" + +#: js/ui/screenShield.js:844 js/ui/screenShield.js:1317 +msgid "Lock was blocked by an application" +msgstr "Blokowanie zostało zablokowane przez program" + +#: js/ui/search.js:644 +msgid "Searching…" +msgstr "Wyszukiwanie…" + +#: js/ui/search.js:646 +msgid "No results." +msgstr "Brak wyników." + +#: js/ui/search.js:770 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d więcej" +msgstr[1] "%d więcej" +msgstr[2] "%d więcej" + +#: js/ui/shellEntry.js:21 +msgid "Copy" +msgstr "Skopiuj" + +#: js/ui/shellEntry.js:26 +msgid "Paste" +msgstr "Wklej" + +#: js/ui/shellEntry.js:92 +msgid "Show Text" +msgstr "Wyświetl tekst" + +#: js/ui/shellEntry.js:94 +msgid "Hide Text" +msgstr "Ukryj tekst" + +#: js/ui/shellMountOperation.js:301 +msgid "Password" +msgstr "Hasło" + +#: js/ui/shellMountOperation.js:322 +msgid "Remember Password" +msgstr "Zapamiętanie hasła" + +#: js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Ułatwienia dostępu" + +#: js/ui/status/accessibility.js:54 +msgid "Zoom" +msgstr "Powiększanie" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Reader" +msgstr "Czytnik ekranowy" + +#: js/ui/status/accessibility.js:65 +msgid "Screen Keyboard" +msgstr "Klawiatura ekranowa" + +#: js/ui/status/accessibility.js:69 +msgid "Visual Alerts" +msgstr "Alarmy wizualne" + +#: js/ui/status/accessibility.js:72 +msgid "Sticky Keys" +msgstr "Trwałe klawisze" + +#: js/ui/status/accessibility.js:75 +msgid "Slow Keys" +msgstr "Powolne klawisze" + +#: js/ui/status/accessibility.js:78 +msgid "Bounce Keys" +msgstr "Odskakujące klawisze" + +#: js/ui/status/accessibility.js:81 +msgid "Mouse Keys" +msgstr "Klawisze myszy" + +#: js/ui/status/accessibility.js:155 +msgid "High Contrast" +msgstr "Wysoki kontrast" + +#: js/ui/status/accessibility.js:186 +msgid "Large Text" +msgstr "Duży tekst" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:591 +msgid "Bluetooth Settings" +msgstr "Ustawienia Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d połączone urządzenie" +msgstr[1] "%d połączone urządzenia" +msgstr[2] "%d połączonych urządzeń" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "Wyłączone" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "Włączone" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "Jasność" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "Klawiatura" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "Wyświetl układ klawiatury" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "Włączono ustalanie położenia" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "Wyłącz" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "Ustawienia prywatności" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "Ustalanie położenia jest używane" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "Wyłączono ustalanie położenia" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "Włącz" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Udzielić programowi „%s” dostępu do położenia użytkownika?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"W każdej chwili można zmienić dostęp do położenia w ustawieniach prywatności." + +#: js/ui/status/network.js:72 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:422 js/ui/status/network.js:1299 +#, javascript-format +msgid "%s Off" +msgstr "Wyłączono sieć %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:425 +#, javascript-format +msgid "%s Connected" +msgstr "Połączono z siecią %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:430 +#, javascript-format +msgid "%s Unmanaged" +msgstr "Sieć %s jest niezarządzana" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:433 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Rozłączanie z sieci %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:440 js/ui/status/network.js:1291 +#, javascript-format +msgid "%s Connecting" +msgstr "Łączenie z siecią %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:443 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "Sieć %s wymaga uwierzytelnienia" + +#. 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:451 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Brak oprogramowania sprzętowego dla sieci %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:455 +#, javascript-format +msgid "%s Unavailable" +msgstr "Sieć %s jest niedostępna" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:458 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Połączenie z siecią %s się nie powiodło" + +#: js/ui/status/network.js:470 +msgid "Wired Settings" +msgstr "Ustawienia sieci przewodowej" + +#: js/ui/status/network.js:512 +msgid "Mobile Broadband Settings" +msgstr "Ustawienia sieci komórkowej" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:559 js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Wyłączono sprzęt dla sieci %s" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:563 +#, javascript-format +msgid "%s Disabled" +msgstr "Wyłączono sieć %s" + +#: js/ui/status/network.js:603 +msgid "Connect to Internet" +msgstr "Połącz z Internetem" + +#: js/ui/status/network.js:792 +msgid "Airplane Mode is On" +msgstr "Tryb samolotowy jest włączony" + +#: js/ui/status/network.js:793 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Sieć Wi-Fi jest wyłączona, kiedy tryb samolotowy jest włączony." + +#: js/ui/status/network.js:794 +msgid "Turn Off Airplane Mode" +msgstr "Wyłącz tryb samolotowy" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is Off" +msgstr "Sieć Wi-Fi jest wyłączona" + +#: js/ui/status/network.js:804 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi musi być włączone, aby połączyć z siecią." + +#: js/ui/status/network.js:805 +msgid "Turn On Wi-Fi" +msgstr "Włącz sieć Wi-Fi" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi Networks" +msgstr "Sieci Wi-Fi" + +#: js/ui/status/network.js:832 +msgid "Select a network" +msgstr "Wybór sieci" + +#: js/ui/status/network.js:861 +msgid "No Networks" +msgstr "Brak sieci" + +#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Należy użyć przełącznika sprzętowego, aby wyłączyć" + +#: js/ui/status/network.js:1158 +msgid "Select Network" +msgstr "Wybierz sieć" + +#: js/ui/status/network.js:1164 +msgid "Wi-Fi Settings" +msgstr "Ustawienia sieci Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1287 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspot %s jest włączony" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Not Connected" +msgstr "Nie połączono z siecią %s" + +#: js/ui/status/network.js:1399 +msgid "connecting…" +msgstr "łączenie…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1402 +msgid "authentication required" +msgstr "wymagane jest uwierzytelnienie" + +#: js/ui/status/network.js:1404 +msgid "connection failed" +msgstr "połączenie się nie powiodło" + +#: js/ui/status/network.js:1454 +msgid "VPN Settings" +msgstr "Ustawienia sieci VPN" + +#: js/ui/status/network.js:1471 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1481 +msgid "VPN Off" +msgstr "Wyłączono sieć VPN" + +#: js/ui/status/network.js:1542 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Ustawienia sieci" + +#: js/ui/status/network.js:1571 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s połączenie przewodowe" +msgstr[1] "%s połączenia przewodowe" +msgstr[2] "%s połączeń przewodowych" + +#: js/ui/status/network.js:1575 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s połączenie Wi-Fi" +msgstr[1] "%s połączenia Wi-Fi" +msgstr[2] "%s połączeń Wi-Fi" + +#: js/ui/status/network.js:1579 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s połączenie modemowe" +msgstr[1] "%s połączenia modemowe" +msgstr[2] "%s połączeń modemowych" + +#: js/ui/status/network.js:1708 +msgid "Connection failed" +msgstr "Połączenie się nie powiodło" + +#: js/ui/status/network.js:1709 +msgid "Activation of network connection failed" +msgstr "Włączenie połączenia sieciowego się nie powiodło" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Wyłączono nocne światło" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Włączono nocne światło" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Włącz" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Wyłącz do jutra" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "Ustawienia zasilania" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "Naładowane" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "Nie jest ładowane" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "Obliczanie…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Pozostało: %d∶%02d (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Do naładowania: %d∶%02d (%d%%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d%%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Ekran jest udostępniany" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Wyłącz" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Włączono tryb samolotowy" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "Przełącz użytkownika" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "Wyloguj się" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "Ustawienia konta" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "Blokada orientacji" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "Uśpij" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "Wyłącz komputer" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "Nieznane urządzenie Thunderbolt" + +#: js/ui/status/thunderbolt.js:326 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Podczas nieobecności wykryto nowe urządzenie. Proszę je rozłączyć " +"i podłączyć ponownie, aby zacząć je używać." + +#: js/ui/status/thunderbolt.js:329 +msgid "Unauthorized Thunderbolt device" +msgstr "Nieupoważnione urządzenie Thunderbolt" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Wykryto nowe urządzenie, które musi zostać upoważnione przez administratora." + +#: js/ui/status/thunderbolt.js:336 +msgid "Thunderbolt authorization error" +msgstr "Błąd upoważnienia Thunderbolt" + +#: js/ui/status/thunderbolt.js:337 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nie można upoważnić urządzenia Thunderbolt: %s" + +#: js/ui/status/volume.js:136 +msgid "Volume changed" +msgstr "Zmieniono głośność" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "Ten sam obraz" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "Połączone ekrany" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "Tylko zewnętrzny" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "Tylko wbudowany" + +#: js/ui/unlockDialog.js:63 +msgid "Log in as another user" +msgstr "Zaloguj jako inny użytkownik" + +#: js/ui/unlockDialog.js:80 +msgid "Unlock Window" +msgstr "Okno odblokowania" + +#: js/ui/viewSelector.js:180 +msgid "Applications" +msgstr "Programy" + +#: js/ui/viewSelector.js:184 +msgid "Search" +msgstr "Wyszukiwanie" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "Okno „%s” jest gotowe" + +#: js/ui/windowManager.js:60 +msgid "Do you want to keep these display settings?" +msgstr "Zachować te ustawienia ekranu?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:72 +msgid "Revert Settings" +msgstr "Przywróć ustawienia" + +#: js/ui/windowManager.js:75 +msgid "Keep Changes" +msgstr "Zachowaj zmiany" + +#: js/ui/windowManager.js:93 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Zmienione ustawienia zostaną przywrócone za %d sekundę" +msgstr[1] "Zmienione ustawienia zostaną przywrócone za %d sekundy" +msgstr[2] "Zmienione ustawienia zostaną przywrócone za %d sekund" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:669 +#, javascript-format +msgid "%d × %d" +msgstr "%d×%d" + +#: js/ui/windowMenu.js:29 +msgid "Minimize" +msgstr "Zminimalizuj" + +#: js/ui/windowMenu.js:36 +msgid "Unmaximize" +msgstr "Cofnij maksymalizację" + +#: js/ui/windowMenu.js:40 +msgid "Maximize" +msgstr "Zmaksymalizuj" + +#: js/ui/windowMenu.js:47 +msgid "Move" +msgstr "Przenieś" + +#: js/ui/windowMenu.js:53 +msgid "Resize" +msgstr "Zmień rozmiar" + +#: js/ui/windowMenu.js:60 +msgid "Move Titlebar Onscreen" +msgstr "Przenieś pasek tytułowy na ekran" + +#: js/ui/windowMenu.js:65 +msgid "Always on Top" +msgstr "Zawsze na wierzchu" + +#: js/ui/windowMenu.js:84 +msgid "Always on Visible Workspace" +msgstr "Zawsze na widocznym obszarze roboczym" + +#: js/ui/windowMenu.js:98 +msgid "Move to Workspace Left" +msgstr "Przenieś do lewego obszaru" + +#: js/ui/windowMenu.js:104 +msgid "Move to Workspace Right" +msgstr "Przenieś do prawego obszaru" + +#: js/ui/windowMenu.js:110 +msgid "Move to Workspace Up" +msgstr "Przenieś do górnego obszaru" + +#: js/ui/windowMenu.js:116 +msgid "Move to Workspace Down" +msgstr "Przenieś do dolnego obszaru" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Przenieś na górny monitor" + +#: js/ui/windowMenu.js:143 +msgid "Move to Monitor Down" +msgstr "Przenieś na dolny monitor" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Left" +msgstr "Przenieś na lewy monitor" + +#: js/ui/windowMenu.js:161 +msgid "Move to Monitor Right" +msgstr "Przenieś na prawy monitor" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Kalendarz programu Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Wyświetla wersję" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Tryb używany przez GDM dla ekranu logowania" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Używa podanego trybu, np. „gdm” dla ekranu logowania" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Wyświetla listę możliwych trybów" + +#: src/shell-app.c:266 +msgctxt "program" +msgid "Unknown" +msgstr "Nieznany" + +#: src/shell-app.c:517 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Uruchomienie „%s” się nie powiodło" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Hasła się nie zgadzają." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Hasło nie może być puste" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Okno uwierzytelniania zostało odrzucone przez użytkownika" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u wyjście" +msgstr[1] "%u wyjścia" +msgstr[2] "%u wyjść" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u wejście" +msgstr[1] "%u wejścia" +msgstr[2] "%u wejść" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Dźwięki systemowe" + +msgctxt "button" +msgid "Boot Options" +msgstr "Opcje uruchamiania" diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 0000000..6d69fca --- /dev/null +++ b/po/pt.po @@ -0,0 +1,2237 @@ +# gnome-shell's Portuguese translation. +# Copyright © 2010, 2011, 2012, 2013, 2014 gnome-shell +# This file is distributed under the same license as the gnome-shell package. +# Duarte Loreto , 2010, 2011, 2012, 2013, 2014. +# Rui Gouveia , 2011. +# António Lima , 2013. +# Tiago Santos , 2014 - 2016. +# Bruno Ramalhete , 2015. +# Pedro Albuquerque , 2014, 2015. +# Sérgio Cardeira , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: 3.14\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2016-09-06 21:12+0000\n" +"PO-Revision-Date: 2016-09-07 06:46+0100\n" +"Last-Translator: Tiago Santos \n" +"Language-Team: Português <>\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.7.1\n" +"X-Project-Style: gnome\n" +"X-Language: pt_PT\n" +"X-Source-Language: C\n" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +msgid "GNOME Shell Extension Preferences" +msgstr "Preferências das extensões á interface GNOME" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurar extensões à interface GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Shell GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gestão de janelas e iniciação de aplicações" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Ativa, com Alt-F2, ferramentas internas úteis para programadores e quem " +"realiza testes" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permite o acesso a ferramentas internas de depuração e monitorização usando " +"o diálogo Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs das extensões a ativar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"As extensões da interface GNOME têm uma propriedade UUID; esta chave lista " +"extensões que deverão ser carregadas. Qualquer extensão que deseje ser " +"carregada tem de estar nesta lista. Pode também manipular esta lista com os " +"métodos D-Bus EnableExtension e DisableExtension de org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disables the validation of extension version compatibility" +msgstr "Desativa a validação de compatibilidade de versão da extensão" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"A interface GNOME só vai carregar extensões que indiquem suportar a versão " +"atual. Ativar esta opção irá desativar esta verificação e tentará carregar " +"todas as extensões, independentemente das versões que elas indiquem suportar." + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Lista de IDs de ficheiros de ambiente de trabalho das aplicações favoritas" + +#: data/org.gnome.shell.gschema.xml.in:36 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"As aplicações correspondentes a estes identificadores serão mostradas na " +"área de favoritas." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "App Picker View" +msgstr "Vista de escolha de aplicações" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "Index of the currently selected view in the application picker." +msgstr "Índice da vista atualmente selecionada na escolha de aplicações." + +#: data/org.gnome.shell.gschema.xml.in:50 +msgid "History for command (Alt-F2) dialog" +msgstr "Histórico do diálogo de comando (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:55 +msgid "History for the looking glass dialog" +msgstr "Histórico do diálogo de pesquisa" + +#: data/org.gnome.shell.gschema.xml.in:59 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "Mostrar sempre 'Terminar sessão' no menu de utilizador." + +#: data/org.gnome.shell.gschema.xml.in:60 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"Esta chave ignora a ocultação automática do 'Terminar sessão' em situações " +"de utilizador-único, sessão-única." + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Se recordar ou não a senha para montar sistemas de ficheiros encriptados ou " +"remotos" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"A consola vai pedir uma senha quando um dispositivo encriptado ou sistema de " +"ficheiros remoto for montado. Se a senha pode ser gravada para utilização " +"futura, estará disponível uma caixa de seleção 'Recordar senha'. Esta chave " +"define o estado predefinido dessa caixa de seleção." + +#: data/org.gnome.shell.gschema.xml.in:77 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Se o adaptador padrão Bluetooth tem dispositivos configurados associados a " +"ele" + +#: data/org.gnome.shell.gschema.xml.in:78 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"A shell só vai mostrar um item de menu do adaptador Bluetooth se este " +"estiver ligado ou se existirem dispositivos associados configurados com o " +"adaptador predefinido. Isto será reposto se se verificar que o adaptador " +"predefinido não tem dispositivos associados a ele." + +#: data/org.gnome.shell.gschema.xml.in:93 +msgid "Keybinding to open the application menu" +msgstr "Atalho de teclado para abrir o menu de aplicações" + +#: data/org.gnome.shell.gschema.xml.in:94 +msgid "Keybinding to open the application menu." +msgstr "Atalho de teclado para abrir o menu de aplicações." + +#: data/org.gnome.shell.gschema.xml.in:100 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "Atalho de teclado para abrir a vista \"Mostrar aplicações\"" + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"Atalho de teclado para abrir a vista \"Mostrar aplicações\" da vista geral " +"de atividades." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the overview" +msgstr "Atalho de teclado para abrir a vista geral" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the Activities Overview." +msgstr "Atalho de teclado para abrir a vista geral de atividades." + +#: data/org.gnome.shell.gschema.xml.in:115 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Atalho de teclado para alternar a visibilidade da lista de notificação" + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Atalho de teclado para alternar a visibilidade da lista de notificação." + +#: data/org.gnome.shell.gschema.xml.in:122 +msgid "Keybinding to focus the active notification" +msgstr "Atalho de teclado para focar a notificação ativa" + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to focus the active notification." +msgstr "Atalho de teclado para focar a notificação ativa." + +#: data/org.gnome.shell.gschema.xml.in:129 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Atalho de teclado que pausa e retoma todos os tweens em execução, para " +"depuração de erros" + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Which keyboard to use" +msgstr "Que teclado utilizar" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "The type of keyboard to use." +msgstr "O tipo de teclado a utilizar." + +#: data/org.gnome.shell.gschema.xml.in:150 +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "Limit switcher to current workspace." +msgstr "Limitar troca à área de trabalho atual." + +#: data/org.gnome.shell.gschema.xml.in:151 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Se verdadeiro, só as aplicações com janelas na área de trabalho atual são " +"mostradas para troca. Senão, são incluídas todas as aplicações." + +#: data/org.gnome.shell.gschema.xml.in:168 +msgid "The application icon mode." +msgstr "O modo do ícone da aplicação." + +#: data/org.gnome.shell.gschema.xml.in:169 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"Configura como as janelas são mostradas no alternador. Possibilidades " +"válidas são 'thumbnail-only' (mostra uma miniatura da janela), 'app-icon-" +"only' (mostra só o ícone da aplicação) ou 'both' (ambas)." + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Se verdadeiro, só janelas da área de trabalho atual são apresentadas para " +"troca. Senão, são incluídas todas as janelas." + +#: data/org.gnome.shell.gschema.xml.in:189 +msgid "Attach modal dialog to the parent window" +msgstr "Anexar diálogo modal à janela mãe" + +#: data/org.gnome.shell.gschema.xml.in:190 +#: data/org.gnome.shell.gschema.xml.in:199 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Esta chave ignora a chave em org.gnome.mutter ao executar a interface GNOME." + +#: data/org.gnome.shell.gschema.xml.in:198 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Ativar anexar nas margens ao largar janelas junto às margens do ecrã" + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Workspaces are managed dynamically" +msgstr "Áreas de trabalho são geridas dinamicamente" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces only on primary monitor" +msgstr "Áreas de trabalho só no monitor principal" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Atrasar alterações de foco nos modos de rato até que o ponteiro pare de se " +"mover" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Sessão na rede" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:117 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Ocorreu um erro ao ler o diálogo de preferências de %s:" + +#: js/extensionPrefs/main.js:149 +msgid "GNOME Shell Extensions" +msgstr "Extensões da interface do GNOME" + +#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 +#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179 +#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195 +#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916 +msgid "Cancel" +msgstr "Cancelar" + +#: js/gdm/authPrompt.js:169 js/gdm/authPrompt.js:216 js/gdm/authPrompt.js:448 +msgid "Next" +msgstr "Seguinte" + +#: js/gdm/authPrompt.js:212 js/ui/shellMountOperation.js:403 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Desbloquear" + +#: js/gdm/authPrompt.js:214 +msgctxt "button" +msgid "Sign In" +msgstr "Iniciar sessão" + +#: js/gdm/loginDialog.js:285 +msgid "Choose Session" +msgstr "Escolher sessão" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:435 +msgid "Not listed?" +msgstr "Não está listada?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:854 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(por ex., utilizador ou %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271 +#: js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Utilizador: " + +#: js/gdm/loginDialog.js:1196 +msgid "Login Window" +msgstr "Janela de início de sessão" + +#: js/gdm/util.js:341 +msgid "Authentication error" +msgstr "Erro de autenticação" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:473 +msgid "(or swipe finger)" +msgstr "(ou utilize a impressão digital)" + +#: js/misc/util.js:119 +msgid "Command not found" +msgstr "Comando não encontrado" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:152 +msgid "Could not parse command:" +msgstr "Impossível processar o comando:" + +#: js/misc/util.js:160 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Falha ao executar “%s”:" + +#. Translators: Time in 24h format +#: js/misc/util.js:191 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:197 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ontem, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:203 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:209 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:215 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:220 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:226 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ontem, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:232 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:238 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:244 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login +#. * window, until we know the title of the actual login page +#: js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "Autenticação Web redirecionada" + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:62 js/ui/status/location.js:426 +msgid "Deny Access" +msgstr "Negar acesso" + +#: js/ui/accessDialog.js:63 js/ui/status/location.js:429 +msgid "Grant Access" +msgstr "Conceder acesso" + +#: js/ui/appDisplay.js:794 +msgid "Frequently used applications will appear here" +msgstr "As aplicações frequentemente utilizadas aparecem aqui" + +#: js/ui/appDisplay.js:914 +msgid "Frequent" +msgstr "Frequentes" + +#: js/ui/appDisplay.js:921 +msgid "All" +msgstr "Todas" + +#: js/ui/appDisplay.js:1853 +msgid "New Window" +msgstr "Nova janela" + +#: js/ui/appDisplay.js:1881 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Remover dos favoritos" + +#: js/ui/appDisplay.js:1887 +msgid "Add to Favorites" +msgstr "Adicionar aos favoritos" + +#: js/ui/appDisplay.js:1897 +msgid "Show Details" +msgstr "Mostrar detalhes" + +#: js/ui/appFavorites.js:134 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s foi adicionada aos seus favoritos." + +#: js/ui/appFavorites.js:168 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s foi removida dos seus favoritos." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Selecione o dispositivo de áudio" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Definições de som" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Auscultadores" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Auscultadores com microfone" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "Microfone" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Alterar o fundo…" + +#: js/ui/backgroundMenu.js:21 +msgid "Display Settings" +msgstr "Definições de ecrã" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:374 +msgid "Settings" +msgstr "Definições" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "Q" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "Q" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "Mês anterior" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr "Mês seguinte" + +#: js/ui/calendar.js:605 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:660 +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:721 +msgctxt "event list time" +msgid "All Day" +msgstr "Dia completo" + +#: js/ui/calendar.js:836 +msgid "Events" +msgstr "Eventos" + +#: js/ui/calendar.js:845 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:849 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: js/ui/calendar.js:931 +msgid "Notifications" +msgstr "Notificações" + +#: js/ui/calendar.js:1082 +msgid "No Notifications" +msgstr "Sem notificações" + +#: js/ui/calendar.js:1085 +msgid "No Events" +msgstr "Sem eventos" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Dispositivo externo ligado" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Dispositivo externo desligado" + +#: js/ui/components/autorunManager.js:355 +#, javascript-format +msgid "Open with %s" +msgstr "Abrir com %s" + +#: js/ui/components/keyring.js:120 js/ui/components/polkitAgent.js:315 +msgid "Password:" +msgstr "Senha:" + +#: js/ui/components/keyring.js:153 +msgid "Type again:" +msgstr "Insira novamente:" + +#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269 +#: js/ui/status/network.js:352 js/ui/status/network.js:919 +msgid "Connect" +msgstr "Ligar" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:233 js/ui/components/networkAgent.js:245 +#: js/ui/components/networkAgent.js:273 js/ui/components/networkAgent.js:293 +#: js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Senha: " + +#. static WEP +#: js/ui/components/networkAgent.js:238 +msgid "Key: " +msgstr "Chave: " + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Identidade: " + +#: js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Senha da chave privada: " + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Serviço: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658 +msgid "Authentication required by wireless network" +msgstr "A rede sem fios requer autenticação" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"São necessárias senhas ou chaves de encriptação para aceder à rede sem fios " +"“%s”." + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662 +msgid "Wired 802.1X authentication" +msgstr "Autenticação 802.1X com fios" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Nome da rede: " + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666 +msgid "DSL authentication" +msgstr "Autenticação DSL" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672 +msgid "PIN code required" +msgstr "Necessário código PIN" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673 +msgid "PIN code is needed for the mobile broadband device" +msgstr "É necessário o código PIN para o dispositivo de banda larga móvel" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679 +msgid "Mobile broadband network password" +msgstr "Senha da rede de banda larga móvel" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663 +#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "É necessária uma senha para se ligar a “%s”." + +#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658 +msgid "Network Manager" +msgstr "Gestor de rede" + +#: js/ui/components/polkitAgent.js:60 +msgid "Authentication Required" +msgstr "Necessária autenticação" + +#: js/ui/components/polkitAgent.js:102 +msgid "Administrator" +msgstr "Administrador" + +#: js/ui/components/polkitAgent.js:182 +msgid "Authenticate" +msgstr "Autenticar" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:301 js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "Desculpe, não resultou. Por favor, tente novamente." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:760 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s é agora conhecido como %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:155 +msgid "Windows" +msgstr "Janelas" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +msgid "Show Applications" +msgstr "Mostrar aplicações" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:449 +msgid "Dash" +msgstr "Traço" + +#. 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:73 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:80 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:160 +msgid "Add world clocks…" +msgstr "Adicionar relógios do mundo" + +#: js/ui/dateMenu.js:161 +msgid "World Clocks" +msgstr "Relógios do mundo" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Terminar sessão de %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Terminar sessão" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "A sessão de %s terminará automaticamente dentro de %d segundo." +msgstr[1] "A sessão de %s terminará automaticamente dentro de %d segundos." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "A sua sessão terminará automaticamente dentro de %d segundo." +msgstr[1] "A sua sessão terminará automaticamente dentro de %d segundos." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Terminar sessão" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Desligar" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalar atualizações e desligar" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "O sistema desligar-se-á automaticamente dentro de %d segundo." +msgstr[1] "O sistema desligar-se-á automaticamente dentro de %d segundos." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalar atualizações pendentes de aplicações" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Desligar" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "O sistema reiniciar-se-á automaticamente dentro de %d segundo." +msgstr[1] "O sistema reiniciar-se-á automaticamente dentro de %d segundos." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reiniciar e instalar atualizações" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"O sistema reiniciar-se-á automaticamente e instalar atualizações dentro de " +"%d segundo." +msgstr[1] "" +"O sistema reiniciar-se-á automaticamente e instalar atualizações dentro de " +"%d segundos." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reiniciar & Instalar" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalar & Desligar" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Desligar depois das atualizações serem instaladas" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reiniciar e instalar novas versões" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s será instalado após o reiniciar. Atualizar instalação pode demorar " +"muito tempo: assegure-se que criou cópias de segurança e que o seu " +"computador está ligado à corrente." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"A funcionar com bateria: por favor, ligue à corrente antes de instalar " +"atualizações." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "Algumas aplicações estão ocupadas ou têm trabalho não gravado." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Existem outros utilizadores com sessões ativas." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:671 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remoto)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:674 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consola)" + +#: js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Instalar" + +#: js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Transferir e instalar \"%s\" de extensions.gnome.org?" + +#: js/ui/keyboard.js:742 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "Teclado" + +#. translators: 'Hide' is a verb +#: js/ui/legacyTray.js:65 +msgid "Hide tray" +msgstr "Ocultar tabuleiro" + +#: js/ui/legacyTray.js:106 +msgid "Status Icons" +msgstr "Ícones de estado" + +#: js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "Nenhuma extensão instalada" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s não emitiu qualquer erro." + +#: js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "Ocultar erros" + +#: js/ui/lookingGlass.js:707 js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "Mostrar erros" + +#: js/ui/lookingGlass.js:716 +msgid "Enabled" +msgstr "Ativo" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:719 src/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Inativo" + +#: js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "Erro" + +#: js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "Data inválida" + +#: js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "A transferir" + +#: js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "Ver fonte" + +#: js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "Página Web" + +#: js/ui/messageList.js:543 +msgid "Clear section" +msgstr "Limpar secção" + +#: js/ui/messageTray.js:1486 +msgid "System Information" +msgstr "Informação do sistema" + +#: js/ui/mpris.js:194 +msgid "Unknown artist" +msgstr "Artista desconhecido" + +#: js/ui/mpris.js:195 +msgid "Unknown title" +msgstr "Titulo desconhecido" + +#: js/ui/mpris.js:217 +msgid "Media" +msgstr "Média" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Desfazer" + +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Visão geral" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Escreva para procurar…" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Sair" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Atividades" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:807 +msgid "Top Bar" +msgstr "Barra superior" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Insira um comando" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:162 +msgid "Close" +msgstr "Fechar" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "A reiniciar…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:85 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nova mensagem" +msgstr[1] "%d novas mensagens" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nova notificação" +msgstr[1] "%d novas notificações" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:382 +msgid "Lock" +msgstr "Bloquear" + +#: js/ui/screenShield.js:704 +msgid "GNOME needs to lock the screen" +msgstr "O GNOME precisa de bloquear o ecrã" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291 +msgid "Unable to lock" +msgstr "Impossível bloquear" + +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292 +msgid "Lock was blocked by an application" +msgstr "Bloquear foi bloqueado por uma aplicação" + +#: js/ui/search.js:617 +msgid "Searching…" +msgstr "A procurar…" + +#: js/ui/search.js:619 +msgid "No results." +msgstr "Nenhum resultado." + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Copiar" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Colar" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Mostrar texto" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Ocultar texto" + +#: js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "Senha" + +#: js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "Recordar senha" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Acessibilidade" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Ampliação" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Locutor de ecrã" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Teclado de ecrã" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Alertas visuais" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Teclas pegajosas" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Teclas lentas" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Teclas saltantes" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Teclas de rato" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Alto contraste" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Texto grande" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624 +msgid "Bluetooth Settings" +msgstr "Definições Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d ligado" +msgstr[1] "%d ligados" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "Desligado" + +#: js/ui/status/bluetooth.js:140 +msgid "Not In Use" +msgstr "Não em uso" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279 +msgid "Turn On" +msgstr "Ligar" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178 +#: js/ui/status/network.js:353 js/ui/status/network.js:1279 +#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90 +#: js/ui/status/rfkill.js:117 +msgid "Turn Off" +msgstr "Desligar" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Luminosidade" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "Mostrar a disposição de teclado" + +#: js/ui/status/location.js:107 js/ui/status/location.js:215 +msgid "Location Enabled" +msgstr "Localização ativada" + +#: js/ui/status/location.js:108 js/ui/status/location.js:216 +msgid "Disable" +msgstr "Desativar" + +#: js/ui/status/location.js:109 +msgid "Privacy Settings" +msgstr "Definições de privacidade" + +#: js/ui/status/location.js:214 +msgid "Location In Use" +msgstr "Localização em uso" + +#: js/ui/status/location.js:218 +msgid "Location Disabled" +msgstr "Localização desativada" + +#: js/ui/status/location.js:219 +msgid "Enable" +msgstr "Ativar" + +#. Translators: %s is an application name +#: js/ui/status/location.js:435 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Dar a %s permissão para usar a localização?" + +#: js/ui/status/location.js:437 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Acesso à localização pode ser alterado a qualquer altura a partir das " +"definições de privacidade." + +#: js/ui/status/network.js:101 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:451 js/ui/status/network.js:1308 +#, javascript-format +msgid "%s Off" +msgstr "%s desligado" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 +#, javascript-format +msgid "%s Connected" +msgstr "%s ligado" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:459 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s não geridos" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:462 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s a desligar" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:469 js/ui/status/network.js:1300 +#, javascript-format +msgid "%s Connecting" +msgstr "%s a ligar" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:472 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s requer autenticação" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:480 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware em falta 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:484 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s indisponível" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:487 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Falha na ligação a %s" + +#: js/ui/status/network.js:503 +msgid "Wired Settings" +msgstr "Definições de ligação com fios" + +#: js/ui/status/network.js:545 +msgid "Mobile Broadband Settings" +msgstr "Definições da banda larga móvel" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:588 js/ui/status/network.js:1305 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Equipamento %s desativado" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:592 +#, javascript-format +msgid "%s Disabled" +msgstr "%s desativado" + +#: js/ui/status/network.js:632 +msgid "Connect to Internet" +msgstr "Ligar à Internet" + +#: js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "Modo Avião está ligado" + +#: js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "O Wi-Fi é desativado quando o modo de vôo é ligado." + +#: js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "Desligar modo Avião" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi está desligado" + +#: js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "O Wi-Fi tem de ser ligado para se poder ligar a uma rede." + +#: js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Ligar o Wi-Fi" + +#: js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Redes Wi-Fi" + +#: js/ui/status/network.js:853 +msgid "Select a network" +msgstr "Selecionar uma rede" + +#: js/ui/status/network.js:883 +msgid "No Networks" +msgstr "Nenhuma rede" + +#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Usar o interruptor físico para desligar" + +#: js/ui/status/network.js:1171 +msgid "Select Network" +msgstr "Selecionar rede" + +#: js/ui/status/network.js:1177 +msgid "Wi-Fi Settings" +msgstr "Definições de Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspot %s ativo" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1311 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s não ligado" + +#: js/ui/status/network.js:1411 +msgid "connecting..." +msgstr "a ligar..." + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1414 +msgid "authentication required" +msgstr "autenticação necessária" + +#: js/ui/status/network.js:1416 +msgid "connection failed" +msgstr "falha ao ligar" + +#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Definições de rede" + +#: js/ui/status/network.js:1484 +msgid "VPN Settings" +msgstr "Definições de VPN" + +#: js/ui/status/network.js:1503 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1513 +msgid "VPN Off" +msgstr "VPN desligado" + +#: js/ui/status/network.js:1697 +msgid "Connection failed" +msgstr "Falha na ligação" + +#: js/ui/status/network.js:1698 +msgid "Activation of network connection failed" +msgstr "Falha na ativação da ligação à rede" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Definições de energia" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Totalmente carregado" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "A estimar…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d restantes (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d até estar cheio (%d%%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Modo Avião ligado" + +#: js/ui/status/system.js:351 +msgid "Switch User" +msgstr "Alternar utilizador" + +#: js/ui/status/system.js:356 +msgid "Log Out" +msgstr "Terminar sessão" + +#: js/ui/status/system.js:361 +msgid "Account Settings" +msgstr "Definições de conta" + +#: js/ui/status/system.js:378 +msgid "Orientation Lock" +msgstr "Orientação de bloqueio" + +#: js/ui/status/system.js:386 +msgid "Suspend" +msgstr "Suspender" + +#: js/ui/status/system.js:389 +msgid "Power Off" +msgstr "Desligar" + +#: js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "Volume alterado" + +#: js/ui/status/volume.js:162 +msgid "Volume" +msgstr "Volume" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Iniciar sessão como outro utilizador" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Destrancar janela" + +#: js/ui/viewSelector.js:159 +msgid "Applications" +msgstr "Aplicações" + +#: js/ui/viewSelector.js:163 +msgid "Search" +msgstr "Procurar" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” está pronto" + +#: js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "Deseja manter estas definições de visualização?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:82 +msgid "Revert Settings" +msgstr "Reverter definições" + +#: js/ui/windowManager.js:85 +msgid "Keep Changes" +msgstr "Manter alterações" + +#: js/ui/windowManager.js:103 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "As alterações às definições serão revertidas em %d segundo" +msgstr[1] "As alterações às definições serão revertidas em %d segundos" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:658 +#, javascript-format +msgid "%d x %d" +msgstr "%d x %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Minimizar" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Remover maximização" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Maximizar" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Mover" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Redimensionar" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Mover barra de título no ecrã" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Sempre no topo" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Sempre na área de trabalho visível" + +#: js/ui/windowMenu.js:105 +msgid "Move to Workspace Left" +msgstr "Mover para a área de trabalho esquerda" + +#: js/ui/windowMenu.js:110 +msgid "Move to Workspace Right" +msgstr "Mover para a área de trabalho direita" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Mover para a área de trabalho acima" + +#: js/ui/windowMenu.js:120 +msgid "Move to Workspace Down" +msgstr "Mover para a área de trabalho abaixo" + +#: js/ui/windowMenu.js:136 +msgid "Move to Monitor Up" +msgstr "Mover para o monitor acima" + +#: js/ui/windowMenu.js:142 +msgid "Move to Monitor Down" +msgstr "Mover para o monitor abaixo" + +#: js/ui/windowMenu.js:148 +msgid "Move to Monitor Left" +msgstr "Mover para o monitor à esquerda" + +#: js/ui/windowMenu.js:154 +msgid "Move to Monitor Right" +msgstr "Mover para o monitor à direita" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendário do Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#. translators: +#. * The number of sound outputs on a particular device +#: src/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u saída" +msgstr[1] "%u saídas" + +#. translators: +#. * The number of sound inputs on a particular device +#: src/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entradas" + +#: src/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sons de sistema" + +#: src/main.c:381 +msgid "Print version" +msgstr "Versão de impressão" + +#: src/main.c:387 +msgid "Mode used by GDM for login screen" +msgstr "Modo utilizado pelo GDM para o ecrã de início de sessão" + +#: src/main.c:393 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "" +"Usar um modo específico, por ex. \"gdm\" para o ecrã de início de sessão" + +#: src/main.c:399 +msgid "List possible modes" +msgstr "Listar modos possíveis" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Desconhecida" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Falha ao iniciar “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "As senhas não coincidem." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "A senha não pode estar vazia" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "O diálogo de autenticação foi fechado pelo utilizador" + +#~ msgid "System" +#~ msgstr "Sistema" + +#~ msgid "Show the notification list" +#~ msgstr "Mostrar lista de notificação" + +#~ msgid "Focus the active notification" +#~ msgstr "Foco sobre a notificação ativa" + +#~ msgid "Show the overview" +#~ msgstr "Mostrar a vista geral" + +#~ msgid "Show all applications" +#~ msgstr "Mostrar todas as aplicações" + +#~ msgid "Open the application menu" +#~ msgstr "Abrir o menu de aplicações" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Mostrar o número da semana no calendário" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Se verdadeiro, mostra o número ISO da semana no calendário." + +#~ msgid "Use as Internet connection" +#~ msgstr "Utilizar como ligação à Internet" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s está a pedir acesso à sua localização." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Interface GNOME (compositor wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d Dispositivo ligado" +#~ msgstr[1] "%d Dispositivos ligados" + +#~ msgid "Authentication required" +#~ msgstr "Autenticação necessária" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Bateria" + +#~ msgid "Airplane Mode" +#~ msgstr "Modo Avião" + +#~ msgid "On" +#~ msgstr "Ligado" + +#~ msgid "Show the message tray" +#~ msgstr "Apresentar a zona de notificações" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l:%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Dom" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Seg" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Ter" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Qua" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Qui" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Sex" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Sáb" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nada Agendado" + +#~ msgid "Today" +#~ msgstr "Hoje" + +#~ msgid "Tomorrow" +#~ msgstr "Amanhã" + +#~ msgid "This week" +#~ msgstr "Esta semana" + +#~ msgid "Next week" +#~ msgstr "Próxima semana" + +#~ msgid "Removable Devices" +#~ msgstr "Dispositivos Removíveis" + +#~ msgid "Eject" +#~ msgstr "Ejetar" + +#~ msgid "Invitation" +#~ msgstr "Convite" + +#~ msgid "Call" +#~ msgstr "Chamada" + +#~ msgid "File Transfer" +#~ msgstr "Transferência de Ficheiro" + +#~ msgid "Chat" +#~ msgstr "Diálogo" + +#~ msgid "Unmute" +#~ msgstr "Ativar Som" + +#~ msgid "Mute" +#~ msgstr "Silenciar" + +#~ msgid "Invitation to %s" +#~ msgstr "Convite para %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s está a convidá-lo para se juntar a %s" + +#~ msgid "Decline" +#~ msgstr "Recusar" + +#~ msgid "Accept" +#~ msgstr "Aceitar" + +#~ msgid "Video call from %s" +#~ msgstr "Chamada vídeo de %s" + +#~ msgid "Call from %s" +#~ msgstr "Chamada de %s" + +#~ msgid "Answer" +#~ msgstr "Atender" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s está a enviar-lhe %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s deseja a sua autorização para ver quando está ligado" + +#~ msgid "Authentication failed" +#~ msgstr "Falha na autenticação" + +#~ msgid "Encryption error" +#~ msgstr "Erro de encriptação" + +#~ msgid "Certificate not provided" +#~ msgstr "Não foi disponibilizado o certificado" + +#~ msgid "Certificate untrusted" +#~ msgstr "Certificado não é de confiança" + +#~ msgid "Certificate expired" +#~ msgstr "Certificado expirou" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificado não está ativo" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Nome de máquina incorreto no certificado" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Impressão digital incorreta no certificado" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificado assinado pelo próprio" + +#~ msgid "Status is set to offline" +#~ msgstr "Estado definido como desligado" + +#~ msgid "Encryption is not available" +#~ msgstr "Encriptação indisponível" + +#~ msgid "Certificate is invalid" +#~ msgstr "Certificado inválido" + +#~ msgid "Connection has been refused" +#~ msgstr "A ligação foi recusada" + +#~ msgid "Connection can't be established" +#~ msgstr "Incapaz de estabelecer a ligação" + +#~ msgid "Connection has been lost" +#~ msgstr "A ligação foi perdida" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Esta conta já se encontra ligada ao servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "A ligação foi substituída por uma nova ligação utilizando o mesmo recurso" + +#~ msgid "The account already exists on the server" +#~ msgstr "A conta já existe no servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "O servidor está de momento demasiado ocupado para gerir a ligação" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Certificado foi revogado" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Certificado tem um algoritmo de cifra inseguro ou é criptologicamente " +#~ "fraco" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "O comprimento do certificado do servidor ou a profundidade da hierarquia " +#~ "do certificado do servidor excede os limites impostos pela biblioteca " +#~ "criptográfica" + +#~ msgid "Internal error" +#~ msgstr "Erro interno" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Incapaz de se ligar a %s" + +#~ msgid "View account" +#~ msgstr "Visualizar a conta" + +#~ msgid "Open Calendar" +#~ msgstr "Abrir o Calendário" + +#~ msgid "Date & Time Settings" +#~ msgstr "Definições de Data & Hora" + +#~ msgid "Open" +#~ msgstr "Abrir" + +#~ msgid "Remove" +#~ msgstr "Remover" + +#~ msgid "Clear Messages" +#~ msgstr "Limpar Mensagens" + +#~ msgid "Notification Settings" +#~ msgstr "Definições de Notificação" + +#~ msgid "Tray Menu" +#~ msgstr "Menu de Bandeja" + +#~ msgid "No Messages" +#~ msgstr "Nenhuma Mensagem" + +#~ msgid "Message Tray" +#~ msgstr "Zona de Notificações" + +#~ msgid "Captive Portal" +#~ msgstr "Portal Cativo" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "O nível máximo de precisão de localização." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Configura o nível máximo de precisão de localização que é permitido às " +#~ "aplicações ver. Opções válidas são 'off' (desativa o rastreamento de " +#~ "posição), 'country' (país), 'city' (cidade), 'neighborhood' (bairro), " +#~ "'street' (rua) e 'exact' (exata) (por norma requer um receptor GPS). Note " +#~ "que isto apenas controla o que o GeoClue irá permitir às aplicações ver e " +#~ "elas poderão encontrar a localização do utilizador por si, utilizando " +#~ "recursos de rede (com uma precisão máxima de nível de rua)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Organização dos botões na barra de título" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Esta chave sobrepõe a chave em org.gnome.desktop.wm.preferences ao " +#~ "executar o GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Extensão" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Selecione uma extensão a configurar utilizando a caixa de seleção acima." + +#~ msgid "calendar:MY" +#~ msgstr "calendário:MY" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Lista de categorias que deveriam ser apresentadas como pastas" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Cada nome de categoria nesta lista será representada como uma pasta na " +#~ "vista de aplicações, em vez de ser apresentada embutira na vista " +#~ "principal." + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d de %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d de %B de %Y, %H:%M" + +#~ msgid "Authorization request from %s" +#~ msgstr "Pedido de autorização de %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "O dispositivo %s deseja emparelhar com este computador" + +#~ msgid "Allow" +#~ msgstr "Permitir" + +#~ msgid "Deny" +#~ msgstr "Negar" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "O dispositivo %s deseja aceder ao serviço '%s'" + +#~ msgid "Grant this time only" +#~ msgstr "Conceder apenas desta vez" + +#~ msgid "Reject" +#~ msgstr "Rejeitar" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Confirmação de emparelhamento para %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "Por favor, confirme se a chave '%06d' corresponde à do dispositivo." + +#~ msgid "Matches" +#~ msgstr "Coincide" + +#~ msgid "Does not match" +#~ msgstr "Não coincide" + +#~ msgid "Pairing request for %s" +#~ msgstr "Pedido de emparelhamento de %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Introduza o PIN indicado no dispositivo." + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Hoje não há nenhuma pérola de sabedoria:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s, o Oráculo, diz" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screenshots" +#~ msgstr "Capturas de Ecrã" + +#~ msgid "Record a screencast" +#~ msgstr "Gravar uma emissão de ecrã" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Se recolher ou não estatísticas sobre a utilização das aplicações" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "O interface normalmente monitoriza aplicações ativas de forma a " +#~ "apresentar as mais utilizadas (por ex: nos iniciadores). Apesar destes " +#~ "dados permanecerem privados, poderá desejar desativar a funcionalidade " +#~ "por questões de privacidade. Note que ao fazê-lo não irá remover os dados " +#~ "até à data gravados." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Utilizado internamente para armazenar a última presença de Mensagens " +#~ "Instantâneas explicitamente definida pelo utilizador. Este valor consta " +#~ "da enumeração TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Utilizado internamente para armazenar o último estado de presença de " +#~ "sessão do utilizador. Este valor consta da enumeração GsmPresenceStatus." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Atalho de teclado para alternar o gravador de ecrã" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Atalho de teclado para alternar o gravador de ecrã." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Taxa de imagens utilizada para a gravação das transmissões de ecrã." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "A taxa de imagens da transmissão de ecrã resultante gravada através do " +#~ "gravador de transmissões de ecrã do Interface GNOME, em imagens por " +#~ "segundo." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "O canal gstreamer utilizado para codificar a transmissão de ecrã" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Define o canal GStreamer utilizado para codificar as gravações. Segue a " +#~ "sintaxe utilizada para o gst-launch. O canal deverá ter um ponto de saída " +#~ "desligado onde o vídeo gravado é gravado. Terá normalmente um ponto de " +#~ "entrada desligado; o resultado desse ponto será escrito no ficheiro de " +#~ "saída. No entanto, o canal poderá tratar da sua própria saída - tal " +#~ "poderá ser utilizado para enviar o resultado para um servidor icecast " +#~ "através do shout2send ou semelhante. Quando não definido ou definido com " +#~ "um valor vazio, será utilizado o canal por omissão. Este é atualmente " +#~ "'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +#~ "threads=%T ! queue ! webmmux' e grava para WEBM utilizando o codec VP8. " +#~ "%T é utilizado como uma variável para se tentar inferir o número ótimo de " +#~ "threads no sistema." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Extensão de ficheiro utilizado para armazenar a transmissão de ecrã" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "O nome do ficheiro da transmissão de ecrã gravada será um nome único " +#~ "baseado na data atual e utilizará esta extensão. Deverá ser alterada " +#~ "quando se gravar para um formato de conteúdo diferente." diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..5a24b57 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,2627 @@ +# Portuguese translations for gnome-shell package. +# Copyright (C) 2019 THE gnome-shell'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Og Maciel , 2009. +# Rodrigo Flores , 2009. +# Felipe Borges , 2010. +# Henrique P. Machado , 2010, 2011. +# Jonh Wendell , 2010. +# Rodrigo Padula , 2011. +# Gabriel F. Vilar , 2011. +# Adorilson Bezerra , 2011, 2014. +# Djavan Fagundes , 2012. +# Juan Diego Martins da Costa Cruz , 2013. +# Fábio Nogueira , 2014. +# Georges Basile Stavracas Neto , 2014. +# Felipe Braga , 2015. +# Artur de Aquino Morais , 2016. +# Enrico Nicoletto , 2013-2018. +# Bruno Lopes da Silva , 2018. +# Rafael Fontenelle , 2013-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-11 18:01+0000\n" +"PO-Revision-Date: 2019-02-20 22:00-0300\n" +"Last-Translator: Rafael Fontenelle \n" +"Language-Team: Portuguese - Brazil \n" +"Language: pt_BR\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: Gtranslator 3.31.90\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistema" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Mostra a lista de notificação" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Ativar as notificação ativas" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Mostrar o panorama" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Mostrar todos os aplicativos" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Abre o menu do aplicativo" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Extensões do shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurar extensões do Shell do GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Gerenciamento de janelas e lançador de aplicativos" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Habilitar ferramentas internas úteis para desenvolvedores e testadores a " +"partir do Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permite acesso a ferramentas internas de depuração e monitoramento usando o " +"diálogo Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUIDs das extensões para habilitar" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"As extensões do GNOME Shell possuem uma propriedade UUID; esta chave lista " +"as extensões que devem ser carregadas. Qualquer extensão que quiser ser " +"carregada precisa estar nesta lista. Você também pode manipular esta lista " +"com os métodos do DBus EnableExtension e DisableExtensions em org.gnome." +"Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Desabilitar extensões do usuário" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Desabilita todas as extensões que o usuário habilitou sem afetar a definição " +"de “enabled-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Desabilita a validação de compatibilidade da versão da extensão" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"O GNOME Shell somente carregará extensões que declaram possuir suporte a " +"versão atual em execução. Ao habilitar esta opção, esta verificação será " +"desabilitada e haverá tentativas de carregar todas as extensões independente " +"das versões que estas declaram suportar." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Lista dos IDs de arquivo de área de trabalho para os aplicativos favoritos" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Os aplicativos correspondentes a estes identificadores serão exibidos na " +"área de favoritos." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Visualização do seletor de aplicativos" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"Índice da visualização atualmente selecionada no seletor de aplicativos." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Histórico do diálogo de comandos (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Histórico do diálogo do shell looking glass" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Sempre mostrar o item de menu “Encerrar sessão” no menu de usuário." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Essa chave sobrescreve a ocultação automática do item de menu “Encerrar " +"sessão” quando houver somente um usuário, em situações de somente uma sessão." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Se lembra ou não as senhas para montar sistemas de arquivos criptografados " +"ou remotos" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"O shell irá pedir uma senha quando um dispositivo criptografado ou um " +"sistema de arquivo remoto for montado. Caso a senha possa ser salva para uso " +"posterior, a caixa de seleção “Lembrar senha” estará presente. Esta chave " +"ajusta o estado padrão da caixa de seleção." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Se o adaptador Bluetooth padrão configurou, ou não, dispositivos associados " +"a ele" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"O shell irá mostrar apenas um item de menu Bluetooth se um adaptador " +"Bluetooth estiver ligado ou se existirem dispositivos configurados " +"associados ao adaptador padrão. Isto será redefinido caso o adaptador padrão " +"sempre seja visto sem possuir dispositivos associados a ele." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Habilitar API de introspecção" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Habilita uma API de D-Bus que permite introspectar o estado do aplicativo do " +"shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Atalho de teclado para abrir um menu de aplicativo" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Atalho de teclado para abrir um menu de aplicativo." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Atalho de teclado para abrir a visualização “Mostrar aplicativos”" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Atalho de teclado para abrir a visualização “Mostrar aplicativos” do " +"panorama de atividades." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Atalho de teclado para abrir o panorama" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Atalho de teclado para abrir o panorama de atividades." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Atalho de teclado para alternar a visibilidade da lista de notificação" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Atalho de teclado para alternar a visibilidade da lista de notificação." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Atalho de teclado para ativar a notificação ativa" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Atalho de teclado para ativar a notificação ativa." + +# Tween pode significar uma contração de Between ou se referir a um termo "in-between" usado em animação gráfica. -- Enrico +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Atalho de teclado que pausa e continua todos os intermediários em execução, " +"a fim de depuração" + +#: data/org.gnome.shell.gschema.xml.in:150 +#| msgid "Show Applications" +msgid "Switch to application 1" +msgstr "Alternar para o aplicativo 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Alternar para o aplicativo 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Alternar para o aplicativo 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Alternar para o aplicativo 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Alternar para o aplicativo 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Alternar para o aplicativo 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Alternar para o aplicativo 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Alternar para o aplicativo 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Alternar para o aplicativo 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Qual teclado usar" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "O tipo do teclado para usar." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limitar o alternador ao espaço de trabalho atual." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Se verdadeiro, o alternador mostrará somente os aplicativos que possuem " +"janelas no espaço de trabalho atual. Caso contrário, todos os aplicativos " +"serão incluídos." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "O modo ícone do aplicativo." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configura como as janelas são mostradas no alternador. As possibilidades " +"válidas são “thumbnail-only” (mostra uma miniatura da janela), “app-icon-" +"only” (mostra apenas o ícone do aplicativo) ou “both”." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Se verdadeiro, o alternador mostrará somente as janelas do espaço de " +"trabalho atual. Caso contrário, todos as janelas serão incluídas." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Anexar diálogo modal à janela pai" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Esta chave sobrescreve a chave em org.gnome.mutter ao executar o Shell do " +"GNOME." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Habilitar contorno ladrilhado ao arrastar janelas sobre as bordas da tela" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Espaços de trabalho são gerenciados dinamicamente" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Espaços de trabalho apenas no monitor primário" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Atrasar foco altera o modo do mouse até o ponteiro parar de mover" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Sessão de Rede" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Algo deu errado" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Lamentamos, mas houve um problema: as configurações dessa extensão não podem " +"ser exibidas. Recomendamos que você relate o problema aos autores da extensão." + +#: js/extensionPrefs/main.js:130 +#| msgid "Show Details" +msgid "Technical Details" +msgstr "Detalhes técnicos" + +#: js/extensionPrefs/main.js:165 +#| msgid "Show Errors" +msgid "Copy Error" +msgstr "Copiar erro" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Site" + +#: js/extensionPrefs/main.js:186 +#| msgid "UUIDs of extensions to enable" +msgid "Visit extension homepage" +msgstr "Visita a página web da extensão" + +#: js/extensionPrefs/main.js:449 +#| msgid "No extensions installed" +msgid "No Extensions Installed" +msgstr "Nenhuma extensão instalada" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Extensões podem ser instaladas por meio do Software ou extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Navegar no Software" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Cancelar" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Próximo" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Desbloquear" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Entrar" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Escolher sessão" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Não está listado?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ex.: usuário ou %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Nome de usuário: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Janela de sessão" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Erro de autenticação" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(ou deslize o dedo)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Desligar" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "desligar;desligamento;reinicialização;reiniciar" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Bloquear tela" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "tela de bloqueio" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Encerrar sessão" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "encerrar sessão;desconectar;sair" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Suspender" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspender;dormir" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Alternar usuário" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "alternar usuário;trocar de usuário" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Bloquear orientação" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "bloqueio de orientação;tela;rotação" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Comando não encontrado" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Não foi possível analisar comando:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "A execução de “%s” falhou:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Agora mesmo" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minuto atrás" +msgstr[1] "%d minutos atrás" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d hora atrás" +msgstr[1] "%d horas atrás" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Ontem" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dia atrás" +msgstr[1] "%d dias atrás" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d semana atrás" +msgstr[1] "%d semanas atrás" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d mês atrás" +msgstr[1] "%d meses atrás" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d ano atrás" +msgstr[1] "%d anos atrás" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ontem, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +#| msgid "%B %d, %H∶%M" +msgid "%B %-d, %H∶%M" +msgstr "%-d de %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +#| msgid "%B %d %Y, %H∶%M" +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d de %B de %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ontem, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +#| msgid "%B %d, %l∶%M %p" +msgid "%B %-d, %l∶%M %p" +msgstr "%-d de %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +#| msgid "%B %d %Y, %l∶%M %p" +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d de %B de %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Autenticação de ponto de acesso" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Seu conexão com essa autenticação de ponto de acesso não é segura. Senhas e " +"outras informações que você inserir nesta página podem ser vistas por " +"pessoas próximas." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Negar acesso" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Conceder acesso" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Aplicativos usados frequentemente vão aparecer aqui" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Frequente" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Todos" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Nova janela" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Inicia usando placa de vídeo dedicada" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Remover dos favoritos" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Adicionar aos favoritos" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Mostrar detalhes" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s foi adicionado aos seus favoritos." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s foi removido dos seus favoritos." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Selecione o dispositivo de áudio" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Configurações de som" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Fones de ouvido" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Fone de ouvido com microfone" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Microfone" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Alterar plano de fundo…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Configurações de exibição" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Configurações" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "Q" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "Q" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%OB de %Y" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "Mês anterior" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "Próximo mês" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "Dia todo" + +#: js/ui/calendar.js:829 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d de %B" + +#: js/ui/calendar.js:833 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d, %Y" +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d de %B de %Y" + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "Nenhuma notificação" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "Nenhum evento" + +#: js/ui/calendar.js:1085 +#| msgid "Clear All" +msgid "Clear" +msgstr "Limpar" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” não está respondendo." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Você pode escolher esperar por um breve tempo para que continue ou force o " +"aplicativo a sair totalmente." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Forçar sair" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Esperar" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Unidade externa conectada" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Unidade externa desconectada" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Abrir com %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Senha:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Digite novamente:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Alternativamente, você pode conectar pressionando o botão “WPS” em seu " +"roteador." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Conectar" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Senha: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Chave: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Senha da chave privada: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identidade: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Serviço: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Autenticação requisitada pela rede sem fio" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Senhas ou chaves criptografadas são necessárias para acessar a rede sem fio " +"“%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Autenticação 802.1X cabeada" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Nome da rede: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Autenticação DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Código PIN requisitado" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "O código PIN é necessário para o dispositivo móvel de banda larga" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Senha da rede de banda larga móvel" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Uma senha é necessária para se conectar a “%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Gerenciador de rede" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Autenticação necessária" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrador" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Autenticação" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Desculpe, isto não funcionou. Por favor, tente novamente." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s agora é conhecido como %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Janelas" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +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:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +#| msgid "%B %e %Y" +msgid "%B %-d %Y" +msgstr "%-d de %B de %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %e de %B de %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Adicionar relógios mundiais…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Relógios mundiais" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Meteorologia" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Selecione uma localização…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Carregando…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Conecte-se à internet para obter as informações meteorológicas" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "No momento as informações meteorológicas não estão disponíveis" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Encerrar sessão de %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Encerrar sessão" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s encerrará a sessão automaticamente em %d segundo." +msgstr[1] "%s encerrará a sessão automaticamente em %d segundos." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Sua sessão será encerrada automaticamente em %d segundo." +msgstr[1] "Sua sessão será encerrada automaticamente em %d segundos." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Encerrar sessão" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Desligar" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalar atualizações & desligar" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "O sistema será desligado automaticamente em %d segundo." +msgstr[1] "O sistema será desligado automaticamente em %d segundos." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalar atualizações de software pendentes" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Desligar" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Reiniciar" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "O sistema irá reiniciar automaticamente em %d segundo." +msgstr[1] "O sistema irá reiniciar automaticamente em %d segundos." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reiniciar & instalar atualizações" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"O sistema irá reiniciar e instalar atualizações automaticamente em %d " +"segundo." +msgstr[1] "" +"O sistema irá reiniciar e instalar atualizações automaticamente em %d " +"segundos." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reiniciar & instalar" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalar & desligar" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Desligar após atualizações serem instaladas" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reiniciar & instalar atualizações" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s será instalado após a reinicialização. A instalação da atualização " +"pode levar um longo tempo: certifique-se de que fez cópia de segurança (back " +"up) e que o computador esteja ligado na tomada." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Funcionando na bateria: por favor, conecte na tomada antes de instalar " +"atualizações." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Alguns aplicativos estão ocupados ou possuem trabalhos não salvos." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Outros usuários estão com sessão aberta." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (remoto)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (console)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Instalar" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Baixar e instalar “%s” de extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s deseja inibir atalhos" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplicativo deseja inibir atalhos" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Você pode restaurar os atalhos pressionando %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Negar" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Permitir" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Teclas lentas ligadas" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Teclas lentas desligadas" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Você acabou de manter a tecla Shift pressionada durante 8 segundos. Este é o " +"atalho para o recurso de teclas lentas, que afeta a forma como o seu teclado " +"opera." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Teclas de aderência ligadas" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Teclas de aderência desligadas" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Você acabou de pressionar a tecla Shift por 5 vezes de uma vez. Este é o " +"atalho para o recurso de teclas de aderência, que afeta a forma como o seu " +"teclado opera." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Você acabou de pressionar duas teclas de uma vez ou pressionou de uma vez 5 " +"vezes a tecla Shift. Isto desliga o recurso de teclas de aderência, que " +"afeta a forma como o seu teclado opera." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Deixar ativado" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Ligar" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Desligar" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Deixar desativado" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Configurações regionais e de idioma" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Nenhuma extensão instalada" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s não emitiu erros." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Ocultar erros" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Exibir erros" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Habilitado" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Desabilitado" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Erro" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Expirado" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Baixando" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Ver fonte" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Página web" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Informações do sistema" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Artista desconhecido" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Título desconhecido" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volume" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Desfazer" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Panorama" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Digite para pesquisar…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Novo atalho…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Aplicativo definido" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Mostrar ajuda na tela" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Trocar monitor" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Atribuir atalho" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Concluído" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Editar…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nenhum" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Pressione um botão para configurar" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Pressione Esc para sair" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Pressione qualquer tecla para sair" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Sair" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Atividades" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistema" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Barra superior" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Digite um comando" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Fechar" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Reinício não está disponível no Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Reiniciando…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d de %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nova mensagem" +msgstr[1] "%d novas mensagens" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nova notificação" +msgstr[1] "%d novas notificações" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Bloquear" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME precisa bloquear a tela" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Não foi possível bloquear" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "O bloqueio foi impedido por um aplicativo" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Pesquisando…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Nenhum resultado." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d mais" +msgstr[1] "%d mais" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Copiar" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Colar" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Mostrar texto" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Ocultar texto" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Senha" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Lembrar senha" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Acessibilidade" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Ampliador" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Leitor de tela" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Teclado de tela" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Alertas visuais" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Teclas de aderência" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Teclas lentas" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Teclas de repercussão" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Teclas do mouse" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Alto contraste" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Texto grande" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Configurações de Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d conectado" +msgstr[1] "%d conectados" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Off" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "On" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Brilho" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Teclado" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Exibir disposição de teclado" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Localização habilitada" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Desabilitar" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Configurações de privacidade" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Localização em uso" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Localização desabilitada" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Habilitar" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Fornecer acesso a %s para sua localização?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Acesso a localização pode ser alterado a qualquer momento nas configurações " +"de privacidade." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s desligado" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "Conectado a %s" + +# Não gerenciável para transmitir a ideia que o Networkmanager não consegue gerenciar o dispositivo --Enrico +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s não é gerenciável" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Desconectando de %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "Conectando a %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:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s requer autenticação" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware em falta 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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s está indisponível" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Falha na conexão de %s" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Configurações da rede cabeada" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Configurações de banda larga móvel" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Hardware de %s desabilitado" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s está desabilitado" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Conectar à Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Modo avião ligado" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "O Wi-Fi é desabilitado quando o modo avião está ligado." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Desligar modo avião" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi desligado" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "O Wi-Fi precisa ser ligado a fim de conectar-se a uma rede." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Ligar Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Redes Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Selecione uma rede" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Nenhuma rede" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Usar alternador de hardware para desligar" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Selecione a rede" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Configurações de Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Ponto de acesso %s está ativo" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s não está conectado" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "conectando…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "autenticação necessária" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "conexão falhou" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Configurações de VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN desligada" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Configurações de rede" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s conexão cabeada" +msgstr[1] "%s conexões cabeadas" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s conexão Wi-Fi" +msgstr[1] "%s conexões Wi-Fi" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s conexão por modem" +msgstr[1] "%s conexões por modems" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Falha de conexão" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Falha ao ativar a conexão da rede" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Luz noturna desabilitada" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Luz noturna ligada" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Continuar" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Desabilitar até amanhã" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Configurações de energia" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Carga completa" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Não está carregando" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Estimando…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d:%02d restante(s) (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d até completar (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "A tela está sendo compartilhada" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Desativar" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Modo avião ligado" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Alternar usuário" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Encerrar sessão" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Configurações de conta" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Bloqueio de orientação" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Suspender" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Desligar" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Dispositivo Thunderbolt desconhecido" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Um novo dispositivo foi detectado enquanto você estava ausente. Por " +"gentileza, desconecte e reconecte o dispositivo para começar a usá-lo." + +#: js/ui/status/thunderbolt.js:326 +#| msgid "Unknown Thunderbolt device" +msgid "Unauthorized Thunderbolt device" +msgstr "Dispositivo Thunderbolt não autorizado" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Um novo dispositivo foi detectado e precisa ser autorizado por um " +"administrador." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Erro de autorização de thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Não foi possível autorizar o dispositivo Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volume alterado" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Espelhar" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Juntar telas" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Externa apenas" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Interna apenas" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Iniciar sessão como outro usuário" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Desbloquear janela" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplicativos" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Pesquisar" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” está pronto" + +# Título de janela de confirmação; Se grande demais, pode ser exibida com "..." +# Vide: https://bugzilla.gnome.org/show_bug.cgi?id=786331 +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Deseja manter essas configurações da tela?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Reverter configurações" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Manter alterações" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Alterações nas configurações serão revertidas em %d segundo" +msgstr[1] "Alterações nas configurações serão revertidas em %d segundos" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimizar" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Restaurar" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximizar" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Mover" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Redimensionar" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Mover barra de título na tela" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Sempre no topo" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Sempre na área de trabalho visível" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Mover para a área de trabalho esquerda" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Mover para a área de trabalho direita" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Mover para a área de trabalho acima" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Mover para a área de trabalho abaixo" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Mover para o monitor acima" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Mover para o monitor abaixo" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Mover para o monitor à esquerda" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Mover para o monitor à direita" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Agenda do Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Versão de impressão" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Modo usado pelo GDM para a tela de início de sessão" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "" +"Utilizar um modo específico, ex.: “gdm” para a tela de início de sessão" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Listar modos possíveis" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Desconhecido" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Erro ao lançar “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "As senhas não coincidem." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "A senha não pode estar em branco" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "O diálogo de autenticação foi descartado pelo usuário" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u saída" +msgstr[1] "%u saídas" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u entrada" +msgstr[1] "%u entradas" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sons do sistema" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:" + +#~ msgid "%s all day." +#~ msgstr "%s por todo o dia." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, depois %s mais tarde." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, depois %s, seguido de %s mais tarde." + +#~ msgid "Feels like %s." +#~ msgstr "Sensação térmica de %s." + +#~| msgid "Power Off" +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Desligar" + +#~| msgid "Log Out" +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Encerrar sessão" + +#~| msgid "Switch User" +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Alternar usuário" + +#~ msgid "Hide tray" +#~ msgstr "Esconder bandeja" + +#~ msgid "Status Icons" +#~ msgstr "Ícones de status" + +#~ msgid "Events" +#~ msgstr "Eventos" + +#~ msgid "Notifications" +#~ msgstr "Notificações" + +#~ msgid "Clear section" +#~ msgstr "Limpar seção" + +#~ msgid "Media" +#~ msgstr "Mídia" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferências de extensões do Shell do GNOME" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Redirecionamento para autenticação web" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +# Livre no sentido de disponível, ou seja, não estar em uso --Enrico +#~ msgid "Not In Use" +#~ msgstr "Livre" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Mostrar o número da semana na agenda" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Se verdadeiro, exibe o número da semana na agenda." + +#~ msgid "Use as Internet connection" +#~ msgstr "Usar como conexão de Internet" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s está solicitando acesso à sua localização." + +# Traduções do Xfce e da Microsoft usam compositor --Enrico +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (compositor wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d dispositivo conectado" +#~ msgstr[1] "%d dispositivos conectados" + +#~ msgid "Authentication required" +#~ msgstr "Autenticação necessária" + +# UPS significa uninterruptible power supply, mas no Brasil vejo usando mais +# "No-break", que é a mesma coisa, então optei pela segunda. -- Rafael Fontenelle +#~ msgid "UPS" +#~ msgstr "No-break" + +#~ msgid "Battery" +#~ msgstr "Bateria" + +#~ msgid "Airplane Mode" +#~ msgstr "Modo avião" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Convite" + +#~ msgid "Call" +#~ msgstr "Chamada" + +#~ msgid "File Transfer" +#~ msgstr "Transferência de arquivo" + +#~ msgid "Chat" +#~ msgstr "Conversar" + +#~ msgid "Invitation to %s" +#~ msgstr "Convite para %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s está convidando você para participar de %s" + +#~ msgid "Decline" +#~ msgstr "Recusar" + +#~ msgid "Accept" +#~ msgstr "Aceitar" + +#~ msgid "Video call from %s" +#~ msgstr "Chamada de vídeo para %s" + +#~ msgid "Call from %s" +#~ msgstr "Chamada de %s" + +#~ msgid "Answer" +#~ msgstr "Atender" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s está enviando %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s quer permissão para vê-lo quando conectado" + +#~ msgid "Authentication failed" +#~ msgstr "Falha de autenticação" + +#~ msgid "Encryption error" +#~ msgstr "Erro de criptografia" + +#~ msgid "Certificate not provided" +#~ msgstr "Certificado não fornecido" + +#~ msgid "Certificate untrusted" +#~ msgstr "Certificado não confiável" + +#~ msgid "Certificate expired" +#~ msgstr "Certificado expirado" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificado não ativado" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Máquina do certificado não confere" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Impressão digital do certificado não confere" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificado auto-assinado" + +#~ msgid "Status is set to offline" +#~ msgstr "O status está definido como desconectado." + +#~ msgid "Certificate is invalid" +#~ msgstr "O certificado é inválido" + +#~ msgid "Connection has been refused" +#~ msgstr "A conexão foi recusada" + +#~ msgid "Connection can't be established" +#~ msgstr "A conexão não pode ser estabelecida" + +#~ msgid "Connection has been lost" +#~ msgstr "Conexão perdida" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Esta conta já está conectada ao servidor" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "A conexão foi substituída por uma nova conexão usando o mesmo recurso" + +#~ msgid "The account already exists on the server" +#~ msgstr "A conta já existe no servidor" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "O servidor está atualmente muito ocupado para controlar a conexão" + +#~ msgid "Certificate has been revoked" +#~ msgstr "O certificado foi revogado" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "O certificado usa um algoritmo de cifragem inseguro ou é " +#~ "criptograficamente fraco" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "O comprimento do certificado do servidor, ou a profundidade da cadeia do " +#~ "certificado excedeu os limites impostos pela biblioteca de criptografia" + +#~ msgid "Internal error" +#~ msgstr "Erro interno" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Não foi possível conectar-se a %s" + +#~ msgid "View account" +#~ msgstr "Visualizar conta" + +#~ msgid "Show the message list" +#~ msgstr "Mostra a lista de mensagem" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Dom" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Seg" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Ter" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Qua" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Qui" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Sex" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Sab" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nada agendado" + +#~ msgid "Today" +#~ msgstr "Hoje" + +#~ msgid "Tomorrow" +#~ msgstr "Amanhã" + +#~ msgid "This week" +#~ msgstr "Esta semana" + +#~ msgid "Next week" +#~ msgstr "Próxima semana" + +#~ msgid "Removable Devices" +#~ msgstr "Dispositivos removíveis" + +#~ msgid "Eject" +#~ msgstr "Ejetar" + +#~ msgid "Unmute" +#~ msgstr "Ativar áudio" + +#~ msgid "Mute" +#~ msgstr "Sem áudio" + +#~ msgid "Open Calendar" +#~ msgstr "Abrir agenda" diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000..161993e --- /dev/null +++ b/po/ro.po @@ -0,0 +1,3011 @@ +# This file is distributed under the same license as the gnome-shell package. +# Lucian Adrian Grijincu , 2009, 2010, 2011. +# Daniel Șerbănescu , 2010, 2011. +# laurion , 2010. +# Ion Laurențiu Cristian , 2010. +# Răpițeanu Viorel-Cătălin , 2013. +# Viorel-Cătălin Răpițeanu , 2014. +# Daniel Șerbănescu , 2015, 2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-02 18:20+0000\n" +"PO-Revision-Date: 2019-03-02 20:54+0100\n" +"Last-Translator: Daniel Șerbănescu \n" +"Language-Team: Gnome Romanian Translation Team \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n" +"%100<=19) ? 1 : 2);\n" +"20)) ? 1: 2);\n" +"X-Generator: Poedit 2.2.1\n" +"X-Project-Style: gnome\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistem" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Arată lista de notificare" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Focalizează notificarea activă" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Arată prezentarea generală" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Arată toate aplicațiile" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Arată meniul aplicației" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Extensii pentru vizualizatorul activităților" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Configurarea extensiilor pentru Vizualizatorul activităților GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Vizualizatorul activităților GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Administrare de ferestre și lansare de aplicații" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Activează uneltele interne utile dezvoltatorilor și testerilor din Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Permite accesul la unelte interne de depanare și monitorizare folosind " +"dialogul Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Uuid-urile extensiilor de activat" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Extensiile pentru Vizualizatorul activităților GNOME au o proprietate uuid; " +"această cheie listează extensiile care ar trebui încărcate. Orice extensie " +"care trebuie încărcată trebuie să fie în listă. Puteți de asemenea să " +"manipulați această listă cu metodele EnableExtension și DisableExtension pe " +"org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Dezactivează extensiile utilizatorului" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Dezactivează toate extensiile pe care utilizatorul le-a activat fără să " +"afecteze configurarea „enable-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Dezactivează validarea compatibilității versiunii extensiei" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Vizualizatorul activităților GNOME va încărca doar extensiile care pretind " +"să fie compatibile cu versiunea actuală. Activarea acestei opțiuni va duce " +"la dezactivarea verificării și la încercarea de a încărca toate extensiile " +"fără a ține cont de versiunile cu care acestea pretind că sunt compatibile." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "" +"Lista de identificatori ale fișierelor desktop pentru aplicațiile favorite" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Aplicațiile corespunzătoare acestor identificatori vor fi afișate în zona " +"favoritelor." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Mod de afișare selector de aplicații" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Indicele modului de afișare selectat în selectorul de aplicații." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Istoricul dialogului de comenzi (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Istoric pentru lupa de căutare" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "" +"Arată întotdeauna elementul „Ieșire din sesiune” în meniul utilizatorului." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Această cheie suprascrie ascunderea automată a elementului „Ieșire din " +"sesiune” în situațiile cu un singur utilizator, o singură sesiune." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Dacă se va reține parola pentru montarea sistemelor de fișiere criptate sau " +"la distanță" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Vizualizatorul activităților va cere o parolă când este montat un dispozitiv " +"criptat sau un sistem de fișiere la distanță. Dacă parola poate fi salvată " +"pentru o utilizare viitoare, o căsuță intitulată „Reține parola” va fi " +"afișată. Această cheie determină starea implicită a căsuței." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Dacă adaptorul implicit Bluetooth are dispozitive asociate lui" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Vizualizatorul va arăta un element de meniu Bluetooth numai dacă adaptorul " +"Bluetooth este pornit, sau dacă există dispozitive configurate asociate cu " +"adaptorul implicit. Acesta va fi restabilit dacă adaptorul este perceput a " +"nu avea dispozitive asociate lui." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Activează API-ul de introspecție" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Activează un API D-Bus care permite introspecția stării aplicației shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Combinație de taste pentru deschiderea meniului aplicației" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Combinație de taste pentru deschiderea meniului aplicației." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "" +"Combinație de taste pentru deschiderea modului de afișare „Arată aplicațiile”" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Combinație de taste pentru deschiderea modului de afișare „Arată " +"aplicațiile” a prezentării generale a activităților." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Combinație de taste pentru deschiderea prezentării generale" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "" +"Combinație de taste pentru deschiderea prezentării generale a activităților." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "" +"Combinație de taste pentru comutarea vizibilității listei de notificare" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "" +"Combinație de taste pentru comutarea vizibilității listei de notificare." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Combinație de taste pentru focalizarea notificării active" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Combinație de taste pentru focalizarea notificării active." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Combinație de taste care întrerupe și reia animațiile în execuțue, pentru " +"depanare" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Comută la aplicația 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Comută la aplicația 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Comută la aplicația 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Comută la aplicația 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Comută la aplicația 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Comută la aplicația 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Comută la aplicația 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Comută la aplicația 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Comută la aplicația 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Ce tastatură să fie folosită" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Tipul de tastatură de folosit." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Limitează comutatorul la spațiul de lucru curent." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Dacă este activat, doar aplicațiile care au ferestre în spațiul de lucru " +"curent sunt arătate în comutator. Altfel, toate aplicațiile sunt incluse." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Miniatură și pictograma aplicației." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Configurează modul în care ferestrele sunt arătate în comutator. " +"Posibilități valide sunt „mod miniatură” (arată o miniatură a ferestrei) " +"„mod iconiță” (arată doar iconița aplicației) sau „ambele”." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Dacă este activat, doar ferestrele din spațiul de lucru curent sunt arătate " +"în comutator. Altfel, toate ferestrele sunt incluse." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Atașează dialogul modal la fereastra părinte" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Această cheie suprascrie cheia corespondentă din org.gnome.mutter când " +"Vizualizatorul activităților GNOME rulează." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Activează mozaic lateral la plasarea ferestrelor pe marginile ecranului" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Spațiile de lucru sunt gestionate în mod dinamic" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Spații de lucru doar pe monitorul principal" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Întârzie schimbările de focalizare în maus până când cursorul încetează să " +"se miște" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Logare prin rețea" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Ceva nu a funcționat cum trebuie" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Ne pare foarte rău, dar a avut loc o problemă: configurările pentru această " +"extensie nu pot fi afișate. Vă recomandăm să raportați problema autorilor " +"extensiei." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Detalii tehnice" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Eroare la copiere" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Pagină principală" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Vizitează pagina principală a extensiei" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Nicio extensie instalată" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Extensii pot fi instalate prin intermediul Aplicații sau extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Navighați în Aplicații" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Anulează" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Următorul" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Deblochează" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Autentificare" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Alegeți o sesiune" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Nelistat?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(de exemplu, utilizator sau %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Nume utilizator: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Fereastră de autentificare" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Eroare de autentificare" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(sau treceți degetul peste)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Oprire" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "power off;shutdown;reboot;restart;oprire;repornire" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Blochează ecranul" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "lock screen;blochează ecranul" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Ieșire din sesiune" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;ieșire din sesiune;deautentificare" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Suspendare" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;suspendare" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Comută utilizatorul" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "switch user;comută utilizatorul" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Blocare orientare" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "" +"lock orientation;screen;rotation;blocare orientare;blocare de orientare;" +"ecran;rotație" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Comanda nu a fost găsită" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Nu s-a putut analiza comanda:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Execuția comenzii „%s” a eșuat:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Acum" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minut în urmă" +msgstr[1] "%d minute în urmă" +msgstr[2] "%d de minute în urmă" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d oră în urmă" +msgstr[1] "%d ore în urmă" +msgstr[2] "%d de ore în urmă" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Ieri" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d zi în urmă" +msgstr[1] "%d zile în urmă" +msgstr[2] "%d de zile în urmă" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d săptămână în urmă" +msgstr[1] "%d săptămâni în urmă" +msgstr[2] "%d de săptămâni în urmă" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d lună în urmă" +msgstr[1] "%d luni în urmă" +msgstr[2] "%d de luni în urmă" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d an în urmă" +msgstr[1] "%d ani în urmă" +msgstr[2] "%d de ani în urmă" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Ieri, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%B %-d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%B %-d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Ieri, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%B %-d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%B %-d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Logare hotspot" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Conexiunea dumneavoastră la acest hotspot nu este sigură. Parolele sau alte " +"informății pe care le-ați introdus pe această pagină pot fi văzute de " +"oamenii din jur." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Refuză accesul" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Permite accesul" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Aplicațiile utilizate frecvent vor fi afișate aici" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Frecvente" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Toate" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Fereastră nouă" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Lansează folosind placa grafică dedicată" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Elimină din favorite" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Adaugă la Favorite" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Arată detaliile" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s a fost adăugat la favorite." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s a fost eliminat de la favorite." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Selectați dispozitivul audio" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Configurări de sunet" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Căști auriculare" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Căști cu microfon" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Microfon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Schimbă fundalul…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Configurări afișaj" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Configurări" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "D" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "L" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "J" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "V" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Luna precedentă" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Luna viitoare" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Săptămâna %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Toată ziua" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %B %-d" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %B %-d, %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Nu există notificări" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Nu există evenimente" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Curăță" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "„%s” nu răspunde." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Puteți alege să așteptați o scurtă vreme pentru a continua sau să forțați " +"aplicația să se închidă complet." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Forțează închiderea" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Așteaptă" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "A fost conectat un disc extern" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "A fost deconectat un disc extern" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Deschide cu %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Parolă:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Tastați din nou:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"În mod alternativ vă puteți conecta apăsând butonul „WPS” pe routerul " +"dumneavoastră." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Conectare" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Parolă: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Cheie: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Parolă pentru cheia privată: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identitate: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Serviciu: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Autentificare cerută de către rețeaua fără fir" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Sunt necesare parole sau chei de criptare pentru a accesa rețeaua fără fir " +"„%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Autentificare 802.1X prin cablu" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Nume de rețea: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Autentificare DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Este necesar codul PIN" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Este necesar codul PIN pentru dispozitivul mobil de bandă largă" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Parolă pentru rețeaua mobilă de bandă largă" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Este necesară o parolă pentru conectarea la „%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Gestionar de rețea" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Necesită autentificare" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Autentificare" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Nu a funcționat. Încercați din nou." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s este acum cunoscut ca %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Ferestre" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Arată aplicațiile" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%B %-d %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Adaugă un fus orar…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Fusuri orare" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Vreme" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Selectați o locație…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Se încarcă…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Conectați-vă la internet pentru informații despre vreme" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Informațiile despre vreme nu sunt disponibile momentan" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Ieșire din sesiune pentru %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Ieșire din sesiune" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s va fi scos din sesiune automat în %d secundă." +msgstr[1] "%s va fi scos din sesiune automat în %d secunde." +msgstr[2] "%s va fi scos din sesiune automat în %d de secunde." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Veți fi scos din sesiune automat în %d secundă." +msgstr[1] "Veți fi scos din sesiune automat în %d secunde." +msgstr[2] "Veți fi scos din sesiune automat în %d de secunde." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Ieșire din sesiune" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Oprire" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instalarea actualizărilor și repornirea" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistemul se va opri automat în %d secundă." +msgstr[1] "Sistemul se va opri automat în %d secunde." +msgstr[2] "Sistemul se va opri automat în %d de secunde." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instalează actualizările în așteptare" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Repornire" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Oprire" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Repornire" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistemul se va reporni automat în %d secundă." +msgstr[1] "Sistemul se va reporni automat în %d secunde." +msgstr[2] "Sistemul se va reporni automat în %d de secunde." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Repornire și instalare actualizări" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "Sistemul se va reporni automat în %d secundă." +msgstr[1] "Sistemul se va reporni automat în %d secunde." +msgstr[2] "Sistemul se va reporni automat în %d de secunde." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Repornește și instalează" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instalează și oprește" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Oprește după ce actualizările au fost instalate" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Repornire și instalare înnoiri" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s va fi instalată după repornire. Instalarea înnoirii poate dura mult " +"timp: asigurați-vă că ați făcut o copie de siguranță și că calculatorul este " +"conectat la rețeaua electrică." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Calculatorul rulează pe baterie: conectați-vă la rețeau de curent înainte de " +"a instala actualizările." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Unele aplicații sunt ocupate sau au sarcini nesalvate." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Alți utilizatori sunt conectați." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (la distanță)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (consolă)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Instalează" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Descărcați și instalați „%s” de la extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vrea să inhibe scurtături" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplicația vrea să inhibe scurtături" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Puteți restaura scurtăturile apăsând %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Refuză" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Permite" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Taste încete pornite" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Taste încete oprite" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Tocmai ați ținut apăsată tasta Shift pentru 8 secunde. Aceasta este " +"scurtătra pentru funcționalitatea Taste încete, care afectează modul în care " +"tastatura funcționează." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Taste persistente pornite" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Taste persistente oprite" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Tocmai ați apăsat tasta Shift de 5 ori la rând. Aceasta este scurtătura " +"pentru funcționalitatea Taste persistente, care afectează modul în care " +"tastatura funcționează." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Tocmai ați apăsat două taste simultan, sau apăsat tasta Shift de 5 ori la " +"rând. Aceasta oprește funcționalitatea Taste persistente, care afectează " +"modul în care tastatura funcționează." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Lasă pornit" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Pornește" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Oprește" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Lasă oprit" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Configurări de regiune și limbă" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Nicio extensie instalată" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nu a emis nicio eroare." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Ascunde erorile" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Afișează erorile" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Activat" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Dezactivat" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Eroare" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Învechit" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Se descarcă" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Vizualizează sursa" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Pagină Web" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Informații despre sistem" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Artist necunoscut" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Titlu necunoscut" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Volum" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Anulează" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Prezentare generală" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Tastați pentru a căuta…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Scurtătură nouă…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Aplicație definită" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Arată ajutorul pe ecran" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Comută monitorul" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Alochează tasta apăsată" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Gata" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Editează…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Nespecificat" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Apăsați un buton de configurat" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Apăsați Esc pentru a ieși" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Apăsați orice tastă pentru a ieși" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Ieșire" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Activități" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistem" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "Bara de sus" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Introduceți o comandă" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Închide" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Repornirea nu este disponibilă în Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Se repornește…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d mesaj nou" +msgstr[1] "%d mesaje noi" +msgstr[2] "%d de mesaje noi" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d notificare" +msgstr[1] "%d notificări" +msgstr[2] "%d de notificări" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Blocare" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME trebuie să blocheze ecranul" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Blocare nereușită" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Blocarea a fost împiedicată de o aplicație" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Se caută…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Niciun rezultat." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "încă %d" +msgstr[1] "încă %d" +msgstr[2] "încă %d" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Copiere" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Lipire" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Afișează text" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Ascunde text" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Parolă" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Memorează parola" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Accesibilitate" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Zoom" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Cititor de ecran" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Tastatură virtuală" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Alerte vizuale" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Taste persistente" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Taste încete" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Taste fără repetiție" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Butoanele mausului" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Contrast ridicat" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Text mare" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Configurări Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d conectată" +msgstr[1] "%d conectate" +msgstr[2] "%d conectate" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Oprit" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Pornit" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Luminozitate" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Tastatură" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Afișează aranjamentul tastaturii" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Locația activată" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Dezactivează" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Configurări de confidențialitate" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Locație utilizată" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Locația dezactivată" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Activează" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Permiteți %s accesul la locația dumneavoastră?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Accesul la locație poate fi schimbat oricând din configurările de " +"confidențialitate." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s oprit" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s conectat" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s este negestionat" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Se deconectează %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "Se conectează %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:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s necesită autentificare" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Firmware lipsă pentru %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s indisponibil" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Conectarea la %s a eșuat" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Configurări pentru conexiune cu fir" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Configurări de rețea de bandă largă mobilă" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Hardware %s dezactivat" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s dezactivat" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Conectează la Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Modul avion este pornit" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi este dezactivat când modul avion este pornit." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Oprește modul avion" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi este oprit" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi trebuie pornit pentru a se putea face conexiunea la o rețea." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Pornește Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Rețele Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Selectați o rețea" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Nicio rețea" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Folosește un întrerupător hardware pentru a opri" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Selectați rețeaua" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Configurări Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Hotspot %s activ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nu este conectat" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "se conectează…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "necesită autentificare" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "conexiune eșuată" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Configurări VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN oprit" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Configurări de rețea" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s conexiune cu fir" +msgstr[1] "%s conexiuni cu fir" +msgstr[2] "%s de conexiuni cu fir" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s conexiune fără fir" +msgstr[1] "%s conexiuni fără fir" +msgstr[2] "%s de conexiuni fără fir" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s conexiune cu modem" +msgstr[1] "%s conexiuni cu modem" +msgstr[2] "%s de conexiuni cu modem" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Conexiune eșuată" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Activarea conexiunii de rețea a eșuat" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Lumina de noapte este dezactivată" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Lumina de noapte este activată" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Reia" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Dezactivează până mâine" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Configurări consum" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Complet încărcată" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Nu încarcă" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Se estimează…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d rămase (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d până este plină (%d%%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d%%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Ecranul este partajat" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Oprește" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Modul avion este pornit" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Comută utilizatorul" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Ieșire din sesiune" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Configurări de cont" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Blocare de orientare" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Suspendare" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Oprire" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Dispozitiv Thunderbolt necunoscut" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Un nou dispozitiv a fost detectat în timp ce erați plecat. Deconectați și " +"reconectați dispozitivul pentru a începe utilizarea lui." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Dispozitiv Thunderbolt neautorizat" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Un nou dispozitiv a fost detectat și trebuie autorizat de un administrator." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Eroare de autorizare Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nu s-a putut autoriza dispozitivul Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Volumul a fost schimbat" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Oglindește" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Unește afișajele" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Numai extern" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Numai încorporat" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Intră în sesiune ca utilizator diferit" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Deblochează fereastră" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplicații" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Caută" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "„%s” este gata" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Doriți să păstrați aceste configurări de afișare?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Restaurează configurările" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Păstrați modificările" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Schimbările vor fi restaurare în %d secundă" +msgstr[1] "Schimbările vor fi restaurare în %d secunde" +msgstr[2] "Schimbările vor fi restaurare în %d de secunde" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimizează" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Demaximizează" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximizează" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Mută" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Redimensionează" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Mută bara de titlu pe ecran" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Întotdeauna deasupra" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Întotdeauna pe spațiul de lucru vizibil" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Mută pe spațiul de lucru din stânga" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Mută pe spațiul de lucru din dreapta" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Mută fereastra pe spațiul de lucru de mai sus" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Mută fereastra pe spațiul de lucru de mai jos" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Mută fereastra cu un monitor mai sus" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Mută fereastra cu un monitor mai jos" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Mută fereastra cu un monitor spre stânga" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Mută fereastra cu un monitor spre dreapta" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Calendar Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Tipărește versiunea" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Mod folosit de GDM pentru meniul de autentificare" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Utilizează un mod specific, de exemplu „gdm” pentru ecranul de logare" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Enumeră câmpurile care pot fi afișate" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Necunoscut" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Nu s-a putut lansa „%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Parolele nu se potrivesc." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Parola nu poate fi goală" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Fereastra de autentificare a fost închisă de către utilizator" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u rezultat" +msgstr[1] "%u rezultate" +msgstr[2] "%u de rezultate" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u intrare" +msgstr[1] "%u intrări" +msgstr[2] "%u de intrări" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Sunete de sistem" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "" +#~ "S-a produs o eroare la încărcarea ferestrei cu preferințe pentru %s:" + +#~ msgid "%s all day." +#~ msgstr "%s toată ziua." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, apoi %s mai târziu." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, apoi %s, urmat de %s mai târziu." + +#~ msgid "Feels like %s." +#~ msgstr "Percepută ca %s." + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Preferințele extensiei Vizualizatorul activităților GNOME" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Vizualizatorul activităților GNOME (compozitor wayland)" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Afișează data săptămânii în calendar" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Dacă este adevărat, afișează săptămâna ISO în calendar." + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Redirecționează autentificarea web" + +#~ msgid "Clear section" +#~ msgstr "Curăță secțiunea" + +#~ msgid "Events" +#~ msgstr "Evenimente" + +#~ msgid "Notifications" +#~ msgstr "Notificări" + +#~ msgid "Hide tray" +#~ msgstr "Ascunde zona de notificare" + +#~ msgid "Status Icons" +#~ msgstr "Iconițe de stare" + +#~ msgid "Not In Use" +#~ msgstr "Neutilizată" + +#~ msgid "Use as Internet connection" +#~ msgstr "Folosește pe post de conexiunea la internet" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Extension" +#~ msgstr "Extensie" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "D" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "L" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Ma" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Mi" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "J" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "V" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "S" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nimic programat" + +#~ msgid "Today" +#~ msgstr "Astăzi" + +#~ msgid "Tomorrow" +#~ msgstr "Mâine" + +#~ msgid "This week" +#~ msgstr "Săptămâna aceasta" + +#~ msgid "Next week" +#~ msgstr "Săptămâna viitoare" + +#~ msgid "Removable Devices" +#~ msgstr "Dispozitive care pot fi eliminate" + +#~ msgid "Eject" +#~ msgstr "Scoate" + +#~ msgid "Invitation" +#~ msgstr "Invitație" + +#~ msgid "Call" +#~ msgstr "Apel" + +#~ msgid "File Transfer" +#~ msgstr "Transfer de fișiere" + +#~ msgid "Unmute" +#~ msgstr "Activează sunetul" + +#~ msgid "Mute" +#~ msgstr "Mut" + +#~ msgid "Invitation to %s" +#~ msgstr "Invitație către %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s vă invită să vă alăturați %s" + +#~ msgid "Decline" +#~ msgstr "Refuză" + +#~ msgid "Accept" +#~ msgstr "Acceptă" + +#~ msgid "Video call from %s" +#~ msgstr "Apel video de la %s" + +#~ msgid "Call from %s" +#~ msgstr "Apel de la %s" + +#~ msgid "Answer" +#~ msgstr "Răspunde" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s vă trimite %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s ar dori permisiunea să știe când sunteți online" + +#~ msgid "Authentication failed" +#~ msgstr "Autentificare eșuată" + +#~ msgid "Encryption error" +#~ msgstr "Eroare de criptare" + +#~ msgid "Certificate not provided" +#~ msgstr "Certificat nefurnizat" + +#~ msgid "Certificate untrusted" +#~ msgstr "Certificat nesigur" + +#~ msgid "Certificate expired" +#~ msgstr "Certificat expirat" + +#~ msgid "Certificate not activated" +#~ msgstr "Certificat neactivat" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Numele de gazdă al certificatului nu se potrivește" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Amprenta certificatului nu se potrivește" + +#~ msgid "Certificate self-signed" +#~ msgstr "Certificat subsemnat" + +#~ msgid "Status is set to offline" +#~ msgstr "Starea este setată pe deconectat" + +#~ msgid "Certificate is invalid" +#~ msgstr "Certificatul este invalid" + +#~ msgid "Connection has been refused" +#~ msgstr "Conexiunea a fost refuzată" + +#~ msgid "Connection can't be established" +#~ msgstr "Conexiunea nu poate fi stabilită" + +#~ msgid "Connection has been lost" +#~ msgstr "Conexiunea a fost pierdută" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Aceast cont este deja conectat la server" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "" +#~ "Conexiunea a fost înlocuită de o nouă conexiune folosind aceeași resursă" + +#~ msgid "The account already exists on the server" +#~ msgstr "Acest cont există deja pe server" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Serverul este acum prea încărcat să accepte conexiunea" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Certificatul a fost revocat" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Certificatul folosește un algoritm de cifrare nesigur sau este slab " +#~ "criptografic" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Lungimea certificatului serverului sau adâncimea lanțului de certificare " +#~ "a serverului depășește limita impusă de către biblioteca criptografică" + +#~ msgid "Internal error" +#~ msgstr "Eroare internă" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Nu se poate stabili o conexiune la %s" + +#, fuzzy +#~ msgid "View account" +#~ msgstr "Editează contul" + +#~ msgid "Open Calendar" +#~ msgstr "Deschide calendarul" + +#~ msgid "Date & Time Settings" +#~ msgstr "Setări pentru dată și oră" + +#~ msgid "Open" +#~ msgstr "Deschide" + +#~ msgid "Remove" +#~ msgstr "Elimină" + +#, fuzzy +#~ msgid "Notification Settings" +#~ msgstr "Notificări" + +#~ msgid "No Messages" +#~ msgstr "Nici un mesaj" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d dispozitiv conectat" +#~ msgstr[1] "%d dispozitive conectate" +#~ msgstr[2] "%d de dispozitive conectate" + +#, fuzzy +#~| msgid "authentication required" +#~ msgid "Authentication required" +#~ msgstr "necesită autentificare" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Baterie" + +#~ msgid "Airplane Mode" +#~ msgstr "Mod avion" + +#~ msgid "unavailable" +#~ msgstr "indisponibil" + +#~ msgid "%A, %H:%M" +#~ msgstr "Trimis pe %A. %d %B" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "Trimis pe %A. %d %B" + +#~ msgid "Authorization request from %s" +#~ msgstr "Cerere de autorizare de la %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Dispozitivul %s vrea să se asocieze cu acest calculator" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Dispozitivul %s dorește acces la serviciul „%s”" + +#~ msgid "Grant this time only" +#~ msgstr "Permite accesul doar de această dată" + +#~ msgid "Reject" +#~ msgstr "Respingere" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Confirmarea asocierii pentru %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Confirmați dacă cheia de acces „%06d” se potrivește cu cea de pe " +#~ "dispozitiv." + +#~ msgid "Matches" +#~ msgstr "Potriviri" + +#~ msgid "Does not match" +#~ msgstr "Nu se potrivește" + +#~ msgid "Pairing request for %s" +#~ msgstr "Cererea de asociere pentru %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Introduceți PIN-ul menționat pe dispozitiv." + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "Screenshots" +#~ msgstr "Capturi de ecran" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Frecvența de cadre utilizată pentru înregistrările de ecran." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Frecvența de cadre a capturii de ecran realizată de către înregistratorul " +#~ "de ecran al GNOME Shell, în cadre pe secundă." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "" +#~ "Linia de asamblare gstreamer folosită pentru a coda captura de ecran" + +#, fuzzy +#~| msgid "" +#~| "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~| "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~| "pad where the recorded video is recorded. It will normally have a " +#~| "unconnected source pad; output from that pad will be written into the " +#~| "output file. However the pipeline can also take care of its own output - " +#~| "this might be used to send the output to an icecast server via " +#~| "shout2send or similar. When unset or set to an empty value, the default " +#~| "pipeline will be used. This is currently 'videorate ! vp8enc quality=10 " +#~| "speed=2 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 " +#~| "codec. %T is used as a placeholder for a guess at the optimal thread " +#~| "count on the system." +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Definește linia de asamblare GStreamer utilizată pentru a coda " +#~ "înregistrările. Folosește aceeași sintaxă ca la gst-launch. Linia de " +#~ "asamblare ar trebui să aibă un sink pad neconectat unde va fi înregistrat " +#~ "ecranul. În mod normal va avea un source pad neconectat și o ieșire care " +#~ "va fi scrisă în fișierul de ieșire. Cu toate acestea, linia de asamblare " +#~ "poate să aibă grijă de ieșirea proprie - aceasta ar putea fi utilizată " +#~ "pentru a trimite ieșirea la un server icecast, shout2send sau un alt " +#~ "server similar. Când este dezactivată, sau are o valoare vidă, se " +#~ "utilizează linia de asamblare implicită. Aceasta este acum definită ca " +#~ "„videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux” și " +#~ "înregistrează în WEBM folosind codecul VP8. %T este folosit ca înlocuitor " +#~ "pentru o valoare estimativă a numărului optim de fire de execuție pe " +#~ "acest sistem." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "" +#~ "Extensia de fișier utilizată pentru stocarea înregistrărilor de ecran" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Numele de fișier ale înregistrărilor de ecran vor fi unice, bazate pe " +#~ "data curentă și vor folosi această extensie. Ar trebui să fie modificată " +#~ "când se înregistrează într-un format de container diferit." + +#, fuzzy +#~| msgid "Session..." +#~ msgid "Session" +#~ msgstr "Sesiune..." + +#, fuzzy +#~| msgid "Power Off" +#~ msgid "Power" +#~ msgstr "Oprire" + +#~ msgid "Restart" +#~ msgstr "Repornire" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Apăsați „Ieșire din sesiune” pentru a închide aceste aplicații și a ieși " +#~ "din sistem." + +#~ msgid "Logging out of the system." +#~ msgstr "Deconectare din sistem." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Apăsați „Oprire” pentru a închide aceste aplicații și a opri sistemul." + +#~ msgid "Powering off the system." +#~ msgstr "Se oprește sistemul." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Apăsați „Repornire” pentru a închide aceste aplicații și a reporni " +#~ "sistemul." + +#~ msgid "Restarting the system." +#~ msgstr "Se repornește sistemul." + +#~ msgid "Visibility" +#~ msgstr "Vizibilitate" + +#, fuzzy +#~| msgid "Set up a New Device..." +#~ msgid "Set Up a New Device…" +#~ msgstr "Configurează un dispozitiv nou..." + +#, fuzzy +#~| msgid "Send Files..." +#~ msgid "Send Files…" +#~ msgstr "Trimite fișiere..." + +#~ msgid "Volume, network, battery" +#~ msgstr "Volum, rețea, baterie" + +#~ msgid "disabled" +#~ msgstr "dezactivat" + +#~ msgid "Wired" +#~ msgstr "Cu fir" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Dacă este adevărat, afișează data în ceas, lângă oră." + +#~ msgid "If true, display seconds in time." +#~ msgstr "Dacă este adevărat, afișează secundele lângă oră." + +#~ msgid "Show date in clock" +#~ msgstr "Afișează data în ceas" + +#~ msgid "Show time with seconds" +#~ msgstr "Afișează ora cu secunde" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "În mod normal shell-ul monitorizează aplicațiile active pentru a le " +#~ "prezenta cele mai folosite (de ex: în lansatoare de aplicații). Deși " +#~ "aceste date vor fi păstrate private este posibil să vreți să dezactivați " +#~ "această funcționalitate din motive de intimitate. Dezactivarea nu va " +#~ "șterge datele deja salvate." + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Dacă să fie colectate detalii despre utilizarea aplicațiilor" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "furnizori OpenSearch dezactivați" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Autentificare" + +#~ msgid "APPLICATIONS" +#~ msgstr "APLICAȚII" + +#~ msgid "SETTINGS" +#~ msgstr "SETĂRI" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Available" +#~ msgstr "Disponibil" + +#~ msgid "Away" +#~ msgstr "Plecat" + +#~ msgid "Busy" +#~ msgstr "Ocupat" + +#~ msgid "CONTACTS" +#~ msgstr "CONTACTE" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %e %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %e %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e %b, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ELEMENTE RECENTE" + +#~ msgid "tray" +#~ msgstr "zonă de notificare" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Nu s-a putut demonta „%s”" + +#~ msgid "Retry" +#~ msgstr "Reîncearcă" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "LOCURI & DISPOZITIVE" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Parolă greșită, încercați din nou" + +#~ msgid "Universal Access Settings" +#~ msgstr "Setări acces universal" + +#~ msgid "Browse Files..." +#~ msgstr "Explorează fișiere..." + +#~ msgid "Error browsing device" +#~ msgstr "Eroare la explorarea dispozitivului" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Dispozitivul solicitat nu poate fi explorat, eroarea este „%s”" + +#~ msgid "Keyboard Settings" +#~ msgstr "Setări tastatură" + +#~ msgid "cable unplugged" +#~ msgstr "cablu deconectat" + +#~ msgid "More..." +#~ msgstr "Mai multe..." + +#~ msgid "Auto Ethernet" +#~ msgstr "Ethernet automat" + +#~ msgid "Auto broadband" +#~ msgstr "Rețea de bandă largă automată" + +#~ msgid "Auto dial-up" +#~ msgstr "Dial-up automat" + +#~ msgid "Auto %s" +#~ msgstr "%s automat" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth automat" + +#~ msgid "Auto wireless" +#~ msgstr "Rețea fără fir automată" + +#~ msgid "Wireless" +#~ msgstr "Fără fir" + +#~ msgid "VPN Connections" +#~ msgstr "Conexiuni VPN" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s rămase" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "oră" +#~ msgstr[1] "ore" +#~ msgstr[2] "de ore" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minut" +#~ msgstr[1] "minute" +#~ msgstr[2] "de minute" + +#~ msgid "AC adapter" +#~ msgstr "Adaptor AC" + +#~ msgid "Laptop battery" +#~ msgstr "Baterie laptop" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgid "Mouse" +#~ msgstr "Maus" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Media player" +#~ msgstr "Player Media" + +#~ msgid "Tablet" +#~ msgstr "Tabletă" + +#~ msgid "Computer" +#~ msgstr "Calculator" + +#~ msgid "Subscription request" +#~ msgstr "Cerere de abonare" + +#~ msgid "%s is online." +#~ msgstr "%s este conectat." + +#~ msgid "%s is offline." +#~ msgstr "%s este deconectat." + +#~ msgid "%s is away." +#~ msgstr "%s este plecat." + +#~ msgid "%s is busy." +#~ msgstr "%s este ocupat." + +#~ msgid "Sent at %X on %A" +#~ msgstr "Trimis la %X pe %A" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Trimis pe %A, %d %B %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Conexiunea la %s a eșuat" + +#~ msgid "Reconnect" +#~ msgstr "Reconectează" + +#~ msgid "Hidden" +#~ msgstr "Ascuns" + +#~ msgid "Idle" +#~ msgstr "Inactiv" + +#~ msgid "Power Off..." +#~ msgstr "Oprire..." + +#~ msgid "Online Accounts" +#~ msgstr "Conturi online" + +#~ msgid "System Settings" +#~ msgstr "Setări de sistem" + +#~ msgid "Log Out..." +#~ msgstr "Ieșire din sesiune..." + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Starea de chat va fi trecută pe ocupat" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Notificările sunt acum dezactivate, incluzând mesajele de chat. Starea a " +#~ "fost ajustată pentru ca alții să știe că este posibil să nu le vedeți " +#~ "mesajele." + +#~ msgid "United Kingdom" +#~ msgstr "Regatul Unit" + +#~ msgid "Default" +#~ msgstr "Implicit" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..1464558 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,2456 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# +# +# Andrey Korzinev , 2009. +# Sergey V. Kovylov , 2009. +# Marina Zhurakhinskaya , 2009, 2010. +# Sergey Davidoff , 2010. +# Yuri Kozlov , 2011, 2012. +# JDronova , 2013. +# Valery Kirichenko , 2014. +# Yuri Myasoedov , 2012, 2013, 2014. +# Ivan Komaritsyn , 2015. +# Stas Solovey , 2011, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-11 18:01+0000\n" +"PO-Revision-Date: 2019-02-24 23:46+0300\n" +"Last-Translator: Stas Solovey \n" +"Language-Team: Русский \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.2.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Система" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Показать список уведомлений" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Передать фокус активному уведомлению" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Показать обзор" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Показать все приложения" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Открыть меню приложений" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Расширения GNOME Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Настроить расширения GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Управление окнами и запуск приложений" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Включить внутренние инструменты из Alt-F2 для разработчиков и тестеров" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Разрешает доступ к внутренней отладке и инструментам наблюдения, используя " +"диалог Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID включённых расширений" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"У расширений GNOME Shell есть свойство UUID; в этом ключе перечислены " +"расширения, которые должны быть загружены. Этим списком также можно " +"управлять через методы DBus EnableExtension и DisableExtension сервиса org." +"gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Выключить пользовательские расширения" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Отключите все расширения, которые пользователь активировал, не затрагивая " +"параметр «enabled-extension»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Отключает проверку совместимости версий расширений" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell будет загружать только те расширения, у которых заявлена " +"поддержка текущей версии. Включение этой опции отключит эту проверку и " +"попробует загрузить все расширения вне зависимости от версии, которую они " +"поддерживают." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Список идентификаторов desktop-файлов для избранных приложений" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Приложения, соответствующие этих идентификаторам, будут показаны в области " +"избранных приложений." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Экран выбора приложений" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Индекс текущего выбранного экрана приложений." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "История команд диалогового окна (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "История просмотра прозрачного диалогового окна" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Всегда показывать в пользовательском меню пункт «Завершить сеанс»." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Этот ключ переопределяет автоматическое скрытие пункта «Завершить сеанс» при " +"использовании системы с одной учётной записью пользователя." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Запоминать ли пароль для подключения зашифрованных или удалённых файловых " +"систем" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Gnome Shell запросит пароль при подключении зашифрованного устройства или " +"удаленной файловой системы. Если пароль можно сохранить для последующего " +"использования, будет установлен флажок «Запомнить пароль». Этот ключ " +"устанавливает состояние по умолчанию для флажка." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Связан ли адаптер Bluetooth по умолчанию с каким-либо устройством" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Пункт меню Bluetooth будет отображаться только в случае включённого адаптера " +"Bluetooth, или если имеются установленные устройства связанные с адаптером " +"по умолчанию. Параметр будет сброшен, если адаптер по умолчанию не имеет " +"связанных с ним устройств." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Включить API самоанализа" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Включает D-Bus API, который позволяет анализировать состояние приложения " +"gnome shell." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Комбинация клавиш для открытия меню приложения" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Комбинация клавиш для открытия меню приложения." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Комбинация клавиш для перехода в режим просмотра приложений" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Комбинация клавиш для перехода в режим просмотра приложений в меню «Обзор»." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Комбинация клавиш для перехода в режим обзора" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Комбинация клавиш для перехода в режим обзора." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Комбинация клавиш для отображения или скрытия списка уведомлений" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Комбинация клавиш для отображения или скрытия списка уведомлений." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Комбинация клавиш для перевода фокуса на текущее уведомление" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Комбинация клавиш для перевода фокуса на текущее уведомление." + +# tweens — что-то типа анимации +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Комбинация клавиш, которая приостанавливает и возобновляет все запущенные " +"анимации (для отладки)" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Переключиться на приложение 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Переключиться на приложение 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Переключиться на приложение 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Переключиться на приложение 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Переключиться на приложение 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Переключиться на приложение 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Переключиться на приложение 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Переключиться на приложение 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Переключиться на приложение 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Какую клавиатуру использовать" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Тип используемой клавиатуры." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Ограничить переключатель текущим рабочим местом." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Если выбрано, то в переключателе будут показываться только те приложения, " +"чьи окна находятся на текущем рабочем месте. Иначе все приложения будут " +"включены." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Режим значка приложения." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Управляет способом отображения окон в переключателе. Доступные значения: " +"«thumbnail-only» (показывать миниатюру окна), «app-icon-only» (показывать " +"только значок приложения), «both» (показывать миниатюру и значок)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Если выбрано, то в переключателе будут показываться только окна из текущего " +"рабочего места. Иначе все окна будут включены." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Прикреплять модальное диалоговое окно к родительскому окну" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Этот ключ переопределяет ключ в org.gnome.mutter при запуске GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Включить автоматическое изменение размеров окон при перемещении окон к краям " +"экрана" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Рабочие места управляются динамически" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Рабочие места только на основном мониторе" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Задержка изменения фокуса в режиме мыши после остановки указателя" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Сетевая авторизация" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "О, нет! Что-то пошло не так" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Мы очень сожалеем, но возникла проблема: настройки этого расширения не могут " +"быть отображены. Мы рекомендуем сообщить об этой проблеме авторам расширения." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Технические подробности" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Скопировать ошибку" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Домашняя страница" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Посетить домашнюю страницу расширения" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Нет установленных расширений" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Расширения могут быть установлены с помощью Центра приложений или extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Просмотреть в Центре приложений" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Отмена" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Далее" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Разблокировать" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Войти" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Выбрать сеанс" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Нет в списке?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(например, пользователь или %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Имя пользователя: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Окно входа в систему" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Ошибка проверки подлинности" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(или проведите пальцем по считывающему устройству)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Выключить" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "выключение;завершение;перезагрузка;перезапуск" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Экран блокировки" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "экран блокировки" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Завершить сеанс" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "завершить сеанс;выйти" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Ждущий режим" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "ждущий;спящий режим" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Сменить пользователя" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "переключить;сменить пользователя" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Заблокировать ориентацию" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "заблокировать ориентацию;экран;поворот" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Команда не найдена" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Не удалось разобрать команду:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Не удалось выполнить «%s»:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Прямо сейчас" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d минута назад" +msgstr[1] "%d минуты назад" +msgstr[2] "%d минут назад" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d час назад" +msgstr[1] "%d часа назад" +msgstr[2] "%d часов назад" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Вчера" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d день назад" +msgstr[1] "%d дня назад" +msgstr[2] "%d дней назад" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d неделя назад" +msgstr[1] "%d недели назад" +msgstr[2] "%d недель назад" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d месяц назад" +msgstr[1] "%d месяца назад" +msgstr[2] "%d месяцев назад" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d год назад" +msgstr[1] "%d года назад" +msgstr[2] "%d лет назад" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Вчера, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%-l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Вчера, %-l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %-l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, %l∶%M %p" + +# fix даты +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Авторизация в точке доступа" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Соединение с этой точкой доступа не безопасно. Пароли или другая информация, " +"которую вы вводите на этой странице, могут просматриваться пользователями, " +"находящимися рядом." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Запретить доступ" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Предоставить доступ" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Здесь появляются часто используемые приложения" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Популярные" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Все" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Новое окно" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Запустить используя дискретную видеокарту" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Удалить из избранного" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Добавить в избранное" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Показать подробности" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Приложение %s добавлено в избранное." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Приложение %s удалено из избранного." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Выберите аудиоустройство" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Параметры звука" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Наушники" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Гарнитура" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Микрофон" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Изменить фон…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Параметры дисплея" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Параметры" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "Вс" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "Пн" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "Вт" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ср" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "Чт" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "Пт" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "Сб" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "Предыдущий месяц" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "Следующий месяц" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +msgid "Week %V" +msgstr "%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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "Весь день" + +#: js/ui/calendar.js:829 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d %B" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d %B %Y" + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "Уведомлений нет" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "Событий нет" + +#: js/ui/calendar.js:1085 +msgid "Clear" +msgstr "Очистить" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "«%s» не отвечает." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Вы можете подождать отклика приложения некоторое время, или принудительно " +"завершить его работу." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Принудительно завершить" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Подождать" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Внешний диск подключён" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Внешний диск отключён" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Открыть с помощью %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Пароль:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Введите ещё раз:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"В качестве альтернативы вы можете подключиться, нажав кнопку «WPS» на вашем " +"маршрутизаторе." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Соединиться" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Пароль: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Ключ: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Пароль личного ключа: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Учётная запись: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Служба: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Беспроводная сеть требует аутентификацию" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Для доступа к беспроводной сети «%s» требуется пароль или ключ шифрования." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Аутентификация Wired 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Название сети: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Аутентификация DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Требуется PIN-код" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Для устройства мобильной связи требуется PIN-код" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN-код: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Пароль сети мобильной связи" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Для подключения к «%s» требуется пароль." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Диспетчер сети" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Требуется подтверждение подлинности" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Администратор" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Подтвердить" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Не удалось подтвердить подлинность. Попробуйте снова." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Контакт %s теперь известен как %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Окна" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Показать приложения" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Панель приложений" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %-d %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Добавить мировые часы…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Мировые часы" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Погода" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Выберите местоположение…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Загрузка…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Подключите интернет для получения информации о погоде" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Информация о погоде сейчас недоступна" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Завершение сеанса пользователя %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Завершение сеанса" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "" +"Сеанс пользователя %s будет автоматически завершён через %d секунду." +msgstr[1] "" +"Сеанс пользователя %s будет автоматически завершён через %d секунды." +msgstr[2] "Сеанс пользователя %s будет автоматически завершён через %d секунд." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Сеанс будет автоматически завершён через %d секунду." +msgstr[1] "Сеанс будет автоматически завершён через %d секунды." +msgstr[2] "Сеанс будет автоматически завершён через %d секунд." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Завершить сеанс" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Выключение" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Установить обновления и выключить" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Система будет автоматически выключена через %d секунду." +msgstr[1] "Система будет автоматически выключена через %d секунды." +msgstr[2] "Система будет автоматически выключена через %d секунд." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Установить отложенные обновления ПО" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Перезапустить" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Выключить" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Перезапуск" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Система будет автоматически перезапущена через %d секунду." +msgstr[1] "Система будет автоматически перезапущена через %d секунды." +msgstr[2] "Система будет автоматически перезапущена через %d секунд." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Перезапуск и установка обновлений" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Система автоматически перезапустится и установит обновления через %d секунду." +msgstr[1] "" +"Система автоматически перезапустится и установит обновления через %d секунды." +msgstr[2] "" +"Система автоматически перезапустится и установит обновления через %d секунд." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Перезапустить и установить" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Установить и выключить" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Выключить после установки обновлений" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Перезапуск и установка обновлений" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s будет установлено после перезапуска. Установка обновлений может занять " +"продолжительное время: убедитесь, что у вас есть резервная копия и что " +"компьютер подключен к сети." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Компьютер работает от батареи: перед установкой обновлений подключите " +"зарядное устройство." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Некоторые приложения заняты или результаты их работы не сохранены." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "В системе имеются открытые сеансы других пользователей." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (удалённый)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (консоль)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Установить" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Загрузить и установить расширение «%s» из extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s пытается заменить комбинации клавиш" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Приложение пытается заменить комбинации клавиш" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Можете восстановить комбинации клавиш, нажав %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Отказать" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Разрешить" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "«Медленные» клавиши включены" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "«Медленные» клавиши выключены" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Вы только что удержали клавишу Shift нажатой 8 секунд. Это комбинация для " +"включения функции «медленные» клавиши, которая влияет на способ работы с " +"клавиатурой." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "«Залипающие» клавиши включены" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "«Залипающие» клавиши выключены" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Вы только что нажали клавишу Shift 5 раз подряд. Это комбинация для " +"включения функции «залипающие» клавиши, которая влияет на способ работы " +"клавиатуры." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Вы только что нажали две клавиши одновременно или нажали клавишу Shift 5 раз " +"подряд. Это привело к включению функции «залипающие клавиши», которая влияет " +"на режим работы клавиатуры." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Оставить включёнными" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Включить" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Выключить" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Оставить выключенными" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Настройки языка и региона" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Расширения не установлены" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s не сообщал о каких-либо ошибках." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Скрыть ошибки" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Показать ошибки" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Включено" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Выключено" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Ошибка" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Устарело" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Загрузка" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Показать код" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Веб-страница" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Системная информация" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Неизвестный исполнитель" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Неизвестное название" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Громкость" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Отменить" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Обзор" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Найти…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Создать комбинацию клавиш…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Определено приложением" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Показывать экранную справку" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Переключить монитор" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Назначение клавишь" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Готово" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Правка…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Нет" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Нажмите кнопку для настройки" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Нажмите Esc для выхода" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Нажмите любую клавишу для выхода" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Завершить" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Обзор" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Система" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Верхняя панель" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Введите команду" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Закрыть" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Перезапуск не доступен при использовании Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Перезапуск…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %-d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d новое сообщение" +msgstr[1] "%d новых сообщения" +msgstr[2] "%d новых сообщений" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d новое уведомление" +msgstr[1] "%d новых уведомления" +msgstr[2] "%d новых уведомлений" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Заблокировать" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME необходимо заблокировать экран" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Не удалось заблокировать" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Блокировке помешало приложение" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Поиск…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Ничего не найдено." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d ещё" +msgstr[1] "%d ещё" +msgstr[2] "%d ещё" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Копировать" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Вставить" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Показать текст" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Скрыть текст" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Пароль" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Запомнить пароль" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Доступность" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Масштабирование" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Экранный диктор" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Экранная клавиатура" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Визуальные предупреждения" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Залипающие клавиши" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Медленные клавиши" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Отскакивающие клавиши" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Клавиши мыши" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Высокая контрастность" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Крупный текст" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Настроить Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "Подключено %d" +msgstr[1] "Подключено %d" +msgstr[2] "Подключено %d" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Выключено" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Включено" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Яркость" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Клавиатура" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Показать раскладку клавиатуры" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Геолокация включена" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Выключить" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Параметры конфиденциальности" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Геолокация используется" + +# заменил "определение местоположения" на "геолокация" потому что не влазит в панель +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Геолокация выключена" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Включить" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Предоставить %s доступ к вашему местоположению?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Параметры доступа к данным местоположения можно изменить в любое время в " +"настройках конфиденциальности." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "<неизвестно>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "" +"%s сеть\n" +"выключена" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "" +"%s сеть\n" +"подключена" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "" +"%s сеть\n" +"не управляется" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "" +"%s сеть\n" +"выключается" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "" +"%s сеть\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:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "" +"%s сеть\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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Отсутствует прошивка для %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "" +"%s сеть\n" +"недоступна" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Сбой подключения %s сети" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Параметры соединения" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Параметры мобильной связи" + +# заменил "оборудование" потому что не влазит в панель +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "" +"%s аппаратура\n" +"отключена" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "" +"%s сеть\n" +"отключена" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Подключиться к Интернету" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Включён авиарежим" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Когда включён режим авиаперелёта, адаптер Wi-Fi выключен." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Выключить режим авиаперелёта" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi выключен" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Для подключения к сети, адаптер Wi-Fi должен быть включён." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Включить Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Сети Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Выберите сеть" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Сети отсутствуют" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "" +"Отключается\n" +"механическим\n" +"переключателем" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Выбрать сеть" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Параметры Wi-Fi" + +# перенос иначе не влазит в панель +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "" +"Включена точка\n" +"доступа %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "" +"%s сеть\n" +"не подключена" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "подключение…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "требуется аутентификация" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "сбой подключения" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Параметры VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "" +"Соединение VPN\n" +"выключено" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Параметры сети" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s проводное соединение" +msgstr[1] "%s проводных соединения" +msgstr[2] "%s проводных соединений" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s соединение Wi-Fi" +msgstr[1] "%s соединения Wi-Fi" +msgstr[2] "%s соединений Wi-Fi" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s модемное соединение" +msgstr[1] "%s модемных соединения" +msgstr[2] "%s модемных соединений" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Сбой подключения" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Не удалось активировать сетевое подключение" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "" +"Ночная подсветка\n" +"отключена" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "" +"Ночная подсветка\n" +"включена" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Продолжить" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Отключить до завтра" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Параметры питания" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Полный заряд" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Не заряжается" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Подсчитывается…" + +# нужно в две строки, иначе не влезает в выпадающую панель +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "" +"Осталось %02d ч. %d мин.\n" +"Разряжается (%d %%)" + +# нужно в две строки, иначе не влезает в выпадающую панель +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "" +"До полной %02d ч. %d мин.\n" +"Заряжается (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Экран общедоступен" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Выключить" + +# Нужно максимально коротко, иначе не влазит в меню gnome shell +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Включён авиарежим" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Сменить пользователя" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Завершить сеанс" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Параметры учётных записей" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Заблокировать ориентацию" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Ждущий режим" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Выключить" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Неизвестное устройство Thunderbolt" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Новое устройство было обнаружено во время вашего отсутствия. Отключите и " +"снова подключите устройство, Чтобы начать использовать устройство, отключите " +"и снова подключите его." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Неавторизованное устройство Thunderbolt" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Новое устройство было обнаружено и должно быть авторизовано администратором." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Ошибка авторизации Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Не удалось авторизовать устройство Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Громкость изменена" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Зеркальное отображение" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Объединить дисплеи" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Только внешний" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Только встроенный" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Войти от имени другого пользователя" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Разблокировать окно" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Приложения" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Поиск" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "Окно «%s» ожидает" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Сохранить эти параметры дисплея?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Вернуть параметры" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Сохранить изменения" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Изменения параметров будут отменены через %d секунду" +msgstr[1] "Изменения параметров будут отменены через %d секунды" +msgstr[2] "Изменения параметров будут отменены через %d секунд" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Свернуть" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Вернуть прежний размер" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Развернуть" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Переместить" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Изменить размер" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Переместить панель заголовка на экран" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Всегда сверху" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Всегда на видимом рабочем месте" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Переместить на рабочее влево" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Переместить на рабочее место вправо" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Переместить на рабочее место вверх" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Переместить на рабочее место вниз" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Переместить на экран вверх" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Переместить на экран вниз" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Переместить на экран влево" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Переместить на экран вправо" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Календарь Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Показать номер версии" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Режим, используемый GDM для окна входа в систему" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "" +"Использовать для экрана входа в систему определённый режим, например «gdm»" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Список возможных режимов" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Неизвестное приложение" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Не удалось запустить «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Пароли не совпадают." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Пароль не может быть пустым" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Аутентификация отклонена пользователем" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u выход" +msgstr[1] "%u выхода" +msgstr[2] "%u выходов" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u вход" +msgstr[1] "%u входа" +msgstr[2] "%u входов" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Системные звуки" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Возникла ошибка загрузки диалогового окна параметров для %s:" + +#~ msgid "%s all day." +#~ msgstr "%s весь день." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, затем позднее %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, затем %s, позже %s." + +#~ msgid "Feels like %s." +#~ msgstr "Ощущается как %s." + +#~ 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 "Скрыть лоток" + +#~ msgid "Status Icons" +#~ msgstr "Значки состояния" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Параметры расширений GNOME Shell" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Перенаправление для проверки подлинности" + +#~ msgid "Events" +#~ msgstr "События" + +#~ msgid "Notifications" +#~ msgstr "Уведомления" + +#~ msgid "Clear section" +#~ msgstr "Очистить секцию" + +#~ msgid "Media" +#~ msgstr "Медиа" + +#~ msgid "Not In Use" +#~ msgstr "Не используется" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Показывать в календаре нумерацию недель" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "" +#~ "Если включено, календарь будет показывать нумерацию недель в формате ISO." + +#~ msgid "Use as Internet connection" +#~ msgstr "Использовать как Интернет-соединение" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s запрашивает доступ к вашему положению." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (компоновщик wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "Подключено %d устройство" +#~ msgstr[1] "Подключено %d устройства" +#~ msgstr[2] "Подключено %d устройств" + +#~ msgid "Authentication required" +#~ msgstr "Требуется подтверждение подлинности" + +# Источник Бесперебойного Питания +#~ msgid "UPS" +#~ msgstr "ИБП" + +#~ msgid "Battery" +#~ msgstr "Батарея" + +#~ msgid "Airplane Mode" +#~ msgstr "Режим авиаперелёта" diff --git a/po/si.po b/po/si.po new file mode 100644 index 0000000..194f8ec --- /dev/null +++ b/po/si.po @@ -0,0 +1,1667 @@ +# Sinhala translation for gnome-shell. +# Copyright (C) 2012 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Danishka Navin , 2012. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-02-01 05:57+0000\n" +"PO-Revision-Date: 2012-02-01 15:44+0530\n" +"Last-Translator: Danishka Navin \n" +"Language-Team: Sinhala \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" +"Language: si\n" +"X-Generator: Lokalize 1.2\n" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME ශෙල්" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:1 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:2 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:3 +msgid "File extension used for storing the screencast" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:4 +msgid "Framerate used for recording screencasts." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:5 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension DBus methods on org.gnome.Shell." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:6 +msgid "History for command (Alt-F2) dialog" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:7 +msgid "History for the looking glass dialog" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:8 +msgid "If true, display date in the clock, in addition to time." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:9 +msgid "If true, display seconds in time." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:10 +msgid "If true, display the ISO week date in the calendar." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:11 +msgid "List of desktop file IDs for favorite applications" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:13 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM " +"using the VP8 codec. %T is used as a placeholder for a guess at the optimal " +"thread count on the system." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:14 +msgid "Show date in clock" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:15 +msgid "Show the week date in the calendar" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:16 +msgid "Show time with seconds" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:17 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:18 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:19 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:20 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:21 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:22 +msgid "The type of keyboard to use." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:23 +msgid "Uuids of extensions to enable" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:24 +msgid "Whether to collect stats about applications usage" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:25 +msgid "Which keyboard to use" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.h:26 +msgid "disabled OpenSearch providers" +msgstr "" + +#: ../js/gdm/loginDialog.js:624 +msgid "Session..." +msgstr "සැසිය..." + +#: ../js/gdm/loginDialog.js:786 +msgctxt "title" +msgid "Sign In" +msgstr "" + +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/loginDialog.js:831 +msgid "(or swipe finger)" +msgstr "" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:852 +msgid "Not listed?" +msgstr "" + +#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:419 +#: ../js/ui/extensionSystem.js:516 ../js/ui/networkAgent.js:145 +#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 +msgid "Cancel" +msgstr "අහෝසි කරන්න" + +#: ../js/gdm/loginDialog.js:1025 +msgctxt "button" +msgid "Sign In" +msgstr "" + +#: ../js/gdm/loginDialog.js:1377 +msgid "Login Window" +msgstr "" + +#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:581 +#: ../js/ui/userMenu.js:583 ../js/ui/userMenu.js:652 +msgid "Suspend" +msgstr "" + +#: ../js/gdm/powerMenu.js:118 +msgid "Restart" +msgstr "යළි අරඹන්න" + +#: ../js/gdm/powerMenu.js:123 +msgid "Power Off" +msgstr "වසා දමන්න" + +#: ../js/misc/util.js:92 +msgid "Command not found" +msgstr "" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:119 +msgid "Could not parse command:" +msgstr "" + +#: ../js/misc/util.js:127 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:251 +msgid "All" +msgstr "සියල්ල" + +#: ../js/ui/appDisplay.js:310 +msgid "APPLICATIONS" +msgstr "යෙදුම්" + +#: ../js/ui/appDisplay.js:366 +msgid "SETTINGS" +msgstr "සැකසුම්" + +#: ../js/ui/appDisplay.js:666 +msgid "New Window" +msgstr "නව කවුළුව" + +#: ../js/ui/appDisplay.js:669 +msgid "Remove from Favorites" +msgstr "" + +#: ../js/ui/appDisplay.js:670 +msgid "Add to Favorites" +msgstr "" + +#: ../js/ui/appFavorites.js:87 +#, c-format +msgid "%s has been added to your favorites." +msgstr "" + +#: ../js/ui/appFavorites.js:118 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "" + +#: ../js/ui/autorunManager.js:265 +msgid "Removable Devices" +msgstr "ඉවත් කළ හැකි මෙවලම්" + +#: ../js/ui/autorunManager.js:560 +#, c-format +msgid "Open with %s" +msgstr "%s සමඟ විවෘත කරන්න" + +#: ../js/ui/autorunManager.js:586 +msgid "Eject" +msgstr "ඉවත් කරන්න" + +#. 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:62 +msgctxt "event list time" +msgid "All Day" +msgstr "දවස පුරා" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:67 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H:%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:74 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:114 +msgctxt "grid sunday" +msgid "S" +msgstr "ඉ" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:116 +msgctxt "grid monday" +msgid "M" +msgstr "ස" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:118 +msgctxt "grid tuesday" +msgid "T" +msgstr "අ" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:120 +msgctxt "grid wednesday" +msgid "W" +msgstr "බ" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:122 +msgctxt "grid thursday" +msgid "T" +msgstr "බ්‍ර" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:124 +msgctxt "grid friday" +msgid "F" +msgstr "සි" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:126 +msgctxt "grid saturday" +msgid "S" +msgstr "සෙ" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:139 +msgctxt "list sunday" +msgid "Su" +msgstr "ඉ" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:141 +msgctxt "list monday" +msgid "M" +msgstr "ස" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:143 +msgctxt "list tuesday" +msgid "T" +msgstr "අ" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:145 +msgctxt "list wednesday" +msgid "W" +msgstr "බ" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:147 +msgctxt "list thursday" +msgid "Th" +msgstr "බ්‍ර" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:149 +msgctxt "list friday" +msgid "F" +msgstr "සි" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:151 +msgctxt "list saturday" +msgid "S" +msgstr "සෙ" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:681 +msgid "Nothing Scheduled" +msgstr "කිසිවක් සැළමුක් කර නැත" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:697 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:700 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:710 +msgid "Today" +msgstr "අද" + +#: ../js/ui/calendar.js:714 +msgid "Tomorrow" +msgstr "හෙට" + +#: ../js/ui/calendar.js:723 +msgid "This week" +msgstr "මේ සතියෙ" + +#: ../js/ui/calendar.js:731 +msgid "Next week" +msgstr "ලබන සතියෙ" + +#: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486 +#: ../js/ui/status/power.js:215 ../src/shell-app.c:372 +msgid "Unknown" +msgstr "නොදන්නා" + +#: ../js/ui/contactDisplay.js:84 ../js/ui/userMenu.js:127 +msgid "Available" +msgstr "සිටි" + +#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:136 +msgid "Away" +msgstr "පිටතට ගොස්" + +#: ../js/ui/contactDisplay.js:93 ../js/ui/userMenu.js:130 +msgid "Busy" +msgstr "කාර්‍යය බහුලයි" + +#: ../js/ui/contactDisplay.js:97 +msgid "Offline" +msgstr "නොබැඳිව" + +#: ../js/ui/contactDisplay.js:148 +msgid "CONTACTS" +msgstr "සබධතා" + +#: ../js/ui/dash.js:229 ../js/ui/messageTray.js:1204 +msgid "Remove" +msgstr "ඉවත් කරන්න" + +#: ../js/ui/dateMenu.js:97 +msgid "Date and Time Settings" +msgstr "දින සහ වේලා සැකසුම්" + +#: ../js/ui/dateMenu.js:123 +msgid "Open Calendar" +msgstr "දිනදර්ශනය විවෘත කරන්න" + +#. Translators: This is the time format with date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:181 +msgid "%a %b %e, %R:%S" +msgstr "%a %b %e, %R:%S" + +#: ../js/ui/dateMenu.js:182 +msgid "%a %b %e, %R" +msgstr "%a %b %e, %R" + +#. Translators: This is the time format without date used +#. in 24-hour mode. +#: ../js/ui/dateMenu.js:186 +msgid "%a %R:%S" +msgstr "%a %R:%S" + +#: ../js/ui/dateMenu.js:187 +msgid "%a %R" +msgstr "%a %R" + +#. Translators: This is a time format with date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:194 +msgid "%a %b %e, %l:%M:%S %p" +msgstr "%a %b %e, %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:195 +msgid "%a %b %e, %l:%M %p" +msgstr "%a %b %e, %l:%M %p" + +#. Translators: This is a time format without date used +#. for AM/PM. +#: ../js/ui/dateMenu.js:199 +msgid "%a %l:%M:%S %p" +msgstr "%a %l:%M:%S %p" + +#: ../js/ui/dateMenu.js:200 +msgid "%a %l:%M %p" +msgstr "%a %l:%M %p" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). +#. +#: ../js/ui/dateMenu.js:211 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/docDisplay.js:13 +msgid "RECENT ITEMS" +msgstr "මැතකදි භාවිත කළ අයිතම" + +#: ../js/ui/endSessionDialog.js:61 +#, c-format +msgctxt "title" +msgid "Log Out %s" +msgstr "ඉවත් වන්න %s" + +#: ../js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Log Out" +msgstr "පිටවීම" + +#: ../js/ui/endSessionDialog.js:63 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:65 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:70 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:74 +msgid "Logging out of the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:76 +msgctxt "button" +msgid "Log Out" +msgstr "ඉවත්වන්න" + +#: ../js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Power Off" +msgstr "වසාදමන්න" + +#: ../js/ui/endSessionDialog.js:82 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:84 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:88 +msgid "Powering off the system." +msgstr "පද්ධතිය වසමින්" + +#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107 +msgctxt "button" +msgid "Restart" +msgstr "යළි අරඹන්න" + +#: ../js/ui/endSessionDialog.js:92 +msgctxt "button" +msgid "Power Off" +msgstr "වසන්න" + +#: ../js/ui/endSessionDialog.js:98 +msgctxt "title" +msgid "Restart" +msgstr "යළි අරඹන්න" + +#: ../js/ui/endSessionDialog.js:99 +msgid "Click Restart to quit these applications and restart the system." +msgstr "" + +#: ../js/ui/endSessionDialog.js:101 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "" +msgstr[1] "" + +#: ../js/ui/endSessionDialog.js:105 +msgid "Restarting the system." +msgstr "පද්ධතිය යළි අරඹන්න" + +#: ../js/ui/extensionSystem.js:520 +msgid "Install" +msgstr "ස්ථාපනය" + +#: ../js/ui/extensionSystem.js:524 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "" + +#: ../js/ui/keyboard.js:322 +msgid "tray" +msgstr "තැටිය" + +#: ../js/ui/keyboard.js:539 ../js/ui/status/power.js:203 +msgid "Keyboard" +msgstr "යතුරුපුවරුව" + +#: ../js/ui/lookingGlass.js:724 +msgid "No extensions installed" +msgstr "" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:779 +#, c-format +msgid "%s has not emitted any errors." +msgstr "" + +#: ../js/ui/lookingGlass.js:785 +msgid "Hide Errors" +msgstr "දෝෂ සඟවන්න" + +#: ../js/ui/lookingGlass.js:789 ../js/ui/lookingGlass.js:840 +msgid "Show Errors" +msgstr "දෝෂ පෙන්වන්න" + +#: ../js/ui/lookingGlass.js:798 +msgid "Enabled" +msgstr "සක්‍රීයයි" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:801 ../src/gvc/gvc-mixer-control.c:1093 +msgid "Disabled" +msgstr "අක්‍රීයයි" + +#: ../js/ui/lookingGlass.js:803 +msgid "Error" +msgstr "දෝෂය" + +#: ../js/ui/lookingGlass.js:805 +msgid "Out of date" +msgstr "කල් ඉකුත් වූ" + +#: ../js/ui/lookingGlass.js:807 +msgid "Downloading" +msgstr "බාගනිමින්" + +#: ../js/ui/lookingGlass.js:828 +msgid "View Source" +msgstr "මූලය පෙන්වන්න" + +#: ../js/ui/lookingGlass.js:834 +msgid "Web Page" +msgstr "වෙබ් පිටුව" + +#: ../js/ui/messageTray.js:1197 +msgid "Open" +msgstr "විවෘත කරන්න" + +#: ../js/ui/messageTray.js:1214 +msgid "Unmute" +msgstr "නිහඬ නොකරන්න" + +#: ../js/ui/messageTray.js:1214 +msgid "Mute" +msgstr "නිහඬ" + +#: ../js/ui/messageTray.js:2446 +msgid "System Information" +msgstr "පද්ධති තොරතුරු" + +#: ../js/ui/networkAgent.js:140 +msgid "Connect" +msgstr "සම්බන්ධවන්න" + +#. Cisco LEAP +#: ../js/ui/networkAgent.js:235 ../js/ui/networkAgent.js:247 +#: ../js/ui/networkAgent.js:274 ../js/ui/networkAgent.js:294 +#: ../js/ui/networkAgent.js:304 +msgid "Password: " +msgstr "මුරපදය: " + +#. static WEP +#: ../js/ui/networkAgent.js:240 +msgid "Key: " +msgstr "යතුර: " + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/ui/networkAgent.js:272 ../js/ui/networkAgent.js:290 +msgid "Username: " +msgstr "පරිශීලක නාමය: " + +#: ../js/ui/networkAgent.js:278 +msgid "Identity: " +msgstr "" + +#: ../js/ui/networkAgent.js:280 +msgid "Private key password: " +msgstr "පුද්ගලික මුරපදය:" + +#: ../js/ui/networkAgent.js:292 +msgid "Service: " +msgstr "සේවාව:" + +#: ../js/ui/networkAgent.js:321 +msgid "Authentication required by wireless network" +msgstr "" + +#: ../js/ui/networkAgent.js:322 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network '%" +"s'." +msgstr "" + +#: ../js/ui/networkAgent.js:326 +msgid "Wired 802.1X authentication" +msgstr "" + +#: ../js/ui/networkAgent.js:328 +msgid "Network name: " +msgstr "ජාල නාමය:" + +#: ../js/ui/networkAgent.js:333 +msgid "DSL authentication" +msgstr "" + +#: ../js/ui/networkAgent.js:340 +msgid "PIN code required" +msgstr "" + +#: ../js/ui/networkAgent.js:341 +msgid "PIN code is needed for the mobile broadband device" +msgstr "" + +#: ../js/ui/networkAgent.js:342 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/networkAgent.js:348 +msgid "Mobile broadband network password" +msgstr "" + +#: ../js/ui/networkAgent.js:349 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "" + +#: ../js/ui/overview.js:90 +msgid "Undo" +msgstr "" + +#: ../js/ui/overview.js:199 +msgid "Windows" +msgstr "කවුළු" + +#: ../js/ui/overview.js:202 +msgid "Applications" +msgstr "යෙදුම්" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:226 +msgid "Dash" +msgstr "ඩැෂ්" + +#: ../js/ui/panel.js:572 +msgid "Quit" +msgstr "ඉවත්වීම" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:603 +msgid "Activities" +msgstr "ක්‍රියාකාරකම්" + +#: ../js/ui/panel.js:990 +msgid "Top Bar" +msgstr "ඉහළ තීරුව" + +#: ../js/ui/placeDisplay.js:115 +#, c-format +msgid "Failed to unmount '%s'" +msgstr "" + +#: ../js/ui/placeDisplay.js:118 +msgid "Retry" +msgstr "යළි-උත්සාහය" + +#: ../js/ui/placeDisplay.js:156 +msgid "Connect to..." +msgstr "" + +#: ../js/ui/placeDisplay.js:367 +msgid "PLACES & DEVICES" +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:71 +msgid "Authentication Required" +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:109 +msgid "Administrator" +msgstr "පරිපාලක" + +#: ../js/ui/polkitAuthenticationAgent.js:179 +msgid "Authenticate" +msgstr "" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/polkitAuthenticationAgent.js:260 +msgid "Sorry, that didn't work. Please try again." +msgstr "" + +#: ../js/ui/polkitAuthenticationAgent.js:272 +msgid "Password:" +msgstr "මුරපදය:" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:720 +msgid "toggle-switch-us" +msgstr "" + +#: ../js/ui/runDialog.js:205 +msgid "Please enter a command:" +msgstr "" + +#: ../js/ui/searchDisplay.js:333 +msgid "Searching..." +msgstr "සොයමින්..." + +#: ../js/ui/searchDisplay.js:356 +msgid "No matching results." +msgstr "" + +#: ../js/ui/shellEntry.js:26 +msgid "Copy" +msgstr "පිටපත් කරන්න" + +#: ../js/ui/shellEntry.js:31 +msgid "Paste" +msgstr "අලවන්න" + +#: ../js/ui/shellEntry.js:77 +msgid "Show Text" +msgstr "පෙළ පෙන්වන්න" + +#: ../js/ui/shellEntry.js:79 +msgid "Hide Text" +msgstr "පෙළ සඟවන්න" + +#: ../js/ui/shellMountOperation.js:271 +msgid "Wrong password, please try again" +msgstr "" + +#: ../js/ui/status/accessibility.js:47 +msgid "Accessibility" +msgstr "" + +#: ../js/ui/status/accessibility.js:52 +msgid "Zoom" +msgstr "විශාලණය" + +#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, +#. 'screen-reader-enabled'); +#. this.menu.addMenuItem(screenReader); +#: ../js/ui/status/accessibility.js:63 +msgid "Screen Keyboard" +msgstr "" + +#: ../js/ui/status/accessibility.js:67 +msgid "Visual Alerts" +msgstr "" + +#: ../js/ui/status/accessibility.js:70 +msgid "Sticky Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:73 +msgid "Slow Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:76 +msgid "Bounce Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:79 +msgid "Mouse Keys" +msgstr "" + +#: ../js/ui/status/accessibility.js:83 +msgid "Universal Access Settings" +msgstr "" + +#: ../js/ui/status/accessibility.js:117 +msgid "High Contrast" +msgstr "" + +#: ../js/ui/status/accessibility.js:154 +msgid "Large Text" +msgstr "" + +#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35 +#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341 +#: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407 +#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893 +msgid "Bluetooth" +msgstr "බ්ලුටූත්" + +#: ../js/ui/status/bluetooth.js:48 +msgid "Visibility" +msgstr "" + +#: ../js/ui/status/bluetooth.js:62 +msgid "Send Files to Device..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:63 +msgid "Set up a New Device..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:87 +msgid "Bluetooth Settings" +msgstr "" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/network.js:256 +msgid "hardware disabled" +msgstr "" + +#: ../js/ui/status/bluetooth.js:203 +msgid "Connection" +msgstr "" + +#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491 +msgid "disconnecting..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:497 +msgid "connecting..." +msgstr "" + +#: ../js/ui/status/bluetooth.js:245 +msgid "Send Files..." +msgstr "ගොනු යවන්න..." + +#: ../js/ui/status/bluetooth.js:250 +msgid "Browse Files..." +msgstr "ගොනු ගවේෂණය" + +#: ../js/ui/status/bluetooth.js:259 +msgid "Error browsing device" +msgstr "" + +#: ../js/ui/status/bluetooth.js:260 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "" + +#: ../js/ui/status/bluetooth.js:268 +msgid "Keyboard Settings" +msgstr "" + +#: ../js/ui/status/bluetooth.js:271 +msgid "Mouse Settings" +msgstr "" + +#: ../js/ui/status/bluetooth.js:276 ../js/ui/status/volume.js:58 +msgid "Sound Settings" +msgstr "" + +#: ../js/ui/status/bluetooth.js:372 +#, c-format +msgid "Authorization request from %s" +msgstr "" + +#: ../js/ui/status/bluetooth.js:378 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "" + +#: ../js/ui/status/bluetooth.js:380 +msgid "Always grant access" +msgstr "" + +#: ../js/ui/status/bluetooth.js:381 +msgid "Grant this time only" +msgstr "" + +#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1098 +msgid "Reject" +msgstr "" + +#: ../js/ui/status/bluetooth.js:408 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "" + +#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:444 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "" + +#: ../js/ui/status/bluetooth.js:415 +#, c-format +msgid "Please confirm whether the PIN '%s' matches the one on the device." +msgstr "" + +#: ../js/ui/status/bluetooth.js:417 +msgid "Matches" +msgstr "ගැළපීම්" + +#: ../js/ui/status/bluetooth.js:418 +msgid "Does not match" +msgstr "" + +#: ../js/ui/status/bluetooth.js:437 +#, c-format +msgid "Pairing request for %s" +msgstr "" + +#: ../js/ui/status/bluetooth.js:445 +msgid "Please enter the PIN mentioned on the device." +msgstr "" + +#: ../js/ui/status/bluetooth.js:461 +msgid "OK" +msgstr "හරි" + +#: ../js/ui/status/keyboard.js:68 +msgid "Show Keyboard Layout" +msgstr "" + +#: ../js/ui/status/keyboard.js:73 +msgid "Region and Language Settings" +msgstr "" + +#: ../js/ui/status/network.js:96 +msgid "" +msgstr "<නොදන්නා>" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:278 +msgid "disabled" +msgstr "අක්‍රීයයි" + +#. 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) +#: ../js/ui/status/network.js:489 +msgid "unmanaged" +msgstr "" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:500 +msgid "authentication required" +msgstr "" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:510 +msgid "firmware missing" +msgstr "" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:517 +msgid "cable unplugged" +msgstr "කේබලය ගැලවී ඇත" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:522 +msgid "unavailable" +msgstr "භාවිතයට නැත" + +#: ../js/ui/status/network.js:524 +msgid "connection failed" +msgstr "" + +#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505 +msgid "More..." +msgstr "තවත්..." + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440 +msgid "Connected (private)" +msgstr "" + +#: ../js/ui/status/network.js:696 +msgid "Auto Ethernet" +msgstr "ස්වයංක්‍රීය ඉදර්නෙට්" + +#: ../js/ui/status/network.js:757 +msgid "Auto broadband" +msgstr "ස්වයංක්‍රීය අඳිවේගිජාලය" + +#: ../js/ui/status/network.js:760 +msgid "Auto dial-up" +msgstr "ස්වයංක්‍රීය ඩයල්-අප්" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452 +#, c-format +msgid "Auto %s" +msgstr "ස්වයංක්‍රීය %s" + +#: ../js/ui/status/network.js:881 +msgid "Auto bluetooth" +msgstr "ස්වයංක්‍රීය බ්ලුටූත්" + +#: ../js/ui/status/network.js:1454 +msgid "Auto wireless" +msgstr "ස්වයංක්‍රීය රැහැන් රහිත" + +#: ../js/ui/status/network.js:1541 +msgid "Network" +msgstr "ජාලය" + +#: ../js/ui/status/network.js:1548 +msgid "Enable networking" +msgstr "ජාලය සක්‍රීය කරන්න" + +#: ../js/ui/status/network.js:1560 +msgid "Wired" +msgstr "රැහැන් සහිත" + +#: ../js/ui/status/network.js:1571 +msgid "Wireless" +msgstr "රැහැන් රහිත" + +#: ../js/ui/status/network.js:1581 +msgid "Mobile broadband" +msgstr "" + +#: ../js/ui/status/network.js:1591 +msgid "VPN Connections" +msgstr "VPN Connections" + +#: ../js/ui/status/network.js:1602 +msgid "Network Settings" +msgstr "ජාල සැකසුම්" + +#: ../js/ui/status/network.js:1739 +msgid "Connection failed" +msgstr "" + +#: ../js/ui/status/network.js:1740 +msgid "Activation of network connection failed" +msgstr "" + +#: ../js/ui/status/network.js:1993 +msgid "Networking is disabled" +msgstr "ජාලය අක්‍රීයයි" + +#: ../js/ui/status/network.js:2117 +msgid "Network Manager" +msgstr "ජාල කළමණාකරු" + +#: ../js/ui/status/power.js:59 +msgid "Battery" +msgstr "බැටරිය" + +#: ../js/ui/status/power.js:76 +msgid "Power Settings" +msgstr "බැටරි සැකසුම්" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:98 +msgid "Estimating..." +msgstr "ගණනය කරමින්..." + +#: ../js/ui/status/power.js:105 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "පැය %d ක් ඉතිරියි" +msgstr[1] "පැය %d ක් ඉතිරියි" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:108 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "%d %s %d %s ක් ඉතිරිව ඇත" + +#: ../js/ui/status/power.js:110 +msgid "hour" +msgid_plural "hours" +msgstr[0] "පැයක්" +msgstr[1] "පැය" + +#: ../js/ui/status/power.js:110 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "මිනිත්තුව" +msgstr[1] "මිනිත්තු" + +#: ../js/ui/status/power.js:113 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "මිනිත්තු %d ක් ඉතිරියි" +msgstr[1] "මිනිත්තු %d ක් ඉතිරියි" + +#: ../js/ui/status/power.js:116 ../js/ui/status/power.js:186 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d%%" + +#: ../js/ui/status/power.js:193 +msgid "AC adapter" +msgstr "AC ඇප්ටරය" + +#: ../js/ui/status/power.js:195 +msgid "Laptop battery" +msgstr "ලැප්ටොප් බැටරිය" + +#: ../js/ui/status/power.js:197 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:199 +msgid "Monitor" +msgstr "මොනිටරය" + +#: ../js/ui/status/power.js:201 +msgid "Mouse" +msgstr "මවුසය" + +#: ../js/ui/status/power.js:205 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:207 +msgid "Cell phone" +msgstr "" + +#: ../js/ui/status/power.js:209 +msgid "Media player" +msgstr "" + +#: ../js/ui/status/power.js:211 +msgid "Tablet" +msgstr "" + +#: ../js/ui/status/power.js:213 +msgid "Computer" +msgstr "" + +#: ../js/ui/status/volume.js:25 ../js/ui/status/volume.js:38 +msgid "Volume" +msgstr "හඬ" + +#: ../js/ui/status/volume.js:50 +msgid "Microphone" +msgstr "" + +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/telepathyClient.js:225 +msgid "Invitation" +msgstr "" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:278 +msgid "Call" +msgstr "" + +#. We got the TpContact +#: ../js/ui/telepathyClient.js:294 +msgid "File Transfer" +msgstr "" + +#: ../js/ui/telepathyClient.js:376 +msgid "Subscription request" +msgstr "" + +#: ../js/ui/telepathyClient.js:412 +msgid "Connection error" +msgstr "" + +#: ../js/ui/telepathyClient.js:670 +#, c-format +msgid "%s is online." +msgstr "" + +#: ../js/ui/telepathyClient.js:674 +#, c-format +msgid "%s is offline." +msgstr "" + +#: ../js/ui/telepathyClient.js:678 +#, c-format +msgid "%s is away." +msgstr "" + +#: ../js/ui/telepathyClient.js:681 +#, c-format +msgid "%s is busy." +msgstr "" + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/telepathyClient.js:894 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "" + +#. Translators: this is a time format in the style of "Wednesday, May 25", +#. shown when you get a chat message in the same year. +#: ../js/ui/telepathyClient.js:900 +#, no-c-format +msgid "Sent on %A, %B %d" +msgstr "" + +#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", +#. shown when you get a chat message in a different year. +#: ../js/ui/telepathyClient.js:905 +#, no-c-format +msgid "Sent on %A, %B %d, %Y" +msgstr "" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/telepathyClient.js:947 +#, c-format +msgid "%s is now known as %s" +msgstr "" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/telepathyClient.js:1049 +#, c-format +msgid "Invitation to %s" +msgstr "" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/telepathyClient.js:1057 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "" + +#: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1138 +#: ../js/ui/telepathyClient.js:1236 +msgid "Decline" +msgstr "" + +#: ../js/ui/telepathyClient.js:1060 ../js/ui/telepathyClient.js:1139 +#: ../js/ui/telepathyClient.js:1237 +msgid "Accept" +msgstr "" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1090 +#, c-format +msgid "Video call from %s" +msgstr "" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/telepathyClient.js:1093 +#, c-format +msgid "Call from %s" +msgstr "" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/telepathyClient.js:1100 +msgid "Answer" +msgstr "" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/telepathyClient.js:1132 +#, c-format +msgid "%s is sending you %s" +msgstr "" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/telepathyClient.js:1201 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "" + +#: ../js/ui/telepathyClient.js:1294 +msgid "Network error" +msgstr "" + +#: ../js/ui/telepathyClient.js:1296 +msgid "Authentication failed" +msgstr "" + +#: ../js/ui/telepathyClient.js:1298 +msgid "Encryption error" +msgstr "" + +#: ../js/ui/telepathyClient.js:1300 +msgid "Certificate not provided" +msgstr "" + +#: ../js/ui/telepathyClient.js:1302 +msgid "Certificate untrusted" +msgstr "" + +#: ../js/ui/telepathyClient.js:1304 +msgid "Certificate expired" +msgstr "" + +#: ../js/ui/telepathyClient.js:1306 +msgid "Certificate not activated" +msgstr "" + +#: ../js/ui/telepathyClient.js:1308 +msgid "Certificate hostname mismatch" +msgstr "" + +#: ../js/ui/telepathyClient.js:1310 +msgid "Certificate fingerprint mismatch" +msgstr "" + +#: ../js/ui/telepathyClient.js:1312 +msgid "Certificate self-signed" +msgstr "" + +#: ../js/ui/telepathyClient.js:1314 +msgid "Status is set to offline" +msgstr "" + +#: ../js/ui/telepathyClient.js:1316 +msgid "Encryption is not available" +msgstr "" + +#: ../js/ui/telepathyClient.js:1318 +msgid "Certificate is invalid" +msgstr "" + +#: ../js/ui/telepathyClient.js:1320 +msgid "Connection has been refused" +msgstr "" + +#: ../js/ui/telepathyClient.js:1322 +msgid "Connection can't be established" +msgstr "" + +#: ../js/ui/telepathyClient.js:1324 +msgid "Connection has been lost" +msgstr "" + +#: ../js/ui/telepathyClient.js:1326 +msgid "This resource is already connected to the server" +msgstr "" + +#: ../js/ui/telepathyClient.js:1328 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "" + +#: ../js/ui/telepathyClient.js:1330 +msgid "The account already exists on the server" +msgstr "" + +#: ../js/ui/telepathyClient.js:1332 +msgid "Server is currently too busy to handle the connection" +msgstr "" + +#: ../js/ui/telepathyClient.js:1334 +msgid "Certificate has been revoked" +msgstr "" + +#: ../js/ui/telepathyClient.js:1336 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" + +#: ../js/ui/telepathyClient.js:1338 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/telepathyClient.js:1348 +#, c-format +msgid "Connection to %s failed" +msgstr "" + +#: ../js/ui/telepathyClient.js:1357 +msgid "Reconnect" +msgstr "" + +#: ../js/ui/telepathyClient.js:1358 +msgid "Edit account" +msgstr "" + +#: ../js/ui/telepathyClient.js:1404 +msgid "Unknown reason" +msgstr "" + +#: ../js/ui/userMenu.js:133 +msgid "Hidden" +msgstr "" + +#: ../js/ui/userMenu.js:139 +msgid "Idle" +msgstr "" + +#: ../js/ui/userMenu.js:142 +msgid "Unavailable" +msgstr "" + +#: ../js/ui/userMenu.js:579 ../js/ui/userMenu.js:583 ../js/ui/userMenu.js:653 +msgid "Power Off..." +msgstr "" + +#: ../js/ui/userMenu.js:615 +msgid "Notifications" +msgstr "දැණුම් දීම්" + +#: ../js/ui/userMenu.js:623 +msgid "Online Accounts" +msgstr "සබැඳි ගිණුම්" + +#: ../js/ui/userMenu.js:627 +msgid "System Settings" +msgstr "පද්ධති සැකසුම්" + +#: ../js/ui/userMenu.js:634 +msgid "Lock Screen" +msgstr "තිරය අඟුලු දමන්න" + +#: ../js/ui/userMenu.js:639 +msgid "Switch User" +msgstr "පරිශීලක සීරුමාරුව" + +#: ../js/ui/userMenu.js:644 +msgid "Log Out..." +msgstr "පිටවීම..." + +#: ../js/ui/userMenu.js:672 +msgid "Your chat status will be set to busy" +msgstr "" + +#: ../js/ui/userMenu.js:673 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/viewSelector.js:113 +msgid "Type to search..." +msgstr "" + +#: ../js/ui/viewSelector.js:131 ../src/shell-util.c:244 +msgid "Search" +msgstr "සෙවුම" + +#: ../js/ui/wanda.js:124 +#, c-format +msgid "" +"Sorry, no wisdom for you today:\n" +"%s" +msgstr "" + +#: ../js/ui/wanda.js:128 +#, c-format +msgid "%s the Oracle says" +msgstr "" + +#: ../js/ui/wanda.js:168 +msgid "Your favorite Easter Egg" +msgstr "" + +#: ../js/ui/windowAttentionHandler.js:33 +#, c-format +msgid "'%s' is ready" +msgstr "" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1100 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u ප්‍රථිදානය" +msgstr[1] "%u ප්‍රථිදාන" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1110 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ප්‍රදානය" +msgstr[1] "%u ප්‍රදාන" + +#: ../src/gvc/gvc-mixer-control.c:1408 +msgid "System Sounds" +msgstr "පද්ධති හඬ" + +#: ../src/main.c:262 +msgid "Print version" +msgstr "මුද්‍රණ වෙළුම" + +#: ../src/main.c:268 +msgid "Mode used by GDM for login screen" +msgstr "" + +#: ../src/shell-app.c:617 +#, c-format +msgid "Failed to launch '%s'" +msgstr "" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "එක්සත් රාජධානිය" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "පෙරනිමිය" + +#: ../src/shell-polkit-authentication-agent.c:332 +msgid "Authentication dialog was dismissed by the user" +msgstr "" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:89 +msgid "Home" +msgstr "නිවස" + +#. Translators: this is the same string as the one found in +#. * nautilus +#: ../src/shell-util.c:98 +msgid "File System" +msgstr "ගොනු පද්ධතිය" + +#. Translators: the first string is the name of a gvfs +#. * method, and the second string is a path. For +#. * example, "Trash: some-directory". It means that the +#. * directory called "some-directory" is in the trash. +#. +#: ../src/shell-util.c:294 +#, c-format +msgid "%1$s: %2$s" +msgstr "%1$s: %2$s" + diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..76bccec --- /dev/null +++ b/po/sk.po @@ -0,0 +1,2731 @@ +# Slovak translation for gnome-shell. +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Peter Mráz , 2011. +# Michal Štrba , 2011. +# Dušan Kazik , 2012, 2013, 2015. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-24 17:37+0000\n" +"PO-Revision-Date: 2019-04-01 17:08+0200\n" +"Last-Translator: Dušan Kazik \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-DamnedLies-Scope: partial\n" +"X-Generator: Poedit 2.2.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Systém" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Zobraziť zoznam s oznámeniami" + +# nazov klavesovej skratky +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Zamerať aktívne oznámenie" + +# nazov klavesovej skratky +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Zobraziť prehľad" + +# nazov klavesovej skratky +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Zobraziť všetky aplikácie" + +# nazov klavesovej skratky +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Otvoriť ponuku aplikácií" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Rozšírenia pre Shell" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Nastavenie rozšírení pre Shell prostredia GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Shell prostredia GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Správa okien a spúšťanie aplikácií" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Povoliť vnútorné nástroje užitočné pre vývojárov a testerov z dialógového " +"okna Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Umožňuje prístup k vnútorným ladiacim a sledovacím nástrojom pomocou " +"dialógového okna Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Vlastnosť UUID rozšírení určených na povolenie" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Rozšírenia pre Shell prostredia GNOME majú vlastnosť UUID; tento kľúč " +"obsahuje zoznam rozšírení, ktoré by mali byť načítané. Každé rozšírenie, " +"ktoré je potrebné načítať, musí byť v tomto zozname. Tento zoznam môžete " +"upraviť aj ručne pomocou metód DBus EnableExtension a DisableExtension v org." +"gnome.Shell." + +# summary +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Zakázať rozšírenia používateľa" + +# description +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Zakáže všetky rozšírenia povolené požívateľom bez vplyvu na nastavenie " +"„enabled-extension“." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Zakáže kontrolu kompatibility verzií rozšírení" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Shell prostredia GNOME načíta len rozšírenia, ktoré deklarujú podporu pre " +"práve spustenú verziu prostredia. Povolením tejto voľby zakážete túto " +"kontrolu a umožníte načítanie všetkých rozšírení bez ohľadu na to, pre ktorú " +"verziu prostredia deklarujú podporu." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Zoznam identifikátorov súborov plochy pre obľúbené aplikácie" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Aplikácie zodpovedajúce týmto identifikátorom budú zobrazené medzi " +"obľúbenými aplikáciami." + +# summary +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Zobrazenie výberu aplikácií" + +# desc +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Číslo aktuálne vybraného zobrazenia vo výbere aplikácií." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "História dialógového okna príkazov (Alt-F2)" + +# * https://live.gnome.org/GnomeShell/LookingGlass +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "História dialógového okna integrovaného odlaďovača" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Vždy zobraziť položku „Odhlásiť sa“ v ponuke používateľa." + +# description +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Tento kľúč preváži automatické skrývanie položky „Odhlásiť sa“ v situáciách " +"s jedným používateľom alebo jednou reláciou." + +# summary +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Určiť, či bude zapamätané heslo pre pripojenie zašifrovaných alebo " +"prenosných súborových systémov" + +# description +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Shell bude po pripojení zašifrovaného alebo prenosného súborového systému " +"požadovať heslo. Ak bude možné toto heslo uložiť pre neskoršie použitie, " +"zobrazí sa zaškrtávacie pole „Zapamätať heslo“. Tento kľúč nastaví " +"predvolený stav zaškrtávacieho poľa." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Či má predvolený Bluetooth adaptér nastaviť jemu priradené zariadenia" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Shell zobrazí položku Bluetooth v ponuke iba vtedy, ak je zapnutý adaptér " +"Bluetooth, alebo ak boli zariadenia nastavené a priradené predvolenému " +"adaptéru. Táto voľba bude vynulovaná, ak predvolený adaptér nemal nikdy " +"priradené zariadenia." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Klávesová skratka na otvorenie ponuky aplikácií" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Klávesová skratka na otvorenie ponuky aplikácií." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“ v prehľade " +"aktivít." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Klávesová skratka na otvorenie prehľadu" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Klávesová skratka na otvorenie prehľadu aktivít." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Klávesová skratka na prepnutie viditeľnosti zoznamu s oznámeniami" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Klávesová skratka na prepnutie viditeľnosti zoznamu s oznámeniami." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Klávesová skratka na zameranie aktívnych oznámení" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Klávesová skratka, s ktorou sa zamerá na aktívne oznámenia." + +# summary +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Klávesová skratka, ktorá pozastaví a znovu spustí všetky animácie(tween), " +"pre ladiace účely" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:150 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 1" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:154 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:158 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:162 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:166 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:170 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:174 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:178 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Zobrazí aplikácie" + +# tooltip +#: data/org.gnome.shell.gschema.xml.in:182 +#, fuzzy +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Zobrazí aplikácie" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Ktorú klávesnicu používať" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Typ klávesnice, ktorá sa má používať." + +# summary +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Obmedziť prepínač na aktuálny pracovný priestor." + +# desc +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ak je true, iba aplikácie, ktoré majú okná na aktuálnom pracovnom priestore " +"budú zobrazené v prepínači. Inak budú zahrnuté všetky aplikácie." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Režim ikonizácie aplikácií." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Konfiguruje, ako sa majú zobraziť okná v prepínači. Platné možnosti sú " +"„thumbnail-only“ (zobrazí miniatúru okna), „app-icon-only“ (zobrazí iba " +"ikonu aplikácie) alebo „both“ (zobrazí oboje)." + +# desc +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ak je true, iba okná z aktuálneho pracovného priestoru budú zobrazené v " +"prepínači. Inak budú zahrnuté všetky okná." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Pripojiť modálne dialógové okno k rodičovskému oknu" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Tento kľúč preváži kľúč v org.gnome.mutter po spustení Shellu prostredia " +"GNOME." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Povoliť natiahnutie k okraju pri pustení okien na okrajoch obrazovky" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Pracovné priestory sú spravované dynamicky" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Pracovné priestory sú iba na primárnom monitore" + +# summary +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Oneskoriť pohyb zamerania v režime myši, až kým sa ukazovateľ nezastaví" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Sieťové prihlásenie" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Technické podrobnosti" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Skopírovať chybu" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Domovská stránka" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Navštíviť domovskú stránku rozšírenia" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Žiadne nainštalované rozšírenia" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Prehliadať v aplikácii Softvér" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Zrušiť" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Ďalej" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Odomknúť" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Prihlásiť sa" + +# button +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Vybrať reláciu" + +# https://bugzilla.gnome.org/show_bug.cgi?id=659972 +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Nie ste v zozname?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(napr., používateľ alebo %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Používateľské meno: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Prihlasovacie okno" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Chyba pri overovaní totožnosti" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(alebo prejdite prstom)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Vypnúť" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "vypnúť;vypnutie;reštart;reštartovanie" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Uzamknúť obrazovku" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "uzamknúť;zámok;obrazovku;obrazovky" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Odhlásiť sa" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "odhlásiť;odhlásenie" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Uspať" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "uspať;režim;spánku" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Prepnúť používateľa" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "prepnúť;prepnutie;používateľa" + +# action button +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Uzamknúť orientáciu" + +# action button +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "uzamknúť;zámok;orientáciu;orientácie" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Príkaz nebol nájdený" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Nepodarilo sa analyzovať príkaz:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Spustenie „%s“ zlyhalo:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Práve teraz" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Pred %d minútou" +msgstr[1] "Pred %d minútami" +msgstr[2] "Pred %d minútami" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Pred %d dňom" +msgstr[1] "Pred %d dňami" +msgstr[2] "Pred %d dňami" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Včera" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pred %d dňom" +msgstr[1] "Pred %d dňami" +msgstr[2] "Pred %d dňami" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pred %d týždňom" +msgstr[1] "Pred %d týždňami" +msgstr[2] "Pred %d týždňami" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Pred %d mesiacom" +msgstr[1] "Pred %d mesiacmi" +msgstr[2] "Pred %d mesiacmi" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Pred %d rokom" +msgstr[1] "Pred %d rokmi" +msgstr[2] "Pred %d rokmi" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Včera o %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, fuzzy, no-c-format +#| msgid "%B %d, %H∶%M" +msgid "%B %-d, %H∶%M" +msgstr "%d. %B, %H:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, fuzzy, no-c-format +#| msgid "%B %d %Y, %H∶%M" +msgid "%B %-d %Y, %H∶%M" +msgstr "%d. %B %Y, %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l:%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Včera, %l:%M %p" + +# DK: je tento format casu spravne? neviem zistit co ktore premenne znamenaju. +# ma sa v preklade zmenit "%e" na "%d" ? +# v ostatnych retazcoch je pouzite %e, tak to bude asi OK +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l:%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, fuzzy, no-c-format +#| msgid "%B %d, %l∶%M %p" +msgid "%B %-d, %l∶%M %p" +msgstr "%d. %B, %l:%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, fuzzy, no-c-format +#| msgid "%B %d %Y, %l∶%M %p" +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%d. %B %Y, %l:%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Prihlásenie do aktívneho bodu" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Vaše pripojenie s prihlásením k tomuto aktívnemu bodu nie je bezpečné. Heslá " +"alebo iné informácie, ktoré ste zadali na tejto stránke môžu byť zobrazené " +"ľuďmi vo vašom okolí." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Odmietnuť prístup" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Udeliť prístup" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Tu sa objavia často používané aplikácie" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Často používané" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Všetky" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Nové okno" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Spustiť pomocou prídavnej grafickej karty" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Odstrániť z obľúbených" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Pridať do obľúbených" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Zobraziť podrobnosti" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Aplikácia %s bola pridaná medzi obľúbené." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Aplikácia %s bola odstránená z obľúbených." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Výber audio zariadenia" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Nastavenia zvuku" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Slúchadlá" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Náhlavná súprava" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofón" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Zmeniť pozadie…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Nastavenia displeja" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Nastavenia" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +# MČ: nemali by tu byť tiež jednopísmenové? Občas som videl v kolendároch aj také použiť a ďalej sú dvojpísmenové. +# PK: v grid to skratene bude, inac v liste to moze byt 2 pismenove, kedze aj v +# originale dali Su +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "N" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "U" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "Š" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Predchádzajúci mesiac" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Nasledujúci mesiac" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "%V. týždeň" + +#. 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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Celý deň" + +#: js/ui/calendar.js:819 +#, fuzzy +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %e. %B" + +#: js/ui/calendar.js:823 +#, fuzzy +#| msgctxt "calendar heading" +#| msgid "%A, %B %d, %Y" +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %e. %B %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Žiadne oznámenia" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Žiadne udalosti" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Vymazať" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "Aplikácia „%s“ neodpovedá." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Môžete chvíľu počkať na pokračovanie aplikácie, alebo vynútiť úplné " +"ukončenie aplikácie." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Vynútiť ukončenie" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Počkať" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Externá jednotka bola pripojená" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Externá jednotka bola odpojená" + +# DK: doplnil som slovo "programu", aby to znelo prirodzenejsie. priklad:po pripojeni USB kluca bolo zobrazene "Otvoriť pomocou Súbory" +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Otvoriť pomocou aplikácie %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Heslo:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Zadajte znovu:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Pripojiť" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Heslo: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Kľúč: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Heslo k súkromnému kľúču: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Identita: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Služba: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Bezdrôtová sieť vyžaduje overenie totožnosti" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Na prístup do bezdrôtovej siete „%s“ sú vyžadované heslá alebo šifrovacie " +"kľúče." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Overenie totožnosti k drôtovej sieti 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Názov siete: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Overenie totožnosti k DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Požaduje sa kód PIN" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Pre zariadenie mobilnej širokopásmovej siete je potrebný kód PIN" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Heslo k mobilnej širokopásmovej sieti" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Na pripojenie k „%s“ sa požaduje heslo." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Správca siete" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Požaduje sa overenie totožnosti" + +# PŠ: ináč toto je riadna hlúposť, keďže sa pýta heslo používateľa "root" +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Správca" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Overiť totožnosť" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Kontakt %s odteraz vystupuje ako %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Okná" + +# tooltip +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Zobrazí aplikácie" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Dok" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +#, fuzzy +#| msgid "%B %e %Y" +msgid "%B %-d %Y" +msgstr "%-e. %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %-e. %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Pridať svetové časy…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Svetové časy" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Počasie" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Vyberte umiestnenie…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Načítava sa…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Aby sa mohli zobraziť informácie o počasí, musíte sa pripojiť" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Informácie o počasí nie sú momentálne dostupné" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Odhlásenie používateľa %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Odhlásenie" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Používateľ %s bude automaticky odhlásený o %d sekundu." +msgstr[1] "Používateľ %s bude automaticky odhlásený o %d sekundy." +msgstr[2] "Používateľ %s bude automaticky odhlásený o %d sekúnd." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Budete automaticky odhlásený o %d sekundu." +msgstr[1] "Budete automaticky odhlásený o %d sekundy." +msgstr[2] "Budete automaticky odhlásený o %d sekúnd." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Odhlásiť sa" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Vypnutie" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Inštalácia aktualizácií a vypnutie" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Systém sa automaticky vypne o %d sekundu." +msgstr[1] "Systém sa automaticky vypne o %d sekundy." +msgstr[2] "Systém sa automaticky vypne o %d sekúnd." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Nainštalovať čakajúce aktualizácie softvéru" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Reštartovať" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Vypnúť" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Reštart" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Systém sa automaticky reštartuje o %d sekundu." +msgstr[1] "Systém sa automaticky reštartuje o %d sekundy." +msgstr[2] "Systém sa automaticky reštartuje o %d sekúnd." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Reštart a inštalácia aktualizácií" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekundu." +msgstr[1] "" +"Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekundy." +msgstr[2] "" +"Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekúnd." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Reštartovať a inštalovať" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Nainštalovať a vypnúť" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Vypnúť po inštalácii aktualizácií" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Reštart a inštalácia inovácie" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"Operačný systém %s %s bude nainštalovaný po reštarte. Inštalácia inovácie " +"môže trvať dlhšiu dobu: uistite sa, že máte vytvorenú zálohu, a že počítač " +"je pripojený k zdroju napájania." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Systém je napájaný z batérie. Pred inštaláciou aktualizácií pripojte " +"napájací zdroj." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Niektoré aplikácie sú zaneprázdnené, alebo obsahujú neuloženú prácu." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Sú prihlásení iní používatelia." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (vzdialená relácia)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konzola)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Inštalovať" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Prevziať a nainštalovať rozšírenie „%s“ z extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "Aplikácia %s chce potlačiť skratky" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "Aplikácia chce potlačiť skratky" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Skratky môžete obnoviť stlačením %s." + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "Odmietnuť" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "Povoliť" + +# z gnome control center +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Pomalé klávesy zapnuté" + +# z gnome control center +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Pomalé klávesy vypnuté" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Práve ste podržali stlačenú klávesu Shift po dobu 8 sekúnd. Je to skratka " +"funkcie Pomalé klávesy, ktorá mení spôsob fungovania vašej klávesnice." + +# z gnome control center +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Lepkavé klávesy zapnuté" + +# z gnome control center +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Lepkavé klávesy vypnuté" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Práve ste stlačili klávesu Shift 5krát za sebou. je to skratka funkcie " +"Lepkavé klávesy, ktorá mení spôsob fungovania vašej klávesnice." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Práve ste stlačili dve klávesy naraz, alebo ste stlačili klávesu Shift 5krát " +"za sebou. Tým sa vypne funkcia Lepkavé klávesy, ktorá mení spôsob fungovania " +"vašej klávesnice." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Ponechať zapnuté" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Zapnúť" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Vypnúť" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Ponechať vypnuté" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "Nastavenia oblasti a jazyka" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Žiadne nainštalované rozšírenia" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nevyslal žiadnu chybu." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Skryť chyby" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Zobraziť chyby" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Povolené" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Zakázané" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Chyba" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Neaktuálne" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Sťahuje sa" + +# PK: ide tu o zdrojovy kod? +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Zobraziť zdroj" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Webová stránka" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "Informácie o systéme" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Neznámy interpret" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Neznámy názov" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Hlasitosť" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Vrátiť" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Prehľad" + +# hint_text +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Zadajte text na vyhľadanie…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Nová skratka…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Definované aplikáciou" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Zobraziť pomocníka na obrazovke" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Prepnúť monitor" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Priradiť klávesu" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Dokončiť" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Upraviť…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Žiadne" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Stlačte kláves na spustenie konfigurácie" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Stlačte kláves Esc na skončenie" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Stlačte akýkoľvek kláves na skončenie" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Ukončiť" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Aktivity" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Systém" + +#: js/ui/panel.js:867 +msgid "Top Bar" +msgstr "Horná lišta" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Zadajte príkaz" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Zavrieť" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Reštart nie je dostupný s protokolom Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Reštartuje sa…" + +# DK: je tento format casu spravne? neviem zistit co ktore premenne znamenaju. +# ma sa v preklade zmenit "%e" na "%d" ? +# v ostatnych retazcoch je pouzite %e, tak to bude asi OK +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %e. %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nová správa" +msgstr[1] "%d nové správy" +msgstr[2] "%d nových správ" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d nové oznámenie" +msgstr[1] "%d nové oznámenia" +msgstr[2] "%d nových oznámení" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:271 +msgid "Lock" +msgstr "Uzamknúť" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "Prostredie GNOME vyžaduje uzamknutie obrazovky" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "Nepodarilo sa uzamknúť obrazovku" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "Uzamknutie bolo zablokované aplikáciou" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Hľadá sa…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Žiadne výsledky." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d ďalší" +msgstr[1] "%d ďalšie" +msgstr[2] "%d ďalších" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopírovať" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Prilepiť" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Zobraziť text" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Skryť text" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Heslo" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Zapamätať heslo" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Zjednodušenie ovládania" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Lupa" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Čítačka obrazovky" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Klávesnica na obrazovke" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Vizuálne varovania" + +# z gnome control center +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Lepkavé klávesy" + +# z gnome control center +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Pomalé klávesy" + +# z gnome control center +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Poskakujúce klávesy" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Myš klávesmi" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Vysoký kontrast" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Veľký text" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Nastavenia Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d pripojené" +msgstr[1] "%d pripojené" +msgstr[2] "%d pripojených" + +# DK: pripojenie, zariadenie +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Vypnuté" + +# režim v lietadle +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Zapnutý" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Jas" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Klávesnica" + +# menu item +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Zobraziť rozloženie klávesnice" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Poloha povolená" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Zakázať" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Nastavenia súkromia" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Poloha sa používa" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Poloha zakázaná" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Povoliť" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Udeliť aplikácii %s prístup k vášmu umiestneniu?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Prístup k umiestneniu sa dá zmeniť kedykoľvek v nastaveniach súkromia." + +# zariadenie +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s vypnuté" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s pripojené" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s nespravované" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "Odpája sa %s" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "Pripája sa %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:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s vyžaduje overenie totožnosti" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Chýba firmvér pre %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nedostupné" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Pripojenie %s zlyhalo" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Nastavenia drôtovej siete" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Nastavenia mobilnej širokopásmovej siete" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Hardvér %s zakázaný" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s zakázané" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Pripojiť k internetu" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Režim v lietadle je zapnutý" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Sieť Wi-Fi je zakázaná, keď je zapnutý režim v lietadle." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Vypnúť režim v lietadle" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Sieť Wi-Fi je vypnutá" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Na pripojenie k sieti je potrebné zapnúť sieť Wi-Fi." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Zapnúť Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Siete Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Vyberte sieť" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Žiadne siete" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Na vypnutie použite hardvérový prepínač" + +# item menu +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Vybrať sieť" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Nastavenia siete Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Aktívny bod %s je aktivovaný" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nepripojené" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "pripája sa…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "požaduje sa overenie totožnosti" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "pripojenie zlyhalo" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "Nastavenia VPN" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "Pripojenie VPN vypnuté" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Nastavenia siete" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s drôtové pripojenie" +msgstr[1] "%s drôtové pripojenia" +msgstr[2] "%s drôtových pripojení" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s pripojenie k sieti Wi-Fi" +msgstr[1] "%s pripojenia k sieti Wi-Fi" +msgstr[2] "%s pripojení k sieti Wi-Fi" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s pripojenie modemom" +msgstr[1] "%s pripojenia modemom" +msgstr[2] "%s pripojení modemom" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "Pripojenie zlyhalo" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "Aktivácia pripojenia k sieti zlyhala" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Nočné svetlo zakázané" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Nočné svetlo zapnuté" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Pokračovať" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Zakázať do zajtra" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Nastavenia napájania" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Plne nabité" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Nenabíja sa" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Odhaduje sa…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d:%02d Zostáva (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d:%02d Do plného nabitia (%d%%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Prebieha zdieľanie obrazovky" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Vypnúť" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Režim v lietadle zapnutý" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Prepnúť používateľa" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Odhlásiť sa" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Nastavenia účtu" + +# action button +#: js/ui/status/system.js:256 +msgid "Orientation Lock" +msgstr "Uzamknutie orientácie" + +#: js/ui/status/system.js:282 +msgid "Suspend" +msgstr "Uspať" + +#: js/ui/status/system.js:292 +msgid "Power Off" +msgstr "Vypnúť" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Neznáme zariadenie Thunderbolt" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Počas vašej neprítomnosti bolo zistené nové zariadenie. Prosím, odpojte a " +"znovu pripojte zariadenie, aby ste ho mohli začať používať." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Zariadenie Thunderbolt s neoverenou totožnosťou" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Bolo zistené nové zariadenie a vyžaduje overenie totožnosti od správcu." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Chyba pri overovaní totožnosti zariadenia Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Nepodarilo sa overiť totožnosť zariadenia Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Hlasitosť bola zmenená" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Zrkadliť" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Zlúčiť displeje" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Iba externý" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Iba vstavaný" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Prihlásiť ako iný používateľ" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Odomykacie okno" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Aplikácie" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Hľadať" + +# %s je totiž titulok okna +# informacna bublina +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "Aplikácia „%s“ je pripravená" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Chcete ponechať tieto nastavenia displeja?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Vrátiť nastavenia" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Uchovať zmeny" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Zmeny nastavení budú vrátené za %d sekundu" +msgstr[1] "Zmeny nastavení budú vrátené za %d sekundy" +msgstr[2] "Zmeny nastavení budú vrátené za %d sekúnd" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Minimalizovať" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Zrušiť maximalizáciu" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Maximalizovať" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Presunúť" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Zmeniť veľkosť" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Presunúť titulok okna na obrazovku" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Vždy navrchu" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Vždy vo viditeľnom pracovnom priestore" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Presunúť do ľavého pracovného priestoru" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Presunúť do pravého pracovného priestoru" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Presunúť do vyššieho pracovného priestoru" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Presunúť do nižšieho pracovného priestoru" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Presunúť na monitor vyššie" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Presunúť na monitor nižšie" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Presunúť na monitor vľavo" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Presunúť na monitor vpravo" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Kalendár Evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Verzia pre tlač" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Režim používaný správcom GDM pre prihlasovaciu obrazovku" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Použitie zvláštneho režimu, napr. „gdm“ pre prihlasovaciu obrazovku" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Zoznam možných režimov" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "Neznámy" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Zlyhalo spustenie „%s“" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Heslá sa nezhodujú." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Heslo nemôže byť prázdne" + +# rovnaký reťazec ako v PolicyKit-gnome +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u výstup" +msgstr[1] "%u výstupy" +msgstr[2] "%u výstupov" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u vstup" +msgstr[1] "%u vstupy" +msgstr[2] "%u vstupov" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Systémové zvuky" + +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Vyskytla sa chyba pri načítavaní dialógového okna nastavení pre %s:" + +#~ msgid "%s all day." +#~ msgstr "%s celý deň." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, potom bude %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, potom bude %s a následne neskôr bude %s." + +#~ msgid "Feels like %s." +#~ msgstr "Pocitová teplota %s." + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Vypnúť" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Odhlásiť sa" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Prepnúť používateľa" + +#~ msgid "Hide tray" +#~ msgstr "Skryť lištu" + +#~ msgid "Status Icons" +#~ msgstr "Stavová ikona" + +#~ msgid "Events" +#~ msgstr "Udalosti" + +#~ msgid "Notifications" +#~ msgstr "Oznámenia" + +#~ msgid "Clear section" +#~ msgstr "Vymazať úsek" + +#~ msgid "Media" +#~ msgstr "Médiá" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Nastavenia rozšírení pre Shell prostredia GNOME" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +# PM: Nie som si istý +# TRANSLATORS: this is the title of the wifi captive portal login +# window, until we know the title of the actual login page +#~ msgid "Web Authentication Redirect" +#~ msgstr "Presmerovanie webového overenia totožnosti" + +#~ msgid "Not In Use" +#~ msgstr "Nepoužíva sa" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Zobraziť čísla týždňov v kalendári" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "" +#~ "Ak je true, zobrazí v kalendári poradie dní v týždni podľa štandardu ISO." + +#~ msgid "Use as Internet connection" +#~ msgstr "Použiť na pripojenie k internetu" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "Aplikácia %s požaduje prístup k vášmu umiestneniu." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Shell prostredia GNOME (kompozitor pre wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d pripojené zariadenie" +#~ msgstr[1] "%d pripojené zariadenia" +#~ msgstr[2] "%d pripojených zariadení" + +#~ msgid "Authentication required" +#~ msgstr "Požaduje sa overenie totožnosti" + +#~ msgid "UPS" +#~ msgstr "Záložný zdroj UPS" + +#~ msgid "Battery" +#~ msgstr "Batéria" + +#~ msgid "Airplane Mode" +#~ msgstr "Režim v lietadle" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Pozvánka" + +#~ msgid "Call" +#~ msgstr "Hovor" + +#~ msgid "File Transfer" +#~ msgstr "Prenos súborov" + +#~ msgid "Chat" +#~ msgstr "Rozhovor" + +#~ msgid "Invitation to %s" +#~ msgstr "Pozvánka do %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "Kontakt %s vás pozýva aby ste sa pridali do %s" + +#~ msgid "Decline" +#~ msgstr "Odmietnuť" + +#~ msgid "Accept" +#~ msgstr "Prijať" + +#~ msgid "Video call from %s" +#~ msgstr "Videohovor od kontaktu %s" + +#~ msgid "Call from %s" +#~ msgstr "Hovor od kontaktu %s" + +#~ msgid "Answer" +#~ msgstr "Prijať hovor" + +#~ msgid "%s is sending you %s" +#~ msgstr "Kontakt %s vám posiela %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "Kontakt %s by chcel získať oprávnenie vidieť, kedy ste pripojený" + +#~ msgid "Authentication failed" +#~ msgstr "Overenie totožnosti zlyhalo" + +#~ msgid "Encryption error" +#~ msgstr "Chyba šifrovania" + +#~ msgid "Certificate not provided" +#~ msgstr "Neposkytnutý certifikát" + +#~ msgid "Certificate untrusted" +#~ msgstr "Nedôveryhodný certifikát" + +#~ msgid "Certificate expired" +#~ msgstr "Certifikát s ukončenou platnosťou" + +#~ msgid "Certificate not activated" +#~ msgstr "Neaktivovaný certifikát" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Certifikát s nesúhlasným názvom hostiteľa" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Certifikát s nesúhlasným odtlačkom" + +#~ msgid "Certificate self-signed" +#~ msgstr "Sebou podpísaný certifikát" + +#~ msgid "Status is set to offline" +#~ msgstr "Stav je nastavený na odhlásený" + +#~ msgid "Certificate is invalid" +#~ msgstr "Certifikát je neplatný" + +#~ msgid "Connection has been refused" +#~ msgstr "Pripojenie bolo odmietnuté" + +#~ msgid "Connection can't be established" +#~ msgstr "Nedá sa nadviazať spojenie" + +#~ msgid "Connection has been lost" +#~ msgstr "Spojenie sa stratilo" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Tento účet je už pripojený k serveru" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj" + +#~ msgid "The account already exists on the server" +#~ msgstr "Účet na serveri už existuje" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Server je momentálne príliš zaneprázdnený na zvládnutie pripojenia" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Certifikát bol zrušený" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je " +#~ "kryptograficky slabý" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera " +#~ "presahuje limit stanovený kryptografickou knižnicou." + +#~ msgid "Internal error" +#~ msgstr "Vnútorná chyba" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Nepodarilo sa pripojiť účet %s" + +#~ msgid "View account" +#~ msgstr "Zobraziť účet" + +# nazov klavesovej skratky +#~ msgid "Show the message list" +#~ msgstr "Zobraziť zoznam správ" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Ne" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Po" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Ut" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "St" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Št" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Pi" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "So" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Žiadne naplánované udalosti" + +#~ msgid "Today" +#~ msgstr "Dnes" + +#~ msgid "Tomorrow" +#~ msgstr "Zajtra" + +#~ msgid "This week" +#~ msgstr "Tento týždeň" + +#~ msgid "Next week" +#~ msgstr "Ďalší týždeň" + +#~ msgid "Removable Devices" +#~ msgstr "Vymeniteľné zariadenia" + +#~ msgid "Eject" +#~ msgstr "Vysunúť" + +#~ msgid "Unmute" +#~ msgstr "Obnoviť zvuk" + +#~ msgid "Mute" +#~ msgstr "Stlmiť" + +#~ msgid "Open Calendar" +#~ msgstr "Otvoriť kalendár" + +#~ msgid "Open" +#~ msgstr "Otvoriť" + +#~ msgid "Remove" +#~ msgstr "Odstrániť" + +#~ msgid "Clear Messages" +#~ msgstr "Vymazať správy" + +#~ msgid "Notification Settings" +#~ msgstr "Nastavenia oznámení" + +# MČ" zd sa mi to čudné. tuším som videl preklady „oznamovacia oblasť“, čo mi viac sedí. Toto je trošku akoby zavádzajúce, ale možno to s okolím ozrejmuje výsledok. Možno by som tam ponechal len „ponuka“ ak akolie jednoznačne naznačuje, že ide o „lištu správ“ +#~ msgid "Tray Menu" +#~ msgstr "Ponuka v lište" + +#~ msgid "No Messages" +#~ msgstr "Žiadne správy" + +# DK: zvazoval som pouzit "Panel správ" +# neviem co bude vhodnejsie ako preklad "tray" +#~ msgid "Message Tray" +#~ msgstr "Lišta správ" + +#~ msgid "Captive Portal" +#~ msgstr "Prihlasovací portál" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Maximálna úroveň presnosti určenia polohy." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Konfiguruje maximálnu úroveň presnosti určenia polohy, ktorú aplikácie " +#~ "môžu získať. Povolené sú voľby 'off' (zakáže sledovanie polohy), " +#~ "'country' (krajina), 'city' (mesto), 'neighborhood' (okolie), " +#~ "'street' (ulica), 'exact' (presne, pri čom je štandardne požadované " +#~ "použitie prijímača GPS). Uvedomte si, že toto nastavenie ovplyvňuje " +#~ "povolenia GeoClue a aplikácie môžu tiež získať údaje o polohe použitím " +#~ "sieťových prostriedkov (aj keď prinajlepšom s presnosťou na ulicu)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Usporiadanie tlačidiel na titulku okna" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Tento kľúč preváži kľúč v org.gnome.desktop.wm.preferences po spustení " +#~ "Shellu prostredia GNOME." + +#~ msgid "Extension" +#~ msgstr "Rozšírenie" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Použitím ponuky vyberte rozšírenie na nastavenie" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..a110676 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,3218 @@ +# Slovenian translations for gnome-shell. +# Copyright (C) 2006 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# +# Matej Urbančič , 2009–2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-09 18:57+0000\n" +"PO-Revision-Date: 2019-02-09 20:28+0100\n" +"Last-Translator: Matej Urbančič \n" +"Language-Team: Slovenian GNOME Translation Team \n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" +"%100==4 ? 3 : 0);\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 2.1.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistem" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Pokaži seznam obvestil" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Prikaz dejavnega obvestila" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Pokaži pregled" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Pokaži vse programe" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Odpri meni programov" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Razširitve lupine" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Nastavitve razširitev lupine GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Lupina GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Upravljanje oken in zaganjanje programov" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Omogoči dostop do orodij razvijalcev in preizkuševalcev programske opreme " +"prek vnosnega polja Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Dovoli dostop do razhroščevanja in drugih orodij nadzora prek vnosnega polja " +"Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Določila razširitev UUID, ki bodo omogočene" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Razširitve lupine GNOME imajo nastavljeno določilo UUID; ključ določa seznam " +"razširitev, ki naj bodo naložene ob zagonu. Upravljanje seznama je mogoče " +"tudi prek vodila D-BUs na org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Onemogoči uporabniške razširitve" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Onemogoči vse razširitve, ki jih je uporabnik omogoči brez vpliva na " +"nastavitev »omogočena razširitev«" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Onemogoči overjanje skladnosti različice razširitve" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Lupina GNOME naloži le razširitve, ki so skladne z nameščeno različico. " +"Izbrana možnost onemogoči preverjanje, zato so lahko naložene tudi " +"razširitve, katerih skladnost ni potrjena." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Seznam določil ID namiznih datotek priljubljenih programov" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programi, ki ustrezajo določilom, bodo prikazani v polju priljubljenih " +"programov" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Pogled izbirnika programov" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Kazalo trenutno izbranega pogleda v izbirniku programa." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Zgodovina pogovornega okna ukazov (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Zgodovina za pogovorno okno povečevala" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Vedno pokaži možnost »Odjave« v uporabniškem meniju." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Izbira prepiše možnost samodejnega skrivanja gumba za »Odjavo« na sistemskem " +"meniju pri eno-uporabniškem in eno-sejnem zagonu." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Ali naj se geslo za priklapljanje šifriranih in oddaljenih datotečnih " +"sistemov shrani" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Za priklop oddaljenega datotečnega sistema ali šifrirane naprave bo po " +"izbiri podana zahteva za vnos gesla. Na pogovornem oknu bo prikazana tudi " +"možnost »Shrani geslo«. Ta možnost določa privzeto stanje izbirnega polja." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Ali ima privzeti prilagodilnik Bluetooth nastavljeno pripeto napravo" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Meni Bluetooth bo prikazan le, če je prilagodilnik pripet oziroma, če so " +"priklopljene naprave pripravljene za delo. Možnost bo ponastavljena, če " +"naprava nima dejavnih povezav." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Omogoči API nadzora" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "Omogoči API sistema D-Bus, ki mogoča nadzor stanja programa lupine." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Tipkovna bližnjica, ki odpre meni programov" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Tipkovna bližnjica, ki odpre meni programov." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Tipkovna bližnjica, ki odpre pogled »Pokaži programe«" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Tipkovna bližnjica, ki odpre pogled »Pokaži programe« v pregledu dejavnosti." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Tipkovna bližnjica, ki odpre pogled pregleda" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Tipkovna bližnjica, ki odpre pogled pregleda dejavnosti." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Tipkovna bližnjica za preklop vidnosti seznama obvestil" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Tipkovna bližnjica za preklop vidnosti seznama obvestil." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Tipkovna bližnjica, ki omogoča ustavljanje in ponovni zagon vseh zagnanih " +"programov za razhroščevanje." + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Preklopi na program 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Preklopi na program 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Preklopi na program 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Preklopi na program 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Preklopi na program 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Preklopi na program 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Preklopi na program 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Preklopi na program 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Preklopi na program 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Katera tipkovnica naj bo uporabljena" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Vrsta tipkovnice za uporabo." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Omeji preklopnik na trenutno delovno površino." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Izbrana možnost določa, da bodo v trenutnem pogledu prikazana le okna, ki so " +"v izbrani delovni površini v preklopniku. V nasprotnem primeru so prikazana " +"vsa okna." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Ikonski način programa." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Določa, kako naj bodo prikazana okna v preklopniku. Veljavne možnosti so »le " +"sličice»« (pokaže le sličice oken), »le ikona« (pokaže ikono programa) in pa " +"možnost »oboje«." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Izbrana možnost določa, da bodo v trenutnem pogledu prikazana le okna v " +"preklopniku. V nasprotnem primeru so prikazana vsa okna." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Pripni modalno pogovorno okno na glavno okno" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ključ prepiše vrednost v org.gnome.mutter med zaganjanjem lupine GNOME." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Omogoči utripanje črte med spuščanjem okna na robove zaslona" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Delovne površine se obravnavajo dinamično" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Delovne površine so le na osnovnem zaslonu" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Zamik žarišča se v načinu miške spreminja, dokler se kazalnik ne neha " +"premikati" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Omrežna prijava" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Prišlo je do nepričakovane napake." + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Prišlo je do napake: nastavitev za to razširitev ni mogoče prikazati. " +"Priporočljivo je poslati poročilo o hrošču razvijalcem programa." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Tehnične podrobnosti" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Kopiraj napako" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Spletna stran" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Odpri spletno stran razširitev" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Ni nameščenih razširitev" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Razširitve je mogoče namestiti s programom za nameščanje, ali pa neposredno " +"s spletne strani extensions.gnome." +"org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Prebrskajte programsko opremo" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Prekliči" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Naslednji" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Odkleni" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Prijava" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Izbor seje" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Ali uporabniškega imena ni na seznamu?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(na primer, uporabnika ali %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Uporabniško ime: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Prijavno okno" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Napaka overitve" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(ali pa povlecite prst)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Izklopi" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "izklop;ugasni;ponovni zagon;reboot" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Zakleni zaslon" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "zaklep zaslona" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Odjava" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "odjava;izpis" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "V pripravljenost" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "v pripravljenost;v mirovanje" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Preklop uporabnika" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "preklop uporabnika" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Zaklep usmerjenosti" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "zaklep usmerjenosti;zaslon;rotacija;obrat;obračanje" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Ukaz ni mogoče najti" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Ukaza ni mogoče razčleniti:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Izvedba »%s« je spodletela:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Ravnokar" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Pred %d minutami" +msgstr[1] "Pred %d minuto" +msgstr[2] "Pred %d minutama" +msgstr[3] "Pred %d minutami" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Pred %d urami" +msgstr[1] "Pred %d uro" +msgstr[2] "Pred %d urama" +msgstr[3] "Pred %d urami" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Včeraj" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pred %d dnevi" +msgstr[1] "Pred %d dnevom" +msgstr[2] "Pred %d dnevoma" +msgstr[3] "Pred %d dnevi" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pred %d tedni" +msgstr[1] "Pred %d tednom" +msgstr[2] "Pred %d tednoma" +msgstr[3] "Pred %d tedni" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Pred %d meseci" +msgstr[1] "Pred %d mesecem" +msgstr[2] "Pred %d mesecema" +msgstr[3] "Pred %d meseci" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Pred %d leti" +msgstr[1] "Pred %d letom" +msgstr[2] "Pred %d letoma" +msgstr[3] "Pred %d leti" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Včeraj, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%d. %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Včeraj, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%d. %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%d. %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Prijava prek vroče točke" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Povezava prek vroče točke ni varna. Gesla in druge podrobnosti, ki bodo " +"vpisane na spletne strani, bodo lahko vidne tretjim osebam." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Zavrni dostop" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Dovoli dostop" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Pogosto uporabljeni programi bodo prikazani tu" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Pogosti" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Vsi" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Novo okno" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Zaženi z uporabo določene grafične kartice" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Odstrani iz priljubljenih" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Dodaj med priljubljene" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Pokaži besedilo" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Program »%s« je dodan med priljubljeno." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "Program »%s« je odstranjen iz priljubljenih." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Izbor zvokovne naprave" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Nastavitve zvoka" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Slušalke" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Slušalka" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Spremeni ozadje …" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Nastavitve zaslona" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Nastavitve" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "N" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "Č" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "Predhodni mesec" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "Naslednji mesec" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +msgid "Week %V" +msgstr "Teden %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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "Celodnevno" + +#: js/ui/calendar.js:829 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %d. %B" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %d %B %Y" + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "Ni obvestil" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "Ni dogodkov" + +#: js/ui/calendar.js:1085 +msgid "Clear" +msgstr "Počisti" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "Program »%s« se ne odziva." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Lahko počakate, če se program morda začne spet odzivati, lahko pa vsilite " +"končanje delovanja." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Vsili končanje" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Počakaj" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Zunanji pogon je priklopljen" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Zunanji pogon je odklopljen" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Odpri s programom %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Geslo:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Ponovni vpis:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "Vzpostavitev povezave je mogoča tudi z gumbom »WPS« na usmerjevalniku." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Poveži" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Geslo: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Ključ: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Geslo zasebnega ključa: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "_Istovetnost: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Storitev: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Zahtevana overitev za brezžično omrežje" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Za povezavo v brezžično omrežje »%s« je zahtevano geslo oziroma šifrirni " +"ključ." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Žična overitev 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Naziv omrežja: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Overitev DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Zahtevana koda PIN" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Za napravo mobilnega širokopasovnega dostopa je zahtevana koda PIN." + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "Koda PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Geslo mobilnega širokopasovnega dostopa" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Za povezavo z omrežjem »%s« je zahtevano geslo." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Upravljalnik omrežij" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Zahtevana je overitev" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Skrbnik" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Overi" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Overitev je spodletela.. Poskusite znova." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s je sedaj znan kot v %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Okna" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Pokaži programe" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Pregledna plošča" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%d. %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Dodaj svetovni čas …" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Svetovni časi" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Vreme" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Izbor mesta …" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Poteka nalaganje …" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Preglej splet za podrobnosti o vremenu." + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Podatki o vremenu trenutno niso na voljo." + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Odjava %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Odjava" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Uporabnik %s bo samodejno odjavljen čez %d sekund." +msgstr[1] "Uporabnik %s bo samodejno odjavljen čez %d sekundo." +msgstr[2] "Uporabnik %s bo samodejno odjavljen čez %d sekundi." +msgstr[3] "Uporabnik %s bo samodejno odjavljen čez %d sekunde." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Uporabnik bo samodejno odjavljen čez %d sekund." +msgstr[1] "Uporabnik bo samodejno odjavljen čez %d sekundo." +msgstr[2] "Uporabnik bo samodejno odjavljen čez %d sekundi." +msgstr[3] "Uporabnik bo samodejno odjavljen čez %d sekunde." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Odjava" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Izklop" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Namesti posodobitve in ugasni računalnik" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistem se bo samodejno izklopil čez %d sekund." +msgstr[1] "Sistem se bo samodejno izklopil čez %d sekundo." +msgstr[2] "Sistem se bo samodejno izklopil čez %d sekundi." +msgstr[3] "Sistem se bo samodejno izklopil čez %d sekunde." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Namesti pripravljene posodobitve programov" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Ponoven zagon" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Izklop" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Ponoven zagon" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistem se bo samodejno ponovno zagnal čez %d sekund." +msgstr[1] "Sistem se bo samodejno ponovno zagnal čez %d sekundo." +msgstr[2] "Sistem se bo samodejno ponovno zagnal čez %d sekundi." +msgstr[3] "Sistem se bo samodejno ponovno zagnal čez %d sekunde." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Namesti posodobitve in ponovno zaženi" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sistem bo samodejno namestil pakete in se nato ponovno zagnal čez %d sekund." +msgstr[1] "" +"Sistem bo samodejno namestil pakete in se nato ponovno zagnal %d sekundo." +msgstr[2] "" +"Sistem bo samodejno namestil pakete in se nato ponovno zagnal %d sekundi." +msgstr[3] "" +"Sistem bo samodejno namestil pakete in se nato ponovno zagnal %d sekunde." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Ponovno zaženi in namesti" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Namesti in ugasni računalnik" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Izklopi napravo po uspešnem nameščanju posodobitev" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Ponovno zaženi in namesti posodobitev" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"Po ponovnem zagonu bo nameščen paket %s %s. Posodobitev namestitve je lahko " +"dolgotrajna; preverite, ali je narejena varnostna kopija podatkov in ali je " +"računalnik priklopljen na električno omrežje." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Naprava deluje na bateriji: priporočeno jo je priključiti v omrežje pred " +"nameščanjem posodobitev." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"Nekateri programi se ne odzivajo, ali pa so odprte neshranjene datoteke." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Prijavljeni so tudi drugi uporabniki." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (oddaljeno)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konzola)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Namesti" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Ali želite prejeti in namestiti »%s« prek extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "Program %s onemogočiti tipkovne bližnjice" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Program poskuša onemogočiti tipkovne bližnjice" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Tipkovne bližnjice je mogoče obnoviti s pritiskom na gumb %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Zavrni" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Dovoli" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Počasne tipke so omogočene" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Počasne tipke so onemogočene" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Tipka Shift je bila pritisnjena več kot 8 sekund. To je tipkovna bližnjica " +"za zagon možnosti Počasnih tipk, ki vpliva na način delovanja tipkovnice." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Lepljive tipke so omogočene" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Lepljive tipke so onemogočene" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Tipka Shift je bila pritisnjena 5-krat zapored. To je tipkovna bližnjica za " +"zagon možnosti Lepljivih tipk, ki vpliva na način delovanja tipkovnice." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Tipka Shift je bila pritisnjena 5-krat zapored ali pa sta bili sočasno " +"pritisnjeni dve tipki. To je tipkovna bližnjica za preklic možnosti " +"Lepljivih tipk, ki vpliva na način delovanja tipkovnice." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Pusti omogočeno" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Omogoči" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Onemogoči" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Pusti onemogočeno" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Nastavitve območja in jezika" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Ni nameščenih razširitev" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ni javil napak." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Skrij napake" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Pokaži napake" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Omogočeno" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Onemogočeno" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Napaka" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Zastarelo" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Prejemanje" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Poglej vir" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Spletna stran" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Podrobnosti sistema" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Neznan izvajalec" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Neznan naslov" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Glasnost" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Razveljavi" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Pregled" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Poišči …" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Nova bližnjica …" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Program je določen" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Pokaži zaslonsko pomoč" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Nadzornik preklopa" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Dodeli tipkovno bližnjico" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Končano" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Uredi …" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Brez" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Pritisnite gumb za nastavitev" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Pritisnite tipko Esc za končanje" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Pritisnite katerokoli tipko za končanje" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Končaj" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Dejavnosti" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistem" + +#: js/ui/panel.js:862 +msgid "Top Bar" +msgstr "Vrhnja vrstica" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Vnos ukaza" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Zapri" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Na sistemu Wayland je na voljo ponovni zagon" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Poteka ponovno zaganjanje …" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d novih sporočil" +msgstr[1] "%d novo sporočilo" +msgstr[2] "%d novi sporočili" +msgstr[3] "%d nova sporočila" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d novih obvestil" +msgstr[1] "%d novo obvestilo" +msgstr[2] "%d novi obvestili" +msgstr[3] "%d nova obvestila" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:285 +msgid "Lock" +msgstr "Zakleni" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "Zakleniti je treba zaslon" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Zaklep ni mogoč" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Zaklep je preprečil program" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Iskanje …" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Ni najdenih zadetkov." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "še %d" +msgstr[1] "še %d" +msgstr[2] "še %d" +msgstr[3] "še %d" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopiraj" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Prilepi" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Pokaži besedilo" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Skrij besedilo" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Geslo" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Zapomni si geslo" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Dostopnost" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Približanje" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Zaslonski bralnik" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Zaslonska tipkovnica" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Vidna opozorila" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Lepljive tipke" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Počasne tipke" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Odskočne tipke" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Miškine tipke" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Visok kontrast" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Veliko besedilo" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Nastavitve za Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d povezano" +msgstr[1] "%d povezano" +msgstr[2] "%d povezano" +msgstr[3] "%d povezano" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Nepovezano" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Povezano" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Svetlost" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Tipkovnica" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Pokaži razporeditev tipkovnice" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Določevanje mesta je omogočeno" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Onemogoči" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Nastavitve zasebnosti" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Določevanje mesta je v uporabi" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Določevanje mesta je onemogočeno" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Omogoči" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Dovoli %s dostop do podatka trenutnega mesta?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Dostop do trenutnega mesta je mogoče spremeniti kadarkoli med nastavitvami " +"zasebnosti." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s izklopljeno" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s povezano" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s neupravljano" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s poteka prekinjanje povezave" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s poteka vzpostavljanje povezave" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s zahteva overitev" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Manjka strojna programska oprema za %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s ni na voljo" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s povezava je spodletela" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Nastavitve žičnega omrežja" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Nastavitve mobilnega širokopasovnega dostopa" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s strojno onemogočeno" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s onemogočeno" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Poveži na internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Omogoči način letala" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Naprava Wi-Fi je v načinu letala onemogočena." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Onemogoči način letala" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi je onemogočen" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Napravo Wi-Fi je treba pred povezovanjem najprej omogočiti." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Omogoči Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Omrežja Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Izbor omrežja" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Ni zaznanih omrežij" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Uporabite strojni gumb za izklop" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Izbor omrežja" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Nastavitve Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s vroča točka je dejavna" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s brez povezave" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "vzpostavljanje povezave …" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "zahtevana je overitev" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "povezovanje je spodletelo" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Nastavitve VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "Onemogočen VPN" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Omrežne nastavitve" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s žičnih povezav" +msgstr[1] "%s žična povezava" +msgstr[2] "%s žični povezavi" +msgstr[3] "%s žične povezave" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s povezav Wi-Fi" +msgstr[1] "%s povezava Wi-Fi" +msgstr[2] "%s povezavi Wi-Fi" +msgstr[3] "%s povezave Wi-Fi" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemskih povezav" +msgstr[1] "%s modemska povezava" +msgstr[2] "%s modemski povezavi" +msgstr[3] "%s modemske povezave" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Povezovanje je spodletelo" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Omogočanje omrežne povezave je spodletelo." + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Nočna osvetlitev je onemogočena" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Nočna osvetlitev je omogočena" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Nadaljuj" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Onemogoči do jutri" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Upravljanje napajanja" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Polno napolnjeno" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Naprava se ne polni" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Ocenjevanje …" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Preostaja %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d do polnosti (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Zaslon je v načinu souporabe" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Izklopi" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Letalski način je omogočen" + +#: js/ui/status/system.js:218 +msgid "Switch User" +msgstr "Preklopi uporabnika" + +#: js/ui/status/system.js:230 +msgid "Log Out" +msgstr "Odjava" + +#: js/ui/status/system.js:242 +msgid "Account Settings" +msgstr "Nastavitve računa" + +#: js/ui/status/system.js:270 +msgid "Orientation Lock" +msgstr "Zaklep položaja" + +#: js/ui/status/system.js:296 +msgid "Suspend" +msgstr "V pripravljenost" + +#: js/ui/status/system.js:306 +msgid "Power Off" +msgstr "Izklop" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Neznana naprava Thunderbolt" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Med nedejavnostjo je bila zaznana nova. Odklopite napravo in jo znova " +"priklopite za uporabo." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Neznana naprava Thunderbolt" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Zaznana je nova naprava, ki jo mora overiti skrbnik sistema." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Napaka overitve naprave Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Naprave Thunderbolt ni mogoče overiti: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Glasnost je spremenjena" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Zrcaljenje zaslona" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Združi zaslone" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Le zunanje" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Le vgrajeno" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Prijavi z drugim uporabniškim imenom" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Odkleni okno" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Programi" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Poišči" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "Storitev “%s” je pripravljena" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Ali želite ohraniti te nastavitve zaslona?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Povrni nastavitve" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Ohrani spremembe" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Spremembe nastavitev bodo povrnjene v %d sekundah." +msgstr[1] "Spremembe nastavitev bodo povrnjene v %d sekundi." +msgstr[2] "Spremembe nastavitev bodo povrnjene v %d sekundah." +msgstr[3] "Spremembe nastavitev bodo povrnjene v %d sekundah." + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Skrči" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Pomanjšaj" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Razpni" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Premakni" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Spremeni velikost" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Premakni nazivno vrstico na zaslon" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Vedno na vrhu" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Vedno na dejavni delovni površini" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Premakni na delovno površino na levi" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Premakni na delovno površino na desni" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Premakni na zgornjo delovno površino" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Premakni na spodnjo delovno površino" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Premakni na zaslon zgoraj" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Premakni na zaslon spodaj" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Premakni na zaslon levo" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Premakni na zaslon desno" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Koledar Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Izpiši različico" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Način uporabljen v GDM kot prijavni zaslon" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Uporabi poseben način, na primer »gdm« za prijavni zaslon" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Seznam mogočih načinov" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Neznano" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Zaganjanje »%s« je spodletelo" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Gesli nista skladni!" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Geslo ne more biti prazna vrednost" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Uporabnik je preklical pogovorno okno overitve" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u odvodov naprave" +msgstr[1] "%u odvod naprave" +msgstr[2] "%u odvoda naprave" +msgstr[3] "%u odvodi naprave" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u dovodov naprave" +msgstr[1] "%u dovod naprave" +msgstr[2] "%u dovoda naprave" +msgstr[3] "%u dovodi naprave" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sistemski zvoki" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "" +#~ "Prišlo je do napake med nalaganjem pogovornega okna z možnostmi za %s:" + +#~ msgid "%s all day." +#~ msgstr "%s – ves dan." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, sledi %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, sledi %s, kasneje tudi %s." + +#~ msgid "Feels like %s." +#~ msgstr "Občuti se kot %s." + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Izklop" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Odjava" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Preklopi uporabnika" + +#~ msgid "Hide tray" +#~ msgstr "Skrij sistemsko vrstico" + +#~ msgid "Status Icons" +#~ msgstr "Ikone stanja" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Možnosti razširitev lupine GNOME" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Preusmeritev spletnega overjanja" + +#~ msgid "Events" +#~ msgstr "Dogodki" + +#~ msgid "Notifications" +#~ msgstr "Obvestila" + +#~ msgid "Clear section" +#~ msgstr "Počisti odsek" + +#~ msgid "Media" +#~ msgstr "Nosilci" + +#~ msgid "Not In Use" +#~ msgstr "Ni v uporabi" + +#~ msgid "connecting..." +#~ msgstr "povezovanje ..." + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Pokaži tedenski datum v koledarju" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Izbrana možnost določa prikaz ISO tedenski datum v koledarju." + +#~ msgid "Use as Internet connection" +#~ msgstr "Uporabi kot internetno povezavo" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Lupina GNOME (wayland)" + +#~ msgid "%d∶%02d Remaining (%d%%)" +#~ msgstr "%d∶%02d do konca (%d%%)" + +#~ msgid "%d∶%02d Until Full (%d%%)" +#~ msgstr "%d∶%02d do polnosti (%d%%)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d povezanih naprav" +#~ msgstr[1] "%d povezana naprava" +#~ msgstr[2] "%d povezani napravi" +#~ msgstr[3] "%d povezane naprave" + +#~ msgid "Not Connected" +#~ msgstr "Ni vzpostavljene povezave" + +#~ msgid "In Use" +#~ msgstr "V uporabi" + +#~ msgid "Connected" +#~ msgstr "Povezano" + +#~ msgid "Unmanaged" +#~ msgstr "Neupravljano" + +#~ msgid "Disconnecting" +#~ msgstr "Prekinjanje povezave" + +#~ msgid "Authentication required" +#~ msgstr "Zahtevana je overitev" + +#~ msgid "Firmware missing" +#~ msgstr "Manjka strojna programska oprema" + +#~ msgid "Unavailable" +#~ msgstr "Nedostopno" + +#~ msgid "Hardware Disabled" +#~ msgstr "Strojna oprema je onemogočena" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Baterija" + +#~ msgid "Airplane Mode" +#~ msgstr "Način letala" + +#~ msgid "Show the message tray" +#~ msgstr "Pokaži sistemsko sporočilno vrstico" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Ne" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "P" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "T" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "S" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Če" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Pe" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "S" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Nič ni razporejeno" + +#~ msgid "Today" +#~ msgstr "Danes" + +#~ msgid "Tomorrow" +#~ msgstr "Jutri" + +#~ msgid "This week" +#~ msgstr "Ta teden" + +#~ msgid "Next week" +#~ msgstr "Naslednji teden" + +#~ msgid "Removable Devices" +#~ msgstr "Odstranljive naprave" + +#~ msgid "Eject" +#~ msgstr "Izvrzi" + +#~ msgid "Invitation" +#~ msgstr "Povabilo" + +#~ msgid "Call" +#~ msgstr "Pokliči" + +#~ msgid "File Transfer" +#~ msgstr "Prenos datotek" + +#~ msgid "Chat" +#~ msgstr "Klepet" + +#~ msgid "Unmute" +#~ msgstr "Povrni glasnost" + +#~ msgid "Mute" +#~ msgstr "Utišaj" + +#~ msgid "Invitation to %s" +#~ msgstr "Povabilo v %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s vas vabi, da se pridružite v %s" + +#~ msgid "Decline" +#~ msgstr "Zavrni" + +#~ msgid "Accept" +#~ msgstr "Sprejmi" + +#~ msgid "Video call from %s" +#~ msgstr "%s želi vzpostaviti video klic" + +#~ msgid "Call from %s" +#~ msgstr "%s kliče" + +#~ msgid "Answer" +#~ msgstr "Odgovori" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s pošilja %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s želi dovoljenje za pogled dosegljivosti" + +#~ msgid "Network error" +#~ msgstr "Napaka omrežja" + +#~ msgid "Authentication failed" +#~ msgstr "Overitev je spodletela" + +#~ msgid "Encryption error" +#~ msgstr "Napaka šifriranja" + +#~ msgid "Certificate not provided" +#~ msgstr "Potrdilo ni na voljo" + +#~ msgid "Certificate untrusted" +#~ msgstr "Potrdilo ni zaupljivo" + +#~ msgid "Certificate expired" +#~ msgstr "Potrdilo je preteklo" + +#~ msgid "Certificate not activated" +#~ msgstr "Potrdilo ni potrjeno" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Neustrezno ime gostitelja potrdila" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Neustrezen prstni odtis potrdila" + +#~ msgid "Certificate self-signed" +#~ msgstr "Potrdilo je samo-podpisano" + +#~ msgid "Status is set to offline" +#~ msgstr "Stanje je nastavljeno na brez povezave" + +#~ msgid "Certificate is invalid" +#~ msgstr "Potrdilo je neveljavno." + +#~ msgid "Connection has been refused" +#~ msgstr "Povezava je zavrnjena." + +#~ msgid "Connection can't be established" +#~ msgstr "Povezave ni mogoče vzpostaviti." + +#~ msgid "Connection has been lost" +#~ msgstr "Povezava je prekinjena." + +#~ msgid "This account is already connected to the server" +#~ msgstr "Račun je s strežnikom že povezan" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Povezava je zamenjana z novo povezavo, ki uporablja isti vir." + +#~ msgid "The account already exists on the server" +#~ msgstr "Račun na strežniku že obstaja" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Strežnik je trenutno preveč zaposlen za upravljanje s povezavo." + +#~ msgid "Certificate has been revoked" +#~ msgstr "Potrdilo je preklicano" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Potrdilo ne uporablja varnega algoritma ali pa uporablja šibko šifriranje." + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Dolžina potrdila strežnika ali pa globina verige potrdila presega " +#~ "omejitev, ki je določena s šifrirno knjižnico." + +#~ msgid "Internal error" +#~ msgstr "Notranja napaka" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Povezava z %s ni mogoča." + +#~ msgid "View account" +#~ msgstr "Poglej račun" + +#~ msgid "Unknown reason" +#~ msgstr "Neznan vzrok" + +#~ msgid "Open Calendar" +#~ msgstr "Odpri koledar" + +#~ msgid "Date & Time Settings" +#~ msgstr "Nastavitve časa in datuma" + +#~ msgid "Open" +#~ msgstr "Odpri" + +#~ msgid "Remove" +#~ msgstr "Odstrani" + +#~ msgid "Clear Messages" +#~ msgstr "Počisti sporočila" + +#~ msgid "Notification Settings" +#~ msgstr "Nastavitve obvestil" + +#~ msgid "Tray Menu" +#~ msgstr "Meni sistemske vrstice" + +#~ msgid "No Messages" +#~ msgstr "Ni sporočil" + +#~ msgid "Message Tray" +#~ msgstr "Sporočilna vrstica" + +#~ msgid "Captive Portal" +#~ msgstr "Združen pogled" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Raven natančnosti določanja mesta." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Možnost določa raven natančnosti določanja položaja. Veljavne možnosti so " +#~ "'onemogočeno' (sledenje ni zagnano), 'država', 'mesto', 'okraj', 'ulica' " +#~ "in 'natančno' (zahteva sprejemnik GPS). Možnost določa le položaj, ki ga " +#~ "programom javlja GeoClue. Programi lahko položaj uporabnika določijo tudi " +#~ "sami z uporabo omrežnih virov (na ravni ulice)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Razporeditev gumbov v nazivni vrstici" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Ključ prepiše vrednost v org.gnome.desktop.wm.preferences med zaganjanjem " +#~ "lupine GNOME." + +#~ msgid "Extension" +#~ msgstr "Pripona" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Razširitev za nastavljanje je mogoče izbrati iz spustnega seznama zgoraj." + +#~ msgid "calendar:MY" +#~ msgstr "koledar: osnovni" + +#~ msgid "unavailable" +#~ msgstr "ni na voljo" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Seznam kategorij, ki naj bodo prikazane kot mape" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Vsako ime kategorije na tem seznamu je predstavljeno kot mapa v " +#~ "programskem pogledu in ne medvrstično v glavnem pogledu." + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d. %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d. %B %Y, %H:%M " + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Authorization request from %s" +#~ msgstr "Zahteva za pooblastitev od %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Naprava %s se poskuša seznaniti s tem računalnikom" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Naprava %s želi dostop do storitve '%s'." + +#~ msgid "Always grant access" +#~ msgstr "Vedno odobri dostop" + +#~ msgid "Grant this time only" +#~ msgstr "Odobri le tokrat" + +#~ msgid "Reject" +#~ msgstr "Zavrni" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Potrditev razčlenjevanja za %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "Potrdite, ali se PIN '%06d' ujema s tistim na napravi." + +#~ msgid "Matches" +#~ msgstr "Ujemanja" + +#~ msgid "Does not match" +#~ msgstr "Se ne ujema" + +#~ msgid "Pairing request for %s" +#~ msgstr "Zahteva razčlenjevanja za %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Vnesite PIN, ki je naveden na napravi." + +#~ msgid "OK" +#~ msgstr "V redu" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Za danes ni modrosti:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Riba %s pravi" + +#~ msgid "Settings Menu" +#~ msgstr "Meni nastavitev" + +#~ msgid "Session" +#~ msgstr "Seja" + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Uporabljeno za shranjevanje stanja prisotnosti na hipnem sporočanju na " +#~ "zahtevo uporabnika. Vrednost določa števec predmeta " +#~ "TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Uporabljeno za shranjevanje stanja prisotnosti zadnje seje uporabnika. " +#~ "Vrednost določa števec predmeta GsmPresenceStatus." + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "Kliknite Odjava za končanje teh programov in odjavo iz sistema." + +#~ msgid "Logging out of the system." +#~ msgstr "Odjavljanje iz sistema." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "" +#~ "Kliknite na gumb za izklop za končanje teh programov in izklop iz sistema." + +#~ msgid "Powering off the system." +#~ msgstr "Izklapljanje sistema" + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Kliknite Zaženi znova za končanje teh programov in ponoven zagon sistema. " + +#~ msgid "Restarting the system." +#~ msgstr "Ponoven zagon sistema." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Z izklopom je njihovo delo lahko izgubljeno." + +#~ msgid "Screenshots" +#~ msgstr "Zajete slike" + +#~ msgid "Record a screencast" +#~ msgstr "Shrani zaslonski posnetek" + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Tipkovna bližnjica za preklop snemalnika zaslona" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "" +#~ "Tipkovna bližnjica za začetek in ustavitev vgrajenega snemalnika zaslona" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Hitrost sličic uporabljena za snemanje zaslonskega posnetka." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na " +#~ "sekundo." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka." + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Nastavi cevovod programa GStreamer, ki se uporablja za kodiranje " +#~ "posnetkov. Ta sledi skladnji, ki se uporablja za program gst-launch. " +#~ "Cevovod mora imeti nepovezano korito, kamor se posnetek snema. Običajno " +#~ "je za to namenjen nepovezan izvorni pomnilnik, katerega odvod se zapiše v " +#~ "odvodno datoteko. Vendar pa lahko cevovod ta korak naredi v lastni odvod " +#~ "- možnost se lahko uporabi pri pošiljanju odvoda na strežnik icecast " +#~ "preko shout2send ali podobno. Nedoločena ali prazna možnost se odrazi kot " +#~ "privzeti cevovod. Trenutno je to 'vp8enc min_quantizer=13 " +#~ "max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! " +#~ "webmmux' in omogoča snemanje v zapis WEBM z uporabo kodeka VP8. Vrednost " +#~ "%T se uporablja kot ročnik za ugibanje najustreznejšega števila niti na " +#~ "sistemu." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Pripona datoteke uporabljene za shranjevanje zaslonskih posnetkov" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Ime datoteke zaslonskega posnetka bo enoznačno ime, kateremu bo dodan " +#~ "datum in določena pripona. Pripona mora ustrezati zapisu zabojnika." + +#~ msgid "Power" +#~ msgstr "Napajanje" + +#~ msgid "Restart" +#~ msgstr "Zaženi znova" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Screencast z %d %t" + +#~ msgid "Universal Access Settings" +#~ msgstr "Splošne nastavitve dostopa" + +#~ msgid "Visibility" +#~ msgstr "Vidnost" + +#~ msgid "Send Files to Device…" +#~ msgstr "Pošilji datotek na napravo ..." + +#~ msgid "Set Up a New Device…" +#~ msgstr "Nastavitev nove naprave ..." + +#~ msgid "Send Files…" +#~ msgstr "Pošlji datoteke ..." + +#~ msgid "Keyboard Settings" +#~ msgstr "Nastavitve tipkovnice" + +#~ msgid "Mouse Settings" +#~ msgstr "Nastavitve miške" + +#~ msgid "Volume, network, battery" +#~ msgstr "Nosilec, omrežje, baterija" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "disabled" +#~ msgstr "onemogočeno" + +#~ msgid "cable unplugged" +#~ msgstr "kabel ni priklopljen" + +#~ msgid "More…" +#~ msgstr "Več ..." + +#~ msgid "Wired" +#~ msgstr "Žično" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "Preostaja še %d %s %d %s" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "ur" +#~ msgstr[1] "ura" +#~ msgstr[2] "uri" +#~ msgstr[3] "ure" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "minut" +#~ msgstr[1] "minuta" +#~ msgstr[2] "minuti" +#~ msgstr[3] "minute" + +#~ msgctxt "percent of battery remaining" +#~ msgid "%d%%" +#~ msgstr "%d%%" + +#~ msgid "AC Adapter" +#~ msgstr "Električni prilagodilnik" + +#~ msgid "Laptop Battery" +#~ msgstr "Baterija prenosnika" + +#~ msgid "Monitor" +#~ msgstr "Zaslon" + +#~ msgid "Mouse" +#~ msgstr "Miška" + +#~ msgid "PDA" +#~ msgstr "Dlančnik" + +#~ msgid "Cell Phone" +#~ msgstr "Mobilni telefon" + +#~ msgid "Media Player" +#~ msgstr "Predstavni predvajalnik" + +#~ msgid "Tablet" +#~ msgstr "Tablični računalnik" + +#~ msgid "Computer" +#~ msgstr "Računalnik" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Neznano" + +#~ msgid "Available" +#~ msgstr "Na voljo" + +#~ msgid "Busy" +#~ msgstr "Zaposleno" + +#~ msgid "Invisible" +#~ msgstr "Nevidno" + +#~ msgid "Away" +#~ msgstr "Odsotno" + +#~ msgid "Idle" +#~ msgstr "Nedejavno" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Obveščanje je zdaj onemogočeno, vključno s sporočili klepeta. Vaše stanje " +#~ "povezanosti se je prilagodilo, da bodo drugi vedeli, da njihovih sporočil " +#~ "morda ne boste opazili." + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Ali naj se beleži statistika uporabe programov" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "Lupina običajno nadzira dejavne programe zaradi možnosti prikazovanja " +#~ "najpogosteje uporabljenih v zaganjalniku. Čeprav so podatki krajevni, jih " +#~ "je dobro onemogočiti zaradi varovanja zasebnosti. Z onemogočenje ne bodo " +#~ "odstranjeni že shranjeni podatki." + +#~ msgid "Auto Ethernet" +#~ msgstr "Samodejni eternet" + +#~ msgid "Auto broadband" +#~ msgstr "Samodejni širokopasovni dostop" + +#~ msgid "Auto dial-up" +#~ msgstr "Samodejni klicni dostop" + +#~ msgid "Auto %s" +#~ msgstr "Samodejna povezava z %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Samodejna povezava z Bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Samodejni brezžični dostop" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Prijava" + +#~ msgid "tray" +#~ msgstr "sistemska vrstica" + +#~ msgid "More..." +#~ msgstr "Več ..." + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "United Kingdom" +#~ msgstr "Velika Britanija" + +#~ msgid "Default" +#~ msgstr "Privzeto" + +#~ msgid "Show full name in the user menu" +#~ msgstr "Pokaži polno ime v meniju uporabnika" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "Ali naj bo prikazano uporabnikovo polno ime v meniju uporabnika." + +#~ msgid "APPLICATIONS" +#~ msgstr "Programi" + +#~ msgid "SETTINGS" +#~ msgstr "NASTAVITVE" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Vaše priljubljeno velikonočno jajce" + +#~ msgid "Subscription request" +#~ msgstr "Zahteva po naročilu" + +#~ msgid "Connection error" +#~ msgstr "Napaka povezovanja" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Poslano %A ob %X" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Poslano %A, %d. %Ba, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Povezava z %s je spodletela" + +#~ msgid "Reconnect" +#~ msgstr "Ponovno se poveži" + +#~ msgid "Browse Files..." +#~ msgstr "Brskanje datotek ..." + +#~ msgid "Error browsing device" +#~ msgstr "Napaka med brskanjem po napravi" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Po zahtevani naprave ni mogoče brskati, napaka je '%s'" + +#~ msgid "Wireless" +#~ msgstr "Brezžično" + +#~ msgid "VPN Connections" +#~ msgstr "Povezave VPN" + +#~ msgid "System Settings" +#~ msgstr "Sistemske nastavitve" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "ponudniki OpenSearch so bili onemogočeni" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Ni mogoče odklopiti '%s'" + +#~ msgid "Retry" +#~ msgstr "Poskusi znova" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "Mesta in naprave" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "Povezava z ..." + +#~ msgid "Passphrase" +#~ msgstr "Šifrirno geslo" + +#~ msgctxt "contact" +#~ msgid "Unknown" +#~ msgstr "Neznano" + +#~ msgid "CONTACTS" +#~ msgstr "Stiki" + +#~ msgid "%s is online." +#~ msgstr "%s je povezan." + +#~ msgid "%s is offline." +#~ msgstr "%s ni povezan." + +#~ msgid "%s is away." +#~ msgstr "%s je odsoten." + +#~ msgid "%s is busy." +#~ msgstr "%s je zaposlen." + +#~ msgid "Show time with seconds" +#~ msgstr "Pokaži čas s sekundami" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Izbrana možnost določi prikaz sekund v času." + +#~ msgid "Show date in clock" +#~ msgstr "Pokaži datum v uri" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Izbrana možnost določi, da je ob času prikazan tudi datum." + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a. %e. %b., %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a, %e. %b., %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a. %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a. %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Hidden" +#~ msgstr "Skrito" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Napačno geslo; poskusite znova." + +#~ msgid "Power Off..." +#~ msgstr "Izklop ..." + +#~ msgid "Online Accounts" +#~ msgstr "Spletni računi" + +#~ msgid "Log Out..." +#~ msgstr "Odjava ..." + +#~ msgid "RECENT ITEMS" +#~ msgstr "Nedavni predmeti" + +#~ msgid "Show password" +#~ msgstr "Pokaži geslo" + +#~ msgid "Home Folder" +#~ msgstr "Domača mapa" diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..33fa2d1 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,2744 @@ +# Serbian translation for gnome-shell. +# Courtesy of Prevod.org team (http://prevod.org/) -- 2010—2017. +# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Translators: +# Милош Поповић , 2010—2011. +# Мирослав Николић , 2011—2017. +# Марко М. Костић , 2016. +# Борисав Живановић , 2017—2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-11 18:01+0000\n" +"PO-Revision-Date: 2019-02-28 14:25+0100\n" +"Last-Translator: Марко М. Костић \n" +"Language-Team: српски \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" +"X-Poedit-Bookmarks: -1,167,-1,-1,-1,-1,-1,-1,-1,-1\n" +"X-Generator: Poedit 2.2\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Систем" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Прикажите списак обавештења" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Поставите у жижу активно обавештење" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Прикажи преглед" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Прикажи све програме" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Отворите изборник програма" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Проширења шкољке" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Подесите проширења Гномове шкољке" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Гномова шкољка" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Управник прозорима и покретач програма" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Укључује алате корисне програмерима и тестерима из „Alt-F2“ прозорчета" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Дозвољава приступ унутрашњем отклањању грешака и алатима за праћење " +"коришћењем „Alt-F2“ прозорчета." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "ЈУИБ-ови проширења за укључивање" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Проширења Гномове шкољке имају ЈУИБ вредност; овај кључ исписује проширења " +"која треба учитавати. Свако проширење које жели бити учитано мора бити на " +"списку. Такође можете да управљате овим списком користећи начине Д-" +"магистрале „Укључи проширење“ и „Искључи проширење“ на „org.gnome.Shell“." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Искључује корисничка проширења" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Искључује сва проширења која је укључио корисник без деловања на подешавање " +"„enabled-extension“." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Искључује потврђивање сагласности издања проширења" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Гномова шкољка ће учитати само проширења која тврде да подржавају текуће " +"покренуто издање. Укључивање ове опције ће искључити ову проверу и покушати " +"да учита проширења без обзира на издања која тврде да подржавају." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Списак ИБ датотека радне површине са омиљеним програмима" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Програми који одговарају овим одредницама се приказују унутар области " +"омиљених програмима." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Преглед избирача програма" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Попис тренутно изабраног прегледа у избирачу програма." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Историјат прозорчета (Alt-F2) наредби" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Историјат прозорчета огледала" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Увек приказује ставку изборника „Одјави ме“ у изборнику корисника." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Овај кључ превазилази самостално скривање ставке изборника „Одјави ме“ у " +"случају једног корисника, једне сесије." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Да ли ће бити запамћена лозинка за качење шифрованих или удаљених система " +"датотека" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Шкољка ће затражити лозинку када се прикачи шифровани уређај или удаљени " +"систем датотека. Ако лозинка може бити сачувана за даљњу употребу биће " +"присутно поље за избор „Запамти лозинку“. Овај кључ подешава основно стање " +"поља за избор." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Да ли је основни адаптер блутута подесио њему придружене уређаје" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Шкољка ће приказати ставку изборника блутута само ако је адаптер блутута " +"упаљен, или ако има подешених уређаја придружених основном адаптеру. Ово ће " +"се вратити на почетно стање ако се установи да основни адаптер нема њему " +"придружених уређаја." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Омогући АПИ за интроспекцију" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Омогућава АПИ Д-сабирнице који дозвољава интроспекцију програмског стања " +"шкољке." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Пречица за отварање изборника програма" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Пречица за отварање изборника програма." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Пречица за отварање прегледа „Прикажи програме“" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Пречица за отварање прегледа „Прикажи програме“ у прегледу активности." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Пречица за отварање прегледа" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Пречица за отварање прегледа активности." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Пречица за окидање видљивости списка обавештења" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Пречица за окидање видљивости списка обавештења." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Пречица за постављање у жижу радног обавештења" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Пречица за постављање у жижу радног обавештења." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Свеза тастера која паузира и наставља све покренуте близанце, за сврхе " +"прочишћавања" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Пребаци се на програм 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Пребаци се на програм 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Пребаци се на програм 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Пребаци се на програм 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Пребаци се на програм 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Пребаци се на програм 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Пребаци се на програм 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Пребаци се на програм 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Пребаци се на програм 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Која ће тастатура бити коришћена" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Врста тастатуре за употребу." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Ограничава пребацивача на текући радни простор." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ако је изабрано, само програми који имају прозоре на текућем радном простору " +"се приказују у пребацивачу. У супротном, сви програми су укључени." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Режим иконице програма." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Подешава начин приказивања прозора у пребацивачу. Исправне могућности су " +"„thumbnail-only“ (приказује сличицу прозора), „app-icon-only“ (приказује " +"само иконицу програма) или „both“ (оба)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ако је изабрано, само прозори са текућег радног простора се приказују у " +"пребацивачу. У супротном, сви прозори су укључени." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Прикачиње прозорче родитељском прозору" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Овај кључ превазилази кључ у „org.gnome.mutter“ када покреће Гномову шкољку." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Укључује поплочавање ивице приликом отпуштања прозора на ивицама екрана" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Радним просторима се управља динамички" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Радни простори само на примарном монитору" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Застој првог плана се мења у режиму миша док се показивач не заустави" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Мрежна пријава" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Нешто је пошло наопако" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Веома нам је жао али се догодио проблем, не можемо приказати подешавања за " +"ово проширење. Предлажемо вам да пријавите овај проблем творцима проширења." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Техничке појединости" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Грешка при копирању" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Матична страна" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Посети матичну страну проширењ" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Нису инсталирана проширења" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Проширења се могу инсталирати унутар Програма или на страници extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Прегледај у Програмима" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Откажи" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Даље" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Откључај" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Пријави ме" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Изабери сесију" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Није на списку?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(нпр., корисник или %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Корисник: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Прозор за пријављивање" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Грешка потврђивања идентитета" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(или превуците прст)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Искључи" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"power off;shutdown;искључи;угаси;гашење;isključi;ugasi;gašenje;iskljuci;" +"gasenje;reboot;restart;ponovo;pokreni;поново;покрени;рестарт;power off;" +"shutdown;reboot;restart" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Закључај екран" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "закључај екран" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Одјави ме" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "" +"изађи;одјави се;одлогуј се;izađi;odjavi se;odloguj se;izadji;logout;sign off" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Обустави" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "" +"suspend;sleep;обустави;спавај;суспендуј;obustavi;spavaj;suspenduj;suspend;" +"sleep" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Промени корисника" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "switch user;промени корисника;promeni korisnika;switch user" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Закључај окретање екрана" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "" +"lock orientation;screen;rotation;закључај окретање екрана;закључај " +"оријентацију;zaključaj okretanje ekrana;zaključaj orijentaciju;zakljucaj " +"okretanje ekrana;екран;ekran;окретање;okretanje;lock orientation;screen;" +"rotation" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Наредба није нађена" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Не могу да обрадим наредбу:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Није успело извршавање „%s“:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Управо сада" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Пре %d минут" +msgstr[1] "Пре %d минута" +msgstr[2] "Пре %d минута" +msgstr[3] "Пре један минут" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Пре %d сат" +msgstr[1] "Пре %d сата" +msgstr[2] "Пре %d сати" +msgstr[3] "Пре један сат" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Јуче" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Пре %d дан" +msgstr[1] "Пре %d дана" +msgstr[2] "Пре %d дана" +msgstr[3] "Пре један дан" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Пре %d недељу" +msgstr[1] "Пре %d недеље" +msgstr[2] "Пре %d недеља" +msgstr[3] "Пре недељу дана" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Пре %d месец" +msgstr[1] "Пре %d месеца" +msgstr[2] "Пре %d месеци" +msgstr[3] "Пре месец дана" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Пре %d годину" +msgstr[1] "Пре %d године" +msgstr[2] "Пре %d година" +msgstr[3] "Пре годину дана" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Јуче, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d. %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d. %B %Y., %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Јуче, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d. %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d .%B %Y., %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Пријава на врућу тачку" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Ваша веза са овом пријавом вруће тачке није безбедна. Људи у близини могу " +"видети лозинке или друге податке које будете унели на овој страници." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Забрани приступ" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Дозволи приступ" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Често коришћени програми ће се појавити овде" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Често" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Све" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Нови прозор" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Покрени са намењеном графичком картицом" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Уклони из омиљених" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Додај у омиљене" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Прикажи детаље" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "„%s“ је додат међу омиљене." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "„%s“ је уклоњен из омиљених." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Изаберите звучни уређај" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Подешавања звука" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Слушалице" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Слушалице са микрофоном" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Микрофон" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Измени позадину…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Подешавања приказа" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Подешавања" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "Н" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "У" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "Ч" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "С" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "Претходни месец" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "Следећи месец" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +msgid "Week %V" +msgstr "Седмица %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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "Цео дан" + +#: js/ui/calendar.js:829 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d. %B" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d. %B %Y." + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "Без обавештења" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "Без догађаја" + +#: js/ui/calendar.js:1085 +msgid "Clear" +msgstr "Очисти" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "„%s“ не одговара." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Можете изабрати да сачекате који тренутак да настави или да приморате " +"програм да се читав затвори." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Приморај излаз" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Сачекај" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Спољни уређај је прикључен" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Спољни уређај је искључен" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Отвори програмом %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Лозинка:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Упишите поново:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "Или можете повезати притиском на дугме „WPS“, на вашем рутеру." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Повежи се" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Лозинка: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Кључ: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Лозинка приватног кључа: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Идентитет: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Услуга: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Бежична мрежа захтева потврђивање идентитета" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Потребне су лозинке или кључеви шифровања за приступ бежичној мрежи „%s“." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Потврђивање идентитета за жичану 802.1X везу" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Назив мреже: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Потврђивање идентитета ДСЛ-а" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Потребан је ПИН кôд" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Потребан је ПИН код за повезивање мобилног широкопојасног уређаја" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "ПИН: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Лозинка мобилне широкопојасне мреже" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Потребна је лозинка за повезивање на „%s“." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Управник мреже" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Потребна је пријава" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Администратор" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Потврди идентитет" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Погрешили сте! Покушајте поново." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "„%s“ је сада познат као „%s“" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Прозори" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Прикажи програме" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Полет" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d. %B %Y." + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A, %e. %B %Y." + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Светски сатови…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Светски сатови" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Временска прогноза" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Изаберите место…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Учитавам…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Идите на мрежу за податке о временској прогнози." + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Подаци о временској прогнози тренутно нису доступни." + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Одјави корисника „%s“" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Одјави ме" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s ће бити одјављен за %d секунду." +msgstr[1] "%s ће бити одјављен за %d секунде." +msgstr[2] "%s ће бити одјављен за %d секунди." +msgstr[3] "%s ће бити одјављен за %d секунду." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Бићете одјављени за %d секунду." +msgstr[1] "Бићете одјављени за %d секунде." +msgstr[2] "Бићете одјављени за %d секунди." +msgstr[3] "Бићете одјављени за %d секунду." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Одјави" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Искључи" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Инсталирај освежења и искључи" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Рачунар ће се искључити за %d секунду." +msgstr[1] "Рачунар ће се искључити за %d секунде." +msgstr[2] "Рачунар ће се искључити за %d секунди." +msgstr[3] "Рачунар ће се искључити за %d секунду." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Инсталирај освежења софтвера на чекању" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Поново покрени" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Искључи" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Поново покрени" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Систем ће се поново покренути за %d секунду." +msgstr[1] "Систем ће се поново покренути за %d секунде." +msgstr[2] "Систем ће се поново покренути за %d секунди." +msgstr[3] "Систем ће се поново покренути за %d секунду." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Поново покрени и инсталирај ажурирања" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Систем ће се сам поново покренути и инсталирати ажурирања за %d секунду." +msgstr[1] "" +"Систем ће се сам поново покренути и инсталирати ажурирања за %d секунде." +msgstr[2] "" +"Систем ће се сам поново покренути и инсталирати ажурирања за %d секунди." +msgstr[3] "" +"Систем ће се сам поново покренути и инсталирати ажурирања за %d секунду." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Поново покрени и инсталирај" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Инсталирај и искључи" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Искључи након инсталирања освежења" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Поново покрени и инсталирај надоградњу" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s ће бит инсталиран/а након поновног покретања. Инсталација надоградње " +"понекад може да потраје: проверите да ли сте направили резерву ваших важних " +"података и да ли је рачунар прикључен на мрежно напајање." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Напајате се са батерије: прикључите мрежно напајање пре инсталирања освежења." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Неки програми су заузети или имају несачувани рад." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Други корисници су пријављени." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (удаљено)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (љуска)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Инсталирај" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Да преузмем и да инсталирам „%s“ са „extensions.gnome.org“-а?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "„%s“ жели да спречи пречице" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Програм жели да спречи пречице" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Можете повратити пречице притиском на „%s“." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Забрани" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Дозволи" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Спори тастери су укључени" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Спори тастери су искључени" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Управо сте тастер Shift држали притиснутим 8 секунди. То укључује Споре " +"тастере, што утиче на рад тастатуре." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Лепљиви тастери су укључени" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Лепљиви тастери су искључени" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Управо сте притиснули тастер Shift 5 пута заредом. То је пречица за Лепљиве " +"тастере, што утиче на рад тастатуре." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Управо сте притиснули два тастера истовремено, или сте притиснули тастер " +"Shift 5 пута заредом. То укључује Лепљиве тастере, што утиче на рад " +"тастатуре." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Остави укључено" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Укључи" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Искључи" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Остави искључено" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Подешавања региона и језика" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Нису инсталирана проширења" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s није објавио никакве грешке." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Сакриј грешке" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Прикажите грешке" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Укључено" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Искључено" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Грешка" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Изван датума" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "Преузимам" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Прикажи код" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Веб страница" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Подаци о систему" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Непознат извођач" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Непознат наслов" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Јачина звука" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Опозови" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Преглед" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Упишите текст за претрагу…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Нова пречица…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Дефинисани програм" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Прикажи помоћ на екрану" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Промени монитор" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Додели тастер" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Готово" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Уреди…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Ништа" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Притисните дугме да подесите" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Притисните „Есц“ да изађете" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Притисните неки тастер да изађете" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Изађи" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Активности" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Систем" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Горња трака" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Унесите наредбу" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Затвори" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Поновно покретање није доступно на Вејланду" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Поновно покрећем…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d нова порука" +msgstr[1] "%d нове поруке" +msgstr[2] "%d нових порука" +msgstr[3] "%d нова порука" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ново обавештење" +msgstr[1] "%d нова обавештења" +msgstr[2] "%d нових обавештења" +msgstr[3] "%d ново обавештење" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Закључај" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "Гном мора да закључа екран" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Не могу да закључам" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Неки програм је блокирао закључавање" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Тражим…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Нема одговарајућих резултата." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "Још %d" +msgstr[1] "Још %d" +msgstr[2] "Још %d" +msgstr[3] "Још један" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Умножи" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Убаци" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Прикажи текст" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Сакриј текст" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Лозинка" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Запамти лозинку" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Приступачност" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Зумирај" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Читач екрана" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Тастатура на екрану" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Визуелна упозорења" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Лепљиви тастери" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Спори тастери" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Одскочни тастери" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Тастери миша" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Велики контраст" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Велики текст" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Блутут" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Подешавања Блутута" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d повезан" +msgstr[1] "%d повезана" +msgstr[2] "%d повезано" +msgstr[3] "%d повезан" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Искљ." + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Укључено" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Осветљеност" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Тастатура" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Покажи распоред тастатуре" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Локација је омогућена" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Искључи" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Подешавања приватности" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Користи локацију" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Не користи локацију" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Укључи" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Да ли да „%s“ дам приступ вашем месту?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Приступ месту можете да измените у било које време у подешавањима " +"приватности." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "<непознато>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s искључено" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s повезано" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s неуправљано" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s прекидање везе у току" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s повезивање у току" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s захтева пријаву" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Недостаје фирмвер за %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s недоступно" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s повезивање неуспешно" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Подешавања жичане везе" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Подешавања мобилне широкопојасне везе" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s уређај искључен" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s искључено" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Повежи се на Интернет" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Авионски режим рада је укључен" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Бежична веза је искључена када је укључен авионски режим рада." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Искључи авионски режим рада" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Бежична веза је искључена" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Бежична веза треба бити укључена да бисте се повезали на мрежу." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Укључи бежичну везу" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Бежичне мреже" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Изаберите мрежу" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Нема мрежа" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Користи физички прекидач за искључивање" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Изабери мрежу" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Подешавања бежичне везе" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s хотспот укључен" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s неповезано" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "повезујем се…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "потребна је пријава" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "повезивање није успело" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "ВПН подешавања" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "ВПН" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "Искључи ВПН" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Подешавања мреже" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s жичана веза" +msgstr[1] "%s жичане везе" +msgstr[2] "%s жичаних веза" +msgstr[3] "%s жичана веза" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s бежична веза" +msgstr[1] "%s бежичне везе" +msgstr[2] "%s бежичних веза" +msgstr[3] "%s бежична веза" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s модемска веза" +msgstr[1] "%s модемске везе" +msgstr[2] "%s модемских веза" +msgstr[3] "%s модемска веза" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Повезивање није успело" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Активирање мрежне везе није успело" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Ноћно светло не ради" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Ноћно светло ради" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Настави" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Искључи до сутра" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Подешавања напајања" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Потпуно пуна" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Не пуни се" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Прорачунавам…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "До празне: %d:%02d (%d %%)" + +# Кратак превод да би се видело време и проценат напуњености у системском менију Гномове шкољке. +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "До пуне: %d:%02d (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Екран се дели" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Искључи" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Авио режим укључен" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Промени корисника" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Одјави ме" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Подешавања налога" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Катанац окренутости" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Обустави" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Искључи" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Тандерболт" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Непознат Тандерболт уређај" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Нови уређај је уочен док нисте били ту. Поново повежите уређај да бисте " +"почели да га користите." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Неовлашћени Тандерболт уређај" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Уочен је нови уређај и потребно је да администратор овласти његову употребу." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Грешка у овлашћивању Тандерболта" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Не могу да овластим Тандерболт уређај: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Промена јачине звука" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Пресликај" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Споји екране" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Само спољни" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Само уграђени" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Пријавите се као други корисник" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Откључај прозор" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Програми" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Тражи" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "„%s“ је спреман" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Да ли желите да задржите ова подешавања екрана?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Врати подешавања" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Задржи измене" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Измене подешавања ће бити враћене за %d секунду" +msgstr[1] "Измене подешавања ће бити враћене за %d секунде" +msgstr[2] "Измене подешавања ће бити враћене за %d секунди" +msgstr[3] "Измене подешавања ће бити враћене за %d секунду" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Умањи" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Поништи увећање" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Увећај" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Премести" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Промени величину" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Премести траку наслова на екран" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Држи изнад осталих" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Прикажи на свим радним просторима" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Премести на леви радни простор" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Премести на десни радни простор" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Премести на радни простор горе" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Премести на радни простор доле" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Премести на горњи радни простор" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Премести на доњи радни простор" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Премести екран улево" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Премести екран удесно" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Календар Еволуције" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Исписује издање" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Који режим користи ГДМ за екран пријављивања" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Користи нарочит режим, нпр. „gdm“ за екран пријављивања" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Исписује могуће режиме" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Непознат" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Нисам успео да покренем „%s“" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Лозинке се не подударају." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Лозинка не може бити празна" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Корисник је одбацио прозорче за потврђивање идентитета" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u излаз" +msgstr[1] "%u излаза" +msgstr[2] "%u излаза" +msgstr[3] "%u излаз" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u улаз" +msgstr[1] "%u улаза" +msgstr[2] "%u улаза" +msgstr[3] "%u улаз" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Системски звуци" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Дошло је до грешке при учитавању прозорчета поставки за „%s“:" + +#~ msgid "%s all day." +#~ msgstr "%s целог дана." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, затим %s касније." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, затим %s, а касније %s." + +#~ msgid "Feels like %s." +#~ msgstr "Осећа се као %s." + +#~ 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 "Сакриј касету" + +#~ msgid "Status Icons" +#~ msgstr "Иконице стања" + +#~ msgid "Events" +#~ msgstr "Догађаји" + +#~ msgid "Notifications" +#~ msgstr "Обавештења" + +#~ msgid "Clear section" +#~ msgstr "Очисти одељак" + +#~ msgid "Media" +#~ msgstr "Медији" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Поставке проширења Гномове шкољке" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Преусмеравање потврђивања идентитета вебом" + +#~ msgid "Not In Use" +#~ msgstr "Није у употреби" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Приказује дан у недељи у календару" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Ако је изабрано, приказује ИСО дан у недељи у календару." + +#~ msgid "Use as Internet connection" +#~ msgstr "Користи као Интернет везу" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "„%s“ захтева приступ вашем месту." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Гномова шкољка (вајланд састављач)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d прикључени уређај" +#~ msgstr[1] "%d прикључена уређаја" +#~ msgstr[2] "%d прикључених уређаја" +#~ msgstr[3] "%d прикључени уређај" + +#~ msgid "Authentication required" +#~ msgstr "Потребно је потврђивање идентитета" + +#~ msgid "UPS" +#~ msgstr "Резервно напајање" + +#~ msgid "Battery" +#~ msgstr "Батерија" + +#~ msgid "Airplane Mode" +#~ msgstr "Режим у авиону" + +#~ msgid "Show the message tray" +#~ msgstr "Прикажите фиоку порука" + +#~ msgid "Captive Portal" +#~ msgstr "Портал стопке" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Нед" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Пон" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Уто" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Сре" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Чет" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Пет" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Суб" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Ништа планирано" + +#~ msgid "Today" +#~ msgstr "Данас" + +#~ msgid "Tomorrow" +#~ msgstr "Сутра" + +#~ msgid "This week" +#~ msgstr "Ове недеље" + +#~ msgid "Next week" +#~ msgstr "Следеће недеље" + +#~ msgid "Removable Devices" +#~ msgstr "Уклоњиви уређаји" + +#~ msgid "Eject" +#~ msgstr "Избаци" + +#~ msgid "Invitation" +#~ msgstr "Позивница" + +#~ msgid "Call" +#~ msgstr "Позив" + +#~ msgid "File Transfer" +#~ msgstr "Пренос датотека" + +#~ msgid "Chat" +#~ msgstr "Ћаскање" + +#~ msgid "Unmute" +#~ msgstr "Укључи тон" + +#~ msgid "Mute" +#~ msgstr "Утишај" + +#~ msgid "Invitation to %s" +#~ msgstr "Позивница за „%s“" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s вас позива да се придружите „%s“" + +#~ msgid "Decline" +#~ msgstr "Одбиј" + +#~ msgid "Accept" +#~ msgstr "Прихвати" + +#~ msgid "Video call from %s" +#~ msgstr "%s вам је упутио видео позив" + +#~ msgid "Call from %s" +#~ msgstr "%s вас зове" + +#~ msgid "Answer" +#~ msgstr "Одговори" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s вам шаље „%s“" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s тражи одобрење да види када сте на вези" + +#~ msgid "Authentication failed" +#~ msgstr "Потврђивање идентитета није успело" + +#~ msgid "Encryption error" +#~ msgstr "Грешка шифровања" + +#~ msgid "Certificate not provided" +#~ msgstr "Уверење није прослеђено" + +#~ msgid "Certificate untrusted" +#~ msgstr "Уверење није поверљиво" + +#~ msgid "Certificate expired" +#~ msgstr "Уверење је истекло" + +#~ msgid "Certificate not activated" +#~ msgstr "Уверење није активирано" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Назив домаћина уверења се не поклапа" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Отисак уверења се не поклапа" + +#~ msgid "Certificate self-signed" +#~ msgstr "Уверење је самопотписано" + +#~ msgid "Status is set to offline" +#~ msgstr "Стање је постављено на „неповезан“" + +#~ msgid "Certificate is invalid" +#~ msgstr "Уверење није исправно" + +#~ msgid "Connection has been refused" +#~ msgstr "Веза је одбијена" + +#~ msgid "Connection can't be established" +#~ msgstr "Веза не може бити успостављена" + +#~ msgid "Connection has been lost" +#~ msgstr "Веза је изгубљена" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Овај налог је већ повезан са сервером" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Веза је замењена новом везом користећи исти ресурс" + +#~ msgid "The account already exists on the server" +#~ msgstr "Овај налог већ постоји на серверу" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Сервер је тренутно превише заузет да би руковао везом" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Уверење је опозвано" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Уверење користи несигуран алгоритам шифровања или је криптографски слабо" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Дужина уверења сервера, или дубина ланца уверења сервера, премашује " +#~ "границе које је задала библиотека шифровања" + +#~ msgid "Internal error" +#~ msgstr "Унутрашња грешка" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Не могу да се повежем са „%s“" + +#~ msgid "View account" +#~ msgstr "Види налог" + +#~ msgid "Open Calendar" +#~ msgstr "Отвори календар" + +#~ msgid "Open" +#~ msgstr "Отвори" + +#~ msgid "Remove" +#~ msgstr "Уклони" + +#~ msgid "Clear Messages" +#~ msgstr "Очисти поруке" + +#~ msgid "Notification Settings" +#~ msgstr "Поставке обавештења" + +#~ msgid "Tray Menu" +#~ msgstr "Изборник фиоке" + +#~ msgid "No Messages" +#~ msgstr "Нема порука" + +#~ msgid "Message Tray" +#~ msgstr "Фиока порука" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Највиши ниво тачности места." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Подешава највећи ниво тачности места коју програми могу да користе. " +#~ "Исправне могућности су „off“ (искључује праћење места), " +#~ "„country“ (држава), „city“ (град), „neighborhood“ (комшилук), " +#~ "„street“ (улица), и „exact“ (тачно — обично захтева ГПС пријемник). " +#~ "Имајте на уму да ће ово одлучити шта ће „Гео индиција“ дозволити " +#~ "програмима само да виде и да могу пронаћи корисниково место на своју руку " +#~ "користећи изворишта мреже (мада са тачношћу на нивоу улице у најбољем " +#~ "случају)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Распоред дугмића на траци наслова" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Овај кључ превазилази кључ у „org.gnome.desktop.wm.preferences“ када " +#~ "покреће Гномову шкољку." + +#~ msgid "Extension" +#~ msgstr "Проширење" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Изаберите проширење за подешавање користећи прозорче за избор." + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Списак категорија које треба да буду приказане као фасцикле" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Назив сваке категорије на списку ће бити представљен као фасцикла у " +#~ "прегледу програма, уместо да буде приказан непосредно у главном прегледу." + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, у %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d. %B у %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d. %B %Y. у %H:%M" + +#~ msgid "Authorization request from %s" +#~ msgstr "Захтев за овлашћење са „%s“" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Уређај „%s“ жели да се упари са овим рачунаром" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Уређај „%s“ жели приступ услузи „%s“" + +#~ msgid "Grant this time only" +#~ msgstr "Одобри само овај пут" + +#~ msgid "Reject" +#~ msgstr "Одбиј" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Упарујем потврду за „%s“" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Молим потврдите да ли се пропусни кључ „%06d“ подудара са оним на уређају." + +#~ msgid "Matches" +#~ msgstr "Подудара се" + +#~ msgid "Does not match" +#~ msgstr "Не подудара се" + +#~ msgid "Pairing request for %s" +#~ msgstr "Захтев за упаривање за „%s“" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Молим унесите ПИН назначен на уређају." + +#~ msgid "OK" +#~ msgstr "У реду" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Извините, данас за вас нема мудрости:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Пророк је рекао %s" diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..3efe097 --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,2641 @@ +# Serbian translation for gnome-shell. +# Courtesy of Prevod.org team (http://prevod.org/) -- 2010—2017. +# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Translators: +# Miloš Popović , 2010—2011. +# Miroslav Nikolić , 2011—2017. +# Marko M. Kostić , 2016. +# Borisav Živanović , 2017—2018. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2018-02-19 12:41+0000\n" +"PO-Revision-Date: 2018-02-19 18:00+0100\n" +"Last-Translator: Borisav Živanović \n" +"Language-Team: srpski \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" +"X-Poedit-Bookmarks: -1,167,-1,-1,-1,-1,-1,-1,-1,-1\n" +"X-Generator: Poedit 2.0.4\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistem" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Prikažite spisak obaveštenja" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Postavite u žižu aktivno obaveštenje" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Prikaži pregled" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Prikaži sve programe" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Otvorite izbornik programa" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "Proširenja školjke" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Podesite proširenja Gnomove školjke" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Gnomova školjka" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Upravnik prozorima i pokretač programa" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Uključuje alate korisne programerima i testerima iz „Alt-F2“ prozorčeta" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Dozvoljava pristup unutrašnjem otklanjanju grešaka i alatima za praćenje " +"korišćenjem „Alt-F2“ prozorčeta." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "JUIB-ovi proširenja za uključivanje" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Proširenja Gnomove školjke imaju JUIB vrednost; ovaj ključ ispisuje proširenja " +"koja treba učitavati. Svako proširenje koje želi biti učitano mora biti na " +"spisku. Takođe možete da upravljate ovim spiskom koristeći načine D-" +"magistrale „Uključi proširenje“ i „Isključi proširenje“ na „org.gnome.Shell“." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Isključuje korisnička proširenja" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Isključuje sva proširenja koja je uključio korisnik bez delovanja na podešavanje " +"„enabled-extension“." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Isključuje potvrđivanje saglasnosti izdanja proširenja" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Gnomova školjka će učitati samo proširenja koja tvrde da podržavaju tekuće " +"pokrenuto izdanje. Uključivanje ove opcije će isključiti ovu proveru i pokušati " +"da učita proširenja bez obzira na izdanja koja tvrde da podržavaju." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Spisak IB datoteka radne površine sa omiljenim programima" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programi koji odgovaraju ovim odrednicama se prikazuju unutar oblasti " +"omiljenih programima." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Pregled izbirača programa" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Popis trenutno izabranog pregleda u izbiraču programa." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Istorijat prozorčeta (Alt-F2) naredbi" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Istorijat prozorčeta ogledala" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Uvek prikazuje stavku izbornika „Odjavi me“ u izborniku korisnika." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Ovaj ključ prevazilazi samostalno skrivanje stavke izbornika „Odjavi me“ u " +"slučaju jednog korisnika, jedne sesije." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Da li će biti zapamćena lozinka za kačenje šifrovanih ili udaljenih sistema " +"datoteka" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Školjka će zatražiti lozinku kada se prikači šifrovani uređaj ili udaljeni " +"sistem datoteka. Ako lozinka može biti sačuvana za daljnju upotrebu biće " +"prisutno polje za izbor „Zapamti lozinku“. Ovaj ključ podešava osnovno stanje " +"polja za izbor." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Da li je osnovni adapter blututa podesio njemu pridružene uređaje" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Školjka će prikazati stavku izbornika blututa samo ako je adapter blututa " +"upaljen, ili ako ima podešenih uređaja pridruženih osnovnom adapteru. Ovo će " +"se vratiti na početno stanje ako se ustanovi da osnovni adapter nema njemu " +"pridruženih uređaja." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Prečica za otvaranje izbornika programa" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Prečica za otvaranje izbornika programa." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Prečica za otvaranje pregleda „Prikaži programe“" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Prečica za otvaranje pregleda „Prikaži programe“ u pregledu aktivnosti." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Prečica za otvaranje pregleda" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Prečica za otvaranje pregleda aktivnosti." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Prečica za okidanje vidljivosti spiska obaveštenja" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Prečica za okidanje vidljivosti spiska obaveštenja." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Prečica za postavljanje u žižu radnog obaveštenja" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Prečica za postavljanje u žižu radnog obaveštenja." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Sveza tastera koja pauzira i nastavlja sve pokrenute blizance, za svrhe " +"pročišćavanja" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Koja će tastatura biti korišćena" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Vrsta tastature za upotrebu." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Ograničava prebacivača na tekući radni prostor." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Ako je izabrano, samo programi koji imaju prozore na tekućem radnom prostoru " +"se prikazuju u prebacivaču. U suprotnom, svi programi su uključeni." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Režim ikonice programa." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Podešava način prikazivanja prozora u prebacivaču. Ispravne mogućnosti su " +"„thumbnail-only“ (prikazuje sličicu prozora), „app-icon-only“ (prikazuje " +"samo ikonicu programa) ili „both“ (oba)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Ako je izabrano, samo prozori sa tekućeg radnog prostora se prikazuju u " +"prebacivaču. U suprotnom, svi prozori su uključeni." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Prikačinje prozorče roditeljskom prozoru" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Ovaj ključ prevazilazi ključ u „org.gnome.mutter“ kada pokreće Gnomovu školjku." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Uključuje popločavanje ivice prilikom otpuštanja prozora na ivicama ekrana" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Radnim prostorima se upravlja dinamički" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Radni prostori samo na primarnom monitoru" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Zastoj prvog plana se menja u režimu miša dok se pokazivač ne zaustavi" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Mrežna prijava" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Došlo je do greške pri učitavanju prozorčeta postavki za „%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:925 +msgid "Cancel" +msgstr "Otkaži" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "Dalje" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Otključaj" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "Prijavi me" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "Izaberi sesiju" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "Nije na spisku?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(npr., korisnik ili %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Korisnik: " + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "Prozor za prijavljivanje" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "Greška potvrđivanja identiteta" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +msgid "(or swipe finger)" +msgstr "(ili prevucite prst)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +msgctxt "search-result" +msgid "Power Off" +msgstr "Isključi" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"power off;shutdown;isključi;ugasi;gašenje;isključi;ugasi;gašenje;iskljuci;" +"gasenje;reboot;restart;ponovo;pokreni;ponovo;pokreni;restart" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Zaključaj ekran" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +msgid "lock screen" +msgstr "zaključaj ekran" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +msgctxt "search-result" +msgid "Log Out" +msgstr "Odjavi me" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "izađi;odjavi se;odloguj se;izađi;odjavi se;odloguj se;izadji;" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +msgctxt "search-result" +msgid "Suspend" +msgstr "Obustavi" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +msgid "suspend;sleep" +msgstr "suspend;sleep;obustavi;spavaj;suspenduj;obustavi;spavaj;suspenduj;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:127 +msgctxt "search-result" +msgid "Switch User" +msgstr "Promeni korisnika" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:130 +msgid "switch user" +msgstr "switch user;promeni korisnika;promeni korisnika" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:134 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Zaključaj okretanje ekrana" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:137 +msgid "lock orientation;screen;rotation" +msgstr "" +"lock orientation;screen;rotation;zaključaj okretanje ekrana;zaključaj " +"orijentaciju;zaključaj okretanje ekrana;zaključaj orijentaciju;zakljucaj " +"okretanje ekrana;ekran;ekran;okretanje;okretanje" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Naredba nije nađena" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Ne mogu da obradim naredbu:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Nije uspelo izvršavanje „%s“:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Upravo sada" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "Pre %d minut" +msgstr[1] "Pre %d minuta" +msgstr[2] "Pre %d minuta" +msgstr[3] "Pre jedan minut" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "Pre %d sat" +msgstr[1] "Pre %d sata" +msgstr[2] "Pre %d sati" +msgstr[3] "Pre jedan sat" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Juče" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "Pre %d dan" +msgstr[1] "Pre %d dana" +msgstr[2] "Pre %d dana" +msgstr[3] "Pre jedan dan" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "Pre %d nedelju" +msgstr[1] "Pre %d nedelje" +msgstr[2] "Pre %d nedelja" +msgstr[3] "Pre nedelju dana" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "Pre %d mesec" +msgstr[1] "Pre %d meseca" +msgstr[2] "Pre %d meseci" +msgstr[3] "Pre mesec dana" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "Pre %d godinu" +msgstr[1] "Pre %d godine" +msgstr[2] "Pre %d godina" +msgstr[3] "Pre godinu dana" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Juče, %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d. %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d. %B %Y., %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Juče, %l:%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d. %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d .%B %Y., %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "Prijava na vruću tačku" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Vaša veza sa ovom prijavom vruće tačke nije bezbedna. Ljudi u blizini mogu " +"videti lozinke ili druge podatke koje budete uneli na ovoj stranici." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "Zabrani pristup" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "Dozvoli pristup" + +#: js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "Često korišćeni programi će se pojaviti ovde" + +#: js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "Često" + +#: js/ui/appDisplay.js:937 +msgid "All" +msgstr "Sve" + +#: js/ui/appDisplay.js:1919 +msgid "New Window" +msgstr "Novi prozor" + +#: js/ui/appDisplay.js:1933 +msgid "Launch using Dedicated Graphics Card" +msgstr "Pokreni sa namenjenom grafičkom karticom" + +#: js/ui/appDisplay.js:1960 js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "Ukloni iz omiljenih" + +#: js/ui/appDisplay.js:1966 +msgid "Add to Favorites" +msgstr "Dodaj u omiljene" + +#: js/ui/appDisplay.js:1976 +msgid "Show Details" +msgstr "Prikaži detalje" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "„%s“ je dodat među omiljene." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "„%s“ je uklonjen iz omiljenih." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Izaberite zvučni uređaj" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Podešavanja zvuka" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Slušalice" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Slušalice sa mikrofonom" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Izmeni pozadinu…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Podešavanja prikaza" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:265 +msgid "Settings" +msgstr "Podešavanja" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:44 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:73 +msgctxt "grid sunday" +msgid "S" +msgstr "N" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:75 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:77 +msgctxt "grid tuesday" +msgid "T" +msgstr "U" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:79 +msgctxt "grid wednesday" +msgid "W" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:81 +msgctxt "grid thursday" +msgid "T" +msgstr "Č" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:83 +msgctxt "grid friday" +msgid "F" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:85 +msgctxt "grid saturday" +msgid "S" +msgstr "S" + +#. * +#. * 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 "%OB %Y" + +#: js/ui/calendar.js:449 +msgid "Previous month" +msgstr "Prethodni mesec" + +#: js/ui/calendar.js:459 +msgid "Next month" +msgstr "Sledeći mesec" + +#: js/ui/calendar.js:612 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:667 +msgid "Week %V" +msgstr "Sedmica %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:736 +msgctxt "event list time" +msgid "All Day" +msgstr "Ceo dan" + +#: js/ui/calendar.js:869 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/calendar.js:873 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %d. %B %Y." + +#: js/ui/calendar.js:1093 +msgid "No Notifications" +msgstr "Bez obaveštenja" + +#: js/ui/calendar.js:1096 +msgid "No Events" +msgstr "Bez događaja" + +#: js/ui/calendar.js:1124 +msgid "Clear All" +msgstr "Očisti sve" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +msgid "“%s” is not responding." +msgstr "„%s“ ne odgovara." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Možete izabrati da sačekate koji trenutak da nastavi ili da primorate " +"program da se čitav zatvori." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Primoraj izlaz" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Sačekaj" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Spoljni uređaj je priključen" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Spoljni uređaj je isključen" + +#: js/ui/components/autorunManager.js:358 +#, javascript-format +msgid "Open with %s" +msgstr "Otvori programom %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "Lozinka:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Upišite ponovo:" + +#: 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 "Poveži se" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Lozinka: " + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Ključ: " + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Identitet: " + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Lozinka privatnog ključa: " + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Usluga: " + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659 +msgid "Authentication required by wireless network" +msgstr "Bežična mreža zahteva potvrđivanje identiteta" + +#: 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 "" +"Potrebne su lozinke ili ključevi šifrovanja za pristup bežičnoj mreži „%s“." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663 +msgid "Wired 802.1X authentication" +msgstr "Potvrđivanje identiteta za žičanu 802.1X vezu" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Naziv mreže: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667 +msgid "DSL authentication" +msgstr "Potvrđivanje identiteta DSL-a" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673 +msgid "PIN code required" +msgstr "Potreban je PIN kôd" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Potreban je PIN kod za povezivanje mobilnog širokopojasnog uređaja" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680 +msgid "Mobile broadband network password" +msgstr "Lozinka mobilne širokopojasne mreže" + +#: 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 "Potrebna je lozinka za povezivanje na „%s“." + +#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1699 +msgid "Network Manager" +msgstr "Upravnik mreže" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "Potrebna je prijava" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "Administrator" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "Potvrdi identitet" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Pogrešili ste! Pokušajte ponovo." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "„%s“ je sada poznat kao „%s“" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Prozori" + +#: js/ui/dash.js:246 js/ui/dash.js:287 +msgid "Show Applications" +msgstr "Prikaži programe" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:445 +msgid "Dash" +msgstr "Polet" + +#. 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:76 +msgid "%B %e %Y" +msgstr "%e. %B %Y." + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:83 +msgid "%A %B %e %Y" +msgstr "%A, %e. %B %Y." + +#: js/ui/dateMenu.js:148 +msgid "Add world clocks…" +msgstr "Svetski satovi…" + +#: js/ui/dateMenu.js:149 +msgid "World Clocks" +msgstr "Svetski satovi" + +#: js/ui/dateMenu.js:228 +msgid "Weather" +msgstr "Vremenska prognoza" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:292 +#, javascript-format +msgid "%s all day." +msgstr "%s celog dana." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:298 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, zatim %s kasnije." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:304 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, zatim %s, a kasnije %s." + +#: js/ui/dateMenu.js:315 +msgid "Select a location…" +msgstr "Izaberite mesto…" + +#: js/ui/dateMenu.js:318 +msgid "Loading…" +msgstr "Učitavam…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:324 +#, javascript-format +msgid "Feels like %s." +msgstr "Oseća se kao %s." + +#: js/ui/dateMenu.js:327 +msgid "Go online for weather information" +msgstr "Idite na mrežu za podatke o vremenskoj prognozi." + +#: js/ui/dateMenu.js:329 +msgid "Weather information is currently unavailable" +msgstr "Podaci o vremenskoj prognozi trenutno nisu dostupni." + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Odjavi korisnika „%s“" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Odjavi me" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s će biti odjavljen za %d sekundu." +msgstr[1] "%s će biti odjavljen za %d sekunde." +msgstr[2] "%s će biti odjavljen za %d sekundi." +msgstr[3] "%s će biti odjavljen za %d sekundu." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Bićete odjavljeni za %d sekundu." +msgstr[1] "Bićete odjavljeni za %d sekunde." +msgstr[2] "Bićete odjavljeni za %d sekundi." +msgstr[3] "Bićete odjavljeni za %d sekundu." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Odjavi" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Isključi" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Instaliraj osveženja i isključi" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Računar će se isključiti za %d sekundu." +msgstr[1] "Računar će se isključiti za %d sekunde." +msgstr[2] "Računar će se isključiti za %d sekundi." +msgstr[3] "Računar će se isključiti za %d sekundu." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Instaliraj osveženja softvera na čekanju" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Ponovo pokreni" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Isključi" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Ponovo pokreni" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistem će se ponovo pokrenuti za %d sekundu." +msgstr[1] "Sistem će se ponovo pokrenuti za %d sekunde." +msgstr[2] "Sistem će se ponovo pokrenuti za %d sekundi." +msgstr[3] "Sistem će se ponovo pokrenuti za %d sekundu." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Ponovo pokreni i instaliraj ažuriranja" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sistem će se sam ponovo pokrenuti i instalirati ažuriranja za %d sekundu." +msgstr[1] "" +"Sistem će se sam ponovo pokrenuti i instalirati ažuriranja za %d sekunde." +msgstr[2] "" +"Sistem će se sam ponovo pokrenuti i instalirati ažuriranja za %d sekundi." +msgstr[3] "" +"Sistem će se sam ponovo pokrenuti i instalirati ažuriranja za %d sekundu." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Ponovo pokreni i instaliraj" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Instaliraj i isključi" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Isključi nakon instaliranja osveženja" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Ponovo pokreni i instaliraj nadogradnju" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s će bit instaliran/a nakon ponovnog pokretanja. Instalacija nadogradnje " +"ponekad može da potraje: proverite da li ste napravili rezervu vaših važnih " +"podataka i da li je računar priključen na mrežno napajanje." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Napajate se sa baterije: priključite mrežno napajanje pre instaliranja osveženja." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "Neki programi su zauzeti ili imaju nesačuvani rad." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Drugi korisnici su prijavljeni." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (udaljeno)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (ljuska)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Instaliraj" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Da preuzmem i da instaliram „%s“ sa „extensions.gnome.org“-a?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "„%s“ želi da spreči prečice" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Program želi da spreči prečice" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Možete povratiti prečice pritiskom na „%s“." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Zabrani" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Dozvoli" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned On" +msgstr "Spori tasteri su uključeni" + +#: js/ui/kbdA11yDialog.js:34 +msgid "Slow Keys Turned Off" +msgstr "Spori tasteri su isključeni" + +#: 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 "" +"Upravo ste taster Shift držali pritisnutim 8 sekundi. To uključuje Spore " +"tastere, što utiče na rad tastature." + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned On" +msgstr "Lepljivi tasteri su uključeni" + +#: js/ui/kbdA11yDialog.js:43 +msgid "Sticky Keys Turned Off" +msgstr "Lepljivi tasteri su isključeni" + +#: 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 "" +"Upravo ste pritisnuli taster Shift 5 puta zaredom. To je prečica za Lepljive " +"tastere, što utiče na rad tastature." + +#: 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 "" +"Upravo ste pritisnuli dva tastera istovremeno, ili ste pritisnuli taster " +"Shift 5 puta zaredom. To uključuje Lepljive tastere, što utiče na rad " +"tastature." + +#: js/ui/kbdA11yDialog.js:59 +msgid "Leave On" +msgstr "Ostavi uključeno" + +#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 +#: js/ui/status/network.js:1287 +msgid "Turn On" +msgstr "Uključi" + +#: 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 "Isključi" + +#: js/ui/kbdA11yDialog.js:67 +msgid "Leave Off" +msgstr "Ostavi isključeno" + +#: js/ui/keyboard.js:198 +msgid "Region & Language Settings" +msgstr "Podešavanja regiona i jezika" + +#: js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "Nisu instalirana proširenja" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s nije objavio nikakve greške." + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "Sakrij greške" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "Prikažite greške" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "Uključeno" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Isključeno" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "Greška" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "Izvan datuma" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "Preuzimam" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "Prikaži kod" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "Veb stranica" + +#: js/ui/messageTray.js:1494 +msgid "System Information" +msgstr "Podaci o sistemu" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Nepoznat izvođač" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Nepoznat naslov" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Opozovi" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Pregled" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Upišite tekst za pretragu…" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "Nova prečica…" + +#: js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "Definisani program" + +#: js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "Prikaži pomoć na ekranu" + +#: js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "Promeni monitor" + +#: js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "Dodeli taster" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "Gotovo" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "Uredi…" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "Ništa" + +#: js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "Pritisnite dugme da podesite" + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "Pritisnite „Esc“ da izađete" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "Pritisnite neki taster da izađete" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Izađi" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Aktivnosti" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistem" + +#: js/ui/panel.js:814 +msgid "Top Bar" +msgstr "Gornja traka" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Unesite naredbu" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "Zatvori" + +#: js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "Ponovno pokretanje nije dostupno na Vejlandu" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "Ponovno pokrećem…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %d. %B" + +#: js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nova poruka" +msgstr[1] "%d nove poruke" +msgstr[2] "%d novih poruka" +msgstr[3] "%d nova poruka" + +#: js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d novo obaveštenje" +msgstr[1] "%d nova obaveštenja" +msgstr[2] "%d novih obaveštenja" +msgstr[3] "%d novo obaveštenje" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:284 +msgid "Lock" +msgstr "Zaključaj" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "Gnom mora da zaključa ekran" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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:1311 +msgid "Unable to lock" +msgstr "Ne mogu da zaključam" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1312 +msgid "Lock was blocked by an application" +msgstr "Neki program je blokirao zaključavanje" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "Tražim…" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "Nema odgovarajućih rezultata." + +#: js/ui/search.js:777 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "Još %d" +msgstr[1] "Još %d" +msgstr[2] "Još %d" +msgstr[3] "Još jedan" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Umnoži" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Ubaci" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Prikaži tekst" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Sakrij tekst" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "Lozinka" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "Zapamti lozinku" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Pristupačnost" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Zumiraj" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Čitač ekrana" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Tastatura na ekranu" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Vizuelna upozorenja" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Lepljivi tasteri" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Spori tasteri" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Odskočni tasteri" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Tasteri miša" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Veliki kontrast" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Veliki tekst" + +#: js/ui/status/bluetooth.js:48 +msgid "Bluetooth" +msgstr "Blutut" + +#: js/ui/status/bluetooth.js:57 js/ui/status/network.js:616 +msgid "Bluetooth Settings" +msgstr "Podešavanja Blututa" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:137 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d povezan" +msgstr[1] "%d povezana" +msgstr[2] "%d povezano" +msgstr[3] "%d povezan" + +#: js/ui/status/bluetooth.js:139 +msgid "Off" +msgstr "Isklj." + +#: js/ui/status/bluetooth.js:141 +msgid "On" +msgstr "Uključeno" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Osvetljenost" + +#: js/ui/status/keyboard.js:783 +msgid "Keyboard" +msgstr "Tastatura" + +#: js/ui/status/keyboard.js:806 +msgid "Show Keyboard Layout" +msgstr "Pokaži raspored tastature" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Lokacija je omogućena" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Isključi" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Podešavanja privatnosti" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Koristi lokaciju" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Ne koristi lokaciju" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Uključi" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Da li da „%s“ dam pristup vašem mestu?" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Pristup mestu možete da izmenite u bilo koje vreme u podešavanjima " +"privatnosti." + +#: js/ui/status/network.js:90 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:443 js/ui/status/network.js:1316 +#, javascript-format +msgid "%s Off" +msgstr "%s isključeno" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:446 +#, javascript-format +msgid "%s Connected" +msgstr "%s povezano" + +#. 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:451 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s neupravljano" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s prekidanje veze u toku" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:461 js/ui/status/network.js:1308 +#, javascript-format +msgid "%s Connecting" +msgstr "%s povezivanje u toku" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:464 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s zahteva prijavu" + +#. 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:472 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Nedostaje firmver za %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:476 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s nedostupno" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:479 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s povezivanje neuspešno" + +#: js/ui/status/network.js:495 +msgid "Wired Settings" +msgstr "Podešavanja žičane veze" + +#: js/ui/status/network.js:537 +msgid "Mobile Broadband Settings" +msgstr "Podešavanja mobilne širokopojasne veze" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:580 js/ui/status/network.js:1313 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s uređaj isključen" + +#. 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:584 +#, javascript-format +msgid "%s Disabled" +msgstr "%s isključeno" + +#: js/ui/status/network.js:624 +msgid "Connect to Internet" +msgstr "Poveži se na Internet" + +#: js/ui/status/network.js:822 +msgid "Airplane Mode is On" +msgstr "Avionski režim rada je uključen" + +#: js/ui/status/network.js:823 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Bežična veza je isključena kada je uključen avionski režim rada." + +#: js/ui/status/network.js:824 +msgid "Turn Off Airplane Mode" +msgstr "Isključi avionski režim rada" + +#: js/ui/status/network.js:833 +msgid "Wi-Fi is Off" +msgstr "Bežična veza je isključena" + +#: js/ui/status/network.js:834 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Bežična veza treba biti uključena da biste se povezali na mrežu." + +#: js/ui/status/network.js:835 +msgid "Turn On Wi-Fi" +msgstr "Uključi bežičnu vezu" + +#: js/ui/status/network.js:860 +msgid "Wi-Fi Networks" +msgstr "Bežične mreže" + +#: js/ui/status/network.js:862 +msgid "Select a network" +msgstr "Izaberite mrežu" + +#: js/ui/status/network.js:892 +msgid "No Networks" +msgstr "Nema mreža" + +#: js/ui/status/network.js:913 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Koristi fizički prekidač za isključivanje" + +#: js/ui/status/network.js:1179 +msgid "Select Network" +msgstr "Izaberi mrežu" + +#: js/ui/status/network.js:1185 +msgid "Wi-Fi Settings" +msgstr "Podešavanja bežične veze" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1304 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s hotspot uključen" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1319 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s nepovezano" + +#: js/ui/status/network.js:1419 +msgid "connecting…" +msgstr "povezujem se…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1422 +msgid "authentication required" +msgstr "potrebna je prijava" + +#: js/ui/status/network.js:1424 +msgid "connection failed" +msgstr "povezivanje nije uspelo" + +#: js/ui/status/network.js:1478 +msgid "VPN Settings" +msgstr "VPN podešavanja" + +#: js/ui/status/network.js:1491 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1501 +msgid "VPN Off" +msgstr "Isključi VPN" + +#: js/ui/status/network.js:1565 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Podešavanja mreže" + +#: js/ui/status/network.js:1596 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s žičana veza" +msgstr[1] "%s žičane veze" +msgstr[2] "%s žičanih veza" +msgstr[3] "%s žičana veza" + +#: js/ui/status/network.js:1600 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s bežična veza" +msgstr[1] "%s bežične veze" +msgstr[2] "%s bežičnih veza" +msgstr[3] "%s bežična veza" + +#: js/ui/status/network.js:1604 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemska veza" +msgstr[1] "%s modemske veze" +msgstr[2] "%s modemskih veza" +msgstr[3] "%s modemska veza" + +#: js/ui/status/network.js:1738 +msgid "Connection failed" +msgstr "Povezivanje nije uspelo" + +#: js/ui/status/network.js:1739 +msgid "Activation of network connection failed" +msgstr "Aktiviranje mrežne veze nije uspelo" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "Noćno svetlo ne radi" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Noćno svetlo radi" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Nastavi" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Isključi do sutra" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Podešavanja napajanja" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Potpuno puna" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Proračunavam…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Do prazne: %d:%02d (%d %%)" + +# Kratak prevod da bi se videlo vreme i procenat napunjenosti u sistemskom meniju Gnomove školjke. +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Do pune: %d:%02d (%d %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Avio režim uključen" + +#: js/ui/status/system.js:228 +msgid "Switch User" +msgstr "Promeni korisnika" + +#: js/ui/status/system.js:240 +msgid "Log Out" +msgstr "Odjavi me" + +#: js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "Podešavanja naloga" + +#: js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "Katanac okrenutosti" + +#: js/ui/status/system.js:295 +msgid "Suspend" +msgstr "Obustavi" + +#: js/ui/status/system.js:305 +msgid "Power Off" +msgstr "Isključi" + +#: js/ui/status/thunderbolt.js:272 +msgid "Thunderbolt" +msgstr "Tanderbolt" + +#. we are done +#: js/ui/status/thunderbolt.js:330 +msgid "Unknown Thunderbolt device" +msgstr "Nepoznat Tanderbold uređaj" + +#: 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 "" +"Novi uređaj je pronađen dok niste bili tu. Isključite uređaj i ponovo ga " +"povežite da biste počeli da ga koristite." + +#: js/ui/status/thunderbolt.js:336 +msgid "Thunderbolt authorization error" +msgstr "Greška u ovlašćivanju Tanderbolta" + +#: js/ui/status/thunderbolt.js:337 +#, javascript-format +msgid "Could not authorize the thunderbolt device: %s" +msgstr "Ne mogu da ovlastim tanderbolt uređaj: %s" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "Promena jačine zvuka" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Jačina zvuka" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Mirror" +msgstr "Preslikaj" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Spoji ekrane" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Samo spoljni" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Samo ugrađeni" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Prijavite se kao drugi korisnik" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Otključaj prozor" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Programi" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Traži" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "„%s“ je spreman" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Da li želite da zadržite ova podešavanja ekrana?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Vrati podešavanja" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Zadrži izmene" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Izmene podešavanja će biti vraćene za %d sekundu" +msgstr[1] "Izmene podešavanja će biti vraćene za %d sekunde" +msgstr[2] "Izmene podešavanja će biti vraćene za %d sekundi" +msgstr[3] "Izmene podešavanja će biti vraćene za %d sekundu" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Umanji" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Poništi uvećanje" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Uvećaj" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Premesti" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Promeni veličinu" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Premesti traku naslova na ekran" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Drži iznad ostalih" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Prikaži na svim radnim prostorima" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Premesti na levi radni prostor" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "Premesti na desni radni prostor" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "Premesti na radni prostor gore" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "Premesti na radni prostor dole" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Premesti na gornji radni prostor" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Premesti na donji radni prostor" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "Premesti ekran ulevo" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "Premesti ekran udesno" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Kalendar Evolucije" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:432 +msgid "Print version" +msgstr "Ispisuje izdanje" + +#: src/main.c:438 +msgid "Mode used by GDM for login screen" +msgstr "Koji režim koristi GDM za ekran prijavljivanja" + +#: src/main.c:444 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Koristi naročit režim, npr. „gdm“ za ekran prijavljivanja" + +#: src/main.c:450 +msgid "List possible modes" +msgstr "Ispisuje moguće režime" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Nepoznat" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Nisam uspeo da pokrenem „%s“" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Lozinke se ne podudaraju." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Lozinka ne može biti prazna" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Korisnik je odbacio prozorče za potvrđivanje identiteta" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u izlaz" +msgstr[1] "%u izlaza" +msgstr[2] "%u izlaza" +msgstr[3] "%u izlaz" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ulaz" +msgstr[1] "%u ulaza" +msgstr[2] "%u ulaza" +msgstr[3] "%u ulaz" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sistemski zvuci" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Isključi" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Odjavi me" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Promeni korisnika" + +#~ msgid "Hide tray" +#~ msgstr "Sakrij kasetu" + +#~ msgid "Status Icons" +#~ msgstr "Ikonice stanja" + +#~ msgid "Events" +#~ msgstr "Događaji" + +#~ msgid "Notifications" +#~ msgstr "Obaveštenja" + +#~ msgid "Clear section" +#~ msgstr "Očisti odeljak" + +#~ msgid "Media" +#~ msgstr "Mediji" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Postavke proširenja Gnomove školjke" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Preusmeravanje potvrđivanja identiteta vebom" + +#~ msgid "Not In Use" +#~ msgstr "Nije u upotrebi" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Prikazuje dan u nedelji u kalendaru" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Ako je izabrano, prikazuje ISO dan u nedelji u kalendaru." + +#~ msgid "Use as Internet connection" +#~ msgstr "Koristi kao Internet vezu" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "„%s“ zahteva pristup vašem mestu." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Gnomova školjka (vajland sastavljač)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d priključeni uređaj" +#~ msgstr[1] "%d priključena uređaja" +#~ msgstr[2] "%d priključenih uređaja" +#~ msgstr[3] "%d priključeni uređaj" + +#~ msgid "Authentication required" +#~ msgstr "Potrebno je potvrđivanje identiteta" + +#~ msgid "UPS" +#~ msgstr "Rezervno napajanje" + +#~ msgid "Battery" +#~ msgstr "Baterija" + +#~ msgid "Airplane Mode" +#~ msgstr "Režim u avionu" + +#~ msgid "Show the message tray" +#~ msgstr "Prikažite fioku poruka" + +#~ msgid "Captive Portal" +#~ msgstr "Portal stopke" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Ned" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Pon" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Uto" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Sre" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Čet" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Pet" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Sub" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Ništa planirano" + +#~ msgid "Today" +#~ msgstr "Danas" + +#~ msgid "Tomorrow" +#~ msgstr "Sutra" + +#~ msgid "This week" +#~ msgstr "Ove nedelje" + +#~ msgid "Next week" +#~ msgstr "Sledeće nedelje" + +#~ msgid "Removable Devices" +#~ msgstr "Uklonjivi uređaji" + +#~ msgid "Eject" +#~ msgstr "Izbaci" + +#~ msgid "Invitation" +#~ msgstr "Pozivnica" + +#~ msgid "Call" +#~ msgstr "Poziv" + +#~ msgid "File Transfer" +#~ msgstr "Prenos datoteka" + +#~ msgid "Chat" +#~ msgstr "Ćaskanje" + +#~ msgid "Unmute" +#~ msgstr "Uključi ton" + +#~ msgid "Mute" +#~ msgstr "Utišaj" + +#~ msgid "Invitation to %s" +#~ msgstr "Pozivnica za „%s“" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s vas poziva da se pridružite „%s“" + +#~ msgid "Decline" +#~ msgstr "Odbij" + +#~ msgid "Accept" +#~ msgstr "Prihvati" + +#~ msgid "Video call from %s" +#~ msgstr "%s vam je uputio video poziv" + +#~ msgid "Call from %s" +#~ msgstr "%s vas zove" + +#~ msgid "Answer" +#~ msgstr "Odgovori" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s vam šalje „%s“" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s traži odobrenje da vidi kada ste na vezi" + +#~ msgid "Authentication failed" +#~ msgstr "Potvrđivanje identiteta nije uspelo" + +#~ msgid "Encryption error" +#~ msgstr "Greška šifrovanja" + +#~ msgid "Certificate not provided" +#~ msgstr "Uverenje nije prosleđeno" + +#~ msgid "Certificate untrusted" +#~ msgstr "Uverenje nije poverljivo" + +#~ msgid "Certificate expired" +#~ msgstr "Uverenje je isteklo" + +#~ msgid "Certificate not activated" +#~ msgstr "Uverenje nije aktivirano" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Naziv domaćina uverenja se ne poklapa" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Otisak uverenja se ne poklapa" + +#~ msgid "Certificate self-signed" +#~ msgstr "Uverenje je samopotpisano" + +#~ msgid "Status is set to offline" +#~ msgstr "Stanje je postavljeno na „nepovezan“" + +#~ msgid "Certificate is invalid" +#~ msgstr "Uverenje nije ispravno" + +#~ msgid "Connection has been refused" +#~ msgstr "Veza je odbijena" + +#~ msgid "Connection can't be established" +#~ msgstr "Veza ne može biti uspostavljena" + +#~ msgid "Connection has been lost" +#~ msgstr "Veza je izgubljena" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Ovaj nalog je već povezan sa serverom" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Veza je zamenjena novom vezom koristeći isti resurs" + +#~ msgid "The account already exists on the server" +#~ msgstr "Ovaj nalog već postoji na serveru" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Server je trenutno previše zauzet da bi rukovao vezom" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Uverenje je opozvano" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Uverenje koristi nesiguran algoritam šifrovanja ili je kriptografski slabo" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Dužina uverenja servera, ili dubina lanca uverenja servera, premašuje " +#~ "granice koje je zadala biblioteka šifrovanja" + +#~ msgid "Internal error" +#~ msgstr "Unutrašnja greška" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Ne mogu da se povežem sa „%s“" + +#~ msgid "View account" +#~ msgstr "Vidi nalog" + +#~ msgid "Open Calendar" +#~ msgstr "Otvori kalendar" + +#~ msgid "Open" +#~ msgstr "Otvori" + +#~ msgid "Remove" +#~ msgstr "Ukloni" + +#~ msgid "Clear Messages" +#~ msgstr "Očisti poruke" + +#~ msgid "Notification Settings" +#~ msgstr "Postavke obaveštenja" + +#~ msgid "Tray Menu" +#~ msgstr "Izbornik fioke" + +#~ msgid "No Messages" +#~ msgstr "Nema poruka" + +#~ msgid "Message Tray" +#~ msgstr "Fioka poruka" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Najviši nivo tačnosti mesta." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Podešava najveći nivo tačnosti mesta koju programi mogu da koriste. " +#~ "Ispravne mogućnosti su „off“ (isključuje praćenje mesta), " +#~ "„country“ (država), „city“ (grad), „neighborhood“ (komšiluk), " +#~ "„street“ (ulica), i „exact“ (tačno — obično zahteva GPS prijemnik). " +#~ "Imajte na umu da će ovo odlučiti šta će „Geo indicija“ dozvoliti " +#~ "programima samo da vide i da mogu pronaći korisnikovo mesto na svoju ruku " +#~ "koristeći izvorišta mreže (mada sa tačnošću na nivou ulice u najboljem " +#~ "slučaju)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Raspored dugmića na traci naslova" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Ovaj ključ prevazilazi ključ u „org.gnome.desktop.wm.preferences“ kada " +#~ "pokreće Gnomovu školjku." + +#~ msgid "Extension" +#~ msgstr "Proširenje" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Izaberite proširenje za podešavanje koristeći prozorče za izbor." + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Spisak kategorija koje treba da budu prikazane kao fascikle" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Naziv svake kategorije na spisku će biti predstavljen kao fascikla u " +#~ "pregledu programa, umesto da bude prikazan neposredno u glavnom pregledu." + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, u %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d. %B u %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%d. %B %Y. u %H:%M" + +#~ msgid "Authorization request from %s" +#~ msgstr "Zahtev za ovlašćenje sa „%s“" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Uređaj „%s“ želi da se upari sa ovim računarom" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Uređaj „%s“ želi pristup usluzi „%s“" + +#~ msgid "Grant this time only" +#~ msgstr "Odobri samo ovaj put" + +#~ msgid "Reject" +#~ msgstr "Odbij" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Uparujem potvrdu za „%s“" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Molim potvrdite da li se propusni ključ „%06d“ podudara sa onim na uređaju." + +#~ msgid "Matches" +#~ msgstr "Podudara se" + +#~ msgid "Does not match" +#~ msgstr "Ne podudara se" + +#~ msgid "Pairing request for %s" +#~ msgstr "Zahtev za uparivanje za „%s“" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Molim unesite PIN naznačen na uređaju." + +#~ msgid "OK" +#~ msgstr "U redu" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Izvinite, danas za vas nema mudrosti:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Prorok je rekao %s" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..e69d0de --- /dev/null +++ b/po/sv.po @@ -0,0 +1,2381 @@ +# Swedish translation for gnome-shell. +# Copyright © 2009-2019 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Daniel Nylander , 2009, 2010, 2011, 2012. +# Marcus Lundblad , 2014. +# Åke Engelbrektson , 2014. +# Anders Jonsson , 2015, 2016, 2017, 2018, 2019. +# Sebastian Rasmussen , 2015, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-09 10:41+0000\n" +"PO-Revision-Date: 2019-02-11 18:57+0100\n" +"Last-Translator: Anders Jonsson \n" +"Language-Team: Swedish \n" +"Language: sv\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.2.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "System" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Visa aviseringslistan" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Fokusera den aktiva aviseringen" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Visa översiktsvyn" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Visa alla program" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Öppna programmenyn" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:221 +msgid "Shell Extensions" +msgstr "Skaltillägg" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Konfigurera tillägg för GNOME-skal" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME-skal" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Fönsterhantering och uppstart av program" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Aktivera interna verktyg användbara för utvecklare och testare från Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Tillåter åtkomst till interna verktyg för felsökning och övervakning med " +"dialogen Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "UUID:er för tillägg att aktivera" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Tillägg för GNOME-skal har en UUID-egenskap; denna nyckel listar tillägg som " +"ska läsas in. De tillägg som vill bli inlästa måste finnas i denna lista. Du " +"kan även ändra denna lista med D-Bus-metoderna EnableExtension och " +"DisableExtension på org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Inaktivera användartillägg" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Inaktivera alla tillägg som användaren har aktiverat, utan att påverka " +"inställningen ”enabled-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Slår av valideringen av versionskompatibilitet för tillägg" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME-skalet kommer endast att läsa in tillägg som säger sig stödja den " +"nuvarande körande versionen. Att slå på denna inställning medför att den " +"kontrollen slås av och alla tillägg kommer att försöka läsas in, oavsett " +"vilken version de säger sig stödja." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Lista över skrivbordsfil-id för favoritprogram" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Programmen som motsvarar dessa identifierare kommer att visas i " +"favoritområdet." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Programväljarvy" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Index för den valda vyn i applikationsväljaren." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Historik för kommandodialog (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Historik för spegeldialogen" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Visa alltid menyalternativet ”Logga ut” i användarmenyn." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Denna nyckel åsidosätter det automatiska gömmandet av menyalternativet " +"”Logga ut” i situationer med endast en användare och en session." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Huruvida lösenord för krypterade enheter och fjärrenheter skall memoreras" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Skalet kommer att fråga efter ett lösenord när en krypterad enhet eller en " +"fjärrenhet monteras. Om lösenordet kan sparas för framtida bruk kommer en " +"”Kom ihåg lösenord”-kryssruta att visas. Denna nyckel sätter standardvärdet " +"för kryssrutan." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Huruvida standardadaptern för Bluetooth har enheter associerade med sig" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Skalet kommer bara att visa ett Bluetooth-menyalternativ om en Bluetooth-" +"adapter är strömsatt, eller om enheter ställts in som associerats med " +"standardadaptern. Detta kommer att återställas om standardadaptern någonsin " +"ses utan att ha enheter associerade med sig." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Aktivera introspektions-API" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Aktiverar ett D-Bus-API som tillåter introspektion av programtillståndet för " +"skalet." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Snabbtangent för att öppna programmenyn" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Snabbtangent för att öppna programmenyn." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Snabbtangent för att öppna ”Visa program”-vyn" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Snabbtangent för att öppna ”Visa program”-vyn i översiktsvyn." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Snabbtangent för att öppna översiktsvyn" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Snabbtangent för att öppna översiktsvyn." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Snabbtangent för att växla synligheten för aviseringslistan" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Snabbtangent för att växla synligheten för aviseringslistan." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Snabbtangent för att fokusera på den aktiva aviseringen" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Snabbtangent för att fokusera på den aktiva aviseringen." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Snabbtangent som pausar och återupptar alla aktiva animeringar (tweens), i " +"felsökningssyfte" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Växla till program 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Växla till program 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Växla till program 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Växla till program 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Växla till program 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Växla till program 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Växla till program 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Växla till program 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Växla till program 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Vilket tangentbord att använda" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Typen av tangentbord att använda." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Begränsa väljare till aktuell arbetsyta." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Om satt till true (sant), visas endast program som har fönster på den " +"aktuella arbetsytan i väljaren. I annat fall inkluderas alla program." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Programikonsläget." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Ställer in hur fönster visas i väljaren. Giltiga alternativ är ”thumbnail-" +"only” (visar en miniatyrbild av fönstret), ”app-icon-only” (visar endast " +"programikonen) eller ”both” (visar båda)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Om satt till \"true\", visas endast fönster från den aktuella arbetsytan i " +"väljaren. I annat fall inkluderas alla fönster." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Fäst modal dialog till föräldrafönstret" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Denna nyckel åsidosätter nyckeln i org.gnome.mutter när GNOME-skalet körs." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Slå på kantdockning när fönster släpps på skärmkanter" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Arbetsytor hanteras dynamiskt" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Arbetsytor endast på primär skärm" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Fördröj fokusändringar i musläge tills pekare slutar röra sig" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Nätverksinloggning" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:121 +msgid "Something’s gone wrong" +msgstr "Något har gått fel" + +#: js/extensionPrefs/main.js:128 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Vi är ledsna, men ett problem har uppstått: inställningarna för detta " +"tillägg kan inte visas. Vi rekommenderar att du rapporterar problemet till " +"tilläggets skapare." + +#: js/extensionPrefs/main.js:135 +msgid "Technical Details" +msgstr "Tekniska detaljer" + +#: js/extensionPrefs/main.js:170 +msgid "Copy Error" +msgstr "Kopiera fel" + +#: js/extensionPrefs/main.js:190 +msgid "Homepage" +msgstr "Webbsida" + +#: js/extensionPrefs/main.js:191 +msgid "Visit extension homepage" +msgstr "Besök webbsida för tillägg" + +#: js/extensionPrefs/main.js:454 +msgid "No Extensions Installed" +msgstr "Inga tillägg installerade" + +#: js/extensionPrefs/main.js:464 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Tillägg kan installeras genom Programvara eller extensions.gnome.org." + +#: js/extensionPrefs/main.js:479 +msgid "Browse in Software" +msgstr "Bläddra i Programvara" + +#: js/gdm/authPrompt.js:144 js/ui/audioDeviceSelection.js:60 +#: js/ui/components/networkAgent.js:125 js/ui/components/polkitAgent.js:146 +#: js/ui/endSessionDialog.js:437 js/ui/extensionDownloader.js:193 +#: js/ui/shellMountOperation.js:330 js/ui/status/network.js:894 +msgid "Cancel" +msgstr "Avbryt" + +#: js/gdm/authPrompt.js:163 js/gdm/authPrompt.js:206 js/gdm/authPrompt.js:438 +msgid "Next" +msgstr "Nästa" + +#: js/gdm/authPrompt.js:202 js/ui/shellMountOperation.js:334 +#: js/ui/unlockDialog.js:55 +msgid "Unlock" +msgstr "Lås upp" + +#: js/gdm/authPrompt.js:204 +msgctxt "button" +msgid "Sign In" +msgstr "Logga in" + +#: js/gdm/loginDialog.js:311 +msgid "Choose Session" +msgstr "Välj session" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:455 +msgid "Not listed?" +msgstr "Inte listad?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:889 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(till exempel användare eller %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:894 js/ui/components/networkAgent.js:251 +#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Användarnamn: " + +#: js/gdm/loginDialog.js:1232 +msgid "Login Window" +msgstr "Inloggningsfönster" + +#: js/gdm/util.js:342 +msgid "Authentication error" +msgstr "Autentiseringsfel" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:482 +msgid "(or swipe finger)" +msgstr "(eller dra fingret)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:94 +msgctxt "search-result" +msgid "Power Off" +msgstr "Stäng av" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:97 +msgid "power off;shutdown;reboot;restart" +msgstr "stäng av;stäng ner;stäng;starta om;omstart" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:101 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Lås skärm" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:104 +msgid "lock screen" +msgstr "lås skärm" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:108 +msgctxt "search-result" +msgid "Log Out" +msgstr "Logga ut" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:111 +msgid "logout;sign off" +msgstr "utloggning;logga ut" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:115 +msgctxt "search-result" +msgid "Suspend" +msgstr "Vänteläge" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:118 +msgid "suspend;sleep" +msgstr "vänteläge;vila" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:122 +msgctxt "search-result" +msgid "Switch User" +msgstr "Växla användare" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:125 +msgid "switch user" +msgstr "växla användare" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:129 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Skärmrotation" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:132 +msgid "lock orientation;screen;rotation" +msgstr "skärmrotation;lås rotation" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Kommandot hittades inte" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Kunde inte tolka kommando:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Körning av ”%s” misslyckades:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Just nu" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d minut sedan" +msgstr[1] "%d minuter sedan" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d timme sedan" +msgstr[1] "%d timmar sedan" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Igår" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d dag sedan" +msgstr[1] "%d dagar sedan" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d vecka sedan" +msgstr[1] "%d veckor sedan" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d månad sedan" +msgstr[1] "%d månader sedan" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d år sedan" +msgstr[1] "%d år sedan" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Igår, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Igår, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %I∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:46 +msgid "Hotspot Login" +msgstr "Surfzonsinloggning" + +#: js/portalHelper/main.js:92 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Din anslutning till denna surfzonsinloggning är inte säker. Lösenord eller " +"annan information som du matar in på denna sida kan visas av andra personer " +"i närheten." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:42 js/ui/status/location.js:364 +msgid "Deny Access" +msgstr "Neka åtkomst" + +#: js/ui/accessDialog.js:43 js/ui/status/location.js:367 +msgid "Grant Access" +msgstr "Bevilja åtkomst" + +#: js/ui/appDisplay.js:671 +msgid "Frequently used applications will appear here" +msgstr "Ofta använda program kommer visas här" + +#: js/ui/appDisplay.js:786 +msgid "Frequent" +msgstr "Ofta använda" + +#: js/ui/appDisplay.js:793 +msgid "All" +msgstr "Alla" + +#: js/ui/appDisplay.js:1748 js/ui/panel.js:93 +msgid "New Window" +msgstr "Nytt fönster" + +#: js/ui/appDisplay.js:1762 +msgid "Launch using Dedicated Graphics Card" +msgstr "Kör med diskret grafikkort" + +#: js/ui/appDisplay.js:1789 js/ui/dash.js:246 +msgid "Remove from Favorites" +msgstr "Ta bort från favoriter" + +#: js/ui/appDisplay.js:1795 +msgid "Add to Favorites" +msgstr "Lägg till som favorit" + +#: js/ui/appDisplay.js:1805 js/ui/panel.js:104 +msgid "Show Details" +msgstr "Visa detaljer" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s har lagts till i dina favoriter." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s har tagits bort från dina favoriter." + +#: js/ui/audioDeviceSelection.js:47 +msgid "Select Audio Device" +msgstr "Välj ljudenhet" + +#: js/ui/audioDeviceSelection.js:58 +msgid "Sound Settings" +msgstr "Ljudinställningar" + +#: js/ui/audioDeviceSelection.js:67 +msgid "Headphones" +msgstr "Hörlurar" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Headset" +msgstr "Mikrofonlur" + +#: js/ui/audioDeviceSelection.js:71 js/ui/status/volume.js:250 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:15 +msgid "Change Background…" +msgstr "Ändra bakgrund…" + +#: js/ui/backgroundMenu.js:17 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Skärminställningar" + +#: js/ui/backgroundMenu.js:18 +msgid "Settings" +msgstr "Inställningar" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:42 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:71 +msgctxt "grid sunday" +msgid "S" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:73 +msgctxt "grid monday" +msgid "M" +msgstr "M" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:75 +msgctxt "grid tuesday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:77 +msgctxt "grid wednesday" +msgid "W" +msgstr "O" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:79 +msgctxt "grid thursday" +msgid "T" +msgstr "T" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:81 +msgctxt "grid friday" +msgid "F" +msgstr "F" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:83 +msgctxt "grid saturday" +msgid "S" +msgstr "L" + +#. * +#. * 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:346 +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:356 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:413 +msgid "Previous month" +msgstr "Föregående månad" + +#: js/ui/calendar.js:424 +msgid "Next month" +msgstr "Nästa månad" + +#: js/ui/calendar.js:578 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:633 +msgid "Week %V" +msgstr "Vecka %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:701 +msgctxt "event list time" +msgid "All Day" +msgstr "Hela dagen" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d %B" + +#: js/ui/calendar.js:837 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d %B, %Y" + +#: js/ui/calendar.js:1060 +msgid "No Notifications" +msgstr "Inga aviseringar" + +#: js/ui/calendar.js:1063 +msgid "No Events" +msgstr "Inga händelser" + +#: js/ui/calendar.js:1089 +msgid "Clear" +msgstr "Töm" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:47 +#, javascript-format +msgid "“%s” is not responding." +msgstr "”%s” svarar inte." + +#: js/ui/closeDialog.js:48 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Du kan välja att vänta en kort stund på att det ska fortsätta eller tvinga " +"programmet att helt avslutas." + +#: js/ui/closeDialog.js:64 +msgid "Force Quit" +msgstr "Tvinga avslut" + +#: js/ui/closeDialog.js:67 +msgid "Wait" +msgstr "Vänta" + +#: js/ui/components/automountManager.js:89 +msgid "External drive connected" +msgstr "Extern disk ansluten" + +#: js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "Extern disk frånkopplad" + +#: js/ui/components/autorunManager.js:335 +#, javascript-format +msgid "Open with %s" +msgstr "Öppna med %s" + +#: js/ui/components/keyring.js:84 js/ui/components/polkitAgent.js:265 +msgid "Password:" +msgstr "Lösenord:" + +#: js/ui/components/keyring.js:115 +msgid "Type again:" +msgstr "Skriv igen:" + +#: js/ui/components/networkAgent.js:110 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Alternativt kan du ansluta genom att trycka på ”WPS”-knappen på din router." + +#: js/ui/components/networkAgent.js:120 js/ui/status/network.js:225 +#: js/ui/status/network.js:315 js/ui/status/network.js:897 +msgid "Connect" +msgstr "Anslut" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:219 js/ui/components/networkAgent.js:231 +#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:273 +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Lösenord: " + +#. static WEP +#: js/ui/components/networkAgent.js:224 +msgid "Key: " +msgstr "Nyckel: " + +#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Lösenord för privat nyckel: " + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Identitet: " + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Tjänst: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:693 +msgid "Authentication required by wireless network" +msgstr "Autentisering krävs av trådlöst nätverk" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:694 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Lösenord eller krypteringsnycklar krävs för att komma åt det trådlösa " +"nätverket ”%s”." + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:697 +msgid "Wired 802.1X authentication" +msgstr "Trådbunden 802.1X-autentisering" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Nätverksnamn: " + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:701 +msgid "DSL authentication" +msgstr "DSL-autentisering" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:707 +msgid "PIN code required" +msgstr "PIN-kod krävs" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:708 +msgid "PIN code is needed for the mobile broadband device" +msgstr "PIN-koden krävs för den mobila bredbandsenheten" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN-kod: " + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:714 +msgid "Mobile broadband network password" +msgstr "Lösenord för mobilt bredbandsnätverk" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:698 +#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:715 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Ett lösenord krävs för att ansluta till ”%s”." + +#: js/ui/components/networkAgent.js:682 js/ui/status/network.js:1671 +msgid "Network Manager" +msgstr "Nätverkshanterare" + +#: js/ui/components/polkitAgent.js:44 +msgid "Authentication Required" +msgstr "Autentisering krävs" + +#: js/ui/components/polkitAgent.js:72 +msgid "Administrator" +msgstr "Administratör" + +#: js/ui/components/polkitAgent.js:149 +msgid "Authenticate" +msgstr "Autentisera" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:251 js/ui/shellMountOperation.js:314 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Tyvärr, det fungerade inte. Försök igen." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:785 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s är nu känd som %s" + +#: js/ui/ctrlAltTab.js:25 js/ui/viewSelector.js:176 +msgid "Windows" +msgstr "Fönster" + +#: js/ui/dash.js:207 js/ui/dash.js:248 +msgid "Show Applications" +msgstr "Visa program" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:397 +msgid "Dash" +msgstr "Snabbstartspanel" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:74 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:81 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:143 +msgid "Add world clocks…" +msgstr "Lägg till världsklockor…" + +#: js/ui/dateMenu.js:144 +msgid "World Clocks" +msgstr "Världsklockor" + +#: js/ui/dateMenu.js:234 +msgid "Weather" +msgstr "Väder" + +#: js/ui/dateMenu.js:317 +msgid "Select a location…" +msgstr "Välj en plats…" + +#: js/ui/dateMenu.js:325 +msgid "Loading…" +msgstr "Läser in…" + +#: js/ui/dateMenu.js:335 +msgid "Go online for weather information" +msgstr "Anslut till nätet för väderinformation" + +#: js/ui/dateMenu.js:337 +msgid "Weather information is currently unavailable" +msgstr "Väderinformation är för närvarande inte tillgänglig" + +#: js/ui/endSessionDialog.js:49 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Logga ut %s" + +#: js/ui/endSessionDialog.js:50 +msgctxt "title" +msgid "Log Out" +msgstr "Logga ut" + +#: js/ui/endSessionDialog.js:52 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s kommer att loggas ut automatiskt om %d sekund." +msgstr[1] "%s kommer att loggas ut automatiskt om %d sekunder." + +#: js/ui/endSessionDialog.js:57 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Du kommer att loggas ut automatiskt om %d sekund." +msgstr[1] "Du kommer att loggas ut automatiskt om %d sekunder." + +#: js/ui/endSessionDialog.js:63 +msgctxt "button" +msgid "Log Out" +msgstr "Logga ut" + +#: js/ui/endSessionDialog.js:69 +msgctxt "title" +msgid "Power Off" +msgstr "Stäng av" + +#: js/ui/endSessionDialog.js:70 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Installera uppdateringar & Stäng av" + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Systemet kommer att stängas av automatiskt om %d sekund." +msgstr[1] "Systemet kommer att stängas av automatiskt om %d sekunder." + +#: js/ui/endSessionDialog.js:76 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Installera väntande programvaruuppdateringar" + +#: js/ui/endSessionDialog.js:79 js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Restart" +msgstr "Starta om" + +#: js/ui/endSessionDialog.js:81 +msgctxt "button" +msgid "Power Off" +msgstr "Stäng av" + +#: js/ui/endSessionDialog.js:88 +msgctxt "title" +msgid "Restart" +msgstr "Starta om" + +#: js/ui/endSessionDialog.js:90 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Systemet kommer att startas om automatiskt om %d sekund." +msgstr[1] "Systemet kommer att startas om automatiskt om %d sekunder." + +#: js/ui/endSessionDialog.js:104 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Starta om och installera uppdateringar" + +#: js/ui/endSessionDialog.js:106 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Systemet kommer att startas om automatiskt och installera uppdateringar om " +"%d sekund." +msgstr[1] "" +"Systemet kommer att startas om automatiskt och installera uppdateringar om " +"%d sekunder." + +#: js/ui/endSessionDialog.js:112 js/ui/endSessionDialog.js:132 +msgctxt "button" +msgid "Restart & Install" +msgstr "Starta om & Installera" + +#: js/ui/endSessionDialog.js:113 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Installera & Stäng av" + +#: js/ui/endSessionDialog.js:114 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Stäng av efter att uppdateringarna har installerats" + +#: js/ui/endSessionDialog.js:122 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Starta om och installera uppgradering" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:127 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s kommer att installeras efter omstart. En uppgraderingsinstallation kan " +"ta lång tid: försäkra dig om att du gjort säkerhetskopior och att datorn är " +"ikopplad." + +#: js/ui/endSessionDialog.js:316 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Kör på batteri: vänligen anslut till en fast strömkälla innan uppdateringar " +"installeras." + +#: js/ui/endSessionDialog.js:333 +msgid "Some applications are busy or have unsaved work." +msgstr "Några program är upptagna eller innehåller icke sparat arbete." + +#: js/ui/endSessionDialog.js:340 +msgid "Other users are logged in." +msgstr "Andra användare är inloggade." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:621 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (fjärransluten)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:624 +#, javascript-format +msgid "%s (console)" +msgstr "%s (konsol)" + +#: js/ui/extensionDownloader.js:197 +msgid "Install" +msgstr "Installera" + +#: js/ui/extensionDownloader.js:202 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Hämta och installera ”%s” från extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:56 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s vill förhindra genvägar" + +#: js/ui/inhibitShortcutsDialog.js:57 +msgid "Application wants to inhibit shortcuts" +msgstr "Program vill förhindra genvägar" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:66 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Du kan återställa genvägar genom att trycka %s." + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Deny" +msgstr "Neka" + +#: js/ui/inhibitShortcutsDialog.js:77 +msgid "Allow" +msgstr "Tillåt" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned On" +msgstr "Tröga tangenter aktiverade" + +#: js/ui/kbdA11yDialog.js:33 +msgid "Slow Keys Turned Off" +msgstr "Tröga tangenter inaktiverade" + +#: js/ui/kbdA11yDialog.js:34 +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 "" +"Du höll precis ned skifttangenten under 8 sekunder. Detta är genvägen för " +"funktionen tröga tangenter, som påverkar hur ditt tangentbord fungerar." + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned On" +msgstr "Klistriga tangenter aktiverade" + +#: js/ui/kbdA11yDialog.js:42 +msgid "Sticky Keys Turned Off" +msgstr "Klistriga tangenter inaktiverade" + +#: js/ui/kbdA11yDialog.js:44 +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 "" +"Du tryckte precis ned skifttangenten 5 gånger i följd. Detta är genvägen för " +"funktionen klistriga tangenter, som påverkar hur ditt tangentbord fungerar." + +#: js/ui/kbdA11yDialog.js:46 +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 "" +"Du tryckte precis ned två tangenter samtidigt, eller tryckte ned " +"skifttangenten 5 gånger i följd. Detta stänger av funktionen klistriga " +"tangenter vilket påverkar hur ditt tangentbord fungerar." + +#: js/ui/kbdA11yDialog.js:58 +msgid "Leave On" +msgstr "Lämna påslagen" + +#: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:1270 +msgid "Turn On" +msgstr "Slå på" + +#: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:134 +#: js/ui/status/network.js:134 js/ui/status/network.js:316 +#: js/ui/status/network.js:1270 js/ui/status/network.js:1382 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Stäng av" + +#: js/ui/kbdA11yDialog.js:66 +msgid "Leave Off" +msgstr "Lämna avstängd" + +#: js/ui/keyboard.js:209 +msgid "Region & Language Settings" +msgstr "Re­gion- & språkinställningar" + +#: js/ui/lookingGlass.js:627 +msgid "No extensions installed" +msgstr "Inga tillägg installerade" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:681 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s har inte skickat ut några fel." + +#: js/ui/lookingGlass.js:687 +msgid "Hide Errors" +msgstr "Dölj fel" + +#: js/ui/lookingGlass.js:691 js/ui/lookingGlass.js:751 +msgid "Show Errors" +msgstr "Visa fel" + +#: js/ui/lookingGlass.js:700 +msgid "Enabled" +msgstr "Aktiverad" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:703 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Inaktiverad" + +#: js/ui/lookingGlass.js:705 +msgid "Error" +msgstr "Fel" + +#: js/ui/lookingGlass.js:707 +msgid "Out of date" +msgstr "Utanför datumintervallet" + +#: js/ui/lookingGlass.js:709 +msgid "Downloading" +msgstr "Hämtar" + +#: js/ui/lookingGlass.js:733 +msgid "View Source" +msgstr "Visa källa" + +#: js/ui/lookingGlass.js:742 +msgid "Web Page" +msgstr "Webbsida" + +#: js/ui/messageTray.js:1483 +msgid "System Information" +msgstr "Systeminformation" + +#: js/ui/mpris.js:179 +msgid "Unknown artist" +msgstr "Okänd artist" + +#: js/ui/mpris.js:180 +msgid "Unknown title" +msgstr "Okänd titel" + +#: js/ui/osdWindow.js:26 js/ui/status/volume.js:202 +msgid "Volume" +msgstr "Volym" + +#: js/ui/overview.js:78 +msgid "Undo" +msgstr "Ångra" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:105 +msgid "Overview" +msgstr "Översikt" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:231 +msgid "Type to search…" +msgstr "Skriv för att söka…" + +#: js/ui/padOsd.js:102 +msgid "New shortcut…" +msgstr "Nytt kortkommando…" + +#: js/ui/padOsd.js:151 +msgid "Application defined" +msgstr "Programdefinierad" + +#: js/ui/padOsd.js:152 +msgid "Show on-screen help" +msgstr "Visa hjälp på skärmen" + +#: js/ui/padOsd.js:153 +msgid "Switch monitor" +msgstr "Växla skärm" + +#: js/ui/padOsd.js:154 +msgid "Assign keystroke" +msgstr "Tilldela tangenttryckning" + +#: js/ui/padOsd.js:219 +msgid "Done" +msgstr "Färdig" + +#: js/ui/padOsd.js:731 +msgid "Edit…" +msgstr "Redigera…" + +#: js/ui/padOsd.js:773 js/ui/padOsd.js:878 +msgid "None" +msgstr "Ingen" + +#: js/ui/padOsd.js:832 +msgid "Press a button to configure" +msgstr "Tryck på en knapp för att konfigurera" + +#: js/ui/padOsd.js:833 +msgid "Press Esc to exit" +msgstr "Tryck Esc för att avsluta" + +#: js/ui/padOsd.js:836 +msgid "Press any key to exit" +msgstr "Tryck på valfri tangent för att avsluta" + +#: js/ui/panel.js:118 +msgid "Quit" +msgstr "Avsluta" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:476 +msgid "Activities" +msgstr "Aktiviteter" + +#: js/ui/panel.js:751 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "System" + +#: js/ui/panel.js:872 +msgid "Top Bar" +msgstr "Systemrad" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "Ange ett kommando" + +#: js/ui/runDialog.js:110 js/ui/windowMenu.js:167 +msgid "Close" +msgstr "Stäng" + +#: js/ui/runDialog.js:272 +msgid "Restart is not available on Wayland" +msgstr "Omstart är inte tillgänglig i Wayland" + +#: js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "Startar om…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:86 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:142 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d nytt meddelande" +msgstr[1] "%d nya meddelanden" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d ny avisering" +msgstr[1] "%d nya aviseringar" + +#: js/ui/screenShield.js:458 js/ui/status/system.js:291 +msgid "Lock" +msgstr "Lås" + +#: js/ui/screenShield.js:722 +msgid "GNOME needs to lock the screen" +msgstr "GNOME behöver låsa skärmen" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:843 js/ui/screenShield.js:1316 +msgid "Unable to lock" +msgstr "Kunde inte låsa" + +#: js/ui/screenShield.js:844 js/ui/screenShield.js:1317 +msgid "Lock was blocked by an application" +msgstr "Låsning hindrades av ett program" + +#: js/ui/search.js:644 +msgid "Searching…" +msgstr "Söker…" + +#: js/ui/search.js:646 +msgid "No results." +msgstr "Inga sökträffar." + +#: js/ui/search.js:770 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d till" +msgstr[1] "%d till" + +#: js/ui/shellEntry.js:21 +msgid "Copy" +msgstr "Kopiera" + +#: js/ui/shellEntry.js:26 +msgid "Paste" +msgstr "Klistra in" + +#: js/ui/shellEntry.js:92 +msgid "Show Text" +msgstr "Visa text" + +#: js/ui/shellEntry.js:94 +msgid "Hide Text" +msgstr "Dölj text" + +#: js/ui/shellMountOperation.js:301 +msgid "Password" +msgstr "Lösenord" + +#: js/ui/shellMountOperation.js:322 +msgid "Remember Password" +msgstr "Kom ihåg lösenord" + +#: js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "Hjälpmedel" + +#: js/ui/status/accessibility.js:54 +msgid "Zoom" +msgstr "Zooma" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Reader" +msgstr "Skärmläsare" + +#: js/ui/status/accessibility.js:65 +msgid "Screen Keyboard" +msgstr "Skärmtangentbord" + +#: js/ui/status/accessibility.js:69 +msgid "Visual Alerts" +msgstr "Visuella larm" + +#: js/ui/status/accessibility.js:72 +msgid "Sticky Keys" +msgstr "Klistriga tangenter" + +#: js/ui/status/accessibility.js:75 +msgid "Slow Keys" +msgstr "Tröga tangenter" + +#: js/ui/status/accessibility.js:78 +msgid "Bounce Keys" +msgstr "Studsande tangenter" + +#: js/ui/status/accessibility.js:81 +msgid "Mouse Keys" +msgstr "Mustangenter" + +#: js/ui/status/accessibility.js:155 +msgid "High Contrast" +msgstr "Hög kontrast" + +#: js/ui/status/accessibility.js:186 +msgid "Large Text" +msgstr "Stor text" + +#: js/ui/status/bluetooth.js:39 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:48 js/ui/status/network.js:591 +msgid "Bluetooth Settings" +msgstr "Inställningar för Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:128 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d ansluten" +msgstr[1] "%d anslutna" + +#: js/ui/status/bluetooth.js:130 +msgid "Off" +msgstr "Frånkopplad" + +#: js/ui/status/bluetooth.js:132 +msgid "On" +msgstr "På" + +#: js/ui/status/brightness.js:37 +msgid "Brightness" +msgstr "Ljusstyrka" + +#: js/ui/status/keyboard.js:819 +msgid "Keyboard" +msgstr "Tangentbord" + +#: js/ui/status/keyboard.js:841 +msgid "Show Keyboard Layout" +msgstr "Visa tangentbordslayout" + +#: js/ui/status/location.js:68 js/ui/status/location.js:176 +msgid "Location Enabled" +msgstr "Plats aktiverad" + +#: js/ui/status/location.js:69 js/ui/status/location.js:177 +msgid "Disable" +msgstr "Inaktivera" + +#: js/ui/status/location.js:70 +msgid "Privacy Settings" +msgstr "Sekretessinställningar" + +#: js/ui/status/location.js:175 +msgid "Location In Use" +msgstr "Plats används" + +#: js/ui/status/location.js:179 +msgid "Location Disabled" +msgstr "Plats inaktiverad" + +#: js/ui/status/location.js:180 +msgid "Enable" +msgstr "Aktivera" + +#. Translators: %s is an application name +#: js/ui/status/location.js:357 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Ge %s åtkomst till din plats?" + +#: js/ui/status/location.js:358 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Platsåtkomst kan ändras när som helst från sekretessinställningarna." + +#: js/ui/status/network.js:72 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:422 js/ui/status/network.js:1299 +#, javascript-format +msgid "%s Off" +msgstr "%s avslagen" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:425 +#, javascript-format +msgid "%s Connected" +msgstr "%s ansluten" + +#. 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:430 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s ohanterad" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:433 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s kopplar från" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:440 js/ui/status/network.js:1291 +#, javascript-format +msgid "%s Connecting" +msgstr "%s ansluter" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:443 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s kräver autentisering" + +#. 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:451 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Fast programvara saknas 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:455 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s ej tillgänglig" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:458 +#, javascript-format +msgid "%s Connection Failed" +msgstr "Anslutning till %s misslyckades" + +#: js/ui/status/network.js:470 +msgid "Wired Settings" +msgstr "Trådbundna inställningar" + +#: js/ui/status/network.js:512 +msgid "Mobile Broadband Settings" +msgstr "Inställningar för mobilt bredband" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:559 js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "Hårdvara för %s inaktiverad" + +#. 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:563 +#, javascript-format +msgid "%s Disabled" +msgstr "%s inaktiverad" + +#: js/ui/status/network.js:603 +msgid "Connect to Internet" +msgstr "Anslut till internet" + +#: js/ui/status/network.js:792 +msgid "Airplane Mode is On" +msgstr "Flygplansläge är på" + +#: js/ui/status/network.js:793 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Trådlöst nätverk är avslaget när flygplansläge är på." + +#: js/ui/status/network.js:794 +msgid "Turn Off Airplane Mode" +msgstr "Slå av flygplansläge" + +#: js/ui/status/network.js:803 +msgid "Wi-Fi is Off" +msgstr "Trådlöst nätverk är av" + +#: js/ui/status/network.js:804 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "" +"Trådlöst nätverk behöver slås på för att kunna ansluta till ett nätverk." + +#: js/ui/status/network.js:805 +msgid "Turn On Wi-Fi" +msgstr "Slå på trådlöst nätverk" + +#: js/ui/status/network.js:830 +msgid "Wi-Fi Networks" +msgstr "Trådlösa nätverk" + +#: js/ui/status/network.js:832 +msgid "Select a network" +msgstr "Välj ett nätverk" + +#: js/ui/status/network.js:861 +msgid "No Networks" +msgstr "Inga nätverk" + +#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Använd hårdvarubrytare för att slå av" + +#: js/ui/status/network.js:1158 +msgid "Select Network" +msgstr "Välj nätverk" + +#: js/ui/status/network.js:1164 +msgid "Wi-Fi Settings" +msgstr "Inställningar för trådlösa nätverk" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1287 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Surfzon för %s aktiv" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1302 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s ej ansluten" + +#: js/ui/status/network.js:1399 +msgid "connecting…" +msgstr "ansluter…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1402 +msgid "authentication required" +msgstr "autentisering krävs" + +#: js/ui/status/network.js:1404 +msgid "connection failed" +msgstr "anslutningen misslyckades" + +#: js/ui/status/network.js:1454 +msgid "VPN Settings" +msgstr "VPN-inställningar" + +#: js/ui/status/network.js:1471 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1481 +msgid "VPN Off" +msgstr "VPN avslaget" + +#: js/ui/status/network.js:1542 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Nätverksinställningar" + +#: js/ui/status/network.js:1571 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s trådbunden anslutning" +msgstr[1] "%s trådbundna anslutningar" + +#: js/ui/status/network.js:1575 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s trådlös anslutning" +msgstr[1] "%s trådlösa anslutningar" + +#: js/ui/status/network.js:1579 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s modemanslutning" +msgstr[1] "%s modemanslutningar" + +#: js/ui/status/network.js:1708 +msgid "Connection failed" +msgstr "Anslutningen misslyckades" + +#: js/ui/status/network.js:1709 +msgid "Activation of network connection failed" +msgstr "Aktivering av nätverksanslutning misslyckades" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Nattbelysning inaktiverad" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Nattbelysning på" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Återuppta" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Inaktivera till imorgon" + +#: js/ui/status/power.js:48 +msgid "Power Settings" +msgstr "Ströminställningar" + +#: js/ui/status/power.js:64 +msgid "Fully Charged" +msgstr "Fulladdad" + +#: js/ui/status/power.js:70 +msgid "Not Charging" +msgstr "Laddar inte" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:73 js/ui/status/power.js:79 +msgid "Estimating…" +msgstr "Beräknar…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:87 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d återstår (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:92 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d tills fulladdad (%d %%)" + +#: js/ui/status/power.js:120 js/ui/status/power.js:122 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Skärmen delas" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Stäng av" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Flygplansläge påslaget" + +#: js/ui/status/system.js:224 +msgid "Switch User" +msgstr "Växla användare" + +#: js/ui/status/system.js:236 +msgid "Log Out" +msgstr "Logga ut" + +#: js/ui/status/system.js:248 +msgid "Account Settings" +msgstr "Kontoinställningar" + +#: js/ui/status/system.js:276 +msgid "Orientation Lock" +msgstr "Skärmrotation" + +#: js/ui/status/system.js:302 +msgid "Suspend" +msgstr "Vänteläge" + +#: js/ui/status/system.js:312 +msgid "Power Off" +msgstr "Stäng av" + +#: js/ui/status/thunderbolt.js:264 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:325 +msgid "Unknown Thunderbolt device" +msgstr "Okänd Thunderbolt-enhet" + +#: js/ui/status/thunderbolt.js:326 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"En ny enhet har upptäckts medan du var borta. Koppla från och anslut enheten " +"igen för att börja använda den." + +#: js/ui/status/thunderbolt.js:329 +msgid "Unauthorized Thunderbolt device" +msgstr "Ej auktoriserad Thunderbolt-enhet" + +#: js/ui/status/thunderbolt.js:330 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"En ny enhet har upptäckts och behöver auktoriseras av en administratör." + +#: js/ui/status/thunderbolt.js:336 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt-auktoriseringsfel" + +#: js/ui/status/thunderbolt.js:337 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Kunde inte auktorisera Thunderbolt-enheten: %s" + +#: js/ui/status/volume.js:136 +msgid "Volume changed" +msgstr "Volymen ändrades" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:19 +msgid "Mirror" +msgstr "Spegla" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:24 +msgid "Join Displays" +msgstr "Sammanfoga skärmar" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:29 +msgid "External Only" +msgstr "Extern skärm" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:34 +msgid "Built-in Only" +msgstr "Inbyggd skärm" + +#: js/ui/unlockDialog.js:63 +msgid "Log in as another user" +msgstr "Logga in som en annan användare" + +#: js/ui/unlockDialog.js:80 +msgid "Unlock Window" +msgstr "Lås upp fönster" + +#: js/ui/viewSelector.js:180 +msgid "Applications" +msgstr "Program" + +#: js/ui/viewSelector.js:184 +msgid "Search" +msgstr "Sök" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "”%s” är redo" + +#: js/ui/windowManager.js:60 +msgid "Do you want to keep these display settings?" +msgstr "Vill du behålla dessa skärminställningar?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:72 +msgid "Revert Settings" +msgstr "Återställ inställningar" + +#: js/ui/windowManager.js:75 +msgid "Keep Changes" +msgstr "Behåll ändringar" + +#: js/ui/windowManager.js:93 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Inställningarna kommer återställas om %d sekund" +msgstr[1] "Inställningarna kommer återställas om %d sekunder" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:669 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:27 +msgid "Minimize" +msgstr "Minimera" + +#: js/ui/windowMenu.js:34 +msgid "Unmaximize" +msgstr "Avmaximera" + +#: js/ui/windowMenu.js:38 +msgid "Maximize" +msgstr "Maximera" + +#: js/ui/windowMenu.js:45 +msgid "Move" +msgstr "Flytta" + +#: js/ui/windowMenu.js:51 +msgid "Resize" +msgstr "Ändra storlek" + +#: js/ui/windowMenu.js:58 +msgid "Move Titlebar Onscreen" +msgstr "Flytta namnlist på skärm" + +#: js/ui/windowMenu.js:63 +msgid "Always on Top" +msgstr "Alltid överst" + +#: js/ui/windowMenu.js:82 +msgid "Always on Visible Workspace" +msgstr "Alltid på synlig arbetsyta" + +#: js/ui/windowMenu.js:96 +msgid "Move to Workspace Left" +msgstr "Flytta till arbetsyta åt vänster" + +#: js/ui/windowMenu.js:102 +msgid "Move to Workspace Right" +msgstr "Flytta till arbetsyta åt höger" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Up" +msgstr "Flytta till arbetsyta ovan" + +#: js/ui/windowMenu.js:114 +msgid "Move to Workspace Down" +msgstr "Flytta till arbetsyta nedan" + +#: js/ui/windowMenu.js:132 +msgid "Move to Monitor Up" +msgstr "Flytta till skärm uppåt" + +#: js/ui/windowMenu.js:141 +msgid "Move to Monitor Down" +msgstr "Flytta till skärm nedåt" + +#: js/ui/windowMenu.js:150 +msgid "Move to Monitor Left" +msgstr "Flytta till skärm åt vänster" + +#: js/ui/windowMenu.js:159 +msgid "Move to Monitor Right" +msgstr "Flytta till skärm åt höger" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution-kalender" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Skriv ut version" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Läge som används av GDM för inloggningsskärmen" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Använd ett specifikt läge, t.ex. ”gdm” för inloggningsskärm" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Lista möjliga lägen" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Okänt" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Misslyckades med att starta ”%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Lösenorden stämmer inte överens." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Lösenordet får inte vara blankt" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Autentiseringsdialogen stängdes av användaren" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u utgång" +msgstr[1] "%u utgångar" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ingång" +msgstr[1] "%u ingångar" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Systemljud" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Det uppstod ett fel vid inläsning av inställningsdialogen för %s:" + +#~ msgid "%s all day." +#~ msgstr "%s hela dagen." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, sedan %s senare." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, sedan %s, följt av %s senare." + +#~ msgid "Feels like %s." +#~ msgstr "Känns som %s." + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Stäng av" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Logga ut" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Växla användare" + +#~ msgid "Hide tray" +#~ msgstr "Dölj aktivitetsfält" + +#~ msgid "Status Icons" +#~ msgstr "Statusikoner" + +#~ msgid "Events" +#~ msgstr "Händelser" + +#~ msgid "Notifications" +#~ msgstr "Aviseringar" + +#~ msgid "Clear section" +#~ msgstr "Töm avsnitt" + +#~ msgid "Media" +#~ msgstr "Media" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Inställningar för GNOME-skalets tillägg" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Omdirigering för webbautentisering" + +#~ msgid "Not In Use" +#~ msgstr "Används inte" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Visa veckonummer i kalendern" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Om satt till \"true\", visa veckonummer enligt ISO i kalendern." + +#~ msgid "Use as Internet connection" +#~ msgstr "Använd som internetanslutning" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s begär åtkomst till din plats." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME-skal (wayland-compositor)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d ansluten enhet" +#~ msgstr[1] "%d anslutna enheter" + +#~ msgid "Authentication required" +#~ msgstr "Autentisering krävs" + +#~ msgid "UPS" +#~ msgstr "Avbrottsfri kraftförsörjning (UPS)" + +#~ msgid "Battery" +#~ msgstr "Batteri" + +#~ msgid "Airplane Mode" +#~ msgstr "Flygplansläge" diff --git a/po/ta.po b/po/ta.po new file mode 100644 index 0000000..2071b00 --- /dev/null +++ b/po/ta.po @@ -0,0 +1,2087 @@ +# Tamil translation for gnome-shell. +# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# +# Dr.T.Vasudevan , 2010, 2011, 2012. +# Shantha kumar , 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-13 16:02+0000\n" +"PO-Revision-Date: 2014-09-13 21:39+0630\n" +"Last-Translator: Shantha kumar \n" +"Language-Team: American English \n" +"Language: ta\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: Lokalize 1.5\n" +"X-Poedit-Language: தமிழ்\n" +"X-Poedit-Country: இந்தியா\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "கணினி" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "அறிவிப்பு பலகத்தை காட்டுக" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "இயங்கு செய்தி அறிவிப்பை குவி" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "கண்ணோட்டத்தை காட்டு" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "எல்லா செயலிகளையும் காட்டு" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "செயலிகள் பட்டியை திறக்க விசைபிணைப்பு" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "க்னோம் ஷெல்" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "சாளர மேலாண்மை மற்றும் பயன்பாடு துவக்கம்" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "க்னோம் ஷெல் நீட்சி விருப்பங்கள்" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "க்னோம் ஷெல் நீட்சிகளை வடிவமை" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME ஷெல் (வேலேன்ட் கம்ப்போசிட்டர்)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"உருவாக்குவோர் மற்றூம் சோதிப்போருக்கு பயன்படுமாறு Alt-F2 வழியாக உள்ளமை " +"கருவிகளை " +"செயலாக்கு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"உள்ளமை வழி நீக்கம் மற்றும் Alt-F2 உரையாடல் மூலம் கருவிகள் கண்காணிப்பு " +"ஆகியவற்றை அணுக " +"உதவும்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "செயல்படுத்த வேண்டிய நீட்சிகளின் UUIDகள்" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"க்னோம் ஷெல் நீட்சிகளுக்கு ஒரு யூயூஐடி பண்பு உண்டு. இந்த விசை எந்த நீட்சிகள் " +"ஏற்றப்பட வேண்டும் " +"என பட்டியலிடுகிறது. ஏற்றப்பட வேண்டிய எந்த நீட்சியும் இந்த பட்டியலில் இருந்தே " +"ஆகவேண்டும். " +"org.gnome.Shell. இல் உள்ள EnableExtension மற்றும் DisableExtension DBus " +"முறைகளில் " +"இந்த பட்டியலை நீங்கள் திருத்தலாம்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "நீட்சிப் பதிப்பு இணக்கத்தன்மை செல்லுபடியாக்கத்தை முடக்கும்" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME ஷெல் நடப்பு இயக்கப் பதிப்பை ஆதரிப்பதாகக் கூறும் நீட்சிகளை மட்டுமே " +"ஏற்றும். இந்த " +"விருப்பத்தைச் செயல்படுத்தினால் இந்த சோதனை முடக்கப்படும், பிறகு நீட்சிகள் " +"எந்தப் பதிப்புகளை " +"ஆதரிப்பதாகக் கூறுகின்றன என்பதைப் பொருட்படுத்தாமல் எல்லா நீட்சிகளையும் ஏற்ற " +"முயற்சி " +"செய்யப்படும்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "விருப்ப பயன்பாடுகளுக்கு மேல்மேசை கோப்பு அடையாளங்கள்" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"இந்த அடையாளங் காட்டிகளுக்கு பொருத்தமான பயன்பாடுகள் விருப்ப இடத்தில் " +"காட்டப்படும்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "ஆப் பிக்கர் காட்சி" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "" +"பயன்பாட்டுத் தேர்வியில் தற்போது தேர்ந்தெடுக்கப்பட்டுள்ள காட்சியின் அட்டவணை." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "(Alt-F2) கட்டளை உரையாடல் க்கு வரலாறு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "லுக்கிங் க்ளாஸ் உரையாடலுக்கு வரலாறு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "எப்போதும் பயனர் மெனுவில் 'வெளியேறு' மெனு உருப்படியைக் காண்பி." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"இந்த விசையானது ஒற்றை பயனர், ஒற்றை அமர்வு சூழ்நிலைகளில் 'வெளியேறு' மெனு " +"உருப்படி " +"தானாக மறைதலை கட்டுப்படுத்தி இயங்கும்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"குறியாக்கம் செய்யப்பட்ட அல்லது தொலைநிலை கோப்புமுறைமைகளை மவுன்ட் செய்வதற்கான " +"கடவுச்சொல்லை " +"நினைவில் வைத்திருக்க வேண்டுமா" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"ஒரு குறியாக்கம் செய்யப்பட்ட சாதனம் அல்லது தொலைநிலை கோப்புமுறைமையை மவுன்ட் " +"செய்யும் போது " +"ஷெல்லானது ஒரு கடவுச்சொல்லைக் கேட்கும். எதிர்காலப் பயன்பாட்டுக்கு கடவுச்சொல் " +"சேமிக்கப்பட " +"முடியும் எனில், 'கடவுச்சொல்லை நினைவில் வைத்திரு' என ஒரு தேர்வுப் பெட்டி " +"இடம்பெறும். இந்த " +"விசையே இந்த தேர்வுப் பெட்டியின் முன்னிருப்பு நிலையை அமைக்கிறது." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "நாட்காட்டியில் வார நாளை காட்டவும்" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "உண்மையானால் நாட்காட்டியில் ஐஎஸ்ஓ வார எண்களை காட்டவும்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "பயன்பாட்டு பட்டியை திறக்க விசைபிணைப்பு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "பயன்பாட்டு பட்டியை திறக்க விசைபிணைப்பு." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr " \"செயலிகளைக்காட்டு\" பார்வையை திறக்க விசைபிணைப்பு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"செயல்பாடுகள் மேல்பார்வையின் \"செயலிகளைக்காட்டு\" பார்வையை திறக்க விசைபிணைப்பு." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "மேற்பார்வையை திறக்கும் விசைபிணைப்பு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "செயலிகளின் மேற்பார்வையை திறக்கும் விசைபிணைப்பு." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "அறிவிப்பு பலகத்தின் காட்சியை நிலை மாற்ற விசைபிணைப்பு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "அறிவிப்பு பலகத்தின் காட்சியை நிலை மாற்ற விசைபிணைப்பு." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "இயங்கு செய்தி அறிவிப்பை குவிக்க விசைபிணைப்பு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "இயங்கு செய்தி அறிவிப்பை குவிக்க விசைபிணைப்பு." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"இயக்கத்திலிருக்கும் ட்வீன்கள் அனைத்தையும் இடைநிறுத்தி மீண்டும் துவக்கும் " +"விசைப்பிணைப்பாக்கம், வழுநீக்கத் தேவைகளுக்கானது." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "எந்த விசைப்பலகையை பயன்படுத்த வேண்டும்?" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "பயன்படுத்த வேண்டிய விசைப்பலகை வகை" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "மாற்றியை நடப்பு பணியிடத்திற்கு மட்டும் எனக் கட்டுப்படுத்து." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"ஆம் என அமைக்கப்பட்டால், நடப்புப் பணியிடத்தில் சாளரங்களைக் கொண்டுள்ள " +"பயன்பாடுகள் மட்டுமே மாற்றியில் காண்பிக்கப்படும். இல்லாவிட்டால் அனைத்துப் " +"பயன்பாடுகளும் இருக்கும்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "பயன்பாடு படவுரு பயன்முறை." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"ஸ்விட்ச்சரில் சாளரங்கள் எப்படிக் காண்பிக்கப்படும் என்பதை அமைவாக்கம் " +"செய்கிறது. 'சிறுதோற்றம்-" +"மட்டும்' (சாளரத்தின் சிறுதோற்றத்தைக் காண்பிக்கும்), " +"'பயன்பாட்டு-படவுரு-மட்டும்' (பயன்பாட்டின் " +"படவுருவை மட்டும் காண்பிக்கும்) அல்லது 'இரன்டும்' ஆகிய சாத்தியங்கள் உள்ளன." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"ஆம் என அமைக்கப்பட்டால், நடப்புப் பணியிடத்தில் உள்ள சாளரங்கள் மட்டுமே " +"மாற்றியில் காண்பிக்கப்படும். இல்லாவிட்டால் அனைத்து சாளரங்களும் இருக்கும்." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "தாய் சாளரத்துக்கு மாதிரி உரையாடலை இணை" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"இந்த விசை org.gnome.mutter இல் உள்ள விசையை க்னோம் ஷெல்லை இயக்கும்போது " +"வன்மீறல் செய்கிறது." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "திரை விளிம்புகளில் சாளரங்களை இடும்போது விளிம்பு சாய்தலை செயலாக்கு" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "பணிக்களங்கள் இயங்கு நிலையில் மேலாளப்படுகின்றன" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "பணிக்களங்கள் முதன்மை திரையில் மட்டும் " + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"சொடுக்கி பயன்முறையில் சுட்டி நகர்வது நிற்கும் வரை கவனப் பகுதி மாறுவதைத் " +"தாமதிக்கவும்" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "கட்டுப்படுத்தப்பட்ட வலைவாசல்" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s க்கு விருப்பங்கள் உரையாடலை ஏற்றுகையில் பிழை நேர்ந்தது:" + +#: ../js/extensionPrefs/main.js:155 +#| msgid "Configure GNOME Shell Extensions" +msgid "GNOME Shell Extensions" +msgstr "GNOME ஷெல் நீட்சிகள்" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "ரத்துசெய்க" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "அடுத்தது" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "பூட்டை திற" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "உள்நுழை" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "அமர்வை தேர்ந்தெடு" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "பட்டியலில் இல்லை?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(எ.கா., பயனர் அல்லது %s)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "பயனர்பெயர்: " + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "உள்புகு சாளரம்" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "உறுதிப்படுத்தல் பிழை" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(அல்லது விரல் தீய்ப்பு)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "கட்டளை காணப்படவில்லை" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "கட்டளையை அலகிட முடியவில்லை" + +#: ../js/misc/util.js:156 +#, javascript-format +#| msgid "Execution of '%s' failed:" +msgid "Execution of “%s” failed:" +msgstr "“%s” செயல்படுத்தல் தோல்வியடைந்தது:" + +#: ../js/portalHelper/main.js:85 +#| msgid "Authentication Required" +msgid "Web Authentication Redirect" +msgstr "இணைய அங்கீகரிப்பு திருப்பிவிடல்" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "அதிகம் பயன்படுத்தப்படும் பயன்பாடுகள் இங்கு காண்பிக்கப்படும்" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "அடிக்கடி" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "எல்லா" + +#: ../js/ui/appDisplay.js:1789 +msgid "New Window" +msgstr "புதிய சாளரம்" + +#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "விருப்பத்தில் இருந்து நீக்கு" + +#: ../js/ui/appDisplay.js:1821 +msgid "Add to Favorites" +msgstr "விருப்பங்களுக்கு சேர்" + +#: ../js/ui/appDisplay.js:1830 +#| msgid "Show Text" +msgid "Show Details" +msgstr "விவரங்களைக் காட்டு" + +#: ../js/ui/appFavorites.js:124 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s உங்கள் விருப்பங்களில் சேர்க்கப்பட்டது" + +#: ../js/ui/appFavorites.js:158 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s உங்கள் விருப்பங்களில் இருந்து நீக்கப்பட்டது" + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "அமைப்புகள்" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "பின்புலத்தை மாற்று…" + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "முழு நாள்" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "ஞா" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "தி" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "செ" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "பு" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "வி" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "வெ" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "ச" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "ஞா" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "தி" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "செ" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "பு" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "வியா" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "வெ" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "ச" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "முந்தைய மாதம்" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "அடுத்த மாதம்" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "திட்டம் எதுவுமில்லை" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "இன்று" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "நாளை" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "இந்த வாரம்" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "அடுத்த வாரம்" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "வெளிப்புற இயக்கி இணைக்கப்பட்டது" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "வெளிப்புற இயக்கி இணைப்பு நீக்கப்பட்டது" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "நீக்கப்படக்கூடிய சாதனங்கள் " + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s ஆல் திற" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "வெளியேற்று" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "கடவுச்சொல்:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "மீண்டும் உள்ளிடவும்:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "இணை" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "கடவுச்சொல்:" + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "விசை: " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "அடையாளம்: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "அந்தரங்க முதன்மை கடவுச்சொல்: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "சேவை:" + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "கம்பியில்லா வலைப்பின்னலுக்கு உறுதிப்படுத்துதல் தேவை" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +#| msgid "" +#| "Passwords or encryption keys are required to access the wireless network " +#| "'%s'." +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"வயர்லெஸ் பிணையம் \"%s\" ஐ அணுக கடவுச்சொற்கள் அல்லது மறைகுறியாகக் விசைகள் " +"தேவைப்படுகிறது." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "கம்பியுள்ள 802.1X அங்கீகாரம்" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "வலைப்பின்னல் பெயர்:" + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "டிஎஸ்எல் உறுதிப்படுத்துதல் " + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "பின் கோட் தேவைப்படுகிறது" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "அலை அகலப்பட்டை சாதனத்துக்கு பின் கோட் தேவை" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "அலை அகலப்பட்டைக்கு வலைப்பின்னல் கடவுச்சொல்" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +#| msgid "A password is required to connect to '%s'." +msgid "A password is required to connect to “%s”." +msgstr "\"%s\" உடன் இணைப்பதற்கு கடவுச்சொல் தேவைப்படுகிறது." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "உறுதிப்படுத்தல் தேவை" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "நிர்வாகி" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "உறுதிப்படுத்து" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "மன்னிக்க, அது வேலை செய்யவில்லை. மீண்டு முயற்சி செய்க." + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "அழைப்பு" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "அழை" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "கோப்பு பறிமாற்றம் " + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "அரட்டை" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "ஒலி நிறுத்தம் நீக்கு" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "ஒலி நிறுத்தம்" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "நேற்று, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "நேற்று, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s இப்போது %s ஆனார்" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%s க்கு அழைப்பு" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s உங்களை %s உடன் சேர அழைக்கிறார்." + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "நிராகரி" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "ஏற்றுக்கொள்" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s இடமிருந்து விடியோ அழைப்பு" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s இடமிருந்து அழைப்பு" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "பதிலளி" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s உங்களுக்கு %s அனுப்புகிறார்" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "%s நீங்கள் இணைப்பில் இருக்கும் போது காண அனுமதி வேண்டுகிறார். " + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "வலையமைப்பு பிழை" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "உறுதி செய்தல் தோல்வி" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "மறையாக்க பிழை" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "சான்றிதழ் தரப்படவில்லை" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "சான்றிதழில் நம்பக தன்மை இல்லை" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "சான்றிதழ் காலாவதியானது" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "சான்றிதழ் செயல்படுத்தப்படவில்லை" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "சான்றிதழ் புரவலன் பெயர் ஒத்திசையவில்லை" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "சான்றிதழ் அடையாளம் ஒத்திசையவில்லை" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "சான்றிதழ் தானே கையெழுத்திட்டது" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "நிலை இப்போது இணைப்பு விலகி " + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "குறீயீட்டுமுறை கிடைப்பில் இல்லை" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "சான்றிதழ் செல்லுபடியாகாது" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "இணைப்பு மறுக்கப்பட்டது" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "இணைக்க முடியவில்லை" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "இணைப்பு அற்றுப்போயிற்று" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "இந்த கணக்கு ஏற்கனவே சேவையகத்துக்கு இணைக்கப்பட்டது" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "இணைப்பு அதே முலத்துடன் புதிய இணைப்பால் மாற்றப்பட்டது." + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "இந்த கணக்கு ஏற்கனவே சேவையகத்தில் உள்ளது" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "இணைப்பை கையாள சேவையகம் இப்போது மிகவும் வேலை பளுவில் உள்ளது." + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "சான்றிதழ் ரத்து செய்யப்பட்டது" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"சான்றிதழ் பாதுகாப்பில்லாத சைபர் அல்கோரிதத்தை பயன்படுத்துகிறது. இது " +"மறையாக்கத்தில் " +"பலகீனமானது." + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"சேவயகத்தின் சான்றிதழின் நீளம் அல்லது சங்கிலியின் ஆழம் மறையாக்க நூலகம் " +"வரயறுத்த மதிப்பை " +"தாண்டியது." + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "உள்ளார்ந்த பிழை" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s க்கு இணைக்க முடியவில்லை" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "கணக்கை காட்டவும்" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "தெரியாத காரணம்" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "சாளரங்கள்" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "பயன்பாடுகளை காட்டு" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "டேஷ்போர்ட்" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "நாள்காட்டியை திற" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "கடிகாரங்களைத் திற" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "தேதி நேரம் அமைப்புகள்" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s யிலிருந்து வெளியேறு" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "வெளியேறு" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s தானியங்கியாக %d வினாடியில் வெளியேறும்" +msgstr[1] "%s தானியங்கியாக %d வினாடிகளில் வெளியேறும்" + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "நீங்கள் தானியங்கியாக %d வினாடியில் வெளியேற்றப்படுவீர்கள் " +msgstr[1] "நீங்கள் தானியங்கியாக %d வினாடிகளில் வெளியேற்றப்படுவீர்கள் " + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "வெளியேறு" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "மின்சக்தி நிறுத்தம்" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "புதுப்பிப்புகளை நிறுவு & இயக்கம் நிறுத்து" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "கணினி தானியங்கியாக %d வினாடியில் மின் நிறுத்தப்படும்" +msgstr[1] "கணினி தானியங்கியாக %d வினாடிகளில் மின் நிறுத்தப்படும்" + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "நிலுவையிலுள்ள மென்பொருள் புதுப்பிப்புகளை நிறுவு" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "மறு துவக்கம்" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "மின்சக்தி நிறுத்தம்" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "மறு துவக்கம்" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "கணினி தானியங்கியாக %d வினாடியில் மீள் துவக்கம் செய்யப்படும்." +msgstr[1] "கணினி தானியங்கியாக %d வினாடிகளில் மீள் துவக்கம் செய்யப்படும்." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "மறுதுவக்கு & புதுப்பிப்புகளை நிறுவு" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "%d வினாடியில் கணினி தானாக மறுதுவக்கமாகி புதுப்பிப்புகளை நிறுவும்." +msgstr[1] "%d வினாடிகளில் கணினி தானாக மறுதுவக்கமாகி புதுப்பிப்புகளை நிறுவும்." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "மறுதுவக்கு & நிறுவு" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "நிறுவு & இயக்கம் நிறுத்து" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "புதுப்பிப்புகள் நிறுவப்பட்ட பிறகு இயக்கம் நிறுத்து" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"மின்கல சக்தியில் இயங்குகிறது: புதுப்பிப்புகளை நிறுவும் முன்பு மின் இணைப்பு " +"கொடுக்கவும்." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "" +"சில பயன்பாடுகள் பணிமிகுதியாக உள்ளன அல்லது சேமிக்காத வேலையைக் கொண்டுள்ளன." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "மற்ற பயனர்கள் புகுபதிவு செய்துள்ளனர்." + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (தொலைநிலை)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (கன்சோல்)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "நிறுவு" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org இல் இருந்து '%s' ஐ தரவிறக்கி நிறுவவா?" + +#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "விசைப்பலகை" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "நீட்சிகள் ஏதும் நிறுவப்படவில்லை" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s எந்த பிழையையும் வெளியிடவில்லை" + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "பிழைகளை மறை" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "பிழைகளை காட்டுக" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "செயலாக்கப்பட்டது" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "செயல்நீக்கப்பட்டது" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "பிழை" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "காலாவதியானது" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "பதிவிறக்குகிறது" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "மூலத்தை பார்க்க" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "இணைய பக்கம்" + +#: ../js/ui/messageTray.js:1326 +msgid "Open" +msgstr "திற" + +#: ../js/ui/messageTray.js:1333 +msgid "Remove" +msgstr "நீக்கு" + +#: ../js/ui/messageTray.js:1630 +msgid "Notifications" +msgstr "அறிவிப்புகள்" + +#: ../js/ui/messageTray.js:1637 +msgid "Clear Messages" +msgstr "செய்திகளை அழி" + +#: ../js/ui/messageTray.js:1656 +msgid "Notification Settings" +msgstr "அறிவிப்பு அமைப்புகள்" + +#: ../js/ui/messageTray.js:1709 +msgid "Tray Menu" +msgstr "தட்டில் பட்டி" + +#: ../js/ui/messageTray.js:1926 +msgid "No Messages" +msgstr "செய்திகள் இல்லை" + +#: ../js/ui/messageTray.js:1968 +msgid "Message Tray" +msgstr "அறிவிப்பு பலகம்" + +#: ../js/ui/messageTray.js:2971 +msgid "System Information" +msgstr "கணினி தகவல்கள்" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "தெரியாத" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d புதிய செய்தி" +msgstr[1] "%d புதிய செய்திகள்" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "மறை" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "மேலோட்டம்" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "தேட தட்டச்சு செய்யவும்..." + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "வெளியேறு" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "செயல்பாடுகள்" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "மேல் பட்டை" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "ஒரு கட்டளையை உள்ளிடுக" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "மூடுக" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "மறுதுவக்குகிறது…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d புதிய அறிவிப்பு" +msgstr[1] "%d புதிய அறிவிப்புகள்" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "பூட்டு" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "GNOME திரையைப் பூட்ட வேண்டுகிறது" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "பூட்ட முடியவில்லை" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "ஒரு பயன்பாடு பூட்டுதலை முடக்கியுள்ளது" + +#: ../js/ui/search.js:594 +msgid "Searching…" +msgstr "தேடுகிறது..." + +#: ../js/ui/search.js:596 +msgid "No results." +msgstr "விடைகள் இல்லை." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "நகலெடு" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "ஒட்டு" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "உரையை காட்டுக" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "உரையை மறை" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "கடவுச்சொல்" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "கடவுச்சொல்லை நினைவு கொள்ளவும்" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "அணுகல்" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "பெரிதாக்கு" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "திரைபடிப்பான்" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "திரை விசைப்பலகை" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "காட்சி எச்சரிக்கைகள்" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "ஒட்டு விசைகள்" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "மெது விசைகள்" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "எதிரொலிப்பு விசைகள்" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "சொடுக்கி விசைகள்" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "அதிக முறண்" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "பெரிய உரை" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "ப்ளூடூத்" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "முடக்கு" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "ப்ளூடூத் அமைப்புகள்" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "இணைக்கப்பட்ட சாதனம் %d" +msgstr[1] "இணைக்கப்பட்ட சாதனங்கள் %d" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +msgid "Not Connected" +msgstr "இணைக்கப்படவில்லை" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "வெளிச்சம்" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "விசைப்பலகை இடவமைவை காட்டுக" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "இருப்பிடம்" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "முடக்கு" + +#: ../js/ui/status/location.js:73 +msgid "Privacy Settings" +msgstr "தனியுரிமை அமைவுகள்" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "பயனில் உள்ளது" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "செயல்படுத்து" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "<தெரியாத>" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +msgid "Off" +msgstr "முடக்கு" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "இணைக்கப்பட்டது" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "நிர்வகிக்கப்படாதது" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "துண்டிக்கப்படுகிறது" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +msgid "Connecting" +msgstr "இணைக்கிறது" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "அங்கீகரிப்பு தேவை" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "சாதன நிரல் இல்லை" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "கிடைக்கவில்லை" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "இணைப்பு தோல்வியுற்றது" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "வயர்டு அமைவுகள்" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "மொபைல் பிராட்பேண்டு அமைவுகள்" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +msgid "Hardware Disabled" +msgstr "வன்பொருள் முடக்கப்பட்டது" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "இணைய இணைப்பாகப் பயன்படுத்து" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "விமான பயன்முறை இயக்கத்தில்" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "விமானப் பயன்முறை இயக்கத்தில் இருக்கும் போது Wi-Fi முடக்கப்படும்." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "விமான பயன்முறையை அணைக்கவும்" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi அணைக்கப்பட்டுள்ளது" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "பிணையத்திற்கு இணைக்க வேண்டுமானால் Wi-Fi ஐ இயக்க வேண்டும்." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fi ஐ இயக்கு" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "கம்பியில்லா பிணையங்கள்" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "ஒரு பிணையத்தை தெரிவுச்செய்" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "பிணையங்கள் இல்லை" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "அணைக்க, வன்பொருள் பொத்தானைப் பயன்படுத்தவும்" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "பிணையத்தை தெரிவுச்செய்" + +#: ../js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi அமைவுகள்" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "செயற்படுத்து" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "ஹாட்ஸ்பாட் செயலில் உள்ளது" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "இணைக்கிறது..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "உறுதிப்படுத்துதல் தேவை" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "இணைப்பு தோல்வி அடைந்தது" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "வலைப்பின்னல் அமைப்புகள்" + +#: ../js/ui/status/network.js:1482 +msgid "VPN Settings" +msgstr "VPN அமைவுகள்" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "விபிஎன் - VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "வலைப்பின்னல் மேலாளர்" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "வலைப்பின்னல் இணைப்பு செயலாக்கம் தோல்வி அடைந்தது" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "மின்சக்தி அமைப்புகள்" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "முழுமையாக மின்னூட்டப்பட்டது" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "கணிக்கிறது…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d மீதமுள்ளது (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d முழுமையாகும் வரை (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "மின்கலம்" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "விமான பயன்முறை" + +#: ../js/ui/status/rfkill.js:85 +msgid "On" +msgstr "மீது\t" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "பயனர் மாற்று" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "வெளியேறு" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "சார்பு பூட்டு" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "இடைநிறுத்தம்." + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "மின்சக்தி நிறுத்தம்" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ஒலியளவு மாற்றப்பட்டது" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "ஒலியளவு" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "மைக்ரோஃபோன்" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "வேறு பயனராக உள்நுழைக" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "சாளர பூட்டு திறக்கவும்" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "பயன்பாடுகள்" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "தேடு" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” தயாராக உள்ளது" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "இந்தக் காட்சி அமைவுகளை வைத்திருக்க வேண்டுமா?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "அமைவுகளை மீட்டமை" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "மாற்றங்களைச் செயல்படுத்து" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "அமைவுகளின் மாற்றங்கள் %d வினாடியில் மீட்டமைக்கப்படும்" +msgstr[1] "அமைவுகளின் மாற்றங்கள் %d வினாடிகளில் மீட்டமைக்கப்படும்" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "சிறிதாக்கு" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "பெரிதாக்க வேண்டாம்" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "பெரிதாக்கு" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "நகர்த்து" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "மறுஅளவிடு" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "தலைப்புப்பட்டையை திரைக்கு நகர்த்தவும்" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "எப்போதும் மேலே" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "எப்போதும் புலனாகும் வேலையிடத்தில்" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "மேலே உள்ள வேலையிடத்திற்கு நகர்த்தவும்" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "கீழே உள்ள வேலையிடத்திற்கு நகர்த்தவும்" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "எவல்யூஷன் நாள்காட்டி" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u வெளிப்பாடு" +msgstr[1] "%u வெளிப்பாடுகள்" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u உள்ளீடு" +msgstr[1] "%u உள்ளீடுகள்" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "கணினி ஒலிகள்" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "அச்சுப் பதிப்பு" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "ஜிடிஎம் உள்நுழைவு திரைக்கு பயன்படுத்தும் பாங்கு" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "உள்நுழைவு திரைக்கு குறிப்பிட்ட பாங்கை, எ.கா. \"gdm\" பயன்படுத்துக" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "இயன்ற பாங்குகளின் பட்டியல்" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "\"%s\" ஐத் தொடங்குதல் தோல்வியடைந்தது" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "கடவுச்சொற்கள் பொருந்தவில்லை" + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "கடவுச்சொல் வெறுமையாக இருக்க முடியாது" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "பயனர் உறுதிப்படுத்தல் உரையாடலை வெளியனுப்பினார்." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "கோப்புறைகளாகக் காண்பிக்க வேண்டிய பகுப்புகளின் பட்டியல்" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "இந்தப் பட்டியலில் காண்பிக்கப்படும் ஒவ்வொரு பகுப்பும், பிரதானப் பார்வையில் உள்ளே " +#~ "காண்பிக்கப்படுவதற்கு மாறாக பயன்பாட்டுப் பார்வையில் கோப்புறையாகக் காண்பிக்கப்படும்." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "பயனர் குறிப்பாக அமைத்த கடைசி ஐஎம் இருப்பு நிலையை சேமிக்க உள்ளே பயனாகும். இங்குள்ள " +#~ "மதிப்பு TpConnectionPresenceType கணக்கிடுதலில் இருந்து." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "பயனருக்கு கடைசி அமர்வின் இருப்பு நிலையை சேமிக்க உள்ளே பயனாகும். இங்குள்ள மதிப்பு " +#~ "GsmPresenceStatus கணக்கிடுதலில் இருந்து." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "தலைப்புப்பட்டியில் பொத்தான்களின் அமைப்பு" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "இந்த விசை org.gnome.desktop.wm.preferences ஐ க்னோம் ஷெல்லை இயக்கும்போது வன்மீறல் " +#~ "செய்கிறது." + +#~ msgid "Extension" +#~ msgstr "நீட்சி" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "மேலுள்ள கூட்டுப்பெட்டியை பயன்படுத்தி வடிவமைக்க ஒரு நீட்சியை தேர்ந்தெடுக்கவும்" + +#~| msgid "Session…" +#~ msgid "Session" +#~ msgstr "அமர்வு" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "இந்த பயன்பாடுகளை மூடி கணினியில் இருந்து வெளியேற வெளியேறு ஐ சொடுக்கவும்" + +#~ msgid "Logging out of the system." +#~ msgstr "கணினியில் இருந்து வெளியேறுகிறது" + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "இந்த பயன்பாடுகளை மூடி கணினி மின் நிறுத்தம் செய்ய மின் நிறுத்தம் ஐ சொடுக்கவும்" + +#~ msgid "Powering off the system." +#~ msgstr "கணினி மின் நிறுத்தப்படுகிறது" + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "இந்த பயன்பாடுகளை மூடி கணினி மீள் துவக்கம் செய்ய செய்ய மீள் துவக்கம் ஐ சொடுக்கவும்" + +#~ msgid "Restarting the system." +#~ msgstr "கணினி மறு துவக்கம் செய்யப்படுகிறது" + +#~| msgid "Settings" +#~ msgid "Settings Menu" +#~ msgstr "பட்டி அமைப்புகள்" + +#~ msgid "Authorization request from %s" +#~ msgstr "%s இடமிருந்து உறுதிப்படுத்தல் வேண்டுதல்" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "சாதனம் %s இந்த கணினியுடன் இணைக்க விரும்புகிறது" + +#~ msgid "Allow" +#~ msgstr "அனுமதி" + +#~ msgid "Deny" +#~ msgstr "மறுப்பு" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "சாதனம் %s ' சேவை %s' க்கு அணுகல் வேண்டுகிறது" + +#~ msgid "Always grant access" +#~ msgstr "எப்போதும் அணுகலை அளி" + +#~ msgid "Grant this time only" +#~ msgstr "இம்முறை மட்டும் அணுகலை அளி" + +#~ msgid "Reject" +#~ msgstr "மறு" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s க்கு இணை சேர்த்த உறுதிப்படுத்தல்" + +#~| msgid "" +#~| "Please confirm whether the PIN '%06d' matches the one on the device." +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "கடவு எண்ணானது '%06d' சாதனத்தில் உள்ள ஒன்றுடன் பொருந்துகிறதா என உறுதி செய்யவும்." + +#~ msgid "Matches" +#~ msgstr "பொருந்துகிறது" + +#~ msgid "Does not match" +#~ msgstr "பொருந்தவில்லை" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s க்கு இணைக்க வேண்டுதல்" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "சாதனத்தின் சொல்லும் பின் ஐ உள்ளீடு செய்க" + +#~ msgid "OK" +#~ msgstr "சரி" + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "இயக்க நிறுத்தம் செய்தால், அவர்களது சேமிக்கப்படாத பணிகள் இழக்கப்படலாம்." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "மன்னிக்க இன்றூ உங்களுக்கு பொன்மொழி இல்லை:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s அசரீரி சொல்லுகிறது" + +#~ msgid "Screenshots" +#~ msgstr "திரைவெட்டுகள்" + +#~ msgid "Record a screencast" +#~ msgstr "ஒரு திரைவெட்டை பதிவெடு." + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "நிரல்களின் பயன்பாடு குறித்த புள்ளிவிவரம் சேகரிக்க வேண்டுமா" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "ஷெல் சாதாரணமாக செயலிலுள்ள நிரல்களை மேற்பார்வை இடுகிறது. அதனால் அடிக்கடி பயனாகும் " +#~ "நிரல்கள் (எ-டு: துவக்கிகள்) முன் வைக்கப்படும். இந்த தரவு அந்தரங்கமாக வைக்கப்பட்டாலும் " +#~ "நீங்கள் இதை நீக்க விரும்பலாம். அப்படிச் செய்வது முன்னே சேகரித்த தரவை நீக்காஅது என் " +#~ "அறியவும்." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "உள்ளமை திரை பதிவியை நிலை மாற்ற விசைபிணைப்பு" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "உள்ளமை திரை பதிவியை துவக்க, நிறுத்த விசைபிணைப்பு" + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "திரைநிகழ்வை பதிவு செய்ய சட்டவிகிதம் ." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "க்னோம்ஷெல் இன் ஸ்க்ரீன்காஸ்ட் பதிவரில் ஸ்க்ரீன்காட் ஐ பதிகையில் வினாடிக்கு சட்டங்களின் விகிதம்." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "ஸ்க்ரீன்காஸ்டை குறியாக்க பயனாகும் ஜிஸ்ட்ரீமர் குழாய்." + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "பதிவுகளை குறியாக்க ஜிஸ்ட்ரீமர் குழாயை அமைக்கிறது. ஜிஎஸ்டி லான்ஸ் க்கு பயன்படும் அதே " +#~ "இலக்கணத்தை பின் பற்றும். குழாய்க்கு இணைப்பில்லா பதிவுக்குழி இருத்தல் வேண்டும். இதில் " +#~ "விடியோ பதிவாகும். சாதாரணமாக இதில் இணைக்காத ஒரு மூல பதிவேடு இருக்கும்; இதன் " +#~ "வெளியீடு வெளியீட்டு கோப்பாக பதிவாகும். எனினும் குழாய் தன் வெளியீட்டை தானே " +#~ "கவனித்துக்கொள்ள இயலும். இது வெளியீட்டை ஐஸ்காஸ்ட் அல்லது ஷௌட்2சென்ட் போன்றவற்றுக்கு " +#~ "நேரடியாக அனுப்ப இயலும். அமைப்பை அன்செட் செய்தாலல்லது காலி மதிப்புக்கு அமைத்தாலும் " +#~ "முன்னிருப்பு குழாய் பயன்படுத்தப்படும். நடப்பில் இது 'vp8enc min_quantizer=13 " +#~ "max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! " +#~ "webmmux' ஆகும்; இதுVP8 கோடக் ஐ பயன்படுத்தி WEBM க்கு பதிவுசெய்யும். கணினியில் " +#~ "பொருத்தமான இழை கணக்குக்கு ஊகம் செய்வதற்கு %T இடப்பிடிப்பானாக வேலை செய்யும்." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "திரைவெட்டை சேமிக்க கோப்பு பின்னொட்டு." + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "ஸ்க்ரீன்காஸ்ட் இல் பதிவாவனக்கான கோப்புப்பெயர் தனித்தன்மை வாய்ந்தது. இது நடப்பு தேதியை " +#~ "அடிப்படையாக கொண்டது; இந்த பின்னொட்டை பயன்படுத்தும். பதிவதை வேறு கொள்கலத்தின் ஒழுங்கில் " +#~ "மாற்றுகையில் இதையும் மாற்ற வேண்டும்." + +#~ msgid "Power" +#~ msgstr "மின்சக்தி" + +#~ msgid "Restart" +#~ msgstr "மறு துவக்கம்" + +#~ msgid "Screencast from %d %t" +#~ msgstr "%d %t இலிருந்து ஸ்க்ரீண்காஸ்ட்" + +#~ msgid "Universal Access Settings" +#~ msgstr "உலகளாவிய அணுகல் அமைப்பு" + +#~ msgid "Visibility" +#~ msgstr "காணல்" diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..2b032cf --- /dev/null +++ b/po/te.po @@ -0,0 +1,1965 @@ +# Telugu translation for gnome-shell. +# Copyright (C) 2011, 2012 Swecha telugu translations team +# This file is distributed under the same license as the gnome-shell package. +# Krishnababu Krothapalli , 2011, 2012, 2013, 2014. +# Hari Krishna , 2011. +# Sasi Bhushan Boddepalli , 2012. +# Praveen Illa , 2011, 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell gnome-3-0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-09-23 07:38+0000\n" +"PO-Revision-Date: 2014-09-23 15:55+0530\n" +"Last-Translator: Krishnababu Krothapalli \n" +"Language-Team: American English \n" +"Language: te\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: Lokalize 1.5\n" +"X-Project-Style: gnome\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "వ్యవస్థ" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "సందేశ పళ్ళెం చూపించు" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "క్రియాశీల గమనింపుపై దృష్టివుంచు" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "అవలోకనాన్ని చూపించు" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "అన్ని అనువర్తనాలను చూపించు" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "అనువర్తనం మెనూ తెరువు" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "గ్నోమ్ షెల్" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "కిటికీ నిర్వాహణ మరియు అనువర్తనము ప్రారంభించుట" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "గ్నోమ్ షెల్ పొడిగింతల ప్రాధాన్యతలు" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "గ్నోమ్ షెల్ పొడిగింతలను స్వరూపించు" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "గ్నోమ్ షెల్ (వేల్యాండ్ సృష్టి)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"అభివృద్ధికారులకు మరియు పరీక్షకులకు ఉపయోగపడే సాధనాలను Alt-F2 నుండి చేతనపరుచు" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 డైలాగుని వాడి అంతర్గత దోషశుద్ది మరియు సాధనాలను పర్యవేక్షించుటకు " +"సౌలభ్యతను అనుమతిస్తుంది." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "చేతనించాల్సిన పొడిగింతలు యొక్క UUIDs" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"గ్నోమ్ షెల్ పొడిగింతలు ఒక UUID లక్షణాన్ని కలిగివున్నాయి; ఏ పొడిగింతలు " +"లోడుచేయదగినవి కాదో ఈ కీ జాబితాచేయును. " +"ఏ పొడిగింత లోడవ్వాలో అది ఈ జాబితా నందు ఉండాలి. అంతేకాకుండా మీరు ఈ జాబితాను " +"పాడిగింతను చేతనపరుచు లేదా " +"పొడిగింతను అచేతనపరుచు డిబస్ పద్ధతులలో గ్నోమ్ షెల్ నందు మార్చవచ్చును." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "పొడిగింత రూపాంతర అనుగుణ్యత యొక్క చెల్లుబాటును అచేతనిస్తుంది" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"ప్రస్తుతం నడుస్తున్న రూపాంతరం తోడ్పాటుందని పేర్కొంటేనే గ్నోమ్ షెల్ " +"పొడిగింతలను లోడు చేస్తుంది. ఈ " +"ఐచ్ఛికాన్ని చేతనం చేస్తే ఈ తనిఖీని అచేనించి, తోడ్పాటు ఉన్నాదా లేదా అనే " +"విషయంతో సంబంధం లేకుండా అన్ని " +"పొడిగింతలను నింపుటకు ప్రయత్నిస్తుంది" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "ప్రియమైన అనువర్తనాల కోసం డెస్క్‌టాప్‌ దస్త్ర ఐడీల యొక్క జాబితా" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"ఈ గుర్తింపకాలకు అనుగుణమైన అనువర్తనాలు ప్రియమైన ప్రదేశములో ప్రదర్శించబడతాయి." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "అనువర్తన ఎంపికరి వీక్షణం" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "అనువర్తన ఎంపికరిలో ప్రస్తుతం ఎంపికచేసిన వీక్షణ సూచిక" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "ఆదేశ (Alt-F2) సంవాదం కోసం చరిత్ర" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "చూస్తున్న గ్లాసు సంవాదం కొరకు చరిత్ర" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "వాడుకరి మెనూ నందు ఎల్లప్పుడూ 'నిష్క్రమించు' మెనూ అంశాన్ని చూపించు." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"ఏక-వాడుకరి, ఏక-ఘట్టం పరిస్థితులలో 'నిష్క్రమించు' మెనూ అంశము స్వయంచాలకంగా " +"దాగుటను ఈ మీట భర్తీ " +"చేస్తుంది." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"ఎన్క్రిప్టెడ్ లేదా రిమోట్ దస్త్రవ్యవస్థల మౌంటు చేయుటకు సంకేతపదాలను " +"గుర్తుంచుకోవాలా" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"ఎన్క్రిప్టెడ్ పరికరం లేదా రిమోట్ దస్త్రవ్యవస్థ మౌంటవునప్పుడు షెల్ సంకేతపదం " +"కొరకు అభ్యర్ధించును. భవిష్య " +"వినియోగం కొరకు సంకేతపదం దాయగలిగితే 'సంకేతపదం గుర్తుంచు' చెక్‌బాక్స్ వస్తుంది. " +"ఈ కీ చెక్‌బాక్స్ యొక్క " +"అప్రమేయ స్థితిని అమర్చును." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Show the week date in the calendar" +msgstr "క్యాలెండరులో వారపు తేదీని చూపించు" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "If true, display the ISO week date in the calendar." +msgstr "ఒకవేళ నిజమైతే, క్యాలెండరులో ISO వారము తేదీని ప్రదర్శిస్తుంది." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to open the application menu" +msgstr "అనువర్తనం మెనూ తెరవడానికి కీ బైండింగ్ " + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to open the application menu." +msgstr "అనువర్తనం మెనూ తెరవడానికి కీ బైండింగ్ " + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"అనువర్తనములు చూపు\" దర్శనంను తెరువుటకు కీబందనం" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"కార్యకలాపాల అవలోకనం యొక్క \"అనువర్తనములు చూపించు\" వీక్షణం తెరువుటకు కీ బందనం." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the overview" +msgstr "అవలోకనాన్ని తెరుచుటకు కీబంధనం" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the Activities Overview." +msgstr "కార్యకలాపాల అవలోకనాన్ని తెరుచుటకు కీబంధనం" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "సందేశ పళ్ళెం యొక్క దృగ్గోచరతను మార్చుటకు అడ్డదారి" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "సందేశ పళ్ళెం యొక్క దృగ్గోచరతను మార్చుటకు అడ్డదారి" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "క్రియాశీల ప్రకటన ఫోకస్‌కు కీబందనం" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "క్రియాశీల ప్రకటన ఫోకస్‌కు కీబందనం." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"దోషవిశ్లేషణ కోసం, కీబైండింగు నడుస్తున్న అన్ని ట్వీన్లను తిరిగి కొనసాగిస్తుంది " +"మరియు నిలిపివేస్తుంది." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Which keyboard to use" +msgstr "ఏ కీబోర్డ్ ఉపయోగించాలి" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "The type of keyboard to use." +msgstr "ఉపయోగించుటకు కీబోర్డ్ రకము." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "Limit switcher to current workspace." +msgstr "మార్పకాన్ని ప్రస్తుత కార్యక్షేత్రానికి పరిమితించు" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"ఒకవేళ నిజమైతే, ప్రస్తుత కార్యక్షేత్రంలో ఉన్న అనువర్తనాల కిటికీలు మాత్రమే " +"మార్పకంలో చూపించబడతాయి. లేదంటే, " +"అన్ని అనువర్తనాలు ఉంచబడతాయి." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The application icon mode." +msgstr "అనువర్తనం ప్రతిమ రీతి." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"స్విచర్ నందు కిటికీలు ఎలా చూపునో ఆకృతీకరించును. చెల్లునటువంటి సాధ్యాలు " +"'thumbnail-only' (విండో " +"థంబ్‌నెయిల్ చూపును), 'app-icon-only' (అనువర్తన ప్రతిమ మాత్రమే చూపును) లేదా " +"'both'." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"ఒకవేళ నిజమైతే, ప్రస్తుత కార్యక్షేత్రంలో ఉన్న కిటికీలు మాత్రమే మార్పకంలో " +"చూపించబడతాయి. లేదంటే, అన్ని కిటికీలు " +"ఉంచబడతాయి." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "Attach modal dialog to the parent window" +msgstr "పేరెంట్ కిటికీకు మోడల్ డైలాగ్ జోడించు" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"గ్నోమ్ షెల్ నందు నడుచునప్పుడు ఈ కీ org.gnome.mutter నందలి కీను వోవర్‌రైడ్ " +"చేయును." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "తెర అంచులనందు విండోలను విడువునప్పుడు ఎడ్జ్ టైటిలింగ్ చేతనం చేయి" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Workspaces are managed dynamically" +msgstr "కార్యక్షేత్రాలు గతికంగా నిర్వహించబడును" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "Workspaces only on primary monitor" +msgstr "ప్రాధమిక మానిటర్ పైని కార్యక్షేత్రాలు మాత్రమే" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "మౌసు రీతిలో కేంద్రీకరణ మార్పులను పాయింటరు కదలిక ఆగే వరకూ ఆలస్యం చేయి" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +msgid "Captive Portal" +msgstr "కాప్టివ్ పోర్టల్" + +#: ../js/extensionPrefs/main.js:123 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s కొరకు ప్రాధాన్యతల సంభాషణను నింపుటలో అక్కడ ఒక దోషం ఉన్నది:" + +#: ../js/extensionPrefs/main.js:155 +msgid "GNOME Shell Extensions" +msgstr "గ్నోమ్ షెల్ పొడిగింతలు" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 +#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:915 +msgid "Cancel" +msgstr "రద్దుచేయి" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 +msgid "Next" +msgstr "తరువాత" + +#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "తాళంతీయి" + +#: ../js/gdm/authPrompt.js:215 +msgctxt "button" +msgid "Sign In" +msgstr "ప్రవేశించండి" + +#: ../js/gdm/loginDialog.js:269 +msgid "Choose Session" +msgstr "ఘట్టాన్ని ఎంచుకోండి" + +#: ../js/gdm/loginDialog.js:429 +msgid "Not listed?" +msgstr "జాబితా చేయలేదా?" + +#: ../js/gdm/loginDialog.js:614 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ఉదా., వాడుకరి లేదా %s)" + +#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269 +#: ../js/ui/components/networkAgent.js:287 +msgid "Username: " +msgstr "వాడుకరిపేరు: " + +#: ../js/gdm/loginDialog.js:922 +msgid "Login Window" +msgstr "ప్రవేశ కిటికీ" + +#: ../js/gdm/util.js:323 +msgid "Authentication error" +msgstr "ధృవీకరణ దోషం" + +#: ../js/gdm/util.js:453 +msgid "(or swipe finger)" +msgstr "(లేదా వేలుతో స్వైప్‌చేయి)" + +#: ../js/misc/util.js:115 +msgid "Command not found" +msgstr "ఆదేశము కనపడలేదు" + +#: ../js/misc/util.js:148 +msgid "Could not parse command:" +msgstr "ఆదేశము పదనిరూపణ వీలుకాదు:" + +#: ../js/misc/util.js:156 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” అమలు విఫలమైంది:" + +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "జాల ధృవీకరణ దారిమార్పు" + +#: ../js/ui/appDisplay.js:772 +msgid "Frequently used applications will appear here" +msgstr "తరచూ వాడే అనువర్తనాలు ఇక్కడ కనిపిస్తాయి" + +#: ../js/ui/appDisplay.js:883 +msgid "Frequent" +msgstr "తరచు" + +#: ../js/ui/appDisplay.js:890 +msgid "All" +msgstr "అన్ని" + +#: ../js/ui/appDisplay.js:1790 +msgid "New Window" +msgstr "కొత్త కిటికీ" + +#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285 +msgid "Remove from Favorites" +msgstr "ఇష్టాంశాల నుండి తొలగించు" + +#: ../js/ui/appDisplay.js:1822 +msgid "Add to Favorites" +msgstr "ఇష్టాంశాలకు జతచేయి" + +#: ../js/ui/appDisplay.js:1831 +msgid "Show Details" +msgstr "వివరాలను చూపించు" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s మీ ఇష్టాంశాలకు జతచేయబడింది." + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s మీ ఇష్టాంశాల నుండి తీసివేయబడింది." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813 +#: ../js/ui/status/system.js:337 +msgid "Settings" +msgstr "అమరికలు" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "నేపథ్యాన్ని మార్చు..." + +#. 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:67 +msgctxt "event list time" +msgid "All Day" +msgstr "రోజు మొత్తం" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : */ +#: ../js/ui/calendar.js:73 +msgctxt "event list time" +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space */ +#: ../js/ui/calendar.js:82 +msgctxt "event list time" +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. */ +#: ../js/ui/calendar.js:113 +msgctxt "grid sunday" +msgid "S" +msgstr "ఆ" + +#. Translators: Calendar grid abbreviation for Monday */ +#: ../js/ui/calendar.js:115 +msgctxt "grid monday" +msgid "M" +msgstr "సో" + +#. Translators: Calendar grid abbreviation for Tuesday */ +#: ../js/ui/calendar.js:117 +msgctxt "grid tuesday" +msgid "T" +msgstr "మ" + +#. Translators: Calendar grid abbreviation for Wednesday */ +#: ../js/ui/calendar.js:119 +msgctxt "grid wednesday" +msgid "W" +msgstr "బు" + +#. Translators: Calendar grid abbreviation for Thursday */ +#: ../js/ui/calendar.js:121 +msgctxt "grid thursday" +msgid "T" +msgstr "గు" + +#. Translators: Calendar grid abbreviation for Friday */ +#: ../js/ui/calendar.js:123 +msgctxt "grid friday" +msgid "F" +msgstr "శు" + +#. Translators: Calendar grid abbreviation for Saturday */ +#: ../js/ui/calendar.js:125 +msgctxt "grid saturday" +msgid "S" +msgstr "శ" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. */ +#: ../js/ui/calendar.js:138 +msgctxt "list sunday" +msgid "Su" +msgstr "ఆది" + +#. Translators: Event list abbreviation for Monday */ +#: ../js/ui/calendar.js:140 +msgctxt "list monday" +msgid "M" +msgstr "సోమ" + +#. Translators: Event list abbreviation for Tuesday */ +#: ../js/ui/calendar.js:142 +msgctxt "list tuesday" +msgid "T" +msgstr "మం" + +#. Translators: Event list abbreviation for Wednesday */ +#: ../js/ui/calendar.js:144 +msgctxt "list wednesday" +msgid "W" +msgstr "బుధ" + +#. Translators: Event list abbreviation for Thursday */ +#: ../js/ui/calendar.js:146 +msgctxt "list thursday" +msgid "Th" +msgstr "గురు" + +#. Translators: Event list abbreviation for Friday */ +#: ../js/ui/calendar.js:148 +msgctxt "list friday" +msgid "F" +msgstr "శుక్ర" + +#. Translators: Event list abbreviation for Saturday */ +#: ../js/ui/calendar.js:150 +msgctxt "list saturday" +msgid "S" +msgstr "శని" + +#: ../js/ui/calendar.js:453 +msgid "Previous month" +msgstr "మునుపటి నెల" + +#: ../js/ui/calendar.js:463 +msgid "Next month" +msgstr "తదుపరి నెల" + +#. Translators: Text to show if there are no events */ +#: ../js/ui/calendar.js:781 +msgid "Nothing Scheduled" +msgstr "ఏ ప్రణాళిక లేదు" + +#. Translators: Shown on calendar heading when selected day occurs on current year */ +#: ../js/ui/calendar.js:799 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year */ +#: ../js/ui/calendar.js:802 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: ../js/ui/calendar.js:813 +msgid "Today" +msgstr "నేడు" + +#: ../js/ui/calendar.js:817 +msgid "Tomorrow" +msgstr "రేపు" + +#: ../js/ui/calendar.js:828 +msgid "This week" +msgstr "ఈ వారం" + +#: ../js/ui/calendar.js:836 +msgid "Next week" +msgstr "తరువాత వారం" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "బాహ్య డ్రైవు అనుసంధానమైంది" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "బాహ్య డ్రైవ్ నిరనుసంధానించబడింది" + +#: ../js/ui/components/autorunManager.js:296 +msgid "Removable Devices" +msgstr "తీసివేయదగు పరికరాలు" + +#: ../js/ui/components/autorunManager.js:596 +#, javascript-format +msgid "Open with %s" +msgstr "%s‍తో తెరువు" + +#: ../js/ui/components/autorunManager.js:622 +msgid "Eject" +msgstr "బయటకునెట్టు" + +#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285 +msgid "Password:" +msgstr "సంకేతపదం:" + +#: ../js/ui/components/keyring.js:120 +msgid "Type again:" +msgstr "మళ్ళీ టంకించండి:" + +#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 +#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918 +msgid "Connect" +msgstr "అనుసంధానించు" + +#: ../js/ui/components/networkAgent.js:231 +#: ../js/ui/components/networkAgent.js:243 +#: ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:291 +#: ../js/ui/components/networkAgent.js:301 +msgid "Password: " +msgstr "సంకేతపదం:" + +#: ../js/ui/components/networkAgent.js:236 +msgid "Key: " +msgstr "మీట: " + +#: ../js/ui/components/networkAgent.js:275 +msgid "Identity: " +msgstr "గుర్తింపు: " + +#: ../js/ui/components/networkAgent.js:277 +msgid "Private key password: " +msgstr "వ్యక్తిగత కీ సంకేతపదం: " + +#: ../js/ui/components/networkAgent.js:289 +msgid "Service: " +msgstr "సేవ: " + +#: ../js/ui/components/networkAgent.js:318 +msgid "Authentication required by wireless network" +msgstr "వైర్‌లెస్ నెట్‌వర్క్ చేత ధృవీకరణ అవసరమైంది" + +#: ../js/ui/components/networkAgent.js:319 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"నిస్తంత్రి నెట్‌వర్కు “%s” ప్రాప్యించుటకు సంకేతపదాలు లేదా ఎన్క్రిప్షన్ మీటలు " +"అవసరం." + +#: ../js/ui/components/networkAgent.js:323 +msgid "Wired 802.1X authentication" +msgstr "వైర్డ్ 802.1X ధృవీకరణ" + +#: ../js/ui/components/networkAgent.js:325 +msgid "Network name: " +msgstr "నెట్‍‌వర్క్ పేరు: " + +#: ../js/ui/components/networkAgent.js:330 +msgid "DSL authentication" +msgstr "DSL ధృవీకరణ" + +#: ../js/ui/components/networkAgent.js:337 +msgid "PIN code required" +msgstr "PIN కోడ్ అవసరమైంది" + +#: ../js/ui/components/networkAgent.js:338 +msgid "PIN code is needed for the mobile broadband device" +msgstr "మొబైల్ బ్రాడ్‌బాండ్ పరికరం కొరకు PIN కోడ్ అవసరమైంది" + +#: ../js/ui/components/networkAgent.js:339 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:345 +msgid "Mobile broadband network password" +msgstr "మొబైల్ బ్రాడ్‌బాండ్ నెట్వర్క్ సంకేతపదం" + +#: ../js/ui/components/networkAgent.js:346 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s”కు అనుసంధానమగుటకు సంకేతపదం అవసరం." + +#: ../js/ui/components/polkitAgent.js:54 +msgid "Authentication Required" +msgstr "ధృవీకరణ అవసరం" + +#: ../js/ui/components/polkitAgent.js:96 +msgid "Administrator" +msgstr "నిర్వాహకుడు" + +#: ../js/ui/components/polkitAgent.js:175 +msgid "Authenticate" +msgstr "ధృవీకరించు" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. */ +#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "క్షమించండి, అది పనిచేయలేదు. దయచేసి మరలా ప్రయత్నించండి." + +#: ../js/ui/components/telepathyClient.js:240 +msgid "Invitation" +msgstr "ఆహ్వానం" + +#: ../js/ui/components/telepathyClient.js:300 +msgid "Call" +msgstr "కాల్" + +#: ../js/ui/components/telepathyClient.js:316 +msgid "File Transfer" +msgstr "దస్త్ర బదిలీ" + +#: ../js/ui/components/telepathyClient.js:420 +msgid "Chat" +msgstr "సంభాషణ" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Unmute" +msgstr "శబ్దం" + +#: ../js/ui/components/telepathyClient.js:483 +msgid "Mute" +msgstr "నిశబ్దం" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:953 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:960 +msgid "Yesterday, %H∶%M" +msgstr "నిన్న, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" */ +#: ../js/ui/components/telepathyClient.js:967 +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" */ +#: ../js/ui/components/telepathyClient.js:974 +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" */ +#: ../js/ui/components/telepathyClient.js:980 +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 24h format */ +#: ../js/ui/components/telepathyClient.js:986 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:993 +msgid "Yesterday, %l∶%M %p" +msgstr "నిన్న, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1000 +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" */ +#: ../js/ui/components/telepathyClient.js:1007 +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm"*/ +#: ../js/ui/components/telepathyClient.js:1013 +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. */ +#: ../js/ui/components/telepathyClient.js:1045 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s ఇప్పుడు %s గా తెలుసు" + +#. translators: argument is a room name like +#. * room@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1149 +#, javascript-format +msgid "Invitation to %s" +msgstr "%sకు ఆహ్వానం" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. */ +#: ../js/ui/components/telepathyClient.js:1157 +#, javascript-format +msgid "%s is inviting you to join %s" +msgstr "%s మిమ్ములను %s పై చేరుటకు ఆహ్వానిస్తోంది" + +#: ../js/ui/components/telepathyClient.js:1159 +#: ../js/ui/components/telepathyClient.js:1194 +#: ../js/ui/components/telepathyClient.js:1228 +#: ../js/ui/components/telepathyClient.js:1286 +msgid "Decline" +msgstr "తిరస్కరించు" + +#: ../js/ui/components/telepathyClient.js:1165 +#: ../js/ui/components/telepathyClient.js:1234 +#: ../js/ui/components/telepathyClient.js:1291 +msgid "Accept" +msgstr "ఆమోదించు" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1184 +#, javascript-format +msgid "Video call from %s" +msgstr "%s నుండి వీడియో కాల్" + +#. translators: argument is a contact name like Alice for example. */ +#: ../js/ui/components/telepathyClient.js:1187 +#, javascript-format +msgid "Call from %s" +msgstr "%s నుండి కాల్" + +#. translators: this is a button label (verb), not a noun */ +#: ../js/ui/components/telepathyClient.js:1201 +msgid "Answer" +msgstr "సమాధానమివ్వండి" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. */ +#: ../js/ui/components/telepathyClient.js:1222 +#, javascript-format +msgid "%s is sending you %s" +msgstr "%s మీకు %s పంపుచున్నది" + +#. To translators: The parameter is the contact's alias */ +#: ../js/ui/components/telepathyClient.js:1251 +#, javascript-format +msgid "%s would like permission to see when you are online" +msgstr "మీరు ఆన్‌లైన్‌లో వున్నప్పుడు చూడుటకు %s అనుమతి కోరుతున్నారు" + +#: ../js/ui/components/telepathyClient.js:1337 +msgid "Network error" +msgstr "నెట్‍‌వర్క్ దోషం" + +#: ../js/ui/components/telepathyClient.js:1339 +msgid "Authentication failed" +msgstr "ధృవీకరణ వైఫల్యం" + +#: ../js/ui/components/telepathyClient.js:1341 +msgid "Encryption error" +msgstr "ఎన్క్రిప్షన్ దోషం" + +#: ../js/ui/components/telepathyClient.js:1343 +msgid "Certificate not provided" +msgstr "ధృవీకరణపత్రం అందించబడలేదు" + +#: ../js/ui/components/telepathyClient.js:1345 +msgid "Certificate untrusted" +msgstr "ధృవీకరణపత్రం నమ్మలేనిది" + +#: ../js/ui/components/telepathyClient.js:1347 +msgid "Certificate expired" +msgstr "ధృవీకరణపత్రం గడువుతీరెను" + +#: ../js/ui/components/telepathyClient.js:1349 +msgid "Certificate not activated" +msgstr "ధృవీకరణపత్రం క్రియాశీలపరచబడిలేదు" + +#: ../js/ui/components/telepathyClient.js:1351 +msgid "Certificate hostname mismatch" +msgstr "ధృవీకరణపత్రం హోస్టుపేరు సరిపోలలేదు" + +#: ../js/ui/components/telepathyClient.js:1353 +msgid "Certificate fingerprint mismatch" +msgstr "ధృవీకరణపత్రం వ్రేలిముద్ర సరిపోలలేదు" + +#: ../js/ui/components/telepathyClient.js:1355 +msgid "Certificate self-signed" +msgstr "ధృవీకరణపత్రం స్వతహాగా-సంతకంచేయబడెను" + +#: ../js/ui/components/telepathyClient.js:1357 +msgid "Status is set to offline" +msgstr "స్థితి ఆఫ్‌లైన్‌కు అమర్చబడెను" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "Encryption is not available" +msgstr "ఎన్క్రిప్షన్ అందుబాటులో లేదు" + +#: ../js/ui/components/telepathyClient.js:1361 +msgid "Certificate is invalid" +msgstr "ధృవీకరణపత్రం చెల్లనిది" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Connection has been refused" +msgstr "అనుసంధానము తిరస్కరించబడెను" + +#: ../js/ui/components/telepathyClient.js:1365 +msgid "Connection can't be established" +msgstr "అనుసంధానం ఏర్పరచలేము" + +#: ../js/ui/components/telepathyClient.js:1367 +msgid "Connection has been lost" +msgstr "అనుసంధానము కోల్పోయాము" + +#: ../js/ui/components/telepathyClient.js:1369 +msgid "This account is already connected to the server" +msgstr "ఈ ఖాతా ఇదివరకే సేవకానికి అనుసంధానమైంది" + +#: ../js/ui/components/telepathyClient.js:1371 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "అనుసంధానం అదే వనరు ఉపయోగించి కొత్త అనుసంధానంచే పునఃస్థాపించబడెను" + +#: ../js/ui/components/telepathyClient.js:1373 +msgid "The account already exists on the server" +msgstr "ఖాతా ఇప్పటికే సేవికపైన ఉన్నది" + +#: ../js/ui/components/telepathyClient.js:1375 +msgid "Server is currently too busy to handle the connection" +msgstr "అనుసంధానంను సంభాలించుటకు సేవిక మరీ వత్తిడిలో వుంది" + +#: ../js/ui/components/telepathyClient.js:1377 +msgid "Certificate has been revoked" +msgstr "ధృవీకరణపత్రం కొట్టివేయబడింది" + +#: ../js/ui/components/telepathyClient.js:1379 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "" +"ధృవీకరణపత్రం సురక్షితం కాని సైఫర్ ఆల్గార్దెమ్ వుపయోగించుచున్నది లేదా " +"క్రిప్టోగ్రఫీ పరంగా బలహీనంగా వుంది" + +#: ../js/ui/components/telepathyClient.js:1381 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"సేవిక ధృవీకరణపత్రం యొక్క పొడవు, లేదా సేవిక ధృవీకరణపత్రం చైన్ యొక్క లోతు, " +"క్రిప్టోగ్రఫీ లైబ్రరీ చేత " +"నిర్దేశితమైన పరిమితులను మించును" + +#: ../js/ui/components/telepathyClient.js:1383 +msgid "Internal error" +msgstr "అంతర్గత దోషం" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. */ +#: ../js/ui/components/telepathyClient.js:1393 +#, javascript-format +msgid "Unable to connect to %s" +msgstr "%s కు అనుసంధానం కాలేకపోయింది" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "View account" +msgstr "ఖాతాను చూడండి" + +#: ../js/ui/components/telepathyClient.js:1435 +msgid "Unknown reason" +msgstr "తెలియని కారణం" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154 +msgid "Windows" +msgstr "కిటికీలు" + +#: ../js/ui/dash.js:249 ../js/ui/dash.js:287 +msgid "Show Applications" +msgstr "అనువర్తనాలను చూపించు" + +#: ../js/ui/dash.js:445 +msgid "Dash" +msgstr "గీటు" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Calendar" +msgstr "క్యాలెండరు తెరువు" + +#: ../js/ui/dateMenu.js:100 +msgid "Open Clocks" +msgstr "గడియారాలు తెరువు" + +#: ../js/ui/dateMenu.js:107 +msgid "Date & Time Settings" +msgstr "తేదీ మరియు సమయం అమరికలు" + +#. 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:204 +msgid "%A %B %e, %Y" +msgstr "%A %B %e, %Y" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s నిష్క్రమించు" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "నిష్క్రమించు" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s స్వయంచాలకంగా %d సెకనులో నిష్క్రమించును." +msgstr[1] "%s స్వయంచాలకంగా %d సెకనులలో నిష్క్రమించును." + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "మీరు %d సెకనులో స్వయంచాలకంగా నిష్క్రమిస్తారు." +msgstr[1] "మీరు %d సెకనులలో స్వయంచాలకంగా నిష్క్రమిస్తారు." + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "నిష్క్రమించు" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "విద్యుత్ ఆపు" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "నవీకరణలను స్థాపించి, విద్యుత్ ఆపు" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "%d సెకన్లలో వ్యవస్థ స్వయంచాలకంగా ఆపివేయబడుతుంది." +msgstr[1] "%d సెకన్లలో వ్యవస్థ స్వయంచాలకంగా ఆపివేయబడుతుంది." + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "పెండింగులో ఉన్న సాఫ్ట్‌వేర్ నవీకరణలను స్థాపించు" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "పునఃప్రారంభించు" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "విద్యుత్ ఆపు" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "పునఃప్రారంభించు" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "%d సెకనులో వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది." +msgstr[1] "%d సెకనులలో వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది." + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "నవీకరణలను స్థాపించి, పునఃప్రారంభించు" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"%d క్షణాలలో నవీకరణలను స్థాపించి, వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది." +msgstr[1] "" +"%d క్షణాలలో నవీకరణలను స్థాపించి, వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది." + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "పునఃప్రారంభించి & స్థాపించు" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "స్థాపించి & విద్యుత్ ఆపు" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "నవీకరణలు స్థాపించిన తరువాత విద్యుత్ ఆపు" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"బ్యాటరీ శక్తితో నడుస్తూంది: దయచేసి నవీకరణలు స్థాపించే ముందు విద్యుత్ " +"అనుసంధానించండి." + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "కొన్ని అనువర్తనాలు బిజీగా ఉన్నాయి లేదా భద్రపరుచని పని ఉండిపోయింది." + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "వేరే వాడుకరులు లాగిన్ అయివున్నారు." + +#. Translators: Remote here refers to a remote session, like a ssh login */ +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (రిమోట్)" + +#. Translators: Console here refers to a tty like a VT console */ +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (కన్సోల్)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "స్థాపించు" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org నుండి “%s” దింపుకొని, స్థాపించాలా?" + +#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523 +msgid "Keyboard" +msgstr "కీబోర్డు" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "ఏ పొడిగింతలు స్థాపించబడిలేవు" + +#. Translators: argument is an extension UUID. */ +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ఎటువంటి దోషాలను ఉద్గారించలేదు." + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "దోషాలను దాయి" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "దోషాలను చూపించు" + +#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 +#: ../js/ui/status/location.js:176 +msgid "Enabled" +msgstr "చేతనమైనది" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode) */ +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 +#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "అచేతనమైనది" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "దోషం" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "కాలం చెల్లినది" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "దింపుకుంటున్నది" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "మూలాన్ని చూడు" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "జాల పుట" + +#: ../js/ui/messageTray.js:1327 +msgid "Open" +msgstr "తెరువు" + +#: ../js/ui/messageTray.js:1334 +msgid "Remove" +msgstr "తీసివేయి" + +#: ../js/ui/messageTray.js:1631 +msgid "Notifications" +msgstr "ప్రకటనలు" + +#: ../js/ui/messageTray.js:1638 +msgid "Clear Messages" +msgstr "సందేశాలు తుడిచివేయి" + +#: ../js/ui/messageTray.js:1657 +msgid "Notification Settings" +msgstr "ప్రకటనల అమరికలు" + +#: ../js/ui/messageTray.js:1710 +msgid "Tray Menu" +msgstr "పళ్ళెం జాబితా" + +#: ../js/ui/messageTray.js:1934 +msgid "No Messages" +msgstr "సందేశాలు లేవు" + +#: ../js/ui/messageTray.js:1979 +msgid "Message Tray" +msgstr "సందేశ పళ్ళెం" + +#: ../js/ui/messageTray.js:2992 +msgid "System Information" +msgstr "వ్యవస్థ సమాచారం" + +#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425 +msgctxt "program" +msgid "Unknown" +msgstr "తెలియదు" + +#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d కొత్త సందేశం" +msgstr[1] "%d కొత్త సందేశాలు" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "రద్దుచేయి" + +#: ../js/ui/overview.js:124 +msgid "Overview" +msgstr "పర్యావలోకనం" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. */ +#: ../js/ui/overview.js:246 +msgid "Type to search…" +msgstr "వెతకడానికి టైపు చేయండి…" + +#: ../js/ui/panel.js:515 +msgid "Quit" +msgstr "నిష్క్రమించు" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". */ +#: ../js/ui/panel.js:567 +msgid "Activities" +msgstr "కార్యకలాపాలు" + +#: ../js/ui/panel.js:918 +msgid "Top Bar" +msgstr "పైన పట్టీ" + +#: ../js/ui/popupMenu.js:269 +msgid "toggle-switch-us" +msgstr "టోగిల్-స్విచ్-అజ్" + +#: ../js/ui/runDialog.js:70 +msgid "Enter a Command" +msgstr "ఒక ఆదేశమును ప్రవేశపెట్టండి" + +#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 +msgid "Close" +msgstr "మూసివేయి" + +#: ../js/ui/runDialog.js:277 +msgid "Restarting…" +msgstr "పునఃప్రారంభిస్తున్నాము…" + +#. Translators: This is a time format for a date in +#. long format */ +#: ../js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: ../js/ui/screenShield.js:153 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d కొత్త గమనింపు" +msgstr[1] "%d కొత్త గమనింపులు" + +#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345 +msgid "Lock" +msgstr "తాళంవేయి" + +#: ../js/ui/screenShield.js:706 +msgid "GNOME needs to lock the screen" +msgstr "గ్నోమ్ తెరకు తాళం వేయవలసివుంది" + +#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304 +msgid "Unable to lock" +msgstr "తాళం వేయలేకపోతూంది" + +#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305 +msgid "Lock was blocked by an application" +msgstr "తాళం ఒక అనువర్తనం చేత నిరోధించబడింది" + +#: ../js/ui/search.js:594 +msgid "Searching…" +msgstr "వెతుకుతోంది..." + +#: ../js/ui/search.js:596 +msgid "No results." +msgstr "ఏ ఫలితాలు లేవు." + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "నకలించు" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "అతికించు" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "పాఠం చూపించు" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "పాఠ్యం దాయి" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "సంకేతపదం" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "సంకేతపదాన్ని గుర్తుంచుకొను" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "ప్రాపనీయత" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "జూమ్" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "తెర చదువకం" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "తెర కీబోర్డు" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "దృశ్యమాన అప్రమత్తతలు" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "స్టికీ కీలు" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "నెమ్మది కీలు" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "బౌన్స్ కీలు" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "మౌస్ కీలు" + +#: ../js/ui/status/accessibility.js:144 +msgid "High Contrast" +msgstr "అధిక వ్యత్యాసం" + +#: ../js/ui/status/accessibility.js:193 +msgid "Large Text" +msgstr "అతిపెద్ద పాఠ్యము" + +#: ../js/ui/status/bluetooth.js:49 +msgid "Bluetooth" +msgstr "బ్లూటూత్" + +#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281 +#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86 +#: ../js/ui/status/rfkill.js:114 +msgid "Turn Off" +msgstr "చేతనించు" + +#: ../js/ui/status/bluetooth.js:54 +msgid "Bluetooth Settings" +msgstr "బ్లూటూత్ అమరికలు" + +#: ../js/ui/status/bluetooth.js:104 +#, javascript-format +msgid "%d Connected Device" +msgid_plural "%d Connected Devices" +msgstr[0] "%d అనుసంధానించబడిన పరికరం" +msgstr[1] "%d అనుసంధానించబడిన పరికరాలు" + +#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309 +msgid "Not Connected" +msgstr "అనుసంధానించబడలేదు" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "ప్రకాశత" + +#: ../js/ui/status/keyboard.js:547 +msgid "Show Keyboard Layout" +msgstr "కీబోర్డు నమూనాను చూపించు" + +#: ../js/ui/status/location.js:65 +msgid "Location" +msgstr "స్థానం" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177 +msgid "Disable" +msgstr "అచేతనించు" + +#: ../js/ui/status/location.js:73 +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "గోప్యతా అమరికలు" + +#: ../js/ui/status/location.js:176 +msgid "In Use" +msgstr "వాడుకలో వుంది" + +#: ../js/ui/status/location.js:180 +msgid "Enable" +msgstr "చేతనించు" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "<తెలియదు>" + +#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307 +#: ../js/ui/status/network.js:1511 +msgid "Off" +msgstr "అచేతనం" + +#: ../js/ui/status/network.js:459 +msgid "Connected" +msgstr "అనుసంధానమైంది" + +#. 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) */ +#: ../js/ui/status/network.js:463 +msgid "Unmanaged" +msgstr "అస్థవ్యస్థం" + +#: ../js/ui/status/network.js:465 +msgid "Disconnecting" +msgstr "అననుసంధానిస్తున్నాము" + +#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301 +msgid "Connecting" +msgstr "అనుసంధానిస్తూంది" + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:474 +msgid "Authentication required" +msgstr "ధృవీకరణ అవసరం" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing */ +#: ../js/ui/status/network.js:482 +msgid "Firmware missing" +msgstr "ఫిర్మ్​వేర్ తప్పిపోయినది" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage */ +#: ../js/ui/status/network.js:486 +msgid "Unavailable" +msgstr "అందుబాటులోలేదు" + +#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695 +msgid "Connection failed" +msgstr "అనుసంధానం విఫలమైంది" + +#: ../js/ui/status/network.js:504 +msgid "Wired Settings" +msgstr "తంత్రి అమరికలు" + +#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "మొబైల్ బ్రాడ్‌బాండ్ అమరికలు" + +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +msgid "Hardware Disabled" +msgstr "హార్డువేర్ అచేతనించబడింది" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "అంతర్జాల అనుసంధానం వలె ఉపయోగించు" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "విమాన రీతి చేతనం" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "విమాన రీతి ప్రారంభించబడినప్పుడు వై-ఫై అచేతనించబడుతుంది." + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "విమాన రీతిని ఆపివేయి" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "వై-ఫై ఆపబడింది" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "నెట్‌వర్కుకు అనుసంధానం కావాలంటే వై-ఫై చేతనమైవుండాలి." + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "వై-ఫై ప్రారంభించు" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "వై-ఫై నెట్‍‌వర్కులు" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "ఒక నెట్‌వర్కును ఎంచుకోండి" + +#: ../js/ui/status/network.js:882 +msgid "No Networks" +msgstr "ఏ నెట్‍‌వర్కులు లేవు" + +#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112 +msgid "Use hardware switch to turn off" +msgstr "ఆపివేయుటకు హార్డ్‌వేర్ మీటను వాడండి" + +#: ../js/ui/status/network.js:1173 +msgid "Select Network" +msgstr "నెట్‍‌వర్క్ ఎంచుకోండి" + +#: ../js/ui/status/network.js:1179 +msgid "Wi-Fi Settings" +msgstr "వై-ఫై అమరికలు" + +#: ../js/ui/status/network.js:1281 +msgid "Turn On" +msgstr "అచేతనించు" + +#: ../js/ui/status/network.js:1298 +msgid "Hotspot Active" +msgstr "హాట్‌స్పాట్ క్రియాశీలం" + +#: ../js/ui/status/network.js:1409 +msgid "connecting..." +msgstr "అనుసంధానిస్తున్నది..." + +#. Translators: this is for network connections that require some kind of key or password */ +#: ../js/ui/status/network.js:1412 +msgid "authentication required" +msgstr "ప్రమాణీకరణ అవసరం" + +#: ../js/ui/status/network.js:1414 +msgid "connection failed" +msgstr "అనుసంధానం విఫలమైంది" + +#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89 +msgid "Network Settings" +msgstr "నెట్‌వర్క్ అమరికలు" + +#: ../js/ui/status/network.js:1482 +msgid "VPN Settings" +msgstr "VPN అమరికలు" + +#: ../js/ui/status/network.js:1501 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1656 +msgid "Network Manager" +msgstr "నెట్‍‌వర్క్ నిర్వాహకము" + +#: ../js/ui/status/network.js:1696 +msgid "Activation of network connection failed" +msgstr "నెట్‌వర్క్అనుసంధానం క్రియాశీలపరచుట విఫలమైంది" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "విద్యుత్ అమరికలు" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "పూర్తిగా చార్జయింది" + +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "అంచనావేస్తున్నది…" + +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "%d∶%02d మిగిలివున్నది (%d%%)" + +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "%d∶%02d పూర్తయ్యేవరకు (%d%%)" + +#: ../js/ui/status/power.js:119 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:121 +msgid "Battery" +msgstr "బ్యాటరీ" + +#: ../js/ui/status/rfkill.js:83 +msgid "Airplane Mode" +msgstr "విమాన రీతి" + +#: ../js/ui/status/rfkill.js:85 +msgid "On" +msgstr "చేతనం" + +#: ../js/ui/status/system.js:317 +msgid "Switch User" +msgstr "వాడుకరిని మార్చు" + +#: ../js/ui/status/system.js:322 +msgid "Log Out" +msgstr "నిష్క్రమించు" + +#: ../js/ui/status/system.js:341 +msgid "Orientation Lock" +msgstr "దిశ తాళం" + +#: ../js/ui/status/system.js:349 +msgid "Suspend" +msgstr "తాత్కాలికంగా నిలిపివేయి" + +#: ../js/ui/status/system.js:352 +msgid "Power Off" +msgstr "విద్యుత్ ఆపు" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "ధ్వనిస్థాయి మార్చబడింది" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "ధ్వనిస్థాయి" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "మైక్రోఫోను" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "వేరొక వాడుకరి వలె ప్రవేశించండి" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "కిటికీ తాళంతీయి" + +#: ../js/ui/viewSelector.js:158 +msgid "Applications" +msgstr "అనువర్తనాలు" + +#: ../js/ui/viewSelector.js:162 +msgid "Search" +msgstr "వెతుకు" + +#: ../js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” సిద్ధం" + +#: ../js/ui/windowManager.js:65 +msgid "Do you want to keep these display settings?" +msgstr "ఈ ప్రదర్శనా అమరికలను ఉంచుకోవాలనుకుంటున్నారా?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. */ +#: ../js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "అమరికలను తిరితిప్పు" + +#: ../js/ui/windowManager.js:88 +msgid "Keep Changes" +msgstr "మార్పులను ఉంచు" + +#: ../js/ui/windowManager.js:107 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "%d క్షణంలో అమరికలు తిరితిప్పబడతాయి" +msgstr[1] "%d క్షణాలలో అమరికలు తిరితిప్పబడతాయి" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "చిన్నగించు" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "కాస్త చిన్నదిగాచేయి" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "పెద్దగించు" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "తరలించు" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "పరిమాణం మార్చు" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "శీర్షికపట్టీ పైతెరను తరలించు" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "ఎల్లప్ఫుడు పైనే" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "ఎల్లప్పుడూ కనిపిస్తున్న కార్యక్షేత్రం పైనే (_A)" + +#: ../js/ui/windowMenu.js:106 +msgid "Move to Workspace Up" +msgstr "పనిచేస్తున్న చోటునుండీ పైకి వెళ్ళు" + +#: ../js/ui/windowMenu.js:111 +msgid "Move to Workspace Down" +msgstr "పనిచేస్తున్న చోటునుండీ కిందకు వెళ్ళు" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "ఎవల్యూషన్ క్యాలెండరు" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u అవుట్‌పుట్" +msgstr[1] "%u అవుట్‌పుట్‌లు" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u ఇన్‌పుట్" +msgstr[1] "%u ఇన్‌పుట్‌లు" + +#: ../src/gvc/gvc-mixer-control.c:2373 +msgid "System Sounds" +msgstr "వ్యవస్థ శబ్దములు" + +#: ../src/main.c:373 +msgid "Print version" +msgstr "ముద్రిత రూపాంతరం" + +#: ../src/main.c:379 +msgid "Mode used by GDM for login screen" +msgstr "ప్రవేశ తెర కొరకు GDM చే ఉపయోగించబడిన రీతి" + +#: ../src/main.c:385 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "ఒక నిర్దిష్ట రీతిని వాడు, ఉదా. ప్రవేశ తెర కొరకు \"gdm\"" + +#: ../src/main.c:391 +msgid "List possible modes" +msgstr "సాధ్యమగు రీతులను జాబితాగా చేయి" + +#: ../src/shell-app.c:666 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” ప్రారంభించుటలో విఫలమైంది" + +#: ../src/shell-keyring-prompt.c:714 +msgid "Passwords do not match." +msgstr "సంకేతపదాలు సరిపోలడంలేదు." + +#: ../src/shell-keyring-prompt.c:722 +msgid "Password cannot be blank" +msgstr "సంకేతపదము ఖాళీగా ఉండకూడదు" + +#: ../src/shell-polkit-authentication-agent.c:346 +msgid "Authentication dialog was dismissed by the user" +msgstr "ప్రమాణీకరణ సంవాదం వాడుకరిచే రద్దుచేయబడింది" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "స్థానం యొక్క గరిష్ఠ ఖచ్ఛితత్వ స్థాయి." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "గరిష్ట స్థాయిలో స్థానం ఖచ్చితత్వ అనువర్తనాలు చూడటానికి అనుమతించుటను స్వరూపిస్తుంది. చెల్లుబాటు " +#~ "అయ్యే ఐచ్ఛికాలు 'ఆపివేయి' (స్థానం జాడ అచేతనం), 'దేశం', 'పట్టణం', 'పొరుగు', 'వీధి', 'మరియు " +#~ "'ఖచ్చితం' (సాధారణంగా GPS రిసీవర్ అవసరం) ఉంటాయి. ఇది కేవలం జియోక్లూ అనువర్తనాలకు ఏమైతే చూడటానికి " +#~ "అనుమతినిస్తుందో వాటిని మాత్రమే నియంత్రిస్తుంది మరియు అవి వాడుకరి స్థానాన్ని వాటి స్వంతంగా నెట్‌వర్కు " +#~ "వనరులను ఉపయోగించి కనుక్కోగలవని గమనించగలరు (ఆల్బెట్‌తో వీధి స్థాయి కచ్చితత్వం ఉత్తమం)" + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "శీర్షికపట్టీ పై బటన్స్ యొక్క పేర్పు" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "గ్నోమ్ షెల్ నందు నడుచునప్పుడు ఈ కీ org.gnome.desktop.wm.preferences నందలి కీను " +#~ "వోవర్‌రైడ్ చేయును." + +#~ msgid "Extension" +#~ msgstr "పొడిగింత" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "పైన ఉన్న కోంబోపెట్టెను వాడి స్వరూపించుటకు అనువర్తనాన్ని ఎంచుకోండి." + +#~ msgid "calendar:MY" +#~ msgstr "క్యాలెండరు:నా" + +#~ msgid "Screenshots" +#~ msgstr "తెరపట్టులు" + +#~ msgid "Record a screencast" +#~ msgstr "తెరప్రసారాన్ని రికార్డించు" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "అనువర్తనాలు వాడుక గురించిన గణాంకాలను సేకరించాలా వద్దా" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "ఎక్కువగా వాడిన వాటిని సమర్పించడానికి షెల్ సాధారణంగా క్రియాశీల అనువర్తనాలను పర్యవేక్షిస్తుంది (ఉదా. " +#~ "ప్రారంభకాలలో). అపుడు ఈ డేటా గోప్యంగా ఉంచబడుతుంది, గోప్యతా కారణాల వలన మీరు దీనిని " +#~ "అచేతనపరచాలనుకోవచ్చు. దయచేసి గుర్తుంచుకోండి ఇలా చేయడం వలన ఇదివరకే దాచబడిన డేటా తీసివేయబడదు." + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "సంచయాల వలె ప్రదర్శించబడవలసిన వర్గముల జాబితా" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "ఈ జాబితానందలి ప్రతి వర్గపు పేరు ముఖ్య దర్శనం నందు యిన్‌లైన్‌గా ప్రదర్శించబడుట కన్నా, అనువర్తన " +#~ "దర్శనం నందు ఫోల్డర్ వలె చూపబడును." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "అంతర్గతంగా స్పష్టంగా వినియోగదారుని ద్వారా సెట్ చివరి IM ఉనికిని నిల్వ చేయడానికి ఉపయోగించారు. ఇక్కడ " +#~ "విలువ Tp కనెక్షన్ ఉనికి పద్ధతి వయనము నుండి ఉంది." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "అంతర్గతంగా యూజర్ కోసం చివరి సెషన్ ఉనికిని స్థితి నిల్వ చేయడానికి ఉపయోగించారు. ఇక్కడ విలువ GSM ఉనికి " +#~ "స్థితి వయనము నుండి ఉంది." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "తెర రికార్డరుని మార్చుటకు అడ్డదారి" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "అప్రమేయ తెర రికార్డరుని ప్రారంభించుటకు/ఆపడానికి అడ్డదారి." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "ఫ్రేమ్‌రేట్ అను దానిని తెరప్రసారాలను రికార్డు చేయుటకు వాడతారు." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "ఫలితముగా వచ్చు తెర ప్రసారము యొక్క ఫ్రేమ్ రేటు గ్నోమ్ షెల్ తెరప్రసార రికార్డర్ ఫ్రేమ్ పర్ సెకనులలో " +#~ "రికార్డుచేయబడుతుంది." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "తెరప్రసారాన్ని ఎన్‌కోడ్ చేయడానికి జి స్ట్రీమర్ పైప్‌లైన్ వాడబడుతుంది" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "రికార్డింగులను ఎన్‌కోడ్ చేయడానికి జిస్ట్రీమర్ పైప్‌లైన్‌ను అమర్చును. ఇది gst-launch కొరకు " +#~ "వ్యాక్యనిర్మాణాన్ని అనుసరిస్తుంది. వీడియో ఎక్కడైతే రికార్డు అవుతుందో అక్కడ ఒక అనుసంధానం కాని సింక్ " +#~ "ప్యాడ్‌ని కలిగివుండాలి. ఇది సాధారణంగా ఒక అనుసంధానము కాని మూలము ప్యాడ్ అయివుంటుంది; ఈ ప్యాడ్ నుండి " +#~ "వచ్చు అవుట్‌పుట్ అవుట్‌పుట్ దస్త్రంలోనికి వ్రాయబడుతుంది. ఏదిఏమైనప్పటికీ పైప్ లైన్ కూడా దాని అవుట్‌పుట్ " +#~ "గురించి భద్రత వహిస్తుంది - ఇది అవుట్‌పుట్‌ని ఐస్‌కాస్ట్ సేవకానికి shout2send లేదా ఇటువంటి వాటి ద్వారా " +#~ "పంపుటకు వాడబడుతుంది. అమర్చకపోయినా లేక ఒక ఖాళీ విలువకి అమర్చినా, అప్రమేయ పైప్‌లైన్ వాడబడుతుంది, " +#~ "ఇది ప్రస్తుతం 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 " +#~ "deadline=1000000 threads=%T ! queue ! webmmux' మరియు VP8 కొడెక్ వాడి WEBMకి " +#~ "రికార్డుచేస్తుంది. %T అనేది వ్యవస్థ పై ఒక ప్లేస్‌హోల్డర్ వలె గ్వెస్ కొరకు ఆప్టిమల్ త్రెడ్ కౌంట్ " +#~ "వాడబడుతుంది." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "దస్త్ర పొడిగింతను తెరప్రసారాన్ని భద్రపరుచుటకు వాడతారు" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "రికార్డుచేయబడిన తెరప్రసారాలకు దస్త్రము పేరు ప్రస్తుత తేదీ పై ఆధారపడి దస్త్రం పేరు ఒకే విధముగా " +#~ "ఉంటుంది, మరియు ఈ పొడిగింతను వాడండి. ఇది వేరే ఇతర ఆకృతిలో రికార్డు చేస్తున్నపుడు ఇది మార్చబడాలి." diff --git a/po/tg.po b/po/tg.po new file mode 100644 index 0000000..41c1d3b --- /dev/null +++ b/po/tg.po @@ -0,0 +1,2803 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Victor Ibragimov , 2013, 2014, 2015, 2019 +# +msgid "" +msgstr "" +"Project-Id-Version: Tajik Gnome\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-02 10:57+0000\n" +"PO-Revision-Date: 2019-03-13 21:44+0500\n" +"Last-Translator: Victor Ibragimov \n" +"Language-Team: \n" +"Language: tg\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.2.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Низом" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Намоиш додани рӯйхати огоҳиҳо" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Марказонидани огоҳии фаъол" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Намоиш додани ҷамъбаст" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Намоиш додани ҳамаи барномаҳо" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Кушодани феҳристи барномаҳо" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +#| msgid "GNOME Shell Extensions" +msgid "Shell Extensions" +msgstr "Васеъшавиҳои восит" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Танзимоти васеъшавиҳои восити GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Восити GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Идоракунии равзанаҳо ва оғозкунии барномаҳо" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "Фаъол кардани абзорҳои дохилие, ки барои таҳиягарон ва озмунгарон дастрас мебошанд (ба воситаи Alt-F2)" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog." +msgstr "Ҳамеша пайдо кардани дастрасӣ ба абзорҳои дохилии ислоҳи хатоҳо ва идоракунӣ тавассути равзанаи гуфтугӯи Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Рамзҳои UUID барои пасвандҳои фаъолшаванда" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "GNOME Shell extensions have a UUID property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "Пасвандҳои GNOME Shell хусусияти UUID доранд; ин калид пасвандҳоеро, ки бояд бор карда шаванд, номбар мекунад. Ҳар як пасванде, ки бояд бор карда шавад, бояд дар ин рӯйхат бошад. Шумо инчунин метавонед ин рӯйхатро тавассути усулҳои DisableExtension D-Bus ва EnableExtension дар org.gnome.Shell таҳрир кунед." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Ғайрифаъол кардани васеъшавиҳои корбар" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "Disable all extensions the user has enabled without affecting the “enabled-extension” setting." +msgstr "Ҳамаи васеъшавиҳое, ки корбар фаъол кард, бе расонидани таъсир ба танзими “васеъшавиии-фаъол” ғайрифаъол карда мешаванд." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Тафтиши пасванди мувофиқати версияро ғайрифаъол мекунад" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "GNOME Shell will only load extensions that claim to support the current running version. Enabling this option will disable this check and try to load all extensions regardless of the versions they claim to support." +msgstr "Восити GNOME танҳо пасвандҳоеро, ки версияи ҷориро дастгирӣ мекунанд, бор мекунад. Фаъолсозии ин имкон, байракчаи ҷориро ғайрифаъол мекунад ва ҳамаи пасвандҳоро новобаста аз версияҳои дастгиришаванда бор мекунад." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Рӯйхати рамзҳои ID-и файлҳои мизи корӣ барои барномаҳои дӯстдошта" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "The applications corresponding to these identifiers will be displayed in the favorites area." +msgstr "Барномаҳое, ки ба ин идентификаторҳо мувофиқ мебошанд, дар ноҳияи баргузидаҳо намоиш дода мешаванд." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Намуди интихобкунандаи барнома" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Индекси намуди интихобшудаи ҷорӣ дар интихобкунандаи барнома." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Таърихи равзанаи гуфтугӯи фармон (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Таърих барои равзанаи гуфтугӯи оина" + +#: data/org.gnome.shell.gschema.xml.in:67 +#| msgid "Always show the 'Log out' menu item in the user menu." +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Ҳамеша намоиш додани объекти менюи \"Баромадан\" дар менюи корбар." + +#: data/org.gnome.shell.gschema.xml.in:68 +#| msgid "This key overrides the automatic hiding of the 'Log out' menu item in single-user, single-session situations." +msgid "This key overrides the automatic hiding of the “Log out” menu item in single-user, single-session situations." +msgstr "Ин калид пинҳонкунии худкори объекти менюи \"Баромадан\"-ро дар вазъиятҳои корбари ягона ва ҷаласаи ягона идора мекунад." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "Whether to remember password for mounting encrypted or remote filesystems" +msgstr "Дар ёд доштан ё дар ёд надоштани парол барои васл кардани системаҳои файлии рамздор ё дурдаст" + +#: data/org.gnome.shell.gschema.xml.in:76 +#| msgid "The shell will request a password when an encrypted device or a remote filesystem is mounted. If the password can be saved for future use a 'Remember Password' checkbox will be present. This key sets the default state of the checkbox." +msgid "The shell will request a password when an encrypted device or a remote filesystem is mounted. If the password can be saved for future use a “Remember Password” checkbox will be present. This key sets the default state of the checkbox." +msgstr "Вақте ки дастгоҳ ё системаи файлии рамздор васл карда мешавад, восит паролро мепурсад. Агар парол барои истифодаи оянда захира шавад, байрақчаи \"Дар ёд доштани парол\" мавҷуд мешавад. Ин калид ҳолати пешфарзи байрақчаро таъин мекунад." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "The shell will only show a Bluetooth menu item if a Bluetooth adapter is powered, or if there were devices set up associated with the default adapter. This will be reset if the default adapter is ever seen not to have devices associated to it." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "Enables a D-Bus API that allows to introspect the application state of the shell." +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Тугмабандӣ барои кушодани менюи барнома" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Тугмабандӣ барои кушодани менюи барнома." + +#: data/org.gnome.shell.gschema.xml.in:116 +#| msgid "Keybinding to open the \"Show Applications\" view" +msgid "Keybinding to open the “Show Applications” view" +msgstr "Тугмабандӣ барои кушодани намуди \"Намоиш додани барномаҳо\"" + +#: data/org.gnome.shell.gschema.xml.in:117 +#| msgid "Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgid "Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Тугмабандӣ барои кушодани намуди \"Намоиш додани барномаҳо\"-и Хулосаи фаъолият." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Тугмабандӣ барои кушодани хулоса" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Тугмабандӣ барои кушодани хулосаи фаъолият." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Тугмабандӣ барои иваз кардани намоёнии рӯйхати огоҳиҳо" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Тугмабандӣ барои иваз кардани намоёнии рӯйхати огоҳиҳо." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "Тугмабандие, ки ҳамаи твинҳои фаъол барои мақсадҳои ислоҳи хатоҳо таваққуф ва оғоз мекунад" + +#: data/org.gnome.shell.gschema.xml.in:150 +#| msgid "Show Applications" +msgid "Switch to application 1" +msgstr "Гузариш ба барномаи 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +#| msgid "Show Applications" +msgid "Switch to application 2" +msgstr "Гузариш ба барномаи 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +#| msgid "Show Applications" +msgid "Switch to application 3" +msgstr "Гузариш ба барномаи 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +#| msgid "Show Applications" +msgid "Switch to application 4" +msgstr "Гузариш ба барномаи 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +#| msgid "Show Applications" +msgid "Switch to application 5" +msgstr "Гузариш ба барномаи 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +#| msgid "Show Applications" +msgid "Switch to application 6" +msgstr "Гузариш ба барномаи 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +#| msgid "Show Applications" +msgid "Switch to application 7" +msgstr "Гузариш ба барномаи 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +#| msgid "Show Applications" +msgid "Switch to application 8" +msgstr "Гузариш ба барномаи 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +#| msgid "Show Applications" +msgid "Switch to application 9" +msgstr "Гузариш ба барномаи 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Клавиатураро интихоб намоед" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Навъи клавиатурае, ки истифода мешавад." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Ивазкунандаи ҳудуд ба фазои кории ҷорӣ." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "If true, only applications that have windows on the current workspace are shown in the switcher. Otherwise, all applications are included." +msgstr "Агар фаъол бошад, танҳо барномаҳое, ки равзанаро дар фазои кории ҷорӣ дар бар мегирад, дар ивазкунанда намоиш дода мешаванд. Ба таври дигар ҳамаи барномаҳо илова карда мешаванд." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Ҳолати нишонаи барнома." + +#: data/org.gnome.shell.gschema.xml.in:221 +#| msgid "Configures how the windows are shown in the switcher. Valid possibilities are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only' (shows only the application icon) or 'both'." +msgid "Configures how the windows are shown in the switcher. Valid possibilities are “thumbnail-only” (shows a thumbnail of the window), “app-icon-only” (shows only the application icon) or “both”." +msgstr "Тарзи намоиш додани равзанаҳоро дар интихобкунанда конфигуратсия мекунад. Имкониятҳои боэътибор \"танҳо пешнамоишҳои кучак\" (пешнамоиши кучаки равзанаро намоиш медиҳад), \"танҳо нишонаи барнома\" (танҳо нишонаи барномаро намоиш медиҳад) ё \"ҳар ду\"." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "If true, only windows from the current workspace are shown in the switcher. Otherwise, all windows are included." +msgstr "Агар фаъол бошад, танҳо равзанаҳо аз фазои кории ҷорӣ дар ивазкунанда намоиш дода мешаванд. Ба таври дигар ҳамаи равзанаҳо илова карда мешаванд." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Замима кардани равзанаи гуфтугӯи модалӣ ба равзанаи асосӣ" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "Ин калид ҳангоми иҷроиши GNOME Shell калиди дар org.gnome.mutter ҷойгирбударо бекор мекунад." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Фаъол кардани лавҳабандии канорӣ ҳангоми гузоштани равзанаҳо ба канорҳои экран" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Фазоҳои корӣ ба таври серамалӣ идора мешаванд" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Танҳо фазоҳои корӣ дар монитори асосӣ" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "То вақте ки курсор намеистад тағйироти фокусро дар ҳолати истифодаи муш ба таъхир гузоред" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Воридшавии шабакавӣ" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Чизе нодуруст ба миён омад" + +#: js/extensionPrefs/main.js:123 +msgid "We’re very sorry, but there’s been a problem: the settings for this extension can’t be displayed. We recommend that you report the issue to the extension authors." +msgstr "Мутаассифона, хатое ба вуҷуд омад: танзимот барои ин васеъшавӣ нишон дода намешавад. Тавсия дода мешавад, ки шумо дар бораи хато ба муаллифони васеъшавӣ гузориш диҳед." + +#: js/extensionPrefs/main.js:130 +#| msgid "Show Details" +msgid "Technical Details" +msgstr "Намоиш додани тафсилот" + +#: js/extensionPrefs/main.js:165 +#| msgid "Show Errors" +msgid "Copy Error" +msgstr "Намоиш додани хатоҳо" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Саҳифаи асосӣ" + +#: js/extensionPrefs/main.js:186 +#| msgid "UUIDs of extensions to enable" +msgid "Visit extension homepage" +msgstr "Рамзҳои UUID барои пасвандҳои фаъолшаванда" + +#: js/extensionPrefs/main.js:449 +#| msgid "No extensions installed" +msgid "No Extensions Installed" +msgstr "Ягон васеъшавӣ насб нашудааст" + +#: js/extensionPrefs/main.js:459 +msgid "Extensions can be installed through Software or extensions.gnome.org." +msgstr "Васеъшавиҳо ба воситаи низоми нармафзор ё extensions.gnome.org ҷорӣ карда мешаванд." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Намоиш дар низоми нармафзор" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Бекор кардан" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Навбатӣ" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Кушодан" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Ворид шудан" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Интихоби ҷаласа" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Корбар дар ин рӯйхат вуҷуд надорад?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(масалан, корбар ё %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Номи корбар: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Равзанаи воридшавӣ" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Хатои санҷиши ҳаққоният" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(ё бо ангут ламс кунед)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +#| msgid "Power Off" +msgctxt "search-result" +msgid "Power Off" +msgstr "Хомӯш кардани компютер" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Қулф кардани экран" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +#| msgid "Log Out" +msgctxt "search-result" +msgid "Log Out" +msgstr "Баромад аз мизи корӣ" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +#| msgid "Suspend" +msgctxt "search-result" +msgid "Suspend" +msgstr "Таваққуф кардани низом" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +#| msgid "Suspend" +msgid "suspend;sleep" +msgstr "таваққуф;хоб" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +#| msgid "Switch User" +msgctxt "search-result" +msgid "Switch User" +msgstr "Иваз кардани корбар" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +#| msgid "Switch User" +msgid "switch user" +msgstr "ивази корбар" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +#| msgid "Orientation Lock" +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Қулфи самти экран" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Фармон ёфт нашудааст" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Фармон иҷро нашудааст:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Иҷрокунии “%s” қатъ шудааст:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Ҳоли ҳозир" + +#: js/misc/util.js:177 +#, javascript-format +#| msgid "%d minute remaining" +#| msgid_plural "%d minutes remaining" +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d дақиқа пеш" +msgstr[1] "%d дақиқа пеш" + +#: js/misc/util.js:180 +#, javascript-format +#| msgid "%d hour remaining" +#| msgid_plural "%d hours remaining" +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d соат пеш" +msgstr[1] "%d соат пеш" + +#: js/misc/util.js:183 +#| msgid "Yesterday, %H∶%M" +msgid "Yesterday" +msgstr "Дирӯз" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d рӯз пеш" +msgstr[1] "%d рӯз пеш" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d ҳафта пеш" +msgstr[1] "%d ҳафта пеш" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d моҳ пеш" +msgstr[1] "%d моҳ пеш" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d сол пеш" +msgstr[1] "%d сол пеш" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Дирӯз, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +#| msgid "%B %d, %H∶%M" +msgid "%B %-d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +#| msgid "%B %d %Y, %H∶%M" +msgid "%B %-d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Дирӯз, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +#| msgid "%B %d, %l∶%M %p" +msgid "%B %-d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +#| msgid "%B %d %Y, %l∶%M %p" +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +#| msgid "Hotspot Active" +msgid "Hotspot Login" +msgstr "Воридшавӣ ба нуқтаи пайваст" + +#: js/portalHelper/main.js:86 +msgid "Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby." +msgstr "Пайвасти воридшавии шумо ба нуқтаи пайвасти ҷорӣ бехатар намебошад. Ниҳонвожаҳо ё маълумоти дигаре, ки дар ин саҳифа ворид карда мешавад, метавонанд бо одамони дар гидру атроф ошкор карда шаванд." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Манъ кардани дастрасӣ" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +#| msgid "Always grant access" +msgid "Grant Access" +msgstr "Иҷозат додани дастрасӣ" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Барномаҳои бештар истифодашуда ин ҷо намоиш дода мешаванд" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Роиҷ" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Ҳама" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Равзанаи нав" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Тоза кардан аз Баргузидаҳо" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Илова кардан ба Баргузидаҳо" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Намоиш додани тафсилот" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s ба баргузидаҳои шумо илова шудааст." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s аз баргузидаҳои шумо тоза шудааст." + +#: js/ui/audioDeviceSelection.js:42 +#| msgid "Send Files to Device…" +msgid "Select Audio Device" +msgstr "Интихоби дастгоҳи аудиоӣ" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Танзимоти садо" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Гӯшмонакҳо" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Гӯшмонак бо микрофон" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Микрофон" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Тағйир додани пазсамина…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Танзимоти дисплей" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Танзимот" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "Ш" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "Д" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ч" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "Ҷ" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "Ш" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Моҳи қаблӣ" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Моҳи навбатӣ" + +#: js/ui/calendar.js:564 +#, no-javascript-format +#| msgctxt "percent of battery remaining" +#| msgid "%d%%" +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Ҳафтаи %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Тамоми рӯз" + +#: js/ui/calendar.js:819 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d" +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:823 +#| msgctxt "calendar heading" +#| msgid "%A, %B %d, %Y" +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %B %d, %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Ягон огоҳӣ нест" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Ягон рӯйдод нест" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Пок кардан" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +#| msgid "“%s” is ready" +msgid "“%s” is not responding." +msgstr "“%s” ҷавоб намедиҳад." + +#: js/ui/closeDialog.js:43 +msgid "You may choose to wait a short while for it to continue or force the application to quit entirely." +msgstr "" + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Маҷбуран пӯшида шавад" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Интизор шавед" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Диски берунӣ васл шудааст" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Диски берунӣ ҷудо шудааст" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Кушодан бо %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Ниҳонвожа:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Аз нав ворид кунед:" + +#: js/ui/components/networkAgent.js:102 +msgid "Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Пайваст шудан" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Ниҳонвожа: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Калид: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Ниҳонвожаи калиди шахсӣ: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Шахсият: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Хидмат: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Шабакаи бесим санҷиши ҳаққониятро талаб мекунад" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "Passwords or encryption keys are required to access the wireless network “%s”." +msgstr "Барои пайдо кардани дастрасӣ ба шабакаи бесими “%s” паролҳо ё калидҳои рамзгузорӣ лозиманд." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Санҷиши ҳаққонияти 802.1X-и симдор" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Номи шабака: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Санҷиши ҳаққонияти DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Рамзи PIN ҳатмист" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Барои дастгоҳи паҳннавори мобилӣ рамзи PIN лозим аст" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Пароли шабакаи паҳннавори мобилӣ" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Барои пайваст шудан ба “%s” парол лозим аст." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Мудири шабака" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Санҷиши ҳаққоният лозим аст" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Маъмур" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Санҷиши ҳаққоният" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +#| msgid "Sorry, that didn't work. Please try again." +msgid "Sorry, that didn’t work. Please try again." +msgstr "Мутаассифона, ин амал иҷро нашуд. Лутфан, амалро такрор кунед." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "Акнун %s ба номи %s дониста мешавад" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Равзанаҳо" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Намоиш додани барномаҳо" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Рах" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +#| msgid "%B %e %Y" +msgid "%B %-d %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %B %e %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Илова кардани соатҳои ҷаҳон…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Соати ҷаҳон" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Обу ҳаво" + +#: js/ui/dateMenu.js:305 +#| msgid "Select a network" +msgid "Select a location…" +msgstr "Интихоби ҷойгиршавӣ…" + +#: js/ui/dateMenu.js:313 +#| msgid "Searching…" +msgid "Loading…" +msgstr "Бор шуда истодааст…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Барои донистани вазъи обу ҳавоӣ ба онлайн равед" + +#: js/ui/dateMenu.js:325 +#| msgid "Encryption is not available" +msgid "Weather information is currently unavailable" +msgstr "Рамзгузорӣ дастрас нест" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Баромадан аз %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Баромад аз мизи корӣ" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s аз система баъд аз %d сония ба таври худкор мебарояд." +msgstr[1] "%s аз система баъд аз %d сония ба таври худкор мебарояд." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Шумо аз система баъд аз %d сония ба таври худкор мебароед." +msgstr[1] "Шумо аз система баъд аз %d сония ба таври худкор мебароед." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Баромад аз мизи корӣ" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Хомӯш кардани компютер" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Насб кардани навсозиҳо ва хомӯш кардани компютер" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Система ба таври худкор баъд аз %d сония корро анҷом медиҳад." +msgstr[1] "Система ба таври худкор баъд аз %d сония корро анҷом медиҳад." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Насб кардани навсозиҳои нармафзори мунтазир" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Аз нав оғоз кардани компютер" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Хомӯш кардани компютер" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Аз нав оғоз кардани компютер" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Система ба таври худкор баъд аз %d сония бозоғозӣ мешавад." +msgstr[1] "Система ба таври худкор баъд аз %d сония бозоғозӣ мешавад." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Бозоғозӣ кардан ва насб кардани навсозиҳо" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "The system will automatically restart and install updates in %d seconds." +msgstr[0] "Низом баъд аз %d сония ба таври худкор бозоғозӣ мешавад ва навсозиҳоро насб мекунад." +msgstr[1] "Низом баъд аз %d сония ба таври худкор бозоғозӣ мешавад ва навсозиҳоро насб мекунад." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Бозоғозӣ ва насб кардан" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Насб кардан ва хомӯш кардани компютер" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Хомӯш кардани компютер баъд аз насб кардани навсозиҳо" + +#: js/ui/endSessionDialog.js:115 +#| msgctxt "title" +#| msgid "Restart & Install Updates" +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Бозоғозӣ кардан ва насб кардани навсозиҳо" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "%s %s will be installed after restart. Upgrade installation can take a long time: ensure that you have backed up and that the computer is plugged in." +msgstr "" + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Аз батарея кор мекунад: лутфан, еш аз насбкунии навсозиҳо компютерро ба манбаъи барқ васл кунед." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Баъзе барномаҳо банданд ё дорои корҳои захиранашуда мебошанд." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Корбарони дигар ворид шудаанд." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (дурдаст)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (консол)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Насб кардан" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "“%s”-ро аз extensions.gnome.org боргирӣ ва насб мекунед?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "" + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Манъ кардан" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Иҷозат додан" + +#: js/ui/kbdA11yDialog.js:31 +#| msgid "Slow Keys" +msgid "Slow Keys Turned On" +msgstr "Тугмаҳои суст" + +#: js/ui/kbdA11yDialog.js:32 +#| msgid "Slow Keys" +msgid "Slow Keys Turned Off" +msgstr "Тугмаҳои суст" + +#: js/ui/kbdA11yDialog.js:33 +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 "" + +#: js/ui/kbdA11yDialog.js:40 +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned On" +msgstr "Тугмаҳои часпак" + +#: js/ui/kbdA11yDialog.js:41 +#| msgid "Sticky Keys" +msgid "Sticky Keys Turned Off" +msgstr "Тугмаҳои часпак" + +#: js/ui/kbdA11yDialog.js:43 +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 "" + +#: js/ui/kbdA11yDialog.js:45 +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 "" + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Ҳамеша фаъол" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Фаъол кардан" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Ғайрифаъол кардан" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Ҳамеша ғайрифаъол" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Танзимоти забон ва минтақа" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Ягон пасванд насб нашудааст" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s ягон хато надорад." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Пинҳон кардани хатоҳо" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Намоиш додани хатоҳо" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Фаъол" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Ғайрифаъол" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Хато" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Аз мӯҳлат гузашта" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Боргирӣ рафта истодааст" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Намоиш додани манбаъ" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Саҳифаи веб" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Маълумоти система" + +#: js/ui/mpris.js:177 +#| msgid "Unknown reason" +msgid "Unknown artist" +msgstr "Ҳофизи номаълум" + +#: js/ui/mpris.js:178 +#| msgctxt "program" +#| msgid "Unknown" +msgid "Unknown title" +msgstr "Унвони номаълум" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Баландии садо" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Ботил сохтан" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Ҷамъбаст" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Барои ҷустуҷӯ чизеро чоп намоед…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Миёнбури нав…" + +#: js/ui/padOsd.js:141 +#| msgid "Applications" +msgid "Application defined" +msgstr "Барномаи муайяншуда" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Намоиш додани кумаки экранӣ" + +#: js/ui/padOsd.js:143 +#| msgid "Switch User" +msgid "Switch monitor" +msgstr "Иваз кардани монитор" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Тайёр" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Таҳрир кардан…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Ҳеҷ" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Барои идома тугмаеро пахш намоед" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Барои баромад тугмаи Esc-ро пахш намоед" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Барои баромад тугмаи дилхоҳро пахш намоед" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Баромад" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Фаъолиятҳо" + +#: js/ui/panel.js:741 +#| msgid "System" +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Низом" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "Лавҳаии болоӣ" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Фармонеро ворид кунед" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Пӯшидан" + +#: js/ui/runDialog.js:266 +#| msgid "Encryption is not available" +msgid "Restart is not available on Wayland" +msgstr "Рамзгузорӣ дастрас нест" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Дар ҳоли бозоғозӣ…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d паёми нав" +msgstr[1] "%d паёми нав" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d огоҳии нав" +msgstr[1] "%d огоҳии нав" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Қулф кардан" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME бояд экранро қулф кунад" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Қулф карда намешавад" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Қулф аз тарави барнома баста шудааст" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Дар ҳоли ҷустуҷӯ…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Ягон натиҷа нест." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d дигар" +msgstr[1] "%d дигар" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Нусха бардоштан" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Гузоштан" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Намоиш додани матн" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Пинҳон кардани матн" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Парол" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Ба ёд гирифтани парол" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Қобилияти дастрасӣ" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Танзими андоза" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Хонандаи экранӣ" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Клавиатураи экранӣ" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Огоҳиҳои намоён" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Тугмаҳои часпак" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Тугмаҳои суст" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Тугмаҳои ҷастухез" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Тугмаҳои муш" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Контрасти баланд" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Матни бузург" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Танзимоти Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +#| msgid "Connected" +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d пайваст шуд" +msgstr[1] "%d пайваст шуд" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Хомӯш" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Фаъол" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Дурахшонӣ" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Клавиатура" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Намоиш додани тарҳбандии клавиатура" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +#| msgid "Location" +msgid "Location Enabled" +msgstr "Ҷойгиршавӣ" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Ғайрифаъол кардан" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Танзимоти махфият" + +#: js/ui/status/location.js:171 +#| msgid "Location" +msgid "Location In Use" +msgstr "Ҷойгиршавӣ" + +#: js/ui/status/location.js:175 +#| msgid "Connection failed" +msgid "Location Disabled" +msgstr "Пайваст қатъ шудааст" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Фаъол кардан" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +#| msgid "Connected" +msgid "%s Connected" +msgstr "%s пайваст шуд" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +#| msgid "Unmanaged" +msgid "%s Unmanaged" +msgstr "%s беназорат" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +#| msgid "Disconnecting" +msgid "%s Disconnecting" +msgstr "Пайвасти %s қатъ шуда истодааст" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +#| msgid "Connecting" +msgid "%s Connecting" +msgstr "%s пайваст шуда истодааст" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +#| msgid "Wired 802.1X authentication" +msgid "%s Requires Authentication" +msgstr "%s санҷиши ҳаққониятро талаб мекунад" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +#| msgid "Firmware missing" +msgid "Firmware Missing For %s" +msgstr "Нармафзори дарунсохт барои %s вуҷуд надорад" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +#| msgid "Unavailable" +msgid "%s Unavailable" +msgstr "%s дастнорас аст" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +#| msgid "Connection failed" +msgid "%s Connection Failed" +msgstr "Пайвасти %s қатъ шуд" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Танзимоти шабакаи симдор" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Танзимоти паҳннавори мобилӣ" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +#| msgid "Hardware Disabled" +msgid "%s Hardware Disabled" +msgstr "Сахтафзори %s ғайрифаъол шуд" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +#| msgid "Disabled" +msgid "%s Disabled" +msgstr "%s ғайрифаъол аст" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Пайваст шудан ба Интернет" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Ҳолати ҳавопаймо фаъол аст" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Ҳангоми фаъол будани ҳолати ҳавопаймо Wi-Fi ғайрифаъол аст." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Ҳолати ҳавопаймо хомӯш аст" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi хомӯш аст" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Барои пайваст шудан ба шабака, Wi-Fi бояд фаъол карда шавад." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Фаъол кардани Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Шабакаҳои Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Интихоб кардани шабака" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Ягон шабака нест" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Истифодаи калиди сахтафзорӣ барои фаъолсозӣ ё хомӯшкунӣ" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Интихоби шабака" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Танзимоти Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +#| msgid "Hotspot Active" +msgid "%s Hotspot Active" +msgstr "Нуқтаи пайвасти %s ваъол аст" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +#| msgid "Not Connected" +msgid "%s Not Connected" +msgstr "%s пайваст нашудааст" + +#: js/ui/status/network.js:1393 +#| msgid "Connecting" +msgid "connecting…" +msgstr "пайваст шуда истодааст…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "санҷиши ҳаққоният лозим аст" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "пайваст қатъ шудааст" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "Танзимоти VPN" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +#| msgid "Power Off" +msgid "VPN Off" +msgstr "Хомӯш кардани VPN" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Танзимоти шабака" + +#: js/ui/status/network.js:1565 +#, javascript-format +#| msgid "Use as Internet connection" +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s пайвасти симдор" +msgstr[1] "%s пайвасти симдор" + +#: js/ui/status/network.js:1569 +#, javascript-format +#| msgid "Connecting" +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s пайвасти Wi-Fi" +msgstr[1] "%s пайвасти Wi-Fi" + +#: js/ui/status/network.js:1573 +#, javascript-format +#| msgid "Connecting" +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s пайвасти модем" +msgstr[1] "%s пайвасти модем" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Пайваст қатъ шудааст" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Фаъолсозии пайвасти шабака қатъ шуд" + +#: js/ui/status/nightLight.js:60 +#| msgid "Networking is disabled" +msgid "Night Light Disabled" +msgstr "Шабака ғайрифаъол аст" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Танзимоти барқ" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Пуррагӣ заряд гирифтааст" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Ҳисоб шуда истодааст…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +#| msgid "%d∶%02d Remaining (%d%%)" +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d боқӣ мондааст (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +#| msgid "%d∶%02d Until Full (%d%%)" +msgid "%d∶%02d Until Full (%d %%)" +msgstr "%d∶%02d то пур шудан (%d%%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "" + +#: js/ui/status/remoteAccess.js:44 +#| msgid "Turn Off" +msgid "Turn off" +msgstr "Хомӯш кардан" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +#| msgid "Airplane Mode is On" +msgid "Airplane Mode On" +msgstr "Ҳолати ҳавопаймо фаъол аст" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Иваз кардани корбар" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Баромад аз мизи корӣ" + +#: js/ui/status/system.js:227 +#| msgid "Sound Settings" +msgid "Account Settings" +msgstr "Танзимоти ҳисоб" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Қулфи самти экран" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Таваққуф кардан" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Хомӯш кардани компютер" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "" + +#: js/ui/status/thunderbolt.js:323 +msgid "New device has been detected while you were away. Please disconnect and reconnect the device to start using it." +msgstr "" + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "" + +#: js/ui/status/thunderbolt.js:327 +msgid "New device has been detected and needs to be authorized by an administrator." +msgstr "" + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Ҳаҷм тағйир ёфт" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +#| msgid "Error" +msgid "Mirror" +msgstr "Оина" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Ворид шудан бо корбари дигар" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Кушодани равзана" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Барномаҳо" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Ҷустуҷӯ" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” омода аст" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Шумо мехоҳед, ки ин танзимоти дисплейро нигоҳ доред?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Барқарор кардани тағйирот" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Нигоҳ доштани тағйирот" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Тағйироти танзимот баъд аз %d сония барқарор мешаванд" +msgstr[1] "Тағйироти танзимот баъд аз %d сония барқарор мешаванд" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Ҳадди ақал сохтан" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Бекор кардани ҳадди аксар" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Ҳадди аксар сохтан" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Интиқол додан" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Тағйир додани андоза" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Интиқоли номи навор дар экран" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Ҳамеша дар боло" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Ҳамеша дар фазои кории намоён" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Интиқол додан ба фазои кории чап" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Интиқол додан ба фазои кории рост" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Интиқол додан ба фазои кории боло" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Интиқол додан ба фазои кории поён" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Интиқол ба канори болои монитор" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Интиқол ба канори поёни монитор" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Интиқол ба канори чапи монитор" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Интиқол ба канори рости монитор" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Тақвими инкишоф" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Версияи чоп" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Усуле, ки бо GDM барои экрани воридшавӣ истифода мешавад" + +#: src/main.c:420 +#| msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Истифода бурдани ҳолати мушаххас, масалан \"gdm\" барои экрани воридшавӣ" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Рӯйхати ҳолатҳои имконпазир" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Номаълум" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Оғози “%s” қатъ шуд" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Паролҳо мувофиқат намекунанд." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Парол бояд холӣ набошад" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Равзанаи гуфтугӯи санҷиши ҳакконият бо корбар бекор карда шуд" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u барориш" +msgstr[1] "%u барориш" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u вуруд" +msgstr[1] "%u вуруд" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Садоҳои низом" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Ҳангоми боркунии равзанаи гуфтугӯи хусусиятҳо барои %s хатогие ба вуҷуд омадааст:" + +#~ msgid "Hide tray" +#~ msgstr "Пинҳон кардани лавҳа" + +#~ msgid "Status Icons" +#~ msgstr "Нишонаҳои вазъият" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Хусусиятҳои пасвандҳои восити GNOME" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Восити GNOME (созандаи wayland)" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Намоиш додани ҳафта дар тақвим" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Агар фаъол бошад, санаи ҳафтаи ISO дар тақвим намоиш дода мешавад." + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Бозфиристодани санҷиши ҳаққонияти веб" + +#~ msgid "Clear section" +#~ msgstr "Пок кардани қисмат" + +#~ msgid "Events" +#~ msgstr "Рӯйдодҳо" + +#~ msgid "Notifications" +#~ msgstr "Огоҳиҳо" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d дастгоҳи пайвастшуда" +#~ msgstr[1] "%d дастгоҳи пайвастшуда" + +#~ msgid "In Use" +#~ msgstr "Дар истифода" + +#~ msgid "Authentication required" +#~ msgstr "Санҷиши ҳаққоният лозим аст" + +#~ msgid "connecting..." +#~ msgstr "пайвастшавӣ..." + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Батарея" + +#~ msgid "Airplane Mode" +#~ msgstr "Ҳолати ҳавопаймо" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the message tray" +#~ msgstr "Намоиш додани қуттии паёмҳо" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Сатҳи аксари саҳеҳии ҷойгиршавӣ." + +#~ msgid "Configures the maximum level of location accuracy applications are allowed to see. Valid options are 'off' (disable location tracking), 'country', 'city', 'neighborhood', 'street', and 'exact' (typically requires GPS receiver). Please keep in mind that this only controls what GeoClue will allow applications to see and they can find user's location on their own using network resources (albeit with street-level accuracy at best)." +#~ msgstr "Сатҳи баландтарини саҳеҳии ҷойгиршавиро барои барномаҳо танзим мекунад. Имконоти боэътибор: 'хомӯш' (пайгирии ҷойгиршавии ғайрифаъол), 'кишвар', 'шаҳр', 'ҳамсоягӣ', 'кӯча' ва 'дақиқ' (қабулкунандаи GPS лозим аст). Лутфан, қайд кнед, ки ин танҳо GeoClue-ро идора мекунад ва ба барномаҳо иҷозат медиҳад, то ки тавонанд ҷойгиршавии корбаронро тавассути манбаъи шабакавии онҳо пайдо кунанд (ақаллан ҷойгиршавии саҳеҳии кӯча)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Мураттабсозии тугмаҳо дар сарлавҳаи равзана" + +#~ msgid "This key overrides the key in org.gnome.desktop.wm.preferences when running GNOME Shell." +#~ msgstr "Ин калид ҳангоми иҷроиши GNOME Shell калиди дар org.gnome.desktop.wm.preferences ҷойгирбударо бекор мекунад." + +#~ msgid "Extension" +#~ msgstr "Пасванд" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Пасвандеро интихоб кунед, то ин ки бо ҷаъбаи мураккаби боло онро конфигуратсия кунед." + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Яш" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Д" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "С" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Ч" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Пш" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Ҷ" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Ш" + +#~ msgid "calendar:MY" +#~ msgstr "тақвим:MY" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Ягон чиз ба нақша нагирифтааст" + +#~ msgid "Today" +#~ msgstr "Имрӯз" + +#~ msgid "Tomorrow" +#~ msgstr "Фардо" + +#~ msgid "This week" +#~ msgstr "Ҳафтаи ҷорӣ" + +#~ msgid "Next week" +#~ msgstr "Ҳафтаи навбатӣ" + +#~ msgid "Removable Devices" +#~ msgstr "Дастгоҳҳои ҷудошаванда" + +#~ msgid "Eject" +#~ msgstr "Баровардан" + +#~ msgid "Invitation" +#~ msgstr "Даъватнома" + +#~ msgid "Call" +#~ msgstr "Занг задан" + +#~ msgid "File Transfer" +#~ msgstr "Интиқолдиҳии файл" + +#~ msgid "Chat" +#~ msgstr "Чат" + +#~ msgid "Unmute" +#~ msgstr "Садоро фаъол кардан" + +#~ msgid "Mute" +#~ msgstr "Бесадо кардан" + +#~ msgid "Invitation to %s" +#~ msgstr "Даъватнома барои to %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s шуморо барои ҳамроҳ шудан ба %s даъват мекунад" + +#~ msgid "Decline" +#~ msgstr "Рад кардан" + +#~ msgid "Accept" +#~ msgstr "Қабул кардан" + +#~ msgid "Video call from %s" +#~ msgstr "Занги видеоӣ аз %s" + +#~ msgid "Call from %s" +#~ msgstr "Занг аз %s" + +#~ msgid "Answer" +#~ msgstr "Ҷавоб" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s ба шумо %s-ро мефиристад" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s аз шумо иҷозат мепурсад, ки тавонад шуморо дар онлайн бинад" + +#~ msgid "Authentication failed" +#~ msgstr "Санҷиши ҳаққоният қатъ шудааст." + +#~ msgid "Encryption error" +#~ msgstr "Хатои рамзгузорӣ" + +#~ msgid "Certificate not provided" +#~ msgstr "Гувоҳинома таъмин нашудааст" + +#~ msgid "Certificate untrusted" +#~ msgstr "Гувоҳиномаи беэътибор" + +#~ msgid "Certificate expired" +#~ msgstr "Гувоҳинома аз мӯҳлаташ гузашт" + +#~ msgid "Certificate not activated" +#~ msgstr "Гувоҳинома фаъол нашудааст" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Номувофиқати гувоҳиномаи номи мизоҷон" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Номувофиқати гувоҳиномаи нақши ангуштон" + +#~ msgid "Certificate self-signed" +#~ msgstr "Гувоҳиномаи худимзошуда" + +#~ msgid "Status is set to offline" +#~ msgstr "Вазъият ба \"офлайн\" гузаштааст" + +#~ msgid "Certificate is invalid" +#~ msgstr "Гувоҳинома нодуруст аст" + +#~ msgid "Connection has been refused" +#~ msgstr "Пайваст рад карда шудааст" + +#~ msgid "Connection can't be established" +#~ msgstr "Пайвастшавӣ имконнопазир аст" + +#~ msgid "Connection has been lost" +#~ msgstr "Пайваст гум шудааст" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Ин ҳисоб аллакай ба сервер пайваст шудааст" + +#~ msgid "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Пайваст тавассути сарчашмаи якхела бо пайвасти нав ҷойиваз карда шуд" + +#~ msgid "The account already exists on the server" +#~ msgstr "Ҳисоб дар сервер аллакай мавҷуд аст" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Барои коркарди ин пайваст сервер дар айни ҳол хеле машғул мебошад" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Гувоҳинома лағв карда шуд" + +#~ msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "Гувоҳинома алгоритми хатарноки рамзро истифода мебарад, ё ки рамзгузории суст дорад" + +#~ msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "Дарозии гувоҳиномаи сервер, ё ки чуқурии занҷири гувоҳиномаи сервер, аз маҳдудиятҳое, ки бо китобхонаи рамзгузорӣ таъин шудаанд, дарозтар мебошад" + +#~ msgid "Internal error" +#~ msgstr "Хатои дохилӣ" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Пайвастшавӣ ба %s имконнопазир аст" + +#~ msgid "View account" +#~ msgstr "Намоиш додани ҳисоб" + +#~ msgid "Open Calendar" +#~ msgstr "Кушодани тақвим" + +#~ msgid "Date & Time Settings" +#~ msgstr "Танзимоти сана ва вақт" + +#~ msgid "Open" +#~ msgstr "Кушодани файл" + +#~ msgid "Remove" +#~ msgstr "Тоза кардан" + +#~ msgid "Clear Messages" +#~ msgstr "Пок кардани паёмҳо" + +#~ msgid "Notification Settings" +#~ msgstr "Танзимоти огоҳиҳо" + +#~ msgid "Tray Menu" +#~ msgstr "Менюи қуттӣ" + +#~ msgid "No Messages" +#~ msgstr "Ягон паём нест" + +#~ msgid "Message Tray" +#~ msgstr "Қуттии паёмҳо" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Рӯйхати категорияҳо, ки бояд ҳамчун ҷузвдонҳо намоиш дода шаванд" + +#~ msgid "Each category name in this list will be represented as folder in the application view, rather than being displayed inline in the main view." +#~ msgstr "Ҳар як номи категория, ки дар ин рӯйхат мавҷуд аст, дар намуди барномаҳо ҳамчун ҷузвдон ифода мешавад, ба ҷойи намоишдиҳии шомил дар намуди асосӣ." + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Authorization request from %s" +#~ msgstr "Дархости санҷиши ҳаққоният аз %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Дастгоҳи %s мехоҳад, ки бо ин компютер ҷуфт кунад" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Дастгоҳи %s дастрасиро ба хидмати \"%s\" дархост мекунад" + +#~ msgid "Grant this time only" +#~ msgstr "Танҳо дар ин маротиба иҷозат додан" + +#~ msgid "Reject" +#~ msgstr "Рад кардан" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Тасдиқи ҷуфтсозӣ барои %s" + +#~ msgid "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "Лутфан, тасдиқ кунед, ки калиди хусусии '%06d' ба калиди дар дастгоҳ мавҷудбуда мувофиқат мекунад." + +#~ msgid "Matches" +#~ msgstr "Мутобиқаткунанда" + +#~ msgid "Does not match" +#~ msgstr "Мувофиқат намекунад" + +#~ msgid "Pairing request for %s" +#~ msgstr "Дархости ҷуфтсозӣ барои %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Лутфан, рамзи PIN-ро, ки дар дастгоҳ гуфта шудааст, ворид кунед." + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Мутаассифода, барои шумо имрӯз ягон хирадмандӣ нест:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Паёми паёмовар: %s" + +#~ msgid "Settings Menu" +#~ msgstr "Менюи танзимот" + +#~ msgid "Session" +#~ msgstr "Ҷаласа" + +#~ msgid "Internally used to store the last IM presence explicitly set by the user. The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "Ба таври дохилӣ барои нигоҳ доштани мавҷудияти охирини IM, ки бо корбар ба таври бевосита таъин шудааст, истифода мешавад. Дар ин ҷо қимат аз шумориши TpConnectionPresenceType ба вуҷуд меояд." + +#~ msgid "Internally used to store the last session presence status for the user. The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "Ба таври дохилӣ барои нигоҳ доштани вазъияти мавҷудияти ҷаласаи охирин барои корбар истифода мешавад. Дар ин ҷо қимат аз шумориши GsmPresenceStatus ба вуҷуд меояд." + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "Барои баромадан аз ин барномаҳо ва баромадан аз система, \"Баромадан\"-ро зер кунед." + +#~ msgid "Logging out of the system." +#~ msgstr "Баромад аз система." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "Барои баромадан аз ин барномаҳо ва анҷом додани кори система, \"Анҷоми кор\"-ро зер кунед." + +#~ msgid "Powering off the system." +#~ msgstr "Хомӯш кардани система." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "Барои баромадан аз ин барномаҳо ва бозоғозидани система, \"Бозоғозидан\"-ро зер кунед." + +#~ msgid "Restarting the system." +#~ msgstr "Бозоғозии система." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Анҷоми кор метавонад сабаби гум шудани кори захиранашуда гардад." + +#~ msgid "Screenshots" +#~ msgstr "Суратҳои экран" + +#~ msgid "Record a screencast" +#~ msgstr "Сабти рӯйдодҳои экран" + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Тугма барои иваз кардани сабткунандаи экран" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Тугма барои оғоз/қатъ кардани сабткунандаи экрани дарунсохт." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Миқдори кадрҳо дар сония, ки барои сабти рӯйдодҳои экран истифода мешавад." + +#~ msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second." +#~ msgstr "Миқдори кадрҳо дар як сония барои сабти рӯйдодҳои экран, ки бо сабткунандаи рӯйдодҳои экрани GNOME Shell сабт шудааст, дар кадрҳо дар як сония." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "Лӯламаҷрои gstreamer, ки барои рамзӣ кардани рӯйдодҳои экран истифода мешавад" + +#~ msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system." +#~ msgstr "Лӯламаҷрои GStreamer-ро, ки барои рамзӣ кардани сабтҳо истифода мешаванд, таъин мекунад. Он наҳвро, ки барои gst-launch истифода мешавад, риоя мекунад. Лӯламаҷро бояд қабати қабулкунандаи пайвастнашуда дошта бошад, ки дар он видеои сабтшаванда сабт мешавад. Одатан он дорои қабати пайвастнашудаи аслӣ мешавад; натиҷаи он қабат ба файли натиҷаҳо навишта мешавад. Аммо лӯламаҷро метавонад инчунин натиҷаи худро истифода барад - ин метавонад барои фиристодани натиҷа ба сервери icecast тавассути shout2send ё монанд истифода шавад. Агар ин таъин шуда набошад, ё ки ба қимати холӣ таъин шуда бошад, лӯламаҷрои пешфарз истифода мешавад. Дар айни ҳол ин чунин мебошад: \"vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux\", ва тавассути кодеки VP8 ба формати WEBM сабт мекунад. %T ҳамчун пуркунандаи фазо барои ҳисоби тақрибӣ дар миқдори беҳтарини риштаҳо дар система истифода мешавад." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Пасванди файл, ки барои нигоҳ доштани рӯйдодҳои экран истифода мешавад" + +#~ msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format." +#~ msgstr "Номи файл барои рӯйдодҳои экрани сабтшуда номи ягонаи файл мебошад, ки бо санаи ҷорӣ асос меёбад ва ин пасвандро истифода мебарад. Вақте ки ба формати дигари дарбаргиранда сабт рафта истода бошад, он бояд тағйир дода шавад." + +#~ msgid "Screencast from %d %t" +#~ msgstr "Рӯйдодҳои экран аз %d %t" + +#~ msgid "Power" +#~ msgstr "Барқ" + +#~ msgid "Restart" +#~ msgstr "Бозоғозидан" + +#~ msgid "Volume, network, battery" +#~ msgstr "Ҳаҷм, шабака, батарея" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "disabled" +#~ msgstr "ғайрифаъол" + +#~ msgid "More…" +#~ msgstr "Бештар..." + +#~ msgid "Connected (private)" +#~ msgstr "Пайваст шудааст (шахсӣ)" + +#~ msgid "Wired" +#~ msgstr "Симдор" + +#~ msgid "Visibility" +#~ msgstr "Қобилияти намоиш" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Насб кардани дастгоҳи нав…" + +#~ msgid "Send Files…" +#~ msgstr "Фиристодани файлҳо…" + +#~ msgid "Universal Access Settings" +#~ msgstr "Танзимоти дастрасии универсалӣ" + +#~ msgid "Keyboard Settings" +#~ msgstr "Танзимоти клавиатура" + +#~ msgid "Mouse Settings" +#~ msgstr "Танзимоти муш" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s боқӣ мондааст" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "соат" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "дақиқа" + +#~ msgid "AC Adapter" +#~ msgstr "Адаптери AC" + +#~ msgid "Laptop Battery" +#~ msgstr "Батареяи лэптоп" + +#~ msgid "Monitor" +#~ msgstr "Монитор" + +#~ msgid "Mouse" +#~ msgstr "Муш" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "Телефони мобилӣ" + +#~ msgid "Media Player" +#~ msgstr "Плеери мултимедиа" + +#~ msgid "Tablet" +#~ msgstr "Планшет" + +#~ msgid "Computer" +#~ msgstr "Компютер" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Номаълум" + +#~ msgid "Available" +#~ msgstr "Дастрас" + +#~ msgid "Busy" +#~ msgstr "Машғул" + +#~ msgid "Invisible" +#~ msgstr "Ноаён" + +#~ msgid "Away" +#~ msgstr "Ғоиб" + +#~ msgid "Idle" +#~ msgstr "Ғайрифаъол" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Вазъияти чати шумо ба \"машғул\" тағйир дода мешавад" + +#~ msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages." +#~ msgstr "Акнун огоҳиҳо ғайрифаъол мебошанд, аз он ҷумла паёмҳои чат. Вазъияти онлайни шумо ба тавре танзим карда шуд, ки дигарон фаҳманд, ки эҳтимолан шумо паёмҳои онҳоро намебинед." + +#~ msgid "cable unplugged" +#~ msgstr "сим ҷудо шудааст" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Ҷамъ кардан ё ҷамъ накардани омор дар бораи истифодабарии барномаҳо" + +#~ msgid "The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data." +#~ msgstr "Одатан ин восит барномаҳои фаъолро нигоҳдорӣ мекунад, то ин ки барномаҳои аз ҳама зиёд истифодашаванда (масалан оғозкунандагон) ҳамеша мавҷуд бошанд. Гарчанде ки ин иттилоот махфӣ нигоҳ дошта мешавад, шумо метавонед интихоб кунед, ки инро барои сабабҳои махфият ғайрифаъол кунед. Лутфан, ба қайд гиред, ки чунин амал иттилооти аллакай захирашударо тоза намекунад." + +#~ msgid "Auto Ethernet" +#~ msgstr "Ethernet-и худкор" + +#~ msgid "Auto broadband" +#~ msgstr "Паҳннавори худкор" + +#~ msgid "Auto dial-up" +#~ msgstr "Шуморагирии худкор" + +#~ msgid "Auto %s" +#~ msgstr "Худкор %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth-и худкор" + +#~ msgid "Auto wireless" +#~ msgstr "Бесими худкор" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Ворид шудан" + +#~ msgid "More..." +#~ msgstr "Бештар..." + +#~ msgid "United Kingdom" +#~ msgstr "Британияи Кабир" + +#~ msgid "Default" +#~ msgstr "Пешфарз" diff --git a/po/th.po b/po/th.po new file mode 100644 index 0000000..f4d3c9e --- /dev/null +++ b/po/th.po @@ -0,0 +1,1941 @@ +# Thai translation for gnome-shell. +# Copyright (C) 2010-2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Sira Nokyoongtong , 2010, 2011. +# Theppitak Karoonboonyanan , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-10-04 06:59+0000\n" +"PO-Revision-Date: 2012-10-09 18:31+0700\n" +"Last-Translator: Theppitak Karoonboonyanan \n" +"Language-Team: Thai \n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:1 +msgid "Screenshots" +msgstr "จับภาพหน้าจอ" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:2 +msgid "Record a screencast" +msgstr "อัดภาพถ่ายทอดหน้าจอ" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "ระบบ" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "แสดงถาดข้อความ" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "เชลล์ GNOME" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "การจัดการหน้าต่างและการเรียกใช้โปรแกรม" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +#: ../js/extensionPrefs/main.js:152 +msgid "GNOME Shell Extension Preferences" +msgstr "ปรับแต่งส่วนขยายของเชลล์ GNOME" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "ตั้งค่าส่วนขยายต่างๆ ของเชลล์ GNOME" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "เปิดใช้เครื่องมือภายในที่เป็นประโยชน์ต่อนักพัฒนาและนักทดสอบ ผ่านปุ่ม Alt-F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "เปิดให้เข้าถึงเครื่องมือภายในสำหรับดีบั๊กและเฝ้าสังเกต ซึ่งเรียกผ่านกล่องโต้ตอบ Alt-F2" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "Uuids of extensions to enable" +msgstr "UUID ของส่วนขยายที่จะเปิดใช้งาน" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension DBus methods on org.gnome.Shell." +msgstr "" +"ส่วนขยายต่างๆ ของเชลล์ GNOME จะมี UUID ประจำตัว คีย์นี้จะเก็บรายชื่อของส่วนขยายที่จะโหลดใช้ " +"ส่วนขยายใดๆ ที่ต้องการให้โหลดจะต้องอยู่ในรายชื่อนี้ คุณยังสามารถจัดการรายชื่อนี้ผ่านเมธอด " +"EnableExtension และ DisableExtension ของ DBus ที่หัวข้อ org.gnome.Shell ได้" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Whether to collect stats about applications usage" +msgstr "กำหนดว่าจะเก็บสถิติการใช้งานโปรแกรมต่างๆ หรือไม่" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "" +"โดยปกติ เชลล์ GNOME จะเฝ้าสังเกตการเรียกใช้งานโปรแกรมต่างๆ เพื่อนำเสนอโปรแกรมที่ใช้บ่อย " +"(เช่น ในตัวเรียกโปรแกรม) แม้ข้อมูลนี้จะถูกเก็บไว้ไม่มีการเผยแพร่อยู่แล้ว " +"แต่คุณอาจต้องการปิดการทำงานส่วนนี้ด้วยเหตุผลเรื่องความเป็นส่วนตัว " +"แต่อย่าลืมว่าการปิดดังกล่าวไม่ได้เป็นการลบข้อมูลที่บันทึกไว้ก่อนหน้านี้" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "รายชื่อของแฟ้มเดสก์ท็อปสำหรับโปรแกรมโปรด" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "โปรแกรมที่แทนด้วยแฟ้มเดสก์ท็อปเหล่านี้จะถูกแสดงในบริเวณโปรแกรมโปรด" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "History for command (Alt-F2) dialog" +msgstr "ประวัติคำสั่งของกล่องโต้ตอบเรียกโปรแกรม (Alt-F2)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "History for the looking glass dialog" +msgstr "ประวัติคำสั่งของกล่องโต้ตอบ looking glass" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "" +"Internally used to store the last IM presence explicitly set by the user. " +"The value here is from the TpConnectionPresenceType enumeration." +msgstr "" +"ใช้เป็นการภายในเพื่อเก็บสถานะอยู่/ไม่อยู่ล่าสุดของ IM ที่ผู้ใช้เปลี่ยนเองโดยตรง ค่านี้เป็นค่าจาก " +"enumeration ชนิด TpConnectionPresenceType" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "" +"Internally used to store the last session presence status for the user. The " +"value here is from the GsmPresenceStatus enumeration." +msgstr "" +"ใช้เป็นการภายในเพื่อเก็บสถานะอยู่/ไม่อยู่ของผู้ใช้ในวาระล่าสุด ค่านี้เป็นค่าจาก enumeration ชนิด " +"GsmPresenceStatus" + +# See http://en.wikipedia.org/wiki/ISO_week_date +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "Show the week date in the calendar" +msgstr "แสดงวันที่แบบสัปดาห์ในปฏิทิน" + +# See http://en.wikipedia.org/wiki/ISO_week_date +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "If true, display the ISO week date in the calendar." +msgstr "ถ้าเลือก จะแสดงวันที่แบบสัปดาห์ของ ISO ในปฏิทิน" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "Keybinding to open the application menu" +msgstr "ปุ่มลัดสำหรับเปิดเมนูโปรแกรม" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "Keybinding to open the application menu." +msgstr "ปุ่มลัดสำหรับเปิดเมนูโปรแกรม" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "ปุ่มลัดสำหรับสลับการซ่อน/แสดงของถาดข้อความ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "ปุ่มลัดสำหรับสลับการซ่อน/แสดงของถาดข้อความ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Keybinding to toggle the screen recorder" +msgstr "ปุ่มลัดสำหรับสลับเครื่องมืออัดภาพถ่ายทอดหน้าจอ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Keybinding to start/stop the builtin screen recorder." +msgstr "ปุ่มลัดสำหรับเริ่ม/หยุดเครื่องมืออัดภาพถ่ายทอดหน้าจอที่มีมากับเชลล์" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Which keyboard to use" +msgstr "ใช้แป้นพิมพ์ชนิดไหน" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "The type of keyboard to use." +msgstr "ชนิดของแป้นพิมพ์ที่ใช้" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Framerate used for recording screencasts." +msgstr "อัตราเฟรมที่จะใช้อัดภาพถ่ายทอดหน้าจอ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "" +"อัตราเฟรมของภาพถ่ายทอดหน้าจอที่จะอัดด้วยเครื่องมืออัดภาพถ่ายทอดหน้าจอของเชลล์ GNOME " +"ในหน่วยเฟรมต่อวินาที" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "ไปป์ไลน์ของ GStreamer ที่จะใช้ลงรหัสภาพถ่ายทอดหน้าจอ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is " +"used as a placeholder for a guess at the optimal thread count on the system." +msgstr "" +"กำหนดไปป์ไลน์ของ GStreamer ที่จะใช้ในการลงรหัสวีดิทัศน์ที่อัด โดยกำหนดในรูปแบบที่ gst-launch " +"ใช้ ไปป์ไลน์นี้ควรจะมี sink pad ปลายเปิดซึ่งจะรับสัญญาณวีดิทัศน์ที่อัด และโดยปกติก็จะมี source " +"pad ปลายเปิดด้วย ซึ่งจะใช้ปล่อยข้อมูลที่จะเขียนลงแฟ้มปลายทาง อย่างไรก็ดี " +"ไปป์ไลน์สามารถจัดการข้อมูลออกของตัวเองได้ด้วย ซึ่งอาจจะใช้ในการส่งข้อมูลออกไปยังเซิร์ฟเวอร์ " +"icecast ผ่าน shout2send หรืออะไรทำนองนี้ ถ้าค่านี้ไม่ได้กำหนดไว้ หรือกำหนดเป็นค่าว่างเปล่า " +"ก็จะใช้ไปป์ไลน์ปริยาย ซึ่งขณะนี้ืคือ 'vp8enc min_quantizer=13 max_quantizer=13 cpu-" +"used=5 deadline=1000000 threads=%T ! queue ! webmmux' และจะอัดวีดิทัศน์เป็น WEBM " +"โดยใช้ตัวอ่าน/ลงรหัส VP8 ตัวแปร %T จะถูกแทนที่ด้วยค่าคาดเดาของจำนวนเธรดที่เหมาะสมของระบบ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "File extension used for storing the screencast" +msgstr "นามสกุลแฟ้มที่จะใช้เก็บภาพถ่ายทอดหน้าจอ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "" +"ชื่อแฟ้มของภาพถ่ายทอดหน้าจอที่อัดจะเป็นชื่อที่ไม่ซ้ำ โดยสร้างจากวันเวลาปัจจุบัน แล้วตามด้วยนามสกุลนี้ " +"ซึ่งควรเปลี่ยนให้ตรงตามฟอร์แมตที่อัด" + +#: ../js/extensionPrefs/main.js:124 +#, c-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "เกิดข้อผิดพลาดขณะโหลดกล่องโต้ตอบปรับแต่งสำหรับ %s:" + +#: ../js/extensionPrefs/main.js:164 +msgid "Extension" +msgstr "ส่วนขยาย" + +#: ../js/extensionPrefs/main.js:188 +msgid "Select an extension to configure using the combobox above." +msgstr "เลือกส่วนขยายที่จะตั้งค่าโดยใช้กล่องคอมโบด้านบน" + +#: ../js/gdm/loginDialog.js:528 +msgid "Session..." +msgstr "วาระ..." + +#: ../js/gdm/loginDialog.js:676 +msgctxt "title" +msgid "Sign In" +msgstr "เข้าระบบ" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:743 +msgid "Not listed?" +msgstr "ไม่มีชื่อของคุณงั้นหรือ?" + +#: ../js/gdm/loginDialog.js:896 ../js/ui/components/networkAgent.js:137 +#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 +#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 +msgid "Cancel" +msgstr "ยกเลิก" + +#: ../js/gdm/loginDialog.js:901 +msgctxt "button" +msgid "Sign In" +msgstr "เข้าระบบ" + +#: ../js/gdm/loginDialog.js:1240 +msgid "Login Window" +msgstr "หน้าต่างเข้าระบบ" + +#. Translators: accessible name of the power menu in the login screen +#: ../js/gdm/powerMenu.js:35 +msgid "Power" +msgstr "เปิด/ปิด" + +#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664 +#: ../js/ui/userMenu.js:775 +msgid "Suspend" +msgstr "พักเครื่อง" + +#: ../js/gdm/powerMenu.js:94 +msgid "Restart" +msgstr "เปิดเครื่องใหม่" + +#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664 +#: ../js/ui/userMenu.js:774 +msgid "Power Off" +msgstr "ปิดเครื่อง" + +#: ../js/gdm/util.js:148 +msgid "Authentication error" +msgstr "ยืนยันตัวบุคคลผิดพลาด" + +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/util.js:265 +msgid "(or swipe finger)" +msgstr "(หรือลูบจอ)" + +#: ../js/gdm/util.js:290 +#, c-format +msgid "(e.g., user or %s)" +msgstr "(เช่น ผู้ใช้ หรือ %s)" + +#: ../js/misc/util.js:92 +msgid "Command not found" +msgstr "ไม่พบคำสั่ง" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:125 +msgid "Could not parse command:" +msgstr "ไม่สามารถแจงคำสั่ง:" + +#: ../js/misc/util.js:133 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "คำสั่ง '%s' ทำงานล้มเหลว:" + +#. Translators: Filter to display all applications +#: ../js/ui/appDisplay.js:252 +msgid "All" +msgstr "ทั้งหมด" + +#: ../js/ui/appDisplay.js:310 +msgid "APPLICATIONS" +msgstr "โปรแกรม" + +#: ../js/ui/appDisplay.js:370 +msgid "SETTINGS" +msgstr "ค่าตั้ง" + +#: ../js/ui/appDisplay.js:675 +msgid "New Window" +msgstr "หน้าต่างใหม่" + +#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 +msgid "Remove from Favorites" +msgstr "ลบออกจากรายการโปรด" + +#: ../js/ui/appDisplay.js:679 +msgid "Add to Favorites" +msgstr "เพิ่มเข้าในรายการโปรด" + +#: ../js/ui/appFavorites.js:87 +#, c-format +msgid "%s has been added to your favorites." +msgstr "%s ถูกเพิ่มเข้าในรายการโปรดของคุณแล้ว" + +#: ../js/ui/appFavorites.js:118 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "%s ถูกลบออกจากรายการโปรดของคุณแล้ว" + +#. 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:62 +msgctxt "event list time" +msgid "All Day" +msgstr "ทั้งวัน" + +#. Translators: Shown in calendar event list, if 24h format +#: ../js/ui/calendar.js:67 +msgctxt "event list time" +msgid "%H:%M" +msgstr "%H:%M" + +#. Transators: Shown in calendar event list, if 12h format +#: ../js/ui/calendar.js:74 +msgctxt "event list time" +msgid "%l:%M %p" +msgstr "%l:%M %p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:114 +msgctxt "grid sunday" +msgid "S" +msgstr "อา" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:116 +msgctxt "grid monday" +msgid "M" +msgstr "จ" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:118 +msgctxt "grid tuesday" +msgid "T" +msgstr "อ" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:120 +msgctxt "grid wednesday" +msgid "W" +msgstr "พ" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:122 +msgctxt "grid thursday" +msgid "T" +msgstr "พฤ" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:124 +msgctxt "grid friday" +msgid "F" +msgstr "ศ" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:126 +msgctxt "grid saturday" +msgid "S" +msgstr "ส" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:139 +msgctxt "list sunday" +msgid "Su" +msgstr "อา." + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:141 +msgctxt "list monday" +msgid "M" +msgstr "จ." + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:143 +msgctxt "list tuesday" +msgid "T" +msgstr "อ." + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:145 +msgctxt "list wednesday" +msgid "W" +msgstr "พ." + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:147 +msgctxt "list thursday" +msgid "Th" +msgstr "พฤ." + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:149 +msgctxt "list friday" +msgid "F" +msgstr "ศ." + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:151 +msgctxt "list saturday" +msgid "S" +msgstr "ส." + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:699 +msgid "Nothing Scheduled" +msgstr "ไม่มีกำหนดการ" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:715 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A %d %B" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:718 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A %d %B %Ey" + +#: ../js/ui/calendar.js:728 +msgid "Today" +msgstr "วันนี้" + +#: ../js/ui/calendar.js:732 +msgid "Tomorrow" +msgstr "พรุ่งนี้" + +#: ../js/ui/calendar.js:743 +msgid "This week" +msgstr "สัปดาห์นี้" + +#: ../js/ui/calendar.js:751 +msgid "Next week" +msgstr "สัปดาห์หน้า" + +#: ../js/ui/components/autorunManager.js:297 +msgid "Removable Devices" +msgstr "อุปกรณ์ถอดเสียบ" + +#: ../js/ui/components/autorunManager.js:594 +#, c-format +msgid "Open with %s" +msgstr "เปิดด้วย %s" + +#: ../js/ui/components/autorunManager.js:620 +msgid "Eject" +msgstr "เอาสื่อออก" + +#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260 +msgid "Password:" +msgstr "รหัสผ่าน:" + +#: ../js/ui/components/keyring.js:105 +msgid "Type again:" +msgstr "ป้อนซ้ำอีกครั้ง:" + +#: ../js/ui/components/networkAgent.js:132 +msgid "Connect" +msgstr "เชื่อมต่อ" + +#. Cisco LEAP +#: ../js/ui/components/networkAgent.js:223 +#: ../js/ui/components/networkAgent.js:235 +#: ../js/ui/components/networkAgent.js:262 +#: ../js/ui/components/networkAgent.js:282 +#: ../js/ui/components/networkAgent.js:292 +msgid "Password: " +msgstr "รหัสผ่าน: " + +#. static WEP +#: ../js/ui/components/networkAgent.js:228 +msgid "Key: " +msgstr "กุญแจ: " + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/ui/components/networkAgent.js:260 +#: ../js/ui/components/networkAgent.js:278 +msgid "Username: " +msgstr "ชื่อผู้ใช้: " + +#: ../js/ui/components/networkAgent.js:266 +msgid "Identity: " +msgstr "ข้อมูลบุคคล: " + +#: ../js/ui/components/networkAgent.js:268 +msgid "Private key password: " +msgstr "รหัสผ่านกุญแจส่วนตัว: " + +#: ../js/ui/components/networkAgent.js:280 +msgid "Service: " +msgstr "บริการ: " + +#: ../js/ui/components/networkAgent.js:309 +msgid "Authentication required by wireless network" +msgstr "เครือข่ายไร้สายต้องการการยืนยันตัวบุคคล" + +#: ../js/ui/components/networkAgent.js:310 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"'%s'." +msgstr "ต้องป้อนรหัสผ่านหรือกุญแจสำหรับเข้ารหัสลับเพื่อจะเข้าใช้เครือข่ายไร้สาย '%s'" + +#: ../js/ui/components/networkAgent.js:314 +msgid "Wired 802.1X authentication" +msgstr "การยืนยันตัวบุคคลกับเครือข่ายมีสาย 802.1X" + +#: ../js/ui/components/networkAgent.js:316 +msgid "Network name: " +msgstr "ชื่อเครือข่าย: " + +#: ../js/ui/components/networkAgent.js:321 +msgid "DSL authentication" +msgstr "การยืนยันตัวบุคคลกับ DSL" + +#: ../js/ui/components/networkAgent.js:328 +msgid "PIN code required" +msgstr "ต้องการรหัส PIN" + +#: ../js/ui/components/networkAgent.js:329 +msgid "PIN code is needed for the mobile broadband device" +msgstr "ต้องการรหัส PIN ของอุปกรณ์บรอดแบนด์มือถือ" + +#: ../js/ui/components/networkAgent.js:330 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:336 +msgid "Mobile broadband network password" +msgstr "รหัสผ่านของเครือข่ายบรอดแบนด์มือถือ" + +#: ../js/ui/components/networkAgent.js:337 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "ต้องการรหัสผ่านในการเชื่อมต่อกับ '%s'" + +#: ../js/ui/components/polkitAgent.js:55 +msgid "Authentication Required" +msgstr "จำเป็นต้องยืนยันตัวบุคคล" + +#: ../js/ui/components/polkitAgent.js:93 +msgid "Administrator" +msgstr "ผู้ดูแลระบบ" + +#: ../js/ui/components/polkitAgent.js:166 +msgid "Authenticate" +msgstr "ยืนยันตัวบุคคล" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:381 +msgid "Sorry, that didn't work. Please try again." +msgstr "ขออภัย ยังไม่ผ่าน โปรดลองใหม่" + +#. Translators: this is a filename used for screencast recording +#: ../js/ui/components/recorder.js:44 +#, no-c-format +msgid "Screencast from %d %t" +msgstr "Screencast from %d %t" + +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/components/telepathyClient.js:237 +msgid "Invitation" +msgstr "คำเชิญ" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:297 +msgid "Call" +msgstr "สายเรียก" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:313 +msgid "File Transfer" +msgstr "การถ่ายโอนแฟ้ม" + +#: ../js/ui/components/telepathyClient.js:394 +msgid "Subscription request" +msgstr "การขอสมัคร" + +#: ../js/ui/components/telepathyClient.js:430 +msgid "Connection error" +msgstr "ข้อผิดพลาดในการเชื่อมต่อ" + +#: ../js/ui/components/telepathyClient.js:491 +msgid "Unmute" +msgstr "เลิกเงียบ" + +#: ../js/ui/components/telepathyClient.js:491 +msgid "Mute" +msgstr "เงียบ" + +#. Translators: this is a time format string followed by a date. +#. If applicable, replace %X with a strftime format valid for your +#. locale, without seconds. +#: ../js/ui/components/telepathyClient.js:948 +#, no-c-format +msgid "Sent at %X on %A" +msgstr "ส่งเมื่อวัน%A เวลา %H:%M น." + +#. Translators: this is a time format in the style of "Wednesday, May 25", +#. shown when you get a chat message in the same year. +#: ../js/ui/components/telepathyClient.js:954 +#, no-c-format +msgid "Sent on %A, %B %d" +msgstr "ส่งเมื่อวัน%Aที่ %d %B" + +#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", +#. shown when you get a chat message in a different year. +#: ../js/ui/components/telepathyClient.js:959 +#, no-c-format +msgid "Sent on %A, %B %d, %Y" +msgstr "ส่งเมื่อวัน%Aที่ %d %B %Ey" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/components/telepathyClient.js:988 +#, c-format +msgid "%s is now known as %s" +msgstr "%s เปลี่ยนชื่อเป็น %s" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1088 +#, c-format +msgid "Invitation to %s" +msgstr "คำเชิญให้เข้าห้อง %s" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/components/telepathyClient.js:1096 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "%s เชิญคุณเข้าร่วมสนทนาที่ห้อง %s" + +#: ../js/ui/components/telepathyClient.js:1098 +#: ../js/ui/components/telepathyClient.js:1177 +#: ../js/ui/components/telepathyClient.js:1240 +msgid "Decline" +msgstr "ปฏิเสธ" + +#: ../js/ui/components/telepathyClient.js:1099 +#: ../js/ui/components/telepathyClient.js:1178 +#: ../js/ui/components/telepathyClient.js:1241 +msgid "Accept" +msgstr "ตอบรับ" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1129 +#, c-format +msgid "Video call from %s" +msgstr "สายเรียกแบบวีดิทัศน์จาก %s" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1132 +#, c-format +msgid "Call from %s" +msgstr "สายเรียกจาก %s" + +#: ../js/ui/components/telepathyClient.js:1137 +#: ../js/ui/status/bluetooth.js:346 +msgid "Reject" +msgstr "ปฏิเสธ" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/components/telepathyClient.js:1139 +msgid "Answer" +msgstr "ตอบรับ" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/components/telepathyClient.js:1171 +#, c-format +msgid "%s is sending you %s" +msgstr "%s กำลังส่ง %s ให้คุณ" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/components/telepathyClient.js:1206 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "%s ขออนุญาตติดต่อกับคุณแบบออนไลน์" + +#: ../js/ui/components/telepathyClient.js:1298 +msgid "Network error" +msgstr "ข้อผิดพลาดเกี่ยวกับเครือข่าย" + +#: ../js/ui/components/telepathyClient.js:1300 +msgid "Authentication failed" +msgstr "การยืนยันตัวบุคคลไม่ผ่าน" + +#: ../js/ui/components/telepathyClient.js:1302 +msgid "Encryption error" +msgstr "ข้อผิดพลาดเกี่ยวกับการเข้ารหัสลับ" + +#: ../js/ui/components/telepathyClient.js:1304 +msgid "Certificate not provided" +msgstr "ไม่มีใบรับรอง" + +#: ../js/ui/components/telepathyClient.js:1306 +msgid "Certificate untrusted" +msgstr "ไม่เชื่อถือใบรับรอง" + +#: ../js/ui/components/telepathyClient.js:1308 +msgid "Certificate expired" +msgstr "ใบรับรองหมดอายุแล้ว" + +#: ../js/ui/components/telepathyClient.js:1310 +msgid "Certificate not activated" +msgstr "ใบรับรองยังไม่มีการเริ่มใช้" + +#: ../js/ui/components/telepathyClient.js:1312 +msgid "Certificate hostname mismatch" +msgstr "ชื่อโฮสต์ในใบรับรองไม่ตรงกัน" + +#: ../js/ui/components/telepathyClient.js:1314 +msgid "Certificate fingerprint mismatch" +msgstr "ลายนิ้วมือในใบรับรองไม่ตรงกัน" + +#: ../js/ui/components/telepathyClient.js:1316 +msgid "Certificate self-signed" +msgstr "ใบรับรองเซ็นรับรองตัวเอง" + +#: ../js/ui/components/telepathyClient.js:1318 +msgid "Status is set to offline" +msgstr "สถานะเปลี่ยนเป็นออฟไลน์" + +#: ../js/ui/components/telepathyClient.js:1320 +msgid "Encryption is not available" +msgstr "ไม่มีการเข้ารหัสลับให้ใช้งาน" + +#: ../js/ui/components/telepathyClient.js:1322 +msgid "Certificate is invalid" +msgstr "ใบรับรองไม่ถูกต้อง" + +#: ../js/ui/components/telepathyClient.js:1324 +msgid "Connection has been refused" +msgstr "การเชื่อมต่อถูกปฏิเสธ" + +#: ../js/ui/components/telepathyClient.js:1326 +msgid "Connection can't be established" +msgstr "เชื่อมต่อไม่สำเร็จ" + +#: ../js/ui/components/telepathyClient.js:1328 +msgid "Connection has been lost" +msgstr "การเชื่อมต่อถูกตัดขาด" + +#: ../js/ui/components/telepathyClient.js:1330 +msgid "This account is already connected to the server" +msgstr "บัญชีนี้ได้เชื่อมต่อกับเซิร์ฟเวอร์อยู่ก่อนแล้ว" + +#: ../js/ui/components/telepathyClient.js:1332 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "การเชื่อมต่อถูกแทนที่ด้วยการเชื่อมต่อใหม่โดยใช้ทรัพยากรเดียวกัน" + +#: ../js/ui/components/telepathyClient.js:1334 +msgid "The account already exists on the server" +msgstr "บัญชีนี้มีอยู่แล้วที่เซิร์ฟเวอร์" + +#: ../js/ui/components/telepathyClient.js:1336 +msgid "Server is currently too busy to handle the connection" +msgstr "เซิร์ฟเวอร์ไม่ว่างพอที่จะจัดการการเชื่อมต่อ" + +#: ../js/ui/components/telepathyClient.js:1338 +msgid "Certificate has been revoked" +msgstr "ใบรับรองถูกเพิกถอนไปแล้ว" + +#: ../js/ui/components/telepathyClient.js:1340 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "ใบรับรองใช้อัลกอริทึมการเข้ารหัสลับที่ไม่ปลอดภัยหรืออ่อนเกินไป" + +#: ../js/ui/components/telepathyClient.js:1342 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "" +"ความยาวของใบรับรอง หรือความลึกของห่วงโซ่ใบรับรองของเซิร์ฟเวอร์ " +"มีขนาดเกินขีดจำกัดที่ไลบรารีระบบเข้ารหัสลับกำหนดไว้" + +#: ../js/ui/components/telepathyClient.js:1344 +msgid "Internal error" +msgstr "ข้อผิดพลาดภายใน" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1354 +#, c-format +msgid "Connection to %s failed" +msgstr "เชื่อมต่อไปยัง %s ไม่สำเร็จ" + +#: ../js/ui/components/telepathyClient.js:1363 +msgid "Reconnect" +msgstr "เชื่อมต่อใหม่" + +#: ../js/ui/components/telepathyClient.js:1364 +msgid "Edit account" +msgstr "แก้ไขบัญชี" + +#: ../js/ui/components/telepathyClient.js:1409 +msgid "Unknown reason" +msgstr "ไม่ทราบสาเหตุ" + +#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 +msgid "Show Applications" +msgstr "แสดงโปรแกรมต่างๆ" + +#: ../js/ui/dateMenu.js:86 +msgid "Date and Time Settings" +msgstr "ตั้งค่าวันที่และเวลา" + +#: ../js/ui/dateMenu.js:109 +msgid "Open Calendar" +msgstr "เปิดปฏิทิน" + +#. 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:175 +msgid "%A %B %e, %Y" +msgstr "%A %d %B %Ey" + +#: ../js/ui/endSessionDialog.js:61 +#, c-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s ออกจากระบบ" + +#: ../js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Log Out" +msgstr "ออกจากระบบ" + +#: ../js/ui/endSessionDialog.js:63 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "คลิก \"ออกจากระบบ\" เพื่อปิดโปรแกรมเหล่านี้ และออกจากระบบ" + +#: ../js/ui/endSessionDialog.js:65 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s จะออกจากระบบโดยอัตโนมัติใน %d วินาที" + +#: ../js/ui/endSessionDialog.js:70 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "คุณจะออกจากระบบโดยอัตโนมัติใน %d วินาที" + +#: ../js/ui/endSessionDialog.js:74 +msgid "Logging out of the system." +msgstr "กำลังออกจากระบบ" + +#: ../js/ui/endSessionDialog.js:76 +msgctxt "button" +msgid "Log Out" +msgstr "ออกจากระบบ" + +#: ../js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Power Off" +msgstr "ปิดเครื่อง" + +#: ../js/ui/endSessionDialog.js:82 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "คลิก \"ปิดเครื่อง\" เพื่อออกจากโปรแกรมเหล่านี้ และปิดเครื่อง" + +#: ../js/ui/endSessionDialog.js:84 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "ระบบจะปิดโดยอัตโนมัติใน %d วินาที" + +#: ../js/ui/endSessionDialog.js:88 +msgid "Powering off the system." +msgstr "กำลังปิดระบบ" + +#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107 +msgctxt "button" +msgid "Restart" +msgstr "เปิดเครื่องใหม่" + +#: ../js/ui/endSessionDialog.js:92 +msgctxt "button" +msgid "Power Off" +msgstr "ปิดเครื่อง" + +#: ../js/ui/endSessionDialog.js:98 +msgctxt "title" +msgid "Restart" +msgstr "เปิดเครื่องใหม่" + +#: ../js/ui/endSessionDialog.js:99 +msgid "Click Restart to quit these applications and restart the system." +msgstr "คลิก \"เปิดเครื่องใหม่\" เพื่อออกจากโปรแกรมเหล่านี้ และเปิดเครื่องใหม่" + +#: ../js/ui/endSessionDialog.js:101 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "ระบบจะเปิดใหม่โดยอัตโนมัติใน %d วินาที" + +#: ../js/ui/endSessionDialog.js:105 +msgid "Restarting the system." +msgstr "กำลังเปิดเครื่องใหม่" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "ติดตั้ง" + +#: ../js/ui/extensionDownloader.js:204 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "จะดาวน์โหลดและติดตั้ง '%s' จาก extensions.gnome.org หรือไม่?" + +#: ../js/ui/keyboard.js:337 +msgid "tray" +msgstr "ถาด" + +#: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195 +#: ../js/ui/status/power.js:205 +msgid "Keyboard" +msgstr "แป้นพิมพ์" + +#: ../js/ui/lookingGlass.js:691 +msgid "No extensions installed" +msgstr "ไม่มีส่วนขยายติดตั้งอยู่" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:745 +#, c-format +msgid "%s has not emitted any errors." +msgstr "%s ไม่ได้ให้ข้อผิดพลาดใดออกมา" + +#: ../js/ui/lookingGlass.js:751 +msgid "Hide Errors" +msgstr "ซ่อนข้อผิดพลาด" + +#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815 +msgid "Show Errors" +msgstr "แสดงข้อผิดพลาด" + +#: ../js/ui/lookingGlass.js:764 +msgid "Enabled" +msgstr "เปิดใช้งาน" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:767 ../src/gvc/gvc-mixer-control.c:1082 +msgid "Disabled" +msgstr "ปิดใช้" + +#: ../js/ui/lookingGlass.js:769 +msgid "Error" +msgstr "ผิดพลาด" + +#: ../js/ui/lookingGlass.js:771 +msgid "Out of date" +msgstr "ตกรุ่น" + +#: ../js/ui/lookingGlass.js:773 +msgid "Downloading" +msgstr "กำลังดาวน์โหลด" + +#: ../js/ui/lookingGlass.js:797 +msgid "View Source" +msgstr "ดูซอร์ส" + +#: ../js/ui/lookingGlass.js:806 +msgid "Web Page" +msgstr "หน้าเว็บ" + +#: ../js/ui/messageTray.js:1081 +msgid "Open" +msgstr "เปิด" + +#: ../js/ui/messageTray.js:1088 +msgid "Remove" +msgstr "ลบ" + +#: ../js/ui/messageTray.js:1533 +msgid "Message Tray" +msgstr "ถาดข้อความ" + +#: ../js/ui/messageTray.js:2544 +msgid "System Information" +msgstr "ข้อมูลระบบ" + +#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373 +msgctxt "program" +msgid "Unknown" +msgstr "ไม่ทราบชื่อ" + +#: ../js/ui/overview.js:82 +msgid "Undo" +msgstr "เรียกคืน" + +#: ../js/ui/overview.js:127 +msgid "Overview" +msgstr "ภาพรวม" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/overview.js:201 +msgid "Type to search..." +msgstr "ป้อนเพื่อค้นหา..." + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/overview.js:222 +msgid "Dash" +msgstr "แผงปุ่ม" + +#: ../js/ui/panel.js:567 +msgid "Quit" +msgstr "ออก" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:599 +msgid "Activities" +msgstr "กิจกรรม" + +#: ../js/ui/panel.js:965 +msgid "Top Bar" +msgstr "แถบด้านบน" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:731 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: ../js/ui/runDialog.js:205 +msgid "Please enter a command:" +msgstr "โปรดป้อนคำสั่ง:" + +#. Translators: This is a time format for a date in +#. long format +#: ../js/ui/screenShield.js:79 +msgid "%A, %B %d" +msgstr "%A %d %B" + +#: ../js/ui/screenShield.js:144 +#, c-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "ข้อความใหม่ %d ข้อความ" + +#: ../js/ui/screenShield.js:146 +#, c-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "รายการแจ้งเหตุ %d รายการ" + +#: ../js/ui/searchDisplay.js:275 +msgid "Searching..." +msgstr "กำลังค้นหา..." + +#: ../js/ui/searchDisplay.js:323 +msgid "No results." +msgstr "ไม่พบรายการ" + +#: ../js/ui/shellEntry.js:26 +msgid "Copy" +msgstr "คัดลอก" + +#: ../js/ui/shellEntry.js:31 +msgid "Paste" +msgstr "แปะ" + +#: ../js/ui/shellEntry.js:102 +msgid "Show Text" +msgstr "แสดงข้อความ" + +#: ../js/ui/shellEntry.js:104 +msgid "Hide Text" +msgstr "ซ่อนข้อความ" + +#: ../js/ui/shellMountOperation.js:368 +msgid "Password" +msgstr "รหัสผ่าน" + +#: ../js/ui/shellMountOperation.js:389 +msgid "Remember Password" +msgstr "จำรหัสผ่าน" + +#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 +msgid "Unlock" +msgstr "ปลดล็อค" + +#: ../js/ui/status/accessibility.js:39 +msgid "Accessibility" +msgstr "สิ่งอำนวยความสะดวก" + +#: ../js/ui/status/accessibility.js:44 +msgid "Zoom" +msgstr "ซูม" + +#: ../js/ui/status/accessibility.js:51 +msgid "Screen Reader" +msgstr "โปรแกรมอ่านหน้าจอ" + +#: ../js/ui/status/accessibility.js:55 +msgid "Screen Keyboard" +msgstr "แป้นพิมพ์บนจอ" + +#: ../js/ui/status/accessibility.js:59 +msgid "Visual Alerts" +msgstr "แจ้งเหตุด้วยภาพ" + +#: ../js/ui/status/accessibility.js:62 +msgid "Sticky Keys" +msgstr "ค้างปุ่มกด" + +#: ../js/ui/status/accessibility.js:65 +msgid "Slow Keys" +msgstr "พิมพ์แบบช้า" + +#: ../js/ui/status/accessibility.js:68 +msgid "Bounce Keys" +msgstr "ป้องกันการกดแป้นรัว" + +#: ../js/ui/status/accessibility.js:71 +msgid "Mouse Keys" +msgstr "บังคับเมาส์ด้วยแป้น" + +#: ../js/ui/status/accessibility.js:75 +msgid "Universal Access Settings" +msgstr "ตั้งค่าการเข้าถึงหลากหลาย" + +#: ../js/ui/status/accessibility.js:109 +msgid "High Contrast" +msgstr "สีตัดกัน" + +#: ../js/ui/status/accessibility.js:146 +msgid "Large Text" +msgstr "อักษรขนาดใหญ่" + +#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 +#: ../js/ui/status/bluetooth.js:251 ../js/ui/status/bluetooth.js:304 +#: ../js/ui/status/bluetooth.js:335 ../js/ui/status/bluetooth.js:371 +#: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:867 +msgid "Bluetooth" +msgstr "บลูทูท" + +#: ../js/ui/status/bluetooth.js:44 +msgid "Visibility" +msgstr "ความปรากฏเห็น" + +#: ../js/ui/status/bluetooth.js:58 +msgid "Send Files to Device..." +msgstr "ส่งแฟ้มไปยังอุปกรณ์..." + +#: ../js/ui/status/bluetooth.js:59 +msgid "Set up a New Device..." +msgstr "ตั้งค่าอุปกรณ์ชิ้นใหม่..." + +#: ../js/ui/status/bluetooth.js:83 +msgid "Bluetooth Settings" +msgstr "ตั้งค่าบลูทูท" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:208 +msgid "hardware disabled" +msgstr "ฮาร์ดแวร์ปิดการใช้งานอยู่" + +#: ../js/ui/status/bluetooth.js:196 +msgid "Connection" +msgstr "การเชื่อมต่อ" + +#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:458 +msgid "disconnecting..." +msgstr "กำลังตัดการเชื่อมต่อ..." + +#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:464 +#: ../js/ui/status/network.js:934 +msgid "connecting..." +msgstr "กำลังเชื่อมต่อ..." + +#: ../js/ui/status/bluetooth.js:238 +msgid "Send Files..." +msgstr "ส่งแฟ้ม..." + +#: ../js/ui/status/bluetooth.js:243 +msgid "Browse Files..." +msgstr "เรียกดูแฟ้ม..." + +#: ../js/ui/status/bluetooth.js:252 +msgid "Error browsing device" +msgstr "เกิดข้อผิดพลาดขณะเรียกดูแฟ้มในอุปกรณ์" + +#: ../js/ui/status/bluetooth.js:253 +#, c-format +msgid "The requested device cannot be browsed, error is '%s'" +msgstr "อุปกรณ์ที่ร้องขอไม่สามารถเรียกดูแฟ้มได้ ข้อผิดพลาดคือ '%s'" + +#: ../js/ui/status/bluetooth.js:261 +msgid "Keyboard Settings" +msgstr "ตั้งค่าแป้นพิมพ์" + +#: ../js/ui/status/bluetooth.js:264 +msgid "Mouse Settings" +msgstr "ตั้งค่าเมาส์" + +#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234 +msgid "Sound Settings" +msgstr "ตั้งค่าเสียง" + +#: ../js/ui/status/bluetooth.js:336 +#, c-format +msgid "Authorization request from %s" +msgstr "มีการขออนุญาตจาก %s" + +#: ../js/ui/status/bluetooth.js:342 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "อุปกรณ์ %s ต้องการเข้าถึงบริการ '%s'" + +#: ../js/ui/status/bluetooth.js:344 +msgid "Always grant access" +msgstr "อนุญาตให้เข้าใช้เสมอ" + +#: ../js/ui/status/bluetooth.js:345 +msgid "Grant this time only" +msgstr "อนุญาตครั้งนี้เท่านั้น" + +#: ../js/ui/status/bluetooth.js:372 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "การยืนยันการจับคู่สำหรับ %s" + +#: ../js/ui/status/bluetooth.js:378 ../js/ui/status/bluetooth.js:408 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "อุปกรณ์ %s ต้องการจับคู่กับคอมพิวเตอร์เครื่องนี้" + +#: ../js/ui/status/bluetooth.js:379 +#, c-format +msgid "Please confirm whether the PIN '%06d' matches the one on the device." +msgstr "กรุณายืนยันว่ารหัส PIN '%06d' ตรงกันกับของอุปกรณ์ดังกล่าวหรือไม่" + +#: ../js/ui/status/bluetooth.js:381 +msgid "Matches" +msgstr "ตรงกัน" + +#: ../js/ui/status/bluetooth.js:382 +msgid "Does not match" +msgstr "ไม่ตรงกัน" + +#: ../js/ui/status/bluetooth.js:401 +#, c-format +msgid "Pairing request for %s" +msgstr "คำร้องขอจับคู่สำหรับ %s" + +#: ../js/ui/status/bluetooth.js:409 +msgid "Please enter the PIN mentioned on the device." +msgstr "กรุณาป้อนรหัส PIN ที่ระบุบนอุปกรณ์ดังกล่าว" + +#: ../js/ui/status/bluetooth.js:426 +msgid "OK" +msgstr "ตกลง" + +#: ../js/ui/status/keyboard.js:228 +msgid "Show Keyboard Layout" +msgstr "แสดงผังแป้นพิมพ์" + +#: ../js/ui/status/keyboard.js:233 +msgid "Region and Language Settings" +msgstr "ตั้งค่าท้องที่และภาษา" + +#: ../js/ui/status/lockScreenMenu.js:18 +msgid "Volume, network, battery" +msgstr "ความดังเสียง, เครือข่าย, แบตเตอรี่" + +#: ../js/ui/status/network.js:94 +msgid "" +msgstr "<ไม่ทราบ>" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:230 +msgid "disabled" +msgstr "ปิดใช้" + +#. 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) +#: ../js/ui/status/network.js:456 +msgid "unmanaged" +msgstr "ไม่ถูกจัดการ" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:467 ../js/ui/status/network.js:937 +msgid "authentication required" +msgstr "ต้องยืนยันตัวบุคคล" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:477 +msgid "firmware missing" +msgstr "ขาดเฟิร์มแวร์" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:484 +msgid "cable unplugged" +msgstr "ไม่ได้เสียบสายเคเบิล" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:489 +msgid "unavailable" +msgstr "ไม่สามารถใช้งานได้" + +#: ../js/ui/status/network.js:491 ../js/ui/status/network.js:939 +msgid "connection failed" +msgstr "เชื่อมต่อไม่สำเร็จ" + +#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1529 +msgid "More..." +msgstr "เพิ่มเติม..." + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1459 +msgid "Connected (private)" +msgstr "เชื่อมต่อแล้ว (ส่วนตัว)" + +#: ../js/ui/status/network.js:663 +msgid "Auto Ethernet" +msgstr "อีเทอร์เน็ตอัตโนมัติ" + +#: ../js/ui/status/network.js:721 +msgid "Auto broadband" +msgstr "บรอดแบนด์อัตโนมัติ" + +#: ../js/ui/status/network.js:724 +msgid "Auto dial-up" +msgstr "หมุนโทรศัพท์อัตโนมัติ" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476 +#, c-format +msgid "Auto %s" +msgstr "%s อัตโนมัติ" + +#: ../js/ui/status/network.js:855 +msgid "Auto bluetooth" +msgstr "บลูทูทอัตโนมัติ" + +#: ../js/ui/status/network.js:1478 +msgid "Auto wireless" +msgstr "ไร้สายอัตโนมัติ" + +#: ../js/ui/status/network.js:1575 +msgid "Enable networking" +msgstr "เปิดใช้งานเครือข่าย" + +#: ../js/ui/status/network.js:1597 +msgid "Wired" +msgstr "ใช้สาย" + +#: ../js/ui/status/network.js:1608 +msgid "Wireless" +msgstr "ไร้สาย" + +#: ../js/ui/status/network.js:1618 +msgid "Mobile broadband" +msgstr "บรอดแบนด์มือถือ" + +#: ../js/ui/status/network.js:1628 +msgid "VPN Connections" +msgstr "การเชื่อมต่อ VPN" + +#: ../js/ui/status/network.js:1635 +msgid "Network Settings" +msgstr "ตั้งค่าเครือข่าย" + +#: ../js/ui/status/network.js:1679 +msgid "Network Manager" +msgstr "โปรแกรมจัดการเครือข่าย" + +#: ../js/ui/status/network.js:1769 +msgid "Connection failed" +msgstr "เชื่อมต่อไม่สำเร็จ" + +#: ../js/ui/status/network.js:1770 +msgid "Activation of network connection failed" +msgstr "เปิดใช้ช่องเชื่อมต่อไม่สำเร็จ" + +#: ../js/ui/status/network.js:2065 +msgid "Networking is disabled" +msgstr "การใช้เครือข่ายถูกปิด" + +#: ../js/ui/status/power.js:55 +msgid "Battery" +msgstr "แบตเตอรี่" + +#: ../js/ui/status/power.js:72 +msgid "Power Settings" +msgstr "ตั้งค่าพลังงาน" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:94 +msgid "Estimating..." +msgstr "กำลังประเมิน..." + +#: ../js/ui/status/power.js:101 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "เหลืออีก %d ชั่วโมง" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:104 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "เหลืออีก %d %s %d %s" + +#: ../js/ui/status/power.js:106 +msgid "hour" +msgid_plural "hours" +msgstr[0] "ชั่วโมง" + +#: ../js/ui/status/power.js:106 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "นาที" + +#: ../js/ui/status/power.js:109 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "เหลืออีก %d นาที" + +#: ../js/ui/status/power.js:112 ../js/ui/status/power.js:186 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d%%" + +#: ../js/ui/status/power.js:195 +msgid "AC adapter" +msgstr "ที่แปลงไฟ AC" + +#: ../js/ui/status/power.js:197 +msgid "Laptop battery" +msgstr "แบตเตอรี่แล็ปท็อป" + +#: ../js/ui/status/power.js:199 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:201 +msgid "Monitor" +msgstr "จอภาพ" + +#: ../js/ui/status/power.js:203 +msgid "Mouse" +msgstr "เมาส์" + +#: ../js/ui/status/power.js:207 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:209 +msgid "Cell phone" +msgstr "โทรศัพท์มือถือ" + +#: ../js/ui/status/power.js:211 +msgid "Media player" +msgstr "เครื่องเล่นสื่อ" + +#: ../js/ui/status/power.js:213 +msgid "Tablet" +msgstr "แท็บเบล็ต" + +#: ../js/ui/status/power.js:215 +msgid "Computer" +msgstr "คอมพิวเตอร์" + +#: ../js/ui/status/power.js:217 +msgctxt "device" +msgid "Unknown" +msgstr "ไม่ทราบ" + +#. Translators: This is the label for audio volume +#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221 +msgid "Volume" +msgstr "ความดังเสียง" + +#: ../js/ui/status/volume.js:59 +msgid "Microphone" +msgstr "ไมโครโฟน" + +#: ../js/ui/unlockDialog.js:176 +msgid "Log in as another user" +msgstr "เข้าระบบในนามผู้ใช้อื่น" + +#: ../js/ui/userMenu.js:180 +msgid "Available" +msgstr "อยู่" + +#: ../js/ui/userMenu.js:183 +msgid "Busy" +msgstr "ไม่ว่าง" + +#: ../js/ui/userMenu.js:186 +msgid "Invisible" +msgstr "ซ่อนตัว" + +#: ../js/ui/userMenu.js:189 +msgid "Away" +msgstr "ไม่อยู่" + +#: ../js/ui/userMenu.js:192 +msgid "Idle" +msgstr "ไม่มีกิจกรรม" + +#: ../js/ui/userMenu.js:195 +msgid "Unavailable" +msgstr "ออฟไลน์" + +#: ../js/ui/userMenu.js:740 +msgid "Notifications" +msgstr "การแจ้งเหตุ" + +#: ../js/ui/userMenu.js:748 +msgid "System Settings" +msgstr "ตั้งค่าระบบ" + +#: ../js/ui/userMenu.js:756 +msgid "Switch User" +msgstr "สลับผู้ใช้" + +#: ../js/ui/userMenu.js:761 +msgid "Log Out" +msgstr "ออกจากระบบ" + +#: ../js/ui/userMenu.js:766 +msgid "Lock" +msgstr "ล็อค" + +#: ../js/ui/userMenu.js:781 +msgid "Install Updates & Restart" +msgstr "ติดตั้งรายการปรับรุ่น & เปิดเครื่องใหม่" + +#: ../js/ui/userMenu.js:799 +msgid "Your chat status will be set to busy" +msgstr "จะกำหนดสถานะการสนทนาของคุณเป็นไม่ว่าง" + +#: ../js/ui/userMenu.js:800 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" +"จะปิดการแจ้งเหตุ รวมถึงข้อความสนทนาด้วย " +"และได้ปรับสถานะออนไลน์ของคุณเพื่อให้คนอื่นทราบว่าคุณอาจไม่เห็นข้อความจากพวกเขาแล้ว" + +#: ../js/ui/viewSelector.js:85 +msgid "Windows" +msgstr "หน้าต่าง" + +#: ../js/ui/viewSelector.js:89 +msgid "Applications" +msgstr "โปรแกรม" + +#: ../js/ui/viewSelector.js:93 +msgid "Search" +msgstr "ค้นหา" + +#: ../js/ui/wanda.js:117 +#, c-format +msgid "" +"Sorry, no wisdom for you today:\n" +"%s" +msgstr "" +"เสียใจด้วย วันนี้ไม่มีคำคมสำหรับคุณ:\n" +"%s" + +#: ../js/ui/wanda.js:121 +#, c-format +msgid "%s the Oracle says" +msgstr "หมอดู %s กล่าว" + +#: ../js/ui/wanda.js:162 +msgid "Your favorite Easter Egg" +msgstr "ไข่อีสเตอร์สุดโปรดของคุณ" + +#: ../js/ui/windowAttentionHandler.js:19 +#, c-format +msgid "'%s' is ready" +msgstr "'%s' พร้อมแล้ว" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "ปฏิทิน Evolution" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1089 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "ช่องเสียงออก %u ช่อง" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1099 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "ช่องเสียงเข้า %u ช่อง" + +#: ../src/gvc/gvc-mixer-control.c:1397 +msgid "System Sounds" +msgstr "เสียงของระบบ" + +#: ../src/main.c:330 +msgid "Print version" +msgstr "แสดงเลขรุ่น" + +#: ../src/main.c:336 +msgid "Mode used by GDM for login screen" +msgstr "โหมดสำหรับให้ GDM เรียกใช้ในหน้าจอเข้าระบบ" + +#: ../src/main.c:342 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "ใช้โหมดเฉพาะ เช่น \"gdm\" สำหรับหน้าจอเข้าระบบ" + +#: ../src/main.c:348 +msgid "List possible modes" +msgstr "แสดงโหมดทั้งหมดที่เป็นไปได้" + +#: ../src/shell-app.c:621 +#, c-format +msgid "Failed to launch '%s'" +msgstr "เรียก '%s' ไม่สำเร็จ" + +#: ../src/shell-keyring-prompt.c:708 +msgid "Passwords do not match." +msgstr "รหัสผ่านไม่ตรงกัน" + +#: ../src/shell-keyring-prompt.c:716 +msgid "Password cannot be blank" +msgstr "รหัสผ่านว่างเปล่าไม่ได้" + +#: ../src/shell-mobile-providers.c:80 +msgid "United Kingdom" +msgstr "สหราชอาณาจักร" + +#: ../src/shell-mobile-providers.c:526 +msgid "Default" +msgstr "ปริยาย" + +#: ../src/shell-polkit-authentication-agent.c:343 +msgid "Authentication dialog was dismissed by the user" +msgstr "กล่องโต้ตอบยืนยันตัวบุคคลถูกผู้ใช้ปิดทิ้ง" + +#~ msgid "Switch Session" +#~ msgstr "สลับวาระ" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "เลิกเมานท์ '%s' ไม่สำเร็จ" + +#~ msgid "Retry" +#~ msgstr "ลองใหม่" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ที่หลักๆ และอุปกรณ์" + +#~ msgid "Home" +#~ msgstr "บ้าน" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should not be loaded." +#~ msgstr "" +#~ "ส่วนขยายต่างๆ ของเชลล์ GNOME จะมี uuid ประจำตัว " +#~ "ค่านี้จะเก็บรายชื่อของส่วนขยายที่จะไม่เรียกใช้" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display date in " +#~ "the clock, in addition to time." +#~ msgstr "" +#~ "ถ้าเลือก และรูปแบบเวลาเป็น \"12-hour\" หรือ \"24-hour\" " +#~ "ก็จะแสดงวันที่ในนาฬิกาควบคู่กับเวลาด้วย" + +#~ msgid "Show date in clock" +#~ msgstr "แสดงวันที่ในนาฬิกา" + +#~ msgid "Show time with seconds" +#~ msgstr "แสดงเวลาพร้อมวินาที" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %d %b, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %d %b, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %d %b, %l:%M:%S %p" + +#~ msgid "%a %b %e, %l:%M %p" +#~ msgstr "%a %d %b, %l:%M %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "%a %l:%M %p" +#~ msgstr "%a %l:%M %p" + +#~ msgid "RECENT ITEMS" +#~ msgstr "รายการล่าสุด" + +#~ msgid "Connect to..." +#~ msgstr "เชื่อมต่อไปยัง..." + +#~ msgid "Power Off..." +#~ msgstr "ปิดเครื่อง..." + +#~ msgid "Lock Screen" +#~ msgstr "ล็อคหน้าจอ" + +#~ msgid "Log Out..." +#~ msgstr "ออกจากระบบ..." + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "คุณเชื่อมต่อกับเครือข่ายไร้สาย '%s' แล้ว" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "คุณเชื่อมต่อกับเครือข่ายใช้สาย '%s' แล้ว" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "คุณเชื่อมต่อกับเครือข่าย VPN '%s' แล้ว" + +#~ msgid "%s is online." +#~ msgstr "%s ออนไลน์" + +#~ msgid "%s is away." +#~ msgstr "%s ไม่อยู่" + +#~ msgid "%s is busy." +#~ msgstr "%s ไม่ว่าง" + +#~ msgid "%s has finished starting" +#~ msgstr "%s เปิดเสร็จแล้ว" + +#~ msgid "Less than a minute ago" +#~ msgstr "ไม่ถึงหนึ่งนาทีก่อน" + +#~ msgid "%d minute ago" +#~ msgid_plural "%d minutes ago" +#~ msgstr[0] "%d นาทีก่อน" + +#~ msgid "%d hour ago" +#~ msgid_plural "%d hours ago" +#~ msgstr[0] "%d ชั่วโมงก่อน" + +#~ msgid "%d day ago" +#~ msgid_plural "%d days ago" +#~ msgstr[0] "%d วันก่อน" + +#~ msgid "%d week ago" +#~ msgid_plural "%d weeks ago" +#~ msgstr[0] "%d สัปดาห์ก่อน" + +#~ msgid "Home Folder" +#~ msgstr "โฟลเดอร์บ้าน" + +#~ msgid "Customize the panel clock" +#~ msgstr "ปรับแต่งนาฬิกาบนพาเนล" + +#~ msgid "Custom format of the clock" +#~ msgstr "รูปแบบนาฬิกากำหนดเอง" + +#~ msgid "Hour format" +#~ msgstr "รูปแบบชั่วโมง" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." +#~ msgstr "" +#~ "ถ้าเลือก และรูปแบบเวลาเป็น \"12-hour\" หรือ \"24-hour\" ก็จะแสดงวินาทีในเวลาด้วย" + +#~ msgid "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." +#~ msgstr "" +#~ "ค่านี้กำหนดรูปแบบของเวลาในแอพเพล็ตนาฬิกาเมื่อกำหนดรูปแบบเป็น \"custom\" " +#~ "คุณสามารถใช้รหัสการแปลงของ strftime() เพื่อระบุรูปแบบที่ต้องการได้ " +#~ "ดูข้อมูลเพิ่มเติมได้จากคู่มือของ strftime()" + +#~ msgid "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." +#~ msgstr "" +#~ "ค่านี้กำหนดรูปแบบชั่วโมงที่จะใช้ในแอพเพล็ตนาฬิกา ค่าที่เป็นไปได้คือ\"12-hour\", \"24-hour" +#~ "\", \"unix\" และ \"custom\" ถ้ากำหนดเป็น \"unix\" " +#~ "นาฬิกาจะแสดงเวลาเป็นวินาทีนับจาก 1970-01-01 ถ้ากำหนดเป็น \"custom\" " +#~ "นาฬิกาจะแสดงตามรูปแบบที่กำหนดใน custom_format สังเกตว่าถ้ากำหนดเป็น \"unix\" หรือ " +#~ "\"custom\" ค่า show_date และ show_seconds ก็จะไม่มีผล" + +#~ msgid "Enable lens mode" +#~ msgstr "เปิดใช้โหมดแว่นขยาย" + +#~ msgid "" +#~ "The magnified view either fills the entire screen, or occupies the top-" +#~ "half, bottom-half, left-half, or right-half of the screen." +#~ msgstr "" +#~ "ช่องแสดงภาพขยายอาจจะใหญ่เต็มจอภาพ (full-screen) หรืออาจจะกินที่แค่ครึ่งบน (top-" +#~ "half) ครึ่งล่าง (bottom-half) ครึ่งซ้าย (left-half) หรือครึ่งขวา (right-half)" + +#~ msgid "" +#~ "Whether the magnified view should be centered over the location of the " +#~ "system mouse and move with it." +#~ msgstr "กำหนดว่าจะให้ภาพขยายหน้าจอวางตำแหน่งกึ่งกลางที่เมาส์และเคลื่อนย้ายไปตามเมาส์หรือไม่" + +#~ msgid "Clock Format" +#~ msgstr "รูปแบบนาฬิกา" + +#~ msgid "Clock Preferences" +#~ msgstr "ปรับแต่งค่านาฬิกา" + +#~ msgid "Panel Display" +#~ msgstr "การแสดงบนพาเนล" + +#~ msgid "Show seco_nds" +#~ msgstr "แสดง_วินาที" + +#~ msgid "_12 hour format" +#~ msgstr "แ_บบ AM/PM" + +#~ msgid "_24 hour format" +#~ msgstr "แบบ _24 ขั่วโมง" + +#~ msgid "PREFERENCES" +#~ msgstr "ปรับแต่ง" + +#~ msgid "Drag here to add favorites" +#~ msgstr "ลากมาที่นี่เพื่อเพิ่มเป็นรายการโปรด" + +#~ msgid "Find" +#~ msgstr "หา" + +#~ msgid "Preferences" +#~ msgstr "ปรับแต่ง" + +#~ msgid "Shut Down..." +#~ msgstr "ปิดเครื่อง..." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "ไม่สามารถลบพื้นที่ทำงานแรกได้" diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..31875cb --- /dev/null +++ b/po/tr.po @@ -0,0 +1,2568 @@ +# Turkish translation of gnome-shell +# Copyright (C) 2009, 2011 the Free Software Foundation, Inc. +# This file is distributed under the same license as the gnome-shell package. +# Baris Cicek , 2009. +# ercin , 2011. +# Osman Karagöz , 2013. +# Bayram Güçlü , 2014. +# sabri ünal , 2014. +# Gökhan Gurbetoğlu , 2014. +# Muhammet Kara , 2011, 2012, 2013, 2014, 2015, 2016, 2017. +# Furkan Ahmet Kara , 2017, 2018. +# Emin Tufan Çetin , 2017-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-02-09 14:50+0000\n" +"PO-Revision-Date: 2019-02-09 23:26+0300\n" +"Last-Translator: Emin Tufan Çetin \n" +"Language-Team: Türkçe \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Gtranslator 3.30.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Sistem" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Bildirim listesini göster" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Etkin bildirime odaklan" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Genel görünümü göster" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Tüm uygulamaları göster" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Uygulama menüsünü aç" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Kabuk Uzantıları" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Kabuğu Uzantılarını Ayarla" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Kabuğu" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Pencere yönetimi ve uygulama başlatma" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Geliştirici ve deneme yapanlar için Alt-F2’den ulaşılan araçları etkinleştir" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 kutucuğu ile tümleşik hata ayıklama ve izleme uygulamalarına erişim " +"sağlar." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Etkinleştirilecek uzantıların UUID’si" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Kabuğu uzantılarında UUID adlı bir özellik bulunur; bu anahtar, " +"yüklenmesi gereken uzantıları listeler. Yüklenmesi istenen her tür uzantının " +"bu listede olması gerekir. Ayrıca bu listeyi, org.gnome.Shell üzerindeki " +"EnableExtension ve DisableExtension DBus yöntemleri ile de " +"değiştirebilirsiniz." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Kullanıcı uzantılarını devre dışı bırak" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Kullanıcının etkinleştirdiği tüm uzantıları “enabled-extension” ayarına etki " +"etmeden devre dışı bırak." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Uzantının sürüm uyumu doğrulamasını devre dışı bırak" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Kabuğu yalnızca şu andaki çalışan sürümü desteklediklerini ileri süren " +"uzantıları yükleyecektir. Bu seçeneği etkinleştirmek bu denetimi devre dışı " +"bırakacak ve desteklendiği ileri sürülen sürümleri dikkate almaksızın, tüm " +"uygulamaları yüklemeye çalışacaktır." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Sık kullanılan uygulamalar için masa üstü dosyalarının ID listesi" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Bu tanımlayıcıya sahip uygulamalar sık kullanılanlar bölümünde gösterilecek." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Uygulama Seçici Görünümü" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Uygulama seçicide şu anda seçili olan görünümün dizini." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Komut kutucuğu (Alt-F2) geçmişi" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Ayna iletişim penceresinin geçmişi" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Kullanıcı menüsünde “Oturumu Kapat” menü ögesini daima göster." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Bu ayar tek kullanıcı oturum açtığında “Oturumu Kapat” menü ögesinin " +"gizlenmesini önler." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Şifreli ya da uzak dosya sistemlerini bağlamak için parolanın anımsanması" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Kabuk, şifreli bir aygıt ya da uzak dosya sistemi bağlandığında parola " +"isteyecek. Eğer parola gelecekte kullanılmak üzere kaydedilebiliyorsa, " +"“Parolayı Anımsa” onay kutusu sunulacak. Bu anahtar, onay kutusunun " +"öntanımlı durumunu belirler." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Öntanımlı Bluetooth bağdaştırıcının ayarlanmış ilişkili aygıtlara sahip " +"olması" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Kabuk, yalnızca gücü açık bir Bluetooth bağdaştırıcı varsa ya da öntanımlı " +"bağdaştırıcı ile ilişkili olarak ayarlanmış aygıtlar varsa bir Bluetooth " +"menü ögesi gösterecektir. Eğer öntanımlı bağdaştırıcıyla ilşkili aygıtların " +"olmadığı görülecek olursa bu durum sıfırlanacaktır." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "İçgözlem APIʼsını etkinleştir" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Kabuğun uygulama durumunu gözden geçirmeyi sağlayan bir D-Bus APIʼsını " +"etkinleştirir." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Uygulama menüsünü açmak için klavye kısayolu" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Uygulama menüsünü açmak için klavye kısayolu." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "“Uygulamaları Göster” görünümünü açmak için klavye kısayolu" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "" +"Etkinlikler Genel Görünümünün “Uygulamaları Göster” görünümünü açmak için " +"klavye kısayolu." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Genel görünümü açmak için klavye kısayolu" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Etkinlikler Genel Görünümünü açmak için klavye kısayolu." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Bildirim listesinin görünürlüğünü değiştirmek için klavye kısayolu" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Bildirim listesinin görünürlüğünü değiştirmek için klavye kısayolu." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Etkin bildirime odaklanmak için klavye kısayolu" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Etkin bildirime odaklanmak için klavye kısayolu." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Hata ayıklama amacıyla, çalışmakta olan tüm ara çerçeveleri duraklatan ve " +"devam ettiren tuş bağı" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Uygulama 1ʼe geç" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Uygulama 2ʼye geç" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Uygulama 3ʼe geç" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Uygulama 4ʼe geç" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Uygulama 5ʼe geç" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Uygulama 6ʼya geç" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Uygulama 7ʼye geç" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Uygulama 8ʼe geç" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Uygulama 9ʼa geç" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Hangi klavyenin kullanılacağı" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Kullanılacak klavye türü." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Geçiş menüsünü geçerli çalışma alanıyla sınırla." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Eğer bu seçenek etkinse, yalnızca geçerli çalışma alanında penceresi olan " +"uygulamalar geçiş menüsünde gösterilir. Aksi halde, tüm uygulamalar " +"görünecektir." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Uygulama simge kipi." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Pencerelerin değiştiricideki gösterim biçimini yapılandırır. Uygun " +"olasılıklar; “thumbnail-only” (pencerenin küçük bir resmini gösterir), “app-" +"icon-only” (yalnızca uygulama simgesini gösterir) ya da “both” (her ikisi) " +"değerleridir." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Eğer bu seçenek etkinse, yalnızca geçerli çalışma alanındaki pencereler " +"geçiş menüsünde gösterilir. Aksi halde, tüm pencereler görünecektir." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Yardımcı iletişim penceresini üst pencereye iliştir" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Bu anahtar, GNOME Shell çalışırken org.gnome.mutter içindeki anahtarı " +"geçersiz kılar." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Pencereler ekran kenarlarında bırakıldığında kenar döşemeyi etkinleştir" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Çalışma alanları dinamik olarak yönetilir" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Çalışma alanları yalnızca birincil ekranda" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Fare kipinde odak değişikliklerini işaretçi hareketi durana kadar beklet" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Ağ Girişi" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Bir şeyler ters gitti" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Maalesef bir sorun oluştu: bu uzantı için ayarlar görüntülenemiyor. Sorunu " +"uzantı yazarlarına bildirmenizi öneririz." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Teknik Ayrıntılar" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Hataları Kopyala" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Ana Sayfa" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Uzantı ana sayfasını ziyaret et" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Kurulu Uzantı Yok" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Uzantılar, Yazılım aracılığıyla veya extensions.gnome.org adresinden yüklenebilir." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Yazılımlara Göz Atın" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "İptal" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Sonraki" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Kilit Aç" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Giriş" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Oturum Seç" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Listede yok mu?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:880 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(örneğin, kullanıcı veya %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Kullanıcı Adı: " + +#: js/gdm/loginDialog.js:1223 +msgid "Login Window" +msgstr "Oturum Açma Penceresi" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Kimlik doğrulama hatası" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(ya da parmak izi okut)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Bilgisayarı Kapat" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "gücü kapat;bilgisayarı kapat;yeniden başlat" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Ekranı Kilitle" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "ekranı kilitle" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Oturumu Kapat" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "çıkış;oturumu kapat" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Bilgisayarı beklet" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "beklet;uyku;duraklat" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Kullanıcı Değiştir" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "kullanıcı değiştir" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Yönelimi Kilitle" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "yönelimi kilitle;ekran;döndürme kilidi;döndürme" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Komut bulunamadı" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Komut işlenemedi:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "“%s” çalıştırılması başarısız:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Şimdi" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d dakika önce" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d saat önce" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Dün" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d gün önce" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d hafta önce" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d ay önce" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d yıl önce" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Dün, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Dün, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Erişim Noktası Girişi" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Bu erişim noktası girişine yaptığınız bağlantı güvenli değil. Bu sayfaya " +"girdiğiniz parolalar veya diğer bilgiler yakındaki insanlar tarafından " +"görüntülenebilir." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Erişimi Reddet" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Erişime İzin Ver" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Sık kullanılan uygulamalar burada yer alacak" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Sık Sık" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Tümü" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Yeni Pencere" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Adanmış Ekran Kartıyla Başlat" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Sık Kullanılanlardan Çıkar" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Sık Kullanılanlara Ekle" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Ayrıntıları Göster" + +#: js/ui/appFavorites.js:139 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s sık kullanılanlarınıza eklendi." + +#: js/ui/appFavorites.js:173 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s sık kullanılanlarınızdan çıkarıldı." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Ses Aygıtı Seç" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Ses Ayarları" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Kulaklıklar" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Kulaklıklı Mikrofon" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Mikrofon" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Arka Planı Değiştir…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Görüntü Ayarları" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Ayarlar" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:38 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:67 +msgctxt "grid sunday" +msgid "S" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:69 +msgctxt "grid monday" +msgid "M" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:71 +msgctxt "grid tuesday" +msgid "T" +msgstr "S" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:73 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ç" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:75 +msgctxt "grid thursday" +msgid "T" +msgstr "P" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:77 +msgctxt "grid friday" +msgid "F" +msgstr "C" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:79 +msgctxt "grid saturday" +msgid "S" +msgstr "C" + +#. * +#. * 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:342 +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:352 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:409 +msgid "Previous month" +msgstr "Önceki ay" + +#: js/ui/calendar.js:420 +msgid "Next month" +msgstr "Gelecek ay" + +#: js/ui/calendar.js:574 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:629 +msgid "Week %V" +msgstr "%V. Hafta" + +#. 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:697 +msgctxt "event list time" +msgid "All Day" +msgstr "Tüm Gün" + +#: js/ui/calendar.js:829 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d %B" + +#: js/ui/calendar.js:833 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d %B, %Y" + +#: js/ui/calendar.js:1056 +msgid "No Notifications" +msgstr "Bildirim Yok" + +#: js/ui/calendar.js:1059 +msgid "No Events" +msgstr "Olay Yok" + +#: js/ui/calendar.js:1085 +msgid "Clear" +msgstr "Temizle" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” yanıt vermiyor." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Devam etmesi için bir süre bekleyebilir ya da uygulamayı tümüyle kapanmaya " +"zorlayabilirsiniz." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Kapanmaya Zorla" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Bekle" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Dış sürücü bağlandı" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Dış sürücü ayrıldı" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "%s ile Aç" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Parola:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Yeniden yaz:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Diğer seçenek olarak, yönlendiricinizde “WPS” düğmesini kullanarak " +"bağlayabilirsiniz." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Bağlan" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Parola: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Anahtar: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Özel anahtar parolası: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Kimlik: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Hizmet: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Kablosuz ağ için kimlik doğrulama gerekiyor" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"“%s” kablosuz ağına erişmek için parola veya şifreleme anahtarları gerekiyor." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Kablolu 802.1X kimlik doğrulaması" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Ağ adı: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL kimlik doğrulama" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "PIN kodu gerekli" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Mobil geniş bant aygıtı için PIN kodu gerekli" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mobil geniş bant ağ parolası" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "“%s”e bağlanmak için parola gerekli." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "Ağ Yöneticisi" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Kimlik Doğrulaması Gerekli" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Yönetici" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Doğrula" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Üzgünüm ama işe yaramadı. Lütfen yeniden deneyin." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s, şimdi %s olarak biliniyor" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Pencereler" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Uygulamaları Göster" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Konsol" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%e %B %Y %A" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Dünya saatlerini ekle…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Dünya Saatleri" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Hava Durumu" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Konum seç…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Yükleniyor…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Hava durumu bilgisi için çevrim içi olun" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Hava durumu bilgisi şu anda kullanılabilir değil" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s Oturumunu Kapat" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Oturumu Kapat" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s oturumu %d saniye içinde kendiliğinden kapatılacak." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "%d saniye içinde oturumunuz kendiliğinden kapatılacak." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Çıkış" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Bilgisayarı Kapat" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Güncelleştirmeleri Kur ve Kapat" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Sistem %d saniye içinde kendiliğinden kapanacak." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Beklemede olan yazılım güncelleştirmelerini kur" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Yeniden Başlat" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Kapat" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Bilgisayarı Yeniden Başlat" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Sistem %d saniye içinde kendiliğinden yeniden başlayacak." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Yeniden Başlat ve Güncelleştirmeleri Kur" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Sistem %d saniye içinde kendiliğinden yeniden başlayacak ve " +"güncelleştirmeleri kuracak." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Yeniden Başlat ve Kur" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Kur ve Kapat" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Güncelleştirmeler kurulduktan sonra kapat" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Yeniden Başlat ve Yükseltmeyi Kur" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"Bilgisayarınız yeniden başladıktan sonra %s %s kurulacak. Yükseltme kurulumu " +"uzun sürebilir: verilerinizi yedeklediğinizden ve bilgisayarınızın prize " +"takılı olduğundan emin olun." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Pil gücünde çalışıyor: Lütfen güncelleştirmeleri kurmadan önce fişi takın." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Bazı uygulamalar meşgul ya da kaydedilmemiş veriye sahip." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Diğer kullanıcılar oturum açmış." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (uzak)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (uçbirim)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Kur" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "extensions.gnome.org üstünden “%s” uzantısı indirilip kurulsun mu?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s, kısayolları baskılamak istiyor" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Uygulama, kısayolları baskılamak istiyor" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "%s kısayoluyla, kısayolları geri yükleyebilirsiniz." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Reddet" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "İzin ver" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Yavaş Tuşlar Açık" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Yavaş Tuşlar Kapalı" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Shift tuşuna 8 saniye boyunca bastınız. Bu, klavyenizin çalışma yolunu " +"etkileyen Yavaş Tuşlar özelliğinin kısayoludur." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Yapışkan Tuşlar Açık" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Yapışkan Tuşlar Kapalı" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Shift tuşuna art arda 5 kez bastınız. Bu, klavyenizin çalışma yolunu " +"etkileyen Yapışkan Tuşlar özelliğinin kısayoludur." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"İki tuşa aynı anda veya Shift tuşuna art arda 5 kez bastınız. Bu, " +"klavyenizin çalışma yolunu etkileyen Yapışkan Tuşlar özelliğini kapatır." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Açık Bırak" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "Aç" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Kapat" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Kapalı Bırak" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Bölge ve Dil Ayarları" + +#: js/ui/lookingGlass.js:614 +msgid "No extensions installed" +msgstr "Herhangi bir uzantı kurulu değil" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:668 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s, herhangi bir hata vermedi." + +#: js/ui/lookingGlass.js:674 +msgid "Hide Errors" +msgstr "Hataları Gizle" + +#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 +msgid "Show Errors" +msgstr "Hataları Göster" + +#: js/ui/lookingGlass.js:687 +msgid "Enabled" +msgstr "Etkin" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Devre dışı" + +#: js/ui/lookingGlass.js:692 +msgid "Error" +msgstr "Hata" + +#: js/ui/lookingGlass.js:694 +msgid "Out of date" +msgstr "Güncel değil" + +#: js/ui/lookingGlass.js:696 +msgid "Downloading" +msgstr "İndiriliyor" + +#: js/ui/lookingGlass.js:720 +msgid "View Source" +msgstr "Kaynağı Görüntüle" + +#: js/ui/lookingGlass.js:729 +msgid "Web Page" +msgstr "Web Sayfası" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Sistem Bilgisi" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Bilinmeyen sanatçı" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Bilinmeyen başlık" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Ses" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Geri Al" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Genel Görünüm" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Aramak için yaz…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Yeni kısayol…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Uygulama tanımlı" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Ekranda yardımı göster" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Monitör değiştir" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Tuş vuruşu ata" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Bitti" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Düzenle…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Yok" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Yapılandırmak için bir düğmeye bas" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Çıkmak için Esc’ye bas" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Çıkmak için herhangi bir tuşa bas" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Kapat" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:466 +msgid "Activities" +msgstr "Etkinlikler" + +#: js/ui/panel.js:741 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Sistem" + +#: js/ui/panel.js:862 +msgid "Top Bar" +msgstr "Tepe Çubuğu" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Komut Gir" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Kapat" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Wayland’de yeniden başlatma kullanılabilir değil" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Yeniden başlatılıyor…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%d %B %A" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d yeni ileti" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d yeni bildirim" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:285 +msgid "Lock" +msgstr "Kilitle" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME’un ekranı kilitlemesi gerekiyor" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Kilitlenemedi" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Kilitleme bir uygulama tarafından engellendi" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Aranıyor…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Sonuç yok." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d tane daha" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Kopyala" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Yapıştır" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Metni Göster" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Metni Gizle" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Parola" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Parolayı Anımsa" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Erişilebilirlik" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Yakınlaştırma" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Ekran Okuyucu" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Ekran Klavyesi" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Görsel Uyarılar" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Yapışkan Tuşlar" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Yavaş Tuşlar" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Zıplayan Tuşlar" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Fare Tuşları" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Yüksek Karşıtlık" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Büyük Yazı" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Bluetooth Ayarları" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d Aygıt Bağlandı" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Kapalı" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Açık" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Parlaklık" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Klavye" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Klavye Düzenini Göster" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Konum Etkinleştirildi" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Devre Dışı Bırak" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Gizlilik Ayarları" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Konum Kullanımda" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Konum Devre Dışı" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Etkinleştir" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "%s uygulaması konumunuza erişebilsin mi?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Konum erişimi, gizlilik ayarlarından her zaman değiştirilebilir." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s Kapalı" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s Bağlandı" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s Yönetilmiyor" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s Bağlantısı Kesiliyor" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s Bağlanıyor" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s Kimlik Doğrulaması Gerektiriyor" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s İçin Ürün Bilgisi Eksik" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s Kullanılamaz" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s Bağlantısı Başarısız Oldu" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Kablolu Ağ Ayarları" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Mobil Geniş Bant Ayarları" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s Donanımı Devre Dışı" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s Devre Dışı" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "İnternet’e Bağlan" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Uçak Kipi Açık" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Uçak kipi açıldığında kablosuz ağ devre dışı kalır." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Uçak Kipini Kapat" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Kablosuz Ağ Kapalı" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Bir ağa bağlanmak için kablosuz ağın açık olması gerekir." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Kablosuz Ağı Aç" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Kablosuz Ağlar" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Ağ seç" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Ağ Yok" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Kapatmak için donanım anahtarını kullan" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Ağ Seç" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Kablosuz Ağ Ayarları" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s Erişim Noktası Etkin" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s Bağlı Değil" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "bağlanıyor…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "kimlik doğrulaması gerekli" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "bağlantı başarısız" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPN Ayarları" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN Kapalı" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Ağ Ayarları" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s Kablolu Bağlantı" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s Kablosuz Ağ Bağlantısı" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s Modem Bağlantısı" + +#: js/ui/status/network.js:1702 +msgid "Connection failed" +msgstr "Bağlantı başarısız oldu" + +#: js/ui/status/network.js:1703 +msgid "Activation of network connection failed" +msgstr "Ağ bağlantısının etkinleştirilmesi başarısız oldu" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Gece Işığı Devre Dışı" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Gece Işığı Açık" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Sürdür" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Yarına Dek Devre Dışı Bırak" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Güç Ayarları" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Tümüyle Dolu" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Şarj Olmuyor" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Öngörülüyor…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d Kaldı (%% %d)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Tümüyle Dolmasına %d.%02d Kaldı (%% %d)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Ekran Paylaşılıyor" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Kapat" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Uçak Kipi Açık" + +#: js/ui/status/system.js:218 +msgid "Switch User" +msgstr "Kullanıcı Değiştir" + +#: js/ui/status/system.js:230 +msgid "Log Out" +msgstr "Oturumu Kapat" + +#: js/ui/status/system.js:242 +msgid "Account Settings" +msgstr "Hesap Ayarları" + +#: js/ui/status/system.js:270 +msgid "Orientation Lock" +msgstr "Yönelim Kilidi" + +#: js/ui/status/system.js:296 +msgid "Suspend" +msgstr "Beklet" + +#: js/ui/status/system.js:306 +msgid "Power Off" +msgstr "Kapat" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Bilinmeyen Thunderbolt aygıtı" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Siz uzaktayken yeni aygıt saptandı. Kullanmaya başlamadan önce aygıtın " +"bağlantısını kesin ve yeniden bağlayın." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Yetkisiz Thunderbolt aygıtı" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "" +"Yeni aygıt saptandı ve bir yönetici tarafından yetkilendirilmesi gerekiyor." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt yetkilendirme hatası" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Thunderbolt aygıtı yetkilendirilemedi: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Ses değişti" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Yinele" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Birleştir" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Yalnızca Dış" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Yalnızca İç" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Başka kullanıcı olarak oturum aç" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Kilit Açma Penceresi" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Uygulamalar" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Ara" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” hazır" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Bu görüntü ayarlarını saklamak istiyor musunuz?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Ayarları Eski Haline Getir" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Değişiklikleri Sakla" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Ayarlardaki değişiklikler %d saniye içinde eski haline döndürülecek" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Simge durumuna küçült" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Önceki Boyut" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "En üst düzeye çıkar" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Taşı" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Yeniden Boyutlandır" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Başlık Çubuğunu Ekranda Taşı" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Her Zaman Üstte" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Her Zaman Görünür Çalışma Alanında" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Soldaki Çalışma Alanına Taşı" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Sağdaki Çalışma Alanına Taşı" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Üstteki Çalışma Alanına Taşı" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Alttaki Çalışma Alanına Taşı" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Üstteki Monitöre Taşı" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Alttaki Monitöre Taşı" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Soldaki Monitöre Taşı" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Sağdaki Monitöre Taşı" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution Takvim" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Sürümü yazdır" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Oturum açma ekranında GDM tarafından kullanılan kip" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Oturum açma ekranı için -“gdm” gibi- özel bir kip kullan" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Olası kipleri listele" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Bilinmeyen" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "“%s” başlatılamadı" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Parolalar eşleşmiyor." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Parola boş bırakılamaz" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Kimlik doğrulama penceresi kullanıcı tarafından kapatıldı" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u Çıktı" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u Girdi" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Sistem Sesleri" + +#~ msgid "%s all day." +#~ msgstr "Gün boyu %s." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, daha sonra %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, daha sonra %s, ardından %s." + +#~ msgid "Feels like %s." +#~ msgstr "Hissedilen %s." + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "%s için tercihler iletişim penceresi yüklenirken hata oluştu:" + +#~| msgid "Power Off" +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Bilgisayarı kapat" + +#~| msgid "Log Out" +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Oturumu kapat" + +#~| msgid "Switch User" +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Kullanıcı değiştir" + +#~ msgid "Hide tray" +#~ msgstr "Tepsiyi gizle" + +#~ msgid "Status Icons" +#~ msgstr "Durum Simgeleri" + +#~ msgid "Events" +#~ msgstr "Olaylar" + +#~ msgid "Notifications" +#~ msgstr "Bildirimler" + +#~ msgid "Clear section" +#~ msgstr "Bölümü temizle" + +#~ msgid "Media" +#~ msgstr "Ortam" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Kabuğu Eklenti Tercihleri" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Web Kimlik Doğrulama Yönlendirmesi" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Not In Use" +#~ msgstr "Kullanımda Değil" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Hafta tarihini takvimde göster" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Doğru ise ISO hafta tarihini takvimde göster." + +#~ msgid "Use as Internet connection" +#~ msgstr "İnternet bağlantısı olarak kullan" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Kabuğu (wayland bestecisi)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d Bağlı Cihaz" + +#~ msgid "Authentication required" +#~ msgstr "Kimlik doğrulama gerekir" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Pil" + +#~ msgid "Airplane Mode" +#~ msgstr "Uçak Kipi" + +#~| msgid "Show the message tray" +#~ msgid "Show the message list" +#~ msgstr "İleti listesini göster" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Davet" + +#~ msgid "Call" +#~ msgstr "Çağrı" + +#~ msgid "File Transfer" +#~ msgstr "Dosya Aktarımı" + +#~ msgid "Chat" +#~ msgstr "Sohbet" + +#~ msgid "Invitation to %s" +#~ msgstr "%s'e Davet" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s, sizi %s'e katılmanız için davet ediyor" + +#~ msgid "Decline" +#~ msgstr "Reddet" + +#~ msgid "Accept" +#~ msgstr "Kabul Et" + +#~ msgid "Video call from %s" +#~ msgstr "%s'den görüntülü arama" + +#~ msgid "Call from %s" +#~ msgstr "%s'den çağrı" + +#~ msgid "Answer" +#~ msgstr "Cevapla" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s, size %s dosyasını gönderiyor" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s, ne zaman çevrimiçi olduğunuzu görmek için izin istiyor" + +#~ msgid "Authentication failed" +#~ msgstr "Kimlik doğrulama başarısız" + +#~ msgid "Encryption error" +#~ msgstr "Şifreleme hatası" + +#~ msgid "Certificate not provided" +#~ msgstr "Sertifika sağlanmamış" + +#~ msgid "Certificate untrusted" +#~ msgstr "Sertifika güvenilmez" + +#~ msgid "Certificate expired" +#~ msgstr "Sertifikanın süresi dolmuş" + +#~ msgid "Certificate not activated" +#~ msgstr "Sertifika etkinleştirilmemiş" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Sertifikanın makine adı uyuşmuyor" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Sertifikanın parmak izi uyuşmuyor" + +#~ msgid "Certificate self-signed" +#~ msgstr "Sertifika kendinden-imzalı" + +#~ msgid "Status is set to offline" +#~ msgstr "Durum çevrimdışına ayarlı" + +#~ msgid "Certificate is invalid" +#~ msgstr "Sertifika geçersiz" + +#~ msgid "Connection has been refused" +#~ msgstr "Bağlantı reddedildi" + +#~ msgid "Connection can't be established" +#~ msgstr "Bağlantı kurulamıyor" + +#~ msgid "Connection has been lost" +#~ msgstr "Bağlantı koptu" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Bu hesap zaten sunucuya bağlı" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Bağlantı, aynı kaynağı kullanan yeni bir bağlantı ile değiştirildi" + +#~ msgid "The account already exists on the server" +#~ msgstr "Sunucuda böyle bir hesap zaten var" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Sunucu, şu anda bağlantıyı işleyemeyecek kadar meşgul" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Sertifika hükümsüz kılınmış" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Sertifika güvensiz bir şifreleme algoritması kullanıyor ya da " +#~ "kriptografik olarak zayıf" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Sunucu sertifikasının uzunluğu ya da sunucu sertifikası zincirinin " +#~ "derinliği, şifreleme kütüphanesi tarafından koyulan sınırları aşıyor" + +#~ msgid "Internal error" +#~ msgstr "İç hata" + +#~ msgid "Unable to connect to %s" +#~ msgstr "%s bağlantısı sağlanamadı" + +#~ msgid "View account" +#~ msgstr "Hesabı göster" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Pa" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Pz" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "S" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Ç" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Pe" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "C" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Ct" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Planınız Boş" + +#~ msgid "Today" +#~ msgstr "Bugün" + +#~ msgid "Tomorrow" +#~ msgstr "Yarın" + +#~ msgid "This week" +#~ msgstr "Bu hafta" + +#~ msgid "Next week" +#~ msgstr "Gelecek hafta" + +#~ msgid "Removable Devices" +#~ msgstr "Çıkarılabilir Aygıtlar" + +#~ msgid "Eject" +#~ msgstr "Çıkart" + +#~ msgid "Unmute" +#~ msgstr "Sesi Aç" + +#~ msgid "Mute" +#~ msgstr "Sesi Kapat" + +#~ msgid "Open Calendar" +#~ msgstr "Takvimi Aç" + +#~ msgid "Open" +#~ msgstr "Aç" + +#~ msgid "Remove" +#~ msgstr "Sil" + +#~ msgid "Clear Messages" +#~ msgstr "Mesajları Temizle" + +#~ msgid "Notification Settings" +#~ msgstr "Bildirim Ayarları" + +#~ msgid "Tray Menu" +#~ msgstr "Tepsi Menüsü" + +#~ msgid "No Messages" +#~ msgstr "Mesaj Yok" + +#~ msgid "Message Tray" +#~ msgstr "Mesaj Tepsisi" diff --git a/po/ug.po b/po/ug.po new file mode 100644 index 0000000..2964054 --- /dev/null +++ b/po/ug.po @@ -0,0 +1,2208 @@ +# Uyghur translation for gnome-shell. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Gheyret Kenji,2010. +# Sahran , 2010. +# Zeper , 2010. +# Bakhtiyar, 2011 +# Oghlan Temkin ,2011 +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-03-04 08:38+0000\n" +"PO-Revision-Date: 2013-03-07 21:01+0900\n" +"Last-Translator: Gheyret Kenji \n" +"Language-Team: Uyghur Computer Science Association \n" +"Language: ug\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:1 +msgid "Screenshots" +msgstr "ئېكران كۆرۈنۈشى" + +#: ../data/50-gnome-shell-screenshot.xml.in.h:2 +msgid "Record a screencast" +msgstr "ئېكراننى سۈرەتكە ئېلىش" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "سىستېما" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +msgid "Show the message tray" +msgstr "ئۇچۇر قوندىقىنى كۆرسىتىش" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "ئاكتىپ ئۇقتۇرۇشقا فوكۇسلىنىش" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show all applications" +msgstr "بارلىق پروگراممىنى كۆرسىتىش" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Open the application menu" +msgstr "پروگرامما تىزىملىكىنى كۆرسىتىش" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "گىنوم Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "كۆزنەك باشقۇرۇش ۋە پروگرامما ئىجرا قىلىش پروگراممىسى" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +#: ../js/extensionPrefs/main.js:153 +msgid "GNOME Shell Extension Preferences" +msgstr "گىنوم Shell كېڭەيتمىسىنىڭ مايىللىقى" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "گىنوم Shell كېڭەيتمىسىنى سەپلەش" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق كىرىشىگە قۇلايلىق" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "ئىچكى سازلاش ۋە كۆزىتىش قورالىنى زىيارەت قىلىشتا Alt-F2 ئىشلىتىشكە ئىجازەت." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "Uuids of extensions to enable" +msgstr "ئىناۋەتلىك قىلىدىغان كېڭەيتىلمىنىڭ Uuids سى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a uuid property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension DBus methods on org.gnome.Shell." +msgstr "گىنوم Shell كېڭەيتىلمىسىنىڭ uuid خاسلىقى بولىدۇ. بۇ ئاچقۇچتا ئىناۋەتلىك قىلىنىدىغان كېڭەيتىلمىلەرنىڭ تىزىمى بار. ئوقۇلىدىغان كېڭەيتىلمىلەر چوقۇم مۇشۇ تىزىمدا بولۇشى كېرەك. بۇ تىزىمنى org.gnome.Shell دىكى DBus نىڭ EnableExtension ۋە DisableExtension دېگەن فۇنكسىيىلىرى(methods) ئارقىلىق باشقۇرغىلى بولىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Whether to collect stats about applications usage" +msgstr "پروگراممىنىڭ ئىشلىتىلىشى ھەققىدىكى ستاتىستىكىنى توپلامدۇ يوق" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"The shell normally monitors active applications in order to present the most " +"used ones (e.g. in launchers). While this data will be kept private, you may " +"want to disable this for privacy reasons. Please note that doing so won't " +"remove already saved data." +msgstr "چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "ئامراق پروگراممىلارنىڭ ئۈستەلئۈستى ھۆججەت ID تىزىمى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "مۇناسىپ پروگرامما بەلگىسى يىغقۇچ رايونىدا كۆرسىتىلىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "List of categories that should be displayed as folders" +msgstr "قىسقۇچ سۈپىتىدە كۆرسىتىلىدىغان كاتېگورىيەلەرنىڭ تىزىمى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "" +"Each category name in this list will be represented as folder in the " +"application view, rather than being displayed inline in the main view." +msgstr "پروگرامما كۆرۈنۈشىدە ھەر بىر كاتېگورىيە ئاتى قىسقۇچ سۈپىتىدە ئىپادىلىنىدۇ، ئاساسىي كۆرۈنۈشتە كۆرسىتىلمەيدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "بۇيرۇق (Alt-F2) سۆزلەشكۈنىڭ تارىخى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 +msgid "History for the looking glass dialog" +msgstr "looking glass سۆزلەشكۈنىڭ تارىخى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "" +"Internally used to store the last IM presence explicitly set by the user. " +"The value here is from the TpConnectionPresenceType enumeration." +msgstr "ئىشلەتكۈچى تەرىپىدىن روشەن بەلگىلەنگەن ئەڭ يېڭى IM ھالىتى ساقلاش ئۈچۈن ئىچكى قىسىمدا ئىشلىتىلىدۇ. بۇ TpConnectionPresenceType نىڭ قىممىتى بولىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "" +"Internally used to store the last session presence status for the user. The " +"value here is from the GsmPresenceStatus enumeration." +msgstr "ئىشلەتكۈچىنىڭ ئەڭ يېڭى ھالىتى ساقلاش ئۈچۈن ئىچكى قىسىمدا ئىشلىتىلىدۇ. بۇ GsmPresenceStatus نىڭ قىممىتى بولىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "Always show the 'Log out' menuitem in the user menu." +msgstr "ئىشلەتكۈچى تىزىملىكىدە ھەمىشە ‹چىق› تىزىملىكىنى كۆرسىتىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menuitem in single-" +"user, single-session situations." +msgstr "مەزكۇر ئاچقۇچ يەككە ئىشلەتكۈچى، يەككە ئەڭگىمە ھالىتىدە ‹چىق› دېگەن تىزىملىكنى قاپلىۋېتىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "شىفىرلانغان ياكى يىراقتىكى ھۆججەت سىستېمىسىنى ئېگەرلەشتە ئىمنى ئەستە تۇتسۇنمۇ" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "شىفىرلانغان ياكى يىراقتىكى ھۆججەت سىستېمىسىنى ئېگەرلەيدىغان ۋاقىتتا مەزكۇر shell ئىم تەلەپ قىلىدۇ. ئەگەر ‹ئىمنى ئەستە تۇت› دېگىنى تاللانسا، كېيىنلىك ئۈچۈن ئىمنى ساقلاپ قويىدۇ. بۇ ئاچقۇچ checkbox نىڭ كۆڭۈلدىكى ھالىتىنى بەلگىلەيدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "Show the week date in the calendar" +msgstr "يىلنامىدە ھەپتىنى كۆرسەتسۇن" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "If true, display the ISO week date in the calendar." +msgstr "ئەگەر راست(true) بولسا يىلنامىدىكى ISO ھەپتە چېسلانى كۆرسىتىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "Keybinding to open the application menu" +msgstr "پروگرامما تىزىملىكىنى ئاچىدىغان كۇنۇپكا بىرىكمىسى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the application menu." +msgstr "پروگرامما تىزىملىكىنى ئاچىدىغان كۇنۇپكا بىرىكمىسى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "«پروگراممىلارنى كۆرسەت» كۆرۈنۈشىنى ئاچىدىغان كۇنۇپكا بىرىكمىسى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "پائالىيەتلەر كۆرۈنۈشىدە «پروگراممىلارنى كۆرسەت» كۆرۈنۈشىنى ئاچىدىغان كۇنۇپكا بىرىكمىسى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "Keybinding to toggle the visibility of the message tray" +msgstr "ئۇچۇر قوندىقىنى كۆرسىتىش-كۆرسەتمەسلىكنى ئالماشتۇرىدىغان كۇنۇپكا بىرىكمىسى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to toggle the visibility of the message tray." +msgstr "ئۇچۇر قوندىقىنى كۆرسىتىش-كۆرسەتمەسلىكنى ئالماشتۇرىدىغان كۇنۇپكا بىرىكمىسى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to focus the active notification" +msgstr "ئاكتىپ ئۇقتۇرۇشنى كۆرسىتىدىغان كۇنۇپكا بىرىكمىسى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +msgid "Keybinding to focus the active notification." +msgstr "ئاكتىپ ئۇقتۇرۇشنى كۆرسىتىدىغان كۇنۇپكا بىرىكمىسى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +msgid "Keybinding to toggle the screen recorder" +msgstr "ئېكراننى سۈرەتكە ئالغۇنى باشلايدىغان/توختىتىدىغان كۇنۇپكا بىرىكمىسى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Keybinding to start/stop the builtin screen recorder." +msgstr "سىڭدۈرۈۋېتىلگەن ئېكراننى سۈرەتكە ئالغۇنى باشلايدىغان/توختىتىدىغان كۇنۇپكا بىرىكمىسى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "Which keyboard to use" +msgstr "ئىشلەتمەكچى بولغان كۇنۇپكا تاختىسى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "The type of keyboard to use." +msgstr "ئىشلەتمەكچى بولغان كۇنۇپكا تاختىسى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "Framerate used for recording screencasts." +msgstr "ئېكران كۆرۈنۈشى (screencasts) خاتىرىلەشتە ئىشلىتىلىدىغان كاندۇك تېزلىكى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "" +"The framerate of the resulting screencast recordered by GNOME Shell's " +"screencast recorder in frames-per-second." +msgstr "گىنوم Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كۆرۈنۈشى كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "The gstreamer pipeline used to encode the screencast" +msgstr "ئېكران كۆرۈنۈشىنى كودلاشتا ئىشلىتىلىدىغان gstreamer ئاقما لىنىيىسى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +#, no-c-format +msgid "" +"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " +"used for gst-launch. The pipeline should have an unconnected sink pad where " +"the recorded video is recorded. It will normally have a unconnected source " +"pad; output from that pad will be written into the output file. However the " +"pipeline can also take care of its own output - this might be used to send " +"the output to an icecast server via shout2send or similar. When unset or set " +"to an empty value, the default pipeline will be used. This is currently " +"'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is " +"used as a placeholder for a guess at the optimal thread count on the system." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "File extension used for storing the screencast" +msgstr "ئېكران كۆرۈنۈشى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن ئاتى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "" +"The filename for recorded screencasts will be a unique filename based on the " +"current date, and use this extension. It should be changed when recording to " +"a different container format." +msgstr "خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا خاتىرىلەيدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "The application icon mode." +msgstr "پروگرامما سىنبەلگە ھالىتى." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "ئالماشتۇرغۇچتا پروگراممىلارنىڭ قانداق كۆرسىتىلىدىغانلىقىنى سەپلەيدۇ. قىممەتلەر: ‹thumbnail-only›(پەقەت كۆزنەكنىڭ كىچىك سۈرىتىنىلا كۆرسىتىدۇ)،‹app-icon-only›(پروگراممىنىڭ سىنبەلگىسىنىلا كۆرسىتىدۇ) ۋە ‹ئىككىلىسى›" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Attach modal dialog to the parent window" +msgstr "ئاتا كۆزنەككە modal سۆزلەشكۈنى قات" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "گىنوم Shell ئىجرا بولۇۋاتقاندا مەزكۇر ئاچقۇچ org.gnome.mutter نىڭ ئىچىدىكى ئاچقۇچنى قاپلىۋېتىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 +msgid "Arrangement of buttons on the titlebar" +msgstr "ماۋزۇ بالدىقىدىكى توپچىلارنىڭ ئورۇنلاشتۇرۇلۇشى" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 +msgid "" +"This key overrides the key in org.gnome.desktop.wm.preferences when running " +"GNOME Shell." +msgstr "گىنوم Shell ئىجرا بولۇۋاتقاندا مەزكۇر ئاچقۇچ org.gnome.desktop.wm.preferences نىڭ ئىچىدىكى ئاچقۇچنى قاپلىۋېتىدۇ." + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 +msgid "Workspaces are managed dynamically" +msgstr "خىزمەت رايونلىرى جانلىق باشقۇرۇلسۇن" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:48 +msgid "Workspaces only on primary monitor" +msgstr "ئاساسىي كۆزەتكۈچتىكى خىزمەت رايونلىرىلا" + +#: ../js/extensionPrefs/main.js:125 +#, c-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s نىڭ خاسلىق سۆزلەشكۈسىنى ئوقۇشتا خاتالىق كۆرۈلدى:" + +#: ../js/extensionPrefs/main.js:165 +msgid "Extension" +msgstr "كېڭەيتىلمە" + +#: ../js/extensionPrefs/main.js:189 +msgid "Select an extension to configure using the combobox above." +msgstr "يۇقىرىدىكى combobox دىن سەپلەيدىغان كېڭەيتىلمىنى تاللاڭ." + +#: ../js/gdm/loginDialog.js:405 +msgid "Session…" +msgstr "ئەڭگىمە…" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:629 +msgid "Not listed?" +msgstr "تىزىمدا يوقمۇ؟" + +#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137 +#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126 +#: ../js/ui/userMenu.js:934 +msgid "Cancel" +msgstr "ئەمەلدىن قالدۇر" + +#: ../js/gdm/loginDialog.js:799 +msgctxt "button" +msgid "Sign In" +msgstr "كىر" + +#: ../js/gdm/loginDialog.js:799 +msgid "Next" +msgstr "كېيىنكى" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260 +#: ../js/ui/components/networkAgent.js:278 +msgid "Username: " +msgstr "ئىشلەتكۈچى ئاتى: " + +#: ../js/gdm/loginDialog.js:1157 +msgid "Login Window" +msgstr "كىرىش كۆزنىكى" + +#. Translators: accessible name of the power menu in the login screen +#: ../js/gdm/powerMenu.js:36 +msgid "Power" +msgstr "توك مەنبە" + +#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699 +#: ../js/ui/userMenu.js:815 +msgid "Suspend" +msgstr "توڭلات" + +#: ../js/gdm/powerMenu.js:98 +msgid "Restart" +msgstr "قايتا قوزغات" + +#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697 +#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938 +msgid "Power Off" +msgstr "توكنى ئۈز" + +#: ../js/gdm/util.js:182 +msgid "Authentication error" +msgstr "كىملىك دەلىللەش خاتالىقى" + +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/util.js:299 +msgid "(or swipe finger)" +msgstr "(ياكى بارمىقىڭىزنى سىيرىڭ)" + +#: ../js/gdm/util.js:324 +#, c-format +msgid "(e.g., user or %s)" +msgstr "(مەسىلەن، ئىشلەتكۈچى ياكى %s)" + +#: ../js/misc/util.js:94 +msgid "Command not found" +msgstr "بۇيرۇق تېپىلمىدى" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:127 +msgid "Could not parse command:" +msgstr "بۇيرۇقنى تەھلىل قىلالمىدى:" + +#: ../js/misc/util.js:135 +#, c-format +msgid "Execution of '%s' failed:" +msgstr "‹%s› ئىجرا قىلىش مەغلۇپ بولدى:" + +#: ../js/ui/appDisplay.js:348 +msgid "Frequent" +msgstr "دائىم" + +#: ../js/ui/appDisplay.js:355 +msgid "All" +msgstr "ھەممىسى" + +#: ../js/ui/appDisplay.js:913 +msgid "New Window" +msgstr "يېڭى كۆزنەك" + +#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284 +msgid "Remove from Favorites" +msgstr "يىغقۇچتىن چىقىرىۋەت" + +#: ../js/ui/appDisplay.js:917 +msgid "Add to Favorites" +msgstr "يىغقۇچقا قوش" + +#: ../js/ui/appFavorites.js:87 +#, c-format +msgid "%s has been added to your favorites." +msgstr "‏%s يىغقۇچىڭىزغا قوشۇلدى." + +#: ../js/ui/appFavorites.js:121 +#, c-format +msgid "%s has been removed from your favorites." +msgstr "‏%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ." + +#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788 +msgid "Settings" +msgstr "تەڭشەكلەر" + +#: ../js/ui/backgroundMenu.js:21 +msgid "Change Background…" +msgstr "تەگلىكنى ئۆزگەرتىش…" + +#. 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:62 +msgctxt "event list time" +msgid "All Day" +msgstr "كۈن بويى" + +#. Translators: Shown in calendar event list, if 24h format, +#. \u2236 is a ratio character, similar to : +#: ../js/ui/calendar.js:68 +msgctxt "event list time" +msgid "%H\\u2236%M" +msgstr "%H\\u2236%M" + +#. Transators: Shown in calendar event list, if 12h format, +#. \u2236 is a ratio character, similar to : and \u2009 is +#. a thin space +#: ../js/ui/calendar.js:77 +msgctxt "event list time" +msgid "%l\\u2236%M\\u2009%p" +msgstr "%l\\u2236%M\\u2009%p" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:108 +msgctxt "grid sunday" +msgid "S" +msgstr "ي" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:110 +msgctxt "grid monday" +msgid "M" +msgstr "د" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:112 +msgctxt "grid tuesday" +msgid "T" +msgstr "س" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:114 +msgctxt "grid wednesday" +msgid "W" +msgstr "چ" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:116 +msgctxt "grid thursday" +msgid "T" +msgstr "پ" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:118 +msgctxt "grid friday" +msgid "F" +msgstr "ج" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:120 +msgctxt "grid saturday" +msgid "S" +msgstr "ش" + +#. Translators: Event list abbreviation for Sunday. +#. * +#. * NOTE: These list abbreviations are normally not shown together +#. * so they need to be unique (e.g. Tuesday and Thursday cannot +#. * both be 'T'). +#. +#: ../js/ui/calendar.js:133 +msgctxt "list sunday" +msgid "Su" +msgstr "ي" + +#. Translators: Event list abbreviation for Monday +#: ../js/ui/calendar.js:135 +msgctxt "list monday" +msgid "M" +msgstr "د" + +#. Translators: Event list abbreviation for Tuesday +#: ../js/ui/calendar.js:137 +msgctxt "list tuesday" +msgid "T" +msgstr "س" + +#. Translators: Event list abbreviation for Wednesday +#: ../js/ui/calendar.js:139 +msgctxt "list wednesday" +msgid "W" +msgstr "چ" + +#. Translators: Event list abbreviation for Thursday +#: ../js/ui/calendar.js:141 +msgctxt "list thursday" +msgid "Th" +msgstr "پ" + +#. Translators: Event list abbreviation for Friday +#: ../js/ui/calendar.js:143 +msgctxt "list friday" +msgid "F" +msgstr "ج" + +#. Translators: Event list abbreviation for Saturday +#: ../js/ui/calendar.js:145 +msgctxt "list saturday" +msgid "S" +msgstr "ش" + +#. Translators: Text to show if there are no events +#: ../js/ui/calendar.js:692 +msgid "Nothing Scheduled" +msgstr "ھېچنېمە پىلانلانمىدى" + +#. Translators: Shown on calendar heading when selected day occurs on current year +#: ../js/ui/calendar.js:708 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A، %B %d" + +#. Translators: Shown on calendar heading when selected day occurs on different year +#: ../js/ui/calendar.js:711 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A، %B %d، %Y" + +#: ../js/ui/calendar.js:721 +msgid "Today" +msgstr "بۈگۈن" + +#: ../js/ui/calendar.js:725 +msgid "Tomorrow" +msgstr "ئەتە" + +#: ../js/ui/calendar.js:736 +msgid "This week" +msgstr "بۇ ھەپتە" + +#: ../js/ui/calendar.js:744 +msgid "Next week" +msgstr "كېيىنكى ھەپتە" + +#: ../js/ui/components/automountManager.js:90 +msgid "External drive connected" +msgstr "سىرتقى دىسكا ئۇلاندى." + +#: ../js/ui/components/automountManager.js:101 +msgid "External drive disconnected" +msgstr "سىرتقى دىسكا ئۈزۈلدى." + +#: ../js/ui/components/autorunManager.js:294 +msgid "Removable Devices" +msgstr "چىقىرىۋېتىشكە بولىدىغان ئۈسكۈنىلەر" + +#: ../js/ui/components/autorunManager.js:593 +#, c-format +msgid "Open with %s" +msgstr "%s دا ئاچ" + +#: ../js/ui/components/autorunManager.js:619 +msgid "Eject" +msgstr "چىقار" + +#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268 +msgid "Password:" +msgstr "ئىم:" + +#: ../js/ui/components/keyring.js:101 +msgid "Type again:" +msgstr "قايتا كىرگۈزۈڭ:" + +#: ../js/ui/components/networkAgent.js:132 +msgid "Connect" +msgstr "باغلان" + +#. Cisco LEAP +#: ../js/ui/components/networkAgent.js:223 +#: ../js/ui/components/networkAgent.js:235 +#: ../js/ui/components/networkAgent.js:262 +#: ../js/ui/components/networkAgent.js:282 +#: ../js/ui/components/networkAgent.js:292 +msgid "Password: " +msgstr "ئىم: " + +#. static WEP +#: ../js/ui/components/networkAgent.js:228 +msgid "Key: " +msgstr "شىفىرلىق ئاچقۇچ: " + +#: ../js/ui/components/networkAgent.js:266 +msgid "Identity: " +msgstr "كىملىك: " + +#: ../js/ui/components/networkAgent.js:268 +msgid "Private key password: " +msgstr "شەخسىي ئاچقۇچ ئىمى: " + +#: ../js/ui/components/networkAgent.js:280 +msgid "Service: " +msgstr "مۇلازىمەت: " + +#: ../js/ui/components/networkAgent.js:309 +msgid "Authentication required by wireless network" +msgstr "سىمسىز تور كىملىك تەكشۈرۈشكە ئېھتىياجلىق" + +#: ../js/ui/components/networkAgent.js:310 +#, c-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"'%s'." +msgstr "سىمسىز تور ‹%s› نى زىيارەت قىلماق ئۈچۈن ئىم ياكى شىفىرلاش ئاچقۇچلىرى كېرەكلىك." + +#: ../js/ui/components/networkAgent.js:314 +msgid "Wired 802.1X authentication" +msgstr "سىملىق 802.1X گۇۋاھنامە" + +#: ../js/ui/components/networkAgent.js:316 +msgid "Network name: " +msgstr "تور ئاتى: " + +#: ../js/ui/components/networkAgent.js:321 +msgid "DSL authentication" +msgstr "DSL دەلىللەش" + +#: ../js/ui/components/networkAgent.js:328 +msgid "PIN code required" +msgstr "PIN كودى ئېھتىياجلىق" + +#: ../js/ui/components/networkAgent.js:329 +msgid "PIN code is needed for the mobile broadband device" +msgstr "كۆچمە كەڭ بەلۋاغ ئۈسكۈنىسى ئۈچۈن PIN كودى كېرەك" + +#: ../js/ui/components/networkAgent.js:330 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:336 +msgid "Mobile broadband network password" +msgstr "كۆچمە كەڭ بەلۋاغ تور ئىمى" + +#: ../js/ui/components/networkAgent.js:337 +#, c-format +msgid "A password is required to connect to '%s'." +msgstr "‹%s› كە باغلىنىش ئۈچۈن بىر ئىمغا ئېھتىياجلىق." + +#: ../js/ui/components/polkitAgent.js:55 +msgid "Authentication Required" +msgstr "كىملىك دەلىللەش زۆرۈر" + +#: ../js/ui/components/polkitAgent.js:93 +msgid "Administrator" +msgstr "باشقۇرغۇچى" + +#: ../js/ui/components/polkitAgent.js:165 +msgid "Authenticate" +msgstr "كىملىك دەلىللەش" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "كەچۈرۈڭ، خىزمەت قىلالمايدۇ. قايتا سىناڭ." + +#. Translators: this is a filename used for screencast recording +#: ../js/ui/components/recorder.js:48 +#, no-c-format +msgid "Screencast from %d %t" +msgstr "بۇ %d %t نىڭ ئېكران كۆرۈنۈشى" + +#. FIXME: We don't have a 'chat room' icon (bgo #653737) use +#. system-users for now as Empathy does. +#: ../js/ui/components/telepathyClient.js:238 +msgid "Invitation" +msgstr "تەكلىپ" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:298 +msgid "Call" +msgstr "چاقىر" + +#. We got the TpContact +#: ../js/ui/components/telepathyClient.js:314 +msgid "File Transfer" +msgstr "ھۆججەت يوللاش" + +#: ../js/ui/components/telepathyClient.js:418 +msgid "Chat" +msgstr "سۆھبەت" + +#: ../js/ui/components/telepathyClient.js:480 +msgid "Unmute" +msgstr "ئاۋازلىق" + +#: ../js/ui/components/telepathyClient.js:480 +msgid "Mute" +msgstr "ئۈنسىز" + +#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30" +#: ../js/ui/components/telepathyClient.js:942 +#, no-c-format +msgid "Yesterday, %H:%M" +msgstr "تۈنۈگۈن، %H:%M" + +#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30 +#: ../js/ui/components/telepathyClient.js:948 +#, no-c-format +msgid "%A, %H:%M" +msgstr "%A، %H:%M" + +#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30" +#: ../js/ui/components/telepathyClient.js:953 +#, no-c-format +msgid "%B %d, %H:%M" +msgstr "%B %d، %H:%M" + +#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30" +#: ../js/ui/components/telepathyClient.js:957 +#, no-c-format +msgid "%B %d %Y, %H:%M " +msgstr "%B %d %Y، %H:%M " + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/components/telepathyClient.js:985 +#, c-format +msgid "%s is now known as %s" +msgstr "%s نى ھازىر %s دەپ قارايدۇ" + +#. translators: argument is a room name like +#. * room@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1088 +#, c-format +msgid "Invitation to %s" +msgstr "%s غا تەكلىپ" + +#. translators: first argument is the name of a contact and the second +#. * one the name of a room. "Alice is inviting you to join room@jabber.org +#. * for example. +#: ../js/ui/components/telepathyClient.js:1096 +#, c-format +msgid "%s is inviting you to join %s" +msgstr "%s سىزنى %s غا قاتنىشىشنى تەكلىپ قىلىۋاتىدۇ" + +#: ../js/ui/components/telepathyClient.js:1098 +#: ../js/ui/components/telepathyClient.js:1137 +#: ../js/ui/components/telepathyClient.js:1177 +#: ../js/ui/components/telepathyClient.js:1240 +msgid "Decline" +msgstr "قوشۇلما" + +#: ../js/ui/components/telepathyClient.js:1099 +#: ../js/ui/components/telepathyClient.js:1178 +#: ../js/ui/components/telepathyClient.js:1241 +msgid "Accept" +msgstr "قوشۇل" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1129 +#, c-format +msgid "Video call from %s" +msgstr "%s دىن كەلگەن سىن چاقىرىقى" + +#. translators: argument is a contact name like Alice for example. +#: ../js/ui/components/telepathyClient.js:1132 +#, c-format +msgid "Call from %s" +msgstr "«%s» دىن كەلگەن تېلېفون" + +#. translators: this is a button label (verb), not a noun +#: ../js/ui/components/telepathyClient.js:1139 +msgid "Answer" +msgstr "جاۋاب" + +#. To translators: The first parameter is +#. * the contact's alias and the second one is the +#. * file name. The string will be something +#. * like: "Alice is sending you test.ogg" +#. +#: ../js/ui/components/telepathyClient.js:1171 +#, c-format +msgid "%s is sending you %s" +msgstr "%s سىزگە %s نى ئەۋەتتى" + +#. To translators: The parameter is the contact's alias +#: ../js/ui/components/telepathyClient.js:1206 +#, c-format +msgid "%s would like permission to see when you are online" +msgstr "%s سىزنى توردا بار چېغىڭىزدا كۆرۈشكە ئىجازەت سوراۋاتىدۇ" + +#: ../js/ui/components/telepathyClient.js:1298 +msgid "Network error" +msgstr "تور خاتالىقى" + +#: ../js/ui/components/telepathyClient.js:1300 +msgid "Authentication failed" +msgstr "كىملىك دەلىللەش مەغلۇپ بولدى" + +#: ../js/ui/components/telepathyClient.js:1302 +msgid "Encryption error" +msgstr "شىفىرلاش خاتالىقى" + +#: ../js/ui/components/telepathyClient.js:1304 +msgid "Certificate not provided" +msgstr "گۇۋاھنامە تەمىنلەنمىگەن" + +#: ../js/ui/components/telepathyClient.js:1306 +msgid "Certificate untrusted" +msgstr "گۇۋاھنامە ئىشەنچسىز" + +#: ../js/ui/components/telepathyClient.js:1308 +msgid "Certificate expired" +msgstr "گۇۋاھنامىنىڭ ۋاقتى ئوتكەن" + +#: ../js/ui/components/telepathyClient.js:1310 +msgid "Certificate not activated" +msgstr "گۇۋاھنامە ئاكتىپ ئەمەس" + +#: ../js/ui/components/telepathyClient.js:1312 +msgid "Certificate hostname mismatch" +msgstr "گۇۋاھنامە كومپيۇتېرىنىڭ ئاتى ماسلاشمىدى" + +#: ../js/ui/components/telepathyClient.js:1314 +msgid "Certificate fingerprint mismatch" +msgstr "گۇۋاھنامىنىڭ بارماق ئىزى ماسلاشمىدى" + +#: ../js/ui/components/telepathyClient.js:1316 +msgid "Certificate self-signed" +msgstr "گۇۋاھنامىنىڭ ئۆزىنىڭ ئىمزاسى" + +#: ../js/ui/components/telepathyClient.js:1318 +msgid "Status is set to offline" +msgstr "ھالەت توردا يوق قىلىپ بەلگىلەندى" + +#: ../js/ui/components/telepathyClient.js:1320 +msgid "Encryption is not available" +msgstr "شىفىرلاشنى ئىشلەتكىلى بولمايدۇ" + +#: ../js/ui/components/telepathyClient.js:1322 +msgid "Certificate is invalid" +msgstr "گۇۋاھنامە ئىناۋەتسىز" + +#: ../js/ui/components/telepathyClient.js:1324 +msgid "Connection has been refused" +msgstr "باغلىنىش رەت قىلىندى" + +#: ../js/ui/components/telepathyClient.js:1326 +msgid "Connection can't be established" +msgstr "باغلانغىلى بولمىدى" + +#: ../js/ui/components/telepathyClient.js:1328 +msgid "Connection has been lost" +msgstr "باغلىنىش ئۈزۈلدى" + +#: ../js/ui/components/telepathyClient.js:1330 +msgid "This account is already connected to the server" +msgstr "بۇ ھېسابات ئاللىقاچان مۇلازىمېتىرغا باغلانغان" + +#: ../js/ui/components/telepathyClient.js:1332 +msgid "" +"Connection has been replaced by a new connection using the same resource" +msgstr "ئوخشاش مەنبە ئىشلەتكەن باغلىنىش ئەسلىدىكىنىڭ ئورنىنى ئىگىلىدى" + +#: ../js/ui/components/telepathyClient.js:1334 +msgid "The account already exists on the server" +msgstr "مۇلازىمېتىردا بۇ ھېسابات ئاللىقاچان بار" + +#: ../js/ui/components/telepathyClient.js:1336 +msgid "Server is currently too busy to handle the connection" +msgstr "مۇلازىمېتىر بەكلا ئالدىراش بولغاچقا بۇ باغلىنىشنى بىر تەرەپ قىلالمايدۇ" + +#: ../js/ui/components/telepathyClient.js:1338 +msgid "Certificate has been revoked" +msgstr "گۇۋاھنامە ئىناۋەتسىز قىلىنغان" + +#: ../js/ui/components/telepathyClient.js:1340 +msgid "" +"Certificate uses an insecure cipher algorithm or is cryptographically weak" +msgstr "گۇۋاھنامە خەتەرلىك شىفىرلاش ئالگورىزىمىنى ئىشلەتكەن ياكى شىفىرلىنىشى ئاجىز" + +#: ../js/ui/components/telepathyClient.js:1342 +msgid "" +"The length of the server certificate, or the depth of the server certificate " +"chain, exceed the limits imposed by the cryptography library" +msgstr "مۇلازىمېتىر گۇۋاھنامىسىنىڭ ئۇزۇنلۇقى ياكى مۇلازىمېتىر گۇۋاھنامىسىنىڭ زەنجىرىنىڭ چوڭقۇرلۇقى شىفىرلاش فۇنكسىيە ئامبىرىدا بەلگىلەنگەن ئۇزۇنلۇقتىن ئېشىپ كەتتى" + +#: ../js/ui/components/telepathyClient.js:1344 +msgid "Internal error" +msgstr "ئىچكى خاتالىق" + +#. translators: argument is the account name, like +#. * name@jabber.org for example. +#: ../js/ui/components/telepathyClient.js:1354 +#, c-format +msgid "Unable to connect to %s" +msgstr "%s غا باغلانغىلى بولمىدى" + +#: ../js/ui/components/telepathyClient.js:1359 +msgid "View account" +msgstr "ھېساباتنى كۆرۈش" + +#: ../js/ui/components/telepathyClient.js:1398 +msgid "Unknown reason" +msgstr "نامەلۇم سەۋەب" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96 +msgid "Windows" +msgstr "كۆزنەكلەر" + +#: ../js/ui/dash.js:248 ../js/ui/dash.js:286 +msgid "Show Applications" +msgstr "پروگراممىلارنى كۆرسىتىدۇ" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: ../js/ui/dash.js:435 +msgid "Dash" +msgstr "سىزىقچە" + +#: ../js/ui/dateMenu.js:91 +msgid "Open Calendar" +msgstr "يىلنامىلەرنى ئېچىش" + +#: ../js/ui/dateMenu.js:96 +msgid "Open Clocks" +msgstr "سائەتلەرنى ئېچىش" + +#: ../js/ui/dateMenu.js:105 +msgid "Date & Time Settings" +msgstr "چېسلا ۋە ۋاقىت تەڭشىكى" + +#. 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:205 +msgid "%A %B %e, %Y" +msgstr "%A %B %e، %Y" + +#: ../js/ui/endSessionDialog.js:63 +#, c-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s دىن چىقىش" + +#: ../js/ui/endSessionDialog.js:64 +msgctxt "title" +msgid "Log Out" +msgstr "تىزىمدىن چىقىش" + +#: ../js/ui/endSessionDialog.js:65 +msgid "Click Log Out to quit these applications and log out of the system." +msgstr "تىزىمدىن چىقىش (Log Out) نى بېسىپ پروگراممىدىن چېكىنىش ۋە سىستېما تىزىمىدىن چىقىش." + +#: ../js/ui/endSessionDialog.js:67 +#, c-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "ئىشلەتكۈچى %s يەنە %d سېكۇنتتىن كېيىن ئاپتوماتىك چىقىپ كېتىدۇ." + +#: ../js/ui/endSessionDialog.js:72 +#, c-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "سىز يەنە %d سېكۇنتتىن كېيىن ئاپتوماتىك چىقىپ كېتىسىز." + +#: ../js/ui/endSessionDialog.js:76 +msgid "Logging out of the system." +msgstr "سىستېما تىزىمدىن چىقىۋاتىدۇ" + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "تىزىمدىن چىقىش" + +#: ../js/ui/endSessionDialog.js:83 +msgctxt "title" +msgid "Power Off" +msgstr "توكنى ئۈز" + +#: ../js/ui/endSessionDialog.js:84 +msgid "Click Power Off to quit these applications and power off the system." +msgstr "تۈكنى ئۈز چېكىلسە قوللىنىشچان پروگراممىلاردىن چېكىنىپ سىستېمىنى تاقايدۇ." + +#: ../js/ui/endSessionDialog.js:86 +#, c-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "سىستېمىنىڭ توكى يەنە %d سېكۇنتتىن كېيىن ئاپتوماتىك ئۈزۈلىدۇ." + +#: ../js/ui/endSessionDialog.js:90 +msgid "Powering off the system." +msgstr "سىستېمىنى تاقاۋاتىدۇ." + +#: ../js/ui/endSessionDialog.js:92 ../js/ui/endSessionDialog.js:109 +msgctxt "button" +msgid "Restart" +msgstr "قايتا قوزغات" + +#: ../js/ui/endSessionDialog.js:94 +msgctxt "button" +msgid "Power Off" +msgstr "توكنى ئۈز" + +#: ../js/ui/endSessionDialog.js:100 +msgctxt "title" +msgid "Restart" +msgstr "قايتا قوزغات" + +#: ../js/ui/endSessionDialog.js:101 +msgid "Click Restart to quit these applications and restart the system." +msgstr "قايتا قوزغات (restart) چېكىلسە پروگراممىدىن چېكىنىپ ۋە سىستېمىنى قايتا قوزغىتىدۇ." + +#: ../js/ui/endSessionDialog.js:103 +#, c-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "سىستېما يەنە %d سېكۇنتتىن كېيىن ئاپتوماتىك قايتا قوزغىلىدۇ." + +#: ../js/ui/endSessionDialog.js:107 +msgid "Restarting the system." +msgstr "سىستېما قايتا قوزغىلىۋاتىدۇ." + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "ئورنات" + +#: ../js/ui/extensionDownloader.js:204 +#, c-format +msgid "Download and install '%s' from extensions.gnome.org?" +msgstr "مەنبە extensions.gnome.org دىن ‹%s› نى چۈشۈرۈپ ئورنىتامسىز؟" + +#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314 +#: ../js/ui/status/power.js:211 +msgid "Keyboard" +msgstr "ھەرپتاختا" + +#: ../js/ui/lookingGlass.js:693 +msgid "No extensions installed" +msgstr "ھېچقانداق كېڭەيتىلمە ئورنىتىلمىغان" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:747 +#, c-format +msgid "%s has not emitted any errors." +msgstr "%s نىڭدا ھېچقانداق خاتالىق يۈز بەرمىدى." + +#: ../js/ui/lookingGlass.js:753 +msgid "Hide Errors" +msgstr "خاتالىقلارنى يوشۇر" + +#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:817 +msgid "Show Errors" +msgstr "خاتالىقلارنى كۆرسەت" + +#: ../js/ui/lookingGlass.js:766 +msgid "Enabled" +msgstr "ئىناۋەتلىك قىلىنغان" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830 +msgid "Disabled" +msgstr "ئىناۋەتسىز قىلىنغان" + +#: ../js/ui/lookingGlass.js:771 +msgid "Error" +msgstr "خاتالىق" + +#: ../js/ui/lookingGlass.js:773 +msgid "Out of date" +msgstr "ۋاقتى ئۆتۈپ كەتكەن" + +#: ../js/ui/lookingGlass.js:775 +msgid "Downloading" +msgstr "چۈشۈرۈۋاتىدۇ" + +#: ../js/ui/lookingGlass.js:799 +msgid "View Source" +msgstr "مەنبەنى كۆرسەت" + +#: ../js/ui/lookingGlass.js:808 +msgid "Web Page" +msgstr "توربەت" + +#: ../js/ui/messageTray.js:1182 +msgid "Open" +msgstr "ئاچ" + +#: ../js/ui/messageTray.js:1189 +msgid "Remove" +msgstr "چىقىرىۋەت" + +#: ../js/ui/messageTray.js:1501 +msgid "Clear Messages" +msgstr "ئۇچۇرنى تازىلا" + +#: ../js/ui/messageTray.js:1528 +msgid "Notification Settings" +msgstr "ئۇقتۇرۇش تەڭشىكى" + +#: ../js/ui/messageTray.js:1707 +msgid "No Messages" +msgstr "ئۇچۇر يوق" + +#: ../js/ui/messageTray.js:1787 +msgid "Message Tray" +msgstr "ئۇچۇر قوندىقى" + +#: ../js/ui/messageTray.js:2864 +msgid "System Information" +msgstr "سىستېما ئۇچۇرى" + +#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:374 +msgctxt "program" +msgid "Unknown" +msgstr "نامەلۇم" + +#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153 +#, c-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d دانە ئۇچۇر" + +#: ../js/ui/overview.js:82 +msgid "Undo" +msgstr "يېنىۋال" + +#: ../js/ui/overview.js:129 +msgid "Overview" +msgstr "قىسقىچە بايان" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/overview.js:284 +msgid "Type to search…" +msgstr "ئىزدەيدىغاننى كىرگۈزۈڭ.…" + +#: ../js/ui/panel.js:613 +msgid "Quit" +msgstr "ئاخىرلاشتۇر" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:642 +msgid "Activities" +msgstr "پائالىيەتلەر" + +#: ../js/ui/panel.js:983 +msgid "Top Bar" +msgstr "ئۈستى بالداق" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:727 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:205 +msgid "Enter a Command" +msgstr "بۇيرۇق كىرگۈزۈڭ" + +#: ../js/ui/runDialog.js:241 +msgid "Close" +msgstr "ياپ" + +#. Translators: This is a time format for a date in +#. long format +#: ../js/ui/screenShield.js:90 +msgid "%A, %B %d" +msgstr "%A، %B %d" + +#: ../js/ui/screenShield.js:155 +#, c-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d دانە ئۇقتۇرۇش" + +#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806 +msgid "Lock" +msgstr "قۇلۇپلا" + +#: ../js/ui/screenShield.js:639 +msgid "GNOME needs to lock the screen" +msgstr "گىنوم ئېكراننى قۇلۇپلىشى زۆرۈر" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169 +msgid "Unable to lock" +msgstr "قۇلۇپلىغىلى بولمىدى" + +#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170 +msgid "Lock was blocked by an application" +msgstr "بىر پروگرامما قۇلۇپلاشنى توسۇپ قويغان" + +#: ../js/ui/searchDisplay.js:431 +msgid "Searching…" +msgstr "ئىزدەۋاتىدۇ…" + +#: ../js/ui/searchDisplay.js:475 +msgid "No results." +msgstr "نەتىجە يوق." + +#: ../js/ui/shellEntry.js:29 +msgid "Copy" +msgstr "كۆچۈر" + +#: ../js/ui/shellEntry.js:34 +msgid "Paste" +msgstr "چاپلا" + +#: ../js/ui/shellEntry.js:105 +msgid "Show Text" +msgstr "تېكىست كۆرسەت" + +#: ../js/ui/shellEntry.js:107 +msgid "Hide Text" +msgstr "تېكىستنى يوشۇر" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "ئىم" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "ئىمنى ئەستە تۇتۇش" + +#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140 +msgid "Unlock" +msgstr "قۇلۇپسىزلا" + +#: ../js/ui/status/accessibility.js:36 +msgid "Accessibility" +msgstr "ياردەم ئىقتىدارى" + +#: ../js/ui/status/accessibility.js:41 +msgid "Zoom" +msgstr "كېڭەيت-تارايت" + +#: ../js/ui/status/accessibility.js:48 +msgid "Screen Reader" +msgstr "ئېكران ئوقۇغۇچ" + +#: ../js/ui/status/accessibility.js:52 +msgid "Screen Keyboard" +msgstr "ئېكران ھەرپتاختىسى" + +#: ../js/ui/status/accessibility.js:56 +msgid "Visual Alerts" +msgstr "كۆرۈنمە ئاگاھلاندۇرۇش" + +#: ../js/ui/status/accessibility.js:59 +msgid "Sticky Keys" +msgstr "يېپىشقاق كۇنۇپكىلار" + +#: ../js/ui/status/accessibility.js:62 +msgid "Slow Keys" +msgstr "ئاستا كۇنۇپكىلار" + +#: ../js/ui/status/accessibility.js:65 +msgid "Bounce Keys" +msgstr "سەكرىمە كۇنۇپكىلار" + +#: ../js/ui/status/accessibility.js:68 +msgid "Mouse Keys" +msgstr "چاشقىنەك كۇنۇپكىلىرى" + +#: ../js/ui/status/accessibility.js:72 +msgid "Universal Access Settings" +msgstr "ئۇنىۋېرسال زىيارەت تەڭشىكى" + +#: ../js/ui/status/accessibility.js:129 +msgid "High Contrast" +msgstr "يۇقىرى ئاق-قارىلىقى" + +#: ../js/ui/status/accessibility.js:178 +msgid "Large Text" +msgstr "چوڭ تېكىست" + +#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32 +#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321 +#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388 +#: ../js/ui/status/network.js:826 +msgid "Bluetooth" +msgstr "كۆكچىش" + +#: ../js/ui/status/bluetooth.js:45 +msgid "Visibility" +msgstr "كۆرۈشچانلىقى" + +#: ../js/ui/status/bluetooth.js:59 +msgid "Send Files to Device…" +msgstr "ھۆججەتلەرنى ئۈسكۈنىگە ئەۋەتىش…" + +#: ../js/ui/status/bluetooth.js:60 +msgid "Set Up a New Device…" +msgstr "يېڭى ئۈسكۈنە ئورنىتىش…" + +#: ../js/ui/status/bluetooth.js:84 +msgid "Bluetooth Settings" +msgstr "كۆكچىش تەڭشىكى" + +#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill +#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:178 +msgid "hardware disabled" +msgstr "قاتتىق دېتال ئىناۋەتسىز قىلىنغان" + +#: ../js/ui/status/bluetooth.js:197 +msgid "Connection" +msgstr "باغلىنىش" + +#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:460 +msgid "disconnecting..." +msgstr "ئۈزۈۋاتىدۇ…" + +#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:466 +#: ../js/ui/status/network.js:1546 +msgid "connecting..." +msgstr "باغلىنىۋاتىدۇ…" + +#: ../js/ui/status/bluetooth.js:239 +msgid "Send Files…" +msgstr "ھۆججەت يوللاش…" + +#: ../js/ui/status/bluetooth.js:246 +msgid "Keyboard Settings" +msgstr "ھەرپتاختا تەڭشەكلىرى‏" + +#: ../js/ui/status/bluetooth.js:249 +msgid "Mouse Settings" +msgstr "چاشقىنەك تەڭشەكلىرى" + +#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316 +msgid "Sound Settings" +msgstr "ئاۋاز تەڭشەكلىرى‏" + +#: ../js/ui/status/bluetooth.js:322 +#, c-format +msgid "Authorization request from %s" +msgstr "‹%s› تىن كەلگەن دەلىللەش ئىلتىماسى" + +#: ../js/ui/status/bluetooth.js:328 +#, c-format +msgid "Device %s wants access to the service '%s'" +msgstr "ئۈسكۈنە %s مۇلازىمەت ‹%s› نى زىيارەت قىلماقچى" + +#: ../js/ui/status/bluetooth.js:330 +msgid "Always grant access" +msgstr "ھەمىشە زىيارەتكە رۇخسەت" + +#: ../js/ui/status/bluetooth.js:331 +msgid "Grant this time only" +msgstr "بۇ قېتىمغىلا رۇخسەت" + +#: ../js/ui/status/bluetooth.js:332 +msgid "Reject" +msgstr "رەت قىل" + +#. Translators: argument is the device short name +#: ../js/ui/status/bluetooth.js:359 +#, c-format +msgid "Pairing confirmation for %s" +msgstr "‏%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ" + +#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396 +#, c-format +msgid "Device %s wants to pair with this computer" +msgstr "ئۈسكۈنە‹%s› كومپيۇتېر بىلەن جۈپلەنمەكچى" + +#: ../js/ui/status/bluetooth.js:366 +#, c-format +msgid "Please confirm whether the PIN '%06d' matches the one on the device." +msgstr "ئۈسكۈنە ئۈستىدىكى بىلەن PIN ‹%06d› ماسلىشامدۇ جەزملەڭ." + +#. Translators: this is the verb, not the noun +#: ../js/ui/status/bluetooth.js:369 +msgid "Matches" +msgstr "ماسلاشتى" + +#: ../js/ui/status/bluetooth.js:370 +msgid "Does not match" +msgstr "ماسلاشمىدى" + +#: ../js/ui/status/bluetooth.js:389 +#, c-format +msgid "Pairing request for %s" +msgstr "‏%s دىن كەلگەن جۈپلەش ئىلتىماسى" + +#: ../js/ui/status/bluetooth.js:397 +msgid "Please enter the PIN mentioned on the device." +msgstr "ئۈسكۈنىسىدە يوللىغان PIN نومۇرىنى كىرگۈزۈڭ." + +#: ../js/ui/status/bluetooth.js:414 +msgid "OK" +msgstr "تامام" + +#: ../js/ui/status/keyboard.js:368 +msgid "Show Keyboard Layout" +msgstr "ھەرپ تاختا ئورۇنلاشتۇرۇشىنى كۆرسىتىش" + +#: ../js/ui/status/keyboard.js:373 +msgid "Region & Language Settings" +msgstr "رايون ۋە تىل تەڭشىكى" + +#: ../js/ui/status/lockScreenMenu.js:43 +msgid "Volume, network, battery" +msgstr "ئاۋاز مىقدارى، تور، توكدان" + +#: ../js/ui/status/network.js:104 +msgid "" +msgstr "<نامەلۇم>" + +#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch +#: ../js/ui/status/network.js:200 +msgid "disabled" +msgstr "چەكلەنگەن" + +#. 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) +#: ../js/ui/status/network.js:458 +msgid "unmanaged" +msgstr "باشقۇرۇلمىغان" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1549 +msgid "authentication required" +msgstr "كىملىك دەلىللەش زۆرۈر" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing +#: ../js/ui/status/network.js:479 +msgid "firmware missing" +msgstr "مۇقىم دېتال كەم" + +#. Translators: this is for wired network devices that are physically disconnected +#: ../js/ui/status/network.js:486 +msgid "cable unplugged" +msgstr "كابېل چېتىلمىدى" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage +#: ../js/ui/status/network.js:491 +msgid "unavailable" +msgstr "ئىشلەتكىلى بولمايدۇ" + +#: ../js/ui/status/network.js:493 ../js/ui/status/network.js:1551 +msgid "connection failed" +msgstr "باغلىنىش مەغلۇپ بولدى" + +#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1435 +#: ../js/ui/status/network.js:1627 +msgid "More…" +msgstr "تېخىمۇ كۆپ…" + +#. TRANSLATORS: this is the indication that a connection for another logged in user is active, +#. and we cannot access its settings (including the name) +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1365 +msgid "Connected (private)" +msgstr "باغلاندى (شەخسىي)" + +#: ../js/ui/status/network.js:667 +msgid "Wired" +msgstr "سىملىق" + +#: ../js/ui/status/network.js:668 +msgid "Auto Ethernet" +msgstr "ئاپتوماتىك Ethernet" + +#: ../js/ui/status/network.js:695 +msgid "Mobile broadband" +msgstr "كۆچمە كەڭ بەلۋاغ" + +#: ../js/ui/status/network.js:728 +msgid "Auto broadband" +msgstr "ئاپتوماتىك كۆچمە كەڭ بەلۋاغ" + +#: ../js/ui/status/network.js:731 +msgid "Auto dial-up" +msgstr "ئاپتوماتىك نومۇر بۇرا" + +#. TRANSLATORS: this the automatic wireless connection name (including the network name) +#: ../js/ui/status/network.js:861 ../js/ui/status/network.js:1382 +#, c-format +msgid "Auto %s" +msgstr "ئاپتوماتىك %s" + +#: ../js/ui/status/network.js:863 +msgid "Auto bluetooth" +msgstr "ئاپتوماتىك كۆكچىش" + +#: ../js/ui/status/network.js:1384 +msgid "Auto wireless" +msgstr "ئاپتوماتىك سىمسىز تور" + +#: ../js/ui/status/network.js:1729 +msgid "Enable networking" +msgstr "تور ئۇلاشنى قوزغات" + +#: ../js/ui/status/network.js:1771 +msgid "Wi-Fi" +msgstr "Wi-Fi" + +#: ../js/ui/status/network.js:1790 +msgid "Network Settings" +msgstr "تور تەڭشەكلىرى" + +#: ../js/ui/status/network.js:1807 +msgid "Network Manager" +msgstr "تور باشقۇرغۇچ" + +#: ../js/ui/status/network.js:1897 +msgid "Connection failed" +msgstr "باغلىنىش مەغلۇپ بولدى" + +#: ../js/ui/status/network.js:1898 +msgid "Activation of network connection failed" +msgstr "تور باغلىنىشىنى ئاكتىپلاش مەغلۇپ بولدى" + +#: ../js/ui/status/network.js:2276 +msgid "Networking is disabled" +msgstr "تورغا باغلىنىش چەكلەنگەن" + +#: ../js/ui/status/power.js:55 +msgid "Battery" +msgstr "توكدان" + +#: ../js/ui/status/power.js:81 +msgid "Power Settings" +msgstr "توك مەنبە تەڭشىكى" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:99 +msgid "Estimating…" +msgstr "مۆلچەرلەۋاتىدۇ…" + +#: ../js/ui/status/power.js:106 +#, c-format +msgid "%d hour remaining" +msgid_plural "%d hours remaining" +msgstr[0] "%d سائەت قالدى" + +#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" +#: ../js/ui/status/power.js:109 +#, c-format +msgid "%d %s %d %s remaining" +msgstr "%d %s %d %s قالدى" + +#: ../js/ui/status/power.js:111 +msgid "hour" +msgid_plural "hours" +msgstr[0] "سائەت" + +#: ../js/ui/status/power.js:111 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "مىنۇت" + +#: ../js/ui/status/power.js:114 +#, c-format +msgid "%d minute remaining" +msgid_plural "%d minutes remaining" +msgstr[0] "%d مىنۇت قالدى" + +#: ../js/ui/status/power.js:117 ../js/ui/status/power.js:191 +#, c-format +msgctxt "percent of battery remaining" +msgid "%d%%" +msgstr "%d%%" + +#: ../js/ui/status/power.js:201 +msgid "AC Adapter" +msgstr "ئۆزگىرىشچان توك ماسلاشتۇرغۇچ" + +#: ../js/ui/status/power.js:203 +msgid "Laptop Battery" +msgstr "يان كومپيۇتېر توكدانى" + +#: ../js/ui/status/power.js:205 +msgid "UPS" +msgstr "UPS" + +#: ../js/ui/status/power.js:207 +msgid "Monitor" +msgstr "ئېكران" + +#: ../js/ui/status/power.js:209 +msgid "Mouse" +msgstr "چاشقىنەك" + +#: ../js/ui/status/power.js:213 +msgid "PDA" +msgstr "PDA" + +#: ../js/ui/status/power.js:215 +msgid "Cell Phone" +msgstr "يانفون" + +#: ../js/ui/status/power.js:217 +msgid "Media Player" +msgstr "ۋاسىتە قويغۇ" + +#: ../js/ui/status/power.js:219 +msgid "Tablet" +msgstr "سەزگۈر تاختا" + +#: ../js/ui/status/power.js:221 +msgid "Computer" +msgstr "كومپيۇتېر" + +#: ../js/ui/status/power.js:223 +msgctxt "device" +msgid "Unknown" +msgstr "نامەلۇم" + +#: ../js/ui/status/volume.js:124 +msgid "Volume changed" +msgstr "ئاۋاز مىقدارى ئۆزگەردى" + +#. Translators: This is the label for audio volume +#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297 +msgid "Volume" +msgstr "ئاۋاز مىقدارى" + +#: ../js/ui/status/volume.js:258 +msgid "Microphone" +msgstr "مىكروفون" + +#: ../js/ui/unlockDialog.js:151 +msgid "Log in as another user" +msgstr "باشقا ئىشلەتكۈچى سۈپىتىدە كىر" + +#: ../js/ui/unlockDialog.js:177 +msgid "Unlock Window" +msgstr "كۆزنەكنى قۇلۇپلا" + +#: ../js/ui/userMenu.js:193 +msgid "Available" +msgstr "ئىشلەتكىلى بولىدۇ" + +#: ../js/ui/userMenu.js:196 +msgid "Busy" +msgstr "ئالدىراش" + +#: ../js/ui/userMenu.js:199 +msgid "Invisible" +msgstr "يوشۇرۇن" + +#: ../js/ui/userMenu.js:202 +msgid "Away" +msgstr "يوق" + +#: ../js/ui/userMenu.js:205 +msgid "Idle" +msgstr "بىكار" + +#: ../js/ui/userMenu.js:208 +msgid "Offline" +msgstr "توردا يوق" + +#: ../js/ui/userMenu.js:780 +msgid "Notifications" +msgstr "ئۇقتۇرۇشلار" + +#: ../js/ui/userMenu.js:796 +msgid "Switch User" +msgstr "ئىشلەتكۈچى ئالماشتۇرۇش" + +#: ../js/ui/userMenu.js:801 +msgid "Log Out" +msgstr "تىزىمدىن چىقىش" + +#: ../js/ui/userMenu.js:821 +msgid "Install Updates & Restart" +msgstr "يېڭىلانمىلارنى ئورنىتىپ قايتا قوزغات" + +#: ../js/ui/userMenu.js:839 +msgid "Your chat status will be set to busy" +msgstr "سىزنىڭ سۆھبەت ھالىتىڭىز ئالدىراش قىلىنىدۇ" + +#: ../js/ui/userMenu.js:840 +msgid "" +"Notifications are now disabled, including chat messages. Your online status " +"has been adjusted to let others know that you might not see their messages." +msgstr "" + +#: ../js/ui/userMenu.js:886 +msgid "Other users are logged in." +msgstr "باشقا ئىشلەتكۈچىلەر كىردى:" + +#: ../js/ui/userMenu.js:891 +msgid "Shutting down might cause them to lose unsaved work." +msgstr "تاقالسا ساقلانمىغان خىزمەتلەر يوقىلىشى مۇمكىن." + +#: ../js/ui/userMenu.js:918 +#, c-format +msgid "%s (remote)" +msgstr "%s (يىراق)" + +#: ../js/ui/userMenu.js:920 +#, c-format +msgid "%s (console)" +msgstr "%s (تىزگىن كۆزنەك)" + +#: ../js/ui/viewSelector.js:100 +msgid "Applications" +msgstr "پروگراممىلار" + +#: ../js/ui/viewSelector.js:104 +msgid "Search" +msgstr "ئىزدە" + +#: ../js/ui/wanda.js:92 +#, c-format +msgid "" +"Sorry, no wisdom for you today:\n" +"%s" +msgstr "كەچۈرۈڭ، سىزگە بۈگۈن ھېكمەتلىك سۆز يوق:\n" +"%s" + +#: ../js/ui/wanda.js:96 +#, c-format +msgid "%s the Oracle says" +msgstr "خەۋەرچى مۇنداق دەيدۇ %s" + +#: ../js/ui/windowAttentionHandler.js:19 +#, c-format +msgid "'%s' is ready" +msgstr "‹%s› تەييار" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution يىلنامىسى" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1837 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u چىقىرىلما" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1847 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u كىرگۈزۈلمە" + +#: ../src/gvc/gvc-mixer-control.c:2371 +msgid "System Sounds" +msgstr "سىستېما ئاۋازى" + +#: ../src/main.c:347 +msgid "Print version" +msgstr "نەشرىنى باس" + +#: ../src/main.c:353 +msgid "Mode used by GDM for login screen" +msgstr "كىرىش ئېكرانىدا GDM ئىشلىتىدىغان ئۇسۇل" + +#: ../src/main.c:359 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "كۆرسىتىلگەن ئۇسۇلنى ئىشلەتسۇن، مەسىلەن: كىرىش ئېكرانى ئۈچۈن «gdm» دېگەندەك" + +#: ../src/main.c:365 +msgid "List possible modes" +msgstr "بارلىق ئۇسۇللارنى تىزىپ كۆرسەت" + +#: ../src/shell-app.c:622 +#, c-format +msgid "Failed to launch '%s'" +msgstr "‹%s› نى قوزغىتالمىدى" + +#: ../src/shell-keyring-prompt.c:708 +msgid "Passwords do not match." +msgstr "ئىم ماس كەلمىدى." + +#: ../src/shell-keyring-prompt.c:716 +msgid "Password cannot be blank" +msgstr "ئىم قۇرۇق بولسا بولمايدۇ" + +#: ../src/shell-polkit-authentication-agent.c:343 +msgid "Authentication dialog was dismissed by the user" +msgstr "كىملىك دەلىللەش سۆزلەشكۈنى ئىشلەتكۈچى تاقىدى" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "كىر" + +#~ msgid "tray" +#~ msgstr "قونداق، پەغەز" + +#~ msgid "Clear" +#~ msgstr "تازىلا" + +#~ msgid "More..." +#~ msgstr "تېخىمۇ كۆپ…" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "United Kingdom" +#~ msgstr "ئەنگلىيە پادىشاھلىقى" + +#~ msgid "Default" +#~ msgstr "كۆڭۈلدىكى" + +#~ msgid "Show full name in the user menu" +#~ msgstr "ئىشلەتكۈچى تىزىملىكىدە تولۇق ئاتىنى كۆرسەتسۇن" + +#~ msgid "Whether the users full name is shown in the user menu or not." +#~ msgstr "ئىشلەتكۈچى تىزىملىكىدە تولۇق ئاتىنى كۆرسىتەمدۇ يوق بەلگىلەيدۇ." + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should not be loaded." +#~ msgstr "" +#~ "GNOME Shell كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا يۈكلەنمەيدىغان " +#~ "كېڭەيتىلمىلەر تىزىمىنى كۆرسىتىدۇ." + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "true بولسا سائەتتە ۋاقىت كۆرسەتكەندىن تاشقىرى چېسلا كۆرسىتىدۇ." + +#~ msgid "If true, display seconds in time." +#~ msgstr "true بولسا ۋاقىتتا سېكۇنتمۇ كۆرۈنىدۇ." + +#~ msgid "Show date in clock" +#~ msgstr "سائەت ئىچىدە چېسلا كۆرسەت" + +#~ msgid "Show time with seconds" +#~ msgstr "ۋاقىت ئىچىدە سېكۇنتنى بىللە كۆرسەت" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "OpenSearch نىڭ تەمىنلىگۈچىلىرى چەكلەنگەن" + +#~ msgid "APPLICATIONS" +#~ msgstr "پروگراممىلار" + +#~ msgid "SETTINGS" +#~ msgstr "تەڭشەكلەر" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e، %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e، %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e، %l:%M:%S %p" + +#~ msgid "%a %b %e, %l:%M %p" +#~ msgstr "%a %b %e، %l:%M %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "%a %l:%M %p" +#~ msgstr "%a %l:%M" + +#~ msgid "RECENT ITEMS" +#~ msgstr "يېقىنقى تۈرلەر" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "«%s» نى ئېگەرسىزلەش مەغلۇپ بولدى" + +#~ msgid "Retry" +#~ msgstr "قايتا سىنا" + +#~ msgid "Connect to..." +#~ msgstr "باغلىنىش…" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ئورۇن ۋە ئۈسكۈنىلەر" + +#~ msgid "Power Off..." +#~ msgstr "توكنى ئۈز…" + +#~ msgid "System Settings" +#~ msgstr "سىستېما تەڭشىكى" + +#~ msgid "Lock Screen" +#~ msgstr "ئېكراننى قۇلۇپلاش" + +#~ msgid "Log Out..." +#~ msgstr "تىزىمدىن چىقىش…" + +#~ msgid "Browse Files..." +#~ msgstr "ھۆججەتكە كۆز يۈگۈرت..." + +#~ msgid "Error browsing device" +#~ msgstr "ئۈسكىنىگە كۆز يۈگۈرتكەندە خاتالىق كۆرۈلدى" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "ئىلتىماس قىلغان ئۈسكىنىگە كۆز يۈگۈرتەلمىدى، خاتالىق '%s'" + +#~ msgid "Localization Settings" +#~ msgstr "يەرلىكلەشتۈرۈش تەڭشىكى" + +#~ msgid "Wireless" +#~ msgstr "سىمسىز" + +#~ msgid "VPN Connections" +#~ msgstr "VPN باغلىنىشلىرى" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "ھازىر كۆچمە كەڭ بەلۋاغ '%s' غا باغلاندىڭىز" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "ھازىر سىمسىز تور '%s' غا باغلاندىڭىز" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "ھازىر سىملىق تور '%s' غا باغلاندىڭىز" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "ھازىر VPN تور '%s' غا باغلاندىڭىز" + +#~ msgid "%s is online." +#~ msgstr "‏%s توردا." + +#~ msgid "%s is away." +#~ msgstr "‏%s يوق." + +#~ msgid "%s is busy." +#~ msgstr "‏%s ئالدىراش." + +#~ msgid "Sent at %X on %A" +#~ msgstr "سائەت %X %A غا ئەۋەتتى" + +#~ msgid "%s has finished starting" +#~ msgstr "‏%s باشلاشنى تاماملىدى" + +#~ msgid "Less than a minute ago" +#~ msgstr "بىر مىنۇتتىنمۇ ئىلگىرى" + +#~ msgid "%d minute ago" +#~ msgid_plural "%d minutes ago" +#~ msgstr[0] "%d مىنۇت ئىلگىرى" + +#~ msgid "%d hour ago" +#~ msgid_plural "%d hours ago" +#~ msgstr[0] "%d سائەت ئىلگىرى" + +#~ msgid "%d day ago" +#~ msgid_plural "%d days ago" +#~ msgstr[0] "%d كۈن ئىلگىرى" + +#~ msgid "%d week ago" +#~ msgid_plural "%d weeks ago" +#~ msgstr[0] "%d ھەپتە ئىلگىرى" + +#~ msgid "Home Folder" +#~ msgstr "ماكان مۇندەرىجە" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "PREFERENCES" +#~ msgstr "مايىللىق" + +#~ msgid "Shut Down" +#~ msgstr "تاقا" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "تاقاش (Shut Down) نى بېسىپ پروگراممىدىن چېكىنىش ۋە سىستېمىنى تاقاش." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "بۇ سىستېما %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن تاقىلىدۇ." + +#~ msgid "Shutting down the system." +#~ msgstr "سىستېما تاقىلىۋاتىدۇ." + +#~ msgid "Confirm" +#~ msgstr "جەزملە" + +#~ msgid "Shut Down..." +#~ msgstr "تاقا…" + +#~ msgid "Search your computer" +#~ msgstr "كومپيۇتېر ئىزدەش" + +#~ msgid "Customize the panel clock" +#~ msgstr "تاختا سائەتنى ئۆزلەشتۈرىدۇ" + +#~ msgid "Custom format of the clock" +#~ msgstr "سائەتنىڭ ئىختىيارىي فورماتى" + +#~ msgid "Hour format" +#~ msgstr "سائەت فورماتى" + +#~ msgid "" +#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " +#~ "in time." +#~ msgstr "" +#~ "ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 " +#~ "سائەت» كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ." + +#~ msgid "" +#~ "This key specifies the format used by the panel clock when the format key " +#~ "is set to \"custom\". You can use conversion specifiers understood by " +#~ "strftime() to obtain a specific format. See the strftime() manual for " +#~ "more information." +#~ msgstr "" +#~ "format (فورمات) كۇنۇپكىسى \"custom\" (ئىختىيارى) قىلىپ تەڭشەلسە بۇ " +#~ "كۇنۇپكا تاختا سائەت ئىشلىتىدىغان فورماتنى بەلگىلەيدۇ. سىز strftime()نىڭ " +#~ "فورمات بەلگىسىنى ئىشلىتىپ بەلگىلەنگەن فورماتقا ئېرىشەلەيسىز. تەپسىلاتىنى " +#~ "strftime() نىڭ قوللانمىسىدىن كۆرۈڭ." + +#~ msgid "" +#~ "This key specifies the hour format used by the panel clock. Possible " +#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " +#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " +#~ "1970-01-01. If set to \"custom\", the clock will display time according " +#~ "to the format specified in the custom_format key. Note that if set to " +#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " +#~ "ignored." +#~ msgstr "" +#~ "بۇ كۇنۇپكا تاختا سائەت ئىشلەتكەن سائەت فورماتىنى بەلگىلىگەن. ئىشلەتكىلى " +#~ "بولىدىغان قىممىتى \"12-hour\" يەنى (12 سائەت)، \"24-hour\" يەنى (24 " +#~ "سائەت)، \"unix\" ۋە \"custom\" (ئىختىيارى). ئەگەر \"unix\" قىلىپ " +#~ "تەڭشەلسە سائەت ئۆزلۈكىدىن يېڭى ئېرا (يەنى، 1970-01-01) دىن ئۆتكەن " +#~ "سېكۇنتنى ئاساس قىلىدۇ. ئەگەر \"custom\" قىلىپ تەڭشەلسە سائەت " +#~ "custom_format كۇنۇپكا قىممىتىگە ئاساسەن ۋاقىتنى كۆرسىتىدۇ. ئەگەر \"unix" +#~ "\" ياكى \"custom\" قىلىپ تەڭشەلسە show_date ۋە show_seconds قىممىتىگە " +#~ "پەرۋا قىلمايدۇ" + +#~ msgid "Clip the crosshairs at the center" +#~ msgstr "نىشانلىغۇچنى ئوتتۇرىغا توغرىلا" + +#~ msgid "Color of the crosshairs" +#~ msgstr "نىشانلىغۇچنىڭ رەڭگى" + +#~ msgid "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." +#~ msgstr "" +#~ "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ ئۇزۇنلۇقى بەلگىلىنىدۇ." + +#~ msgid "" +#~ "Determines the transparency of the crosshairs, from fully opaque to fully " +#~ "transparent." +#~ msgstr "نىشانلىغۇچنىڭ سۈزۈكلۈكى تولۇق سۈزۈكتىن تولۇق تۇتۇققىچە بەلگىلىنىدۇ." + +#~ msgid "Enable lens mode" +#~ msgstr "لېنزا ھالىتىنى قوزغات" + +#~ msgid "Length of the crosshairs" +#~ msgstr "نىشانلىغۇچنىڭ ئېگىزلىكى" + +#~ msgid "Magnification factor" +#~ msgstr "چوڭايتىش-كىچىكلىتىش نىسبىتى" + +#~ msgid "Mouse Tracking Mode" +#~ msgstr "چاشقىنەك ئىزلاش ھالىتى" + +#~ msgid "Opacity of the crosshairs" +#~ msgstr "نىشانلىغۇچنىڭ سۈزۈكلۈكى" + +#~ msgid "Scroll magnified contents beyond the edges of the desktop" +#~ msgstr "دومىلىما چوڭايتقۇچ ئۈستەل ئۈستى گىرۋەك مەزمۇنىدىن ھالقىپ كەتتى" + +#~ msgid "Show or hide crosshairs" +#~ msgstr "نىشانلىغۇچنى كۆرسەت ياكى يوشۇر" + +#~ msgid "Show or hide the magnifier" +#~ msgstr "لوپا ئەينەكنى كۆرسەت ياكى يوشۇر" + +#~ msgid "Show or hide the magnifier and all of its zoom regions." +#~ msgstr "" +#~ "لوپا ئەينەك ۋە ئۇنىڭ ھەممە چوڭايتىش دائىرىسىنى كۆرسەت ياكى يوشۇرىدۇ." + +#~ msgid "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." +#~ msgstr "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ رەڭگى." + +#~ msgid "" +#~ "The power of the magnification. A value of 1.0 means no magnification. A " +#~ "value of 2.0 doubles the size." +#~ msgstr "" +#~ "چوڭايتىش كۈچى. 1.0 چوڭايتمايدۇ، 2.0 چوڭلۇقىنى ھەسسىلەيدۇ دېگەن مەنىدە." + +#~ msgid "Thickness of the crosshairs" +#~ msgstr "نىشانلىغۇچنىڭ قېلىنلىقى" + +#~ msgid "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." +#~ msgstr "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ كەڭلىكى." + +#~ msgid "Clock Format" +#~ msgstr "سائەت فورماتى" + +#~ msgid "Clock Preferences" +#~ msgstr "سائەت مايىللىقى" + +#~ msgid "Panel Display" +#~ msgstr "تاختا كۆرسىتىش" + +#~ msgid "Show seco_nds" +#~ msgstr "سېكۇنتنى كۆرسەت(_N)" + +#~ msgid "_12 hour format" +#~ msgstr "_12 سائەت فورماتى" + +#~ msgid "_24 hour format" +#~ msgstr "_24 سائەت فورماتى" + +#~ msgid "Preferences" +#~ msgstr "مايىللىق" + +#~ msgid "" +#~ "Can't add a new workspace because maximum workspaces limit has been " +#~ "reached." +#~ msgstr "" +#~ "يېڭى خىزمەت رايونى قوشالمايدۇ چۈنكى ئەڭ كۆپ خىزمەت رايون چېكىگە يەتتى." + +#~ msgid "Can't remove the first workspace." +#~ msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋەتكىلى بولمايدۇ." + +#~ msgid "Overview workspace view mode" +#~ msgstr "خىزمەت رايون كۆرۈنۈش ھالىتى ھەققىدە قىسقىچە بايان" + +#~ msgid "" +#~ "The selected workspace view mode in the overview. Supported values are " +#~ "\"single\" and \"grid\"." +#~ msgstr "" +#~ "قىسقىچە باياندىكى تاللانغان خىزمەت رايونىنىڭ كۆرۈنۈش ھالىتى. ئىشلىتىشكە " +#~ "بولىدىغان قىممەتلەر «يەككە» ۋە «سېتكا»" + +#~ msgid "Drag here to add favorites" +#~ msgstr "بۇ جايغا سۆرەپ يىغقۇچقا قوش" + +#~ msgid "Find" +#~ msgstr "ئىزدە" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..064e7be --- /dev/null +++ b/po/uk.po @@ -0,0 +1,3131 @@ +# Ukrainian translation for gnome-shell. +# Copyright (C) 2010 Free Software Foundation +# This file is distributed under the same license as the gnome-shell package. +# Maxim V. Dziumanenko , 2010. +# Daniel Korostil , 2013, 2014, 2015, 2016, 2017. +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-09-06 18:25+0300\n" +"Last-Translator: Daniel Korostil \n" +"Language-Team: linux.org.ua\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Система" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Показувати перелік сповіщень" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Перейти до активних сповіщень" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Показати огляд" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Показати всі програми" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Відкрити меню програм" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:152 +msgid "Shell Extensions" +msgstr "Розширення оболонки" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Налаштувати розширення GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Керування вікнами та запуск програм" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Увімкнути внутрішні засоби, які будуть корисними для розробників і " +"випробування при натисненні Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Надає доступ до внутрішніх засобів зневаджування та спостереження через Alt-" +"F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Увімкнути розширення UUID" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Розширення GNOME Shell мають властивості «UUID»; цей ключ перелічує " +"розширення, які потрібно завантажувати. Вимкнення розширень ігноруватиме ці " +"налаштування для розширень, які з'являються в обох переліках. Також можете " +"орудувати цим переліком через способи EnableExtension і DisableExtension " +"DBus DisableExtension DBus на org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Вимкнути розширення користувача" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Вимкнути всі розширення, які користувач увімкнув сам, без використання " +"параметра «enabled-extension»." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Вимикає перевірку сумісності версії розширення" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell завантажуватиме тільки розширення, які вимагають поточну версію. " +"Увімкнення цього параметра вимкне цю перевірку і спробує завантажувати всі " +"розширення, навіть попри те, що версії можуть бути несумісні." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Перелічити ідентифікатори файла стільниці для улюблених програм" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Програми, які відповідають цьому ідентифікатору, буде показано в ділянці " +"улюбленого." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Огляд вибору програми" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Індекс поточного розміщення вибору в огляді списку програм." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Історія для команд (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Історія для пошуку дзеркальних діалогів" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Завжди показувати пункт меню «Вийти» у меню користувача." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Цей ключ перевизначає автоматичне приховування пункту меню «Вийти» за умови, " +"що користувач або сеанс тільки один." + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Чи запам'ятовувати пароль для монтування шифрованих або віддалених файлових " +"систем" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Середовище вимагатиме пароль, коли змонтовано зашифрований пристрій або " +"віддалену файлову систему. Якщо пароль можна зберегти для подальшого вжитку, " +"то з'явиться параметр «Запам'ятати пароль». Цей ключ вказує типовий стан " +"цього параметра." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Чи типовий адаптер Bluetooth зв'язаний з якимось пристроєм" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Оболонка покаже меню Bluetooth лише у випадку, коли адаптер Bluetooth " +"увімкнено або пристрій зв'язано з типовим адаптером. Якщо типовий адаптер " +"ніколи не був зв'язаний з жодним пристроєм, то його буде скинуто." + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "Keybinding to open the application menu" +msgstr "Комбінація клавіш, щоб відкрити меню програм" + +#: data/org.gnome.shell.gschema.xml.in:102 +msgid "Keybinding to open the application menu." +msgstr "Комбінація клавіш, щоб відкрити меню програм." + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Комбінація клавіш, щоб «Показати програми»" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Комбінація клавіш, щоб «Показати програми» в огляді діяльності." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the overview" +msgstr "Комбінація клавіш, щоб відкрити огляд" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "Keybinding to open the Activities Overview." +msgstr "Комбінація клавіш, щоб відкрити огляд діяльності." + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень." + +#: data/org.gnome.shell.gschema.xml.in:130 +msgid "Keybinding to focus the active notification" +msgstr "Комбінація клавіш, щоб перейти до активних сповіщень" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to focus the active notification." +msgstr "Комбінація клавіш, щоб перейти до активних сповіщень." + +#: data/org.gnome.shell.gschema.xml.in:137 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Комбінація клавіш, що призупиняє й відновлює всіх запущених посередників, зі " +"зневаджувальною метою" + +#: data/org.gnome.shell.gschema.xml.in:146 +msgid "Which keyboard to use" +msgstr "Яку клавіатуру використовувати" + +#: data/org.gnome.shell.gschema.xml.in:147 +msgid "The type of keyboard to use." +msgstr "Тип клавіатури." + +#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:185 +msgid "Limit switcher to current workspace." +msgstr "Обмежити перемикач на поточний робочий простір." + +#: data/org.gnome.shell.gschema.xml.in:159 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Якщо це вказано, то тільки програми з поточного робочого простору будуть " +"показані в перемикачі. Інакше — програми з усіх просторів." + +#: data/org.gnome.shell.gschema.xml.in:176 +msgid "The application icon mode." +msgstr "Режим піктограм для програм." + +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Налаштовує яким чином вікна показуються в перемикачі. Допустимі значення: " +"«thumbnail-only» (показує мініатюру вікна), «app-icon-only» (показує тільки " +"піктограми програм) або «both» (обидва)." + +#: data/org.gnome.shell.gschema.xml.in:186 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Якщо це вказано, то тільки вікна з поточного робочого простору будуть " +"показані в перемикачі. Інакше — вікна з усіх просторів." + +#: data/org.gnome.shell.gschema.xml.in:197 +msgid "Attach modal dialog to the parent window" +msgstr "Приєднати модальне вікно до батьківського вікна" + +#: data/org.gnome.shell.gschema.xml.in:198 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +#: data/org.gnome.shell.gschema.xml.in:231 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Цей ключ перевизначає ключ у org.gnome.mutter, коли запущено GNOME Shell." + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Увімкнути розбиття країв, коли кладуться вікна на краї екрана" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces are managed dynamically" +msgstr "Робочі простори організовуються динамічно" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Workspaces only on primary monitor" +msgstr "Робочий простір лише на основному моніторі" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Затримувати зміни фокусу миші, поки вказівник не перестане рухатись" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Мережевий вхід" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:120 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "Помилка завантаження вікна параметрів для %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 +msgid "Cancel" +msgstr "Скасувати" + +#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450 +msgid "Next" +msgstr "Далі" + +#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:348 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Розблокувати" + +#: js/gdm/authPrompt.js:216 +msgctxt "button" +msgid "Sign In" +msgstr "Увійти" + +#: js/gdm/loginDialog.js:308 +msgid "Choose Session" +msgstr "Виберіть сеанс" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:458 +msgid "Not listed?" +msgstr "Немає в переліку?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:888 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(наприклад, користувач або %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:261 +msgid "Username: " +msgstr "Користувач:" + +#: js/gdm/loginDialog.js:1236 +msgid "Login Window" +msgstr "Вікно входу" + +#: js/gdm/util.js:346 +msgid "Authentication error" +msgstr "Помилка розпізнавання" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:478 +msgid "(or swipe finger)" +msgstr "(або проведіть пальцем)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:99 +#| msgid "Power Off" +msgctxt "search-result" +msgid "Power off" +msgstr "Вимкнути" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:102 +msgid "power off;shutdown" +msgstr "вимкнути" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:106 +#| msgid "Lock Screen" +msgctxt "search-result" +msgid "Lock screen" +msgstr "Заблокувати екран" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:109 +#| msgid "Lock Screen" +msgid "lock screen" +msgstr "заблокувати екран" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:113 +#| msgid "Log Out" +msgctxt "search-result" +msgid "Log out" +msgstr "Вийти" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:116 +msgid "logout;sign off" +msgstr "вийти;завершити роботу" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:120 +#| msgid "Suspend" +msgctxt "search-result" +msgid "Suspend" +msgstr "Призупинити" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:123 +#| msgid "Suspend" +msgid "suspend;sleep" +msgstr "Призупинити;сон" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:127 +#| msgid "Switch User" +msgctxt "search-result" +msgid "Switch user" +msgstr "Змінити користувача" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:130 +#| msgid "Switch User" +msgid "switch user" +msgstr "змінити користувача" + +#. 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 "Заблокувати орієнтацію" + +#. 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 "заблокувати орієнтацію" + +#: js/misc/util.js:122 +msgid "Command not found" +msgstr "Команди не знайдено" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:155 +msgid "Could not parse command:" +msgstr "Неможливо розібрати команду:" + +#: js/misc/util.js:163 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Не вдалось виконати «%s»:" + +#: js/misc/util.js:180 +msgid "Just now" +msgstr "Просто зараз" + +#: js/misc/util.js:182 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d хвилина тому" +msgstr[1] "%d хвилини тому" +msgstr[2] "%d хвилин тому" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d година тому" +msgstr[1] "%d години тому" +msgstr[2] "%d годин тому" + +#: js/misc/util.js:188 +msgid "Yesterday" +msgstr "Учора" + +#: js/misc/util.js:190 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d день тому" +msgstr[1] "%d дні тому" +msgstr[2] "%d днів тому" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d тиждень тому" +msgstr[1] "%d тижні тому" +msgstr[2] "%d тижнів тому" + +#: js/misc/util.js:196 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d місяць тому" +msgstr[1] "%d місяці тому" +msgstr[2] "%d місяців тому" + +#: js/misc/util.js:198 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d рік тому" +msgstr[1] "%d роки тому" +msgstr[2] "%d років тому" + +#. Translators: Time in 24h format +#: js/misc/util.js:228 +msgid "%H∶%M" +msgstr "%H:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:234 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Учора, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:240 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:246 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:252 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:257 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:263 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Учора, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:269 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:275 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:281 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:66 +msgid "Hotspot Login" +msgstr "Вхід в точку" + +#: js/portalHelper/main.js:112 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"З'єднання з точкою — небезпечне. Пароль та інша інформація, яку ви вводите " +"на цій сторінці, може бути перехоплено людьми поруч." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:63 js/ui/status/location.js:395 +msgid "Deny Access" +msgstr "Заборонити доступ" + +#: js/ui/accessDialog.js:64 js/ui/status/location.js:398 +msgid "Grant Access" +msgstr "Надати доступ" + +#: js/ui/appDisplay.js:809 +msgid "Frequently used applications will appear here" +msgstr "Часто використовувані програми будуть з'являтись тут" + +#: js/ui/appDisplay.js:930 +msgid "Frequent" +msgstr "Частовживане" + +#: js/ui/appDisplay.js:937 +msgid "All" +msgstr "Усе" + +#: js/ui/appDisplay.js:1915 +msgid "New Window" +msgstr "Нове вікно" + +#: js/ui/appDisplay.js:1929 +msgid "Launch using Dedicated Graphics Card" +msgstr "Запустити через відповідну графічну плату" + +#: js/ui/appDisplay.js:1956 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Вилучити з улюбленого" + +#: js/ui/appDisplay.js:1962 +msgid "Add to Favorites" +msgstr "Додати до улюбленого" + +#: js/ui/appDisplay.js:1972 +msgid "Show Details" +msgstr "Показати подробиці" + +#: js/ui/appFavorites.js:140 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s додано до улюбленого." + +#: js/ui/appFavorites.js:174 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s вилучено з улюбленого." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Вибрати звуковий пристрій" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Параметри звуку" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Навушники" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Гарнітура" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:221 +msgid "Microphone" +msgstr "Мікрофон" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Змінити тло…" + +#: js/ui/backgroundMenu.js:21 js/ui/status/nightLight.js:51 +msgid "Display Settings" +msgstr "Параметри екрана" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:265 +msgid "Settings" +msgstr "Параметри" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "Н" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "В" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "Ч" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "С" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "Попередній місяць" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr "Наступний місяць" + +#: js/ui/calendar.js:605 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:660 +msgid "Week %V" +msgstr "Тиждень %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 +msgctxt "event list time" +msgid "All Day" +msgstr "Увесь день" + +#: js/ui/calendar.js:862 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:866 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: js/ui/calendar.js:1086 +msgid "No Notifications" +msgstr "Немає сповіщень" + +#: js/ui/calendar.js:1089 +msgid "No Events" +msgstr "Немає подій" + +#: js/ui/calendar.js:1117 +msgid "Clear All" +msgstr "Очистити все" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:44 +#, javascript-format +#| msgid "“%s” is ready" +msgid "“%s” is not responding." +msgstr "«%s» не відповідає." + +#: js/ui/closeDialog.js:45 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Можете трошки зачекати відновлення активності або примусово закрити програму." + +#: js/ui/closeDialog.js:61 +msgid "Force Quit" +msgstr "Примусово закрити" + +#: js/ui/closeDialog.js:64 +msgid "Wait" +msgstr "Зачекати" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Зовнішній пристрій під'єднано" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Зовнішній пристрій від'єднано" + +#: js/ui/components/autorunManager.js:354 +#, javascript-format +msgid "Open with %s" +msgstr "Відкрити через %s" + +#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 +msgid "Password:" +msgstr "Пароль:" + +#: js/ui/components/keyring.js:140 +msgid "Type again:" +msgstr "Введіть знову:" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:261 +#: js/ui/status/network.js:355 js/ui/status/network.js:939 +msgid "Connect" +msgstr "З'єднатись" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:205 js/ui/components/networkAgent.js:217 +#: js/ui/components/networkAgent.js:245 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:275 +msgid "Password: " +msgstr "Пароль:" + +#. static WEP +#: js/ui/components/networkAgent.js:210 +msgid "Key: " +msgstr "Ключ:" + +#: js/ui/components/networkAgent.js:249 +msgid "Identity: " +msgstr "Тотожність" + +#: js/ui/components/networkAgent.js:251 +msgid "Private key password: " +msgstr "Пароль закритого ключа:" + +#: js/ui/components/networkAgent.js:263 +msgid "Service: " +msgstr "Служба:" + +#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:638 +msgid "Authentication required by wireless network" +msgstr "Потрібна аутентифікація для радіомережі" + +#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:639 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "Потрібно паролі або зашифровані ключі для доступу до радіомережі «%s»." + +#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:642 +msgid "Wired 802.1X authentication" +msgstr "Дротова аутентифікація 802.1X" + +#: js/ui/components/networkAgent.js:299 +msgid "Network name: " +msgstr "Назва мережні: " + +#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:646 +msgid "DSL authentication" +msgstr "Аутентифікація DSL" + +#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:652 +msgid "PIN code required" +msgstr "Потрібен код PIN" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:653 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Потрібен код PIN для мобільних широкосмугових пристроїв" + +#: js/ui/components/networkAgent.js:313 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:659 +msgid "Mobile broadband network password" +msgstr "пароль до мобільної широкосмугової радіомережі" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:643 +#: js/ui/components/networkAgent.js:647 js/ui/components/networkAgent.js:660 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Пароль потрібен для з'єднання з «%s»." + +#: js/ui/components/networkAgent.js:627 js/ui/status/network.js:1720 +msgid "Network Manager" +msgstr "Керування мережею" + +#: js/ui/components/polkitAgent.js:43 +msgid "Authentication Required" +msgstr "Потрібна автентифікація" + +#: js/ui/components/polkitAgent.js:71 +msgid "Administrator" +msgstr "Адміністратор" + +#: js/ui/components/polkitAgent.js:151 +msgid "Authenticate" +msgstr "Аутентифікація" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:328 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Вибачте, це не cпрацювало. Спробуйте ще." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:799 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s тепер відомий як %s" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:186 +msgid "Windows" +msgstr "Вікна" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +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 +msgid "Dash" +msgstr "Риска" + +#. 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 +msgid "%B %e %Y" +msgstr "%e %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:82 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:144 +msgid "Add world clocks…" +msgstr "Додати світові годинники…" + +#: js/ui/dateMenu.js:145 +msgid "World Clocks" +msgstr "Світові годинники" + +#: js/ui/dateMenu.js:224 +msgid "Weather" +msgstr "Погода" + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:286 +#, javascript-format +msgid "%s all day." +msgstr "%s весь день." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:292 +#, javascript-format +msgid "%s, then %s later." +msgstr "%s, потім %s." + +#. Translators: %s is a weather condition like "Clear sky"; see +#. libgweather for the possible condition strings. If at all +#. possible, the sentence should match the grammatical case etc. of +#. the inserted conditions. +#: js/ui/dateMenu.js:298 +#, javascript-format +msgid "%s, then %s, followed by %s later." +msgstr "%s, потім %s, а ще згодом %s." + +#: js/ui/dateMenu.js:309 +msgid "Select a location…" +msgstr "Виберіть територію…" + +#: js/ui/dateMenu.js:312 +msgid "Loading…" +msgstr "Завантаження…" + +#. Translators: %s is a temperature with unit, e.g. "23℃" +#: js/ui/dateMenu.js:318 +#, javascript-format +msgid "Feels like %s." +msgstr "На відчуття %s." + +#: js/ui/dateMenu.js:321 +msgid "Go online for weather information" +msgstr "Увійти в мережу за відомістями про погоду" + +#: js/ui/dateMenu.js:323 +msgid "Weather information is currently unavailable" +msgstr "Наразі інформації про погоду недоступна" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Завершити сеанс %s" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Завершити сеанс" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s вийде автоматично через %d секунду." +msgstr[1] "%s вийде автоматично через %d секунди." +msgstr[2] "%s вийде автоматично через %d секунд." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Вихід автоматично через %d секунду." +msgstr[1] "Вихід автоматично через %d секунди." +msgstr[2] "Вихід автоматично через %d секунд." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Вийти" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Вимкнути" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Установити оновлення і вимкнути" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Система автоматично вимкнеться через %d секунду." +msgstr[1] "Система автоматично вимкнеться через %d секунди." +msgstr[2] "Система автоматично вимкнеться через %d секунд." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Установити оновлення, які в черзі" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Перезапустити" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Вимкнути" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Перезапустити" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Система автоматично перезапуститься через %d секунду." +msgstr[1] "Система автоматично перезапуститься через %d секунди." +msgstr[2] "Система автоматично перезапуститься через %d секунд." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Перезапустити і встановити оновлення" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Система автоматично перезапуститься та встановить оновлення через %d секунду." +msgstr[1] "" +"Система автоматично перезапуститься та встановить оновлення через %d секунди." +msgstr[2] "" +"Система автоматично перезапуститься та встановить оновлення через %d секунд." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Перезапустити та встановити" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Установити та вимкнути" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Вимкнути після встановлення оновлень" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Перезапустити і встановити оновлення" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s буде встановлено після перезапуску. Оновлення може тривати довго: " +"переконайтесь, що ви зробили резервні копії та комп'ютер під'єднано до " +"живлення." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "Працює від заряду батареї: під'єднайте перед установлення оновлень." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "Деякі програми зайняті або мають незбережені дані." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Інші користувачі є в сеансі." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:670 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (віддалено)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:673 +#, javascript-format +msgid "%s (console)" +msgstr "%s (консоль)" + +#: js/ui/extensionDownloader.js:201 +msgid "Install" +msgstr "Встановити" + +#: js/ui/extensionDownloader.js:206 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Звантажити і встановити «%s» з extensions.gnome.org?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:59 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s бажає наслідувати скорочення" + +#: js/ui/inhibitShortcutsDialog.js:60 +msgid "Application wants to inhibit shortcuts" +msgstr "Програма бажає наслідувати скорочення" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:69 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Можна відновити скорочення, натиснувши %s." + +#: js/ui/inhibitShortcutsDialog.js:74 +msgid "Deny" +msgstr "Заборонити" + +#: js/ui/inhibitShortcutsDialog.js:80 +msgid "Allow" +msgstr "Дозволити" + +#: js/ui/keyboard.js:738 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "Клавіатура" + +#: js/ui/lookingGlass.js:642 +msgid "No extensions installed" +msgstr "Не встановлено розширення" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:696 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s не випустила жодної помилки. " + +#: js/ui/lookingGlass.js:702 +msgid "Hide Errors" +msgstr "Сховати помилки" + +#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766 +msgid "Show Errors" +msgstr "Показати помилки" + +#: js/ui/lookingGlass.js:715 +msgid "Enabled" +msgstr "Увімкнено" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:718 subprojects/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Вимкнено" + +#: js/ui/lookingGlass.js:720 +msgid "Error" +msgstr "Помилка" + +#: js/ui/lookingGlass.js:722 +msgid "Out of date" +msgstr "Застаріло" + +#: js/ui/lookingGlass.js:724 +msgid "Downloading" +msgstr "Звантаження" + +#: js/ui/lookingGlass.js:748 +msgid "View Source" +msgstr "Переглянути джерело" + +#: js/ui/lookingGlass.js:757 +msgid "Web Page" +msgstr "Веб-сторінка" + +#: js/ui/messageTray.js:1493 +msgid "System Information" +msgstr "Інформація про систему" + +#: js/ui/mpris.js:211 +msgid "Unknown artist" +msgstr "Невідомий виконавець" + +#: js/ui/mpris.js:212 +msgid "Unknown title" +msgstr "Невідома назва" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Повернути" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Огляд" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Введіть для пошуку…" + +#: js/ui/padOsd.js:103 +msgid "New shortcut…" +msgstr "Нове скорочення…" + +#: js/ui/padOsd.js:152 +msgid "Application defined" +msgstr "Програму визначено" + +#: js/ui/padOsd.js:153 +msgid "Show on-screen help" +msgstr "Показати екранну довідку" + +#: js/ui/padOsd.js:154 +msgid "Switch monitor" +msgstr "Перемкнути монітор" + +#: js/ui/padOsd.js:155 +msgid "Assign keystroke" +msgstr "Призначити клавішу" + +#: js/ui/padOsd.js:220 +msgid "Done" +msgstr "Зроблено" + +#: js/ui/padOsd.js:734 +msgid "Edit…" +msgstr "Редагувати…" + +#: js/ui/padOsd.js:774 js/ui/padOsd.js:879 +msgid "None" +msgstr "Немає" + +#: js/ui/padOsd.js:833 +msgid "Press a button to configure" +msgstr "Натисніть кнопку, щоб налаштувати" + +#: js/ui/padOsd.js:834 +msgid "Press Esc to exit" +msgstr "Натисність клавішу «Esc», щоб вийти" + +#: js/ui/padOsd.js:837 +msgid "Press any key to exit" +msgstr "Натисніть будь-яку клавішу, щоб вийти" + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Вийти" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Діяльність" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Система" + +#: js/ui/panel.js:812 +msgid "Top Bar" +msgstr "Верхня панель" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:291 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Введіть команду" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160 +msgid "Close" +msgstr "Закрити" + +#: js/ui/runDialog.js:277 +msgid "Restart is not available on Wayland" +msgstr "Перезапускання недоступне в сеансі Wayland" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "Перезапускання…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:88 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:147 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d нове повідомлення" +msgstr[1] "%d нових повідомлення" +msgstr[2] "%d нових повідомлень" + +#: js/ui/screenShield.js:149 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d нове сповіщення" +msgstr[1] "%d нових сповіщення" +msgstr[2] "%d нових сповіщень" + +#: js/ui/screenShield.js:452 js/ui/status/system.js:284 +msgid "Lock" +msgstr "Заблокувати" + +#: js/ui/screenShield.js:715 +msgid "GNOME needs to lock the screen" +msgstr "GNOME потребує заблокувати екран" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. 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 +msgid "Unable to lock" +msgstr "Неможливо заблокувати" + +#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 +msgid "Lock was blocked by an application" +msgstr "Блокування заборонено програмою" + +#: js/ui/search.js:651 +msgid "Searching…" +msgstr "Пошуки…" + +#: js/ui/search.js:653 +msgid "No results." +msgstr "Безрезультатно." + +#: js/ui/search.js:777 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "ще %d" +msgstr[1] "ще %d" +msgstr[2] "ще %d" + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Копіювати" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Вставити" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Показати текст" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Сховати текст" + +#: js/ui/shellMountOperation.js:315 +msgid "Password" +msgstr "Пароль" + +#: js/ui/shellMountOperation.js:336 +msgid "Remember Password" +msgstr "Запам'ятати пароль" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Доступність" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Масштаб" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Читання з екрану" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Екранна клавіатура" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Візуальні тривоги" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Липкі клавіші" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Повільні клавіші" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Пружні клавіші" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Клавіші миші" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Висока контрастність" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Більший текст" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627 +msgid "Bluetooth Settings" +msgstr "Параметри Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d під'єднано" +msgstr[1] "%d під'єднано" +msgstr[2] "%d під'єднано" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "Вимкнено" + +#: js/ui/status/bluetooth.js:140 +msgid "On" +msgstr "Увімкнено" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1299 +msgid "Turn On" +msgstr "Увімкнути" + +#: 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 "Вимкнути" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Яскравість" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "Показати розкладку клавіатури" + +#: js/ui/status/location.js:89 js/ui/status/location.js:197 +msgid "Location Enabled" +msgstr "Місцевість залучено" + +#: js/ui/status/location.js:90 js/ui/status/location.js:198 +msgid "Disable" +msgstr "Вимкнути" + +#: js/ui/status/location.js:91 +msgid "Privacy Settings" +msgstr "Параметри конфіденційності" + +#: js/ui/status/location.js:196 +msgid "Location In Use" +msgstr "Місцевість використовується" + +#: js/ui/status/location.js:200 +msgid "Location Disabled" +msgstr "Місцевість вимкнено" + +#: js/ui/status/location.js:201 +msgid "Enable" +msgstr "Увімкнути" + +#. Translators: %s is an application name +#: js/ui/status/location.js:388 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Надати %s доступ до вашого розміщення?" + +#: js/ui/status/location.js:389 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Доступ до місця перебування можна змінити в будь-яку мить у параметрах " +"конфіденційності." + +#: js/ui/status/network.js:104 +msgid "" +msgstr "<невідомо>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 js/ui/status/network.js:1328 +#, javascript-format +msgid "%s Off" +msgstr "%s вимкнено" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:457 +#, javascript-format +msgid "%s Connected" +msgstr "%s під'єднано" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:462 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s нескеровано" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:465 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s від'єднується" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:472 js/ui/status/network.js:1320 +#, javascript-format +msgid "%s Connecting" +msgstr "%s під'єднується" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:475 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s вимагає засвідчення" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:483 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Бракує мікропрограми для %s" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:487 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s недоступний" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:490 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s під'єднано невдало" + +#: js/ui/status/network.js:506 +msgid "Wired Settings" +msgstr "Параметри мережі" + +#: js/ui/status/network.js:548 +msgid "Mobile Broadband Settings" +msgstr "параметри мобільної радіомережі" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:591 js/ui/status/network.js:1325 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s вимкнено апаратно" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:595 +#, javascript-format +msgid "%s Disabled" +msgstr "%s вимкнено" + +#: js/ui/status/network.js:635 +msgid "Connect to Internet" +msgstr "Під'єднатись до інтернету" + +#: js/ui/status/network.js:833 +msgid "Airplane Mode is On" +msgstr "Режим «у літаку» ввімкнено" + +#: js/ui/status/network.js:834 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi вимкнено, коли режим «у літаку» ввімкнено." + +#: js/ui/status/network.js:835 +msgid "Turn Off Airplane Mode" +msgstr "Вимкнути режим «у літаку»" + +#: js/ui/status/network.js:844 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi вимкнено" + +#: js/ui/status/network.js:845 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi потрібно ввімкнути, щоб з'єднатись з мережею." + +#: js/ui/status/network.js:846 +msgid "Turn On Wi-Fi" +msgstr "Увімкнути Wi-Fi" + +#: js/ui/status/network.js:871 +msgid "Wi-Fi Networks" +msgstr "Мережі Wi-Fi" + +#: js/ui/status/network.js:873 +msgid "Select a network" +msgstr "Вибрати мережу" + +#: js/ui/status/network.js:903 +msgid "No Networks" +msgstr "Немає мереж" + +#: js/ui/status/network.js:924 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Натисніть апаратну кнопку, щоб вимкнути" + +#: js/ui/status/network.js:1191 +msgid "Select Network" +msgstr "Виберіть мережу" + +#: js/ui/status/network.js:1197 +msgid "Wi-Fi Settings" +msgstr "Параметри Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1316 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s точка доступу" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1331 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s не під'єднано" + +#: js/ui/status/network.js:1435 +msgid "connecting…" +msgstr "З'єднання…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1438 +msgid "authentication required" +msgstr "Потрібна аутентифікація" + +#: js/ui/status/network.js:1440 +msgid "connection failed" +msgstr "не вдалось з'єднатись" + +#: js/ui/status/network.js:1494 +msgid "VPN Settings" +msgstr "Параметри VPN" + +#: js/ui/status/network.js:1498 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1508 +msgid "VPN Off" +msgstr "VPN вимкнено" + +#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Налаштування мережі" + +#: js/ui/status/network.js:1603 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s з'єднання через дріт" +msgstr[1] "%s з'єднання через дріт" +msgstr[2] "%s з'єднань через дріт" + +#: js/ui/status/network.js:1607 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s з'єднання через Wi-Fi" +msgstr[1] "%s з'єднання через Wi-Fi" +msgstr[2] "%s з'єднань через Wi-Fi" + +#: js/ui/status/network.js:1611 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s з'єднання через модем" +msgstr[1] "%s з'єднання через модем" +msgstr[2] "%s з'єднань через модем" + +#: js/ui/status/network.js:1759 +msgid "Connection failed" +msgstr "Не вдалось з'єднатись" + +#: js/ui/status/network.js:1760 +msgid "Activation of network connection failed" +msgstr "Не вдалось увімкнути мережеве з'єднання" + +#: js/ui/status/nightLight.js:68 +msgid "Night Light Disabled" +msgstr "Нічне світло вимкнено" + +#: js/ui/status/nightLight.js:69 +msgid "Night Light On" +msgstr "Нічне світло ввімкнено" + +#: js/ui/status/nightLight.js:70 +msgid "Resume" +msgstr "Повторити" + +#: js/ui/status/nightLight.js:71 +msgid "Disable Until Tomorrow" +msgstr "Вимкнути до завтра" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Енергетичні параметри" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Повністю заряджено" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Оцінювання…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Залишилось %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Зарядиться через %d∶%02d (%d %%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Режим «у літаку» ввімкнено" + +#: js/ui/status/system.js:228 +msgid "Switch User" +msgstr "Змінити користувача" + +#: js/ui/status/system.js:240 +msgid "Log Out" +msgstr "Вийти" + +#: js/ui/status/system.js:252 +msgid "Account Settings" +msgstr "Параметри облікових записів" + +#: js/ui/status/system.js:269 +msgid "Orientation Lock" +msgstr "Напрямлене блокування" + +#: js/ui/status/system.js:295 +msgid "Suspend" +msgstr "Призупинити" + +#: js/ui/status/system.js:305 +msgid "Power Off" +msgstr "Вимкнути" + +#: js/ui/status/volume.js:128 +msgid "Volume changed" +msgstr "Гучність змінено" + +#: js/ui/status/volume.js:170 +msgid "Volume" +msgstr "Гучність" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +#| msgid "Error" +msgid "Mirror" +msgstr "Віддзеркалення" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "Join Displays" +msgstr "Приєднання екранів" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "External Only" +msgstr "Тільки зовнішній" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:36 +msgid "Built-in Only" +msgstr "Тільки вбудований" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Увійти як інший користувач" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Розблокувати вікно" + +#: js/ui/viewSelector.js:190 +msgid "Applications" +msgstr "Програми" + +#: js/ui/viewSelector.js:194 +msgid "Search" +msgstr "Пошук" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "«%s» готовий" + +#: js/ui/windowManager.js:72 +msgid "Do you want to keep these display settings?" +msgstr "Зберегти ці параметри екрана?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:84 +msgid "Revert Settings" +msgstr "Повернути параметри" + +#: js/ui/windowManager.js:87 +msgid "Keep Changes" +msgstr "Зберегти зміни" + +#: js/ui/windowManager.js:105 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Зміни параметрів буде повернуто через %d секунду" +msgstr[1] "Зміни параметрів буде повернуто через %d секунди" +msgstr[2] "Зміни параметрів буде повернуто через %d секунд" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:660 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Згорнути" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Відновити розгорнуте" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Розгорнути" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Перемістити" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Змінити розмір" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Перемістити заголовок на екран" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Завжди зверху" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Завжди на видимому робочому просторі" + +#: js/ui/windowMenu.js:103 +msgid "Move to Workspace Left" +msgstr "Перемістити у робочий простір ліворуч" + +#: js/ui/windowMenu.js:108 +msgid "Move to Workspace Right" +msgstr "Перемістити у робочий простір праворуч" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Up" +msgstr "Перемістити у робочий простір зверху" + +#: js/ui/windowMenu.js:118 +msgid "Move to Workspace Down" +msgstr "Перемістити у робочу область знизу" + +#: js/ui/windowMenu.js:134 +msgid "Move to Monitor Up" +msgstr "Перемістити до монітору зверху" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Перемістити до монітору знизу" + +#: js/ui/windowMenu.js:146 +msgid "Move to Monitor Left" +msgstr "Перемістити до монітору ліворуч" + +#: js/ui/windowMenu.js:152 +msgid "Move to Monitor Right" +msgstr "Перемістити до монітору праворуч" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Календар Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:380 +msgid "Print version" +msgstr "Показати версію" + +#: src/main.c:386 +msgid "Mode used by GDM for login screen" +msgstr "Використовуваний режим GDM для екрану входу" + +#: src/main.c:392 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Використовувати вказаний режим, приклад, «gdm» для вікна входу" + +#: src/main.c:398 +msgid "List possible modes" +msgstr "Перелік можливих режимів" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Невідомо" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Не вдалося запустити «%s»" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Пароль не збігається." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Пароль не може бути порожнім" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Вікно авторизації відхилено користувачем" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u вихід" +msgstr[1] "%u виходи" +msgstr[2] "%u виходів" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u вхід" +msgstr[1] "%u входи" +msgstr[2] "%u входів" + +#: subprojects/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Системні звуки" + +#~ msgid "Hide tray" +#~ msgstr "Сховати лоток" + +#~ msgid "Status Icons" +#~ msgstr "Піктограми стану" + +#~ msgid "Events" +#~ msgstr "Події" + +#~ msgid "Notifications" +#~ msgstr "Сповіщення" + +#~ msgid "Clear section" +#~ msgstr "Очистити розділ" + +#~ msgid "Media" +#~ msgstr "Носій" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Параметри розширень GNOME Shell" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Переадресування інтернетного засвідчення" + +#~ msgid "Not In Use" +#~ msgstr "Не використовується" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Показати дні тижня в календарі" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Якщо це так, буде показано дні тижня у календарі згідно з ISO." + +#~ msgid "Use as Internet connection" +#~ msgstr "Використовувати як інтернетне з'єднання" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s вимагає доступ до вашого розміщення." + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Оболонка GNOME (поверх wayland)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "Під'єднано %d пристрій" +#~ msgstr[1] "Під'єднано %d пристрої" +#~ msgstr[2] "Під'єднано %d пристроїв" + +#~ msgid "Authentication required" +#~ msgstr "Потрібне засвідчення" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Батарея" + +#~ msgid "Airplane Mode" +#~ msgstr "У літаку" + +#~ msgid "Show the message list" +#~ msgstr "Показати перелік повідомлень" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgid "Invitation" +#~ msgstr "Запрошення" + +#~ msgid "Call" +#~ msgstr "Виклик" + +#~ msgid "File Transfer" +#~ msgstr "Пересилання файла" + +#~ msgid "Chat" +#~ msgstr "Балачка" + +#~ msgid "Invitation to %s" +#~ msgstr "Запрошення на %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s запрошує долучитись до %s" + +#~ msgid "Decline" +#~ msgstr "Відмовити" + +#~ msgid "Accept" +#~ msgstr "Прийняти" + +#~ msgid "Video call from %s" +#~ msgstr "Відеовиклик від %s" + +#~ msgid "Call from %s" +#~ msgstr "Виклик від %s" + +#~ msgid "Answer" +#~ msgstr "Відповісти" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s надсилає %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s бажає дозволу бачити, коли ви у мережі" + +#~ msgid "Authentication failed" +#~ msgstr "Помилка автентифікації" + +#~ msgid "Encryption error" +#~ msgstr "Помилка шифрування" + +#~ msgid "Certificate not provided" +#~ msgstr "Сертифікат не надано" + +#~ msgid "Certificate untrusted" +#~ msgstr "Сертифікат ненадійний" + +#~ msgid "Certificate expired" +#~ msgstr "Сертифікат застарів" + +#~ msgid "Certificate not activated" +#~ msgstr "Сертифікат не активовано" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Сертифікат не збігається з назвою вузла" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Сертифікат не збігається з відбитком" + +#~ msgid "Certificate self-signed" +#~ msgstr "Сертифікат самопідписано" + +#~ msgid "Status is set to offline" +#~ msgstr "Стан змінено на «поза мережею»" + +#~ msgid "Certificate is invalid" +#~ msgstr "Сертифікат недійсний" + +#~ msgid "Connection has been refused" +#~ msgstr "З'єднання відкинуто" + +#~ msgid "Connection can't be established" +#~ msgstr "З'єднання неможливо встановити" + +#~ msgid "Connection has been lost" +#~ msgstr "З'єднання втрачено" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Цей обліковий запис уже з'єднано із сервером" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "З'єднання заміщено новим через той самий ресурс" + +#~ msgid "The account already exists on the server" +#~ msgstr "Обліковий запис уже існує на сервері" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Сервер надто зайнятий, щоб обробити з'єднання" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Сертифікат відкликано" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Сертифікат використовує небезпечні алгоритми шифрування або " +#~ "криптографічно заслабкий" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Тривалість сертифіката сервера, або глибина його ланцюга, перевищує " +#~ "обмеження, які накладає бібліотека криптографії" + +#~ msgid "Internal error" +#~ msgstr "Внутрішня помилка" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Неможливо під'єднатись до %s" + +#~ msgid "View account" +#~ msgstr "Переглянути обліковий запис" + +#~ msgid "Captive Portal" +#~ msgstr "Прив'язаний портал" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Нд" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Пн" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "Вт" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Ср" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "Чт" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Пт" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Сб" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Нічого не заплановано" + +#~ msgid "Today" +#~ msgstr "Сьогодні" + +#~ msgid "Tomorrow" +#~ msgstr "Завтра" + +#~ msgid "This week" +#~ msgstr "Цей тиждень" + +#~ msgid "Next week" +#~ msgstr "Наступний тиждень" + +#~ msgid "Removable Devices" +#~ msgstr "Змінні носії" + +#~ msgid "Eject" +#~ msgstr "Витягнути" + +#~ msgid "Unmute" +#~ msgstr "Озвучити" + +#~ msgid "Mute" +#~ msgstr "Приглушити" + +#~ msgid "Open Calendar" +#~ msgstr "Відкрити календар" + +#~ msgid "Date & Time Settings" +#~ msgstr "Параметри дати та часу" + +#~ msgid "Open" +#~ msgstr "Відкрити" + +#~ msgid "Remove" +#~ msgstr "Вилучити" + +#~ msgid "Clear Messages" +#~ msgstr "Очистити повідомлення" + +#~ msgid "Notification Settings" +#~ msgstr "Параметри сповіщення" + +#~ msgid "Tray Menu" +#~ msgstr "Меню лотка" + +#~ msgid "No Messages" +#~ msgstr "Немає повідомлень" + +#~ msgid "Message Tray" +#~ msgstr "Лоток повідомлень" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "Максимальний рівень точності місця перебування." + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "Налаштовує максимальний рівень точності місця перебування, яке можна " +#~ "побачити. Допустимі варіанти — «off» (вимкнути прокладання місцевості), " +#~ "«country», «city», «neighborhood», «street» і «exact» (зазвичай вимагає " +#~ "дані з пристрою GPS). Майте на увазі, це тільки керування над тим, що " +#~ "програми можуть бачити і вони знайти перебування користувача через власні " +#~ "мережеві ресурси (хоча з точністю до вулиці в найкращому випадку)." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Коригування кнопок на заголовку " + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Цей ключ нехтує ключем у org.gnome.desktop.wm.preferences, коли запущено " +#~ "GNOME Shell." + +#~ msgid "Extension" +#~ msgstr "Розширення" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Вибрати розширення для налаштування через список вище." + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "unavailable" +#~ msgstr "недоступний" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Перелік категорій, які слід показувати як теки" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Кожну назву категорії в цьому переліку буде представлено як теку у " +#~ "вигляді програми, а не показуватись у тексті головного екрана." + +#~ msgid "Authorization request from %s" +#~ msgstr "Запит про авторизацію від %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Пристрій %s потребує прив'язання до цього комп'ютера" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Пристрій %s потребує доступ до служби «%s»" + +#~ msgid "Grant this time only" +#~ msgstr "Надати лише цього разу" + +#~ msgid "Reject" +#~ msgstr "Відмовити" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Сполучення підтвердження для %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "Підвердьте, чи ключ «%06d» збігається з ключем на пристрої." + +#~ msgid "Matches" +#~ msgstr "Збігається" + +#~ msgid "Does not match" +#~ msgstr "Не збігається" + +#~ msgid "Pairing request for %s" +#~ msgstr "Запит на сполучення для %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Будь ласка, введіть PIN, згаданий на пристрої." + +#~ msgid "OK" +#~ msgstr "Гаразд" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Вибачте, забракло розуму на сьогодні:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s каже Оракул" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Settings Menu" +#~ msgstr "Меню параметрів" + +#~ msgid "Screenshots" +#~ msgstr "Знімки" + +#~ msgid "Record a screencast" +#~ msgstr "Зняти відеозапис екрана" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Чи потрібно збирати статистику про вживаність програм " + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "Shell зазвичай показує активні програми, щоб продемонструвати " +#~ "найуживаніші (наприклад, у пускачі). Поки ці дані будуть утримуватись " +#~ "закритими, ви можете забажати вимкнути це через особисті мотиви. Будь " +#~ "ласка, завважте, це не вилучить уже збережені дані." + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Внутрішнє використання для зберігання останніх явно присутніх у обміні " +#~ "повідомленнями, встановлених користувачем. Це значення з нумерації " +#~ "TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Внутрішнє використання для зберігання останніх станів присутностей у " +#~ "сеансі для користувача. Це значення з нумерації GsmPresenceStatus." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Комбінація клавіш, щоб керувати записуванням екрана" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "" +#~ "Комбінація клавіш, щоб запускати/зупиняти вбудований записувач екрана." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Частота кадрів для запису трансляцій з екрана." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Частота кадрів кінцевої трансляції з екрана записано в записувачі GNOME " +#~ "Shell як «frames-per-second»." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "" +#~ "Канал даних GStreamer використовується для кодування транcляції з екрана" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Вказує канал даних GStreamer для кодування запису. Звідси відповідний " +#~ "синтаксис для gst-launch. Канал даних повинен мати нез'єднаний " +#~ "приймальний буфер, де відео записано. Зазвичай воно має нез'єднане " +#~ "джерело буфера; вивід з цього буфера буде записано в вихідний файл. Однак " +#~ "канал даних також відповідати за власний вивід — це може бути використано " +#~ "для відправлення виводу до сервера через протокол shout2send чи будь-який " +#~ "інший. Коли не вказано або вказано порожнє значення, буде використано " +#~ "типовий канал даних. Натепер це «vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux» і записує у " +#~ "WEBM, використовуючи кодек VP8. %T використовується як заповнювач для " +#~ "гостей в оптимальній кількості потоків на систему." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Розширення файла для зберігання трансляції з екрана" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Назва файла для запису трансляції з екрана буде унікальною, яка основана " +#~ "на даті, та буде використовувати це розширення. Слід змінити це, коли " +#~ "записуєте в різні формати контейнера. " + +#~ msgid "Session…" +#~ msgstr "Сеанс…" + +#~ msgid "Power" +#~ msgstr "Вимкнути" + +#~ msgid "Restart" +#~ msgstr "Перезапустити" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Трансляція з екрана від %d %t" + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "Натисніть «Завершити сеанс», щоб вийти з усіх програм і системи." + +#~ msgid "Logging out of the system." +#~ msgstr "Вихід із системи." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "Натисніть «Вимкнути», щоб вийти з усіх програм і системи." + +#~ msgid "Powering off the system." +#~ msgstr "Вимкнення системи." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Натисніть «Перезапустити», щоб вийти з усіх програм і перезапустити " +#~ "систему." + +#~ msgid "Restarting the system." +#~ msgstr "Перезапуск системи." + +#~ msgid "Universal Access Settings" +#~ msgstr "Параметри універсального доступу" + +#~ msgid "Visibility" +#~ msgstr "Видимість" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Налаштувати новий пристрій…" + +#~ msgid "Send Files…" +#~ msgstr "Надіслати файли…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Параметри клавіатури" + +#~ msgid "Mouse Settings" +#~ msgstr "Параметри миші" + +#~ msgid "Region & Language Settings" +#~ msgstr "Параметри регіону та мови" + +#~ msgid "Volume, network, battery" +#~ msgstr "Гучність, мережа, батарея" + +#~ msgid "disabled" +#~ msgstr "вимкнено" + +#~ msgid "cable unplugged" +#~ msgstr "кабель від'єднано" + +#~ msgid "More…" +#~ msgstr "Ще…" + +#~ msgid "Wired" +#~ msgstr "Дротова" + +#~ msgid "Auto Ethernet" +#~ msgstr "Автоматично Ethernet" + +#~ msgid "Auto broadband" +#~ msgstr "Автоматично радіомережа" + +#~ msgid "Auto dial-up" +#~ msgstr "Автоматично додзвін" + +#~ msgid "Auto %s" +#~ msgstr "Автоматично %s" + +#~ msgid "Auto bluetooth" +#~ msgstr "Автоматично Bluetooth" + +#~ msgid "Auto wireless" +#~ msgstr "Автоматично бездротова мережа" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "%d hour remaining" +#~ msgid_plural "%d hours remaining" +#~ msgstr[0] "Залишилось %d година" +#~ msgstr[1] "Залишилось %d години" +#~ msgstr[2] "Залишилось %d годин" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "Залишилось %d %s %d %s" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "година" +#~ msgstr[1] "години" +#~ msgstr[2] "годин" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "хвилина" +#~ msgstr[1] "хвилини" +#~ msgstr[2] "хвилин" + +#~ msgid "%d minute remaining" +#~ msgid_plural "%d minutes remaining" +#~ msgstr[0] "Залишилось %d хвилина" +#~ msgstr[1] "Залишилось %d хвилини" +#~ msgstr[2] "Залишилось %d хвилин" + +#~ msgid "AC Adapter" +#~ msgstr "Блок живлення" + +#~ msgid "Laptop Battery" +#~ msgstr "Батарея ноутбука" + +#~ msgid "Monitor" +#~ msgstr "Монітор" + +#~ msgid "Mouse" +#~ msgstr "Миша" + +#~ msgid "PDA" +#~ msgstr "КПК" + +#~ msgid "Cell Phone" +#~ msgstr "Мобільний телефон" + +#~ msgid "Media Player" +#~ msgstr "Програвач" + +#~ msgid "Tablet" +#~ msgstr "Планшет" + +#~ msgid "Computer" +#~ msgstr "Комп'ютер" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Невідомо" + +#~ msgid "Available" +#~ msgstr "Доступний" + +#~ msgid "Busy" +#~ msgstr "Зайнятий" + +#~ msgid "Invisible" +#~ msgstr "Невидимий" + +#~ msgid "Away" +#~ msgstr "Відійшов" + +#~ msgid "Idle" +#~ msgstr "Бездіяльний" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Ваш стан балачки буде змінено на «зайнятий»" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Сповіщення вимкнено, разом з повідомленнями балачки. Ваш стан у мережі " +#~ "скореговано так, щоб інші знали, що ви можете не побачити їхніх " +#~ "повідомлень." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Вимкнення може спричинити до втрати їхніх незбережених даних." + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Увійти" + +#~ msgid "APPLICATIONS" +#~ msgstr "ПРОГРАМИ" + +#~ msgid "SETTINGS" +#~ msgstr "ПАРАМЕТРИ" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgctxt "event list time" +#~ msgid "%l:%M %p" +#~ msgstr "%l:%M %p" + +#~ msgid "Subscription request" +#~ msgstr "Заявка на підписку" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Надіслано о %X, %A" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Надіслано %A, %B %d, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "не вдалось з'єднатись з %s" + +#~ msgid "Reconnect" +#~ msgstr "Перез'єднатись" + +#~ msgid "tray" +#~ msgstr "лоток" + +#~ msgid "Browse Files..." +#~ msgstr "Огляд файлів…" + +#~ msgid "Error browsing device" +#~ msgstr "Помилка перегляду пристрою…" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Потрібний пристрій неможливо переглянути, помилка — «%s»" + +#~ msgid "More..." +#~ msgstr "Більше…" + +#~ msgid "Wireless" +#~ msgstr "Бездротова" + +#~ msgid "VPN Connections" +#~ msgstr "З'єднання VPN" + +#~ msgid "System Settings" +#~ msgstr "Системні параметри" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Ваші улюблені пасхальні яйця" + +#~ msgid "United Kingdom" +#~ msgstr "Великобританія" + +#~ msgid "Default" +#~ msgstr "Типово" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "вимкнено постачальника OpenSearch" + +#~ msgid "Show time with seconds" +#~ msgstr "Показати час з секундами" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Якщо це так, буде показано секунди в часі." + +#~ msgid "Show date in clock" +#~ msgstr "Показати дату в годиннику" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Якщо це так, дата буде показуватись у годиннику разом з часом." + +#~ msgid "CONTACTS" +#~ msgstr "КОНТАКТИ" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %b %e, %R:%S" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %b %e, %R" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %b %e, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Не вдалось демонтувати «%s»" + +#~ msgid "Retry" +#~ msgstr "Повторити" + +#~ msgid "Connect to..." +#~ msgstr "З'єднатися з…" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "МІСЦЯ ТА ПРИСТРОЇ" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Неправильний пароль, спробуйте ще раз" + +#~ msgid "%s is online." +#~ msgstr "%s в мережі." + +#~ msgid "%s is offline." +#~ msgstr "%s поза мережею." + +#~ msgid "%s is away." +#~ msgstr "%s відійшов." + +#~ msgid "%s is busy." +#~ msgstr "%s зайнятий." + +#~ msgid "Hidden" +#~ msgstr "Прихований" + +#~ msgid "Power Off..." +#~ msgstr "Вимкнення живлення…" + +#~ msgid "Online Accounts" +#~ msgstr "Мережевий обліковий запис" + +#~ msgid "Log Out..." +#~ msgstr "Завершити сеанс…" + +#~ msgid "Home" +#~ msgstr "Домівка" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "RECENT ITEMS" +#~ msgstr "ОСТАННІ ПУНКТИ" + +#~ msgid "Show password" +#~ msgstr "Показати пароль" + +#~ msgid "%s has finished starting" +#~ msgstr "%s завершив запуск" + +#~ msgid "Home Folder" +#~ msgstr "Домашня тека" + +#~ msgid "Localization Settings" +#~ msgstr "Параметри локалізації" + +#~ msgid "You're now connected to mobile broadband connection '%s'" +#~ msgstr "Зараз ви з'єднані через мобільну радіомережу «%s»" + +#~ msgid "You're now connected to wireless network '%s'" +#~ msgstr "Зараз ви з'єднані через бездротову мережу «%s»" + +#~ msgid "You're now connected to wired network '%s'" +#~ msgstr "Зараз ви з'єднані через дротову мережу «%s»" + +#~ msgid "You're now connected to VPN network '%s'" +#~ msgstr "Зараз ви з'єднані через мережу VPN «%s»" + +#~ msgid "Less than a minute ago" +#~ msgstr "Менше хвилини тому" + +#~ msgid "Shut Down" +#~ msgstr "Вимкнути" + +#~ msgid "Click Shut Down to quit these applications and shut down the system." +#~ msgstr "Натисніть «Вимкнути», щоб вийти з усіх програм і вимкнути систему." + +#~ msgid "The system will shut down automatically in %d seconds." +#~ msgstr "Систему буде вимкнено автоматично через %d секунд." + +#~ msgid "Shutting down the system." +#~ msgstr "Вимкнення системи." + +#~ msgid "Confirm" +#~ msgstr "Підтвердити" + +#~ msgid "Panel" +#~ msgstr "Панель" + +#~ msgid "PREFERENCES" +#~ msgstr "ПАРАМЕТРИ" + +#~ msgid "Clip the crosshairs at the center" +#~ msgstr "Обрізати перехрестя в центрі" + +#~ msgid "Color of the crosshairs" +#~ msgstr "Колір перехрестя" + +#~ msgid "" +#~ "Determines the length of the vertical and horizontal lines that make up " +#~ "the crosshairs." +#~ msgstr "" +#~ "Визначає довжину вертикальних і горизонтальних ліній, які складають " +#~ "перехрестя." + +#~ msgid "" +#~ "Determines the position of the magnified mouse image within the magnified " +#~ "view and how it reacts to system mouse movement. The values are - none: " +#~ "no mouse tracking; - centered: the mouse image is displayed at the center " +#~ "of the zoom region (which also represents the point under the system " +#~ "mouse) and the magnified contents are scrolled as the system mouse moves; " +#~ "- proportional: the position of the magnified mouse in the zoom region is " +#~ "proportionally the same as the position of the system mouse on screen; - " +#~ "push: when the magnified mouse intersects a boundary of the zoom region, " +#~ "the contents are scrolled into view." +#~ msgstr "" +#~ "Визначає позиції збільшеного зображення миші у збільшеному перегляді і як " +#~ "це реагує на рух системної миші. Значення — none: без стеження за мишкою; " +#~ "— centered: зображення миші показується в центрі області масштабу (який " +#~ "також змальовує точку під системною мишею) і збільшений вміст " +#~ "прокручується в міру руху системної миші; — proportional: позиція " +#~ "збільшеної миші в області масштабу пропорційно однакова до позиції " +#~ "системної миші на екрані; — push: коли збільшена миша перетинає межу " +#~ "області масштабу, вміст прокручується в перегляд." + +#~ msgid "" +#~ "Determines the transparency of the crosshairs, from fully opaque to fully " +#~ "transparent." +#~ msgstr "" +#~ "Визначає прозорість перехрестя, від повністю непрозорого до абсолютно " +#~ "прозорого." + +#~ msgid "" +#~ "Determines whether the crosshairs intersect the magnified mouse sprite, " +#~ "or are clipped such that the ends of the horizontal and vertical lines " +#~ "surround the mouse image." +#~ msgstr "" +#~ "Визначає, чи перехрестя перетинає спрайт збільшеної миші, або чи обрізано " +#~ "так, що кінці горизонтальних і вертикальних ліній межують із зображенням " +#~ "миші. " + +#~ msgid "Enable lens mode" +#~ msgstr "Увімкнути режим лінзи" + +#~ msgid "" +#~ "Enables/disables display of crosshairs centered on the magnified mouse " +#~ "sprite." +#~ msgstr "" +#~ "Вмикає/вимикає показ перехрестя зосередженого на спрайті збільшеної миші." + +#~ msgid "" +#~ "For centered mouse tracking, when the system pointer is at or near the " +#~ "edge of the screen, the magnified contents continue to scroll such that " +#~ "the screen edge moves into the magnified view." +#~ msgstr "" +#~ "Для зосередженого стеження за мишею, коли системний вказівник близько до " +#~ "краю екрана, збільшений вміст і надалі гортається так, ніби краї екрана " +#~ "переходять у збільшений перегляд." + +#~ msgid "Length of the crosshairs" +#~ msgstr "Довжина перехрестя" + +#~ msgid "Magnification factor" +#~ msgstr "Коефіцієнт збільшення" + +#~ msgid "Mouse Tracking Mode" +#~ msgstr "Режим стеження за мишою" + +#~ msgid "Opacity of the crosshairs" +#~ msgstr "Непрозорість перехрестя" + +#~ msgid "Scroll magnified contents beyond the edges of the desktop" +#~ msgstr "Гортати збільшений вміст за краями стільниці" + +#~ msgid "Show or hide crosshairs" +#~ msgstr "Показати або сховати перехрестя" + +#~ msgid "Show or hide the magnifier" +#~ msgstr "Показати або сховати лупу" + +#~ msgid "Show or hide the magnifier and all of its zoom regions." +#~ msgstr "Показати або сховати лупу і всі її області масштабу." + +#~ msgid "" +#~ "The color of the the vertical and horizontal lines that make up the " +#~ "crosshairs." +#~ msgstr "" +#~ "Колір вертикальних і горизонтальних ліній, які складають перехрестя." + +#~ msgid "" +#~ "The magnified view either fills the entire screen, or occupies the top-" +#~ "half, bottom-half, left-half, or right-half of the screen." +#~ msgstr "" +#~ "Збільшений перегляд заповнює ввесь екран або займає верхню половину, " +#~ "нижню половину, ліву половину чи праву половину на екрані." + +#~ msgid "" +#~ "The power of the magnification. A value of 1.0 means no magnification. A " +#~ "value of 2.0 doubles the size." +#~ msgstr "" +#~ "Степінь збільшення. Значення 1.0 означає, що нема збільшення. Значення " +#~ "2.0 — подвійний розмір." + +#~ msgid "Thickness of the crosshairs" +#~ msgstr "Товщина перехрестя" + +#~ msgid "" +#~ "Whether the magnified view should be centered over the location of the " +#~ "system mouse and move with it." +#~ msgstr "" +#~ "Чи збільшений перегляд повинен зосередитись на адресі системної миші і " +#~ "рухатись з нею." + +#~ msgid "" +#~ "Width of the vertical and horizontal lines that make up the crosshairs." +#~ msgstr "" +#~ "Ширина вертикальних і горизонтальних ліній, які складають перехрестя." + +#~ msgid "Shut Down..." +#~ msgstr "Вимкнути…" + +#~ msgid "Search your computer" +#~ msgstr "Пошук на комп'ютері" + +#~ msgid "Drag here to add favorites" +#~ msgstr "Перетягніть сюди для додавання до улюбленого" + +#~ msgid "Find" +#~ msgstr "Знайти" + +#~ msgid "Sidebar" +#~ msgstr "Бічна панель" + +#~ msgid "System Preferences..." +#~ msgstr "Параметри системи..." + +#~ msgid "Recent Documents" +#~ msgstr "Недавні документи" diff --git a/po/uz@cyrillic.po b/po/uz@cyrillic.po new file mode 100644 index 0000000..b4b5db7 --- /dev/null +++ b/po/uz@cyrillic.po @@ -0,0 +1,2064 @@ +# Uzbek (Cyrillic) translation for gnome-shell. +# Copyright (C) 2014 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Bahodir Mansurov <6ahodir@gmail.com>, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2016-09-07 09:41+0000\n" +"PO-Revision-Date: 2016-09-25 09:14-0400\n" +"Last-Translator: Bahodir Mansurov <6ahodir@gmail.com>\n" +"Language-Team: Uzbek (Cyrillic) <>\n" +"Language: uz@cyrillic\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-DamnedLies-Scope: partial\n" +"X-Generator: Poedit 1.8.9\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Система" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Хабарнома рўйхатини кўрсатиш" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Фаол хабарномага диққат қилиш" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Обзорни кўрсатиш" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Барча дастурларни кўрсатиш" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Дастур менюсини очиш" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME Shell кенгайтма мосламалари" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "GNOME Shell кенгайтмаларини созлаш" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Ойналарни бошқариш ва дастурларни очиш" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Alt-F2дан тузувчилар ва текширувчилар учун фойдали ички асбобларни ёқиш" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Alt-F2 диалог ойнаси орқали ички созлаш ва кузатиш асбобларига рухсат бериш" + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Ёқиладиган кенгайтма UUIDлари" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell кенгайтмаларининг UUID хоссаси бор; бу калит юкланиши керак " +"бўлган кенгайтмаларни рўйхатда кўрсатади. Юкланишни истайдиган кенгайтма " +"ушбу рўйхатда бўлиши керак. Сиз бу рўйхатни org.gnome.Shellдаги D-Busнинг " +"EnableExtension ва DisableExtension функциялари орақли ҳам бошқаришингиз " +"мумкин." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disables the validation of extension version compatibility" +msgstr "Кенгайтма версияси мослигини текширишни ўчириб қўяди" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell ушбу ишлаётган версияни қўллашини билдирган кенгайтмаларнигина " +"юклайди. Ушбу танловни белгиласангиз бу текширув ўчириб қўйилади ва, қайси " +"версияни қўллашидан қатъий назар, барча кенгайтмалар юкланади." + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "List of desktop file IDs for favorite applications" +msgstr "Танланган дастурлар учун иш столи файл IDлари рўйхати" + +#: data/org.gnome.shell.gschema.xml.in:36 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Ушбу идентификаторга мос келувчи дастурлар танланганлар майдонида " +"кўрсатилади." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "App Picker View" +msgstr "Дастур танлагич кўриниши" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "Index of the currently selected view in the application picker." +msgstr "Дастур танлагичдаги белгиланган кўриниш индекси." + +#: data/org.gnome.shell.gschema.xml.in:50 +msgid "History for command (Alt-F2) dialog" +msgstr "(Alt-F2) диалог ойначаси буйруқлар тарихи" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:55 +msgid "History for the looking glass dialog" +msgstr "Шаффоф диалог ойнаси кўришлар тарихи" + +#: data/org.gnome.shell.gschema.xml.in:59 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "Фойдаланувчи менюсида \"Сеансни якунлаш\" менюсини ҳар доим кўрсатиш." + +#: data/org.gnome.shell.gschema.xml.in:60 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"Ушбу калит битта фойдаланувчили системада \"Сеансни якунлаш\" менюсини " +"автоматик яширишни белгилаб беради." + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Шифрланган ёки масофавий файл системаларини улаганда махфий сўзни эслаб " +"қолиш ёки йўқлиги" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"GNOME Shell шифрланган ёки масофавий файл системаларини улаганда махфий " +"сўзни сўрайди. Агар махфий сўз келажакда ишлатиш учун сақлаб бўлинса " +"\"Махфий сўзни эслаб қолиш\" белгилаш катакчаси кўрсатилади. Ушбу калит ўша " +"белгилаш катакчасининг сукут ҳолатини ўрнатади." + +#: data/org.gnome.shell.gschema.xml.in:77 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "Bluetooth адаптери сукут бўйича бирор ускунага уланганми" + +#: data/org.gnome.shell.gschema.xml.in:78 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Bluetooth адаптери ёниқ ёки унга ускуналар боғлаб қўйилган бўлса Bluetooth " +"менюси кўринади. Агар сукут бўйича адаптерга уланган ускуналар бўлмаса, ушбу " +"параметр ташлаб юборилади." + +#: data/org.gnome.shell.gschema.xml.in:93 +msgid "Keybinding to open the application menu" +msgstr "Дастур менюсини очиш учун клавишалар бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:94 +msgid "Keybinding to open the application menu." +msgstr "Дастур менюсини очиш учун клавишалар бирикмаси." + +#: data/org.gnome.shell.gschema.xml.in:100 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "\"Дастурларни кўрсатиш\" кўринишини очиш учун клавишалар бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:101 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "" +"Фаолиятлар обзорида \"Дастурларни кўрсатиш\"кўриниши учун клавишалар " +"бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:108 +msgid "Keybinding to open the overview" +msgstr "Обзорни очиш учун клавишалар бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the Activities Overview." +msgstr "Фаолиятлар обзорини очиш учун клавишалар бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:115 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Хабарнома рўйхати очиб-ёпиш учун клавишалар бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Хабарнома рўйхати очиб-ёпиш учун клавишалар бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:122 +msgid "Keybinding to focus the active notification" +msgstr "Фаол хабарномага диққат қилиш учун клавишалар бирикмаси" + +#: data/org.gnome.shell.gschema.xml.in:123 +msgid "Keybinding to focus the active notification." +msgstr "Фаол хабарномага диққат қилиш учун клавишалар бирикмаси." + +#: data/org.gnome.shell.gschema.xml.in:129 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "" +"Барча ишлаб турган анимацияларни тўхтатиб туриш ёки давом эттириш учун " +"клавишалар бирикмаси (созлаш мақсадиди)" + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Which keyboard to use" +msgstr "Қайси клавиатурани ишлатиш" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "The type of keyboard to use." +msgstr "Ишлатиладиган клавиатура тури." + +#: data/org.gnome.shell.gschema.xml.in:150 +#: data/org.gnome.shell.gschema.xml.in:177 +msgid "Limit switcher to current workspace." +msgstr "Переключателни фақат шу иш жойи билан чегаралаш." + +#: data/org.gnome.shell.gschema.xml.in:151 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Агар белгиланса, ушбу иш жойида ойнаси бор барча дастурлар ўзгартирувчи " +"тугмачада кўринади. Акс ҳолда, барча дастурлар ҳисобга олинади." + +#: data/org.gnome.shell.gschema.xml.in:168 +msgid "The application icon mode." +msgstr "Дастур нишончаси режими." + +#: data/org.gnome.shell.gschema.xml.in:169 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"Ўзгартирувчи тугмачада ойналар қандай кўринишини мослайди. Мавжуд қийматлар: " +"\"thumbnail-only\" (ойнанинг миниатурасини кўрсатади), \"app-icon-only" +"\" (фақтгини дастур нишончасини кўрсатади)." + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Агар белгиланса, фақатгина ушбу иш жойидаги ойналар переключателда " +"кўрсатилади. Акс ҳолда,барча ойналар ҳисобга олинади." + +#: data/org.gnome.shell.gschema.xml.in:189 +msgid "Attach modal dialog to the parent window" +msgstr "Модал диалог ойнани бош ойнасига маҳкамлаш" + +#: data/org.gnome.shell.gschema.xml.in:190 +#: data/org.gnome.shell.gschema.xml.in:199 +#: data/org.gnome.shell.gschema.xml.in:207 +#: data/org.gnome.shell.gschema.xml.in:215 +#: data/org.gnome.shell.gschema.xml.in:223 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"GNOME Shell ишга тушганида ушбу калит org.gnome.mutterдаги калитни бошқадан " +"белгилайди." + +#: data/org.gnome.shell.gschema.xml.in:198 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "" +"Ойналар экран четларига олиб борилганда уларнинг ўлчамларини автоматик " +"равишда ўзгартириш" + +#: data/org.gnome.shell.gschema.xml.in:206 +msgid "Workspaces are managed dynamically" +msgstr "Иш жойлари фаол равишда бошқарилади" + +#: data/org.gnome.shell.gschema.xml.in:214 +msgid "Workspaces only on primary monitor" +msgstr "Иш жойлари фақат асосий мониторда" + +#: data/org.gnome.shell.gschema.xml.in:222 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "" +"Кўрсаткич юришдан тўхтамагунча сичқонча режимида диққатни ўзгратирмаслик" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Тармоққа кириш" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:117 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "%s учун параметрлар диалог ойнасини юклашда хатолик содир бўлди:" + +#: js/extensionPrefs/main.js:149 +msgid "GNOME Shell Extensions" +msgstr "GNOME Shell кенгайтмалари" + +#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 +#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179 +#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195 +#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916 +msgid "Cancel" +msgstr "Бекор қилиш" + +#: js/gdm/authPrompt.js:169 js/gdm/authPrompt.js:216 js/gdm/authPrompt.js:448 +msgid "Next" +msgstr "Кейинги" + +#: js/gdm/authPrompt.js:212 js/ui/shellMountOperation.js:403 +#: js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "Қулфни ечиш" + +#: js/gdm/authPrompt.js:214 +msgctxt "button" +msgid "Sign In" +msgstr "Кириш" + +#: js/gdm/loginDialog.js:285 +msgid "Choose Session" +msgstr "Сеансни танлаш" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:435 +msgid "Not listed?" +msgstr "Рўйхатда йўқми?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:854 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(мас. фойдаланувчи ёки %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271 +#: js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "Фойдаланувчи:" + +#: js/gdm/loginDialog.js:1196 +msgid "Login Window" +msgstr "Кириш Ойнаси" + +#: js/gdm/util.js:341 +msgid "Authentication error" +msgstr "Хақиқийлигини текширишда хатолик" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:473 +msgid "(or swipe finger)" +msgstr "(ёки ушбу мослама юзасида бармоғингизни юритинг)" + +#: js/misc/util.js:119 +msgid "Command not found" +msgstr "Буйруқ топилмади" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:152 +msgid "Could not parse command:" +msgstr "Буйруқни таҳлил қилиб бўлмади:" + +#: js/misc/util.js:160 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "\"%s\"ни бажариб бўлмади:" + +#. Translators: Time in 24h format +#: js/misc/util.js:191 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:197 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "Кеча, %H∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:203 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A, %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:209 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%B %d, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:215 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%B %d %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:220 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:226 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "Кеча, %l∶%M %p" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:232 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A, %l∶%M %p" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:238 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%B %d, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:244 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%B %d %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login +#. * window, until we know the title of the actual login page +#: js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "Ҳақиқийлигини текшириш учун қайта жўнатиш" + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:62 js/ui/status/location.js:426 +msgid "Deny Access" +msgstr "Рухсат бермаслик" + +#: js/ui/accessDialog.js:63 js/ui/status/location.js:429 +msgid "Grant Access" +msgstr "Рухсат бериш" + +#: js/ui/appDisplay.js:794 +msgid "Frequently used applications will appear here" +msgstr "Тез-тез ишлатиладиган дастурлар шу ерда пайдо бўлади" + +#: js/ui/appDisplay.js:914 +msgid "Frequent" +msgstr "Тез-тез ишлатиладиган" + +#: js/ui/appDisplay.js:921 +msgid "All" +msgstr "Барча" + +#: js/ui/appDisplay.js:1853 +msgid "New Window" +msgstr "Янги ойна" + +#: js/ui/appDisplay.js:1881 js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "Ёқтирганлар рўйхатидан ўчириш" + +#: js/ui/appDisplay.js:1887 +msgid "Add to Favorites" +msgstr "Ёқтирганлар рўйхатига қўшиш" + +#: js/ui/appDisplay.js:1897 +msgid "Show Details" +msgstr "Тафсилотларни кўрсатиш" + +#: js/ui/appFavorites.js:134 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "\"%s\" танланганлар рўйхатига қўшилди." + +#: js/ui/appFavorites.js:168 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "\"%s\" танланганлар рўйхатидан олиб ташланди." + +#: js/ui/audioDeviceSelection.js:59 +msgid "Select Audio Device" +msgstr "Аудио ускунани танлаш" + +#: js/ui/audioDeviceSelection.js:69 +msgid "Sound Settings" +msgstr "Товуш мосламалари" + +#: js/ui/audioDeviceSelection.js:78 +msgid "Headphones" +msgstr "Наушниклар" + +#: js/ui/audioDeviceSelection.js:80 +msgid "Headset" +msgstr "Наушник" + +#: js/ui/audioDeviceSelection.js:82 js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "Микрофон" + +#: js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "Фонни ўзгартириш..." + +#: js/ui/backgroundMenu.js:21 +msgid "Display Settings" +msgstr "Дисплей мосламалари" + +#: js/ui/backgroundMenu.js:22 js/ui/status/system.js:374 +msgid "Settings" +msgstr "Мосламалар" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:47 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * 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 +msgctxt "grid sunday" +msgid "S" +msgstr "Я" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:78 +msgctxt "grid monday" +msgid "M" +msgstr "Д" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:80 +msgctxt "grid tuesday" +msgid "T" +msgstr "С" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:82 +msgctxt "grid wednesday" +msgid "W" +msgstr "Ч" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:84 +msgctxt "grid thursday" +msgid "T" +msgstr "П" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:86 +msgctxt "grid friday" +msgid "F" +msgstr "Ж" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:88 +msgctxt "grid saturday" +msgid "S" +msgstr "Ш" + +#: js/ui/calendar.js:442 +msgid "Previous month" +msgstr "Ўтган ой" + +#: js/ui/calendar.js:452 +msgid "Next month" +msgstr "Келаси ой" + +#: js/ui/calendar.js:605 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:660 +msgid "Week %V" +msgstr "Ҳафта %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:721 +msgctxt "event list time" +msgid "All Day" +msgstr "Куни бўйи" + +#: js/ui/calendar.js:836 +msgid "Events" +msgstr "Тадбирлар" + +#: js/ui/calendar.js:845 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/calendar.js:849 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%A, %B %d, %Y" + +#: js/ui/calendar.js:931 +msgid "Notifications" +msgstr "Хабарнома" + +#: js/ui/calendar.js:1082 +msgid "No Notifications" +msgstr "Хабарлар йўқ" + +#: js/ui/calendar.js:1085 +msgid "No Events" +msgstr "Тадбир йўқ" + +#: js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "Ташқи диск уланган" + +#: js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "Ташқи диск узилган" + +#: js/ui/components/autorunManager.js:355 +#, javascript-format +msgid "Open with %s" +msgstr "%s билан очиш" + +#: js/ui/components/keyring.js:120 js/ui/components/polkitAgent.js:315 +msgid "Password:" +msgstr "Махфий сўз:" + +#: js/ui/components/keyring.js:153 +msgid "Type again:" +msgstr "Яна ёзинг:" + +#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269 +#: js/ui/status/network.js:352 js/ui/status/network.js:919 +msgid "Connect" +msgstr "Уланиш" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:233 js/ui/components/networkAgent.js:245 +#: js/ui/components/networkAgent.js:273 js/ui/components/networkAgent.js:293 +#: js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "Махфий сўз:" + +#. static WEP +#: js/ui/components/networkAgent.js:238 +msgid "Key: " +msgstr "Калит:" + +#: js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "Шахсият:" + +#: js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "Шахсий калитнинг махфий сўзи:" + +#: js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "Хизмат:" + +#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658 +msgid "Authentication required by wireless network" +msgstr "Симсиз тармоқ ҳақиқийликни текширишни талаб қиляпти" + +#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "" +"Симсиз \"%s\" тармоққа уланиш учун махфий сўзлар ёки шифрлаш калитлари талаб " +"қилинади." + +#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662 +msgid "Wired 802.1X authentication" +msgstr "Симли 802.1X алоқанинг ҳақиқийлигини текшириш" + +#: js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "Тармоқ номи:" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666 +msgid "DSL authentication" +msgstr "DSL ҳақиқийлигини текшириш" + +#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672 +msgid "PIN code required" +msgstr "PIN код талаб қилинади" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Катта йўлли мобил алоқа ускунаси уччун PIN код керак бўлади" + +#: js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN:" + +#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679 +msgid "Mobile broadband network password" +msgstr "Кенг йўлли мобил алоқа учун махфий сўз" + +#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663 +#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "\"%s\"га уланиш учун махфий сўз талаб қилинади." + +#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658 +msgid "Network Manager" +msgstr "Тармоқ бошқарувчиси" + +#: js/ui/components/polkitAgent.js:60 +msgid "Authentication Required" +msgstr "Ҳақиқийлигини текшириш талаб қилинади" + +#: js/ui/components/polkitAgent.js:102 +msgid "Administrator" +msgstr "Маъмур" + +#: js/ui/components/polkitAgent.js:182 +msgid "Authenticate" +msgstr "Ҳақиқийлигини текшириш" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:301 js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "Узр, ишламади. Яна ҳаракат қилиб кўринг." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:760 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s энди %s сифатида маълум" + +#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:155 +msgid "Windows" +msgstr "Ойналар" + +#: js/ui/dash.js:250 js/ui/dash.js:291 +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 +msgid "Dash" +msgstr "Дастурлар панели" + +#. 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:73 +msgid "%B %e %Y" +msgstr "%B %e %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:80 +msgid "%A %B %e %Y" +msgstr "%A, %B %e, %Y" + +#: js/ui/dateMenu.js:160 +msgid "Add world clocks…" +msgstr "Дунё соатларини қўшиш..." + +#: js/ui/dateMenu.js:161 +msgid "World Clocks" +msgstr "Дунё соатлари" + +#: js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "%s фойдаланувчи сеансини якунлаш" + +#: js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "Сеансни якунлаш" + +#: js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%sнинг сеанси %d сониядан сўнг автоматик равишда тугатилади." + +#: js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Сизнинг сеансинги %d сониядан сўнг автоматик равишда тугатилади." + +#: js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "Сеансни якунлаш" + +#: js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "Ўчириш" + +#: js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Янгиликларни ўрнатиш ва компьютерни ўчириш" + +#: js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Система %d сониядан сўнг автоматик равишда ўчади." + +#: js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Навбатдаги дастурий таъминот янгиликларини ўрнатиш" + +#: js/ui/endSessionDialog.js:94 js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "Ўчириб ёқиш" + +#: js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "Ўчириш" + +#: js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "Ўчириб ёқиш" + +#: js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Система %d сониядан сўнг автоматик равишда ўчиб ёнади." + +#: js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Ўчириб ёқиш ва янгиликларни ўрнатиш" + +#: js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Система %d сониядан сўнг автоматик равишда ўчиб ёнади ва янгиликларни " +"ўрнатади." + +#: js/ui/endSessionDialog.js:127 js/ui/endSessionDialog.js:147 +msgctxt "button" +msgid "Restart & Install" +msgstr "Ўчириб ёқиш ва ўрнатиш" + +#: js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Ўрнатиш ва компьютерни ўчириш" + +#: js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Янгиликлар ўрнатилгандан кейин компьютерни ўчириш" + +#: js/ui/endSessionDialog.js:137 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Ўчириб ёқиш ва янгиликларни ўрнатиш" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:142 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"Система қайта ишга тушганидан сўнг %s %s ўрнатилади. Янгилаш кўп вақт талаб " +"қилиши мумкин: захира нусхаси борлиги ва компьютер тармоққа уланганлигига " +"ишонч ҳосил қилинг." + +#: js/ui/endSessionDialog.js:361 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Компьютер батарея қувватида ишлаяпти: илтимос янгиликларни ўрнатишдан олдин " +"заряд ускунасини уланг." + +#: js/ui/endSessionDialog.js:378 +msgid "Some applications are busy or have unsaved work." +msgstr "Баъзи дастурлар банд ёки уларнинг сақланмаган ишлари бор." + +#: js/ui/endSessionDialog.js:385 +msgid "Other users are logged in." +msgstr "Системада бошқа фойдаланувчиларнинг фаол сеанслари мавжуд." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:671 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (масофавий)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:674 +#, javascript-format +msgid "%s (console)" +msgstr "%s (терминал)" + +#: js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "Ўрнатиш" + +#: js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "\"%s\" ни extensions.gnome.org сайтидан юклаб олиб ўрнатасизми?" + +#: js/ui/keyboard.js:742 js/ui/status/keyboard.js:782 +msgid "Keyboard" +msgstr "Клавиатура" + +#. translators: 'Hide' is a verb +#: js/ui/legacyTray.js:65 +msgid "Hide tray" +msgstr "Лаълини яшириш" + +#: js/ui/legacyTray.js:106 +msgid "Status Icons" +msgstr "Ҳолат нишончалари" + +#: js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "Бирорта кенгайтма ўрнатилмаган" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s бирор хато чиқармади." + +#: js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "Хатоларни яшириш" + +#: js/ui/lookingGlass.js:707 js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "Хатоларни кўрсатиш" + +#: js/ui/lookingGlass.js:716 +msgid "Enabled" +msgstr "Ёниқ" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:719 src/gvc/gvc-mixer-control.c:1866 +msgid "Disabled" +msgstr "Ўчиқ" + +#: js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "Хато" + +#: js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "Эски" + +#: js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "Юкланяпти" + +#: js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "Манбани кўриш" + +#: js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "Веб саҳифа" + +#: js/ui/messageList.js:543 +msgid "Clear section" +msgstr "Бўлимни тозалаш" + +#: js/ui/messageTray.js:1486 +msgid "System Information" +msgstr "Система ҳақида ахборот" + +#: js/ui/mpris.js:194 +msgid "Unknown artist" +msgstr "Номаълум артист" + +#: js/ui/mpris.js:195 +msgid "Unknown title" +msgstr "Номаълум сарлавҳа" + +#: js/ui/mpris.js:217 +msgid "Media" +msgstr "Ахборот воситалари" + +#: js/ui/overview.js:84 +msgid "Undo" +msgstr "Ўз ҳолига қайтариш" + +#: js/ui/overview.js:113 +msgid "Overview" +msgstr "Тепадан кўриниш" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:240 +msgid "Type to search…" +msgstr "Қидириш учун ёзинг..." + +#: js/ui/panel.js:358 +msgid "Quit" +msgstr "Чиқиш" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:414 +msgid "Activities" +msgstr "Фаолият" + +#: js/ui/panel.js:695 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Система" + +#: js/ui/panel.js:807 +msgid "Top Bar" +msgstr "Тепа панели" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "Буйруқни киритинг" + +#: js/ui/runDialog.js:111 js/ui/windowMenu.js:162 +msgid "Close" +msgstr "Ёпиш" + +#: js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "Ўчириб ёқиляпти..." + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:85 +msgid "%A, %B %d" +msgstr "%A, %B %d" + +#: js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%dта янги хат" + +#: js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%dта янги хабарномалар" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:382 +msgid "Lock" +msgstr "Қулфлаш" + +#: js/ui/screenShield.js:704 +msgid "GNOME needs to lock the screen" +msgstr "GNOME экранни қулфлаши керак" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291 +msgid "Unable to lock" +msgstr "Қулфлаб бўлмади" + +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292 +msgid "Lock was blocked by an application" +msgstr "Қайсидир дастур томонидан қулфлаш бекор қилинди" + +#: js/ui/search.js:617 +msgid "Searching…" +msgstr "Қидириляпти..." + +#: js/ui/search.js:619 +msgid "No results." +msgstr "Натижа йўқ." + +#: js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "Кўчириш" + +#: js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "Қўйиш" + +#: js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "Матнни кўрсатиш" + +#: js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "Матнни яшириш" + +#: js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "Махфий сўз" + +#: js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "Махфий сўзни эслаб қолиш" + +#: js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "Махсус имкониятлар" + +#: js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "Миқиёс" + +#: js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "Экран ўқувчи" + +#: js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "Экран клавиатураси" + +#: js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "Кўргазмали огоҳлантиришлар" + +#: js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "Ёпишқоқ клавишалар" + +#: js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "Секин клавишалар" + +#: js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "Сакраб турувчи клавиша" + +#: js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "Сичқонча тугмалари" + +#: js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "Юқори контрастли" + +#: js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "Катта матн" + +#: js/ui/status/bluetooth.js:47 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624 +msgid "Bluetooth Settings" +msgstr "Bluetooth мосламалари" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:136 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%dта уланган" + +#: js/ui/status/bluetooth.js:138 +msgid "Off" +msgstr "Ўчган" + +#: js/ui/status/bluetooth.js:140 +msgid "Not In Use" +msgstr "Ишлатилмаяпти" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279 +msgid "Turn On" +msgstr "Ёқиш" + +#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178 +#: js/ui/status/network.js:353 js/ui/status/network.js:1279 +#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90 +#: js/ui/status/rfkill.js:117 +msgid "Turn Off" +msgstr "Ўчириш" + +#: js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "Ёруғлик" + +#: js/ui/status/keyboard.js:805 +msgid "Show Keyboard Layout" +msgstr "Клавиатура жойлашувини кўрсатиш" + +#: js/ui/status/location.js:107 js/ui/status/location.js:215 +msgid "Location Enabled" +msgstr "Манзил ёқилган" + +#: js/ui/status/location.js:108 js/ui/status/location.js:216 +msgid "Disable" +msgstr "Ўчириш" + +#: js/ui/status/location.js:109 +msgid "Privacy Settings" +msgstr "Шахсий маълумот мосламалари" + +#: js/ui/status/location.js:214 +msgid "Location In Use" +msgstr "Манзил ишлатиляпти" + +#: js/ui/status/location.js:218 +msgid "Location Disabled" +msgstr "Манзил ўчирилган" + +#: js/ui/status/location.js:219 +msgid "Enable" +msgstr "Ёқиш" + +#. Translators: %s is an application name +#: js/ui/status/location.js:435 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "%s манзилингизни билишига рухсат берасизми?" + +#: js/ui/status/location.js:437 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "Манзилга рухсатни махфийлик мосламаларида ўзгартириш мумкин" + +#: js/ui/status/network.js:101 +msgid "" +msgstr "<номаълум>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:451 js/ui/status/network.js:1308 +#, javascript-format +msgid "%s Off" +msgstr "%s ўчган" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:454 +#, javascript-format +msgid "%s Connected" +msgstr "%s уланган" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:459 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s бошқарувда эмас" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:462 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s узиляпти" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:469 js/ui/status/network.js:1300 +#, javascript-format +msgid "%s Connecting" +msgstr "%s уланяпти" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:472 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s аутентификацияни талаб қилади" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:480 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%sнинг чоки йўқ" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:484 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s мавжуд эмас" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:487 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s алоқа қила олмади" + +#: js/ui/status/network.js:503 +msgid "Wired Settings" +msgstr "Симли алоқа мосламалари" + +#: js/ui/status/network.js:545 +msgid "Mobile Broadband Settings" +msgstr "Кенг йўлли мобил алоқа мосламалари" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:588 js/ui/status/network.js:1305 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s ускунаси ўчирилган" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:592 +#, javascript-format +msgid "%s Disabled" +msgstr "%s ўчиқ" + +#: js/ui/status/network.js:632 +msgid "Connect to Internet" +msgstr "Интернетга уланиш" + +#: js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "Самолёт режими ёнган" + +#: js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Самолёт режими ёниқ бўлганда Wi-Fi ўчган бўлади." + +#: js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "Самолёт режимини ўчириш" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi ўчган" + +#: js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Тармоққа уланиш учун Wi-Fi ёнган бўлиши керак." + +#: js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "Wi-Fiни ёқиш" + +#: js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi тармоқлар" + +#: js/ui/status/network.js:853 +msgid "Select a network" +msgstr "Тармоқни танлаш" + +#: js/ui/status/network.js:883 +msgid "No Networks" +msgstr "Бирорта тармоқ мавжуд эмас" + +#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "Ўчириш учун ускуна тугмасини ишлатиш" + +#: js/ui/status/network.js:1171 +msgid "Select Network" +msgstr "Тармоқни танлаш" + +#: js/ui/status/network.js:1177 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi Мосламалари" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s уланиш нуқтаси фаол" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1311 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s уланмаган" + +#: js/ui/status/network.js:1411 +msgid "connecting..." +msgstr "уланяпти..." + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1414 +msgid "authentication required" +msgstr "ҳақиқийлигини аниқлаш талаб қилинади" + +#: js/ui/status/network.js:1416 +msgid "connection failed" +msgstr "алоқа қилиб бўлмади" + +#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "Тармоқ мосламалари" + +#: js/ui/status/network.js:1484 +msgid "VPN Settings" +msgstr "VPN мосламалари" + +#: js/ui/status/network.js:1503 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1513 +msgid "VPN Off" +msgstr "VPN Ўчган" + +#: js/ui/status/network.js:1697 +msgid "Connection failed" +msgstr "Алоқа қилиб бўлмади" + +#: js/ui/status/network.js:1698 +msgid "Activation of network connection failed" +msgstr "Тармоқ алоқасини фаоллаштириб бўлмади" + +#: js/ui/status/power.js:61 +msgid "Power Settings" +msgstr "Қувват мосламалари" + +#: js/ui/status/power.js:77 +msgid "Fully Charged" +msgstr "Тўлиқ зарядланди" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:84 js/ui/status/power.js:90 +msgid "Estimating…" +msgstr "Баҳоланяпти..." + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:98 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "%d∶%02d қолди (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:103 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Тўлишига %d∶%02d қолди (%d%%)" + +#: js/ui/status/power.js:131 js/ui/status/power.js:133 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:88 +msgid "Airplane Mode On" +msgstr "Самолёт режими ёнган" + +#: js/ui/status/system.js:351 +msgid "Switch User" +msgstr "Фойдаланувчини алмаштириш" + +#: js/ui/status/system.js:356 +msgid "Log Out" +msgstr "Сеансни якунлаш" + +#: js/ui/status/system.js:361 +msgid "Account Settings" +msgstr "Профил созламалари" + +#: js/ui/status/system.js:378 +msgid "Orientation Lock" +msgstr "Ориентацияни қулфлаш" + +#: js/ui/status/system.js:386 +msgid "Suspend" +msgstr "Тўхтатиб қўймоқ" + +#: js/ui/status/system.js:389 +msgid "Power Off" +msgstr "Ўчган" + +#: js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "Овоз баландлиги ўзгарди" + +#: js/ui/status/volume.js:162 +msgid "Volume" +msgstr "Товуш" + +#: js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "Бошқа фойдаланувчи сифатида кириш" + +#: js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "Ойнани қулфини очиш" + +#: js/ui/viewSelector.js:159 +msgid "Applications" +msgstr "Дастурлар" + +#: js/ui/viewSelector.js:163 +msgid "Search" +msgstr "Қидириш" + +#: js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "\"%s\" тайёр" + +#: js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "Ушбу экран мосламаларини сақламоқчимисиз?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:82 +msgid "Revert Settings" +msgstr "Мосламаларни ўз ҳолига қайтариш" + +#: js/ui/windowManager.js:85 +msgid "Keep Changes" +msgstr "Ўзгаришларни сақлаш" + +#: js/ui/windowManager.js:103 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Мослама ўзгаришлари %d сониядан кейин ўз ҳолига қайтади" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:658 +#, javascript-format +msgid "%d x %d" +msgstr "%d x %d" + +#: js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "Йиғиш" + +#: js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "Олдинги ўлчамига қайтариш" + +#: js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "Катталаштирмоқ" + +#: js/ui/windowMenu.js:52 +msgid "Move" +msgstr "Кўчириш" + +#: js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "Ўлчамини ўзгартириш" + +#: js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "Сарлавҳа панелини экранга кўчириш" + +#: js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "Доим тепада" + +#: js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "Доим кўриниб турган иш жойига" + +#: js/ui/windowMenu.js:105 +msgid "Move to Workspace Left" +msgstr "Чапдаги иш жойига кўчириш" + +#: js/ui/windowMenu.js:110 +msgid "Move to Workspace Right" +msgstr "Ўнгдаги иш жойига кўчириш" + +#: js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "Тепадаги иш жойига кўчириш" + +#: js/ui/windowMenu.js:120 +msgid "Move to Workspace Down" +msgstr "Пастдаги иш жойига кўчириш" + +#: js/ui/windowMenu.js:136 +msgid "Move to Monitor Up" +msgstr "Тепадаги мониторга кўчириш" + +#: js/ui/windowMenu.js:142 +msgid "Move to Monitor Down" +msgstr "Пастдаги мониторга кўчириш" + +#: js/ui/windowMenu.js:148 +msgid "Move to Monitor Left" +msgstr "Чапдаги мониторга кўчириш" + +#: js/ui/windowMenu.js:154 +msgid "Move to Monitor Right" +msgstr "Ўнгдаги мониторга кўчириш" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution тақвими" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#. translators: +#. * The number of sound outputs on a particular device +#: src/gvc/gvc-mixer-control.c:1873 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%uта товуш чиқиш йўллари" + +#. translators: +#. * The number of sound inputs on a particular device +#: src/gvc/gvc-mixer-control.c:1883 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%uта товуш кириш йўллари" + +#: src/gvc/gvc-mixer-control.c:2738 +msgid "System Sounds" +msgstr "Система товушлари" + +#: src/main.c:381 +msgid "Print version" +msgstr "Босма учун версия" + +#: src/main.c:387 +msgid "Mode used by GDM for login screen" +msgstr "Сеансга кириш ойнаси учун GDM ишлатадиган режим" + +#: src/main.c:393 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "Аниқ бир режимни, масалан кириш экрани учун \"gdm\"ни, ишлатиш" + +#: src/main.c:399 +msgid "List possible modes" +msgstr "Мавжуд режимлар рўйхати" + +#: src/shell-app.c:270 +msgctxt "program" +msgid "Unknown" +msgstr "Номаълум" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "\"%s\"ни ишга тушириб бўлмади" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Махфий сўзлар мос келмади." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Махфий сўз бўш бўлмаслиги керак" + +#: src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "Ҳақиқийлигини аниқловчи диалог ойна фойдаланувчи томонидан ёпилди" + +#~ msgid "Show the message tray" +#~ msgstr "Хабарлар панелини кўрсатиш" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (wayland улагичи)" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Тақвимда ҳафта тартибини кўрсатиш" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Агар белгиланса, тақвимда ISO ҳафта тартибини кўрсатилади." + +#~ msgid "Captive Portal" +#~ msgstr "Captive Portal" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "Як" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "Д" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "С" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "Ч" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "П" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "Ж" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "Ш" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Ҳеч нарса режалаштирилмаган" + +#~ msgid "Today" +#~ msgstr "Бугун" + +#~ msgid "Tomorrow" +#~ msgstr "Эртага" + +#~ msgid "This week" +#~ msgstr "Шу ҳафта" + +#~ msgid "Next week" +#~ msgstr "Келаси ҳафта" + +#~ msgid "Removable Devices" +#~ msgstr "Олинадиган ускуналар" + +#~ msgid "Eject" +#~ msgstr "Чиқариш" + +#~ msgid "Invitation" +#~ msgstr "Таклифнома" + +#~ msgid "Call" +#~ msgstr "Телефон қилиш" + +#~ msgid "File Transfer" +#~ msgstr "Файлни кўчириш" + +#~ msgid "Chat" +#~ msgstr "Чатлашиш" + +#~ msgid "Unmute" +#~ msgstr "Овозини чиқариш" + +#~ msgid "Mute" +#~ msgstr "Овозини ўчириш" + +#~ msgid "Invitation to %s" +#~ msgstr "%sга таклифнома" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s сизни %sга қўшилишга таклиф қиляпти" + +#~ msgid "Decline" +#~ msgstr "Рад этмоқ" + +#~ msgid "Accept" +#~ msgstr "Қабул қилмоқ" + +#~ msgid "Video call from %s" +#~ msgstr "%sдан видео қўнғироқ" + +#~ msgid "Call from %s" +#~ msgstr " %sдан қўнғироқ" + +#~ msgid "Answer" +#~ msgstr "Жавоб" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s сизга %sни жўнатяпти" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s синзни онлайн бўлганингизда кўриш учун рухсат сўраяпти" + +#~ msgid "Authentication failed" +#~ msgstr "Ҳақиқийлигини текшириб бўлмади" + +#~ msgid "Encryption error" +#~ msgstr "Шифрлашда хатолик" + +#~ msgid "Certificate not provided" +#~ msgstr "Гувоҳнома берилмаган" + +#~ msgid "Certificate untrusted" +#~ msgstr "Гувоҳнома ишонарсиз" + +#~ msgid "Certificate expired" +#~ msgstr "Гувоҳнома эскирган" + +#~ msgid "Certificate not activated" +#~ msgstr "Гувоҳнома фаоллаштирилмаган" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Гувоҳнома тугунининг номи мос келмади" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Гувоҳнома тамғаси мос келмади" + +#~ msgid "Certificate self-signed" +#~ msgstr "Ўзи имзоланган гувоҳнома" + +#~ msgid "Status is set to offline" +#~ msgstr "Статусингиз офлайн қилинди" + +#~ msgid "Encryption is not available" +#~ msgstr "Шифрлаш мавжуд эмас" + +#~ msgid "Certificate is invalid" +#~ msgstr "Хато гувоҳнома" + +#~ msgid "Connection has been refused" +#~ msgstr "Алоқа рад жавобини олди" + +#~ msgid "Connection can't be established" +#~ msgstr "Алоқа қилиб бўлмади" + +#~ msgid "Connection has been lost" +#~ msgstr "Алоқа йўқотилди" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Бу ҳисоб аллақачон серверга уланган" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Алоқа олдинги манбани ишлатган ҳолда янгиси билан алмаштирилди" + +#~ msgid "The account already exists on the server" +#~ msgstr "Бу ҳисоб аллақачон серверда бор" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Сервер жуда бандлиги туфайли алоқани ушлаб туролмайди" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Гувоҳнома бекор қилинган" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "" +#~ "Гувоҳнома хавфсиз бўлмаган шифрлаш алгоритмини ишлатади ёки у " +#~ "криптографик кучсиз" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Сервер гувоҳномасининг узунлиги ёки сервер гувоҳнома занжирининг " +#~ "чуқурлиги криптография кутубхонаси қўйган чегарадан ошиб кетган" + +#~ msgid "Internal error" +#~ msgstr "Ички хато" + +#~ msgid "Unable to connect to %s" +#~ msgstr "%sга уланиб бўлмади" + +#~ msgid "View account" +#~ msgstr "Ҳисобни кўриш" + +#~ msgid "Open Calendar" +#~ msgstr "Calendarни очиш" + +#~ msgid "Date & Time Settings" +#~ msgstr "Сана ҳамда Вақт Мосламалари" + +#~ msgid "Open" +#~ msgstr "Очиш" + +#~ msgid "Remove" +#~ msgstr "Олиб ташлаш" + +#~ msgid "Clear Messages" +#~ msgstr "Хатларни тозалаш" + +#~ msgid "Notification Settings" +#~ msgstr "Хабарнома мосламалари" + +#~ msgid "Tray Menu" +#~ msgstr "Панел менюси" + +#~ msgid "No Messages" +#~ msgstr "Бирорта хат йўқ" + +#~ msgid "Message Tray" +#~ msgstr "Хатлар панели" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%dта уланган ускуналар" + +#~ msgid "Authentication required" +#~ msgstr "ҳақиқийлигини аниқлаш талаб қилинади" + +#~ msgid "Use as Internet connection" +#~ msgstr "Интернет алоқаси сифатида ишлатиш" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Батарея" + +#~ msgid "Airplane Mode" +#~ msgstr "Самолёт режими" + +#~ msgid "On" +#~ msgstr "Ёнган" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "" +#~ "Тепадаги очилувчи рўйхатдан фойдаланиб созламоқчи бўлган кенгайтмангизни " +#~ "танланг." + +#~ msgid "calendar:MY" +#~ msgstr "Тақвим:MY" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%B %d, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%B %d %Y, %H:%M " + +#~ msgid "Authorization request from %s" +#~ msgstr "%sдан ҳақиқийлигини текширишга ижозат" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "%s ускунаси ушбу компьютер билан жуфтлашмоқчи" + +#~ msgid "Allow" +#~ msgstr "Рухсат бериш" + +#~ msgid "Deny" +#~ msgstr "Рад этиш" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "\"%s\" ускуна \"%s\" хизматдан фойдаланмоқчи" + +#~ msgid "Grant this time only" +#~ msgstr "Фақат шу сафар рухсат бериш" + +#~ msgid "Reject" +#~ msgstr "Рад этиш" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s учун жуфтлаш тасдиғи" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "Илтимос \"%06d\" калити ускунадагига мос келишини тасдиқланг." + +#~ msgid "Matches" +#~ msgstr "Мос келади" + +#~ msgid "Does not match" +#~ msgstr "Мос келмайди" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s учун жуфтлашга ижозат" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Илтимос ускунадаги PINни киритинг." + +#~ msgid "OK" +#~ msgstr "Хўп" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Узр, бугун сиз учун донолик йўқ:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "\"%s\" дейди пайғамбар" diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..5e5874d --- /dev/null +++ b/po/vi.po @@ -0,0 +1,3056 @@ +# Vietnamese translation for gnome-shell. +# Bản dịch tiếng Việt dành cho gnome-shell. +# Copyright (C) 2016 GNOME i18n Project for Vietnamese. +# This file is distributed under the same license as the gnome-shell package. +# Nguyễn Thái Ngọc Duy , 2010-2013. +# Ngô Chin , 2011. +# Trần Ngọc Quân , 2013,2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-02 21:53+0000\n" +"PO-Revision-Date: 2019-03-03 13:47+0700\n" +"Last-Translator: Trần Ngọc Quân \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "Hệ thống" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "Hiển thị danh sách thông báo" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "Tập trung vào thông báo hoạt động" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "Hiển thị tổng quan" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "Hiện mọi ứng dụng" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "Mở trình đơn ứng dụng" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Phần mở rộng Hệ vỏ" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "Cấu hình phần mở rộng Hệ vỏ GNOME" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "Hệ vỏ GNOME" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "Quản lý cửa sổ và chạy ứng dụng" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "" +"Bật công cụ nội bộ, hữu dụng với người phát triển và kiểm thử, qua Alt-F2" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "" +"Cho phép truy cập công cụ theo dõi và tìm lỗi nội bộ qua hộp thoại Alt-F2." + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "Mã số thiết bị của phần mở rộng cần bật" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"Phần mở rộng Hệ vỏ GNOME có thuộc tính mã số thiết bị; khóa này liệt kê danh " +"sách phần mở rộng nên nạp. Bất kỳ phần mở rộng nào muốn nạp phải nằm trong " +"danh sách này. Bạn có thể thao tác trên danh sách này với phương thức DBus " +"EnableExtension và DisableExtension trên org.gnome.Shell." + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "Tắt phần mở rộng người dùng" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "" +"Tắt tất cả các phần mở rộng người dùng đã bật mà không ảnh hưởng đến cài đặt " +"“enabled-extension”." + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "Tắt kiểm tra tương thích phiên bản của phần mở rộng" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"Hệ vỏ GNOME sẽ chỉ tải những phần mở rộng cái mà yêu cầu phải hỗ trợ phiên " +"bản hiện đang chạy. Bật tùy chọn này sẽ tắt việc kiểm tra và thử tải tất cả " +"những phần mở rộng mà không cần quan tâm đến việc nó hỗ trợ phiên bản nào." + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "Danh sách ID tập tin desktop của ứng dụng yêu thích" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "" +"Ứng dụng tương ứng với những định danh này sẽ được hiển thị ở vùng ưa thích." + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "Bộ trình bày sàng lọc ứng dụng" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "Mục lục của trình bày được chọn hiện tại trong bộ sàng lọc ứng dụng." + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "Hộp thoại lịch sử lệnh (Alt-F2)" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Lịch sử hộp thoại kính tìm kiếm" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "Luôn hiện mục “Đăng xuất” trên trình đơn người dùng." + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"Khóa này sẽ đè lên việc tự động ẩn trình đơn “Đăng xuất” ở chế độ đơn-người-" +"dùng, đơn-phiên-làm-việc. " + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "" +"Hoặc là ghi nhớ mật khẩu dành cho việc gắn hệ thống tập tin đã mã hóa hoặc " +"hệ thống tập tin trên máy chủ" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"Hệ vỏ sẽ yêu cầu mật khẩu khi có thư mục được mã hóa hay hệ thống tập tin " +"máy mạng được gắn. Nếu mật khẩu có thể ghi lại để dùng trong lần sau, hộp " +"dấu kiểm “Nhớ mật khẩu” sẽ xuất hiện. Khóa này đặt trạng thái mặc định cho " +"hộp dấu kiểm." + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" +"Có nên để bộ điều hợp Bluetooth mặc định phải cài đặt thiết bị liên kết với " +"nó hay không" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Hệ vỏ sẽ chỉ hiển thị mục tin trình đơn Bluetooth nếu nó được bật, hoặc là " +"có các thiết bị được cài đặt liên kết với bộ tiếp hợp mặc định. Cái này sẽ " +"được đặt lại nếu bộ tiếp hợp mặc định không còn được liên kết với nó nữa." + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "Bật introspection API" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "" +"Bật một D-Bus API cái mà cho phép tự xem xét tình trạng ứng dụng của hệ vỏ." + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "Phím mở trình đơn ứng dụng" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "Phím mở trình đơn ứng dụng." + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "Phím hiện “Ứng dụng”" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "Phím hiện “Ứng dụng” trong “Tổng quan hoạt động”." + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "Phím mở tổng quan" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "Phím mở tổng quan hoạt động." + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "Phím để bật/tắt hiển thị danh sách thông báo" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "Phím để bật/tắt hiển thị danh sách thông báo." + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "Phím để tập trung vào thông báo hoạt động" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "Phím để tập trung vào thông báo hoạt động." + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "Phím ràng buộc cái mà dừng hay tiếp tục chạy, dành cho mục đích gỡ lỗi" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "Chuyển đến ứng dụng 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "Chuyển đến ứng dụng 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "Chuyển đến ứng dụng 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "Chuyển đến ứng dụng 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "Chuyển đến ứng dụng 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "Chuyển đến ứng dụng 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "Chuyển đến ứng dụng 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "Chuyển đến ứng dụng 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "Chuyển đến ứng dụng 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "Bàn phím được dùng" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "Kiểu bàn phím được dùng." + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "Giới hạn bộ chuyển đổi cho không gian làm việc hiện tại." + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"Nếu đặt, chỉ những ứng dụng mà nó có cửa sổ nằm ở không gian làm việc hiện " +"tại là hiện ra trên bộ chuyển. Nếu không, tất cả các ứng dụng sẽ được bao " +"gồm." + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "Chế độ biểu tượng ứng dụng." + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"Cấu hình về cách hiển thị các cửa sổ ở bảng chuyển đổi. Các kiểu có thể là " +"“thumbnail-only” (hiển thị ảnh thu nhỏ của cửa sổ), “app-icon-only” (chỉ " +"hiển thị biểu tượng của ứng dụng) hoặc “both” (cả hai)." + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"Nếu được đặt, chỉ những cửa sổ từ không gian làm việc hiện hành được hiện " +"thị ở bộ chuyển. Nếu không, tất cả các cửa sổ sẽ được gộp vào." + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "Gắn hộp thoại dạng modal vào cửa sổ mẹ" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "" +"Khóa này sẽ đè lên khóa có trong org.gnome.mutter khi chạy hệ vỏ GNOME." + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "Bật xếp lớp ở cạnh khi thả cửa sổ vào cạnh màn hình" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "Quản lý động vùng làm việc" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "Vùng làm việc chỉ ở trên màn hình chính" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "Khoảng trễ chờ cho con chuột ngừng di chuyển" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "Đăng nhập mạng" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 +msgid "network-workgroup" +msgstr "network-workgroup" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "Có cái gì đó bị hỏng rồi" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"Chúng tôi rất lấy làm tiếc, nhưng ở đây đã bị trục trặc: các cài đặt cho " +"phần mở rộng này không thể được hiển thị. Chúng tôi khuyến nghị bạn báo cáo " +"lỗi này đến tác gỉa của phần mở rộng." + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "Chi tiết kỹ thuật" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "Sao chép lỗi" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "Trang chủ" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "Viếng thăm trang chủ của phần mở rộng" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "Chưa cài phần mở rộng nào" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"Các thành phần mở rộng có thể được cài đặt thông qua “Phần mềm” hoặc extensions.gnome.org." + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "Duyệt trong “Phần mềm”" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "Thôi" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "Kế tiếp" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "Mở khóa" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "Đăng nhập" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "Chọn phiên làm việc" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "Không có trong danh sách?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(ví dụ: tài khoản hoặc %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "Tài khoản: " + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "Cửa sổ đăng nhập" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "Lỗi xác thực" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(hoặc quẹt ngón tay)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "Tắt máy" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "" +"power off;shutdown;reboot;restart;tắt máy;tat may;tắt nguồn;tat nguon;khởi " +"động lại;khoi dong lai" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "Khóa màn hình" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "khóa màn hình" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "Đăng xuất" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;đăng xuất;dang xuat" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "Ngủ đông" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;tạm dừng;tam dung;ngủ;ngu;ngủ đông;ngu dong" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "Chuyển người dùng" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "chuyển đổi người dùng" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "Khóa hướng" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "" +"lock orientation;screen;rotation;khóa hướng;khoa huong;màn hinh;man hinh;" +"xoay;quay" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "Không tìm thấy lệnh" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "Không thể phân tích lệnh:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "Gặp lỗi khi thực thi “%s”:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "Vừa xong" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d phút trước" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d giờ trước" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "Hôm qua" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d ngày trước" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d tuần trước" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d tháng trước" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d năm trước" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "%H:%M, hôm qua" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%H∶%M, %A" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-d %B, %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%-d %B %Y, %H∶%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%l∶%M %p" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "%l∶%M %p, hôm qua" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%l∶%M %p, %A" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-d %B, %l∶%M %p" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%-d %B %Y, %l∶%M %p" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "Đăng nhập điểm truy cập" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"Kết nối của bạn đến điểm truy cập này không an toàn. Mật khẩu hay các thông " +"tin bạn nhập vào trang này có thể bị xem bởi những người gần bạn." + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "Từ chối truy cập" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "Cấp quyền truy cập" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "Những ứng dụng hay dùng sẽ xuất hiện ở đây" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "Hay dùng" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "Tất cả" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "Cửa sổ mới" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "Launch sử dụng Card đồ họa riêng biệt" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "Bỏ khỏi danh sách ưa thích" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "Đánh dấu ưa thích" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "Hiện chi tiết" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "Đã đánh dấu ưa thích cho %s." + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s đã bị xóa khỏi danh sách ưa thích." + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "Chọn thiết bị âm thanh" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "Cài đặt âm thanh" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "Tai nghe" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "Bộ tai nghe + micrô" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "Micrô" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "Đổi ảnh nền…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "Cài đặt hiển thị" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "Cài đặt" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "C" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "2" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "3" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "4" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "5" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "6" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "7" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%OB %Y" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "Tháng trước" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "Tháng tới" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "Tuần %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "Cả ngày" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%A, %-d %B" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%A, %-d %B, %Y" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "Không có thông báo nào" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "Không có sự kiện" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "Xóa" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s” không trả lời." + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "" +"Bạn có thể chọn chờ một lúc cho nó tiếp tục hoặc buộc chấm dứt hoàn toàn ứng " +"dụng." + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "Buộc thoát" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "Chờ" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "Ổ ngoài đã kết nối" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "Ổ ngoài đã ngắt kết nối" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "Mở bằng %s" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "Mật khẩu:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "Nhập lại:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "" +"Cách khác là bạn có thể kết nối bằng cách bấm vào nút “WPS” trên bộ định " +"tuyến của bạn." + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "Kết nối" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "Mật khẩu: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "Khóa: " + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "Mật khẩu khóa riêng: " + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "Định danh: " + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "Dịch vụ: " + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "Mạng không dây cần xác thực" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "Cần mật mã hoặc khóa mã để truy cập mạng không dây “%s”." + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "Xác thực Wired 802.1X" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "Tên mạng: " + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "Xác thực DSL" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "Cần mã PIN" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "Thiết bị di động băng thông rộng cần mã PIN" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "Mật khẩu mạng băng thông rộng" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "Cần mật khẩu để kết nối đến “%s”." + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "Trình quản lý mạng" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "Cần xác thực" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "Quản trị" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "Xác thực" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "Rất tiếc, không được. Vui lòng thử lại." + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s bây giờ đổi thành %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "Cửa sổ" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "Hiện ứng dụng" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +msgid "Dash" +msgstr "Neo ứng dụng" + +#. Translators: This is the date format to use when the calendar popup is +#. * shown - it is shown just below the time in the top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%-d %B %Y" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%A %e %B %Y" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "Thêm đồng hồ thế giới…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "Đồng hồ thế giới" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "Thời tiết" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "Chọn một địa phương…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "Đang tải…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "Lên mạng để biết thông tin thời tiết" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "Thông tin thời tiết hiện không sẵn sàng." + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "Đăng xuất %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "Đăng xuất" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "Sẽ tự động đăng xuất %s sau %d giây." + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "Bạn sẽ tự động đăng xuất sau %d giây." + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "Đăng xuất" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "Tắt máy" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "Cài đặt bản cập nhật & tắt máy" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "Hệ thống sẽ tự động tắt sau %d giây." + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "Cài đặt các cập nhật phần mềm còn chưa xử lý" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "Khởi động lại" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "Tắt máy" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "Khởi động lại máy tính" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "Hệ thống sẽ tự động khởi động lại sau %d giây." + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "Khởi động lại & Cài đặt bản cập nhật" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "" +"Hệ thống sẽ tự động khởi động lại và cài đặt các cập nhật sau %d giây nữa." + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "Khởi động lại & Cài" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "Cài & Tắt máy" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "Tắt máy sau khi các cập nhật được cài đặt" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "Khởi động lại & Cài đặt nâng cấp" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s sẽ được cài đặt sau khi khởi động lại. Cài đặt nâng cấp có thể mất " +"nhiều thời gian: hãy chắn chắn rằng bạn đã sao lưu dự phòng và máy tính được " +"cắm điện." + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "" +"Đang chạy bằng pin: vui lòng cắm dây sạc trước khi thực hiện việc cài đặt " +"cập nhật." + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "Một số ứng dụng đang bận hoặc có dữ liệu chưa được lưu lại." + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "Người dùng khác đang đăng nhập." + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (máy chủ)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (bàn điều khiển)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "Cài đặt" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "Tải và cài đặt “%s” từ extensions.gnome.org chứ?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:50 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s muốn ngăn cản phím tắt" + +#: js/ui/inhibitShortcutsDialog.js:51 +msgid "Application wants to inhibit shortcuts" +msgstr "Ứng dụng muốn ngăn cản phím tắt" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:60 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "Bạn có thể khôi phục lại các phím tắt bằng cách bấm %s." + +#: js/ui/inhibitShortcutsDialog.js:65 +msgid "Deny" +msgstr "Từ chối" + +#: js/ui/inhibitShortcutsDialog.js:71 +msgid "Allow" +msgstr "Cho phép" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "Phím chậm đã bật" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "Phím chậm đã tắt" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"Bạn vừa mới ấn giữ phím Shift trong vòng 8 giây. Đây là phím tắt của tính " +"năng Phím Chậm, cái mà ảnh hưởng đến hoạt động của bàn phím của bạn." + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "Phím dính đã bật" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "Phím dính đã tắt" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"Bạn vừa mới ấn phím Shift 5 lần liên tiếp. Đây là phím tắt của tính năng " +"Phím Dính, mà nó ảnh hưởng đến hoạt động của bàn phím của bạn." + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"Bạn vừa mới ấn hai phím đồng thời, hoặc ấn phím Shift 5 lần liên tiếp. Phím " +"tắt này tắt tính năng Phím Dính, mà nó ảnh hưởng đến hoạt động của bàn phím " +"của bạn." + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "Để bật" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "Bật" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "Tắt" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "Để tắt" + +#: js/ui/keyboard.js:203 +msgid "Region & Language Settings" +msgstr "Cài đặt Lãnh thổ & Ngôn ngữ" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "Chưa cài phần mở rộng nào" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s phát sinh bất kỳ lỗi gì." + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "Ẩn lỗi" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "Hiện lỗi" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "Bật" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "Tắt" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "Lỗi" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "Đã lạc hậu" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "Đang tải về" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "Xem mã nguồn" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "Trang thông tin điện tử" + +#: js/ui/messageTray.js:1474 +msgid "System Information" +msgstr "Thông tin hệ thống" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "Chưa biết nghệ sĩ" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "Chưa biết tiêu đề" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "Âm lượng" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "Hoàn lại" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "Tổng quan" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "Gõ từ muốn tìm…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "Phím tắt mới…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "Ứng dụng đã định nghĩa" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "Hiển thị trợ giúp trên-màn-hình" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "Chuyển màn hình" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "Gán phím tắt" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "Xong" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "Sửa…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "Không" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "Nhấn vào một nút để cấu hình" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "Nhấn phím Esc để thoát" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "Hãy nhấn phím bất kỳ để thoát" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "Thoát" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "Hoạt động" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "Hệ thống" + +#: js/ui/panel.js:866 +msgid "Top Bar" +msgstr "Thanh đỉnh" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-intl" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "Nhập lệnh" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "Đóng" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Không hỗ trợ khởi động lại trên Wayland" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "Đang khởi động lại…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%A, %d %B" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d tin nhắn mới" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d thông báo mới" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:270 +msgid "Lock" +msgstr "Khóa" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME cần khóa màn hình" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 +msgid "Unable to lock" +msgstr "Không thể khóa" + +#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 +msgid "Lock was blocked by an application" +msgstr "Việc khóa bị ngăn cản bởi một ứng dụng" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "Đang tìm…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "Không tìm thấy kết quả nào." + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "%d nữa" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "Chép" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "Dán" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "Hiện chữ" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "Ẩn chữ" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "Mật khẩu" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "Nhớ mật khẩu" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "Khả năng truy cập" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "Phóng to" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "Trình đọc màn hình" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "Bàn phím màn hình" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "Cảnh báo trực quan" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "Phím dính" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "Phím chậm" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "Phím dội" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "Phím chuột" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "Tương phản cao" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "Chữ lớn" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "Bluetooth" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "Cài đặt Bluetooth" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d Đã kết nối" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "Tắt" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "Bật" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "Độ sáng" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "Bàn phím" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "Hiện bố cục của bàn phím" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "Vị trí được bật" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "Tắt" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "Cài đặt chính sách riêng tư" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "Vị trí đang dùng" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "Vị trí bị tắt" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "Bật" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "Cho %s truy cập để biết vị trí của bạn?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "" +"Việc cho truy cập để biết vị trí có thể được thay đổi vào bất kỳ lúc nào từ " +"các cài đặt riêng tư." + +#: js/ui/status/network.js:66 +msgid "" +msgstr "" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s Tắt" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s Đã kết nối" + +#. 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:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s Chưa được quản lý" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s Đang ngắt kết nối" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "%s Đang kết nối" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s Cần xác thực" + +#. 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:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "Thiếu firmware cho %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:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s Không sẵn sàng" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s Gặp lỗi khi kết nối" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "Cài đặt có dây" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "Cài đặt mạng không giây băng thông rộng" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s Phần cứng bị tắt" + +#. 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:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s Bị tắt" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "Kết nối vào Internet" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "Chế độ máy bay đang được bật" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "Wi-Fi bị tắt khi ở chế độ máy bay." + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "Tắt chế độ máy bay" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi bị tắt" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "Wi-Fi cần được bật để có thể kết nối mạng." + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "Bật Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Mạng Wi-Fi" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "Chọn một mạng" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "Không có mạng" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "Dùng nút tắt trên máy tính để tắt" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "Chọn mạng" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Cài đặt Wi-Fi" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "Điểm truy cập %s đang hoạt động" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s Chưa kết nối" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "đang kết nối…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "cần xác thực" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "gặp lỗi khi kết nối" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "Cài đặt VPN" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN Tắt" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "Cài đặt mạng" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s kết nối có dây" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s kết nối Wi-Fi" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s kết nối modem" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "Lỗi kết nối" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "Lỗi kích hoạt kết nối mạng" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "Ánh sang đêm bị tắt" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "Ánh sáng đêm được bật" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "Tiếp tục lại" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "Tắt cho đến ngày mai" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "Cài đặt nguồn điện" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "Đã sạc đầy" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "Không sạc" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "Ước tính…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "Còn %d∶%02d (%d %%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "Cho đến lúc đầy cần %d∶%02d (%d %%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "Màn hình đang được chia sẻ" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "Tắt" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "Chế độ máy bay đang được bật" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "Chuyển người dùng" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "Đăng xuất" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "Cài đặt tài khoản" + +#: js/ui/status/system.js:255 +msgid "Orientation Lock" +msgstr "Khóa hướng" + +#: js/ui/status/system.js:281 +msgid "Suspend" +msgstr "Tạm dừng" + +#: js/ui/status/system.js:291 +msgid "Power Off" +msgstr "Tắt máy" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "Thiết bị Thunderbolt chưa biết" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "" +"Thiết bi mới đã được tìm thấy trong khi bạn rời đi. Vui lòng ngắt kết nối và " +"kết nối lại thiết bị để bắt đầu dùng nó." + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "Thiết bị Thunderbolt không đủ thẩm quyền" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "Đã dò tìm thấy thiết bị mới và cần được cho phép bởi người quản trị." + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Lỗi xác thực Thunderbolt" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "Không thể cho phép thiết bị Thunderbolt: %s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "Âm lượng đã thay đổi" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "Giống nhau" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "Ghép màn hình" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "Chỉ bên ngoài" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "Chỉ tích-hợp" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "Đăng nhập người dùng khác" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "Bỏ khóa cửa sổ" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "Ứng dụng" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "Tìm" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s” đã sẵn sàng" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "Bạn có muốn giữ những cài đặt màn hình hiển thị này không?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "Phục hồi lại các cài đặt" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "Giữ các thay đổi" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "Các thay đổi có thể được hoàn lại trong vòng %d giây nữa" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "Thu nhỏ" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "Thôi phóng lớn" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "Lớn nhất" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "Di chuyển" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "Đổi cỡ" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "Di chuyển thanh tiêu đề trên màn hình" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "Luôn ở trên cùng" + +# Không gian làm việc nào đang được kích hoạt thì ở trên đó. Khi chuyển không gian làm việc, nó sẽ chuyển theo. +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "Luôn trên không gian làm việc nhìn thấy" + +# Chuyển cửa sổ sang không gian làm việc hay màn hình khác +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "Chuyển sang không gian làm việc Trái" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "Chuyển sang không gian làm việc Phải" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "Chuyển sang không gian làm việc Trên" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "Chuyển sang không gian làm việc Dưới" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "Chuyển sang màn hình Trên" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "Chuyển sang màn hình Dưới" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "Chuyển sang màn hình Trái" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "Chuyển sang màn hình Phải" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Lịch Evolution" + +#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +#: src/calendar-server/evolution-calendar.desktop.in:6 +msgid "evolution" +msgstr "evolution" + +#: src/main.c:408 +msgid "Print version" +msgstr "Hiển thị phiên bản" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "Chế độ được dùng bởi GDM cho màn hình đăng nhập" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "Dùng chế độ đặc biệt, ví dụ “gdm” cho màn hình đăng nhập" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "Danh sách chế độ có thể" + +#: src/shell-app.c:260 +msgctxt "program" +msgid "Unknown" +msgstr "Chưa biết" + +#: src/shell-app.c:511 +#, c-format +msgid "Failed to launch “%s”" +msgstr "Gặp lỗi khi khởi chạy “%s”" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "Mật khẩu không khớp." + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "Mật khẩu không được để trống" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "Hộp thoại xác thực bị người dùng bỏ qua" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u đầu ra" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u đầu vào" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "Âm thanh hệ thống" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "Có lỗi khi đang tải hộp thoại tùy thích cho %s:" + +#~ msgid "%s all day." +#~ msgstr "%s cả ngày." + +#~ msgid "%s, then %s later." +#~ msgstr "%s, sau đó %s." + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s, sau đó %s, tiếp theo là %s." + +#~ msgid "Feels like %s." +#~ msgstr "Nhiệt độ %s." + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "Tắt máy" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "Đăng xuất" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "Chuyển người dùng" + +#~ msgid "Hide tray" +#~ msgstr "Ẩn khay" + +#~ msgid "Status Icons" +#~ msgstr "Biểu tượng trạng thái" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "Cá nhân hóa phần mở rộng hệ vỏ GNOME" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "Chuyển hướng xác thực Web" + +#~ msgid "Events" +#~ msgstr "Sự kiện" + +#~ msgid "Notifications" +#~ msgstr "Thông báo" + +#~ msgid "Clear section" +#~ msgstr "Xóa một phần" + +#~ msgid "Media" +#~ msgstr "Đa phương tiện" + +#~ msgid "Not In Use" +#~ msgstr "Không dùng" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "Hiện tuần trên lịch" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "Nếu được đặt, hiện tuần trong lịch theo chuẩn ISO." + +#~ msgid "Use as Internet connection" +#~ msgstr "Dùng làm kết nối internet" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "Hệ vỏ GNOME (wayland compositor)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d thiết bị đã kết nối" + +#~ msgid "Authentication required" +#~ msgstr "Cần xác thực" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "Pin" + +#~ msgid "Airplane Mode" +#~ msgstr "Chế độ máy bay" + +#~ msgid "Show the message tray" +#~ msgstr "Hiện khay thông báo" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%l∶%M %p" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "CN" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "T2" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "T3" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "T4" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "T5" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "T6" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "T7" + +#~ msgid "Nothing Scheduled" +#~ msgstr "Không có lịch hẹn" + +#~ msgid "Today" +#~ msgstr "Hôm nay" + +#~ msgid "Tomorrow" +#~ msgstr "Ngày mai" + +#~ msgid "This week" +#~ msgstr "Tuần này" + +#~ msgid "Next week" +#~ msgstr "Tuần tới" + +#~ msgid "Removable Devices" +#~ msgstr "Thiết bị di động" + +#~ msgid "Eject" +#~ msgstr "Đẩy ra" + +#~ msgid "Invitation" +#~ msgstr "Mời" + +#~ msgid "Call" +#~ msgstr "Gọi" + +#~ msgid "File Transfer" +#~ msgstr "Truyền tập tin" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "Unmute" +#~ msgstr "Ngừng câm" + +#~ msgid "Mute" +#~ msgstr "Câm" + +#~ msgid "Invitation to %s" +#~ msgstr "Mời vào phòng %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s đang mời bạn vào phòng %s" + +#~ msgid "Decline" +#~ msgstr "Từ chối" + +#~ msgid "Accept" +#~ msgstr "Nhận lời" + +#~ msgid "Video call from %s" +#~ msgstr "Cuộc gọi có hình từ %s" + +#~ msgid "Call from %s" +#~ msgstr "Cuộc gọi từ %s" + +#~ msgid "Answer" +#~ msgstr "Trả lời" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s đang gửi bạn %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s muốn được phép được thông báo khi bạn trực tuyến" + +#~ msgid "Authentication failed" +#~ msgstr "Lỗi xác thực" + +#~ msgid "Encryption error" +#~ msgstr "Lỗi mã hóa" + +#~ msgid "Certificate not provided" +#~ msgstr "Chưa cung cấp chứng nhận" + +#~ msgid "Certificate untrusted" +#~ msgstr "Chứng nhận không đáng tin" + +#~ msgid "Certificate expired" +#~ msgstr "Chứng nhận hết hạn" + +#~ msgid "Certificate not activated" +#~ msgstr "Chứng nhận chưa kích hoạt" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "Tên máy của chứng nhận không khớp" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "Dấu vân tay chứng nhận không khớp" + +#~ msgid "Certificate self-signed" +#~ msgstr "Chứng nhận tự ký" + +#~ msgid "Status is set to offline" +#~ msgstr "Đã đặt trạng thái là ngoại tuyến" + +#~ msgid "Certificate is invalid" +#~ msgstr "Chứng nhận không hợp lệ" + +#~ msgid "Connection has been refused" +#~ msgstr "Kết nối bị từ chối" + +#~ msgid "Connection can't be established" +#~ msgstr "Không thể tạo kết nối" + +#~ msgid "Connection has been lost" +#~ msgstr "Mất kết nối" + +#~ msgid "This account is already connected to the server" +#~ msgstr "Tài khoản này đã kết nối đến máy chủ" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "Kết nối bị thay thế bằng một kết nối mới cùng tài nguyên" + +#~ msgid "The account already exists on the server" +#~ msgstr "Tài khoản đã có trên máy chủ" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "Máy chủ đang bận không thể xử lý kết nối" + +#~ msgid "Certificate has been revoked" +#~ msgstr "Chứng nhận bị thu hồi" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "Chứng nhận dùng thuật toán mật mã yếu hoặc không an toàn" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "Độ dài của chứng nhận máy chủ, hoặc độ sâu của chuỗi chứng nhận, vượt quá " +#~ "giới hạn của thư viện mật mã" + +#~ msgid "Internal error" +#~ msgstr "Lỗi nội bộ" + +#~ msgid "Unable to connect to %s" +#~ msgstr "Không thể kết nối đến %s" + +#~ msgid "View account" +#~ msgstr "Xem tài khoản" + +#~ msgid "Open Calendar" +#~ msgstr "Mở lịch" + +#~ msgid "Date & Time Settings" +#~ msgstr "Cài đặt ngày giờ" + +#~ msgid "Open" +#~ msgstr "Mở" + +#~ msgid "Remove" +#~ msgstr "Xóa bỏ" + +#~ msgid "Clear Messages" +#~ msgstr "Xóa thông báo" + +#~ msgid "Notification Settings" +#~ msgstr "Cài đặt thông báo" + +#~ msgid "Tray Menu" +#~ msgstr "Trình đơn khay" + +#~ msgid "No Messages" +#~ msgstr "Không có thông báo" + +#~ msgid "Message Tray" +#~ msgstr "Khay thông báo" + +#~ msgid "Screenshots" +#~ msgstr "Chụp màn hình" + +#~ msgid "Record a screencast" +#~ msgstr "Quay phim màn hình" + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "Liệt kê các các-ta-lốc mà nó có thể hiển thị như một thư mục" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "Mỗi tên các-ta-lốc trong danh sách này sẽ được xuất hiện như là một thư " +#~ "mục trong trình bày ứng dụng, thay vì hiển thị cùng dòng trong trình bày " +#~ "chính. " + +#~ msgid "" +#~ "Internally used to store the last IM presence explicitly set by the user. " +#~ "The value here is from the TpConnectionPresenceType enumeration." +#~ msgstr "" +#~ "Dùng để lưu nội bộ sự hiện diện IM lần cuối do người dùng đặt. Giá trị ở " +#~ "đây từ enumeration TpConnectionPresenceType." + +#~ msgid "" +#~ "Internally used to store the last session presence status for the user. " +#~ "The value here is from the GsmPresenceStatus enumeration." +#~ msgstr "" +#~ "Dùng để lưu nội bộ sự hiện diện IM lần cuối do người dùng đặt. Giá trị ở " +#~ "đây từ enumeration GsmPresenceStatus." + +#~ msgid "Keybinding to toggle the screen recorder" +#~ msgstr "Phím để bật/tắt trình quay phim màn hình" + +#~ msgid "Keybinding to start/stop the builtin screen recorder." +#~ msgstr "Phím để quay/dừng việc quay phim màn hình." + +#~ msgid "Framerate used for recording screencasts." +#~ msgstr "Tốc độ khung hình sẽ dùng khi ghi screencast." + +#~ msgid "" +#~ "The framerate of the resulting screencast recordered by GNOME Shell's " +#~ "screencast recorder in frames-per-second." +#~ msgstr "" +#~ "Tốc độ khung hình của screencast được ghi bởi bộ thu Hệ vỏ GNOME tính " +#~ "theo số khung mỗi giây." + +#~ msgid "The gstreamer pipeline used to encode the screencast" +#~ msgstr "Ống dẫn gstreamer dùng để thu screencast" + +#~ msgid "" +#~ "Sets the GStreamer pipeline used to encode recordings. It follows the " +#~ "syntax used for gst-launch. The pipeline should have an unconnected sink " +#~ "pad where the recorded video is recorded. It will normally have a " +#~ "unconnected source pad; output from that pad will be written into the " +#~ "output file. However the pipeline can also take care of its own output - " +#~ "this might be used to send the output to an icecast server via shout2send " +#~ "or similar. When unset or set to an empty value, the default pipeline " +#~ "will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 " +#~ "cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to " +#~ "WEBM using the VP8 codec. %T is used as a placeholder for a guess at the " +#~ "optimal thread count on the system." +#~ msgstr "" +#~ "Đặt ống dẫn GStreamer dùng để thu hình. Tuân theo cú pháp gst-launch. Ống " +#~ "dẫn nên có pad sink không kết nối, nơi bắt đầu thu. Bình thường cũng nên " +#~ "có source pad không kết nối; đầu ra từ pad sẽ được ghi vào tập tin kết " +#~ "quả. Tuy nhiên ống dẫn có thể tự lưu đầu ra riêng - có thể hữu dụng để " +#~ "gửi kết quả đến máy chủ icecast thông qua shout2send hoặc tương tự. Nếu " +#~ "bỏ chọn hoặc đặt giá trị rỗng, ống dẫn mặc định sẽ được dùng, hiện thời " +#~ "là “vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " +#~ "threads=%T ! queue ! webmmux” và lưu ở dạng WEBM dùng VP8 codec. %T được " +#~ "dùng để thế chỗ cho số thread dự đoán tối ưu cho hệ thống." + +#~ msgid "File extension used for storing the screencast" +#~ msgstr "Phần mở rộng dùng để lưu screencast" + +#~ msgid "" +#~ "The filename for recorded screencasts will be a unique filename based on " +#~ "the current date, and use this extension. It should be changed when " +#~ "recording to a different container format." +#~ msgstr "" +#~ "Tên tập tin cho screencast được lưu sẽ là tên độc nhất dự trên ngày hiện " +#~ "thời, và dùng phần mở rộng này. Khi lưu ở định dạng khác nhau thì tên này " +#~ "cũng nên khác nhau." + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "Sắp đặt các nút trên thanh tiêu đề" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "Khóa này đè lên khóa có trong org.gnome.desktop.wm.preferences khi chạy " +#~ "hệ vỏ GNOME." + +#~ msgid "Extension" +#~ msgstr "Phần mở rộng" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "Chọn phần mở rộng để cấu hình dùng hộp chọn." + +#~ msgid "Session" +#~ msgstr "Phiên làm việc" + +#~ msgid "Power" +#~ msgstr "Nguồn" + +#~ msgid "Restart" +#~ msgstr "Khởi động lại" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" + +#~ msgid "Screencast from %d %t" +#~ msgstr "Screencast từ %d %t" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A, %H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%d %B, %H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%H:%M, %d %B %Y " + +#~ msgid "Click Log Out to quit these applications and log out of the system." +#~ msgstr "" +#~ "Nhấn Đăng xuất để thoát những ứng dụng này và đăng xuất khỏi hệ thống." + +#~ msgid "Logging out of the system." +#~ msgstr "Đang xuất khỏi hệ thống." + +#~ msgid "Click Power Off to quit these applications and power off the system." +#~ msgstr "Nhấn Tắt máy để thoát những ứng dụng này và tắt máy." + +#~ msgid "Powering off the system." +#~ msgstr "Tắt máy." + +#~ msgid "Click Restart to quit these applications and restart the system." +#~ msgstr "" +#~ "Bấm vào \"Khởi động lại\" để thoát khỏi những ứng dụng này và khởi động " +#~ "lại hệ thống." + +#~ msgid "Restarting the system." +#~ msgstr "Khởi động lại hệ thống." + +#~ msgid "Universal Access Settings" +#~ msgstr "Cài đặt hỗ trợ truy cập" + +#~ msgid "Visibility" +#~ msgstr "Tầm nhìn" + +#~ msgid "Set Up a New Device…" +#~ msgstr "Cài đặt thiết bị mới…" + +#~ msgid "Send Files…" +#~ msgstr "Gửi tập tin…" + +#~ msgid "Keyboard Settings" +#~ msgstr "Cài đặt bàn phím" + +#~ msgid "Mouse Settings" +#~ msgstr "Cài đặt chuột" + +#~ msgid "Authorization request from %s" +#~ msgstr "Yêu cầu cấp quyền từ %s" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "Thiết bị %s muốn kết nối với máy tính này" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "Thiết bị %s muốn truy cập dịch vụ “%s”" + +#~ msgid "Grant this time only" +#~ msgstr "Chỉ cho phép lần này" + +#~ msgid "Reject" +#~ msgstr "Từ chối" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "Xác nhận kết nối cho %s" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "" +#~ "Vui lòng xác nhận Passkey “%06d” nào tương ứng với nó trên thiết bị." + +#~ msgid "Matches" +#~ msgstr "Khớp" + +#~ msgid "Does not match" +#~ msgstr "Không khớp" + +#~ msgid "Pairing request for %s" +#~ msgstr "Yêu cầu kết nối cho %s" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "Vui lòng nhập số PIN ghi trên thiết bị." + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "Volume, network, battery" +#~ msgstr "Đĩa, mạng, pin" + +#~ msgid "Wi-Fi" +#~ msgstr "Wi-Fi" + +#~ msgid "disabled" +#~ msgstr "tắt" + +#~ msgid "unavailable" +#~ msgstr "không có mặt" + +#~ msgid "More…" +#~ msgstr "Nữa…" + +#~ msgid "Wired" +#~ msgstr "Mạng dây" + +#~ msgid "%d %s %d %s remaining" +#~ msgstr "%d %s %d %s còn lại" + +#~ msgid "hour" +#~ msgid_plural "hours" +#~ msgstr[0] "giờ" + +#~ msgid "minute" +#~ msgid_plural "minutes" +#~ msgstr[0] "phút" + +#~ msgid "AC Adapter" +#~ msgstr "Nguồn AC" + +#~ msgid "Laptop Battery" +#~ msgstr "Pin Máy tính xách tay" + +#~ msgid "Monitor" +#~ msgstr "Màn hình" + +#~ msgid "Mouse" +#~ msgstr "Chuột" + +#~ msgid "PDA" +#~ msgstr "PDA" + +#~ msgid "Cell Phone" +#~ msgstr "Điện thoại di động" + +#~ msgid "Media Player" +#~ msgstr "Máy nghe nhạc" + +#~ msgid "Tablet" +#~ msgstr "Bảng" + +#~ msgid "Computer" +#~ msgstr "Máy tính" + +#~ msgctxt "device" +#~ msgid "Unknown" +#~ msgstr "Không biết" + +#~ msgid "Available" +#~ msgstr "Có mặt" + +#~ msgid "Busy" +#~ msgstr "Bận" + +#~ msgid "Invisible" +#~ msgstr "Giấu mặt" + +#~ msgid "Away" +#~ msgstr "Vắng mặt" + +#~ msgid "Idle" +#~ msgstr "Nhàn rỗi" + +#~ msgid "Your chat status will be set to busy" +#~ msgstr "Trạng thái nhắn tin của bạn sẽ được đặt là bận" + +#~ msgid "" +#~ "Notifications are now disabled, including chat messages. Your online " +#~ "status has been adjusted to let others know that you might not see their " +#~ "messages." +#~ msgstr "" +#~ "Thông báo đã bị tắt, bao gồm tin nhắn. Trạng thái trực tuyến của bạn đã " +#~ "được điều chỉnh để mọi người biết bạn sẽ không xem tin nhắn họ gửi đến." + +#~ msgid "Shutting down might cause them to lose unsaved work." +#~ msgstr "Tắt sẽ làm mất những kết quả chưa được lưu." + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "Rất tiếc, hôm nay không có lời thông thái nào:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "Nhà tiên tri %s nói" + +#~ msgid "Whether to collect stats about applications usage" +#~ msgstr "Có thu thập thống kê sử dụng ứng dụng không" + +#~ msgid "" +#~ "The shell normally monitors active applications in order to present the " +#~ "most used ones (e.g. in launchers). While this data will be kept private, " +#~ "you may want to disable this for privacy reasons. Please note that doing " +#~ "so won't remove already saved data." +#~ msgstr "" +#~ "GNOME Shell bình thường sẽ theo dõi các ứng dụng tích cực để thể hiện phù " +#~ "hợp (ví dụ, bộ phóng). Mặc dù thông tin này là riêng tư, bạn vẫn có thể " +#~ "tắt vì lý do cá nhân. Chú ý là làm vậy sẽ không xóa bỏ những dữ liệu đã " +#~ "có." + +#~ msgid "cable unplugged" +#~ msgstr "cáp bị tháo" + +#~ msgid "Auto Ethernet" +#~ msgstr "Ethernet tự động" + +#~ msgid "Auto broadband" +#~ msgstr "Băng thông rộng tự động" + +#~ msgid "Auto dial-up" +#~ msgstr "Quay số tự động" + +#~ msgid "Auto %s" +#~ msgstr "%s tự động" + +#~ msgid "Auto bluetooth" +#~ msgstr "Bluetooth tự động" + +#~ msgid "Auto wireless" +#~ msgstr "Mạng không dây tự động" + +#~ msgctxt "title" +#~ msgid "Sign In" +#~ msgstr "Đăng nhập" + +#~ msgid "tray" +#~ msgstr "khay" + +#~ msgid "More..." +#~ msgstr "Nữa…" + +#~ msgid "disabled OpenSearch providers" +#~ msgstr "Phần cung cấp OpenSearch bị tắt" + +#~ msgid "APPLICATIONS" +#~ msgstr "ỨNG DỤNG" + +#~ msgid "SETTINGS" +#~ msgstr "CÀI ĐẶT" + +#~ msgctxt "event list time" +#~ msgid "%H:%M" +#~ msgstr "%H:%M" + +#~ msgid "Failed to unmount '%s'" +#~ msgstr "Lỗi bỏ gắn kết “%s”" + +#~ msgid "Retry" +#~ msgstr "Thử lại" + +#~ msgid "PLACES & DEVICES" +#~ msgstr "ĐỊA ĐIỂM & THIẾT BỊ" + +#~ msgid "Browse Files..." +#~ msgstr "Duyệt tập tin…" + +#~ msgid "Error browsing device" +#~ msgstr "Lỗi duyệt tập tin" + +#~ msgid "The requested device cannot be browsed, error is '%s'" +#~ msgstr "Không thể duyệt thiết bị yêu cầu , lỗi là “%s”" + +#~ msgid "Wireless" +#~ msgstr "Mạng không dây" + +#~ msgid "VPN Connections" +#~ msgstr "Kết nối VPN" + +#~ msgid "Subscription request" +#~ msgstr "Yêu cầu đăng ký" + +#~ msgid "Sent at %X on %A" +#~ msgstr "Đã gửi %X lúc %A" + +#~ msgid "Sent on %A, %B %d, %Y" +#~ msgstr "Đã gửi %A, %d %B, %Y" + +#~ msgid "Connection to %s failed" +#~ msgstr "Kết nối %s thất bại" + +#~ msgid "Reconnect" +#~ msgstr "Tái kết nối" + +#~ msgid "System Settings" +#~ msgstr "Cài đặt hệ thống" + +#~ msgid "Your favorite Easter Egg" +#~ msgstr "Trứng phục sinh yêu thích của bạn" + +#~ msgid "United Kingdom" +#~ msgstr "Vương quốc Anh" + +#~ msgid "Default" +#~ msgstr "Mặc định" + +#~ msgid "%1$s: %2$s" +#~ msgstr "%1$s: %2$s" + +#~ msgid "Connect to..." +#~ msgstr "Kết nối đến…" + +#~ msgid "Passphrase" +#~ msgstr "Mật khẩu" + +#~ msgid "%s is online." +#~ msgstr "%s đang trực tuyến." + +#~ msgid "%s is offline." +#~ msgstr "%s đã ngoại tuyến." + +#~ msgid "%s is away." +#~ msgstr "%s đi vắng." + +#~ msgid "%s is busy." +#~ msgstr "%s bận." + +#~ msgid "Show time with seconds" +#~ msgstr "Hiện giây" + +#~ msgid "If true, display seconds in time." +#~ msgstr "Nếu đúng (true), hiện giây." + +#~ msgid "Show date in clock" +#~ msgstr "Hiện ngày trên đồng hồ" + +#~ msgid "If true, display date in the clock, in addition to time." +#~ msgstr "Nếu đúng (true), hiện ngày trên đồng hồ, bên cạnh giờ." + +#~ msgid "CONTACTS" +#~ msgstr "LIÊN LẠC" + +#~ msgid "%a %b %e, %R:%S" +#~ msgstr "%a %R:%S, %e %b" + +#~ msgid "%a %b %e, %R" +#~ msgstr "%a %R, %e %b" + +#~ msgid "%a %R:%S" +#~ msgstr "%a %R:%S" + +#~ msgid "%a %R" +#~ msgstr "%a %R" + +#~ msgid "%a %b %e, %l:%M:%S %p" +#~ msgstr "%a %e %b, %l:%M:%S %p" + +#~ msgid "%a %l:%M:%S %p" +#~ msgstr "%a %l:%M:%S %p" + +#~ msgid "Wrong password, please try again" +#~ msgstr "Nhập sai mật khẩu, xin hãy thử lại" + +#~ msgid "Hidden" +#~ msgstr "Ẩn" + +#~ msgid "Power Off..." +#~ msgstr "Tắt máy…" + +#~ msgid "Online Accounts" +#~ msgstr "Tài khoản trực tuyến" + +#~ msgid "Log Out..." +#~ msgstr "Đăng xuất…" + +#~ msgid "RECENT ITEMS" +#~ msgstr "MỤC GẦN ĐÂY" + +#~ msgid "" +#~ "GNOME Shell extensions have a uuid property; this key lists extensions " +#~ "which should be loaded. disabled-extensions overrides this setting for " +#~ "extensions that appear in both lists." +#~ msgstr "" +#~ "Phần mở rộng GNOME Shell có thuộc tính uuid. Khóa này liệt kê danh sách " +#~ "phần mở rộng cần phải nạp. disabled-extensions ghi đè vào khóa này đối " +#~ "với những phần mở rộng có mặt ở cả hai danh sách." + +#~ msgid "Home Folder" +#~ msgstr "Thư mục riêng" + +#~ msgid "Show password" +#~ msgstr "Hiện mật khẩu" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..4dc1a9c --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,2324 @@ +# Chinese (China) translation for gnome-shell. +# Copyright (C) 2010-2019 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# jiero , 2010. +# Jessica Ban , 2010. +# zhang ping , 2010. +# 指冷玉笙寒 (dhyang) , 2010 +# Ray Wang , 2009, 2011. +# 李炜 , 2011. +# chiachen , 2011. +# StarBrilliant , 2011 +# YunQiang Su , 2010, 2011, 2012. +# Wylmer Wang , 2013, 2014. +# hui , 2013, 2014. +# mosquito , 2014. +# Tong Hui , 2013, 2014, 2015. +# Aron Xu , 2010, 2011, 2012, 2013, 2015, 2016. +# liushuyu , 2015, 2016. +# Mingcong Bai , 2015, 2016, 2017. +# Dingzhong Chen , 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-04-27 12:53+0000\n" +"PO-Revision-Date: 2019-05-08 18:13+0800\n" +"Last-Translator: Dingzhong Chen \n" +"Language-Team: Chinese (China) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "系统" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "显示通知列表" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "聚焦到活动通知" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "显示概览" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "显示全部应用程序" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "打开应用程序菜单" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell 扩展" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "配置 GNOME Shell 扩展" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "窗口管理与应用程序启动" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "启用从 Alt-F2 调用对开发者和测试者有用的内部工具" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "允许使用 Alt-F2 对话框访问内部调试和监视工具。" + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "要启用的扩展的 UUID" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell 扩展有一个 UUID 属性,此键列出了应该加载的扩展。任何需要加载的扩" +"展都需出现在此列表中。您还可以通过 DBus 的方式对 org.gnome.Shell 里的 " +"EnableExtension 和 DisableExtension 的值进行修改,以修改此列表。" + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "禁用用户扩展" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "禁用所有用户启用的扩展而不影响“enabled-extension”键值的设置。" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "禁用检查扩展版本兼容性" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME 只会加载声明支持当前运行版本的扩展。启用该选项会禁止此检查,并尝试加载" +"所有扩展,无视它们声明支持的版本。" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "收藏夹中应用程序桌面文件的 ID 列表" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "符合这些标示的应用程序将显示在收藏区中。" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "应用选择器视图" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "应用程序选择器中当前选中视图的索引。" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "命令对话框 (Alt-F2) 的历史记录" + +# http://live.gnome.org/GnomeShell/LookingGlass +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Looking Glass 控制台历史" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "总在用户菜单中显示“注销”选项。" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"单用户、单会话情形下,“注销”菜单项会自动隐藏,使用这个键会覆盖这种行为。" + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "是否记住挂载加密文件系统或远程文件系统时所使用的密码" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"挂载加密设备或远程文件系统时 Shell 将要求输入密码。如果该密码可以记住并在今后" +"使用,则会有“记住密码”复选框出现。这个键设置了该复选框的默认状态。" + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "默认的蓝牙适配器是否有已配对的设备" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Shell 只会在有蓝牙适配器有供电时或有设备与默认适配器关联时显示蓝牙菜单。若默" +"认适配器不再和设备关联,蓝牙菜单将不再因此出现。" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "" + +#: data/org.gnome.shell.gschema.xml.in:96 +#, fuzzy +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "启用 D-Bus API 以允许自检 shell 的应用程序状态。" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "用于打开应用程序菜单的快捷键" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "用于打开应用程序菜单的快捷键。" + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "用于打开“显示应用程序”视图的快捷键" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "用于打开活动概览中的“显示应用程序”视图的快捷键。" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "用于打开概览的快捷键" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "用于打开活动概览的快捷键。" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "用来切换通知列表是否可见的快捷键" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "用来切换通知列表是否可见的快捷键。" + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "用于聚焦到活动通知的快捷键" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "用于聚焦到活动通知的快捷键。" + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "暂停和恢复所有执行中动画的快捷键,用于调试" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "切换到应用程序 11" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "切换到应用程序 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "切换到应用程序 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "切换到应用程序 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "切换到应用程序 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "切换到应用程序 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "切换到应用程序 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "切换到应用程序 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "切换到应用程序 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "使用哪种键盘" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "要使用的键盘类型。" + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "仅在当前工作区切换。" + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "如果设为 true,则切换器只显示当前工作区中的应用。否则,显示所有应用。" + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "应用程序图标模式。" + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"配置窗口如何显示于切换器中。有效的值有“thumbnail-only”“app-icon-" +"only”和“both”。" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "如果设为 true,切换器只显示当前工作区的窗口。否则,包括所有窗口。" + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "将模态对话框附到其父窗口上" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "当 GNOME Shell 运行时,此键会覆盖 org.gnome.mutter 中的键。" + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "启用拖拽窗口到屏幕边缘时边缘平铺的功能" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "动态地管理工作区" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "仅在主显示器上显示工作区" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "将鼠标模式下焦点的更改推迟到指针停止移动之后" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "网络登录" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "出问题了" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"非常抱歉,但是出现了问题:此扩展的设置无法显示。我们建议您将问题报告给扩展的" +"作者。" + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "技术细节" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "复制错误" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "主页" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "访问扩展主页" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "未安装扩展" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"扩展可以通过“软件”或者 extensions." +"gnome.org 来安装。" + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "在“软件”中浏览" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889 +msgid "Cancel" +msgstr "取消" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "下一步" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "解锁" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "登录" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "选择会话" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "未列出?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(如 user 或 %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "用户名:" + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "登录窗口" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "认证出错" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(或滑动手指)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "关机" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "power off;shutdown;reboot;restart;关机;断电;重启;重新启动;" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "锁屏" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "锁屏" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "注销" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;登出;注销;" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "挂起" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;挂起;睡眠;" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "切换用户" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "切换用户" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "锁定方向" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "lock orientation;screen;rotation;锁定方向;屏幕;旋转;" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "命令未找到" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "不能解析命令:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "执行“%s”失败:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "刚刚" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d 分钟前" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d 小时前" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "昨天" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d 天前" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d 周前" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d 月前" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d 年前" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "昨天 %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A %H:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%-m月%-d日,%H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%Y年%-m月%-d日,%H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%p %-l:%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "昨天%p %-l:%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A%p %-l:%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%-m月%-d日,%p %-l:%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%Y年%-m月%-d日,%p %-l:%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "热点登录" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "您到热点登录的连接不安全。您在此页面输入的密码或其他信息可被旁人查看。" + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "拒绝访问" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "允许访问" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "常用的应用程序会出现在这里" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "常用" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "全部" + +#. Translators: This is the heading of a list of open windows +#: js/ui/appDisplay.js:1713 js/ui/panel.js:79 +#, fuzzy +#| msgid "Windows" +msgid "Open Windows" +msgstr "打开窗口" + +#: js/ui/appDisplay.js:1732 js/ui/panel.js:86 +msgid "New Window" +msgstr "新窗口" + +#: js/ui/appDisplay.js:1746 +msgid "Launch using Dedicated Graphics Card" +msgstr "使用独立显卡启动" + +#: js/ui/appDisplay.js:1773 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "从收藏夹中移除" + +#: js/ui/appDisplay.js:1779 +msgid "Add to Favorites" +msgstr "添加到收藏夹" + +#: js/ui/appDisplay.js:1789 js/ui/panel.js:97 +msgid "Show Details" +msgstr "显示细节" + +#: js/ui/appFavorites.js:149 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s 已经添加到了您的收藏夹。" + +#: js/ui/appFavorites.js:183 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s 已经从您的收藏夹移除。" + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "选择声音设备" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "声音设置" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "耳机" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "耳麦" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "麦克风" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "更换壁纸…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "显示设置" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "设置" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "日" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "一" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "二" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "三" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "四" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "五" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "六" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%Y %OB" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "上个月" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "下个月" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "第 %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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "全天" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%-m月%-d日 %A" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%Y年%-m月%-d日 %A" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "无通知" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "无事件" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "清除" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "“%s”无响应。" + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "您可以尝试等待其响应或强制退出此应用程序。" + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "强制退出" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "等待" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "外部驱动器已连接" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "外部驱动器已断开" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "使用 %s 打开" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "密码:" + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "再输一次:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "此外,您也可以通过按下您路由器的“WPS”按钮来连接。" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:310 js/ui/status/network.js:892 +msgid "Connect" +msgstr "连接" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "密码:" + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "密钥:" + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "私钥密码:" + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "身份:" + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "服务:" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "无线网络要求身份认证" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "访问无线网络“%s”需要密码或密钥。" + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "有线 802.1X 认证" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "网络名称:" + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL 认证" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "需要 PIN 码" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "移动宽带设备需要 PIN 码" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN:" + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "移动宽带网络密码" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "连接到“%s”需要密码。" + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 +msgid "Network Manager" +msgstr "网络管理器" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "需要认证" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "管理员" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "认证" + +# 不一定是密码错误。 +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "抱歉,认证失败。请重试。" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s 现在叫做 %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "窗口" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "显示应用程序" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%Y年%-m月%-d日" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%Y年%-m月%-d日 %A" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "添加世界时钟…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "世界时钟" + +#: js/ui/dateMenu.js:228 +msgid "Weather" +msgstr "天气" + +#: js/ui/dateMenu.js:311 +msgid "Select a location…" +msgstr "选择地点…" + +#: js/ui/dateMenu.js:319 +msgid "Loading…" +msgstr "正在载入……" + +#: js/ui/dateMenu.js:329 +msgid "Go online for weather information" +msgstr "通过互联网查看天气信息" + +#: js/ui/dateMenu.js:331 +msgid "Weather information is currently unavailable" +msgstr "天气信息目前不可用" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "注销 %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "注销" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s 将在 %d 秒后自动注销。" + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "您将在 %d 秒后自动注销。" + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "注销" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "关机" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "安装更新并关机" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "系统将在 %d 秒后自动关机。" + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "安装挂起的软件更新" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "重启" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "关机" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "重启" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "系统将在 %d 秒后自动重启。" + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "重启并安装更新" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "系统将在 %d 秒后自动重启并安装更新。" + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "重启并安装" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "安装并关机" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "安装更新后关机" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "重启并安装升级" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"重启后将安装 %s %s。升级安装可能需要较长时间:请确保已经进行了备份并且已经插" +"入了电源。" + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "正在用电池供电:安装更新前请插上电源。" + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "有些应用程序正忙或有未保存的工作。" + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "有其他用户登录。" + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s(远程)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s(控制台)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "安装" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "从 extensions.gnome.org 下载并安装“%s”?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s 希望禁用快捷键" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "应用程序希望禁用快捷键" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "按 %s 以恢复快捷键。" + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "拒绝" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "允许" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "慢速键已开启" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "慢速键已关闭" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"您刚刚按住了 Shift 键 8 秒钟。这是启用慢速键特性的快捷方式,这会影响您键盘的" +"使用。" + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "粘滞键已开启" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "粘滞键已关闭" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"您刚刚按了 Shift 键五次。这是启用粘滞键特性的快捷方式,这会影响您键盘的使用。" + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"您刚刚一次按了两个键或者按了 Shift 键五次。这将会关闭粘滞键特性,这会影响您使" +"用键盘的方式。" + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "保持开启" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1264 +msgid "Turn On" +msgstr "开启" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:311 +#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "关闭" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "保持关闭" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "区域与语言设置" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "未安装扩展" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s 没有传出任何错误信息。" + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "隐藏错误" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "显示错误" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "已启用" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "已禁用" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "出错" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "过时" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "下载中" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "查看源" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "网页" + +#: js/ui/messageTray.js:1479 +msgid "System Information" +msgstr "系统信息" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "未知艺人" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "未知标题" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "音量" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "撤消" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "概览" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "输入以搜索…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "新建快捷键…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "应用程序定义" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "显示屏幕帮助" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "切换显示器" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "分配按键" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "完成" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "编辑…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "无" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "按下按键以配置" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "按 Esc 以退出" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "按任意键退出" + +#: js/ui/panel.js:113 +msgid "Quit" +msgstr "退出" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:468 +msgid "Activities" +msgstr "活动" + +#: js/ui/panel.js:743 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "系统" + +#: js/ui/panel.js:861 +msgid "Top Bar" +msgstr "顶栏" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "输入一个命令" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "关闭" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "Wayland 下重启不可用" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "正在重新启动……" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%-m月%-d日 %A" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d 条新消息" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d 条新通知" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:271 +msgid "Lock" +msgstr "锁定" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME 需要锁定屏幕" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "无法锁定" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "一个应用程序阻止了锁定" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "正在搜索……" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "无结果。" + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "还有另外 %d 项" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "复制" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "粘贴" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "显示文本" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "隐藏文本" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "密码" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "记住密码" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "辅助功能" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "缩放" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "屏幕阅读器" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "屏幕键盘" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "视觉响铃" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "粘滞键" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "慢速键" + +# win10 使用这个翻译,在谷歌搜索上分别搜索回弹键和筛选键,回弹键的结果比较多。 +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "回弹键" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "鼠标按键" + +#: js/ui/status/accessibility.js:135 +msgid "High Contrast" +msgstr "高对比度" + +#: js/ui/status/accessibility.js:177 +msgid "Large Text" +msgstr "大号文本" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "蓝牙" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586 +msgid "Bluetooth Settings" +msgstr "蓝牙设置" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d 台设备已连接" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "关" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "开" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "亮度" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "键盘" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "显示键盘布局" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "定位服务已启用" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "禁用" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "隐私设置" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "定位服务使用中" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "定位服务已禁用" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "启用" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "允许 %s 访问您的位置信息?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "位置访问权限可以随时在隐私设置里更改。" + +#: js/ui/status/network.js:66 +msgid "" +msgstr "<未知>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:417 js/ui/status/network.js:1293 +#, javascript-format +msgid "%s Off" +msgstr "%s 已关闭" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:420 +#, javascript-format +msgid "%s Connected" +msgstr "%s 已连接" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:425 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s 未托管" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:428 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s 正在断开" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:435 js/ui/status/network.js:1285 +#, javascript-format +msgid "%s Connecting" +msgstr "%s 正在连接" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:438 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s 需要认证" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:446 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "%s 的固件缺失" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:450 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s 不可用" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:453 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s 连接失败" + +#: js/ui/status/network.js:465 +msgid "Wired Settings" +msgstr "有线设置" + +#: js/ui/status/network.js:507 +msgid "Mobile Broadband Settings" +msgstr "移动宽带设置" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:554 js/ui/status/network.js:1290 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s 硬件开关关闭" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:558 +#, javascript-format +msgid "%s Disabled" +msgstr "%s 已禁用" + +#: js/ui/status/network.js:598 +msgid "Connect to Internet" +msgstr "连接到互联网" + +#: js/ui/status/network.js:787 +msgid "Airplane Mode is On" +msgstr "飞行模式已开启" + +#: js/ui/status/network.js:788 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "启用飞行模式时 Wi-Fi 会关闭。" + +#: js/ui/status/network.js:789 +msgid "Turn Off Airplane Mode" +msgstr "关闭飞行模式" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi 已关闭" + +#: js/ui/status/network.js:799 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "连接网络需要开启 Wi-Fi。" + +#: js/ui/status/network.js:800 +msgid "Turn On Wi-Fi" +msgstr "开启 Wi-Fi" + +#: js/ui/status/network.js:825 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi 网络" + +#: js/ui/status/network.js:827 +msgid "Select a network" +msgstr "选择网络" + +#: js/ui/status/network.js:856 +msgid "No Networks" +msgstr "无网络" + +#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "使用硬件开关关闭" + +#: js/ui/status/network.js:1153 +msgid "Select Network" +msgstr "选择网络" + +#: js/ui/status/network.js:1159 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi 设置" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1281 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s 热点已激活" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1296 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s 未连接" + +#: js/ui/status/network.js:1393 +msgid "connecting…" +msgstr "正在连接……" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1396 +msgid "authentication required" +msgstr "需要认证" + +#: js/ui/status/network.js:1398 +msgid "connection failed" +msgstr "连接失败" + +#: js/ui/status/network.js:1448 +msgid "VPN Settings" +msgstr "VPN 设置" + +#: js/ui/status/network.js:1465 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1475 +msgid "VPN Off" +msgstr "VPN 已关闭" + +#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "网络设置" + +#: js/ui/status/network.js:1565 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s 个有线连接" + +#: js/ui/status/network.js:1569 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s 个 Wi-Fi 连接" + +#: js/ui/status/network.js:1573 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s 个调制解调器连接" + +#: js/ui/status/network.js:1706 +msgid "Connection failed" +msgstr "连接失败" + +#: js/ui/status/network.js:1707 +msgid "Activation of network connection failed" +msgstr "网络连接激活失败" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "夜间模式已禁用" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "夜间模式已启用" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "继续使用" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "明天前禁用" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "电源设置" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "已充满电" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "未在充电" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "正在估计……" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "剩余 %d:%02d (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "距充满还剩 %d:%02d (%d%%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "正在共享屏幕" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "关闭" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "飞行模式已开启" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "切换用户" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "注销" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "帐号设置" + +#: js/ui/status/system.js:256 +msgid "Orientation Lock" +msgstr "方向锁定" + +#: js/ui/status/system.js:282 +msgid "Suspend" +msgstr "挂起" + +#: js/ui/status/system.js:292 +msgid "Power Off" +msgstr "关机" + +# 这是英特尔的注册商标名,暂无官方译名。 +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "未知的 Thunderbolt 设备" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "您不在的时候检测到了新设备。请断开设备连接后重连来开始使用它。" + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "未授权的 Thunderbolt 设备" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "检测到新设备,需要管理员授权。" + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt 授权错误" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "无法授权 Thunderbolt 设备:%s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "音量已变更" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "镜像" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "拼接显示器" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "只使用外部" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "只使用内置" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "以另一个用户身份登录" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "解锁窗口" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "应用程序" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "搜索" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "“%s”已就绪" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "您想保留这些显示设置吗?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "还原设置" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "保留更改" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "设置更改将在 %d 后还原" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:677 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "最小化" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "取消最大化" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "最大化" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "移动" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "改变大小" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "在屏幕中移动标题栏" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "置顶" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "总在可见工作区" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "移至左工作区" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "移至右工作区" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "移至上工作区" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "移至下工作区" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "移到上边显示器" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "移到下边显示器" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "移到左边显示器" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "移至右边显示器" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution 日历" + +#: src/main.c:408 +msgid "Print version" +msgstr "打印版本" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "GDM 用于登录屏幕的模式" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "使用指定模式,如“gdm”用于登录屏幕" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "列出可用的模式" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "未知" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "启动“%s”失败" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "密码不匹配。" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "密码不能为空" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "认证对话框已被用户取消" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u 个输出" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u 个输入" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "系统声音" + +#~ msgid "toggle-switch-us" +#~ msgstr "toggle-switch-us" + +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "载入 %s 的首选项对话框时出错:" + +#~ msgid "%s all day." +#~ msgstr "全天%s。" + +#~ msgid "%s, then %s later." +#~ msgstr "%s转%s。" + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s转%s,随后转%s。" + +#~ msgid "Feels like %s." +#~ msgstr "体感温度 %s。" + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ msgctxt "search-result" +#~ msgid "Power off" +#~ msgstr "关机" + +#~ msgctxt "search-result" +#~ msgid "Log out" +#~ msgstr "注销" + +#~ msgctxt "search-result" +#~ msgid "Switch user" +#~ msgstr "切换用户" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Shell 扩展首选项" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "网页认证重定向" + +#~ msgid "Events" +#~ msgstr "事件" + +#~ msgid "Notifications" +#~ msgstr "提示" + +#~ msgid "Hide tray" +#~ msgstr "隐藏托盘" + +#~ msgid "Status Icons" +#~ msgstr "状态图标" + +#~ msgid "Clear section" +#~ msgstr "清除选中项目" + +#~ msgid "Media" +#~ msgstr "媒体" + +#~ msgid "Not In Use" +#~ msgstr "未在使用" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "在日历中显示星期" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "如果为 true,在日历中显示 ISO 周日期。" + +#~ msgid "Use as Internet connection" +#~ msgstr "使用互联网连接" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s 申请访问您的位置信息。" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (wayland 合成器)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "已连接 %d 台设备" + +#~ msgid "Authentication required" +#~ msgstr "需要认证" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "电池" + +#~ msgid "Airplane Mode" +#~ msgstr "乘机模式" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%p %-l:%M" diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..b7273ae --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,2070 @@ +# Chinese (Hong Kong) translation for gnome-shell. +# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Chao-Hsiung Liao , 2010. +# Wei-Lun Chao , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell 3.3.90\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +"shell&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2015-11-03 22:14+0000\n" +"PO-Revision-Date: 2014-08-19 19:17+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (Hong Kong) \n" +"Language: zh_HK\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.6.5\n" + +#: ../data/50-gnome-shell-system.xml.in.h:1 +msgid "System" +msgstr "系統" + +#: ../data/50-gnome-shell-system.xml.in.h:2 +#, fuzzy +#| msgid "%d new notification" +#| msgid_plural "%d new notifications" +msgid "Show the notification list" +msgstr "%d 個新通知" + +#: ../data/50-gnome-shell-system.xml.in.h:3 +msgid "Focus the active notification" +msgstr "聚焦到使用中的通知" + +#: ../data/50-gnome-shell-system.xml.in.h:4 +msgid "Show the overview" +msgstr "顯示概覽" + +#: ../data/50-gnome-shell-system.xml.in.h:5 +msgid "Show all applications" +msgstr "顯示所有的應用程式" + +#: ../data/50-gnome-shell-system.xml.in.h:6 +msgid "Open the application menu" +msgstr "開啟應用程式選單" + +#: ../data/gnome-shell.desktop.in.in.h:1 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: ../data/gnome-shell.desktop.in.in.h:2 +#: ../data/gnome-shell-wayland.desktop.in.in.h:2 +msgid "Window management and application launching" +msgstr "視窗管理與應用程式的執行" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 +msgid "GNOME Shell Extension Preferences" +msgstr "GNOME Shell 擴充功能偏好設定" + +#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 +msgid "Configure GNOME Shell Extensions" +msgstr "設定 GNOME Shell 擴充功能" + +#: ../data/gnome-shell-wayland.desktop.in.in.h:1 +msgid "GNOME Shell (wayland compositor)" +msgstr "GNOME Shell (wayland 組合器)" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "啟用讓開發者與測試者能以 Alt-F2 使用好用的內部工具" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "允許使用 Alt-F2 對話盒存取內部除錯和監控工具。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 +msgid "UUIDs of extensions to enable" +msgstr "要啟用的擴充功能 UUID" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell 擴充功能有 UUID 屬性;這個設定鍵列出了應載入的擴充功能。任何要載" +"入的擴充功能都要出現在這個清單中。你也可以用 org.gnome.Shell 中的 " +"EnableExtension 和 DisableExtension D-Bus 方法來操作這個清單。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 +msgid "Disables the validation of extension version compatibility" +msgstr "停用擴充功能版本兼容性的驗證" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell 只會載入宣稱支援目前運行中版本的擴充功能。啟用此選項會停用這項檢" +"查,並嘗試載入所有的擴充功能,而不去管它們所宣稱支援的版本為何。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 +msgid "List of desktop file IDs for favorite applications" +msgstr "喜好的應用程式桌面檔案 ID 清單" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "對應這些辨別碼的應用程式會顯示在喜好區域。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 +msgid "App Picker View" +msgstr "程式挑選器檢視" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 +msgid "Index of the currently selected view in the application picker." +msgstr "應用程式挑選器中目前選取檢視的索引。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 +msgid "History for command (Alt-F2) dialog" +msgstr "指令 (Alt-F2) 對話盒歷史紀錄" + +#. Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass +#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 +msgid "History for the looking glass dialog" +msgstr "Looking glass 對話盒歷史紀錄" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 +msgid "Always show the 'Log out' menu item in the user menu." +msgstr "永遠在使用者選單顯示「登出」選單項目。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 +msgid "" +"This key overrides the automatic hiding of the 'Log out' menu item in single-" +"user, single-session situations." +msgstr "" +"這個設定鍵會覆蓋在單一使用者、單一作業階段情況下對「登出」選單項目的隱藏。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "是否記住已掛載的加密或遠端檔案系統的密碼" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"'Remember Password' checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"當掛載加密裝置或遠端檔案系統時會要求密碼。如果密碼可以被儲存以供未來使用時會" +"顯示「記住密碼」。這個設定鍵設定了核取方塊的預設狀態。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 +msgid "Show the week date in the calendar" +msgstr "在日曆中顯示週數" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 +msgid "If true, display the ISO week date in the calendar." +msgstr "如果設為 true,在日曆中顯示 ISO 週數。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 +msgid "Keybinding to open the application menu" +msgstr "開啟應用程式選單的組合鍵" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 +msgid "Keybinding to open the application menu." +msgstr "開啟應用程式選單的組合鍵。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 +msgid "Keybinding to open the \"Show Applications\" view" +msgstr "開啟「顯示應用程式」檢視的組合鍵" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 +msgid "" +"Keybinding to open the \"Show Applications\" view of the Activities Overview." +msgstr "開啟活動概覽「顯示應用程式」檢視的組合鍵" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 +msgid "Keybinding to open the overview" +msgstr "開啟概覽的組合鍵" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 +msgid "Keybinding to open the Activities Overview." +msgstr "開啟「活動概覽」的組合鍵。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 +#, fuzzy +#| msgid "Keybinding to toggle the visibility of the message tray" +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "切換訊息匣顯示的組合鍵" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 +#, fuzzy +#| msgid "Keybinding to toggle the visibility of the message tray." +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "切換訊息匣顯示的組合鍵。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 +msgid "Keybinding to focus the active notification" +msgstr "聚焦到使用中通知的組合鍵" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 +msgid "Keybinding to focus the active notification." +msgstr "聚焦到使用中通知的組合鍵。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "暫停與恢復執行中重複項的組合鍵,用於除錯用途" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 +msgid "Which keyboard to use" +msgstr "要使用哪種鍵盤" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 +msgid "The type of keyboard to use." +msgstr "要使用的鍵盤類型。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 +msgid "Limit switcher to current workspace." +msgstr "限制切換器使用目前的工作區" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"如果設定為「true」,切換器將僅顯示目前工作區中的應用程式視窗。否則,所有的應" +"用程式都會包含在內。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 +msgid "The application icon mode." +msgstr "應用程式圖示模式。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" +"only' (shows only the application icon) or 'both'." +msgstr "" +"設定視窗在切換器中如何顯示。有效的數值為「thumbnail-only」(顯示視窗縮圖)、" +"「app-icon-only」(只顯示應用程式圖示) 或「both」。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"如果設定為「true」,切換器將僅顯示目前工作區中的視窗。否則,所有的視窗都會包" +"含在內。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 +msgid "Attach modal dialog to the parent window" +msgstr "在上層視窗附加強制對話盒" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "這個設定鍵會在執行 GNOME Shell 時覆蓋 org.gnome.mutter 中的設定鍵。" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "在螢幕邊緣放下視窗時啟用邊緣拼貼" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 +msgid "Workspaces are managed dynamically" +msgstr "工作區以動態方式管理" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 +msgid "Workspaces only on primary monitor" +msgstr "工作區只在主要顯示器" + +#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "在滑鼠模式中延遲焦點更改直到指標停止移動" + +#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1 +#, fuzzy +#| msgid "Network error" +msgid "Network Login" +msgstr "網絡錯誤" + +#: ../js/extensionPrefs/main.js:122 +#, javascript-format +msgid "There was an error loading the preferences dialog for %s:" +msgstr "載入 %s 的偏好設定對話盒時發生錯誤:" + +#: ../js/extensionPrefs/main.js:154 +msgid "GNOME Shell Extensions" +msgstr "GNOME Shell 擴充功能" + +#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145 +#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452 +#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 +#: ../js/ui/status/network.js:916 +msgid "Cancel" +msgstr "取消" + +#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215 +#: ../js/gdm/authPrompt.js:447 +msgid "Next" +msgstr "下一個" + +#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403 +#: ../js/ui/unlockDialog.js:59 +msgid "Unlock" +msgstr "解鎖" + +#: ../js/gdm/authPrompt.js:213 +msgctxt "button" +msgid "Sign In" +msgstr "登入" + +#: ../js/gdm/loginDialog.js:281 +msgid "Choose Session" +msgstr "選擇作業階段" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: ../js/gdm/loginDialog.js:431 +msgid "Not listed?" +msgstr "沒有列出來?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: ../js/gdm/loginDialog.js:850 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(例如: user 或 %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: ../js/gdm/loginDialog.js:855 ../js/ui/components/networkAgent.js:271 +#: ../js/ui/components/networkAgent.js:289 +msgid "Username: " +msgstr "使用者名稱:" + +#: ../js/gdm/loginDialog.js:1180 +msgid "Login Window" +msgstr "登入視窗" + +#: ../js/gdm/util.js:341 +msgid "Authentication error" +msgstr "核對錯誤" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: ../js/gdm/util.js:473 +msgid "(or swipe finger)" +msgstr "(或是滑過手指)" + +#: ../js/misc/util.js:119 +msgid "Command not found" +msgstr "找不到指令" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: ../js/misc/util.js:152 +msgid "Could not parse command:" +msgstr "無法分析指令:" + +#: ../js/misc/util.js:160 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "執行「%s」失敗:" + +#. Translators: Time in 24h format +#: ../js/misc/util.js:191 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: ../js/misc/util.js:197 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "昨天 %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: ../js/misc/util.js:203 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: ../js/misc/util.js:209 +#, no-c-format +msgid "%B %d, %H∶%M" +msgstr "%m月%d日 %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: ../js/misc/util.js:215 +#, no-c-format +msgid "%B %d %Y, %H∶%M" +msgstr "%Y年%m月%d日 %H:%M" + +#. Translators: Time in 12h format +#: ../js/misc/util.js:220 +msgid "%l∶%M %p" +msgstr "%p %l∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: ../js/misc/util.js:226 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "昨天 %p %l∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: ../js/misc/util.js:232 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A%p %l∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: ../js/misc/util.js:238 +#, no-c-format +msgid "%B %d, %l∶%M %p" +msgstr "%m月%d日%p %l∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: ../js/misc/util.js:244 +#, no-c-format +msgid "%B %d %Y, %l∶%M %p" +msgstr "%Y年%m月%d日%p %l∶%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login +#. * window, until we know the title of the actual login page +#: ../js/portalHelper/main.js:85 +msgid "Web Authentication Redirect" +msgstr "網頁核對重新導向" + +#: ../js/ui/appDisplay.js:794 +msgid "Frequently used applications will appear here" +msgstr "經常使用的應用程式會出現在這裏" + +#: ../js/ui/appDisplay.js:914 +msgid "Frequent" +msgstr "常用" + +#: ../js/ui/appDisplay.js:921 +msgid "All" +msgstr "全部" + +#: ../js/ui/appDisplay.js:1853 +msgid "New Window" +msgstr "新視窗" + +#: ../js/ui/appDisplay.js:1881 ../js/ui/dash.js:289 +msgid "Remove from Favorites" +msgstr "自喜好中移除" + +#: ../js/ui/appDisplay.js:1887 +msgid "Add to Favorites" +msgstr "加入喜好" + +#: ../js/ui/appDisplay.js:1897 +msgid "Show Details" +msgstr "顯示詳細資訊" + +#: ../js/ui/appFavorites.js:132 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s 已加入你的喜好中。" + +#: ../js/ui/appFavorites.js:166 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s 已經從你的喜好中移除。" + +#: ../js/ui/backgroundMenu.js:19 +msgid "Change Background…" +msgstr "改變背景…" + +#: ../js/ui/backgroundMenu.js:21 +#, fuzzy +#| msgid "Wired Settings" +msgid "Display Settings" +msgstr "有線設定值" + +#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366 +msgid "Settings" +msgstr "設定值" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: ../js/ui/calendar.js:55 +msgctxt "calendar-no-work" +msgid "06" +msgstr "" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: ../js/ui/calendar.js:84 +msgctxt "grid sunday" +msgid "S" +msgstr "日" + +#. Translators: Calendar grid abbreviation for Monday +#: ../js/ui/calendar.js:86 +msgctxt "grid monday" +msgid "M" +msgstr "一" + +#. Translators: Calendar grid abbreviation for Tuesday +#: ../js/ui/calendar.js:88 +msgctxt "grid tuesday" +msgid "T" +msgstr "二" + +#. Translators: Calendar grid abbreviation for Wednesday +#: ../js/ui/calendar.js:90 +msgctxt "grid wednesday" +msgid "W" +msgstr "三" + +#. Translators: Calendar grid abbreviation for Thursday +#: ../js/ui/calendar.js:92 +msgctxt "grid thursday" +msgid "T" +msgstr "四" + +#. Translators: Calendar grid abbreviation for Friday +#: ../js/ui/calendar.js:94 +msgctxt "grid friday" +msgid "F" +msgstr "五" + +#. Translators: Calendar grid abbreviation for Saturday +#: ../js/ui/calendar.js:96 +msgctxt "grid saturday" +msgid "S" +msgstr "六" + +#: ../js/ui/calendar.js:566 +msgid "Previous month" +msgstr "上個月" + +#: ../js/ui/calendar.js:576 +msgid "Next month" +msgstr "下個月" + +#: ../js/ui/calendar.js:728 +#, javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "" + +#: ../js/ui/calendar.js:783 +msgid "Week %V" +msgstr "" + +#. 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:1188 +msgctxt "event list time" +msgid "All Day" +msgstr "整天" + +#: ../js/ui/calendar.js:1295 +msgid "Clear section" +msgstr "" + +#: ../js/ui/calendar.js:1522 +msgid "Events" +msgstr "" + +#: ../js/ui/calendar.js:1531 +msgctxt "calendar heading" +msgid "%A, %B %d" +msgstr "%m月%d日%A" + +#: ../js/ui/calendar.js:1535 +msgctxt "calendar heading" +msgid "%A, %B %d, %Y" +msgstr "%Y年%m月%d日%A" + +#: ../js/ui/calendar.js:1620 +msgid "Notifications" +msgstr "通知" + +#: ../js/ui/calendar.js:1771 +#, fuzzy +#| msgid "Notifications" +msgid "No Notifications" +msgstr "通知" + +#: ../js/ui/calendar.js:1774 +msgid "No Events" +msgstr "" + +#: ../js/ui/components/automountManager.js:91 +msgid "External drive connected" +msgstr "外部裝置已連接" + +#: ../js/ui/components/automountManager.js:102 +msgid "External drive disconnected" +msgstr "外部裝置已拔除" + +#: ../js/ui/components/autorunManager.js:351 +#, javascript-format +msgid "Open with %s" +msgstr "用 %s 開啟" + +#: ../js/ui/components/keyring.js:120 ../js/ui/components/polkitAgent.js:315 +msgid "Password:" +msgstr "密碼: " + +#: ../js/ui/components/keyring.js:153 +msgid "Type again:" +msgstr "再輸入一次:" + +#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:269 +#: ../js/ui/status/network.js:352 ../js/ui/status/network.js:919 +msgid "Connect" +msgstr "連線" + +#. Cisco LEAP +#: ../js/ui/components/networkAgent.js:233 +#: ../js/ui/components/networkAgent.js:245 +#: ../js/ui/components/networkAgent.js:273 +#: ../js/ui/components/networkAgent.js:293 +#: ../js/ui/components/networkAgent.js:303 +msgid "Password: " +msgstr "密碼: " + +#. static WEP +#: ../js/ui/components/networkAgent.js:238 +msgid "Key: " +msgstr "密碼匙:" + +#: ../js/ui/components/networkAgent.js:277 +msgid "Identity: " +msgstr "識別:" + +#: ../js/ui/components/networkAgent.js:279 +msgid "Private key password: " +msgstr "私密密碼匙密碼:" + +#: ../js/ui/components/networkAgent.js:291 +msgid "Service: " +msgstr "服務:" + +#: ../js/ui/components/networkAgent.js:320 +#: ../js/ui/components/networkAgent.js:658 +msgid "Authentication required by wireless network" +msgstr "無線網絡所需要的核對" + +#: ../js/ui/components/networkAgent.js:321 +#: ../js/ui/components/networkAgent.js:659 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "需要密碼或是加密密碼匙來存取無線網絡「%s」。" + +#: ../js/ui/components/networkAgent.js:325 +#: ../js/ui/components/networkAgent.js:662 +msgid "Wired 802.1X authentication" +msgstr "有線網絡 802.1X 核對" + +#: ../js/ui/components/networkAgent.js:327 +msgid "Network name: " +msgstr "網絡名稱:" + +#: ../js/ui/components/networkAgent.js:332 +#: ../js/ui/components/networkAgent.js:666 +msgid "DSL authentication" +msgstr "DSL 核對" + +#: ../js/ui/components/networkAgent.js:339 +#: ../js/ui/components/networkAgent.js:672 +msgid "PIN code required" +msgstr "需要 PIN 碼" + +#: ../js/ui/components/networkAgent.js:340 +#: ../js/ui/components/networkAgent.js:673 +msgid "PIN code is needed for the mobile broadband device" +msgstr "這個流動寬頻裝置需要 PIN 碼" + +#: ../js/ui/components/networkAgent.js:341 +msgid "PIN: " +msgstr "PIN: " + +#: ../js/ui/components/networkAgent.js:348 +#: ../js/ui/components/networkAgent.js:679 +msgid "Mobile broadband network password" +msgstr "流動寬頻網絡密碼" + +#: ../js/ui/components/networkAgent.js:349 +#: ../js/ui/components/networkAgent.js:663 +#: ../js/ui/components/networkAgent.js:667 +#: ../js/ui/components/networkAgent.js:680 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "連線至「%s」需要密碼。" + +#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1658 +msgid "Network Manager" +msgstr "網絡管理員" + +#: ../js/ui/components/polkitAgent.js:60 +msgid "Authentication Required" +msgstr "要求核對" + +#: ../js/ui/components/polkitAgent.js:102 +msgid "Administrator" +msgstr "系統管理員" + +#: ../js/ui/components/polkitAgent.js:182 +msgid "Authenticate" +msgstr "核對" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: ../js/ui/components/polkitAgent.js:301 ../js/ui/shellMountOperation.js:383 +msgid "Sorry, that didn't work. Please try again." +msgstr "抱歉,那樣沒有作用。請再試一次。" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: ../js/ui/components/telepathyClient.js:759 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s 現在被稱為 %s" + +#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:155 +msgid "Windows" +msgstr "視窗" + +#: ../js/ui/dash.js:250 ../js/ui/dash.js:291 +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 +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:73 +#, fuzzy +#| msgid "%A %B %e, %Y" +msgid "%B %e %Y" +msgstr "%Y年%m月%e日%A" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: ../js/ui/dateMenu.js:80 +#, fuzzy +#| msgid "%A %B %e, %Y" +msgid "%A %B %e %Y" +msgstr "%Y年%m月%e日%A" + +#: ../js/ui/dateMenu.js:160 +msgid "Add world clocks…" +msgstr "" + +#: ../js/ui/dateMenu.js:161 +#, fuzzy +#| msgid "Open Clocks" +msgid "World Clocks" +msgstr "開啟時鐘" + +#: ../js/ui/endSessionDialog.js:64 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "登出 %s" + +#: ../js/ui/endSessionDialog.js:65 +msgctxt "title" +msgid "Log Out" +msgstr "登出" + +#: ../js/ui/endSessionDialog.js:67 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s 會在 %d 秒後自動登出。" + +#: ../js/ui/endSessionDialog.js:72 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "你會在 %d 秒後自動登出。" + +#: ../js/ui/endSessionDialog.js:78 +msgctxt "button" +msgid "Log Out" +msgstr "登出" + +#: ../js/ui/endSessionDialog.js:84 +msgctxt "title" +msgid "Power Off" +msgstr "關閉電源" + +#: ../js/ui/endSessionDialog.js:85 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "安裝更新並關機" + +#: ../js/ui/endSessionDialog.js:87 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "系統會在 %d 秒後關閉電源。" + +#: ../js/ui/endSessionDialog.js:91 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "安裝擱置的軟件更新" + +#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111 +msgctxt "button" +msgid "Restart" +msgstr "重新啟動" + +#: ../js/ui/endSessionDialog.js:96 +msgctxt "button" +msgid "Power Off" +msgstr "關閉電源" + +#: ../js/ui/endSessionDialog.js:103 +msgctxt "title" +msgid "Restart" +msgstr "重新啟動" + +#: ../js/ui/endSessionDialog.js:105 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "系統會在 %d 秒後自動重新啟動。" + +#: ../js/ui/endSessionDialog.js:119 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "重新啟動並安裝更新" + +#: ../js/ui/endSessionDialog.js:121 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "系統會在 %d 秒後自動重新啟動。" + +#: ../js/ui/endSessionDialog.js:127 +msgctxt "button" +msgid "Restart & Install" +msgstr "重新啟動並安裝" + +#: ../js/ui/endSessionDialog.js:128 +msgctxt "button" +msgid "Install & Power Off" +msgstr "安裝並關機" + +#: ../js/ui/endSessionDialog.js:129 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "在安裝完更新之後關機" + +#: ../js/ui/endSessionDialog.js:338 +msgid "Running on battery power: please plug in before installing updates." +msgstr "正使用電池電源執行:請在安裝更新之前插入電源線。" + +#: ../js/ui/endSessionDialog.js:355 +msgid "Some applications are busy or have unsaved work." +msgstr "部分應用程式忙碌中或有未儲存的工作。" + +#: ../js/ui/endSessionDialog.js:362 +msgid "Other users are logged in." +msgstr "其他使用者已登入。" + +#. Translators: Remote here refers to a remote session, like a ssh login +#: ../js/ui/endSessionDialog.js:640 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (遠端)" + +#. Translators: Console here refers to a tty like a VT console +#: ../js/ui/endSessionDialog.js:643 +#, javascript-format +msgid "%s (console)" +msgstr "%s (主控臺)" + +#: ../js/ui/extensionDownloader.js:199 +msgid "Install" +msgstr "安裝" + +#: ../js/ui/extensionDownloader.js:204 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "是否從 extensions.gnome.org 下載並安裝「%s」?" + +#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:713 +msgid "Keyboard" +msgstr "鍵盤" + +#. translators: 'Hide' is a verb +#: ../js/ui/legacyTray.js:66 +#, fuzzy +#| msgid "Hide Text" +msgid "Hide tray" +msgstr "隱藏文字" + +#: ../js/ui/legacyTray.js:107 +msgid "Status Icons" +msgstr "" + +#: ../js/ui/lookingGlass.js:643 +msgid "No extensions installed" +msgstr "沒有安裝擴充功能" + +#. Translators: argument is an extension UUID. +#: ../js/ui/lookingGlass.js:697 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s 沒有發出任何錯誤。" + +#: ../js/ui/lookingGlass.js:703 +msgid "Hide Errors" +msgstr "隱藏錯誤" + +#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 +msgid "Show Errors" +msgstr "顯示錯誤" + +#: ../js/ui/lookingGlass.js:716 +msgid "Enabled" +msgstr "已啟用" + +#. translators: +#. * The device has been disabled +#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828 +msgid "Disabled" +msgstr "已停用" + +#: ../js/ui/lookingGlass.js:721 +msgid "Error" +msgstr "錯誤" + +#: ../js/ui/lookingGlass.js:723 +msgid "Out of date" +msgstr "過期" + +#: ../js/ui/lookingGlass.js:725 +msgid "Downloading" +msgstr "下載中" + +#: ../js/ui/lookingGlass.js:749 +msgid "View Source" +msgstr "檢示來源" + +#: ../js/ui/lookingGlass.js:758 +msgid "Web Page" +msgstr "網頁" + +#: ../js/ui/messageTray.js:1486 +msgid "System Information" +msgstr "系統資訊" + +#: ../js/ui/overview.js:84 +msgid "Undo" +msgstr "復原" + +#: ../js/ui/overview.js:117 +msgid "Overview" +msgstr "概覽" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: ../js/ui/overview.js:244 +msgid "Type to search…" +msgstr "輸入以搜尋…" + +#: ../js/ui/panel.js:358 +msgid "Quit" +msgstr "結束" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: ../js/ui/panel.js:414 +msgid "Activities" +msgstr "概覽 " + +#: ../js/ui/panel.js:695 +#, fuzzy +#| msgid "System" +msgctxt "System menu in the top bar" +msgid "System" +msgstr "系統" + +#: ../js/ui/panel.js:807 +msgid "Top Bar" +msgstr "頂端列" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: ../js/ui/popupMenu.js:289 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: ../js/ui/runDialog.js:71 +msgid "Enter a Command" +msgstr "請輸入指令" + +#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162 +msgid "Close" +msgstr "關閉" + +#: ../js/ui/runDialog.js:282 +msgid "Restarting…" +msgstr "重新啟動…" + +#. Translators: This is a time format for a date in +#. long format +#: ../js/ui/screenShield.js:85 +msgid "%A, %B %d" +msgstr "%m月%d日%A" + +#: ../js/ui/screenShield.js:144 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d 個新訊息" + +#: ../js/ui/screenShield.js:146 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d 個新通知" + +#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:374 +msgid "Lock" +msgstr "鎖定" + +#: ../js/ui/screenShield.js:684 +msgid "GNOME needs to lock the screen" +msgstr "GNOME 需要鎖定螢幕" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271 +msgid "Unable to lock" +msgstr "無法鎖定" + +#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272 +msgid "Lock was blocked by an application" +msgstr "鎖定被應用程式阻擋" + +#: ../js/ui/search.js:617 +msgid "Searching…" +msgstr "搜尋…" + +#: ../js/ui/search.js:619 +msgid "No results." +msgstr "沒有結果。" + +#: ../js/ui/shellEntry.js:25 +msgid "Copy" +msgstr "複製" + +#: ../js/ui/shellEntry.js:30 +msgid "Paste" +msgstr "貼上" + +#: ../js/ui/shellEntry.js:97 +msgid "Show Text" +msgstr "顯示文字" + +#: ../js/ui/shellEntry.js:99 +msgid "Hide Text" +msgstr "隱藏文字" + +#: ../js/ui/shellMountOperation.js:370 +msgid "Password" +msgstr "密碼" + +#: ../js/ui/shellMountOperation.js:391 +msgid "Remember Password" +msgstr "記住密碼" + +#: ../js/ui/status/accessibility.js:42 +msgid "Accessibility" +msgstr "無障礙功能" + +#: ../js/ui/status/accessibility.js:57 +msgid "Zoom" +msgstr "縮放" + +#: ../js/ui/status/accessibility.js:64 +msgid "Screen Reader" +msgstr "螢幕閱讀器" + +#: ../js/ui/status/accessibility.js:68 +msgid "Screen Keyboard" +msgstr "螢幕鍵盤" + +#: ../js/ui/status/accessibility.js:72 +msgid "Visual Alerts" +msgstr "視覺警示" + +#: ../js/ui/status/accessibility.js:75 +msgid "Sticky Keys" +msgstr "黏性特殊鍵" + +#: ../js/ui/status/accessibility.js:78 +msgid "Slow Keys" +msgstr "遲緩按鍵" + +#: ../js/ui/status/accessibility.js:81 +msgid "Bounce Keys" +msgstr "反彈鍵" + +#: ../js/ui/status/accessibility.js:84 +msgid "Mouse Keys" +msgstr "滑鼠按鍵" + +#: ../js/ui/status/accessibility.js:167 +msgid "High Contrast" +msgstr "高反差" + +#: ../js/ui/status/accessibility.js:202 +msgid "Large Text" +msgstr "大型文字" + +#: ../js/ui/status/bluetooth.js:50 +msgid "Bluetooth" +msgstr "藍牙" + +#: ../js/ui/status/bluetooth.js:59 +msgid "Bluetooth Settings" +msgstr "藍牙設定值" + +#. Translators: this is the number of connected bluetooth devices +#: ../js/ui/status/bluetooth.js:139 +#, fuzzy, javascript-format +#| msgid "Connected" +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "已連線" + +#: ../js/ui/status/bluetooth.js:141 +msgid "Off" +msgstr "關閉" + +#: ../js/ui/status/bluetooth.js:143 +#, fuzzy +#| msgid "In Use" +msgid "Not In Use" +msgstr "使用中" + +#: ../js/ui/status/bluetooth.js:145 ../js/ui/status/network.js:1279 +msgid "Turn On" +msgstr "開啟" + +#: ../js/ui/status/bluetooth.js:145 ../js/ui/status/network.js:178 +#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279 +#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90 +#: ../js/ui/status/rfkill.js:117 +msgid "Turn Off" +msgstr "關閉" + +#: ../js/ui/status/brightness.js:44 +msgid "Brightness" +msgstr "亮度" + +#: ../js/ui/status/keyboard.js:736 +msgid "Show Keyboard Layout" +msgstr "顯示鍵盤配置" + +#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177 +#, fuzzy +#| msgid "Location" +msgid "Location Enabled" +msgstr "位置" + +#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178 +msgid "Disable" +msgstr "停用" + +#: ../js/ui/status/location.js:73 +#, fuzzy +#| msgid "Power Settings" +msgid "Privacy Settings" +msgstr "電源設定值" + +#: ../js/ui/status/location.js:176 +#, fuzzy +#| msgid "Location" +msgid "Location In Use" +msgstr "位置" + +#: ../js/ui/status/location.js:180 +#, fuzzy +#| msgid "Connection failed" +msgid "Location Disabled" +msgstr "連線失敗" + +#: ../js/ui/status/location.js:181 +msgid "Enable" +msgstr "啟用" + +#: ../js/ui/status/network.js:101 +msgid "" +msgstr "<不明>" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308 +#, javascript-format +msgid "%s Off" +msgstr "" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:454 +#, fuzzy, javascript-format +#| msgid "Connected" +msgid "%s Connected" +msgstr "已連線" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: ../js/ui/status/network.js:459 +#, fuzzy, javascript-format +#| msgid "Unmanaged" +msgid "%s Unmanaged" +msgstr "未管理" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:462 +#, fuzzy, javascript-format +#| msgid "Disconnecting" +msgid "%s Disconnecting" +msgstr "斷線" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300 +#, fuzzy, javascript-format +#| msgid "Connecting" +msgid "%s Connecting" +msgstr "連線中" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: ../js/ui/status/network.js:472 +#, fuzzy, javascript-format +#| msgid "Wired 802.1X authentication" +msgid "%s Requires Authentication" +msgstr "有線網絡 802.1X 核對" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: ../js/ui/status/network.js:480 +#, fuzzy, javascript-format +#| msgid "Firmware missing" +msgid "Firmware Missing For %s" +msgstr "缺少韌體" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: ../js/ui/status/network.js:484 +#, fuzzy, javascript-format +#| msgid "Unavailable" +msgid "%s Unavailable" +msgstr "無法使用" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:487 +#, fuzzy, javascript-format +#| msgid "Connection failed" +msgid "%s Connection Failed" +msgstr "連線失敗" + +#: ../js/ui/status/network.js:503 +msgid "Wired Settings" +msgstr "有線設定值" + +#: ../js/ui/status/network.js:545 ../js/ui/status/network.js:624 +msgid "Mobile Broadband Settings" +msgstr "流動寬頻設定值" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 +#, fuzzy, javascript-format +#| msgid "Hardware Disabled" +msgid "%s Hardware Disabled" +msgstr "硬件已停用" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: ../js/ui/status/network.js:592 +#, fuzzy, javascript-format +#| msgid "Disabled" +msgid "%s Disabled" +msgstr "已停用" + +#: ../js/ui/status/network.js:632 +msgid "Use as Internet connection" +msgstr "作為互聯網連線" + +#: ../js/ui/status/network.js:813 +msgid "Airplane Mode is On" +msgstr "飛安模式開啟" + +#: ../js/ui/status/network.js:814 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "開啟飛安模式時會停用 Wi-Fi 。" + +#: ../js/ui/status/network.js:815 +msgid "Turn Off Airplane Mode" +msgstr "關閉飛安模式" + +#: ../js/ui/status/network.js:824 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi 關閉" + +#: ../js/ui/status/network.js:825 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "需要開啟 Wi-Fi 才能連接網絡。" + +#: ../js/ui/status/network.js:826 +msgid "Turn On Wi-Fi" +msgstr "開啟 Wi-Fi" + +#: ../js/ui/status/network.js:851 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi 網絡" + +#: ../js/ui/status/network.js:853 +msgid "Select a network" +msgstr "選擇一個網絡" + +#: ../js/ui/status/network.js:883 +msgid "No Networks" +msgstr "沒有網絡" + +#: ../js/ui/status/network.js:904 ../js/ui/status/rfkill.js:115 +msgid "Use hardware switch to turn off" +msgstr "使用硬件開關來關閉" + +#: ../js/ui/status/network.js:1171 +msgid "Select Network" +msgstr "選擇網絡" + +#: ../js/ui/status/network.js:1177 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi 設定值" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:1296 +#, fuzzy, javascript-format +#| msgid "Hotspot Active" +msgid "%s Hotspot Active" +msgstr "熱點活動中" + +#. Translators: %s is a network identifier +#: ../js/ui/status/network.js:1311 +#, fuzzy, javascript-format +#| msgid "Not Connected" +msgid "%s Not Connected" +msgstr "未連線" + +#: ../js/ui/status/network.js:1411 +msgid "connecting..." +msgstr "連線中…" + +#. Translators: this is for network connections that require some kind of key or password +#: ../js/ui/status/network.js:1414 +msgid "authentication required" +msgstr "要求核對" + +#: ../js/ui/status/network.js:1416 +msgid "connection failed" +msgstr "連線失敗" + +#: ../js/ui/status/network.js:1482 ../js/ui/status/rfkill.js:93 +msgid "Network Settings" +msgstr "網絡設定值" + +#: ../js/ui/status/network.js:1484 +msgid "VPN Settings" +msgstr "VPN 設定值" + +#: ../js/ui/status/network.js:1503 +msgid "VPN" +msgstr "VPN" + +#: ../js/ui/status/network.js:1513 +#, fuzzy +#| msgid "Power Off" +msgid "VPN Off" +msgstr "關閉電源" + +#: ../js/ui/status/network.js:1697 +msgid "Connection failed" +msgstr "連線失敗" + +#: ../js/ui/status/network.js:1698 +msgid "Activation of network connection failed" +msgstr "啟動網絡連線失敗" + +#: ../js/ui/status/power.js:49 +msgid "Power Settings" +msgstr "電源設定值" + +#: ../js/ui/status/power.js:65 +msgid "Fully Charged" +msgstr "已完全充飽" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 +msgid "Estimating…" +msgstr "評估中…" + +#. Translators: this is : Remaining () +#: ../js/ui/status/power.js:86 +#, javascript-format +msgid "%d∶%02d Remaining (%d%%)" +msgstr "剩餘時間 %d∶%02d (%d%%)" + +#. Translators: this is : Until Full () +#: ../js/ui/status/power.js:91 +#, javascript-format +msgid "%d∶%02d Until Full (%d%%)" +msgstr "直到充滿還需 %d∶%02d (%d%%)" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: ../js/ui/status/rfkill.js:88 +#, fuzzy +#| msgid "Airplane Mode is On" +msgid "Airplane Mode On" +msgstr "飛安模式開啟" + +#: ../js/ui/status/system.js:343 +msgid "Switch User" +msgstr "切換使用者" + +#: ../js/ui/status/system.js:348 +msgid "Log Out" +msgstr "登出" + +#: ../js/ui/status/system.js:353 +#, fuzzy +#| msgid "Power Settings" +msgid "Account Settings" +msgstr "電源設定值" + +#: ../js/ui/status/system.js:370 +msgid "Orientation Lock" +msgstr "方向鎖" + +#: ../js/ui/status/system.js:378 +msgid "Suspend" +msgstr "暫停" + +#: ../js/ui/status/system.js:381 +msgid "Power Off" +msgstr "關閉電源" + +#: ../js/ui/status/volume.js:127 +msgid "Volume changed" +msgstr "音量已更改" + +#: ../js/ui/status/volume.js:162 +msgid "Volume" +msgstr "音量" + +#: ../js/ui/status/volume.js:213 +msgid "Microphone" +msgstr "麥克風" + +#: ../js/ui/unlockDialog.js:67 +msgid "Log in as another user" +msgstr "以另一個使用者身分登入" + +#: ../js/ui/unlockDialog.js:84 +msgid "Unlock Window" +msgstr "解鎖視窗" + +#: ../js/ui/viewSelector.js:159 +msgid "Applications" +msgstr "應用程式" + +#: ../js/ui/viewSelector.js:163 +msgid "Search" +msgstr "搜尋" + +#: ../js/ui/windowAttentionHandler.js:20 +#, javascript-format +msgid "“%s” is ready" +msgstr "「%s」已就緒" + +#: ../js/ui/windowManager.js:63 +msgid "Do you want to keep these display settings?" +msgstr "你想要保留這些顯示器設定值嗎?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: ../js/ui/windowManager.js:82 +msgid "Revert Settings" +msgstr "還原設定值" + +#: ../js/ui/windowManager.js:85 +msgid "Keep Changes" +msgstr "保留更改" + +#: ../js/ui/windowManager.js:103 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "設定值的更改會在 %d 秒內還原" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: ../js/ui/windowManager.js:658 +#, javascript-format +msgid "%d x %d" +msgstr "" + +#: ../js/ui/windowMenu.js:34 +msgid "Minimize" +msgstr "最小化" + +#: ../js/ui/windowMenu.js:41 +msgid "Unmaximize" +msgstr "取消最大化" + +#: ../js/ui/windowMenu.js:45 +msgid "Maximize" +msgstr "最大化" + +#: ../js/ui/windowMenu.js:52 +msgid "Move" +msgstr "移動" + +#: ../js/ui/windowMenu.js:58 +msgid "Resize" +msgstr "重設大小" + +#: ../js/ui/windowMenu.js:65 +msgid "Move Titlebar Onscreen" +msgstr "移動螢幕標題列" + +#: ../js/ui/windowMenu.js:70 +msgid "Always on Top" +msgstr "永遠在最上層" + +#: ../js/ui/windowMenu.js:89 +msgid "Always on Visible Workspace" +msgstr "永遠在顯示的工作區" + +#: ../js/ui/windowMenu.js:105 +#, fuzzy +#| msgid "Move to Workspace Up" +msgid "Move to Workspace Left" +msgstr "將工作區上移" + +#: ../js/ui/windowMenu.js:110 +#, fuzzy +#| msgid "Move to Workspace Up" +msgid "Move to Workspace Right" +msgstr "將工作區上移" + +#: ../js/ui/windowMenu.js:115 +msgid "Move to Workspace Up" +msgstr "將工作區上移" + +#: ../js/ui/windowMenu.js:120 +msgid "Move to Workspace Down" +msgstr "將工作區下移" + +#: ../js/ui/windowMenu.js:136 +#, fuzzy +#| msgid "Move to Workspace Up" +msgid "Move to Monitor Up" +msgstr "將工作區上移" + +#: ../js/ui/windowMenu.js:142 +#, fuzzy +#| msgid "Move to Workspace Down" +msgid "Move to Monitor Down" +msgstr "將工作區下移" + +#: ../js/ui/windowMenu.js:148 +msgid "Move to Monitor Left" +msgstr "" + +#: ../js/ui/windowMenu.js:154 +msgid "Move to Monitor Right" +msgstr "" + +#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 +msgid "Evolution Calendar" +msgstr "Evolution 行事曆" + +#. translators: +#. * The number of sound outputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1835 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u 輸出" + +#. translators: +#. * The number of sound inputs on a particular device +#: ../src/gvc/gvc-mixer-control.c:1845 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u 輸入" + +#: ../src/gvc/gvc-mixer-control.c:2371 +msgid "System Sounds" +msgstr "系統音效" + +#: ../src/main.c:381 +msgid "Print version" +msgstr "顯示版本" + +#: ../src/main.c:387 +msgid "Mode used by GDM for login screen" +msgstr "GDM 在登入畫面使用的模式" + +#: ../src/main.c:393 +msgid "Use a specific mode, e.g. \"gdm\" for login screen" +msgstr "使用指定的模式,例如「gdm」為登入畫面" + +#: ../src/main.c:399 +msgid "List possible modes" +msgstr "列出可能的模式" + +#: ../src/shell-app.c:246 +msgctxt "program" +msgid "Unknown" +msgstr "不明" + +#: ../src/shell-app.c:487 +#, c-format +msgid "Failed to launch “%s”" +msgstr "無法啟動「%s」" + +#: ../src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "密碼不相符。" + +#: ../src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "密碼不能為空白" + +#: ../src/shell-polkit-authentication-agent.c:353 +msgid "Authentication dialog was dismissed by the user" +msgstr "核對對話盒被使用者取消了" + +#~ msgid "Show the message tray" +#~ msgstr "顯示資訊匣" + +#~ msgid "Captive Portal" +#~ msgstr "網頁入口管制" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%p %l∶%M" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "日" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "一" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "二" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "三" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "四" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "五" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "六" + +#~ msgid "Nothing Scheduled" +#~ msgstr "沒有預訂行程" + +#~ msgid "Today" +#~ msgstr "今天" + +#~ msgid "Tomorrow" +#~ msgstr "明天" + +#~ msgid "This week" +#~ msgstr "本週" + +#~ msgid "Next week" +#~ msgstr "下週" + +#~ msgid "Removable Devices" +#~ msgstr "可移除式裝置" + +#~ msgid "Eject" +#~ msgstr "退出" + +#~ msgid "Invitation" +#~ msgstr "邀請" + +#~ msgid "Call" +#~ msgstr "通話" + +#~ msgid "File Transfer" +#~ msgstr "檔案傳輸程式" + +#~ msgid "Chat" +#~ msgstr "聊天" + +#~ msgid "Unmute" +#~ msgstr "取消靜音" + +#~ msgid "Mute" +#~ msgstr "靜音" + +#~ msgid "Invitation to %s" +#~ msgstr "邀請加入 %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s 正在邀請你加入 %s" + +#~ msgid "Decline" +#~ msgstr "拒絕" + +#~ msgid "Accept" +#~ msgstr "接受" + +#~ msgid "Video call from %s" +#~ msgstr "來自 %s 的視像電話" + +#~ msgid "Call from %s" +#~ msgstr "%s 來電" + +#~ msgid "Answer" +#~ msgstr "接聽" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s 正傳送給你 %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s 想要得到查看你上線狀態的許可" + +#~ msgid "Authentication failed" +#~ msgstr "核對失敗" + +#~ msgid "Encryption error" +#~ msgstr "加密發生錯誤" + +#~ msgid "Certificate not provided" +#~ msgstr "沒有提供證書" + +#~ msgid "Certificate untrusted" +#~ msgstr "證書不被信任" + +#~ msgid "Certificate expired" +#~ msgstr "證書已逾期" + +#~ msgid "Certificate not activated" +#~ msgstr "證書尚未使用" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "證書主機名稱不符" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "證書數碼指紋不符" + +#~ msgid "Certificate self-signed" +#~ msgstr "證書為自我簽署" + +#~ msgid "Status is set to offline" +#~ msgstr "狀態設為離線" + +#~ msgid "Encryption is not available" +#~ msgstr "加密無法使用" + +#~ msgid "Certificate is invalid" +#~ msgstr "證書無效" + +#~ msgid "Connection has been refused" +#~ msgstr "連線遭到拒絕" + +#~ msgid "Connection can't be established" +#~ msgstr "無法建立連線" + +#~ msgid "Connection has been lost" +#~ msgstr "已失去連線" + +#~ msgid "This account is already connected to the server" +#~ msgstr "這個帳號已連接至該伺服器" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "連線已被使用相同資源的新連線取代" + +#~ msgid "The account already exists on the server" +#~ msgstr "該帳號已經存在於伺服器上" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "伺服器目前過於忙碌以致於無法處理該連線" + +#~ msgid "Certificate has been revoked" +#~ msgstr "證書已被撤銷" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "證書使用不安全的密碼演算法,或是密碼處理上較弱" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "伺服器證書的長度,或是伺服器證書鏈的深度超過密碼函式庫所能處理的範圍" + +#~ msgid "Internal error" +#~ msgstr "內部的錯誤" + +#~ msgid "Unable to connect to %s" +#~ msgstr "無法連線到 %s" + +#~ msgid "View account" +#~ msgstr "檢視帳號" + +#~ msgid "Unknown reason" +#~ msgstr "不明原因" + +#~ msgid "Open Calendar" +#~ msgstr "開啟行事曆" + +#~ msgid "Date & Time Settings" +#~ msgstr "日期與時刻設定值" + +#~ msgid "Open" +#~ msgstr "開啟" + +#~ msgid "Remove" +#~ msgstr "移除" + +#~ msgid "Clear Messages" +#~ msgstr "清除訊息" + +#~ msgid "Notification Settings" +#~ msgstr "通知設定值" + +#~ msgid "Tray Menu" +#~ msgstr "系統匣選單" + +#~ msgid "No Messages" +#~ msgstr "沒有訊息" + +#~ msgid "Message Tray" +#~ msgstr "訊息匣" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d 已連線的裝置" + +#~ msgid "Authentication required" +#~ msgstr "要求核對" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "電池" + +#~ msgid "Airplane Mode" +#~ msgstr "飛安模式" + +#~ msgid "On" +#~ msgstr "開啟" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "地理位置的最高精確等級。" + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "設定應用程式可查看的地理位置最高精確等級。有效的選項為「off」(停用地理位置" +#~ "追蹤)、「country」(國家)、「city」(縣市)、「neiborhood」(鄰里)、「street」" +#~ "(街路)、「exact」(一般需要 GPS 接收器)。請務必記住這只能控制 GeoClue 所允" +#~ "許應用程式查看的等級,而程式可自行使用本身的網路資源尋找使用者的所在位置 " +#~ "(雖然精確度最高只能到達街路等級)。" + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "標題列上的按鈕排列" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "這個設定鍵會在執行 GNOME Shell 時覆蓋 org.gnome.desktop.wm.preferences 中" +#~ "的設定鍵。" + +#~ msgid "Extension" +#~ msgstr "擴充功能" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "使用上面的組合方塊選擇要設定的擴充功能。" + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A%H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%m月%d日%H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%Y年%m月%d日%H:%M " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "要顯示為資料夾的分類清單" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "這個清單中的每個分類名稱都會在應用程式檢視中以資料夾表示,而不是在主要檢視" +#~ "中直接顯示。" + +#~ msgid "Authorization request from %s" +#~ msgstr "來自「%s」的核對要求" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "裝置 %s 想要和這個電腦配對" + +#~ msgid "Allow" +#~ msgstr "允許" + +#~ msgid "Deny" +#~ msgstr "禁止" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "裝置 %s 想要存取服務「%s」" + +#~ msgid "Always grant access" +#~ msgstr "永遠准許存取" + +#~ msgid "Grant this time only" +#~ msgstr "只有這次准許" + +#~ msgid "Reject" +#~ msgstr "拒絕" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s 的配對確認" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "請確認通行碼「%06d」是否和裝置上的相符。" + +#~ msgid "Matches" +#~ msgstr "相符" + +#~ msgid "Does not match" +#~ msgstr "不相符" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s 的配對請求" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "請輸入裝置所提及的 PIN。" + +#~ msgid "OK" +#~ msgstr "確定" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "抱歉,今天可能有些問題:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s Oracle 說:" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..316378b --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,2649 @@ +# Chinese (Taiwan) translation for gnome-shell. +# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-shell package. +# Chao-Hsiung Liao , 2010. +# Wei-Lun Chao , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-shell 3.3.90\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" +"POT-Creation-Date: 2019-03-24 17:37+0000\n" +"PO-Revision-Date: 2019-03-31 23:32+0800\n" +"Last-Translator: Cheng-Chia Tseng \n" +"Language-Team: Chinese (Taiwan) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.2.1\n" + +#: data/50-gnome-shell-system.xml:6 +msgid "System" +msgstr "系統" + +#: data/50-gnome-shell-system.xml:9 +msgid "Show the notification list" +msgstr "顯示通知清單" + +#: data/50-gnome-shell-system.xml:12 +msgid "Focus the active notification" +msgstr "聚焦到使用中的通知" + +#: data/50-gnome-shell-system.xml:15 +msgid "Show the overview" +msgstr "顯示概覽" + +#: data/50-gnome-shell-system.xml:18 +msgid "Show all applications" +msgstr "顯示所有的應用程式" + +#: data/50-gnome-shell-system.xml:21 +msgid "Open the application menu" +msgstr "開啟應用程式選單" + +#: data/gnome-shell-extension-prefs.desktop.in.in:4 +#: js/extensionPrefs/main.js:216 +msgid "Shell Extensions" +msgstr "Shell 擴充套件" + +#: data/gnome-shell-extension-prefs.desktop.in.in:5 +msgid "Configure GNOME Shell Extensions" +msgstr "設定 GNOME Shell 擴充套件" + +#: data/org.gnome.Shell.desktop.in.in:4 +msgid "GNOME Shell" +msgstr "GNOME Shell" + +#: data/org.gnome.Shell.desktop.in.in:5 +msgid "Window management and application launching" +msgstr "視窗管理與應用程式的執行" + +#: data/org.gnome.shell.gschema.xml.in:6 +msgid "Enable internal tools useful for developers and testers from Alt-F2" +msgstr "啟用讓開發者與測試者能以 Alt-F2 使用好用的內部工具" + +#: data/org.gnome.shell.gschema.xml.in:9 +msgid "" +"Allows access to internal debugging and monitoring tools using the Alt-F2 " +"dialog." +msgstr "允許使用 Alt-F2 對話盒存取內部除錯和監控工具。" + +#: data/org.gnome.shell.gschema.xml.in:16 +msgid "UUIDs of extensions to enable" +msgstr "要啟用的擴充套件 UUID" + +#: data/org.gnome.shell.gschema.xml.in:17 +msgid "" +"GNOME Shell extensions have a UUID property; this key lists extensions which " +"should be loaded. Any extension that wants to be loaded needs to be in this " +"list. You can also manipulate this list with the EnableExtension and " +"DisableExtension D-Bus methods on org.gnome.Shell." +msgstr "" +"GNOME Shell 擴充套件有 UUID 屬性;這個設定鍵列出了應載入的擴充套件。任何要載" +"入的擴充套件都要出現在這個清單中。您也可以用 org.gnome.Shell 中的 " +"EnableExtension 和 DisableExtension D-Bus 方法來操作這個清單。" + +#: data/org.gnome.shell.gschema.xml.in:26 +msgid "Disable user extensions" +msgstr "停用所有使用者擴充套件" + +#: data/org.gnome.shell.gschema.xml.in:27 +msgid "" +"Disable all extensions the user has enabled without affecting the “enabled-" +"extension” setting." +msgstr "停用所有使用者啟用的擴充套件但不影響「enabled-extension」設定值。" + +#: data/org.gnome.shell.gschema.xml.in:34 +msgid "Disables the validation of extension version compatibility" +msgstr "停用擴充套件版本相容性的驗證" + +#: data/org.gnome.shell.gschema.xml.in:35 +msgid "" +"GNOME Shell will only load extensions that claim to support the current " +"running version. Enabling this option will disable this check and try to " +"load all extensions regardless of the versions they claim to support." +msgstr "" +"GNOME Shell 只會載入宣稱支援目前運行中版本的擴充套件。啟用此選項會停用這項檢" +"查,並嘗試載入所有的擴充套件,而不去管它們所宣稱支援的版本為何。" + +#: data/org.gnome.shell.gschema.xml.in:43 +msgid "List of desktop file IDs for favorite applications" +msgstr "喜好的應用程式桌面檔案 ID 清單" + +#: data/org.gnome.shell.gschema.xml.in:44 +msgid "" +"The applications corresponding to these identifiers will be displayed in the " +"favorites area." +msgstr "對應這些辨別碼的應用程式會顯示在喜好區域。" + +#: data/org.gnome.shell.gschema.xml.in:51 +msgid "App Picker View" +msgstr "程式挑選器檢視" + +#: data/org.gnome.shell.gschema.xml.in:52 +msgid "Index of the currently selected view in the application picker." +msgstr "應用程式挑選器中目前選取檢視的索引。" + +#: data/org.gnome.shell.gschema.xml.in:58 +msgid "History for command (Alt-F2) dialog" +msgstr "指令 (Alt-F2) 對話盒歷史紀錄" + +#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass +#: data/org.gnome.shell.gschema.xml.in:63 +msgid "History for the looking glass dialog" +msgstr "Looking glass 對話盒歷史紀錄" + +#: data/org.gnome.shell.gschema.xml.in:67 +msgid "Always show the “Log out” menu item in the user menu." +msgstr "永遠在使用者選單顯示「登出」選單項目。" + +#: data/org.gnome.shell.gschema.xml.in:68 +msgid "" +"This key overrides the automatic hiding of the “Log out” menu item in single-" +"user, single-session situations." +msgstr "" +"這個設定鍵會覆蓋在單一使用者、單一工作階段情況下對「登出」選單項目的隱藏。" + +#: data/org.gnome.shell.gschema.xml.in:75 +msgid "" +"Whether to remember password for mounting encrypted or remote filesystems" +msgstr "是否記住已掛載的加密或遠端檔案系統的密碼" + +#: data/org.gnome.shell.gschema.xml.in:76 +msgid "" +"The shell will request a password when an encrypted device or a remote " +"filesystem is mounted. If the password can be saved for future use a " +"“Remember Password” checkbox will be present. This key sets the default " +"state of the checkbox." +msgstr "" +"當掛載加密裝置或遠端檔案系統時會要求密碼。如果密碼可以被儲存以供未來使用時會" +"顯示「記住密碼」。這個設定鍵設定了勾選盒的預設狀態。" + +#: data/org.gnome.shell.gschema.xml.in:85 +msgid "" +"Whether the default Bluetooth adapter had set up devices associated to it" +msgstr "預設藍牙接收器是否已設定與裝置配對" + +#: data/org.gnome.shell.gschema.xml.in:86 +msgid "" +"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +"powered, or if there were devices set up associated with the default " +"adapter. This will be reset if the default adapter is ever seen not to have " +"devices associated to it." +msgstr "" +"Shell 只有在藍牙接收器通上電源或有裝置設定與預設的接收器配對時才會顯示藍牙選" +"單項目。如果預設的接收器尚未與裝置配對時則會重設此選項。" + +#: data/org.gnome.shell.gschema.xml.in:95 +msgid "Enable introspection API" +msgstr "啟用審視 API" + +#: data/org.gnome.shell.gschema.xml.in:96 +msgid "" +"Enables a D-Bus API that allows to introspect the application state of the " +"shell." +msgstr "啟用允許審視 Shell 應用程式狀態的 D-Bus API。" + +#: data/org.gnome.shell.gschema.xml.in:109 +msgid "Keybinding to open the application menu" +msgstr "開啟應用程式選單的組合鍵" + +#: data/org.gnome.shell.gschema.xml.in:110 +msgid "Keybinding to open the application menu." +msgstr "開啟應用程式選單的組合鍵。" + +#: data/org.gnome.shell.gschema.xml.in:116 +msgid "Keybinding to open the “Show Applications” view" +msgstr "開啟「顯示應用程式」檢視的組合鍵" + +#: data/org.gnome.shell.gschema.xml.in:117 +msgid "" +"Keybinding to open the “Show Applications” view of the Activities Overview." +msgstr "開啟活動概覽「顯示應用程式」檢視的組合鍵。" + +#: data/org.gnome.shell.gschema.xml.in:124 +msgid "Keybinding to open the overview" +msgstr "開啟概覽的組合鍵" + +#: data/org.gnome.shell.gschema.xml.in:125 +msgid "Keybinding to open the Activities Overview." +msgstr "開啟「活動概覽」的組合鍵。" + +#: data/org.gnome.shell.gschema.xml.in:131 +msgid "Keybinding to toggle the visibility of the notification list" +msgstr "切換訊息清單顯示的組合鍵" + +#: data/org.gnome.shell.gschema.xml.in:132 +msgid "Keybinding to toggle the visibility of the notification list." +msgstr "切換訊息清單顯示的組合鍵。" + +#: data/org.gnome.shell.gschema.xml.in:138 +msgid "Keybinding to focus the active notification" +msgstr "聚焦到使用中通知的組合鍵" + +#: data/org.gnome.shell.gschema.xml.in:139 +msgid "Keybinding to focus the active notification." +msgstr "聚焦到使用中通知的組合鍵。" + +#: data/org.gnome.shell.gschema.xml.in:145 +msgid "" +"Keybinding that pauses and resumes all running tweens, for debugging purposes" +msgstr "暫停與恢復執行中重複項的組合鍵,用於除錯用途" + +#: data/org.gnome.shell.gschema.xml.in:150 +msgid "Switch to application 1" +msgstr "切換至應用程式 1" + +#: data/org.gnome.shell.gschema.xml.in:154 +msgid "Switch to application 2" +msgstr "切換至應用程式 2" + +#: data/org.gnome.shell.gschema.xml.in:158 +msgid "Switch to application 3" +msgstr "切換至應用程式 3" + +#: data/org.gnome.shell.gschema.xml.in:162 +msgid "Switch to application 4" +msgstr "切換至應用程式 4" + +#: data/org.gnome.shell.gschema.xml.in:166 +msgid "Switch to application 5" +msgstr "切換至應用程式 5" + +#: data/org.gnome.shell.gschema.xml.in:170 +msgid "Switch to application 6" +msgstr "切換至應用程式 6" + +#: data/org.gnome.shell.gschema.xml.in:174 +msgid "Switch to application 7" +msgstr "切換至應用程式 7" + +#: data/org.gnome.shell.gschema.xml.in:178 +msgid "Switch to application 8" +msgstr "切換至應用程式 8" + +#: data/org.gnome.shell.gschema.xml.in:182 +msgid "Switch to application 9" +msgstr "切換至應用程式 9" + +#: data/org.gnome.shell.gschema.xml.in:190 +msgid "Which keyboard to use" +msgstr "要使用哪種鍵盤" + +#: data/org.gnome.shell.gschema.xml.in:191 +msgid "The type of keyboard to use." +msgstr "要使用的鍵盤類型。" + +#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:229 +msgid "Limit switcher to current workspace." +msgstr "限制切換器使用目前的工作區。" + +#: data/org.gnome.shell.gschema.xml.in:203 +msgid "" +"If true, only applications that have windows on the current workspace are " +"shown in the switcher. Otherwise, all applications are included." +msgstr "" +"如果設定為「true」,切換器將僅顯示目前工作區中的應用程式視窗。否則,所有的應" +"用程式都會包含在內。" + +#: data/org.gnome.shell.gschema.xml.in:220 +msgid "The application icon mode." +msgstr "應用程式圖示模式。" + +#: data/org.gnome.shell.gschema.xml.in:221 +msgid "" +"Configures how the windows are shown in the switcher. Valid possibilities " +"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" +"only” (shows only the application icon) or “both”." +msgstr "" +"設定視窗在切換器中如何顯示。有效的數值為「thumbnail-only」(顯示視窗縮圖)、" +"「app-icon-only」(只顯示應用程式圖示) 或「both」。" + +#: data/org.gnome.shell.gschema.xml.in:230 +msgid "" +"If true, only windows from the current workspace are shown in the switcher. " +"Otherwise, all windows are included." +msgstr "" +"如果設定為「true」,切換器將僅顯示目前工作區中的視窗。否則,所有的視窗都會包" +"含在內。" + +#: data/org.gnome.shell.gschema.xml.in:242 +msgid "Attach modal dialog to the parent window" +msgstr "情態對話盒附連母視窗" + +#: data/org.gnome.shell.gschema.xml.in:243 +#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:260 +#: data/org.gnome.shell.gschema.xml.in:268 +#: data/org.gnome.shell.gschema.xml.in:276 +msgid "" +"This key overrides the key in org.gnome.mutter when running GNOME Shell." +msgstr "這個設定鍵會在執行 GNOME Shell 時覆蓋 org.gnome.mutter 中的設定鍵。" + +#: data/org.gnome.shell.gschema.xml.in:251 +msgid "Enable edge tiling when dropping windows on screen edges" +msgstr "在螢幕邊緣放下視窗時啟用邊緣拼貼" + +#: data/org.gnome.shell.gschema.xml.in:259 +msgid "Workspaces are managed dynamically" +msgstr "工作區以動態方式管理" + +#: data/org.gnome.shell.gschema.xml.in:267 +msgid "Workspaces only on primary monitor" +msgstr "工作區只在主要顯示器" + +#: data/org.gnome.shell.gschema.xml.in:275 +msgid "Delay focus changes in mouse mode until the pointer stops moving" +msgstr "在滑鼠模式中延遲焦點變更直到指標停止移動" + +#: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 +msgid "Network Login" +msgstr "網路登入" + +#: js/extensionPrefs/main.js:116 +msgid "Something’s gone wrong" +msgstr "有地方出錯了" + +#: js/extensionPrefs/main.js:123 +msgid "" +"We’re very sorry, but there’s been a problem: the settings for this " +"extension can’t be displayed. We recommend that you report the issue to the " +"extension authors." +msgstr "" +"我們非常抱歉,發生了這個問題:無法顯示此擴充套件的設定。我們建議您回報此議題" +"給擴充套件作者知曉。" + +#: js/extensionPrefs/main.js:130 +msgid "Technical Details" +msgstr "技術細節" + +#: js/extensionPrefs/main.js:165 +msgid "Copy Error" +msgstr "複製錯誤" + +#: js/extensionPrefs/main.js:185 +msgid "Homepage" +msgstr "首頁" + +#: js/extensionPrefs/main.js:186 +msgid "Visit extension homepage" +msgstr "造訪擴充套件首頁" + +#: js/extensionPrefs/main.js:449 +msgid "No Extensions Installed" +msgstr "沒有安裝擴充套件" + +#: js/extensionPrefs/main.js:459 +msgid "" +"Extensions can be installed through Software or extensions.gnome.org." +msgstr "" +"擴充套件可以透過《軟體》或到 extensions.gnome.org 安裝。" + +#: js/extensionPrefs/main.js:474 +msgid "Browse in Software" +msgstr "在《軟體》中瀏覽" + +#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 +#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 +#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 +#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 +msgid "Cancel" +msgstr "取消" + +#: js/gdm/authPrompt.js:159 js/gdm/authPrompt.js:202 js/gdm/authPrompt.js:434 +msgid "Next" +msgstr "下一個" + +#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 +#: js/ui/unlockDialog.js:41 +msgid "Unlock" +msgstr "解鎖" + +#: js/gdm/authPrompt.js:200 +msgctxt "button" +msgid "Sign In" +msgstr "登入" + +#: js/gdm/loginDialog.js:302 +msgid "Choose Session" +msgstr "選擇工作階段" + +#. translators: this message is shown below the user list on the +#. login screen. It can be activated to reveal an entry for +#. manually entering the username. +#: js/gdm/loginDialog.js:446 +msgid "Not listed?" +msgstr "沒有列出來?" + +#. Translators: this message is shown below the username entry field +#. to clue the user in on how to login to the local network realm +#: js/gdm/loginDialog.js:884 +#, javascript-format +msgid "(e.g., user or %s)" +msgstr "(例如: user 或 %s)" + +#. TTLS and PEAP are actually much more complicated, but this complication +#. is not visible here since we only care about phase2 authentication +#. (and don't even care of which one) +#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 +#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 +msgid "Username: " +msgstr "使用者名稱:" + +#: js/gdm/loginDialog.js:1227 +msgid "Login Window" +msgstr "登入視窗" + +#: js/gdm/util.js:337 +msgid "Authentication error" +msgstr "核對錯誤" + +#. We don't show fingerprint messages directly since it's +#. not the main auth service. Instead we use the messages +#. as a cue to display our own message. +#. Translators: this message is shown below the password entry field +#. to indicate the user can swipe their finger instead +#: js/gdm/util.js:477 +msgid "(or swipe finger)" +msgstr "(或是滑過手指)" + +#. Translators: The name of the power-off action in search +#: js/misc/systemActions.js:88 +msgctxt "search-result" +msgid "Power Off" +msgstr "關閉電源" + +#. Translators: A list of keywords that match the power-off action, separated by semicolons +#: js/misc/systemActions.js:91 +msgid "power off;shutdown;reboot;restart" +msgstr "power off;shutdown;reboot;restart;關機;關閉電源;重新開機;重新啟動" + +#. Translators: The name of the lock screen action in search +#: js/misc/systemActions.js:95 +msgctxt "search-result" +msgid "Lock Screen" +msgstr "鎖定螢幕" + +#. Translators: A list of keywords that match the lock screen action, separated by semicolons +#: js/misc/systemActions.js:98 +msgid "lock screen" +msgstr "lock screen;螢幕鎖定" + +#. Translators: The name of the logout action in search +#: js/misc/systemActions.js:102 +msgctxt "search-result" +msgid "Log Out" +msgstr "登出" + +#. Translators: A list of keywords that match the logout action, separated by semicolons +#: js/misc/systemActions.js:105 +msgid "logout;sign off" +msgstr "logout;sign off;登出" + +#. Translators: The name of the suspend action in search +#: js/misc/systemActions.js:109 +msgctxt "search-result" +msgid "Suspend" +msgstr "暫停" + +#. Translators: A list of keywords that match the suspend action, separated by semicolons +#: js/misc/systemActions.js:112 +msgid "suspend;sleep" +msgstr "suspend;sleep;暫停;睡眠" + +#. Translators: The name of the switch user action in search +#: js/misc/systemActions.js:116 +msgctxt "search-result" +msgid "Switch User" +msgstr "切換使用者" + +#. Translators: A list of keywords that match the switch user action, separated by semicolons +#: js/misc/systemActions.js:119 +msgid "switch user" +msgstr "switch user;切換使用者" + +#. Translators: The name of the lock orientation action in search +#: js/misc/systemActions.js:123 +msgctxt "search-result" +msgid "Lock Orientation" +msgstr "鎖定方向" + +#. Translators: A list of keywords that match the lock orientation action, separated by semicolons +#: js/misc/systemActions.js:126 +msgid "lock orientation;screen;rotation" +msgstr "lock orientation;screen;rotation;鎖定方向;方向鎖;螢幕;旋轉" + +#: js/misc/util.js:117 +msgid "Command not found" +msgstr "找不到指令" + +#. Replace "Error invoking GLib.shell_parse_argv: " with +#. something nicer +#: js/misc/util.js:150 +msgid "Could not parse command:" +msgstr "無法分析指令:" + +#: js/misc/util.js:158 +#, javascript-format +msgid "Execution of “%s” failed:" +msgstr "執行「%s」失敗:" + +#: js/misc/util.js:175 +msgid "Just now" +msgstr "就在剛才" + +#: js/misc/util.js:177 +#, javascript-format +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d 分鐘前" + +#: js/misc/util.js:180 +#, javascript-format +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d 小時前" + +#: js/misc/util.js:183 +msgid "Yesterday" +msgstr "昨天" + +#: js/misc/util.js:185 +#, javascript-format +msgid "%d day ago" +msgid_plural "%d days ago" +msgstr[0] "%d 天前" + +#: js/misc/util.js:188 +#, javascript-format +msgid "%d week ago" +msgid_plural "%d weeks ago" +msgstr[0] "%d 週前" + +#: js/misc/util.js:191 +#, javascript-format +msgid "%d month ago" +msgid_plural "%d months ago" +msgstr[0] "%d 個月前" + +#: js/misc/util.js:193 +#, javascript-format +msgid "%d year ago" +msgid_plural "%d years ago" +msgstr[0] "%d 年前" + +#. Translators: Time in 24h format +#: js/misc/util.js:223 +msgid "%H∶%M" +msgstr "%H∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 24h format. i.e. "Yesterday, 14:30" +#: js/misc/util.js:229 +#, no-c-format +msgid "Yesterday, %H∶%M" +msgstr "昨天 %H:%M" + +#. Translators: this is the week day name followed by a time +#. string in 24h format. i.e. "Monday, 14:30" +#: js/misc/util.js:235 +#, no-c-format +msgid "%A, %H∶%M" +msgstr "%A %H∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 24h format. +#. i.e. "May 25, 14:30" +#: js/misc/util.js:241 +#, no-c-format +msgid "%B %-d, %H∶%M" +msgstr "%b%-d日 %H∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 24h format. +#. i.e. "May 25 2012, 14:30" +#: js/misc/util.js:247 +#, no-c-format +msgid "%B %-d %Y, %H∶%M" +msgstr "%Y年%b%-d日 %H:%M" + +#. Translators: Time in 12h format +#: js/misc/util.js:252 +msgid "%l∶%M %p" +msgstr "%p %l∶%M" + +#. Translators: this is the word "Yesterday" followed by a +#. time string in 12h format. i.e. "Yesterday, 2:30 pm" +#: js/misc/util.js:258 +#, no-c-format +msgid "Yesterday, %l∶%M %p" +msgstr "昨天 %p %l∶%M" + +#. Translators: this is the week day name followed by a time +#. string in 12h format. i.e. "Monday, 2:30 pm" +#: js/misc/util.js:264 +#, no-c-format +msgid "%A, %l∶%M %p" +msgstr "%A%p %l∶%M" + +#. Translators: this is the month name and day number +#. followed by a time string in 12h format. +#. i.e. "May 25, 2:30 pm" +#: js/misc/util.js:270 +#, no-c-format +msgid "%B %-d, %l∶%M %p" +msgstr "%b%-d日%p %l∶%M" + +#. Translators: this is the month name, day number, year +#. number followed by a time string in 12h format. +#. i.e. "May 25 2012, 2:30 pm" +#: js/misc/util.js:276 +#, no-c-format +msgid "%B %-d %Y, %l∶%M %p" +msgstr "%Y年%b%-d日%p %l∶%M" + +#. TRANSLATORS: this is the title of the wifi captive portal login window +#: js/portalHelper/main.js:40 +msgid "Hotspot Login" +msgstr "熱點登入" + +#: js/portalHelper/main.js:86 +msgid "" +"Your connection to this hotspot login is not secure. Passwords or other " +"information you enter on this page can be viewed by people nearby." +msgstr "" +"您連線到此熱點登入是不安全的。密碼或在此頁面上輸入的其他資訊都可以被附近的人" +"看到。" + +#. No support for non-modal system dialogs, so ignore the option +#. let modal = options['modal'] || true; +#: js/ui/accessDialog.js:37 js/ui/status/location.js:360 +msgid "Deny Access" +msgstr "禁止存取" + +#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 +msgid "Grant Access" +msgstr "授予存取權限" + +#: js/ui/appDisplay.js:660 +msgid "Frequently used applications will appear here" +msgstr "經常使用的應用程式會出現在這裡" + +#: js/ui/appDisplay.js:775 +msgid "Frequent" +msgstr "常用" + +#: js/ui/appDisplay.js:782 +msgid "All" +msgstr "全部" + +#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 +msgid "New Window" +msgstr "新視窗" + +#: js/ui/appDisplay.js:1751 +msgid "Launch using Dedicated Graphics Card" +msgstr "使用獨立顯卡啟動" + +#: js/ui/appDisplay.js:1778 js/ui/dash.js:239 +msgid "Remove from Favorites" +msgstr "自喜好中移除" + +#: js/ui/appDisplay.js:1784 +msgid "Add to Favorites" +msgstr "加入喜好" + +#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 +msgid "Show Details" +msgstr "顯示詳細資訊" + +#: js/ui/appFavorites.js:141 +#, javascript-format +msgid "%s has been added to your favorites." +msgstr "%s 已加入您的喜好中。" + +#: js/ui/appFavorites.js:175 +#, javascript-format +msgid "%s has been removed from your favorites." +msgstr "%s 已經從您的喜好中移除。" + +#: js/ui/audioDeviceSelection.js:42 +msgid "Select Audio Device" +msgstr "選擇音訊裝置" + +#: js/ui/audioDeviceSelection.js:53 +msgid "Sound Settings" +msgstr "音效設定值" + +#: js/ui/audioDeviceSelection.js:62 +msgid "Headphones" +msgstr "頭戴式耳機" + +#: js/ui/audioDeviceSelection.js:64 +msgid "Headset" +msgstr "耳機麥克風" + +#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 +msgid "Microphone" +msgstr "麥克風" + +#: js/ui/backgroundMenu.js:13 +msgid "Change Background…" +msgstr "改變背景…" + +#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 +msgid "Display Settings" +msgstr "顯示器設定值" + +#: js/ui/backgroundMenu.js:16 +msgid "Settings" +msgstr "設定值" + +#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). +#: js/ui/calendar.js:40 +msgctxt "calendar-no-work" +msgid "06" +msgstr "06" + +#. Translators: Calendar grid abbreviation for Sunday. +#. * +#. * NOTE: These grid abbreviations are always shown together +#. * and in order, e.g. "S M T W T F S". +#. +#: js/ui/calendar.js:69 +msgctxt "grid sunday" +msgid "S" +msgstr "日" + +#. Translators: Calendar grid abbreviation for Monday +#: js/ui/calendar.js:71 +msgctxt "grid monday" +msgid "M" +msgstr "一" + +#. Translators: Calendar grid abbreviation for Tuesday +#: js/ui/calendar.js:73 +msgctxt "grid tuesday" +msgid "T" +msgstr "二" + +#. Translators: Calendar grid abbreviation for Wednesday +#: js/ui/calendar.js:75 +msgctxt "grid wednesday" +msgid "W" +msgstr "三" + +#. Translators: Calendar grid abbreviation for Thursday +#: js/ui/calendar.js:77 +msgctxt "grid thursday" +msgid "T" +msgstr "四" + +#. Translators: Calendar grid abbreviation for Friday +#: js/ui/calendar.js:79 +msgctxt "grid friday" +msgid "F" +msgstr "五" + +#. Translators: Calendar grid abbreviation for Saturday +#: js/ui/calendar.js:81 +msgctxt "grid saturday" +msgid "S" +msgstr "六" + +#. * +#. * 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:332 +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:342 +msgid "%OB %Y" +msgstr "%Y年%OB" + +#: js/ui/calendar.js:399 +msgid "Previous month" +msgstr "上個月" + +#: js/ui/calendar.js:410 +msgid "Next month" +msgstr "下個月" + +#: js/ui/calendar.js:564 +#, no-javascript-format +msgctxt "date day number format" +msgid "%d" +msgstr "%d" + +#: js/ui/calendar.js:619 +msgid "Week %V" +msgstr "%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:687 +msgctxt "event list time" +msgid "All Day" +msgstr "整天" + +#: js/ui/calendar.js:819 +msgctxt "calendar heading" +msgid "%A, %B %-d" +msgstr "%b%-d日%A" + +#: js/ui/calendar.js:823 +msgctxt "calendar heading" +msgid "%A, %B %-d, %Y" +msgstr "%Y年%b%-d日%A" + +#: js/ui/calendar.js:1046 +msgid "No Notifications" +msgstr "沒有通知" + +#: js/ui/calendar.js:1049 +msgid "No Events" +msgstr "沒有行程" + +#: js/ui/calendar.js:1075 +msgid "Clear" +msgstr "清除" + +#. Translators: %s is an application name +#: js/ui/closeDialog.js:42 +#, javascript-format +msgid "“%s” is not responding." +msgstr "「%s」沒有回應。" + +#: js/ui/closeDialog.js:43 +msgid "" +"You may choose to wait a short while for it to continue or force the " +"application to quit entirely." +msgstr "您可以選擇再等一下讓它繼續,或是強制讓應用程式立刻退出。" + +#: js/ui/closeDialog.js:59 +msgid "Force Quit" +msgstr "強制退出" + +#: js/ui/closeDialog.js:62 +msgid "Wait" +msgstr "等待" + +#: js/ui/components/automountManager.js:86 +msgid "External drive connected" +msgstr "外部裝置已連接" + +#: js/ui/components/automountManager.js:98 +msgid "External drive disconnected" +msgstr "外部裝置已拔除" + +#: js/ui/components/autorunManager.js:334 +#, javascript-format +msgid "Open with %s" +msgstr "用 %s 開啟" + +#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 +msgid "Password:" +msgstr "密碼: " + +#: js/ui/components/keyring.js:108 +msgid "Type again:" +msgstr "再輸入一次:" + +#: js/ui/components/networkAgent.js:102 +msgid "" +"Alternatively you can connect by pushing the “WPS” button on your router." +msgstr "或者您可以按下路由器的「WPS」按鈕來連接看看。" + +#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 +#: js/ui/status/network.js:309 js/ui/status/network.js:891 +msgid "Connect" +msgstr "連線" + +#. Cisco LEAP +#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 +#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 +#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 +msgid "Password: " +msgstr "密碼: " + +#. static WEP +#: js/ui/components/networkAgent.js:216 +msgid "Key: " +msgstr "金鑰:" + +#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 +msgid "Private key password: " +msgstr "私密金鑰密碼:" + +#: js/ui/components/networkAgent.js:269 +msgid "Identity: " +msgstr "識別身份:" + +#: js/ui/components/networkAgent.js:283 +msgid "Service: " +msgstr "服務:" + +#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 +msgid "Authentication required by wireless network" +msgstr "無線網路所需要的核對" + +#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 +#, javascript-format +msgid "" +"Passwords or encryption keys are required to access the wireless network " +"“%s”." +msgstr "需要密碼或是加密金鑰來存取無線網路「%s」。" + +#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 +msgid "Wired 802.1X authentication" +msgstr "有線網路 802.1X 核對" + +#: js/ui/components/networkAgent.js:319 +msgid "Network name: " +msgstr "網路名稱:" + +#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 +msgid "DSL authentication" +msgstr "DSL 核對" + +#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 +msgid "PIN code required" +msgstr "需要 PIN 碼" + +#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 +msgid "PIN code is needed for the mobile broadband device" +msgstr "這個行動寬頻裝置需要 PIN 碼" + +#: js/ui/components/networkAgent.js:333 +msgid "PIN: " +msgstr "PIN: " + +#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 +msgid "Mobile broadband network password" +msgstr "行動寬頻網路密碼" + +#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 +#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 +#, javascript-format +msgid "A password is required to connect to “%s”." +msgstr "連線至「%s」需要密碼。" + +#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 +msgid "Network Manager" +msgstr "網路管理員" + +#: js/ui/components/polkitAgent.js:34 +msgid "Authentication Required" +msgstr "要求核對" + +#: js/ui/components/polkitAgent.js:62 +msgid "Administrator" +msgstr "管理員" + +#: js/ui/components/polkitAgent.js:139 +msgid "Authenticate" +msgstr "核對" + +#. Translators: "that didn't work" refers to the fact that the +#. * requested authentication was not gained; this can happen +#. * because of an authentication error (like invalid password), +#. * for instance. +#: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309 +msgid "Sorry, that didn’t work. Please try again." +msgstr "抱歉,那沒有作用。請再試一次。" + +#. Translators: this is the other person changing their old IM name to their new +#. IM name. +#: js/ui/components/telepathyClient.js:778 +#, javascript-format +msgid "%s is now known as %s" +msgstr "%s 現在被稱為 %s" + +#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:169 +msgid "Windows" +msgstr "視窗" + +#: js/ui/dash.js:200 js/ui/dash.js:241 +msgid "Show Applications" +msgstr "顯示應用程式" + +#. Translators: this is the name of the dock/favorites area on +#. the left of the overview +#: js/ui/dash.js:390 +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 top bar (e.g., +#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., +#. * "February 17 2015". +#. +#: js/ui/dateMenu.js:62 +msgid "%B %-d %Y" +msgstr "%Y年%b%-d日" + +#. Translators: This is the accessible name of the date button shown +#. * below the time in the shell; it should combine the weekday and the +#. * date, e.g. "Tuesday February 17 2015". +#. +#: js/ui/dateMenu.js:69 +msgid "%A %B %e %Y" +msgstr "%Y年%b%e日%A" + +#: js/ui/dateMenu.js:131 +msgid "Add world clocks…" +msgstr "加入世界時鐘…" + +#: js/ui/dateMenu.js:132 +msgid "World Clocks" +msgstr "世界時鐘" + +#: js/ui/dateMenu.js:222 +msgid "Weather" +msgstr "天氣" + +#: js/ui/dateMenu.js:305 +msgid "Select a location…" +msgstr "選擇位置…" + +#: js/ui/dateMenu.js:313 +msgid "Loading…" +msgstr "載入中…" + +#: js/ui/dateMenu.js:323 +msgid "Go online for weather information" +msgstr "上線以取得天氣資訊" + +#: js/ui/dateMenu.js:325 +msgid "Weather information is currently unavailable" +msgstr "天氣資訊目前不可使用" + +#: js/ui/endSessionDialog.js:42 +#, javascript-format +msgctxt "title" +msgid "Log Out %s" +msgstr "登出 %s" + +#: js/ui/endSessionDialog.js:43 +msgctxt "title" +msgid "Log Out" +msgstr "登出" + +#: js/ui/endSessionDialog.js:45 +#, javascript-format +msgid "%s will be logged out automatically in %d second." +msgid_plural "%s will be logged out automatically in %d seconds." +msgstr[0] "%s 會在 %d 秒後自動登出。" + +#: js/ui/endSessionDialog.js:50 +#, javascript-format +msgid "You will be logged out automatically in %d second." +msgid_plural "You will be logged out automatically in %d seconds." +msgstr[0] "您會在 %d 秒後自動登出。" + +#: js/ui/endSessionDialog.js:56 +msgctxt "button" +msgid "Log Out" +msgstr "登出" + +#: js/ui/endSessionDialog.js:62 +msgctxt "title" +msgid "Power Off" +msgstr "關閉電源" + +#: js/ui/endSessionDialog.js:63 +msgctxt "title" +msgid "Install Updates & Power Off" +msgstr "安裝更新並關機" + +#: js/ui/endSessionDialog.js:65 +#, javascript-format +msgid "The system will power off automatically in %d second." +msgid_plural "The system will power off automatically in %d seconds." +msgstr[0] "系統會在 %d 秒後關閉電源。" + +#: js/ui/endSessionDialog.js:69 +msgctxt "checkbox" +msgid "Install pending software updates" +msgstr "安裝擱置的軟體更新" + +#: js/ui/endSessionDialog.js:72 js/ui/endSessionDialog.js:89 +msgctxt "button" +msgid "Restart" +msgstr "重新啟動" + +#: js/ui/endSessionDialog.js:74 +msgctxt "button" +msgid "Power Off" +msgstr "關閉電源" + +#: js/ui/endSessionDialog.js:81 +msgctxt "title" +msgid "Restart" +msgstr "重新啟動" + +#: js/ui/endSessionDialog.js:83 +#, javascript-format +msgid "The system will restart automatically in %d second." +msgid_plural "The system will restart automatically in %d seconds." +msgstr[0] "系統會在 %d 秒後自動重新啟動。" + +#: js/ui/endSessionDialog.js:97 +msgctxt "title" +msgid "Restart & Install Updates" +msgstr "重新啟動並安裝更新" + +#: js/ui/endSessionDialog.js:99 +#, javascript-format +msgid "The system will automatically restart and install updates in %d second." +msgid_plural "" +"The system will automatically restart and install updates in %d seconds." +msgstr[0] "系統會在 %d 秒後自動重新啟動。" + +#: js/ui/endSessionDialog.js:105 js/ui/endSessionDialog.js:125 +msgctxt "button" +msgid "Restart & Install" +msgstr "重新啟動並安裝" + +#: js/ui/endSessionDialog.js:106 +msgctxt "button" +msgid "Install & Power Off" +msgstr "安裝並關機" + +#: js/ui/endSessionDialog.js:107 +msgctxt "checkbox" +msgid "Power off after updates are installed" +msgstr "在安裝完更新之後關機" + +#: js/ui/endSessionDialog.js:115 +msgctxt "title" +msgid "Restart & Install Upgrade" +msgstr "重新啟動並安裝升級" + +#. Translators: This is the text displayed for system upgrades in the +#. shut down dialog. First %s gets replaced with the distro name and +#. second %s with the distro version to upgrade to +#: js/ui/endSessionDialog.js:120 +#, javascript-format +msgid "" +"%s %s will be installed after restart. Upgrade installation can take a long " +"time: ensure that you have backed up and that the computer is plugged in." +msgstr "" +"%s %s 將在重新啟動之後展開安裝。升級的過程可能會花上一段較長的時間:請確認您" +"已有備份,並且已將電腦電源插上。" + +#: js/ui/endSessionDialog.js:309 +msgid "Running on battery power: please plug in before installing updates." +msgstr "正使用電池電源執行:請在安裝更新之前插入電源線。" + +#: js/ui/endSessionDialog.js:326 +msgid "Some applications are busy or have unsaved work." +msgstr "部分應用程式忙碌中或有未儲存的工作。" + +#: js/ui/endSessionDialog.js:333 +msgid "Other users are logged in." +msgstr "其他使用者已登入。" + +#. Translators: Remote here refers to a remote session, like a ssh login +#: js/ui/endSessionDialog.js:614 +#, javascript-format +msgid "%s (remote)" +msgstr "%s (遠端)" + +#. Translators: Console here refers to a tty like a VT console +#: js/ui/endSessionDialog.js:617 +#, javascript-format +msgid "%s (console)" +msgstr "%s (主控臺)" + +#: js/ui/extensionDownloader.js:192 +msgid "Install" +msgstr "安裝" + +#: js/ui/extensionDownloader.js:197 +#, javascript-format +msgid "Download and install “%s” from extensions.gnome.org?" +msgstr "是否從 extensions.gnome.org 下載並安裝「%s」?" + +#. Translators: %s is an application name like "Settings" +#: js/ui/inhibitShortcutsDialog.js:78 +#, javascript-format +msgid "%s wants to inhibit shortcuts" +msgstr "%s 想要抑制快捷鍵" + +#: js/ui/inhibitShortcutsDialog.js:79 +msgid "Application wants to inhibit shortcuts" +msgstr "應用程式想要抑制快捷鍵" + +#. Translators: %s is a keyboard shortcut like "Super+x" +#: js/ui/inhibitShortcutsDialog.js:88 +#, javascript-format +msgid "You can restore shortcuts by pressing %s." +msgstr "您可以按下 %s 還原快捷鍵。" + +#: js/ui/inhibitShortcutsDialog.js:93 +msgid "Deny" +msgstr "禁止" + +#: js/ui/inhibitShortcutsDialog.js:100 +msgid "Allow" +msgstr "允許" + +#: js/ui/kbdA11yDialog.js:31 +msgid "Slow Keys Turned On" +msgstr "遲緩按鍵開啟" + +#: js/ui/kbdA11yDialog.js:32 +msgid "Slow Keys Turned Off" +msgstr "遲緩按鍵關閉" + +#: js/ui/kbdA11yDialog.js:33 +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 "" +"您方才長按 Shift 按鍵達 8 秒鐘。這是「遲緩按鈕」功能的快捷鍵,會影響您的鍵盤" +"運作方式。" + +#: js/ui/kbdA11yDialog.js:40 +msgid "Sticky Keys Turned On" +msgstr "黏性特殊鍵開啟" + +#: js/ui/kbdA11yDialog.js:41 +msgid "Sticky Keys Turned Off" +msgstr "黏性特殊鍵關閉" + +#: js/ui/kbdA11yDialog.js:43 +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 "" +"您方才連按 Shift 鍵達 5 次。這是「黏性特殊鍵」功能的快捷鍵,會影響您的鍵盤運" +"作方式。" + +#: js/ui/kbdA11yDialog.js:45 +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 "" +"您方才同時按下兩個按鍵,或是連續按 Shift 鍵 5 次。這會關閉「黏性特殊鍵」功" +"能,會影響您的鍵盤運作方式。" + +#: js/ui/kbdA11yDialog.js:57 +msgid "Leave On" +msgstr "離開" + +#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:1263 +msgid "Turn On" +msgstr "開啟" + +#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 +#: js/ui/status/network.js:128 js/ui/status/network.js:310 +#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 +#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 +#: js/ui/status/rfkill.js:106 +msgid "Turn Off" +msgstr "關閉" + +#: js/ui/kbdA11yDialog.js:65 +msgid "Leave Off" +msgstr "離開" + +#: js/ui/keyboard.js:200 +msgid "Region & Language Settings" +msgstr "地區和語言設定值" + +#: js/ui/lookingGlass.js:615 +msgid "No extensions installed" +msgstr "沒有安裝擴充套件" + +#. Translators: argument is an extension UUID. +#: js/ui/lookingGlass.js:669 +#, javascript-format +msgid "%s has not emitted any errors." +msgstr "%s 沒有發出任何錯誤。" + +#: js/ui/lookingGlass.js:675 +msgid "Hide Errors" +msgstr "隱藏錯誤" + +#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 +msgid "Show Errors" +msgstr "顯示錯誤" + +#: js/ui/lookingGlass.js:688 +msgid "Enabled" +msgstr "已啟用" + +#. translators: +#. * The device has been disabled +#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 +msgid "Disabled" +msgstr "已停用" + +#: js/ui/lookingGlass.js:693 +msgid "Error" +msgstr "錯誤" + +#: js/ui/lookingGlass.js:695 +msgid "Out of date" +msgstr "過期" + +#: js/ui/lookingGlass.js:697 +msgid "Downloading" +msgstr "下載中" + +#: js/ui/lookingGlass.js:721 +msgid "View Source" +msgstr "檢示來源" + +#: js/ui/lookingGlass.js:730 +msgid "Web Page" +msgstr "網頁" + +#: js/ui/messageTray.js:1480 +msgid "System Information" +msgstr "系統資訊" + +#: js/ui/mpris.js:177 +msgid "Unknown artist" +msgstr "不明的演出者" + +#: js/ui/mpris.js:178 +msgid "Unknown title" +msgstr "沒有標題" + +#: js/ui/osdWindow.js:22 js/ui/status/volume.js:199 +msgid "Volume" +msgstr "音量" + +#: js/ui/overview.js:73 +msgid "Undo" +msgstr "復原" + +#. Translators: This is the main view to select +#. activities. See also note for "Activities" string. +#: js/ui/overview.js:100 +msgid "Overview" +msgstr "概覽" + +#. Translators: this is the text displayed +#. in the search entry when no search is +#. active; it should not exceed ~30 +#. characters. +#: js/ui/overview.js:226 +msgid "Type to search…" +msgstr "輸入以搜尋…" + +#: js/ui/padOsd.js:92 +msgid "New shortcut…" +msgstr "新增快捷鍵…" + +#: js/ui/padOsd.js:141 +msgid "Application defined" +msgstr "定義的應用程式" + +#: js/ui/padOsd.js:142 +msgid "Show on-screen help" +msgstr "顯示螢幕求助" + +#: js/ui/padOsd.js:143 +msgid "Switch monitor" +msgstr "切換監視器" + +#: js/ui/padOsd.js:144 +msgid "Assign keystroke" +msgstr "指派按鍵" + +#: js/ui/padOsd.js:209 +msgid "Done" +msgstr "完成" + +#: js/ui/padOsd.js:721 +msgid "Edit…" +msgstr "編輯…" + +#: js/ui/padOsd.js:763 js/ui/padOsd.js:868 +msgid "None" +msgstr "無" + +#: js/ui/padOsd.js:822 +msgid "Press a button to configure" +msgstr "按下按鈕來設定" + +#: js/ui/padOsd.js:823 +msgid "Press Esc to exit" +msgstr "按下 Esc 離開" + +#: js/ui/padOsd.js:826 +msgid "Press any key to exit" +msgstr "按下任意鍵離開" + +#: js/ui/panel.js:108 +msgid "Quit" +msgstr "結束" + +#. Translators: If there is no suitable word for "Activities" +#. in your language, you can use the word for "Overview". +#: js/ui/panel.js:471 +msgid "Activities" +msgstr "概覽" + +#: js/ui/panel.js:746 +msgctxt "System menu in the top bar" +msgid "System" +msgstr "系統" + +#: js/ui/panel.js:867 +msgid "Top Bar" +msgstr "頂端列" + +#. Translators: this MUST be either "toggle-switch-us" +#. (for toggle switches containing the English words +#. "ON" and "OFF") or "toggle-switch-intl" (for toggle +#. switches containing "◯" and "|"). Other values will +#. simply result in invisible toggle switches. +#: js/ui/popupMenu.js:285 +msgid "toggle-switch-us" +msgstr "toggle-switch-us" + +#: js/ui/runDialog.js:64 +msgid "Enter a Command" +msgstr "請輸入指令" + +#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 +msgid "Close" +msgstr "關閉" + +#: js/ui/runDialog.js:266 +msgid "Restart is not available on Wayland" +msgstr "因使用 Wayland 而無法重新啟動" + +#: js/ui/runDialog.js:271 +msgid "Restarting…" +msgstr "重新啟動…" + +#. Translators: This is a time format for a date in +#. long format +#: js/ui/screenShield.js:77 +msgid "%A, %B %d" +msgstr "%b%d日%A" + +#: js/ui/screenShield.js:133 +#, javascript-format +msgid "%d new message" +msgid_plural "%d new messages" +msgstr[0] "%d 個新訊息" + +#: js/ui/screenShield.js:135 +#, javascript-format +msgid "%d new notification" +msgid_plural "%d new notifications" +msgstr[0] "%d 個新通知" + +#: js/ui/screenShield.js:449 js/ui/status/system.js:271 +msgid "Lock" +msgstr "鎖定" + +#: js/ui/screenShield.js:713 +msgid "GNOME needs to lock the screen" +msgstr "GNOME 需要鎖定螢幕" + +#. We could not become modal, so we can't activate the +#. screenshield. The user is probably very upset at this +#. point, but any application using global grabs is broken +#. Just tell him to stop using this app +#. +#. XXX: another option is to kick the user into the gdm login +#. screen, where we're not affected by grabs +#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 +msgid "Unable to lock" +msgstr "無法鎖定" + +#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 +msgid "Lock was blocked by an application" +msgstr "鎖定被應用程式阻擋" + +#: js/ui/search.js:635 +msgid "Searching…" +msgstr "搜尋…" + +#: js/ui/search.js:637 +msgid "No results." +msgstr "沒有結果。" + +#: js/ui/search.js:761 +#, javascript-format +msgid "%d more" +msgid_plural "%d more" +msgstr[0] "其他 %d 項" + +#: js/ui/shellEntry.js:19 +msgid "Copy" +msgstr "複製" + +#: js/ui/shellEntry.js:24 +msgid "Paste" +msgstr "貼上" + +#: js/ui/shellEntry.js:90 +msgid "Show Text" +msgstr "顯示文字" + +#: js/ui/shellEntry.js:92 +msgid "Hide Text" +msgstr "隱藏文字" + +#: js/ui/shellMountOperation.js:296 +msgid "Password" +msgstr "密碼" + +#: js/ui/shellMountOperation.js:317 +msgid "Remember Password" +msgstr "記住密碼" + +#: js/ui/status/accessibility.js:35 +msgid "Accessibility" +msgstr "無障礙功能" + +#: js/ui/status/accessibility.js:50 +msgid "Zoom" +msgstr "縮放" + +#: js/ui/status/accessibility.js:57 +msgid "Screen Reader" +msgstr "螢幕閱讀器" + +#: js/ui/status/accessibility.js:61 +msgid "Screen Keyboard" +msgstr "螢幕鍵盤" + +#: js/ui/status/accessibility.js:65 +msgid "Visual Alerts" +msgstr "視覺警示" + +#: js/ui/status/accessibility.js:68 +msgid "Sticky Keys" +msgstr "黏性特殊鍵" + +#: js/ui/status/accessibility.js:71 +msgid "Slow Keys" +msgstr "遲緩按鍵" + +#: js/ui/status/accessibility.js:74 +msgid "Bounce Keys" +msgstr "反彈鍵" + +#: js/ui/status/accessibility.js:77 +msgid "Mouse Keys" +msgstr "滑鼠按鍵" + +#: js/ui/status/accessibility.js:151 +msgid "High Contrast" +msgstr "高反差" + +#: js/ui/status/accessibility.js:182 +msgid "Large Text" +msgstr "大型文字" + +#: js/ui/status/bluetooth.js:38 +msgid "Bluetooth" +msgstr "藍牙" + +#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 +msgid "Bluetooth Settings" +msgstr "藍牙設定值" + +#. Translators: this is the number of connected bluetooth devices +#: js/ui/status/bluetooth.js:127 +#, javascript-format +msgid "%d Connected" +msgid_plural "%d Connected" +msgstr[0] "%d 已連線" + +#: js/ui/status/bluetooth.js:129 +msgid "Off" +msgstr "關閉" + +#: js/ui/status/bluetooth.js:131 +msgid "On" +msgstr "開啟" + +#: js/ui/status/brightness.js:36 +msgid "Brightness" +msgstr "亮度" + +#: js/ui/status/keyboard.js:812 +msgid "Keyboard" +msgstr "鍵盤" + +#: js/ui/status/keyboard.js:834 +msgid "Show Keyboard Layout" +msgstr "顯示鍵盤配置" + +#: js/ui/status/location.js:64 js/ui/status/location.js:172 +msgid "Location Enabled" +msgstr "位置已啟用" + +#: js/ui/status/location.js:65 js/ui/status/location.js:173 +msgid "Disable" +msgstr "停用" + +#: js/ui/status/location.js:66 +msgid "Privacy Settings" +msgstr "隱私設定值" + +#: js/ui/status/location.js:171 +msgid "Location In Use" +msgstr "位置使用中" + +#: js/ui/status/location.js:175 +msgid "Location Disabled" +msgstr "位置已停用" + +#: js/ui/status/location.js:176 +msgid "Enable" +msgstr "啟用" + +#. Translators: %s is an application name +#: js/ui/status/location.js:353 +#, javascript-format +msgid "Give %s access to your location?" +msgstr "允許 %s 存取您的位置?" + +#: js/ui/status/location.js:354 +msgid "Location access can be changed at any time from the privacy settings." +msgstr "位置存取可以隨時從隱私設定值中更改。" + +#: js/ui/status/network.js:66 +msgid "" +msgstr "<不明>" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:416 js/ui/status/network.js:1292 +#, javascript-format +msgid "%s Off" +msgstr "%s 關閉" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:419 +#, javascript-format +msgid "%s Connected" +msgstr "%s 已連線" + +#. Translators: this is for network devices that are physically present but are not +#. under NetworkManager's control (and thus cannot be used in the menu); +#. %s is a network identifier +#: js/ui/status/network.js:424 +#, javascript-format +msgid "%s Unmanaged" +msgstr "%s 未受管理" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:427 +#, javascript-format +msgid "%s Disconnecting" +msgstr "%s 正在斷線" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:434 js/ui/status/network.js:1284 +#, javascript-format +msgid "%s Connecting" +msgstr "正連線到 %s" + +#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier +#: js/ui/status/network.js:437 +#, javascript-format +msgid "%s Requires Authentication" +msgstr "%s 需要核對" + +#. Translators: this is for devices that require some kind of firmware or kernel +#. module, which is missing; %s is a network identifier +#: js/ui/status/network.js:445 +#, javascript-format +msgid "Firmware Missing For %s" +msgstr "缺少 %s 韌體" + +#. Translators: this is for a network device that cannot be activated (for example it +#. is disabled by rfkill, or it has no coverage; %s is a network identifier +#: js/ui/status/network.js:449 +#, javascript-format +msgid "%s Unavailable" +msgstr "%s 無法使用" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:452 +#, javascript-format +msgid "%s Connection Failed" +msgstr "%s 連線失敗" + +#: js/ui/status/network.js:464 +msgid "Wired Settings" +msgstr "有線設定值" + +#: js/ui/status/network.js:506 +msgid "Mobile Broadband Settings" +msgstr "行動寬頻設定值" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:553 js/ui/status/network.js:1289 +#, javascript-format +msgid "%s Hardware Disabled" +msgstr "%s 硬體已停用" + +#. Translators: this is for a network device that cannot be activated +#. because it's disabled by rfkill (airplane mode); %s is a network identifier +#: js/ui/status/network.js:557 +#, javascript-format +msgid "%s Disabled" +msgstr "%s 已停用" + +#: js/ui/status/network.js:597 +msgid "Connect to Internet" +msgstr "連接至網際網路" + +#: js/ui/status/network.js:786 +msgid "Airplane Mode is On" +msgstr "飛安模式開啟" + +#: js/ui/status/network.js:787 +msgid "Wi-Fi is disabled when airplane mode is on." +msgstr "開啟飛安模式時會停用 Wi-Fi 。" + +#: js/ui/status/network.js:788 +msgid "Turn Off Airplane Mode" +msgstr "關閉飛安模式" + +#: js/ui/status/network.js:797 +msgid "Wi-Fi is Off" +msgstr "Wi-Fi 關閉" + +#: js/ui/status/network.js:798 +msgid "Wi-Fi needs to be turned on in order to connect to a network." +msgstr "需要開啟 Wi-Fi 才能連接網路。" + +#: js/ui/status/network.js:799 +msgid "Turn On Wi-Fi" +msgstr "開啟 Wi-Fi" + +#: js/ui/status/network.js:824 +msgid "Wi-Fi Networks" +msgstr "Wi-Fi 網路" + +#: js/ui/status/network.js:826 +msgid "Select a network" +msgstr "選擇一個網路" + +#: js/ui/status/network.js:855 +msgid "No Networks" +msgstr "沒有網路" + +#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 +msgid "Use hardware switch to turn off" +msgstr "使用硬體開關來關閉" + +#: js/ui/status/network.js:1152 +msgid "Select Network" +msgstr "選擇網路" + +#: js/ui/status/network.js:1158 +msgid "Wi-Fi Settings" +msgstr "Wi-Fi 設定值" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1280 +#, javascript-format +msgid "%s Hotspot Active" +msgstr "%s 熱點有效" + +#. Translators: %s is a network identifier +#: js/ui/status/network.js:1295 +#, javascript-format +msgid "%s Not Connected" +msgstr "%s 未連線" + +#: js/ui/status/network.js:1392 +msgid "connecting…" +msgstr "連線中…" + +#. Translators: this is for network connections that require some kind of key or password +#: js/ui/status/network.js:1395 +msgid "authentication required" +msgstr "要求核對" + +#: js/ui/status/network.js:1397 +msgid "connection failed" +msgstr "連線失敗" + +#: js/ui/status/network.js:1447 +msgid "VPN Settings" +msgstr "VPN 設定值" + +#: js/ui/status/network.js:1464 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1474 +msgid "VPN Off" +msgstr "VPN 關閉" + +#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 +msgid "Network Settings" +msgstr "網路設定值" + +#: js/ui/status/network.js:1564 +#, javascript-format +msgid "%s Wired Connection" +msgid_plural "%s Wired Connections" +msgstr[0] "%s 個有線網路連線" + +#: js/ui/status/network.js:1568 +#, javascript-format +msgid "%s Wi-Fi Connection" +msgid_plural "%s Wi-Fi Connections" +msgstr[0] "%s 個 Wi-Fi 連線" + +#: js/ui/status/network.js:1572 +#, javascript-format +msgid "%s Modem Connection" +msgid_plural "%s Modem Connections" +msgstr[0] "%s 個數據機連線" + +#: js/ui/status/network.js:1701 +msgid "Connection failed" +msgstr "連線失敗" + +#: js/ui/status/network.js:1702 +msgid "Activation of network connection failed" +msgstr "啟動網路連線失敗" + +#: js/ui/status/nightLight.js:60 +msgid "Night Light Disabled" +msgstr "夜光模式已停用" + +#: js/ui/status/nightLight.js:61 +msgid "Night Light On" +msgstr "夜光模式開啟" + +#: js/ui/status/nightLight.js:62 +msgid "Resume" +msgstr "繼續" + +#: js/ui/status/nightLight.js:63 +msgid "Disable Until Tomorrow" +msgstr "停用直到明天" + +#: js/ui/status/power.js:45 +msgid "Power Settings" +msgstr "電源設定值" + +#: js/ui/status/power.js:61 +msgid "Fully Charged" +msgstr "已完全充飽" + +#: js/ui/status/power.js:67 +msgid "Not Charging" +msgstr "沒在充電中" + +#. 0 is reported when UPower does not have enough data +#. to estimate battery life +#: js/ui/status/power.js:70 js/ui/status/power.js:76 +msgid "Estimating…" +msgstr "評估中…" + +#. Translators: this is : Remaining () +#: js/ui/status/power.js:84 +#, javascript-format +msgid "%d∶%02d Remaining (%d %%)" +msgstr "剩餘時間 %d∶%02d (%d%%)" + +#. Translators: this is : Until Full () +#: js/ui/status/power.js:89 +#, javascript-format +msgid "%d∶%02d Until Full (%d %%)" +msgstr "直到充滿還需 %d∶%02d (%d%%)" + +#: js/ui/status/power.js:117 js/ui/status/power.js:119 +#, javascript-format +msgid "%d %%" +msgstr "%d %%" + +#: js/ui/status/remoteAccess.js:42 +msgid "Screen is Being Shared" +msgstr "正在分享螢幕" + +#: js/ui/status/remoteAccess.js:44 +msgid "Turn off" +msgstr "關閉" + +#. The menu only appears when airplane mode is on, so just +#. statically build it as if it was on, rather than dynamically +#. changing the menu contents. +#: js/ui/status/rfkill.js:77 +msgid "Airplane Mode On" +msgstr "飛安模式已開啟" + +#: js/ui/status/system.js:203 +msgid "Switch User" +msgstr "切換使用者" + +#: js/ui/status/system.js:215 +msgid "Log Out" +msgstr "登出" + +#: js/ui/status/system.js:227 +msgid "Account Settings" +msgstr "帳號設定值" + +#: js/ui/status/system.js:256 +msgid "Orientation Lock" +msgstr "方向鎖" + +#: js/ui/status/system.js:282 +msgid "Suspend" +msgstr "暫停" + +#: js/ui/status/system.js:292 +msgid "Power Off" +msgstr "關閉電源" + +#: js/ui/status/thunderbolt.js:261 +msgid "Thunderbolt" +msgstr "Thunderbolt" + +#: js/ui/status/thunderbolt.js:322 +msgid "Unknown Thunderbolt device" +msgstr "未知 Thunderbolt 裝置" + +#: js/ui/status/thunderbolt.js:323 +msgid "" +"New device has been detected while you were away. Please disconnect and " +"reconnect the device to start using it." +msgstr "您離開之後已偵測到新裝置。請先中斷連接,重新連接該裝置後可開始使用。" + +#: js/ui/status/thunderbolt.js:326 +msgid "Unauthorized Thunderbolt device" +msgstr "未授權的 Thunderbolt 裝置" + +#: js/ui/status/thunderbolt.js:327 +msgid "" +"New device has been detected and needs to be authorized by an administrator." +msgstr "已偵測到新裝置,需要有系統管理員授權。" + +#: js/ui/status/thunderbolt.js:333 +msgid "Thunderbolt authorization error" +msgstr "Thunderbolt 授權錯誤" + +#: js/ui/status/thunderbolt.js:334 +#, javascript-format +msgid "Could not authorize the Thunderbolt device: %s" +msgstr "無法授權該 Thunderbolt 裝置:%s" + +#: js/ui/status/volume.js:133 +msgid "Volume changed" +msgstr "音量已變更" + +#. Translators: this is for display mirroring i.e. cloning. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:16 +msgid "Mirror" +msgstr "相同" + +#. Translators: this is for the desktop spanning displays. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:21 +msgid "Join Displays" +msgstr "接合多臺顯示器" + +#. Translators: this is for using only an external display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:26 +msgid "External Only" +msgstr "僅外接" + +#. Translators: this is for using only the laptop display. +#. * Try to keep it under around 15 characters. +#. +#: js/ui/switchMonitor.js:31 +msgid "Built-in Only" +msgstr "僅內建" + +#: js/ui/unlockDialog.js:49 +msgid "Log in as another user" +msgstr "以另一個使用者身分登入" + +#: js/ui/unlockDialog.js:66 +msgid "Unlock Window" +msgstr "解鎖視窗" + +#: js/ui/viewSelector.js:173 +msgid "Applications" +msgstr "應用程式" + +#: js/ui/viewSelector.js:177 +msgid "Search" +msgstr "搜尋" + +#: js/ui/windowAttentionHandler.js:19 +#, javascript-format +msgid "“%s” is ready" +msgstr "「%s」已就緒" + +#: js/ui/windowManager.js:53 +msgid "Do you want to keep these display settings?" +msgstr "您想要保留這些顯示器設定值嗎?" + +#. Translators: this and the following message should be limited in lenght, +#. to avoid ellipsizing the labels. +#. +#: js/ui/windowManager.js:65 +msgid "Revert Settings" +msgstr "還原設定值" + +#: js/ui/windowManager.js:68 +msgid "Keep Changes" +msgstr "保留變更" + +#: js/ui/windowManager.js:86 +#, javascript-format +msgid "Settings changes will revert in %d second" +msgid_plural "Settings changes will revert in %d seconds" +msgstr[0] "設定值的變更會在 %d 秒內還原" + +#. Translators: This represents the size of a window. The first number is +#. * the width of the window and the second is the height. +#: js/ui/windowManager.js:662 +#, javascript-format +msgid "%d × %d" +msgstr "%d × %d" + +#: js/ui/windowMenu.js:26 +msgid "Minimize" +msgstr "最小化" + +#: js/ui/windowMenu.js:33 +msgid "Unmaximize" +msgstr "取消最大化" + +#: js/ui/windowMenu.js:37 +msgid "Maximize" +msgstr "最大化" + +#: js/ui/windowMenu.js:44 +msgid "Move" +msgstr "移動" + +#: js/ui/windowMenu.js:50 +msgid "Resize" +msgstr "重設大小" + +#: js/ui/windowMenu.js:57 +msgid "Move Titlebar Onscreen" +msgstr "移動螢幕標題列" + +#: js/ui/windowMenu.js:62 +msgid "Always on Top" +msgstr "永遠在最上層" + +#: js/ui/windowMenu.js:81 +msgid "Always on Visible Workspace" +msgstr "永遠在顯示的工作區" + +#: js/ui/windowMenu.js:95 +msgid "Move to Workspace Left" +msgstr "將工作區左移" + +#: js/ui/windowMenu.js:101 +msgid "Move to Workspace Right" +msgstr "將工作區右移" + +#: js/ui/windowMenu.js:107 +msgid "Move to Workspace Up" +msgstr "將工作區上移" + +#: js/ui/windowMenu.js:113 +msgid "Move to Workspace Down" +msgstr "將工作區下移" + +#: js/ui/windowMenu.js:131 +msgid "Move to Monitor Up" +msgstr "將工作區上移" + +#: js/ui/windowMenu.js:140 +msgid "Move to Monitor Down" +msgstr "將工作區下移" + +#: js/ui/windowMenu.js:149 +msgid "Move to Monitor Left" +msgstr "移至螢幕左側" + +#: js/ui/windowMenu.js:158 +msgid "Move to Monitor Right" +msgstr "移至螢幕右側" + +#: src/calendar-server/evolution-calendar.desktop.in:3 +msgid "Evolution Calendar" +msgstr "Evolution 行事曆" + +#: src/main.c:408 +msgid "Print version" +msgstr "顯示版本" + +#: src/main.c:414 +msgid "Mode used by GDM for login screen" +msgstr "GDM 在登入畫面使用的模式" + +#: src/main.c:420 +msgid "Use a specific mode, e.g. “gdm” for login screen" +msgstr "使用指定的模式,例如「gdm」為登入畫面" + +#: src/main.c:426 +msgid "List possible modes" +msgstr "列出可能的模式" + +#: src/shell-app.c:264 +msgctxt "program" +msgid "Unknown" +msgstr "不明" + +#: src/shell-app.c:515 +#, c-format +msgid "Failed to launch “%s”" +msgstr "無法啟動「%s」" + +#: src/shell-keyring-prompt.c:730 +msgid "Passwords do not match." +msgstr "密碼不相符。" + +#: src/shell-keyring-prompt.c:738 +msgid "Password cannot be blank" +msgstr "密碼不能為空白" + +#: src/shell-polkit-authentication-agent.c:348 +msgid "Authentication dialog was dismissed by the user" +msgstr "核對對話盒被使用者取消了" + +#. translators: +#. * The number of sound outputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1871 +#, c-format +msgid "%u Output" +msgid_plural "%u Outputs" +msgstr[0] "%u 輸出" + +#. translators: +#. * The number of sound inputs on a particular device +#: subprojects/gvc/gvc-mixer-control.c:1881 +#, c-format +msgid "%u Input" +msgid_plural "%u Inputs" +msgstr[0] "%u 輸入" + +#: subprojects/gvc/gvc-mixer-control.c:2736 +msgid "System Sounds" +msgstr "系統音效" + +#~ msgid "network-workgroup" +#~ msgstr "network-workgroup" + +#~ msgid "There was an error loading the preferences dialog for %s:" +#~ msgstr "載入 %s 的偏好設定對話盒時發生錯誤:" + +#~ msgid "%s all day." +#~ msgstr "全天%s。" + +#~ msgid "%s, then %s later." +#~ msgstr "%s,較晚%s。" + +#~ msgid "%s, then %s, followed by %s later." +#~ msgstr "%s,然後%s,接著較晚%s。" + +#~ msgid "Feels like %s." +#~ msgstr "體感溫度 %s。" + +#~ msgid "evolution" +#~ msgstr "evolution" + +#~ 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 "隱藏系統匣" + +#~ msgid "Status Icons" +#~ msgstr "狀態圖示" + +#~ msgid "Events" +#~ msgstr "行程" + +#~ msgid "Notifications" +#~ msgstr "通知" + +#~ msgid "Clear section" +#~ msgstr "清除區段" + +#~ msgid "Media" +#~ msgstr "媒體" + +#~ msgid "GNOME Shell Extension Preferences" +#~ msgstr "GNOME Shell 擴充套件偏好設定" + +#~ msgid "Web Authentication Redirect" +#~ msgstr "網頁核對重新導向" + +#~ msgid "connecting..." +#~ msgstr "連線中…" + +#~ msgid "%d x %d" +#~ msgstr "%d x %d" + +#~ msgid "Not In Use" +#~ msgstr "未被使用" + +#~ msgid "Show the week date in the calendar" +#~ msgstr "在日曆中顯示週數" + +#~ msgid "If true, display the ISO week date in the calendar." +#~ msgstr "如果設為 true,在日曆中顯示 ISO 週數。" + +#~ msgid "Use as Internet connection" +#~ msgstr "作為網際網路連線" + +#~ msgid "%s is requesting access to your location." +#~ msgstr "%s 要求存取您的位置。" + +#~ msgid "GNOME Shell (wayland compositor)" +#~ msgstr "GNOME Shell (wayland 組合器)" + +#~ msgid "%d Connected Device" +#~ msgid_plural "%d Connected Devices" +#~ msgstr[0] "%d 已連線的裝置" + +#~ msgid "Not Connected" +#~ msgstr "未連線" + +#~ msgid "In Use" +#~ msgstr "使用中" + +#~ msgid "Connected" +#~ msgstr "已連線" + +#~ msgid "Unmanaged" +#~ msgstr "未管理" + +#~ msgid "Disconnecting" +#~ msgstr "斷線" + +#~ msgid "Authentication required" +#~ msgstr "要求核對" + +#~ msgid "Firmware missing" +#~ msgstr "缺少韌體" + +#~ msgid "Unavailable" +#~ msgstr "無法使用" + +#~ msgid "Hardware Disabled" +#~ msgstr "硬體已停用" + +#~ msgid "UPS" +#~ msgstr "UPS" + +#~ msgid "Battery" +#~ msgstr "電池" + +#~ msgid "Airplane Mode" +#~ msgstr "飛安模式" + +#~ msgid "Show the message list" +#~ msgstr "顯示訊息清單" + +#~ msgctxt "event list time" +#~ msgid "%H∶%M" +#~ msgstr "%H∶%M" + +#~ msgctxt "event list time" +#~ msgid "%l∶%M %p" +#~ msgstr "%p %l∶%M" + +#~ msgid "Invitation" +#~ msgstr "邀請" + +#~ msgid "Call" +#~ msgstr "通話" + +#~ msgid "File Transfer" +#~ msgstr "檔案傳輸程式" + +#~ msgid "Chat" +#~ msgstr "聊天" + +#~ msgid "Invitation to %s" +#~ msgstr "邀請加入 %s" + +#~ msgid "%s is inviting you to join %s" +#~ msgstr "%s 正在邀請您加入 %s" + +#~ msgid "Decline" +#~ msgstr "拒絕" + +#~ msgid "Accept" +#~ msgstr "接受" + +#~ msgid "Video call from %s" +#~ msgstr "來自 %s 的視訊電話" + +#~ msgid "Call from %s" +#~ msgstr "%s 來電" + +#~ msgid "Answer" +#~ msgstr "接聽" + +#~ msgid "%s is sending you %s" +#~ msgstr "%s 正傳送給您 %s" + +#~ msgid "%s would like permission to see when you are online" +#~ msgstr "%s 想要得到查看您上線狀態的許可" + +#~ msgid "Authentication failed" +#~ msgstr "核對失敗" + +#~ msgid "Encryption error" +#~ msgstr "加密發生錯誤" + +#~ msgid "Certificate not provided" +#~ msgstr "沒有提供憑證" + +#~ msgid "Certificate untrusted" +#~ msgstr "憑證不被信任" + +#~ msgid "Certificate expired" +#~ msgstr "憑證已逾期" + +#~ msgid "Certificate not activated" +#~ msgstr "憑證尚未使用" + +#~ msgid "Certificate hostname mismatch" +#~ msgstr "憑證主機名稱不符" + +#~ msgid "Certificate fingerprint mismatch" +#~ msgstr "憑證數位指紋不符" + +#~ msgid "Certificate self-signed" +#~ msgstr "憑證為自我簽署" + +#~ msgid "Status is set to offline" +#~ msgstr "狀態設為離線" + +#~ msgid "Certificate is invalid" +#~ msgstr "憑證無效" + +#~ msgid "Connection has been refused" +#~ msgstr "連線遭到拒絕" + +#~ msgid "Connection can't be established" +#~ msgstr "無法建立連線" + +#~ msgid "Connection has been lost" +#~ msgstr "已失去連線" + +#~ msgid "This account is already connected to the server" +#~ msgstr "這個帳號已連接至該伺服器" + +#~ msgid "" +#~ "Connection has been replaced by a new connection using the same resource" +#~ msgstr "連線已被使用相同資源的新連線取代" + +#~ msgid "The account already exists on the server" +#~ msgstr "該帳號已經存在於伺服器上" + +#~ msgid "Server is currently too busy to handle the connection" +#~ msgstr "伺服器目前過於忙碌以致於無法處理該連線" + +#~ msgid "Certificate has been revoked" +#~ msgstr "憑證已被撤銷" + +#~ msgid "" +#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak" +#~ msgstr "憑證使用不安全的密碼演算法,或是密碼處理上較弱" + +#~ msgid "" +#~ "The length of the server certificate, or the depth of the server " +#~ "certificate chain, exceed the limits imposed by the cryptography library" +#~ msgstr "" +#~ "伺服器憑證的長度,或是伺服器憑證鏈的深度超過密碼函式庫所能處理的範圍" + +#~ msgid "Internal error" +#~ msgstr "內部的錯誤" + +#~ msgid "Unable to connect to %s" +#~ msgstr "無法連線到 %s" + +#~ msgid "View account" +#~ msgstr "檢視帳號" + +#~ msgctxt "list sunday" +#~ msgid "Su" +#~ msgstr "日" + +#~ msgctxt "list monday" +#~ msgid "M" +#~ msgstr "一" + +#~ msgctxt "list tuesday" +#~ msgid "T" +#~ msgstr "二" + +#~ msgctxt "list wednesday" +#~ msgid "W" +#~ msgstr "三" + +#~ msgctxt "list thursday" +#~ msgid "Th" +#~ msgstr "四" + +#~ msgctxt "list friday" +#~ msgid "F" +#~ msgstr "五" + +#~ msgctxt "list saturday" +#~ msgid "S" +#~ msgstr "六" + +#~ msgid "Nothing Scheduled" +#~ msgstr "沒有預訂行程" + +#~ msgid "Today" +#~ msgstr "今天" + +#~ msgid "Tomorrow" +#~ msgstr "明天" + +#~ msgid "This week" +#~ msgstr "本週" + +#~ msgid "Next week" +#~ msgstr "下週" + +#~ msgid "Removable Devices" +#~ msgstr "可移除式裝置" + +#~ msgid "Eject" +#~ msgstr "退出" + +#~ msgid "Unmute" +#~ msgstr "取消靜音" + +#~ msgid "Mute" +#~ msgstr "靜音" + +#~ msgid "Open Calendar" +#~ msgstr "開啟行事曆" + +#~ msgid "Open" +#~ msgstr "開啟" + +#~ msgid "Remove" +#~ msgstr "移除" + +#~ msgid "Clear Messages" +#~ msgstr "清除訊息" + +#~ msgid "Notification Settings" +#~ msgstr "通知設定值" + +#~ msgid "Tray Menu" +#~ msgstr "系統匣選單" + +#~ msgid "No Messages" +#~ msgstr "沒有訊息" + +#~ msgid "Message Tray" +#~ msgstr "訊息匣" + +#~ msgid "Captive Portal" +#~ msgstr "網頁入口管制" + +#~ msgid "The maximum accuracy level of location." +#~ msgstr "地理位置的最高精確等級。" + +#~ msgid "" +#~ "Configures the maximum level of location accuracy applications are " +#~ "allowed to see. Valid options are 'off' (disable location tracking), " +#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " +#~ "requires GPS receiver). Please keep in mind that this only controls what " +#~ "GeoClue will allow applications to see and they can find user's location " +#~ "on their own using network resources (albeit with street-level accuracy " +#~ "at best)." +#~ msgstr "" +#~ "設定應用程式可查看的地理位置最高精確等級。有效的選項為「off」(停用地理位置" +#~ "追蹤)、「country」(國家)、「city」(縣市)、「neiborhood」(鄰里)、「street」" +#~ "(街路)、「exact」(一般需要 GPS 接收器)。請務必記住這只能控制 GeoClue 所允" +#~ "許應用程式查看的等級,而程式可自行使用本身的網路資源尋找使用者的所在位置 " +#~ "(雖然精確度最高只能到達街路等級)。" + +#~ msgid "Arrangement of buttons on the titlebar" +#~ msgstr "標題列上的按鈕排列" + +#~ msgid "" +#~ "This key overrides the key in org.gnome.desktop.wm.preferences when " +#~ "running GNOME Shell." +#~ msgstr "" +#~ "這個設定鍵會在執行 GNOME Shell 時覆蓋 org.gnome.desktop.wm.preferences 中" +#~ "的設定鍵。" + +#~ msgid "Extension" +#~ msgstr "擴充功能" + +#~ msgid "Select an extension to configure using the combobox above." +#~ msgstr "使用上面的組合方塊選擇要設定的擴充功能。" + +#~ msgid "calendar:MY" +#~ msgstr "calendar:MY" + +#~ msgid "%A, %H:%M" +#~ msgstr "%A%H:%M" + +#~ msgid "%B %d, %H:%M" +#~ msgstr "%m月%d日%H:%M" + +#~ msgid "%B %d %Y, %H:%M " +#~ msgstr "%Y年%m月%d日%H:%M " + +#~ msgid "List of categories that should be displayed as folders" +#~ msgstr "要顯示為資料夾的分類清單" + +#~ msgid "" +#~ "Each category name in this list will be represented as folder in the " +#~ "application view, rather than being displayed inline in the main view." +#~ msgstr "" +#~ "這個清單中的每個分類名稱都會在應用程式檢視中以資料夾表示,而不是在主要檢視" +#~ "中直接顯示。" + +#~ msgid "Authorization request from %s" +#~ msgstr "來自「%s」的核對要求" + +#~ msgid "Device %s wants to pair with this computer" +#~ msgstr "裝置 %s 想要和這個電腦配對" + +#~ msgid "Device %s wants access to the service '%s'" +#~ msgstr "裝置 %s 想要存取服務「%s」" + +#~ msgid "Grant this time only" +#~ msgstr "只有這次准許" + +#~ msgid "Reject" +#~ msgstr "拒絕" + +#~ msgid "Pairing confirmation for %s" +#~ msgstr "%s 的配對確認" + +#~ msgid "" +#~ "Please confirm whether the Passkey '%06d' matches the one on the device." +#~ msgstr "請確認通行碼「%06d」是否和裝置上的相符。" + +#~ msgid "Matches" +#~ msgstr "相符" + +#~ msgid "Does not match" +#~ msgstr "不相符" + +#~ msgid "Pairing request for %s" +#~ msgstr "%s 的配對請求" + +#~ msgid "Please enter the PIN mentioned on the device." +#~ msgstr "請輸入裝置所提及的 PIN。" + +#~ msgid "OK" +#~ msgstr "確定" + +#~ msgid "" +#~ "Sorry, no wisdom for you today:\n" +#~ "%s" +#~ msgstr "" +#~ "抱歉,今天可能有些問題:\n" +#~ "%s" + +#~ msgid "%s the Oracle says" +#~ msgstr "%s Oracle 說:" + +#~ msgctxt "event list time" +#~ msgid "%H\\u2236%M" +#~ msgstr "%H\\u2236%M" + +#~ msgctxt "event list time" +#~ msgid "%l\\u2236%M\\u2009%p" +#~ msgstr "%l\\u2236%M\\u2009%p" diff --git a/src/calendar-server/README b/src/calendar-server/README new file mode 100644 index 0000000..ad9b5e3 --- /dev/null +++ b/src/calendar-server/README @@ -0,0 +1 @@ +Please keep in sync with gnome-panel. diff --git a/src/calendar-server/calendar-debug.h b/src/calendar-server/calendar-debug.h new file mode 100644 index 0000000..39befd7 --- /dev/null +++ b/src/calendar-server/calendar-debug.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2004 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Authors: + * Mark McLoughlin + */ + +#ifndef __CALENDAR_DEBUG_H__ +#define __CALENDAR_DEBUG_H__ + +#include + +G_BEGIN_DECLS + +#ifdef CALENDAR_ENABLE_DEBUG + +#include + +#ifdef G_HAVE_ISO_VARARGS +# define dprintf(...) fprintf (stderr, __VA_ARGS__); +#elif defined(G_HAVE_GNUC_VARARGS) +# define dprintf(args...) fprintf (stderr, args); +#endif + +#else /* if !defined (CALENDAR_DEBUG) */ + +#ifdef G_HAVE_ISO_VARARGS +# define dprintf(...) +#elif defined(G_HAVE_GNUC_VARARGS) +# define dprintf(args...) +#endif + +#endif /* CALENDAR_ENABLE_DEBUG */ + +G_END_DECLS + +#endif /* __CALENDAR_DEBUG_H__ */ diff --git a/src/calendar-server/calendar-sources.c b/src/calendar-server/calendar-sources.c new file mode 100644 index 0000000..628f89b --- /dev/null +++ b/src/calendar-server/calendar-sources.c @@ -0,0 +1,568 @@ +/* + * Copyright (C) 2004 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Authors: + * Mark McLoughlin + * William Jon McCann + * Martin Grimme + * Christian Kellner + */ + +#include + +#include "calendar-sources.h" + +#include +#include +#define HANDLE_LIBICAL_MEMORY +#include + +#undef CALENDAR_ENABLE_DEBUG +#include "calendar-debug.h" + +#ifndef _ +#define _(x) gettext(x) +#endif + +#ifndef N_ +#define N_(x) x +#endif + +typedef struct _ClientData ClientData; +typedef struct _CalendarSourceData CalendarSourceData; + +struct _ClientData +{ + ECalClient *client; + gulong backend_died_id; +}; + +struct _CalendarSourceData +{ + ECalClientSourceType source_type; + CalendarSources *sources; + guint changed_signal; + + /* ESource -> EClient */ + GHashTable *clients; + + guint timeout_id; + + guint loaded : 1; +}; + +typedef struct _CalendarSourcesPrivate CalendarSourcesPrivate; + +struct _CalendarSources +{ + GObject parent; + CalendarSourcesPrivate *priv; +}; + +struct _CalendarSourcesPrivate +{ + ESourceRegistry *registry; + gulong source_added_id; + gulong source_changed_id; + gulong source_removed_id; + + CalendarSourceData appointment_sources; + CalendarSourceData task_sources; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (CalendarSources, calendar_sources, G_TYPE_OBJECT) + +static void calendar_sources_finalize (GObject *object); + +static void backend_died_cb (EClient *client, CalendarSourceData *source_data); +static void calendar_sources_registry_source_changed_cb (ESourceRegistry *registry, + ESource *source, + CalendarSources *sources); +static void calendar_sources_registry_source_removed_cb (ESourceRegistry *registry, + ESource *source, + CalendarSources *sources); + +enum +{ + APPOINTMENT_SOURCES_CHANGED, + TASK_SOURCES_CHANGED, + LAST_SIGNAL +}; +static guint signals [LAST_SIGNAL] = { 0, }; + +static GObjectClass *parent_class = NULL; +static CalendarSources *calendar_sources_singleton = NULL; + +static void +client_data_free (ClientData *data) +{ + g_signal_handler_disconnect (data->client, data->backend_died_id); + g_object_unref (data->client); + g_slice_free (ClientData, data); +} + +static void +calendar_sources_class_init (CalendarSourcesClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = calendar_sources_finalize; + + signals [APPOINTMENT_SOURCES_CHANGED] = + g_signal_new ("appointment-sources-changed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0); + + signals [TASK_SOURCES_CHANGED] = + g_signal_new ("task-sources-changed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0); +} + +static void +calendar_sources_init (CalendarSources *sources) +{ + GError *error = NULL; + GDBusConnection *session_bus; + GVariant *result; + + sources->priv = calendar_sources_get_instance_private (sources); + + /* WORKAROUND: the hardcoded timeout for e_source_registry_new_sync() + (and other library calls that eventually call g_dbus_proxy_new[_sync]()) + is 25 seconds. This has been shown to be too small for + evolution-source-registry in certain cases (slow disk, concurrent IO, + many configured sources), so we first ensure that the service + starts with a manual call and a higher timeout. + + HACK: every time the DBus API is bumped in e-d-s we need + to update this! + */ + session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (session_bus == NULL) + { + g_error ("Failed to connect to the session bus: %s", error->message); + } + + result = g_dbus_connection_call_sync (session_bus, "org.freedesktop.DBus", + "/", "org.freedesktop.DBus", + "StartServiceByName", + g_variant_new ("(su)", + "org.gnome.evolution.dataserver.Sources5", + 0), + NULL, + G_DBUS_CALL_FLAGS_NONE, + 60 * 1000, + NULL, &error); + if (result != NULL) + { + g_variant_unref (result); + sources->priv->registry = e_source_registry_new_sync (NULL, &error); + } + + if (error != NULL) + { + /* Any error is fatal, but we don't want to crash gnome-shell-calendar-server + because of e-d-s problems. So just exit here. + */ + g_warning ("Failed to start evolution-source-registry: %s", error->message); + exit(EXIT_FAILURE); + } + + g_object_unref (session_bus); + + sources->priv->source_added_id = g_signal_connect (sources->priv->registry, + "source-added", + G_CALLBACK (calendar_sources_registry_source_changed_cb), + sources); + sources->priv->source_changed_id = g_signal_connect (sources->priv->registry, + "source-changed", + G_CALLBACK (calendar_sources_registry_source_changed_cb), + sources); + sources->priv->source_removed_id = g_signal_connect (sources->priv->registry, + "source-removed", + G_CALLBACK (calendar_sources_registry_source_removed_cb), + sources); + + sources->priv->appointment_sources.source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS; + sources->priv->appointment_sources.sources = sources; + sources->priv->appointment_sources.changed_signal = signals [APPOINTMENT_SOURCES_CHANGED]; + sources->priv->appointment_sources.clients = g_hash_table_new_full ((GHashFunc) e_source_hash, + (GEqualFunc) e_source_equal, + (GDestroyNotify) g_object_unref, + (GDestroyNotify) client_data_free); + sources->priv->appointment_sources.timeout_id = 0; + + sources->priv->task_sources.source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS; + sources->priv->task_sources.sources = sources; + sources->priv->task_sources.changed_signal = signals [TASK_SOURCES_CHANGED]; + sources->priv->task_sources.clients = g_hash_table_new_full ((GHashFunc) e_source_hash, + (GEqualFunc) e_source_equal, + (GDestroyNotify) g_object_unref, + (GDestroyNotify) client_data_free); + sources->priv->task_sources.timeout_id = 0; +} + +static void +calendar_sources_finalize_source_data (CalendarSources *sources, + CalendarSourceData *source_data) +{ + if (source_data->loaded) + { + g_hash_table_destroy (source_data->clients); + source_data->clients = NULL; + + if (source_data->timeout_id != 0) + { + g_source_remove (source_data->timeout_id); + source_data->timeout_id = 0; + } + + source_data->loaded = FALSE; + } +} + +static void +calendar_sources_finalize (GObject *object) +{ + CalendarSources *sources = CALENDAR_SOURCES (object); + + if (sources->priv->registry) + { + g_signal_handler_disconnect (sources->priv->registry, + sources->priv->source_added_id); + g_signal_handler_disconnect (sources->priv->registry, + sources->priv->source_changed_id); + g_signal_handler_disconnect (sources->priv->registry, + sources->priv->source_removed_id); + g_object_unref (sources->priv->registry); + } + sources->priv->registry = NULL; + + calendar_sources_finalize_source_data (sources, &sources->priv->appointment_sources); + calendar_sources_finalize_source_data (sources, &sources->priv->task_sources); + + if (G_OBJECT_CLASS (parent_class)->finalize) + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +CalendarSources * +calendar_sources_get (void) +{ + gpointer singleton_location = &calendar_sources_singleton; + + if (calendar_sources_singleton) + return g_object_ref (calendar_sources_singleton); + + calendar_sources_singleton = g_object_new (CALENDAR_TYPE_SOURCES, NULL); + g_object_add_weak_pointer (G_OBJECT (calendar_sources_singleton), + singleton_location); + + return calendar_sources_singleton; +} + +/* The clients are just created here but not loaded */ +static void +create_client_for_source (ESource *source, + ECalClientSourceType source_type, + CalendarSourceData *source_data) +{ + ClientData *data; + ECalClient *client; + GError *error = NULL; + + client = g_hash_table_lookup (source_data->clients, source); + g_return_if_fail (client == NULL); + + client = e_cal_client_new (source, source_type, &error); + if (!client) + { + g_warning ("Could not load source '%s': %s", + e_source_get_uid (source), + error->message); + g_clear_error(&error); + return; + } + + data = g_slice_new0 (ClientData); + data->client = client; /* takes ownership */ + data->backend_died_id = g_signal_connect (client, + "backend-died", + G_CALLBACK (backend_died_cb), + source_data); + + g_hash_table_insert (source_data->clients, g_object_ref (source), data); +} + +static inline void +debug_dump_ecal_list (GHashTable *clients) +{ +#ifdef CALENDAR_ENABLE_DEBUG + GList *list, *link; + + dprintf ("Loaded clients:\n"); + list = g_hash_table_get_keys (clients); + for (link = list; link != NULL; link = g_list_next (link)) + { + ESource *source = E_SOURCE (link->data); + + dprintf (" %s %s\n", + e_source_get_uid (source), + e_source_get_display_name (source)); + } + g_list_free (list); +#endif +} + +static void +calendar_sources_load_esource_list (ESourceRegistry *registry, + CalendarSourceData *source_data); + +static gboolean +backend_restart (gpointer data) +{ + CalendarSourceData *source_data = data; + ESourceRegistry *registry; + + registry = source_data->sources->priv->registry; + calendar_sources_load_esource_list (registry, source_data); + g_signal_emit (source_data->sources, source_data->changed_signal, 0); + + source_data->timeout_id = 0; + + return FALSE; +} + +static void +backend_died_cb (EClient *client, CalendarSourceData *source_data) +{ + ESource *source; + const char *display_name; + + source = e_client_get_source (client); + display_name = e_source_get_display_name (source); + g_warning ("The calendar backend for '%s' has crashed.", display_name); + g_hash_table_remove (source_data->clients, source); + + if (source_data->timeout_id != 0) + { + g_source_remove (source_data->timeout_id); + source_data->timeout_id = 0; + } + + source_data->timeout_id = g_timeout_add_seconds (2, backend_restart, + source_data); + g_source_set_name_by_id (source_data->timeout_id, "[gnome-shell] backend_restart"); +} + +static void +calendar_sources_load_esource_list (ESourceRegistry *registry, + CalendarSourceData *source_data) +{ + GList *list, *link; + const gchar *extension_name; + + switch (source_data->source_type) + { + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: + extension_name = E_SOURCE_EXTENSION_CALENDAR; + break; + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: + extension_name = E_SOURCE_EXTENSION_TASK_LIST; + break; + default: + g_return_if_reached (); + } + + list = e_source_registry_list_sources (registry, extension_name); + + for (link = list; link != NULL; link = g_list_next (link)) + { + ESource *source = E_SOURCE (link->data); + ESourceSelectable *extension; + gboolean show_source; + + extension = e_source_get_extension (source, extension_name); + show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension); + + if (show_source) + create_client_for_source (source, source_data->source_type, source_data); + } + + debug_dump_ecal_list (source_data->clients); + + g_list_free_full (list, g_object_unref); +} + +static void +calendar_sources_registry_source_changed_cb (ESourceRegistry *registry, + ESource *source, + CalendarSources *sources) +{ + if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR)) + { + CalendarSourceData *source_data; + ESourceSelectable *extension; + gboolean have_client; + gboolean show_source; + + source_data = &sources->priv->appointment_sources; + extension = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR); + have_client = (g_hash_table_lookup (source_data->clients, source) != NULL); + show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension); + + if (!show_source && have_client) + { + g_hash_table_remove (source_data->clients, source); + g_signal_emit (sources, source_data->changed_signal, 0); + } + if (show_source && !have_client) + { + create_client_for_source (source, source_data->source_type, source_data); + g_signal_emit (sources, source_data->changed_signal, 0); + } + } + + if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) + { + CalendarSourceData *source_data; + ESourceSelectable *extension; + gboolean have_client; + gboolean show_source; + + source_data = &sources->priv->task_sources; + extension = e_source_get_extension (source, E_SOURCE_EXTENSION_TASK_LIST); + have_client = (g_hash_table_lookup (source_data->clients, source) != NULL); + show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension); + + if (!show_source && have_client) + { + g_hash_table_remove (source_data->clients, source); + g_signal_emit (sources, source_data->changed_signal, 0); + } + if (show_source && !have_client) + { + create_client_for_source (source, source_data->source_type, source_data); + g_signal_emit (sources, source_data->changed_signal, 0); + } + } +} + +static void +calendar_sources_registry_source_removed_cb (ESourceRegistry *registry, + ESource *source, + CalendarSources *sources) +{ + if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR)) + { + CalendarSourceData *source_data; + + source_data = &sources->priv->appointment_sources; + g_hash_table_remove (source_data->clients, source); + g_signal_emit (sources, source_data->changed_signal, 0); + } + + if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) + { + CalendarSourceData *source_data; + + source_data = &sources->priv->task_sources; + g_hash_table_remove (source_data->clients, source); + g_signal_emit (sources, source_data->changed_signal, 0); + } +} + +static void +ensure_appointment_sources (CalendarSources *sources) +{ + if (!sources->priv->appointment_sources.loaded) + { + calendar_sources_load_esource_list (sources->priv->registry, + &sources->priv->appointment_sources); + sources->priv->appointment_sources.loaded = TRUE; + } +} + +GList * +calendar_sources_get_appointment_clients (CalendarSources *sources) +{ + GList *list, *link; + + g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL); + + ensure_appointment_sources (sources); + + list = g_hash_table_get_values (sources->priv->appointment_sources.clients); + + for (link = list; link != NULL; link = g_list_next (link)) + link->data = ((ClientData *) link->data)->client; + + return list; +} + +static void +ensure_task_sources (CalendarSources *sources) +{ + if (!sources->priv->task_sources.loaded) + { + calendar_sources_load_esource_list (sources->priv->registry, + &sources->priv->task_sources); + sources->priv->task_sources.loaded = TRUE; + } +} + +GList * +calendar_sources_get_task_clients (CalendarSources *sources) +{ + GList *list, *link; + + g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL); + + ensure_task_sources (sources); + + list = g_hash_table_get_values (sources->priv->task_sources.clients); + + for (link = list; link != NULL; link = g_list_next (link)) + link->data = ((ClientData *) link->data)->client; + + return list; +} + +gboolean +calendar_sources_has_sources (CalendarSources *sources) +{ + g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), FALSE); + + ensure_appointment_sources (sources); + ensure_task_sources (sources); + + return g_hash_table_size (sources->priv->appointment_sources.clients) > 0 || + g_hash_table_size (sources->priv->task_sources.clients) > 0; +} diff --git a/src/calendar-server/calendar-sources.h b/src/calendar-server/calendar-sources.h new file mode 100644 index 0000000..d11850f --- /dev/null +++ b/src/calendar-server/calendar-sources.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2004 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Authors: + * Mark McLoughlin + * William Jon McCann + * Martin Grimme + * Christian Kellner + */ + +#ifndef __CALENDAR_SOURCES_H__ +#define __CALENDAR_SOURCES_H__ + +#include + +G_BEGIN_DECLS + +#define CALENDAR_TYPE_SOURCES (calendar_sources_get_type ()) +G_DECLARE_FINAL_TYPE (CalendarSources, calendar_sources, + CALENDAR, SOURCES, GObject) + +CalendarSources *calendar_sources_get (void); +GList *calendar_sources_get_appointment_clients (CalendarSources *sources); +GList *calendar_sources_get_task_clients (CalendarSources *sources); + +gboolean calendar_sources_has_sources (CalendarSources *sources); + +G_END_DECLS + +#endif /* __CALENDAR_SOURCES_H__ */ diff --git a/src/calendar-server/evolution-calendar.desktop.in b/src/calendar-server/evolution-calendar.desktop.in new file mode 100644 index 0000000..1e34997 --- /dev/null +++ b/src/calendar-server/evolution-calendar.desktop.in @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Evolution Calendar +Exec=evolution -c calendar +# Translators: Do NOT translate or transliterate this text (this is an icon file name)! +Icon=evolution +NoDisplay=true +Type=Application +StartupNotify=true diff --git a/src/calendar-server/gnome-shell-calendar-server.c b/src/calendar-server/gnome-shell-calendar-server.c new file mode 100644 index 0000000..9b76fb0 --- /dev/null +++ b/src/calendar-server/gnome-shell-calendar-server.c @@ -0,0 +1,1117 @@ +/* + * Copyright (C) 2011 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: David Zeuthen + * + * Based on code from gnome-panel's clock-applet, file calendar-client.c, with Authors: + * + * Mark McLoughlin + * William Jon McCann + * Martin Grimme + * Christian Kellner + * + */ + +#include "config.h" + +#include +#include +#include + +#include + +#define HANDLE_LIBICAL_MEMORY +#include + +#include "calendar-sources.h" + +/* Set the environment variable CALENDAR_SERVER_DEBUG to show debug */ +static void print_debug (const gchar *str, ...); + +#define BUS_NAME "org.gnome.Shell.CalendarServer" + +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; +static GDBusNodeInfo *introspection_data = NULL; + +struct _App; +typedef struct _App App; + +static gboolean opt_replace = FALSE; +static GOptionEntry opt_entries[] = { + {"replace", 0, 0, G_OPTION_ARG_NONE, &opt_replace, "Replace existing daemon", NULL}, + {NULL } +}; +static App *_global_app = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + char *rid; + time_t start_time; + time_t end_time; +} CalendarOccurrence; + +typedef struct +{ + char *uid; + char *source_id; + char *backend_name; + char *summary; + char *description; + char *color_string; + time_t start_time; + time_t end_time; + guint is_all_day : 1; + + /* Only used internally */ + GSList *occurrences; +} CalendarAppointment; + +typedef struct +{ + ECalClient *client; + GHashTable *appointments; +} CollectAppointmentsData; + +static time_t +get_time_from_property (icalcomponent *ical, + icalproperty_kind prop_kind, + struct icaltimetype (* get_prop_func) (const icalproperty *prop), + icaltimezone *default_zone) +{ + icalproperty *prop; + struct icaltimetype ical_time; + icalparameter *param; + icaltimezone *timezone = NULL; + + prop = icalcomponent_get_first_property (ical, prop_kind); + if (!prop) + return 0; + + ical_time = get_prop_func (prop); + + param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER); + if (param) + timezone = icaltimezone_get_builtin_timezone_from_tzid (icalparameter_get_tzid (param)); + else if (icaltime_is_utc (ical_time)) + timezone = icaltimezone_get_utc_timezone (); + else + timezone = default_zone; + + return icaltime_as_timet_with_zone (ical_time, timezone); +} + +static char * +get_ical_uid (icalcomponent *ical) +{ + return g_strdup (icalcomponent_get_uid (ical)); +} + +static char * +get_ical_summary (icalcomponent *ical) +{ + icalproperty *prop; + + prop = icalcomponent_get_first_property (ical, ICAL_SUMMARY_PROPERTY); + if (!prop) + return NULL; + + return g_strdup (icalproperty_get_summary (prop)); +} + +static char * +get_ical_description (icalcomponent *ical) +{ + icalproperty *prop; + + prop = icalcomponent_get_first_property (ical, ICAL_DESCRIPTION_PROPERTY); + if (!prop) + return NULL; + + return g_strdup (icalproperty_get_description (prop)); +} + +static inline time_t +get_ical_start_time (icalcomponent *ical, + icaltimezone *default_zone) +{ + return get_time_from_property (ical, + ICAL_DTSTART_PROPERTY, + icalproperty_get_dtstart, + default_zone); +} + +static inline time_t +get_ical_end_time (icalcomponent *ical, + icaltimezone *default_zone) +{ + return get_time_from_property (ical, + ICAL_DTEND_PROPERTY, + icalproperty_get_dtend, + default_zone); +} + +static gboolean +get_ical_is_all_day (icalcomponent *ical, + time_t start_time, + icaltimezone *default_zone) +{ + icalproperty *prop; + struct tm *start_tm; + time_t end_time; + struct icaldurationtype duration; + struct icaltimetype start_icaltime; + + start_icaltime = icalcomponent_get_dtstart (ical); + if (start_icaltime.is_date) + return TRUE; + + start_tm = gmtime (&start_time); + if (start_tm->tm_sec != 0 || + start_tm->tm_min != 0 || + start_tm->tm_hour != 0) + return FALSE; + + if ((end_time = get_ical_end_time (ical, default_zone))) + return (end_time - start_time) % 86400 == 0; + + prop = icalcomponent_get_first_property (ical, ICAL_DURATION_PROPERTY); + if (!prop) + return FALSE; + + duration = icalproperty_get_duration (prop); + + return icaldurationtype_as_int (duration) % 86400 == 0; +} + +static inline time_t +get_ical_due_time (icalcomponent *ical, + icaltimezone *default_zone) +{ + return get_time_from_property (ical, + ICAL_DUE_PROPERTY, + icalproperty_get_due, + default_zone); +} + +static inline time_t +get_ical_completed_time (icalcomponent *ical, + icaltimezone *default_zone) +{ + return get_time_from_property (ical, + ICAL_COMPLETED_PROPERTY, + icalproperty_get_completed, + default_zone); +} + +static char * +get_source_color (ECalClient *esource) +{ + ESource *source; + ECalClientSourceType source_type; + ESourceSelectable *extension; + const gchar *extension_name; + + g_return_val_if_fail (E_IS_CAL_CLIENT (esource), NULL); + + source = e_client_get_source (E_CLIENT (esource)); + source_type = e_cal_client_get_source_type (esource); + + switch (source_type) + { + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: + extension_name = E_SOURCE_EXTENSION_CALENDAR; + break; + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: + extension_name = E_SOURCE_EXTENSION_TASK_LIST; + break; + default: + g_return_val_if_reached (NULL); + } + + extension = e_source_get_extension (source, extension_name); + + return e_source_selectable_dup_color (extension); +} + +static gchar * +get_source_backend_name (ECalClient *esource) +{ + ESource *source; + ECalClientSourceType source_type; + ESourceBackend *extension; + const gchar *extension_name; + + g_return_val_if_fail (E_IS_CAL_CLIENT (esource), NULL); + + source = e_client_get_source (E_CLIENT (esource)); + source_type = e_cal_client_get_source_type (esource); + + switch (source_type) + { + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: + extension_name = E_SOURCE_EXTENSION_CALENDAR; + break; + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: + extension_name = E_SOURCE_EXTENSION_TASK_LIST; + break; + default: + g_return_val_if_reached (NULL); + } + + extension = e_source_get_extension (source, extension_name); + + return e_source_backend_dup_backend_name (extension); +} + +static inline int +null_safe_strcmp (const char *a, + const char *b) +{ + return (!a && !b) ? 0 : (a && !b) || (!a && b) ? 1 : strcmp (a, b); +} + +static inline gboolean +calendar_appointment_equal (CalendarAppointment *a, + CalendarAppointment *b) +{ + GSList *la, *lb; + + if (g_slist_length (a->occurrences) != g_slist_length (b->occurrences)) + return FALSE; + + for (la = a->occurrences, lb = b->occurrences; la && lb; la = la->next, lb = lb->next) + { + CalendarOccurrence *oa = la->data; + CalendarOccurrence *ob = lb->data; + + if (oa->start_time != ob->start_time || + oa->end_time != ob->end_time || + null_safe_strcmp (oa->rid, ob->rid) != 0) + return FALSE; + } + + return + null_safe_strcmp (a->uid, b->uid) == 0 && + null_safe_strcmp (a->source_id, b->source_id) == 0 && + null_safe_strcmp (a->backend_name, b->backend_name) == 0 && + null_safe_strcmp (a->summary, b->summary) == 0 && + null_safe_strcmp (a->description, b->description) == 0 && + null_safe_strcmp (a->color_string, b->color_string) == 0 && + a->start_time == b->start_time && + a->end_time == b->end_time && + a->is_all_day == b->is_all_day; +} + +static void +calendar_appointment_free (CalendarAppointment *appointment) +{ + GSList *l; + + for (l = appointment->occurrences; l; l = l->next) + g_free (((CalendarOccurrence *)l->data)->rid); + g_slist_free_full (appointment->occurrences, g_free); + appointment->occurrences = NULL; + + g_free (appointment->uid); + appointment->uid = NULL; + + g_free (appointment->source_id); + appointment->source_id = NULL; + + g_free (appointment->backend_name); + appointment->backend_name = NULL; + + g_free (appointment->summary); + appointment->summary = NULL; + + g_free (appointment->description); + appointment->description = NULL; + + g_free (appointment->color_string); + appointment->color_string = NULL; + + appointment->start_time = 0; + appointment->is_all_day = FALSE; +} + +static void +calendar_appointment_init (CalendarAppointment *appointment, + icalcomponent *ical, + ECalClient *cal) +{ + icaltimezone *default_zone; + const char *source_id; + + source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal))); + default_zone = e_cal_client_get_default_timezone (cal); + + appointment->uid = get_ical_uid (ical); + appointment->source_id = g_strdup (source_id); + appointment->backend_name = get_source_backend_name (cal); + appointment->summary = get_ical_summary (ical); + appointment->description = get_ical_description (ical); + appointment->color_string = get_source_color (cal); + appointment->start_time = get_ical_start_time (ical, default_zone); + appointment->end_time = get_ical_end_time (ical, default_zone); + appointment->is_all_day = get_ical_is_all_day (ical, + appointment->start_time, + default_zone); +} + +static CalendarAppointment * +calendar_appointment_new (icalcomponent *ical, + ECalClient *cal) +{ + CalendarAppointment *appointment; + + appointment = g_new0 (CalendarAppointment, 1); + + calendar_appointment_init (appointment, ical, cal); + return appointment; +} + +static gboolean +generate_instances_cb (ECalComponent *comp, + time_t start, + time_t end, + gpointer data) +{ + ECalClient *cal = ((CollectAppointmentsData *)data)->client; + GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments; + CalendarAppointment *appointment; + CalendarOccurrence *occurrence; + const char *uid; + + e_cal_component_get_uid (comp, &uid); + appointment = g_hash_table_lookup (appointments, uid); + + if (appointment == NULL) + { + icalcomponent *ical = e_cal_component_get_icalcomponent (comp); + + appointment = calendar_appointment_new (ical, cal); + g_hash_table_insert (appointments, g_strdup (uid), appointment); + } + + occurrence = g_new0 (CalendarOccurrence, 1); + occurrence->start_time = start; + occurrence->end_time = end; + occurrence->rid = e_cal_component_get_recurid_as_string (comp); + + appointment->occurrences = g_slist_append (appointment->occurrences, occurrence); + + return TRUE; +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +struct _App +{ + GDBusConnection *connection; + + time_t since; + time_t until; + + icaltimezone *zone; + + CalendarSources *sources; + gulong sources_signal_id; + + /* hash from uid to CalendarAppointment objects */ + GHashTable *appointments; + + gchar *timezone_location; + + guint changed_timeout_id; + + gboolean cache_invalid; + + GList *live_views; +}; + +static void +app_update_timezone (App *app) +{ + gchar *location; + + location = e_cal_system_timezone_get_location (); + if (g_strcmp0 (location, app->timezone_location) != 0) + { + if (location == NULL) + app->zone = icaltimezone_get_utc_timezone (); + else + app->zone = icaltimezone_get_builtin_timezone (location); + g_free (app->timezone_location); + app->timezone_location = location; + print_debug ("Using timezone %s", app->timezone_location); + } + else + { + g_free (location); + } +} + +static gboolean +on_app_schedule_changed_cb (gpointer user_data) +{ + App *app = user_data; + print_debug ("Emitting changed"); + g_dbus_connection_emit_signal (app->connection, + NULL, /* destination_bus_name */ + "/org/gnome/Shell/CalendarServer", + "org.gnome.Shell.CalendarServer", + "Changed", + NULL, /* no params */ + NULL); + app->changed_timeout_id = 0; + return FALSE; +} + +static void +app_schedule_changed (App *app) +{ + print_debug ("Scheduling changed"); + if (app->changed_timeout_id == 0) + { + app->changed_timeout_id = g_timeout_add (2000, + on_app_schedule_changed_cb, + app); + g_source_set_name_by_id (app->changed_timeout_id, "[gnome-shell] on_app_schedule_changed_cb"); + } +} + +static void +invalidate_cache (App *app) +{ + app->cache_invalid = TRUE; +} + +static void +on_objects_added (ECalClientView *view, + GSList *objects, + gpointer user_data) +{ + App *app = user_data; + GSList *l; + + print_debug ("%s for calendar", G_STRFUNC); + + for (l = objects; l != NULL; l = l->next) + { + icalcomponent *ical = l->data; + const char *uid; + + uid = icalcomponent_get_uid (ical); + + if (g_hash_table_lookup (app->appointments, uid) == NULL) + { + /* new appointment we don't know about => changed signal */ + invalidate_cache (app); + app_schedule_changed (app); + } + } +} + +static void +on_objects_modified (ECalClientView *view, + GSList *objects, + gpointer user_data) +{ + App *app = user_data; + print_debug ("%s for calendar", G_STRFUNC); + invalidate_cache (app); + app_schedule_changed (app); +} + +static void +on_objects_removed (ECalClientView *view, + GSList *uids, + gpointer user_data) +{ + App *app = user_data; + print_debug ("%s for calendar", G_STRFUNC); + invalidate_cache (app); + app_schedule_changed (app); +} + +static void +app_load_events (App *app) +{ + GList *clients; + GList *l; + GList *ll; + gchar *since_iso8601; + gchar *until_iso8601; + gchar *query; + const char *tz_location; + + /* out with the old */ + g_hash_table_remove_all (app->appointments); + /* nuke existing views */ + for (ll = app->live_views; ll != NULL; ll = ll->next) + { + ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data); + g_signal_handlers_disconnect_by_func (view, on_objects_added, app); + g_signal_handlers_disconnect_by_func (view, on_objects_modified, app); + g_signal_handlers_disconnect_by_func (view, on_objects_removed, app); + e_cal_client_view_stop (view, NULL); + g_object_unref (view); + } + g_list_free (app->live_views); + app->live_views = NULL; + + if (!app->since || !app->until) + { + print_debug ("Skipping load of events, no time interval set yet"); + return; + } + /* timezone could have changed */ + app_update_timezone (app); + + since_iso8601 = isodate_from_time_t (app->since); + until_iso8601 = isodate_from_time_t (app->until); + tz_location = icaltimezone_get_location (app->zone); + + print_debug ("Loading events since %s until %s", + since_iso8601, + until_iso8601); + + query = g_strdup_printf ("occur-in-time-range? (make-time \"%s\") " + "(make-time \"%s\") \"%s\"", + since_iso8601, + until_iso8601, + tz_location); + + clients = calendar_sources_get_appointment_clients (app->sources); + for (l = clients; l != NULL; l = l->next) + { + ECalClient *cal = E_CAL_CLIENT (l->data); + GError *error; + ECalClientView *view; + CollectAppointmentsData data; + + e_cal_client_set_default_timezone (cal, app->zone); + + error = NULL; + if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error)) + { + ESource *source = e_client_get_source (E_CLIENT (cal)); + g_warning ("Error opening calendar %s: %s\n", + e_source_get_uid (source), error->message); + g_error_free (error); + continue; + } + + data.client = cal; + data.appointments = app->appointments; + e_cal_client_generate_instances_sync (cal, + app->since, + app->until, + generate_instances_cb, + &data); + + error = NULL; + if (!e_cal_client_get_view_sync (cal, + query, + &view, + NULL, /* cancellable */ + &error)) + { + g_warning ("Error setting up live-query on calendar: %s\n", error->message); + g_error_free (error); + } + else + { + g_signal_connect (view, + "objects-added", + G_CALLBACK (on_objects_added), + app); + g_signal_connect (view, + "objects-modified", + G_CALLBACK (on_objects_modified), + app); + g_signal_connect (view, + "objects-removed", + G_CALLBACK (on_objects_removed), + app); + e_cal_client_view_start (view, NULL); + app->live_views = g_list_prepend (app->live_views, view); + } + } + g_list_free (clients); + g_free (since_iso8601); + g_free (until_iso8601); + g_free (query); + app->cache_invalid = FALSE; +} + +static gboolean +app_has_calendars (App *app) +{ + return calendar_sources_has_sources (app->sources); +} + +static void +on_appointment_sources_changed (CalendarSources *sources, + gpointer user_data) +{ + App *app = user_data; + + print_debug ("Sources changed\n"); + app_load_events (app); + + /* Notify the HasCalendars property */ + { + GVariantBuilder dict_builder; + + g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (&dict_builder, "{sv}", "HasCalendars", + g_variant_new_boolean (app_has_calendars (app))); + + g_dbus_connection_emit_signal (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL), + NULL, + "/org/gnome/Shell/CalendarServer", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new ("(sa{sv}as)", + "org.gnome.Shell.CalendarServer", + &dict_builder, + NULL), + NULL); + } +} + +static App * +app_new (GDBusConnection *connection) +{ + App *app; + + app = g_new0 (App, 1); + app->connection = g_object_ref (connection); + app->sources = calendar_sources_get (); + app->sources_signal_id = g_signal_connect (app->sources, + "appointment-sources-changed", + G_CALLBACK (on_appointment_sources_changed), + app); + + app->appointments = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) calendar_appointment_free); + + app_update_timezone (app); + + return app; +} + +static void +app_free (App *app) +{ + GList *ll; + for (ll = app->live_views; ll != NULL; ll = ll->next) + { + ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data); + g_signal_handlers_disconnect_by_func (view, on_objects_added, app); + g_signal_handlers_disconnect_by_func (view, on_objects_modified, app); + g_signal_handlers_disconnect_by_func (view, on_objects_removed, app); + e_cal_client_view_stop (view, NULL); + g_object_unref (view); + } + g_list_free (app->live_views); + + g_free (app->timezone_location); + + g_hash_table_unref (app->appointments); + + g_object_unref (app->connection); + g_signal_handler_disconnect (app->sources, + app->sources_signal_id); + g_object_unref (app->sources); + + if (app->changed_timeout_id != 0) + g_source_remove (app->changed_timeout_id); + + g_free (app); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + App *app = user_data; + + if (g_strcmp0 (method_name, "GetEvents") == 0) + { + GVariantBuilder builder; + GHashTableIter hash_iter; + CalendarAppointment *a; + gint64 since; + gint64 until; + gboolean force_reload; + gboolean window_changed; + + g_variant_get (parameters, + "(xxb)", + &since, + &until, + &force_reload); + + if (until < since) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gnome.Shell.CalendarServer.Error.Failed", + "until cannot be before since"); + goto out; + } + + print_debug ("Handling GetEvents (since=%" G_GINT64_FORMAT ", until=%" G_GINT64_FORMAT ", force_reload=%s)", + since, + until, + force_reload ? "true" : "false"); + + window_changed = FALSE; + if (!(app->until == until && app->since == since)) + { + GVariantBuilder *builder; + GVariantBuilder *invalidated_builder; + + app->until = until; + app->since = since; + window_changed = TRUE; + + builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); + invalidated_builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); + g_variant_builder_add (builder, "{sv}", + "Until", g_variant_new_int64 (app->until)); + g_variant_builder_add (builder, "{sv}", + "Since", g_variant_new_int64 (app->since)); + g_dbus_connection_emit_signal (app->connection, + NULL, /* destination_bus_name */ + "/org/gnome/Shell/CalendarServer", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new ("(sa{sv}as)", + "org.gnome.Shell.CalendarServer", + builder, + invalidated_builder), + NULL); /* GError** */ + } + + /* reload events if necessary */ + if (window_changed || force_reload || app->cache_invalid) + { + app_load_events (app); + } + + /* The a{sv} is used as an escape hatch in case we want to provide more + * information in the future without breaking ABI + */ + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sssbxxa{sv})")); + g_hash_table_iter_init (&hash_iter, app->appointments); + while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &a)) + { + GVariantBuilder extras_builder; + GSList *l; + + for (l = a->occurrences; l; l = l->next) + { + CalendarOccurrence *o = l->data; + time_t start_time = o->start_time; + time_t end_time = o->end_time; + + if ((start_time >= app->since && + start_time < app->until) || + (start_time <= app->since && + (end_time - 1) > app->since)) + { + /* While the UID is usually enough to identify an event, + * only the triple of (source,UID,RID) is fully unambiguous; + * neither may contain '\n', so we can safely use it to + * create a unique ID from the triple + */ + char *id = g_strdup_printf ("%s\n%s\n%s", + a->source_id, + a->uid, + o->rid ? o->rid : ""); + + g_variant_builder_init (&extras_builder, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (&builder, + "(sssbxxa{sv})", + id, + a->summary != NULL ? a->summary : "", + a->description != NULL ? a->description : "", + (gboolean) a->is_all_day, + (gint64) start_time, + (gint64) end_time, + extras_builder); + g_free (id); + } + } + } + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(a(sssbxxa{sv}))", &builder)); + } + else + { + g_assert_not_reached (); + } + + out: + ; +} + +static GVariant * +handle_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + App *app = user_data; + GVariant *ret; + + ret = NULL; + if (g_strcmp0 (property_name, "Since") == 0) + { + ret = g_variant_new_int64 (app->since); + } + else if (g_strcmp0 (property_name, "Until") == 0) + { + ret = g_variant_new_int64 (app->until); + } + else if (g_strcmp0 (property_name, "HasCalendars") == 0) + { + ret = g_variant_new_boolean (app_has_calendars (app)); + } + else + { + g_assert_not_reached (); + } + return ret; +} + +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + handle_get_property, + NULL /* handle_set_property */ +}; + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GError *error; + guint registration_id; + + _global_app = app_new (connection); + + error = NULL; + registration_id = g_dbus_connection_register_object (connection, + "/org/gnome/Shell/CalendarServer", + introspection_data->interfaces[0], + &interface_vtable, + _global_app, + NULL, /* user_data_free_func */ + &error); + if (registration_id == 0) + { + g_printerr ("Error exporting object: %s (%s %d)", + error->message, + g_quark_to_string (error->domain), + error->code); + g_error_free (error); + _exit (1); + } + + print_debug ("Connected to the session bus"); + +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GMainLoop *main_loop = user_data; + + g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n", + (gint) getpid ()); + g_main_loop_quit (main_loop); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + print_debug ("Acquired the name " BUS_NAME); +} + +static gboolean +stdin_channel_io_func (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + GMainLoop *main_loop = data; + + if (condition & G_IO_HUP) + { + g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n", + (gint) getpid ()); + g_main_loop_quit (main_loop); + } + else + { + g_warning ("Unhandled condition %d on GIOChannel for stdin", condition); + } + return FALSE; /* remove source */ +} + +int +main (int argc, + char **argv) +{ + GError *error; + GOptionContext *opt_context; + GMainLoop *main_loop; + gint ret; + guint name_owner_id; + GIOChannel *stdin_channel; + + ret = 1; + opt_context = NULL; + name_owner_id = 0; + stdin_channel = NULL; + + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (introspection_data != NULL); + + opt_context = g_option_context_new ("gnome-shell calendar server"); + g_option_context_add_main_entries (opt_context, opt_entries, NULL); + error = NULL; + if (!g_option_context_parse (opt_context, &argc, &argv, &error)) + { + g_printerr ("Error parsing options: %s", error->message); + g_error_free (error); + goto out; + } + + main_loop = g_main_loop_new (NULL, FALSE); + + stdin_channel = g_io_channel_unix_new (STDIN_FILENO); + g_io_add_watch_full (stdin_channel, + G_PRIORITY_DEFAULT, + G_IO_HUP, + stdin_channel_io_func, + g_main_loop_ref (main_loop), + (GDestroyNotify) g_main_loop_unref); + + name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | + (opt_replace ? G_BUS_NAME_OWNER_FLAGS_REPLACE : 0), + on_bus_acquired, + on_name_acquired, + on_name_lost, + g_main_loop_ref (main_loop), + (GDestroyNotify) g_main_loop_unref); + + g_main_loop_run (main_loop); + + g_main_loop_unref (main_loop); + + ret = 0; + + out: + if (stdin_channel != NULL) + g_io_channel_unref (stdin_channel); + if (_global_app != NULL) + app_free (_global_app); + if (name_owner_id != 0) + g_bus_unown_name (name_owner_id); + if (opt_context != NULL) + g_option_context_free (opt_context); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +print_debug (const gchar *format, ...) +{ + gchar *s; + va_list ap; + gchar timebuf[64]; + GTimeVal now; + time_t now_t; + struct tm broken_down; + static volatile gsize once_init_value = 0; + static gboolean show_debug = FALSE; + static guint pid = 0; + + if (g_once_init_enter (&once_init_value)) + { + show_debug = (g_getenv ("CALENDAR_SERVER_DEBUG") != NULL); + pid = getpid (); + g_once_init_leave (&once_init_value, 1); + } + + if (!show_debug) + goto out; + + g_get_current_time (&now); + now_t = now.tv_sec; + localtime_r (&now_t, &broken_down); + strftime (timebuf, sizeof timebuf, "%H:%M:%S", &broken_down); + + va_start (ap, format); + s = g_strdup_vprintf (format, ap); + va_end (ap); + + g_print ("gnome-shell-calendar-server[%d]: %s.%03d: %s\n", pid, timebuf, (gint) (now.tv_usec / 1000), s); + g_free (s); + out: + ; +} diff --git a/src/calendar-server/meson.build b/src/calendar-server/meson.build new file mode 100644 index 0000000..a7393fc --- /dev/null +++ b/src/calendar-server/meson.build @@ -0,0 +1,37 @@ +calendar_sources = [ + 'gnome-shell-calendar-server.c', + 'calendar-debug.h', + 'calendar-sources.c', + 'calendar-sources.h' +] + +calendar_server = executable('gnome-shell-calendar-server', calendar_sources, + dependencies: [ecal_dep, eds_dep, gio_dep], + include_directories: include_directories('..', '../..'), + c_args: [ + '-DPREFIX="@0@"'.format(prefix), + '-DLIBDIR="@0@"'.format(libdir), + '-DDATADIR="@0@"'.format(datadir), + '-DG_LOG_DOMAIN="ShellCalendarServer"' + ], + install_dir: libexecdir, + install: true +) + +service_file = 'org.gnome.Shell.CalendarServer.service' + +configure_file( + input: service_file + '.in', + output: service_file, + configuration: service_data, + install_dir: servicedir +) + +i18n.merge_file('evolution-calendar.desktop', + input: 'evolution-calendar.desktop.in', + output: 'evolution-calendar.desktop', + po_dir: '../../po', + install: true, + install_dir: desktopdir, + type: 'desktop' +) diff --git a/src/calendar-server/org.gnome.Shell.CalendarServer.service.in b/src/calendar-server/org.gnome.Shell.CalendarServer.service.in new file mode 100644 index 0000000..5addce6 --- /dev/null +++ b/src/calendar-server/org.gnome.Shell.CalendarServer.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.gnome.Shell.CalendarServer +Exec=@libexecdir@/gnome-shell-calendar-server diff --git a/src/data-to-c.pl b/src/data-to-c.pl new file mode 100755 index 0000000..69f7436 --- /dev/null +++ b/src/data-to-c.pl @@ -0,0 +1,37 @@ +#!/usr/bin/env perl + +# Copyright © 2011 Red Hat, Inc +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the licence, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, see . +# +# Author: Kalev Lember + + +if (@ARGV != 2) { + die "Usage: data-to-c.pl \n"; +} + +$file = $ARGV[0]; + +open (FILE, $file) || die "Cannot open $file: $!\n"; + +printf ("const char %s[] = \"", $ARGV[1]); +while (my $line = ) { + foreach my $c (split //, $line) { + printf ("\\x%02x", ord ($c)); + } +} +print "\";\n"; + +close (FILE); diff --git a/src/gnome-shell-extension-prefs.c b/src/gnome-shell-extension-prefs.c new file mode 100644 index 0000000..7ff728e --- /dev/null +++ b/src/gnome-shell-extension-prefs.c @@ -0,0 +1,51 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include +#include + +int +main (int argc, char *argv[]) +{ + const char *search_path[] = { "resource:///org/gnome/shell", NULL }; + GError *error = NULL; + GjsContext *context; + int status; + + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + context = g_object_new (GJS_TYPE_CONTEXT, + "search-path", search_path, + NULL); + + if (!gjs_context_define_string_array(context, "ARGV", + argc - 1, (const char**)argv + 1, + &error)) + { + g_message("Failed to defined ARGV: %s", error->message); + g_error_free (error); + g_object_unref (context); + + return 1; + } + + if (!gjs_context_eval (context, + "const Main = imports.extensionPrefs.main; Main.main(ARGV);", + -1, + "
", + &status, + &error)) + { + g_message ("Execution of main.js threw exception: %s", error->message); + g_error_free (error); + g_object_unref (context); + + return status; + } + + g_object_unref (context); + return 0; +} diff --git a/src/gnome-shell-extension-tool.in b/src/gnome-shell-extension-tool.in new file mode 100755 index 0000000..f6c3762 --- /dev/null +++ b/src/gnome-shell-extension-tool.in @@ -0,0 +1,232 @@ +#!@PYTHON@ +# -*- mode: Python; indent-tabs-mode: nil; -*- + +import os +import re +import socket +import subprocess +import sys +import optparse +import tempfile +try: + import json +except ImportError: + try: + import simplejson as json + except ImportError: + print('The Python simplejson module is required') + sys.exit(1) + +from gi.repository import Gio, GLib + +SAMPLE_EXTENSION_FILES = { + "extension.js": """ +const St = imports.gi.St; +const Main = imports.ui.main; +const Tweener = imports.ui.tweener; + +let text, button; + +function _hideHello() { + Main.uiGroup.remove_actor(text); + text = null; +} + +function _showHello() { + if (!text) { + text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" }); + Main.uiGroup.add_actor(text); + } + + text.opacity = 255; + + let monitor = Main.layoutManager.primaryMonitor; + + text.set_position(monitor.x + Math.floor(monitor.width / 2 - text.width / 2), + monitor.y + Math.floor(monitor.height / 2 - text.height / 2)); + + Tweener.addTween(text, + { opacity: 0, + time: 2, + transition: 'easeOutQuad', + onComplete: _hideHello }); +} + +function init() { + button = new St.Bin({ style_class: 'panel-button', + reactive: true, + can_focus: true, + x_fill: true, + y_fill: false, + track_hover: true }); + let icon = new St.Icon({ icon_name: 'system-run-symbolic', + style_class: 'system-status-icon' }); + + button.set_child(icon); + button.connect('button-press-event', _showHello); +} + +function enable() { + Main.panel._rightBox.insert_child_at_index(button, 0); +} + +function disable() { + Main.panel._rightBox.remove_child(button); +} +""", + + "stylesheet.css": """ +.helloworld-label { + font-size: 36px; + font-weight: bold; + color: #ffffff; + background-color: rgba(10,10,10,0.7); + border-radius: 5px; + padding: .5em; +} +""", +} + +def create_extension(): + print() + print('''Name should be a very short (ideally descriptive) string. +Examples are: "Click To Focus", "Adblock", "Shell Window Shrinker". +''') + name = input('Name: ').strip() + print() + print('''Description is a single-sentence explanation of what your extension does. +Examples are: "Make windows visible on click", "Block advertisement popups" + "Animate windows shrinking on minimize" +''') + description = input('Description: ').strip() + underifier = re.compile('[^A-Za-z]') + sample_uuid = underifier.sub('_', name) + # TODO use evolution data server + hostname = socket.gethostname() + sample_uuid = sample_uuid + '@' + hostname + + print() + print('''Uuid is a globally-unique identifier for your extension. +This should be in the format of an email address (foo.bar@extensions.example.com), but +need not be an actual email address, though it's a good idea to base the uuid on your +email address. For example, if your email address is janedoe@example.com, you might +use an extension title clicktofocus@janedoe.example.com.''') + uuid = input('Uuid [%s]: ' % (sample_uuid, )).strip() + if uuid == '': + uuid = sample_uuid + + extension_path = os.path.join(os.path.expanduser('~/.local'), 'share', 'gnome-shell', 'extensions', uuid) + if os.path.exists(extension_path): + print("Extension path %r already exists" % (extension_path, )) + sys.exit(0) + os.makedirs(extension_path) + meta = { 'name': name, + 'description': description, + 'uuid': uuid, + 'shell-version': ['@VERSION@'] } + f = open(os.path.join(extension_path, 'metadata.json'), 'w') + try: + json.dump(meta, f) + except AttributeError: + # For Python versions older than 2.6, try using the json-py module + f.write(json.write(meta) + '\n') + f.close() + + for filename, contents in SAMPLE_EXTENSION_FILES.items(): + path = os.path.join(extension_path, filename) + f = open(path, 'w') + f.write(contents) + f.close() + + print("Created extension in %r" % (extension_path, )) + extensionjs_path = os.path.join(extension_path, 'extension.js') + subprocess.Popen(['xdg-open', extensionjs_path]) + +ENABLED_EXTENSIONS_KEY = 'enabled-extensions' + +def enable_extension(uuid): + settings = Gio.Settings(schema='org.gnome.shell') + extensions = settings.get_strv(ENABLED_EXTENSIONS_KEY) + + if uuid in extensions: + print("%r is already enabled." % (uuid,), file=sys.stderr) + sys.exit(1) + + extensions.append(uuid) + settings.set_strv(ENABLED_EXTENSIONS_KEY, extensions) + print("%r is now enabled." % (uuid,), file=sys.stderr) + +def disable_extension(uuid): + settings = Gio.Settings(schema='org.gnome.shell') + extensions = settings.get_strv(ENABLED_EXTENSIONS_KEY) + + if uuid not in extensions: + print("%r is not enabled or installed." % (uuid,), file=sys.stderr) + sys.exit(1) + + # Use a while loop here to remove *all* mentions instances + # of the extension. Some faulty tools like to append more than one. + while uuid in extensions: + extensions.remove(uuid) + + settings.set_strv(ENABLED_EXTENSIONS_KEY, extensions) + print("%r is now disabled." % (uuid,), file=sys.stderr) + +def reload_extension(uuid): + settings = Gio.Settings(schema='org.gnome.shell') + extensions = settings.get_strv(ENABLED_EXTENSIONS_KEY) + + if uuid not in extensions: + print("%r is not enabled or installed." % (uuid,), file=sys.stderr) + sys.exit(1) + + proxy = Gio.DBusProxy.new_sync(Gio.bus_get_sync(Gio.BusType.SESSION, None), + Gio.DBusProxyFlags.NONE, + None, + 'org.gnome.Shell', + '/org/gnome/Shell', + 'org.gnome.Shell.Extensions', + None) + proxy.call_sync('ReloadExtension', + GLib.Variant('(s)', (uuid,)), + Gio.DBusCallFlags.NONE, + -1, + None) + + print("%r reloaded." % (uuid,), file=sys.stderr) + + +def main(): + parser = optparse.OptionParser() + parser.add_option("-d", "--disable-extension", dest="disable", + help="Disable a GNOME Shell extension") + parser.add_option("-e", "--enable-extension", dest="enable", + help="Enable a GNOME Shell extension") + parser.add_option("-c", "--create-extension", dest="create", action="store_true", + help="Create a new GNOME Shell extension") + parser.add_option("-r", "--reload-extension", dest="reload", + help="Reload a GNOME Shell extension") + options, args = parser.parse_args() + + if args: + parser.print_usage() + sys.exit(1) + + if options.disable: + disable_extension(options.disable) + + elif options.enable: + enable_extension(options.enable) + + elif options.create: + create_extension() + + elif options.reload: + reload_extension(options.reload) + + else: + parser.print_usage() + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/src/gnome-shell-perf-tool.in b/src/gnome-shell-perf-tool.in new file mode 100755 index 0000000..f4b48f7 --- /dev/null +++ b/src/gnome-shell-perf-tool.in @@ -0,0 +1,364 @@ +#!@PYTHON@ +# -*- mode: Python; indent-tabs-mode: nil; -*- + +import datetime +from gi.repository import GLib, GObject, Gio +try: + import json +except ImportError: + import simplejson as json +import optparse +import os +import re +import subprocess +import sys +import tempfile +import base64 +from configparser import RawConfigParser +import hashlib +import hmac +from http import client +from urllib import parse + +def show_version(option, opt_str, value, parser): + print("GNOME Shell Performance Test @VERSION@") + sys.exit() + +def wait_for_dbus_name(wait_name): + loop = GLib.MainLoop() + + def on_name_appeared(connection, name, new_owner, *args): + if not (name == wait_name and new_owner != ''): + return + loop.quit() + return + + watch_id = Gio.bus_watch_name(Gio.BusType.SESSION, + wait_name, + Gio.BusNameWatcherFlags.NONE, + on_name_appeared, + None) + + def on_timeout(): + print("\nFailed to start %s: timed out" % (wait_name,)) + sys.exit(1) + GLib.timeout_add_seconds(7, on_timeout) + + loop.run() + Gio.bus_unwatch_name(watch_id) + +PERF_HELPER_NAME = "org.gnome.Shell.PerfHelper" +PERF_HELPER_IFACE = "org.gnome.Shell.PerfHelper" +PERF_HELPER_PATH = "/org/gnome/Shell/PerfHelper" + +def start_perf_helper(): + self_dir = os.path.dirname(os.path.abspath(sys.argv[0])) + perf_helper_path = "@libexecdir@/gnome-shell-perf-helper" + + subprocess.Popen([perf_helper_path]) + wait_for_dbus_name (PERF_HELPER_NAME) + +def stop_perf_helper(): + bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) + + proxy = Gio.DBusProxy.new_sync(bus, + Gio.DBusProxyFlags.NONE, + None, + PERF_HELPER_NAME, + PERF_HELPER_PATH, + PERF_HELPER_IFACE, + None) + proxy.Exit() + +def start_shell(perf_output=None): + # Set up environment + env = dict(os.environ) + env['SHELL_PERF_MODULE'] = options.perf + + filters = ['Gnome-shell-perf-helper'] + options.extra_filter + env['MUTTER_WM_CLASS_FILTER'] = ','.join(filters) + + if perf_output is not None: + env['SHELL_PERF_OUTPUT'] = perf_output + + # A fixed background image + env['SHELL_BACKGROUND_IMAGE'] = '@pkgdatadir@/perf-background.xml' + + self_dir = os.path.dirname(os.path.abspath(sys.argv[0])) + args = [] + args.append(os.path.join(self_dir, 'gnome-shell')) + + if options.replace: + args.append('--replace') + + return subprocess.Popen(args, env=env) + +def run_shell(perf_output=None): + # we do no additional supervision of gnome-shell, + # beyond that of wait + # in particular, we don't kill the shell upon + # receving a KeyboardInterrupt, as we expect to be + # in the same process group + shell = start_shell(perf_output=perf_output) + shell.wait() + return shell.returncode == 0 + +def restore_shell(): + pid = os.fork() + if (pid == 0): + os.execlp("gnome-shell", "gnome-shell", "--replace") + else: + sys.exit(0) + +def upload_performance_report(report_text): + try: + config_home = os.environ['XDG_CONFIG_HOME'] + except KeyError: + config_home = None + + if not config_home: + config_home = os.path.expanduser("~/.config") + + config_file = os.path.join(config_home, "gnome-shell/perf.ini") + + try: + config = RawConfigParser() + f = open(config_file) + config.readfp(f) + f.close() + + base_url = config.get('upload', 'url') + system_name = config.get('upload', 'name') + secret_key = config.get('upload', 'key') + except Exception as e: + print("Can't read upload configuration from %s: %s" % (config_file, str(e))) + sys.exit(1) + + # Determine host, port and upload URL from provided data, we're + # a bit extra-careful about normalization since the URL is part + # of the signature. + + split = parse.urlsplit(base_url) + scheme = split[0].lower() + netloc = split[1] + base_path = split[2] + + m = re.match(r'^(.*?)(?::(\d+))?$', netloc) + if m.group(2): + host, port = m.group(1), int(m.group(2)) + else: + host, port = m.group(1), None + + if scheme != "http": + print("'%s' is not a HTTP URL" % base_url) + sys.exit(1) + + if port is None: + port = 80 + + if base_path.endswith('/'): + base_path = base_path[:-1] + + if port == 80: + normalized_base = "%s://%s%s" % (scheme, host, base_path) + else: + normalized_base = "%s://%s:%d%s" % (scheme, host, port, base_path) + + upload_url = normalized_base + '/system/%s/upload' % system_name + upload_path = parse.urlsplit(upload_url)[2] # path portion + + # Create signature based on upload URL and the report data + + signature_data = 'POST&' + upload_url + "&&" + h = hmac.new(secret_key, digestmod=hashlib.sha1) + h.update(signature_data) + h.update(report_text) + signature = parse.quote(base64.b64encode(h.digest()), "~") + + headers = { + 'User-Agent': 'gnome-shell-performance-tool/@VERSION@', + 'Content-Type': 'application/json', + 'X-Shell-Signature': 'HMAC-SHA1 ' + signature + }; + + connection = client.HTTPConnection(host, port) + connection.request('POST', upload_path, report_text, headers) + response = connection.getresponse() + + if response.status == 200: + print("Performance report upload succeeded") + else: + print("Performance report upload failed with status %d" % response.status) + print(response.read()) + +def gnome_hwtest_log(*args): + command = ['gnome-hwtest-log', '-t', 'gnome-shell-perf-tool'] + command.extend(args) + subprocess.check_call(command) + +def run_performance_test(): + iters = options.perf_iters + if options.perf_warmup: + iters += 1 + + logs = [] + metric_summaries = {} + + start_perf_helper() + + for i in range(0, iters): + # We create an empty temporary file that the shell will overwrite + # with the contents. + handle, output_file = tempfile.mkstemp(".json", "gnome-shell-perf.") + os.close(handle) + + # Run the performance test and collect the output as JSON + normal_exit = False + try: + normal_exit = run_shell(perf_output=output_file) + except: + stop_perf_helper() + raise + finally: + if not normal_exit: + os.remove(output_file) + + if not normal_exit: + stop_perf_helper() + return False + + try: + f = open(output_file) + output = json.load(f) + f.close() + except: + stop_perf_helper() + raise + finally: + os.remove(output_file) + + # Grab the event definitions and monitor layout the first time around + if i == 0: + events = output['events'] + monitors = output['monitors'] + + if options.perf_warmup and i == 0: + continue + + for metric in output['metrics']: + name = metric['name'] + if not name in metric_summaries: + summary = {} + summary['description'] = metric['description'] + summary['units'] = metric['units'] + summary['values'] = [] + metric_summaries[name] = summary + else: + summary = metric_summaries[name] + + summary['values'].append(metric['value']) + + logs.append(output['log']) + + stop_perf_helper() + + if options.perf_output or options.perf_upload: + # Write a complete report, formatted as JSON. The Javascript/C code that + # generates the individual reports we are summarizing here is very careful + # to format them nicely, but we just dump out a compressed no-whitespace + # version here for simplicity. Using json.dump(indent=0) doesn't real + # improve the readability of the output much. + report = { + 'date': datetime.datetime.utcnow().isoformat() + 'Z', + 'events': events, + 'monitors': monitors, + 'metrics': metric_summaries, + 'logs': logs + } + + # Add the Git revision if available + self_dir = os.path.dirname(os.path.abspath(sys.argv[0])) + if os.path.exists(os.path.join(self_dir, 'gnome-shell-jhbuild.in')): + top_dir = os.path.dirname(self_dir) + git_dir = os.path.join(top_dir, '.git') + if os.path.exists(git_dir): + env = dict(os.environ) + env['GIT_DIR'] = git_dir + revision = subprocess.Popen(['git', 'rev-parse', 'HEAD'], + env=env, + stdout=subprocess.PIPE).communicate()[0].strip() + report['revision'] = revision + + if options.perf_output: + f = open(options.perf_output, 'w') + json.dump(report, f) + f.close() + + if options.perf_upload: + upload_performance_report(json.dumps(report)) + elif options.hwtest: + # Log to systemd journal + for metric in sorted(metric_summaries.keys()): + summary = metric_summaries[metric] + gnome_hwtest_log('--metric=' + metric + '=' + str(summary['values'][0]) + summary['units'], + '--metric-description=' + summary['description']) + gnome_hwtest_log('--finished') + else: + # Write a human readable summary + print('------------------------------------------------------------') + for metric in sorted(metric_summaries.keys()): + summary = metric_summaries[metric] + print("#", summary['description']) + print(metric, ", ".join((str(x) for x in summary['values']))) + print('------------------------------------------------------------') + + return True + +# Main program + +parser = optparse.OptionParser() +parser.add_option("", "--perf", metavar="PERF_MODULE", + help="Specify the name of a performance module to run") +parser.add_option("", "--perf-iters", type="int", metavar="ITERS", + help="Numbers of iterations of performance module to run", + default=1) +parser.add_option("", "--perf-warmup", action="store_true", + help="Run a dry run before performance tests") +parser.add_option("", "--perf-output", metavar="OUTPUT_FILE", + help="Output file to write performance report") +parser.add_option("", "--perf-upload", action="store_true", + help="Upload performance report to server") +parser.add_option("", "--extra-filter", action="append", + help="add an extra window class that should be allowed") +parser.add_option("", "--hwtest", action="store_true", + help="Log results appropriately for GNOME Hardware Testing") +parser.add_option("", "--version", action="callback", callback=show_version, + help="Display version and exit") + +parser.add_option("-r", "--replace", action="store_true", + help="Replace the running window manager") + +options, args = parser.parse_args() + +if options.perf == None: + if options.hwtest: + options.perf = 'hwtest' + else: + options.perf = 'core' + +if options.extra_filter is None: + options.extra_filter = [] + +if options.perf == 'hwtest': + options.extra_filter.append('Gedit') + +if args: + parser.print_usage() + sys.exit(1) + +normal_exit = run_performance_test() +if normal_exit: + if not options.hwtest: + restore_shell() +else: + sys.exit(1) diff --git a/src/gnome-shell-plugin.c b/src/gnome-shell-plugin.c new file mode 100644 index 0000000..35a9a8b --- /dev/null +++ b/src/gnome-shell-plugin.c @@ -0,0 +1,386 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (c) 2008 Red Hat, Inc. + * Copyright (c) 2008 Intel Corp. + * + * Based on plugin skeleton by: + * Author: Tomas Frydrych + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +/* + * GnomeShellPlugin is the entry point for for GNOME Shell into and out of + * Mutter. By registering itself into Mutter using + * meta_plugin_manager_set_plugin_type(), Mutter will call the vfuncs of the + * plugin at the appropriate time. + * + * The funcions in in GnomeShellPlugin are all just stubs, which just call the + * similar methods in GnomeShellWm. + */ + +#include "config.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "shell-global-private.h" +#include "shell-perf-log.h" +#include "shell-wm-private.h" + +#define GNOME_TYPE_SHELL_PLUGIN (gnome_shell_plugin_get_type ()) +G_DECLARE_FINAL_TYPE (GnomeShellPlugin, gnome_shell_plugin, + GNOME, SHELL_PLUGIN, + MetaPlugin) + +struct _GnomeShellPlugin +{ + MetaPlugin parent; + + int glx_error_base; + int glx_event_base; + guint have_swap_event : 1; + CoglContext *cogl_context; + + ShellGlobal *global; +}; + +G_DEFINE_TYPE (GnomeShellPlugin, gnome_shell_plugin, META_TYPE_PLUGIN) + +static gboolean +gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin) +{ + CoglDisplay *cogl_display = + cogl_context_get_display (shell_plugin->cogl_context); + CoglRenderer *renderer = cogl_display_get_renderer (cogl_display); + const char * (* query_extensions_string) (Display *dpy, int screen); + Bool (* query_extension) (Display *dpy, int *error, int *event); + Display *xdisplay; + int screen_number; + const char *glx_extensions; + + /* We will only get swap events if Cogl is using GLX */ + if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX) + return FALSE; + + xdisplay = clutter_x11_get_default_display (); + + query_extensions_string = + (void *) cogl_get_proc_address ("glXQueryExtensionsString"); + query_extension = + (void *) cogl_get_proc_address ("glXQueryExtension"); + + query_extension (xdisplay, + &shell_plugin->glx_error_base, + &shell_plugin->glx_event_base); + + screen_number = XDefaultScreen (xdisplay); + glx_extensions = query_extensions_string (xdisplay, screen_number); + + return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL; +} + +static void +gnome_shell_plugin_start (MetaPlugin *plugin) +{ + GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); + GError *error = NULL; + int status; + GjsContext *gjs_context; + ClutterBackend *backend; + + backend = clutter_get_default_backend (); + shell_plugin->cogl_context = clutter_backend_get_cogl_context (backend); + + shell_plugin->have_swap_event = + gnome_shell_plugin_has_swap_event (shell_plugin); + + shell_perf_log_define_event (shell_perf_log_get_default (), + "glx.swapComplete", + "GL buffer swap complete event received (with timestamp of completion)", + "x"); + + shell_plugin->global = shell_global_get (); + _shell_global_set_plugin (shell_plugin->global, META_PLUGIN (shell_plugin)); + + gjs_context = _shell_global_get_gjs_context (shell_plugin->global); + + if (!gjs_context_eval (gjs_context, + "imports.ui.environment.init();" + "imports.ui.main.start();", + -1, + "
", + &status, + &error)) + { + g_message ("Execution of main.js threw exception: %s", error->message); + g_error_free (error); + /* We just exit() here, since in a development environment you'll get the + * error in your shell output, and it's way better than a busted WM, + * which typically manifests as a white screen. + * + * In production, we shouldn't crash =) But if we do, we should get + * restarted by the session infrastructure, which is likely going + * to be better than some undefined state. + * + * If there was a generic "hook into bug-buddy for non-C crashes" + * infrastructure, here would be the place to put it. + */ + g_object_unref (gjs_context); + exit (1); + } +} + +static ShellWM * +get_shell_wm (void) +{ + ShellWM *wm; + + g_object_get (shell_global_get (), + "window-manager", &wm, + NULL); + /* drop extra ref added by g_object_get */ + g_object_unref (wm); + + return wm; +} + +static void +gnome_shell_plugin_minimize (MetaPlugin *plugin, + MetaWindowActor *actor) +{ + _shell_wm_minimize (get_shell_wm (), + actor); + +} + +static void +gnome_shell_plugin_unminimize (MetaPlugin *plugin, + MetaWindowActor *actor) +{ + _shell_wm_unminimize (get_shell_wm (), + actor); + +} + +static void +gnome_shell_plugin_size_changed (MetaPlugin *plugin, + MetaWindowActor *actor) +{ + _shell_wm_size_changed (get_shell_wm (), actor); +} + +static void +gnome_shell_plugin_size_change (MetaPlugin *plugin, + MetaWindowActor *actor, + MetaSizeChange which_change, + MetaRectangle *old_frame_rect, + MetaRectangle *old_buffer_rect) +{ + _shell_wm_size_change (get_shell_wm (), actor, which_change, old_frame_rect, old_buffer_rect); +} + +static void +gnome_shell_plugin_map (MetaPlugin *plugin, + MetaWindowActor *actor) +{ + _shell_wm_map (get_shell_wm (), + actor); +} + +static void +gnome_shell_plugin_destroy (MetaPlugin *plugin, + MetaWindowActor *actor) +{ + _shell_wm_destroy (get_shell_wm (), + actor); +} + +static void +gnome_shell_plugin_switch_workspace (MetaPlugin *plugin, + gint from, + gint to, + MetaMotionDirection direction) +{ + _shell_wm_switch_workspace (get_shell_wm(), from, to, direction); +} + +static void +gnome_shell_plugin_kill_window_effects (MetaPlugin *plugin, + MetaWindowActor *actor) +{ + _shell_wm_kill_window_effects (get_shell_wm(), actor); +} + +static void +gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin) +{ + _shell_wm_kill_switch_workspace (get_shell_wm()); +} + +static void +gnome_shell_plugin_show_tile_preview (MetaPlugin *plugin, + MetaWindow *window, + MetaRectangle *tile_rect, + int tile_monitor) +{ + _shell_wm_show_tile_preview (get_shell_wm (), window, tile_rect, tile_monitor); +} + +static void +gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin) +{ + _shell_wm_hide_tile_preview (get_shell_wm ()); +} + +static void +gnome_shell_plugin_show_window_menu (MetaPlugin *plugin, + MetaWindow *window, + MetaWindowMenuType menu, + int x, + int y) +{ + _shell_wm_show_window_menu (get_shell_wm (), window, menu, x, y); +} + +static void +gnome_shell_plugin_show_window_menu_for_rect (MetaPlugin *plugin, + MetaWindow *window, + MetaWindowMenuType menu, + MetaRectangle *rect) +{ + _shell_wm_show_window_menu_for_rect (get_shell_wm (), window, menu, rect); +} + +static gboolean +gnome_shell_plugin_xevent_filter (MetaPlugin *plugin, + XEvent *xev) +{ +#ifdef GLX_INTEL_swap_event + GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); + + if (shell_plugin->have_swap_event && + xev->type == (shell_plugin->glx_event_base + GLX_BufferSwapComplete)) + { + GLXBufferSwapComplete *swap_complete_event; + swap_complete_event = (GLXBufferSwapComplete *)xev; + + /* Buggy early versions of the INTEL_swap_event implementation in Mesa + * can send this with a ust of 0. Simplify life for consumers + * by ignoring such events */ + if (swap_complete_event->ust != 0) + { + gboolean frame_timestamps; + g_object_get (shell_plugin->global, + "frame-timestamps", &frame_timestamps, + NULL); + + if (frame_timestamps) + shell_perf_log_event_x (shell_perf_log_get_default (), + "glx.swapComplete", + swap_complete_event->ust); + } + } +#endif + + return FALSE; +} + +static gboolean +gnome_shell_plugin_keybinding_filter (MetaPlugin *plugin, + MetaKeyBinding *binding) +{ + return _shell_wm_filter_keybinding (get_shell_wm (), binding); +} + +static void +gnome_shell_plugin_confirm_display_change (MetaPlugin *plugin) +{ + _shell_wm_confirm_display_change (get_shell_wm ()); +} + +static const MetaPluginInfo * +gnome_shell_plugin_plugin_info (MetaPlugin *plugin) +{ + static const MetaPluginInfo info = { + .name = "GNOME Shell", + .version = "0.1", + .author = "Various", + .license = "GPLv2+", + .description = "Provides GNOME Shell core functionality" + }; + + return &info; +} + +static MetaCloseDialog * +gnome_shell_plugin_create_close_dialog (MetaPlugin *plugin, + MetaWindow *window) +{ + return _shell_wm_create_close_dialog (get_shell_wm (), window); +} + +static MetaInhibitShortcutsDialog * +gnome_shell_plugin_create_inhibit_shortcuts_dialog (MetaPlugin *plugin, + MetaWindow *window) +{ + return _shell_wm_create_inhibit_shortcuts_dialog (get_shell_wm (), window); +} + +static void +gnome_shell_plugin_class_init (GnomeShellPluginClass *klass) +{ + MetaPluginClass *plugin_class = META_PLUGIN_CLASS (klass); + + plugin_class->start = gnome_shell_plugin_start; + plugin_class->map = gnome_shell_plugin_map; + plugin_class->minimize = gnome_shell_plugin_minimize; + plugin_class->unminimize = gnome_shell_plugin_unminimize; + plugin_class->size_changed = gnome_shell_plugin_size_changed; + plugin_class->size_change = gnome_shell_plugin_size_change; + plugin_class->destroy = gnome_shell_plugin_destroy; + + plugin_class->switch_workspace = gnome_shell_plugin_switch_workspace; + + plugin_class->kill_window_effects = gnome_shell_plugin_kill_window_effects; + plugin_class->kill_switch_workspace = gnome_shell_plugin_kill_switch_workspace; + + plugin_class->show_tile_preview = gnome_shell_plugin_show_tile_preview; + plugin_class->hide_tile_preview = gnome_shell_plugin_hide_tile_preview; + plugin_class->show_window_menu = gnome_shell_plugin_show_window_menu; + plugin_class->show_window_menu_for_rect = gnome_shell_plugin_show_window_menu_for_rect; + + plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter; + plugin_class->keybinding_filter = gnome_shell_plugin_keybinding_filter; + + plugin_class->confirm_display_change = gnome_shell_plugin_confirm_display_change; + + plugin_class->plugin_info = gnome_shell_plugin_plugin_info; + + plugin_class->create_close_dialog = gnome_shell_plugin_create_close_dialog; + plugin_class->create_inhibit_shortcuts_dialog = gnome_shell_plugin_create_inhibit_shortcuts_dialog; +} + +static void +gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin) +{ +} diff --git a/src/gnome-shell-portal-helper.c b/src/gnome-shell-portal-helper.c new file mode 100644 index 0000000..a0bebb2 --- /dev/null +++ b/src/gnome-shell-portal-helper.c @@ -0,0 +1,52 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include +#include + +int +main (int argc, char *argv[]) +{ + const char *search_path[] = { "resource:///org/gnome/shell", NULL }; + GError *error = NULL; + GjsContext *context; + int status; + + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + context = g_object_new (GJS_TYPE_CONTEXT, + "search-path", search_path, + NULL); + + if (!gjs_context_define_string_array(context, "ARGV", + argc, (const char**)argv, + &error)) + { + g_message("Failed to define ARGV: %s", error->message); + g_error_free (error); + g_object_unref (context); + + return 1; + } + + + if (!gjs_context_eval (context, + "const Main = imports.portalHelper.main; Main.main(ARGV);", + -1, + "
", + &status, + &error)) + { + g_message ("Execution of main.js threw exception: %s", error->message); + g_error_free (error); + g_object_unref (context); + + return status; + } + + g_object_unref (context); + return 0; +} diff --git a/src/gtkactionmuxer.c b/src/gtkactionmuxer.c new file mode 100644 index 0000000..1cdf294 --- /dev/null +++ b/src/gtkactionmuxer.c @@ -0,0 +1,945 @@ +/* + * Copyright © 2011 Canonical Limited + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the licence, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: Ryan Lortie + */ + +#include "config.h" + +#include "gtkactionmuxer.h" + +#include "gtkactionobservable.h" +#include "gtkactionobserver.h" + +#include + +#include + +/** + * SECTION:gtkactionmuxer + * @short_description: Aggregate and monitor several action groups + * + * #GtkActionMuxer is a #GActionGroup and #GtkActionObservable that is + * capable of containing other #GActionGroup instances. + * + * The typical use is aggregating all of the actions applicable to a + * particular context into a single action group, with namespacing. + * + * Consider the case of two action groups -- one containing actions + * applicable to an entire application (such as 'quit') and one + * containing actions applicable to a particular window in the + * application (such as 'fullscreen'). + * + * In this case, each of these action groups could be added to a + * #GtkActionMuxer with the prefixes "app" and "win", respectively. This + * would expose the actions as "app.quit" and "win.fullscreen" on the + * #GActionGroup interface presented by the #GtkActionMuxer. + * + * Activations and state change requests on the #GtkActionMuxer are wired + * through to the underlying action group in the expected way. + * + * This class is typically only used at the site of "consumption" of + * actions (eg: when displaying a menu that contains many actions on + * different objects). + */ + +static void gtk_action_muxer_group_iface_init (GActionGroupInterface *iface); +static void gtk_action_muxer_observable_iface_init (GtkActionObservableInterface *iface); + +typedef GObjectClass GtkActionMuxerClass; + +struct _GtkActionMuxer +{ + GObject parent_instance; + + GHashTable *observed_actions; + GHashTable *groups; + GHashTable *primary_accels; + GtkActionMuxer *parent; +}; + +G_DEFINE_TYPE_WITH_CODE (GtkActionMuxer, gtk_action_muxer, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, gtk_action_muxer_group_iface_init) + G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTION_OBSERVABLE, gtk_action_muxer_observable_iface_init)) + +enum +{ + PROP_0, + PROP_PARENT, + NUM_PROPERTIES +}; + +static GParamSpec *properties[NUM_PROPERTIES]; + +guint accel_signal; + +typedef struct +{ + GtkActionMuxer *muxer; + GSList *watchers; + gchar *fullname; +} Action; + +typedef struct +{ + GtkActionMuxer *muxer; + GActionGroup *group; + gchar *prefix; + gulong handler_ids[4]; +} Group; + +static void +gtk_action_muxer_append_group_actions (gpointer key, + gpointer value, + gpointer user_data) +{ + const gchar *prefix = key; + Group *group = value; + GArray *actions = user_data; + gchar **group_actions; + gchar **action; + + group_actions = g_action_group_list_actions (group->group); + for (action = group_actions; *action; action++) + { + gchar *fullname; + + fullname = g_strconcat (prefix, ".", *action, NULL); + g_array_append_val (actions, fullname); + } + + g_strfreev (group_actions); +} + +static gchar ** +gtk_action_muxer_list_actions (GActionGroup *action_group) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (action_group); + GArray *actions; + + actions = g_array_new (TRUE, FALSE, sizeof (gchar *)); + + for ( ; muxer != NULL; muxer = muxer->parent) + { + g_hash_table_foreach (muxer->groups, + gtk_action_muxer_append_group_actions, + actions); + } + + return (gchar **)(void *) g_array_free (actions, FALSE); +} + +static Group * +gtk_action_muxer_find_group (GtkActionMuxer *muxer, + const gchar *full_name, + const gchar **action_name) +{ + const gchar *dot; + gchar *prefix; + Group *group; + + dot = strchr (full_name, '.'); + + if (!dot) + return NULL; + + prefix = g_strndup (full_name, dot - full_name); + group = g_hash_table_lookup (muxer->groups, prefix); + g_free (prefix); + + if (action_name) + *action_name = dot + 1; + + return group; +} + +static void +gtk_action_muxer_action_enabled_changed (GtkActionMuxer *muxer, + const gchar *action_name, + gboolean enabled) +{ + Action *action; + GSList *node; + + action = g_hash_table_lookup (muxer->observed_actions, action_name); + for (node = action ? action->watchers : NULL; node; node = node->next) + gtk_action_observer_action_enabled_changed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name, enabled); + g_action_group_action_enabled_changed (G_ACTION_GROUP (muxer), action_name, enabled); +} + +static void +gtk_action_muxer_group_action_enabled_changed (GActionGroup *action_group, + const gchar *action_name, + gboolean enabled, + gpointer user_data) +{ + Group *group = user_data; + gchar *fullname; + + fullname = g_strconcat (group->prefix, ".", action_name, NULL); + gtk_action_muxer_action_enabled_changed (group->muxer, fullname, enabled); + + g_free (fullname); +} + +static void +gtk_action_muxer_parent_action_enabled_changed (GActionGroup *action_group, + const gchar *action_name, + gboolean enabled, + gpointer user_data) +{ + GtkActionMuxer *muxer = user_data; + + gtk_action_muxer_action_enabled_changed (muxer, action_name, enabled); +} + +static void +gtk_action_muxer_action_state_changed (GtkActionMuxer *muxer, + const gchar *action_name, + GVariant *state) +{ + Action *action; + GSList *node; + + action = g_hash_table_lookup (muxer->observed_actions, action_name); + for (node = action ? action->watchers : NULL; node; node = node->next) + gtk_action_observer_action_state_changed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name, state); + g_action_group_action_state_changed (G_ACTION_GROUP (muxer), action_name, state); +} + +static void +gtk_action_muxer_group_action_state_changed (GActionGroup *action_group, + const gchar *action_name, + GVariant *state, + gpointer user_data) +{ + Group *group = user_data; + gchar *fullname; + + fullname = g_strconcat (group->prefix, ".", action_name, NULL); + gtk_action_muxer_action_state_changed (group->muxer, fullname, state); + + g_free (fullname); +} + +static void +gtk_action_muxer_parent_action_state_changed (GActionGroup *action_group, + const gchar *action_name, + GVariant *state, + gpointer user_data) +{ + GtkActionMuxer *muxer = user_data; + + gtk_action_muxer_action_state_changed (muxer, action_name, state); +} + +static void +gtk_action_muxer_action_added (GtkActionMuxer *muxer, + const gchar *action_name, + GActionGroup *original_group, + const gchar *orignal_action_name) +{ + const GVariantType *parameter_type; + gboolean enabled; + GVariant *state; + Action *action; + + action = g_hash_table_lookup (muxer->observed_actions, action_name); + + if (action && action->watchers && + g_action_group_query_action (original_group, orignal_action_name, + &enabled, ¶meter_type, NULL, NULL, &state)) + { + GSList *node; + + for (node = action->watchers; node; node = node->next) + gtk_action_observer_action_added (node->data, + GTK_ACTION_OBSERVABLE (muxer), + action_name, parameter_type, enabled, state); + + if (state) + g_variant_unref (state); + } + + g_action_group_action_added (G_ACTION_GROUP (muxer), action_name); +} + +static void +gtk_action_muxer_action_added_to_group (GActionGroup *action_group, + const gchar *action_name, + gpointer user_data) +{ + Group *group = user_data; + gchar *fullname; + + fullname = g_strconcat (group->prefix, ".", action_name, NULL); + gtk_action_muxer_action_added (group->muxer, fullname, action_group, action_name); + + g_free (fullname); +} + +static void +gtk_action_muxer_action_added_to_parent (GActionGroup *action_group, + const gchar *action_name, + gpointer user_data) +{ + GtkActionMuxer *muxer = user_data; + + gtk_action_muxer_action_added (muxer, action_name, action_group, action_name); +} + +static void +gtk_action_muxer_action_removed (GtkActionMuxer *muxer, + const gchar *action_name) +{ + Action *action; + GSList *node; + + action = g_hash_table_lookup (muxer->observed_actions, action_name); + for (node = action ? action->watchers : NULL; node; node = node->next) + gtk_action_observer_action_removed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name); + g_action_group_action_removed (G_ACTION_GROUP (muxer), action_name); +} + +static void +gtk_action_muxer_action_removed_from_group (GActionGroup *action_group, + const gchar *action_name, + gpointer user_data) +{ + Group *group = user_data; + gchar *fullname; + + fullname = g_strconcat (group->prefix, ".", action_name, NULL); + gtk_action_muxer_action_removed (group->muxer, fullname); + + g_free (fullname); +} + +static void +gtk_action_muxer_action_removed_from_parent (GActionGroup *action_group, + const gchar *action_name, + gpointer user_data) +{ + GtkActionMuxer *muxer = user_data; + + gtk_action_muxer_action_removed (muxer, action_name); +} + +static void +gtk_action_muxer_primary_accel_changed (GtkActionMuxer *muxer, + const gchar *action_name, + const gchar *action_and_target) +{ + Action *action; + GSList *node; + + if (!action_name) + action_name = strrchr (action_and_target, '|') + 1; + + action = g_hash_table_lookup (muxer->observed_actions, action_name); + for (node = action ? action->watchers : NULL; node; node = node->next) + gtk_action_observer_primary_accel_changed (node->data, GTK_ACTION_OBSERVABLE (muxer), + action_name, action_and_target); + g_signal_emit (muxer, accel_signal, 0, action_name, action_and_target); +} + +static void +gtk_action_muxer_parent_primary_accel_changed (GtkActionMuxer *parent, + const gchar *action_name, + const gchar *action_and_target, + gpointer user_data) +{ + GtkActionMuxer *muxer = user_data; + + /* If it's in our table then don't let the parent one filter through */ + if (muxer->primary_accels && g_hash_table_lookup (muxer->primary_accels, action_and_target)) + return; + + gtk_action_muxer_primary_accel_changed (muxer, action_name, action_and_target); +} + +static gboolean +gtk_action_muxer_query_action (GActionGroup *action_group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (action_group); + Group *group; + const gchar *unprefixed_name; + + group = gtk_action_muxer_find_group (muxer, action_name, &unprefixed_name); + + if (group) + return g_action_group_query_action (group->group, unprefixed_name, enabled, + parameter_type, state_type, state_hint, state); + + if (muxer->parent) + return g_action_group_query_action (G_ACTION_GROUP (muxer->parent), action_name, + enabled, parameter_type, + state_type, state_hint, state); + + return FALSE; +} + +static GVariant * +get_platform_data (void) +{ + gchar time[32]; + GVariantBuilder *builder; + GVariant *result; + + g_snprintf (time, 32, "_TIME%d", clutter_get_current_event_time ()); + + builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); + + g_variant_builder_add (builder, "{sv}", "desktop-startup-id", + g_variant_new_string (time)); + + result = g_variant_builder_end (builder); + g_variant_builder_unref (builder); + + return result; +} + +static void +gtk_action_muxer_activate_action (GActionGroup *action_group, + const gchar *action_name, + GVariant *parameter) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (action_group); + Group *group; + const gchar *unprefixed_name; + + group = gtk_action_muxer_find_group (muxer, action_name, &unprefixed_name); + + if (group) + { + if (G_IS_REMOTE_ACTION_GROUP (group->group)) + g_remote_action_group_activate_action_full (G_REMOTE_ACTION_GROUP (group->group), + unprefixed_name, parameter, + get_platform_data ()); + else + g_action_group_activate_action (group->group, unprefixed_name, parameter); + } + else if (muxer->parent) + g_action_group_activate_action (G_ACTION_GROUP (muxer->parent), action_name, parameter); +} + +static void +gtk_action_muxer_change_action_state (GActionGroup *action_group, + const gchar *action_name, + GVariant *state) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (action_group); + Group *group; + const gchar *unprefixed_name; + + group = gtk_action_muxer_find_group (muxer, action_name, &unprefixed_name); + + if (group) + { + if (G_IS_REMOTE_ACTION_GROUP (group->group)) + g_remote_action_group_change_action_state_full (G_REMOTE_ACTION_GROUP (group->group), + unprefixed_name, + state, + get_platform_data ()); + else + g_action_group_change_action_state (group->group, unprefixed_name, state); + } + else if (muxer->parent) + g_action_group_change_action_state (G_ACTION_GROUP (muxer->parent), action_name, state); +} + +static void +gtk_action_muxer_unregister_internal (Action *action, + gpointer observer) +{ + GtkActionMuxer *muxer = action->muxer; + GSList **ptr; + + for (ptr = &action->watchers; *ptr; ptr = &(*ptr)->next) + if ((*ptr)->data == observer) + { + *ptr = g_slist_remove (*ptr, observer); + + if (action->watchers == NULL) + g_hash_table_remove (muxer->observed_actions, action->fullname); + + break; + } +} + +static void +gtk_action_muxer_weak_notify (gpointer data, + GObject *where_the_object_was) +{ + Action *action = data; + + gtk_action_muxer_unregister_internal (action, where_the_object_was); +} + +static void +gtk_action_muxer_register_observer (GtkActionObservable *observable, + const gchar *name, + GtkActionObserver *observer) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (observable); + Action *action; + + action = g_hash_table_lookup (muxer->observed_actions, name); + + if (action == NULL) + { + action = g_slice_new (Action); + action->muxer = muxer; + action->fullname = g_strdup (name); + action->watchers = NULL; + + g_hash_table_insert (muxer->observed_actions, action->fullname, action); + } + + action->watchers = g_slist_prepend (action->watchers, observer); + g_object_weak_ref (G_OBJECT (observer), gtk_action_muxer_weak_notify, action); +} + +static void +gtk_action_muxer_unregister_observer (GtkActionObservable *observable, + const gchar *name, + GtkActionObserver *observer) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (observable); + Action *action; + + action = g_hash_table_lookup (muxer->observed_actions, name); + g_object_weak_unref (G_OBJECT (observer), gtk_action_muxer_weak_notify, action); + gtk_action_muxer_unregister_internal (action, observer); +} + +static void +gtk_action_muxer_free_group (gpointer data) +{ + Group *group = data; + gint i; + + /* 'for loop' or 'four loop'? */ + for (i = 0; i < 4; i++) + g_signal_handler_disconnect (group->group, group->handler_ids[i]); + + g_object_unref (group->group); + g_free (group->prefix); + + g_slice_free (Group, group); +} + +static void +gtk_action_muxer_free_action (gpointer data) +{ + Action *action = data; + GSList *it; + + for (it = action->watchers; it; it = it->next) + g_object_weak_unref (G_OBJECT (it->data), gtk_action_muxer_weak_notify, action); + + g_slist_free (action->watchers); + g_free (action->fullname); + + g_slice_free (Action, action); +} + +static void +gtk_action_muxer_finalize (GObject *object) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (object); + + g_assert_cmpint (g_hash_table_size (muxer->observed_actions), ==, 0); + g_hash_table_unref (muxer->observed_actions); + g_hash_table_unref (muxer->groups); + + G_OBJECT_CLASS (gtk_action_muxer_parent_class) + ->finalize (object); +} + +static void +gtk_action_muxer_dispose (GObject *object) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (object); + + if (muxer->parent) + { + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_added_to_parent, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_removed_from_parent, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_enabled_changed, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_state_changed, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_primary_accel_changed, muxer); + + g_clear_object (&muxer->parent); + } + + g_hash_table_remove_all (muxer->observed_actions); + + G_OBJECT_CLASS (gtk_action_muxer_parent_class) + ->dispose (object); +} + +static void +gtk_action_muxer_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (object); + + switch (property_id) + { + case PROP_PARENT: + g_value_set_object (value, gtk_action_muxer_get_parent (muxer)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +gtk_action_muxer_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkActionMuxer *muxer = GTK_ACTION_MUXER (object); + + switch (property_id) + { + case PROP_PARENT: + gtk_action_muxer_set_parent (muxer, g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +gtk_action_muxer_init (GtkActionMuxer *muxer) +{ + muxer->observed_actions = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, gtk_action_muxer_free_action); + muxer->groups = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, gtk_action_muxer_free_group); +} + +static void +gtk_action_muxer_observable_iface_init (GtkActionObservableInterface *iface) +{ + iface->register_observer = gtk_action_muxer_register_observer; + iface->unregister_observer = gtk_action_muxer_unregister_observer; +} + +static void +gtk_action_muxer_group_iface_init (GActionGroupInterface *iface) +{ + iface->list_actions = gtk_action_muxer_list_actions; + iface->query_action = gtk_action_muxer_query_action; + iface->activate_action = gtk_action_muxer_activate_action; + iface->change_action_state = gtk_action_muxer_change_action_state; +} + +static void +gtk_action_muxer_class_init (GObjectClass *class) +{ + class->get_property = gtk_action_muxer_get_property; + class->set_property = gtk_action_muxer_set_property; + class->finalize = gtk_action_muxer_finalize; + class->dispose = gtk_action_muxer_dispose; + + accel_signal = g_signal_new ("primary-accel-changed", GTK_TYPE_ACTION_MUXER, G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); + + properties[PROP_PARENT] = g_param_spec_object ("parent", "Parent", + "The parent muxer", + GTK_TYPE_ACTION_MUXER, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (class, NUM_PROPERTIES, properties); +} + +/** + * gtk_action_muxer_insert: + * @muxer: a #GtkActionMuxer + * @prefix: the prefix string for the action group + * @action_group: a #GActionGroup + * + * Adds the actions in @action_group to the list of actions provided by + * @muxer. @prefix is prefixed to each action name, such that for each + * action x in @action_group, there is an equivalent + * action @prefix.x in @muxer. + * + * For example, if @prefix is "app" and @action_group + * contains an action called "quit", then @muxer will + * now contain an action called "app.quit". + * + * If any #GtkActionObservers are registered for actions in the group, + * "action_added" notifications will be emitted, as appropriate. + * + * @prefix must not contain a dot ('.'). + */ +void +gtk_action_muxer_insert (GtkActionMuxer *muxer, + const gchar *prefix, + GActionGroup *action_group) +{ + gchar **actions; + Group *group; + gint i; + + /* TODO: diff instead of ripout and replace */ + gtk_action_muxer_remove (muxer, prefix); + + group = g_slice_new (Group); + group->muxer = muxer; + group->group = g_object_ref (action_group); + group->prefix = g_strdup (prefix); + + g_hash_table_insert (muxer->groups, group->prefix, group); + + actions = g_action_group_list_actions (group->group); + for (i = 0; actions[i]; i++) + gtk_action_muxer_action_added_to_group (group->group, actions[i], group); + g_strfreev (actions); + + group->handler_ids[0] = g_signal_connect (group->group, "action-added", + G_CALLBACK (gtk_action_muxer_action_added_to_group), group); + group->handler_ids[1] = g_signal_connect (group->group, "action-removed", + G_CALLBACK (gtk_action_muxer_action_removed_from_group), group); + group->handler_ids[2] = g_signal_connect (group->group, "action-enabled-changed", + G_CALLBACK (gtk_action_muxer_group_action_enabled_changed), group); + group->handler_ids[3] = g_signal_connect (group->group, "action-state-changed", + G_CALLBACK (gtk_action_muxer_group_action_state_changed), group); +} + +/** + * gtk_action_muxer_remove: + * @muxer: a #GtkActionMuxer + * @prefix: the prefix of the action group to remove + * + * Removes a #GActionGroup from the #GtkActionMuxer. + * + * If any #GtkActionObservers are registered for actions in the group, + * "action_removed" notifications will be emitted, as appropriate. + */ +void +gtk_action_muxer_remove (GtkActionMuxer *muxer, + const gchar *prefix) +{ + Group *group; + + group = g_hash_table_lookup (muxer->groups, prefix); + + if (group != NULL) + { + gchar **actions; + gint i; + + g_hash_table_steal (muxer->groups, prefix); + + actions = g_action_group_list_actions (group->group); + for (i = 0; actions[i]; i++) + gtk_action_muxer_action_removed_from_group (group->group, actions[i], group); + g_strfreev (actions); + + gtk_action_muxer_free_group (group); + } +} + +/** + * gtk_action_muxer_new: + * + * Creates a new #GtkActionMuxer. + */ +GtkActionMuxer * +gtk_action_muxer_new (void) +{ + return g_object_new (GTK_TYPE_ACTION_MUXER, NULL); +} + +/** + * gtk_action_muxer_get_parent: + * @muxer: a #GtkActionMuxer + * + * Returns: (transfer none): the parent of @muxer, or NULL. + */ +GtkActionMuxer * +gtk_action_muxer_get_parent (GtkActionMuxer *muxer) +{ + g_return_val_if_fail (GTK_IS_ACTION_MUXER (muxer), NULL); + + return muxer->parent; +} + +static void +emit_changed_accels (GtkActionMuxer *muxer, + GtkActionMuxer *parent) +{ + while (parent) + { + if (parent->primary_accels) + { + GHashTableIter iter; + gpointer key; + + g_hash_table_iter_init (&iter, parent->primary_accels); + while (g_hash_table_iter_next (&iter, &key, NULL)) + gtk_action_muxer_primary_accel_changed (muxer, NULL, key); + } + + parent = parent->parent; + } +} + +/** + * gtk_action_muxer_set_parent: + * @muxer: a #GtkActionMuxer + * @parent: (nullable): the new parent #GtkActionMuxer + * + * Sets the parent of @muxer to @parent. + */ +void +gtk_action_muxer_set_parent (GtkActionMuxer *muxer, + GtkActionMuxer *parent) +{ + g_return_if_fail (GTK_IS_ACTION_MUXER (muxer)); + g_return_if_fail (parent == NULL || GTK_IS_ACTION_MUXER (parent)); + + if (muxer->parent == parent) + return; + + if (muxer->parent != NULL) + { + gchar **actions; + gchar **it; + + actions = g_action_group_list_actions (G_ACTION_GROUP (muxer->parent)); + for (it = actions; *it; it++) + gtk_action_muxer_action_removed (muxer, *it); + g_strfreev (actions); + + emit_changed_accels (muxer, muxer->parent); + + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_added_to_parent, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_removed_from_parent, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_enabled_changed, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_state_changed, muxer); + g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_primary_accel_changed, muxer); + + g_object_unref (muxer->parent); + } + + muxer->parent = parent; + + if (muxer->parent != NULL) + { + gchar **actions; + gchar **it; + + g_object_ref (muxer->parent); + + actions = g_action_group_list_actions (G_ACTION_GROUP (muxer->parent)); + for (it = actions; *it; it++) + gtk_action_muxer_action_added (muxer, *it, G_ACTION_GROUP (muxer->parent), *it); + g_strfreev (actions); + + emit_changed_accels (muxer, muxer->parent); + + g_signal_connect (muxer->parent, "action-added", + G_CALLBACK (gtk_action_muxer_action_added_to_parent), muxer); + g_signal_connect (muxer->parent, "action-removed", + G_CALLBACK (gtk_action_muxer_action_removed_from_parent), muxer); + g_signal_connect (muxer->parent, "action-enabled-changed", + G_CALLBACK (gtk_action_muxer_parent_action_enabled_changed), muxer); + g_signal_connect (muxer->parent, "action-state-changed", + G_CALLBACK (gtk_action_muxer_parent_action_state_changed), muxer); + g_signal_connect (muxer->parent, "primary-accel-changed", + G_CALLBACK (gtk_action_muxer_parent_primary_accel_changed), muxer); + } + + g_object_notify_by_pspec (G_OBJECT (muxer), properties[PROP_PARENT]); +} + +void +gtk_action_muxer_set_primary_accel (GtkActionMuxer *muxer, + const gchar *action_and_target, + const gchar *primary_accel) +{ + if (!muxer->primary_accels) + muxer->primary_accels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + if (primary_accel) + g_hash_table_insert (muxer->primary_accels, g_strdup (action_and_target), g_strdup (primary_accel)); + else + g_hash_table_remove (muxer->primary_accels, action_and_target); + + gtk_action_muxer_primary_accel_changed (muxer, NULL, action_and_target); +} + +const gchar * +gtk_action_muxer_get_primary_accel (GtkActionMuxer *muxer, + const gchar *action_and_target) +{ + if (muxer->primary_accels) + { + const gchar *primary_accel; + + primary_accel = g_hash_table_lookup (muxer->primary_accels, action_and_target); + + if (primary_accel) + return primary_accel; + } + + if (!muxer->parent) + return NULL; + + return gtk_action_muxer_get_primary_accel (muxer->parent, action_and_target); +} + +gchar * +gtk_print_action_and_target (const gchar *action_namespace, + const gchar *action_name, + GVariant *target) +{ + GString *result; + + g_return_val_if_fail (strchr (action_name, '|') == NULL, NULL); + g_return_val_if_fail (action_namespace == NULL || strchr (action_namespace, '|') == NULL, NULL); + + result = g_string_new (NULL); + + if (target) + g_variant_print_string (target, result, TRUE); + g_string_append_c (result, '|'); + + if (action_namespace) + { + g_string_append (result, action_namespace); + g_string_append_c (result, '.'); + } + + g_string_append (result, action_name); + + return g_string_free (result, FALSE); +} diff --git a/src/gtkactionmuxer.h b/src/gtkactionmuxer.h new file mode 100644 index 0000000..d71abf4 --- /dev/null +++ b/src/gtkactionmuxer.h @@ -0,0 +1,64 @@ +/* + * Copyright © 2011 Canonical Limited + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the licence, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: Ryan Lortie + */ + +#ifndef __GTK_ACTION_MUXER_H__ +#define __GTK_ACTION_MUXER_H__ + +#include + +G_BEGIN_DECLS + +#define GTK_TYPE_ACTION_MUXER (gtk_action_muxer_get_type ()) +#define GTK_ACTION_MUXER(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + GTK_TYPE_ACTION_MUXER, GtkActionMuxer)) +#define GTK_IS_ACTION_MUXER(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + GTK_TYPE_ACTION_MUXER)) + +typedef struct _GtkActionMuxer GtkActionMuxer; + +GType gtk_action_muxer_get_type (void); +GtkActionMuxer * gtk_action_muxer_new (void); + +void gtk_action_muxer_insert (GtkActionMuxer *muxer, + const gchar *prefix, + GActionGroup *action_group); + +void gtk_action_muxer_remove (GtkActionMuxer *muxer, + const gchar *prefix); + +GtkActionMuxer * gtk_action_muxer_get_parent (GtkActionMuxer *muxer); + +void gtk_action_muxer_set_parent (GtkActionMuxer *muxer, + GtkActionMuxer *parent); + +void gtk_action_muxer_set_primary_accel (GtkActionMuxer *muxer, + const gchar *action_and_target, + const gchar *primary_accel); + +const gchar * gtk_action_muxer_get_primary_accel (GtkActionMuxer *muxer, + const gchar *action_and_target); + +/* No better place for this... */ +gchar * gtk_print_action_and_target (const gchar *action_namespace, + const gchar *action_name, + GVariant *target); + +G_END_DECLS + +#endif /* __GTK_ACTION_MUXER_H__ */ diff --git a/src/gtkactionobservable.c b/src/gtkactionobservable.c new file mode 100644 index 0000000..ab90df2 --- /dev/null +++ b/src/gtkactionobservable.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2011 Canonical Limited + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 of the + * licence or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Ryan Lortie + */ + +#include "config.h" + +#include "gtkactionobservable.h" + +G_DEFINE_INTERFACE (GtkActionObservable, gtk_action_observable, G_TYPE_OBJECT) + +/* + * SECTION:gtkactionobserable + * @short_description: an interface implemented by objects that report + * changes to actions + */ + +void +gtk_action_observable_default_init (GtkActionObservableInterface *iface) +{ +} + +/** + * gtk_action_observable_register_observer: + * @observable: a #GtkActionObservable + * @action_name: the name of the action + * @observer: the #GtkActionObserver to which the events will be reported + * + * Registers @observer as being interested in changes to @action_name on + * @observable. + */ +void +gtk_action_observable_register_observer (GtkActionObservable *observable, + const gchar *action_name, + GtkActionObserver *observer) +{ + g_return_if_fail (GTK_IS_ACTION_OBSERVABLE (observable)); + + GTK_ACTION_OBSERVABLE_GET_IFACE (observable) + ->register_observer (observable, action_name, observer); +} + +/** + * gtk_action_observable_unregister_observer: + * @observable: a #GtkActionObservable + * @action_name: the name of the action + * @observer: the #GtkActionObserver to which the events will be reported + * + * Removes the registration of @observer as being interested in changes + * to @action_name on @observable. + * + * If the observer was registered multiple times, it must be + * unregistered an equal number of times. + */ +void +gtk_action_observable_unregister_observer (GtkActionObservable *observable, + const gchar *action_name, + GtkActionObserver *observer) +{ + g_return_if_fail (GTK_IS_ACTION_OBSERVABLE (observable)); + + GTK_ACTION_OBSERVABLE_GET_IFACE (observable) + ->unregister_observer (observable, action_name, observer); +} diff --git a/src/gtkactionobservable.h b/src/gtkactionobservable.h new file mode 100644 index 0000000..aa1514b --- /dev/null +++ b/src/gtkactionobservable.h @@ -0,0 +1,60 @@ +/* + * Copyright © 2011 Canonical Limited + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 of the + * licence or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Ryan Lortie + */ + +#ifndef __GTK_ACTION_OBSERVABLE_H__ +#define __GTK_ACTION_OBSERVABLE_H__ + +#include "gtkactionobserver.h" + +G_BEGIN_DECLS + +#define GTK_TYPE_ACTION_OBSERVABLE (gtk_action_observable_get_type ()) +#define GTK_ACTION_OBSERVABLE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + GTK_TYPE_ACTION_OBSERVABLE, GtkActionObservable)) +#define GTK_IS_ACTION_OBSERVABLE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + GTK_TYPE_ACTION_OBSERVABLE)) +#define GTK_ACTION_OBSERVABLE_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), \ + GTK_TYPE_ACTION_OBSERVABLE, \ + GtkActionObservableInterface)) + +typedef struct _GtkActionObservableInterface GtkActionObservableInterface; + +struct _GtkActionObservableInterface +{ + GTypeInterface g_iface; + + void (* register_observer) (GtkActionObservable *observable, + const gchar *action_name, + GtkActionObserver *observer); + void (* unregister_observer) (GtkActionObservable *observable, + const gchar *action_name, + GtkActionObserver *observer); +}; + +GType gtk_action_observable_get_type (void); +void gtk_action_observable_register_observer (GtkActionObservable *observable, + const gchar *action_name, + GtkActionObserver *observer); +void gtk_action_observable_unregister_observer (GtkActionObservable *observable, + const gchar *action_name, + GtkActionObserver *observer); + +G_END_DECLS + +#endif /* __GTK_ACTION_OBSERVABLE_H__ */ diff --git a/src/gtkactionobserver.c b/src/gtkactionobserver.c new file mode 100644 index 0000000..3287106 --- /dev/null +++ b/src/gtkactionobserver.c @@ -0,0 +1,189 @@ +/* + * Copyright © 2011 Canonical Limited + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 of the + * licence or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Ryan Lortie + */ + +#include "config.h" + +#include "gtkactionobserver.h" + +G_DEFINE_INTERFACE (GtkActionObserver, gtk_action_observer, G_TYPE_OBJECT) + +/** + * SECTION:gtkactionobserver + * @short_description: an interface implemented by objects that are + * interested in monitoring actions for changes + * + * GtkActionObserver is a simple interface allowing objects that wish to + * be notified of changes to actions to be notified of those changes. + * + * It is also possible to monitor changes to action groups using + * #GObject signals, but there are a number of reasons that this + * approach could become problematic: + * + * - there are four separate signals that must be manually connected + * and disconnected + * + * - when a large number of different observers wish to monitor a + * (usually disjoint) set of actions within the same action group, + * there is only one way to avoid having all notifications delivered + * to all observers: signal detail. In order to use signal detail, + * each action name must be quarked, which is not always practical. + * + * - even if quarking is acceptable, #GObject signal details are + * implemented by scanning a linked list, so there is no real + * decrease in complexity + */ + +void +gtk_action_observer_default_init (GtkActionObserverInterface *class) +{ +} + +/** + * gtk_action_observer_action_added: + * @observer: a #GtkActionObserver + * @observable: the source of the event + * @action_name: the name of the action + * @enabled: %TRUE if the action is now enabled + * @parameter_type: the parameter type for action invocations, or %NULL + * if no parameter is required + * @state: the current state of the action, or %NULL if the action is + * stateless + * + * This function is called when an action that the observer is + * registered to receive events for is added. + * + * This function should only be called by objects with which the + * observer has explicitly registered itself to receive events. + */ +void +gtk_action_observer_action_added (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + const GVariantType *parameter_type, + gboolean enabled, + GVariant *state) +{ + g_return_if_fail (GTK_IS_ACTION_OBSERVER (observer)); + + GTK_ACTION_OBSERVER_GET_IFACE (observer) + ->action_added (observer, observable, action_name, parameter_type, enabled, state); +} + +/** + * gtk_action_observer_action_enabled_changed: + * @observer: a #GtkActionObserver + * @observable: the source of the event + * @action_name: the name of the action + * @enabled: %TRUE if the action is now enabled + * + * This function is called when an action that the observer is + * registered to receive events for becomes enabled or disabled. + * + * This function should only be called by objects with which the + * observer has explicitly registered itself to receive events. + */ +void +gtk_action_observer_action_enabled_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + gboolean enabled) +{ + g_return_if_fail (GTK_IS_ACTION_OBSERVER (observer)); + + GTK_ACTION_OBSERVER_GET_IFACE (observer) + ->action_enabled_changed (observer, observable, action_name, enabled); +} + +/** + * gtk_action_observer_action_state_changed: + * @observer: a #GtkActionObserver + * @observable: the source of the event + * @action_name: the name of the action + * @state: the new state of the action + * + * This function is called when an action that the observer is + * registered to receive events for changes to its state. + * + * This function should only be called by objects with which the + * observer has explicitly registered itself to receive events. + */ +void +gtk_action_observer_action_state_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + GVariant *state) +{ + g_return_if_fail (GTK_IS_ACTION_OBSERVER (observer)); + + GTK_ACTION_OBSERVER_GET_IFACE (observer) + ->action_state_changed (observer, observable, action_name, state); +} + +/** + * gtk_action_observer_action_removed: + * @observer: a #GtkActionObserver + * @observable: the source of the event + * @action_name: the name of the action + * + * This function is called when an action that the observer is + * registered to receive events for is removed. + * + * This function should only be called by objects with which the + * observer has explicitly registered itself to receive events. + */ +void +gtk_action_observer_action_removed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name) +{ + g_return_if_fail (GTK_IS_ACTION_OBSERVER (observer)); + + GTK_ACTION_OBSERVER_GET_IFACE (observer) + ->action_removed (observer, observable, action_name); +} + +/** + * gtk_action_observer_primary_accel_changed: + * @observer: a #GtkActionObserver + * @observable: the source of the event + * @action_name: the name of the action + * @action_and_target: detailed action of the changed accel, in "action and target" format + * + * This function is called when an action that the observer is + * registered to receive events for has one of its accelerators changed. + * + * Accelerator changes are reported for all targets associated with the + * action. The @action_and_target string should be used to check if the + * reported target is the one that the observer is interested in. + */ +void +gtk_action_observer_primary_accel_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + const gchar *action_and_target) +{ + GtkActionObserverInterface *iface; + + g_return_if_fail (GTK_IS_ACTION_OBSERVER (observer)); + + iface = GTK_ACTION_OBSERVER_GET_IFACE (observer); + + if (iface->primary_accel_changed) + iface->primary_accel_changed (observer, observable, action_name, action_and_target); +} diff --git a/src/gtkactionobserver.h b/src/gtkactionobserver.h new file mode 100644 index 0000000..a4e9659 --- /dev/null +++ b/src/gtkactionobserver.h @@ -0,0 +1,91 @@ +/* + * Copyright © 2011 Canonical Limited + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 of the + * licence or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Ryan Lortie + */ + +#ifndef __GTK_ACTION_OBSERVER_H__ +#define __GTK_ACTION_OBSERVER_H__ + +#include + +G_BEGIN_DECLS + +#define GTK_TYPE_ACTION_OBSERVER (gtk_action_observer_get_type ()) +#define GTK_ACTION_OBSERVER(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + GTK_TYPE_ACTION_OBSERVER, GtkActionObserver)) +#define GTK_IS_ACTION_OBSERVER(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + GTK_TYPE_ACTION_OBSERVER)) +#define GTK_ACTION_OBSERVER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), \ + GTK_TYPE_ACTION_OBSERVER, GtkActionObserverInterface)) + +typedef struct _GtkActionObserverInterface GtkActionObserverInterface; +typedef struct _GtkActionObservable GtkActionObservable; +typedef struct _GtkActionObserver GtkActionObserver; + +struct _GtkActionObserverInterface +{ + GTypeInterface g_iface; + + void (* action_added) (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + const GVariantType *parameter_type, + gboolean enabled, + GVariant *state); + void (* action_enabled_changed) (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + gboolean enabled); + void (* action_state_changed) (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + GVariant *state); + void (* action_removed) (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name); + void (* primary_accel_changed) (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + const gchar *action_and_target); +}; + +GType gtk_action_observer_get_type (void); +void gtk_action_observer_action_added (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + const GVariantType *parameter_type, + gboolean enabled, + GVariant *state); +void gtk_action_observer_action_enabled_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + gboolean enabled); +void gtk_action_observer_action_state_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + GVariant *state); +void gtk_action_observer_action_removed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name); +void gtk_action_observer_primary_accel_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const gchar *action_name, + const gchar *action_and_target); + +G_END_DECLS + +#endif /* __GTK_ACTION_OBSERVER_H__ */ diff --git a/src/hotplug-sniffer/hotplug-mimetypes.h b/src/hotplug-sniffer/hotplug-mimetypes.h new file mode 100644 index 0000000..b034020 --- /dev/null +++ b/src/hotplug-sniffer/hotplug-mimetypes.h @@ -0,0 +1,141 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#ifndef __HOTPLUG_MIMETYPES_H__ +#define __HOTPLUG_MIMETYPES_H__ + +#include + +G_GNUC_UNUSED static const gchar *docs_mimetypes[] = { + "application/vnd.oasis.opendocument.text", + "application/vnd.oasis.opendocument.presentation", + "application/vnd.oasis.opendocument.spreadsheet", + "application/msword", + "application/vnd.ms-excel", + "application/vnd.ms-powerpoint", + "application/rtf", + "application/pdf", + "application/x-bzpdf", + "application/x-gzpdf", + "application/x-xzpdf", + "application/postscript", + "application/x-bzpostscript", + "application/x-gzpostscript", + "image/x-eps", + "image/x-bzeps", + "image/x-gzeps", + "application/x-dvi", + "application/x-bzdvi", + "application/x-gzdvi", + "image/vnd.djvu", + "application/x-cbr", + "application/x-cbz", + "application/x-cb7", + "application/x-cbt", + NULL +}; + +G_GNUC_UNUSED static const gchar *video_mimetypes[] = { + "application/mxf", + "application/ogg", + "application/ram", + "application/sdp", + "application/vnd.ms-wpl", + "application/vnd.rn-realmedia", + "application/x-extension-m4a", + "application/x-extension-mp4", + "application/x-flash-video", + "application/x-matroska", + "application/x-netshow-channel", + "application/x-ogg", + "application/x-quicktimeplayer", + "application/x-shorten", + "image/vnd.rn-realpix", + "image/x-pict", + "misc/ultravox", + "text/x-google-video-pointer", + "video/3gpp", + "video/dv", + "video/fli", + "video/flv", + "video/mp2t", + "video/mp4", + "video/mp4v-es", + "video/mpeg", + "video/msvideo", + "video/ogg", + "video/quicktime", + "video/vivo", + "video/vnd.divx", + "video/vnd.rn-realvideo", + "video/vnd.vivo", + "video/webm", + "video/x-anim", + "video/x-avi", + "video/x-flc", + "video/x-fli", + "video/x-flic", + "video/x-flv", + "video/x-m4v", + "video/x-matroska", + "video/x-mpeg", + "video/x-ms-asf", + "video/x-ms-asx", + "video/x-msvideo", + "video/x-ms-wm", + "video/x-ms-wmv", + "video/x-ms-wmx", + "video/x-ms-wvx", + "video/x-nsv", + "video/x-ogm+ogg", + "video/x-theora+ogg", + "video/x-totem-stream", + NULL +}; + +G_GNUC_UNUSED static const gchar *audio_mimetypes[] = { + "audio/3gpp", + "audio/ac3", + "audio/AMR", + "audio/AMR-WB", + "audio/basic", + "audio/flac", + "audio/midi", + "audio/mp2", + "audio/mp4", + "audio/mpeg", + "audio/ogg", + "audio/prs.sid", + "audio/vnd.rn-realaudio", + "audio/x-aiff", + "audio/x-ape", + "audio/x-flac", + "audio/x-gsm", + "audio/x-it", + "audio/x-m4a", + "audio/x-matroska", + "audio/x-mod", + "audio/x-mp3", + "audio/x-mpeg", + "audio/x-ms-asf", + "audio/x-ms-asx", + "audio/x-ms-wax", + "audio/x-ms-wma", + "audio/x-musepack", + "audio/x-pn-aiff", + "audio/x-pn-au", + "audio/x-pn-wav", + "audio/x-pn-windows-acm", + "audio/x-realaudio", + "audio/x-real-audio", + "audio/x-sbc", + "audio/x-speex", + "audio/x-tta", + "audio/x-wav", + "audio/x-wavpack", + "audio/x-vorbis", + "audio/x-vorbis+ogg", + "audio/x-xm", + NULL +}; + +#endif /* __HOTPLUG_MIMETYPES_H__ */ diff --git a/src/hotplug-sniffer/hotplug-sniffer.c b/src/hotplug-sniffer/hotplug-sniffer.c new file mode 100644 index 0000000..c229af5 --- /dev/null +++ b/src/hotplug-sniffer/hotplug-sniffer.c @@ -0,0 +1,306 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright (C) 2011 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Authors: David Zeuthen + * Cosimo Cecchi + * + */ + +#include "shell-mime-sniffer.h" +#include "hotplug-mimetypes.h" + +/* Set the environment variable HOTPLUG_SNIFFER_DEBUG to show debug */ +static void print_debug (const gchar *str, ...); + +#define BUS_NAME "org.gnome.Shell.HotplugSniffer" +#define AUTOQUIT_TIMEOUT 5 + +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + ""; + +static GDBusNodeInfo *introspection_data = NULL; +static GMainLoop *loop = NULL; +static guint autoquit_id = 0; + +static gboolean +autoquit_timeout_cb (gpointer _unused) +{ + print_debug ("Timeout reached, quitting..."); + + autoquit_id = 0; + g_main_loop_quit (loop); + + return FALSE; +} + +static void +ensure_autoquit_off (void) +{ + if (g_getenv ("HOTPLUG_SNIFFER_PERSIST") != NULL) + return; + + if (autoquit_id != 0) + { + g_source_remove (autoquit_id); + autoquit_id = 0; + } +} + +static void +ensure_autoquit_on (void) +{ + if (g_getenv ("HOTPLUG_SNIFFER_PERSIST") != NULL) + return; + + autoquit_id = + g_timeout_add_seconds (AUTOQUIT_TIMEOUT, + autoquit_timeout_cb, NULL); + g_source_set_name_by_id (autoquit_id, "[gnome-shell] autoquit_timeout_cb"); +} + +typedef struct { + GVariant *parameters; + GDBusMethodInvocation *invocation; +} InvocationData; + +static InvocationData * +invocation_data_new (GVariant *params, + GDBusMethodInvocation *invocation) +{ + InvocationData *ret; + + ret = g_slice_new0 (InvocationData); + ret->parameters = g_variant_ref (params); + ret->invocation = g_object_ref (invocation); + + return ret; +} + +static void +invocation_data_free (InvocationData *data) +{ + g_variant_unref (data->parameters); + g_clear_object (&data->invocation); + + g_slice_free (InvocationData, data); +} + +static void +sniff_async_ready_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + InvocationData *data = user_data; + gchar **types; + GError *error = NULL; + + types = shell_mime_sniffer_sniff_finish (SHELL_MIME_SNIFFER (source), + res, &error); + + if (error != NULL) + { + g_dbus_method_invocation_return_gerror (data->invocation, error); + g_error_free (error); + goto out; + } + + g_dbus_method_invocation_return_value (data->invocation, + g_variant_new ("(^as)", types)); + g_strfreev (types); + + out: + invocation_data_free (data); + ensure_autoquit_on (); +} + +static void +handle_sniff_uri (InvocationData *data) +{ + ShellMimeSniffer *sniffer; + const gchar *uri; + GFile *file; + + ensure_autoquit_off (); + + g_variant_get (data->parameters, + "(&s)", &uri, + NULL); + file = g_file_new_for_uri (uri); + + print_debug ("Initiating sniff for uri %s", uri); + + sniffer = shell_mime_sniffer_new (file); + shell_mime_sniffer_sniff_async (sniffer, + sniff_async_ready_cb, + data); + + g_object_unref (sniffer); + g_object_unref (file); +} + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + InvocationData *data; + + data = invocation_data_new (parameters, invocation); + + if (g_strcmp0 (method_name, "SniffURI") == 0) + handle_sniff_uri (data); + else + g_assert_not_reached (); +} + +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + NULL, /* get_property */ + NULL, /* set_property */ +}; + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GError *error = NULL; + + print_debug ("Connected to the session bus: %s", name); + + g_dbus_connection_register_object (connection, + "/org/gnome/Shell/HotplugSniffer", + introspection_data->interfaces[0], + &interface_vtable, + NULL, + NULL, + &error); + + if (error != NULL) + { + g_printerr ("Error exporting object on the session bus: %s", + error->message); + g_error_free (error); + + _exit(1); + } + + print_debug ("Object exported on the session bus"); +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + print_debug ("Lost bus name: %s, exiting", name); + + g_main_loop_quit (loop); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + print_debug ("Acquired bus name: %s", name); +} + +int +main (int argc, + char **argv) +{ + guint name_owner_id; + + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (introspection_data != NULL); + + ensure_autoquit_on (); + loop = g_main_loop_new (NULL, FALSE); + + name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + BUS_NAME, 0, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + g_main_loop_run (loop); + + if (name_owner_id != 0) + g_bus_unown_name (name_owner_id); + + if (loop != NULL) + g_main_loop_unref (loop); + + return 0; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +print_debug (const gchar *format, ...) +{ + gchar *s; + va_list ap; + gchar timebuf[64]; + GTimeVal now; + time_t now_t; + struct tm broken_down; + static volatile gsize once_init_value = 0; + static gboolean show_debug = FALSE; + static guint pid = 0; + + if (g_once_init_enter (&once_init_value)) + { + show_debug = (g_getenv ("HOTPLUG_SNIFFER_DEBUG") != NULL); + pid = getpid (); + g_once_init_leave (&once_init_value, 1); + } + + if (!show_debug) + goto out; + + g_get_current_time (&now); + now_t = now.tv_sec; + localtime_r (&now_t, &broken_down); + strftime (timebuf, sizeof timebuf, "%H:%M:%S", &broken_down); + + va_start (ap, format); + s = g_strdup_vprintf (format, ap); + va_end (ap); + + g_print ("gnome-shell-hotplug-sniffer[%d]: %s.%03d: %s\n", pid, timebuf, (gint) (now.tv_usec / 1000), s); + g_free (s); + out: + ; +} + diff --git a/src/hotplug-sniffer/meson.build b/src/hotplug-sniffer/meson.build new file mode 100644 index 0000000..4a777e5 --- /dev/null +++ b/src/hotplug-sniffer/meson.build @@ -0,0 +1,22 @@ +hotplug_sources = [ + 'hotplug-mimetypes.h', + 'shell-mime-sniffer.h', + 'shell-mime-sniffer.c', + 'hotplug-sniffer.c' +] + +executable('gnome-shell-hotplug-sniffer', hotplug_sources, + dependencies: [gio_dep, gdk_pixbuf_dep], + include_directories: include_directories('../..'), + install_dir: libexecdir, + install: true +) + +service_file = 'org.gnome.Shell.HotplugSniffer.service' + +configure_file( + input: service_file + '.in', + output: service_file, + configuration: service_data, + install_dir: servicedir +) diff --git a/src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service.in b/src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service.in new file mode 100644 index 0000000..b14cea9 --- /dev/null +++ b/src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.gnome.Shell.HotplugSniffer +Exec=@libexecdir@/gnome-shell-hotplug-sniffer diff --git a/src/hotplug-sniffer/shell-mime-sniffer.c b/src/hotplug-sniffer/shell-mime-sniffer.c new file mode 100644 index 0000000..0792ab7 --- /dev/null +++ b/src/hotplug-sniffer/shell-mime-sniffer.c @@ -0,0 +1,592 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright (C) 1999, 2000, 2001 Eazel, Inc. + * Copyright (C) 2011 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: Cosimo Cecchi + * + * The code for crawling the directory hierarchy is based on + * nautilus/libnautilus-private/nautilus-directory-async.c, with + * the following copyright and author: + * + * Copyright (C) 1999, 2000, 2001 Eazel, Inc. + * Author: Darin Adler + * + */ + +#include "shell-mime-sniffer.h" +#include "hotplug-mimetypes.h" + +#include + +#include + +#define LOADER_ATTRS \ + G_FILE_ATTRIBUTE_STANDARD_TYPE "," \ + G_FILE_ATTRIBUTE_STANDARD_NAME "," \ + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "," + +#define WATCHDOG_TIMEOUT 1500 +#define DIRECTORY_LOAD_ITEMS_PER_CALLBACK 100 +#define HIGH_SCORE_RATIO 0.10 + +enum { + PROP_FILE = 1, + NUM_PROPERTIES +}; + +static GHashTable *image_type_table = NULL; +static GHashTable *audio_type_table = NULL; +static GHashTable *video_type_table = NULL; +static GHashTable *docs_type_table = NULL; + +static GParamSpec *properties[NUM_PROPERTIES] = { NULL, }; + +typedef struct { + ShellMimeSniffer *self; + + GFile *file; + GFileEnumerator *enumerator; + GList *deep_count_subdirectories; + + gint audio_count; + gint image_count; + gint document_count; + gint video_count; + + gint total_items; +} DeepCountState; + +typedef struct _ShellMimeSnifferPrivate ShellMimeSnifferPrivate; + +struct _ShellMimeSniffer +{ + GObject parent_instance; + + ShellMimeSnifferPrivate *priv; +}; + +struct _ShellMimeSnifferPrivate { + GFile *file; + + GCancellable *cancellable; + guint watchdog_id; + + GTask *task; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ShellMimeSniffer, shell_mime_sniffer, G_TYPE_OBJECT); + +static void deep_count_load (DeepCountState *state, + GFile *file); + +static void +init_mimetypes (void) +{ + static gsize once_init = 0; + + if (g_once_init_enter (&once_init)) + { + GSList *formats, *l; + GdkPixbufFormat *format; + gchar **types; + gint idx; + + image_type_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + video_type_table = g_hash_table_new (g_str_hash, g_str_equal); + audio_type_table = g_hash_table_new (g_str_hash, g_str_equal); + docs_type_table = g_hash_table_new (g_str_hash, g_str_equal); + + formats = gdk_pixbuf_get_formats (); + + for (l = formats; l != NULL; l = l->next) + { + format = l->data; + types = gdk_pixbuf_format_get_mime_types (format); + + for (idx = 0; types[idx] != NULL; idx++) + g_hash_table_insert (image_type_table, g_strdup (types[idx]), GINT_TO_POINTER (1)); + + g_strfreev (types); + } + + g_slist_free (formats); + + for (idx = 0; audio_mimetypes[idx] != NULL; idx++) + g_hash_table_insert (audio_type_table, (gpointer) audio_mimetypes[idx], GINT_TO_POINTER (1)); + + for (idx = 0; video_mimetypes[idx] != NULL; idx++) + g_hash_table_insert (video_type_table, (gpointer) video_mimetypes[idx], GINT_TO_POINTER (1)); + + for (idx = 0; docs_mimetypes[idx] != NULL; idx++) + g_hash_table_insert (docs_type_table, (gpointer) docs_mimetypes[idx], GINT_TO_POINTER (1)); + + g_once_init_leave (&once_init, 1); + } +} + +static void +add_content_type_to_cache (DeepCountState *state, + const gchar *content_type) +{ + gboolean matched = TRUE; + + if (g_hash_table_lookup (image_type_table, content_type)) + state->image_count++; + else if (g_hash_table_lookup (video_type_table, content_type)) + state->video_count++; + else if (g_hash_table_lookup (docs_type_table, content_type)) + state->document_count++; + else if (g_hash_table_lookup (audio_type_table, content_type)) + state->audio_count++; + else + matched = FALSE; + + if (matched) + state->total_items++; +} + +typedef struct { + const gchar *type; + gdouble ratio; +} SniffedResult; + +static gint +results_cmp_func (gconstpointer a, + gconstpointer b) +{ + const SniffedResult *sniffed_a = a; + const SniffedResult *sniffed_b = b; + + if (sniffed_a->ratio < sniffed_b->ratio) + return 1; + + if (sniffed_a->ratio > sniffed_b->ratio) + return -1; + + return 0; +} + +static void +prepare_async_result (DeepCountState *state) +{ + ShellMimeSniffer *self = state->self; + GArray *results; + GPtrArray *sniffed_mime; + SniffedResult result; + char **mimes; + + sniffed_mime = g_ptr_array_new (); + results = g_array_new (TRUE, TRUE, sizeof (SniffedResult)); + + if (state->total_items == 0) + goto out; + + result.type = "x-content/video"; + result.ratio = (gdouble) state->video_count / (gdouble) state->total_items; + g_array_append_val (results, result); + + result.type = "x-content/audio"; + result.ratio = (gdouble) state->audio_count / (gdouble) state->total_items; + g_array_append_val (results, result); + + result.type = "x-content/pictures"; + result.ratio = (gdouble) state->image_count / (gdouble) state->total_items; + g_array_append_val (results, result); + + result.type = "x-content/documents"; + result.ratio = (gdouble) state->document_count / (gdouble) state->total_items; + g_array_append_val (results, result); + + g_array_sort (results, results_cmp_func); + + result = g_array_index (results, SniffedResult, 0); + g_ptr_array_add (sniffed_mime, g_strdup (result.type)); + + /* if other types score high in ratio, add them, up to three */ + result = g_array_index (results, SniffedResult, 1); + if (result.ratio < HIGH_SCORE_RATIO) + goto out; + g_ptr_array_add (sniffed_mime, g_strdup (result.type)); + + result = g_array_index (results, SniffedResult, 2); + if (result.ratio < HIGH_SCORE_RATIO) + goto out; + g_ptr_array_add (sniffed_mime, g_strdup (result.type)); + + out: + g_ptr_array_add (sniffed_mime, NULL); + mimes = (gchar **) g_ptr_array_free (sniffed_mime, FALSE); + + g_array_free (results, TRUE); + g_task_return_pointer (self->priv->task, mimes, (GDestroyNotify)g_strfreev); +} + +/* adapted from nautilus/libnautilus-private/nautilus-directory-async.c */ +static void +deep_count_one (DeepCountState *state, + GFileInfo *info) +{ + GFile *subdir; + const char *content_type; + + if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) + { + /* record the fact that we have to descend into this directory */ + subdir = g_file_get_child (state->file, g_file_info_get_name (info)); + state->deep_count_subdirectories = + g_list_append (state->deep_count_subdirectories, subdir); + } + else + { + content_type = g_file_info_get_content_type (info); + add_content_type_to_cache (state, content_type); + } +} + +static void +deep_count_finish (DeepCountState *state) +{ + prepare_async_result (state); + + if (state->enumerator) + { + if (!g_file_enumerator_is_closed (state->enumerator)) + g_file_enumerator_close_async (state->enumerator, + 0, NULL, NULL, NULL); + + g_object_unref (state->enumerator); + } + + g_cancellable_reset (state->self->priv->cancellable); + g_clear_object (&state->file); + + g_list_free_full (state->deep_count_subdirectories, g_object_unref); + + g_free (state); +} + +static void +deep_count_next_dir (DeepCountState *state) +{ + GFile *new_file; + + g_clear_object (&state->file); + + if (state->deep_count_subdirectories != NULL) + { + /* Work on a new directory. */ + new_file = state->deep_count_subdirectories->data; + state->deep_count_subdirectories = + g_list_remove (state->deep_count_subdirectories, new_file); + + deep_count_load (state, new_file); + g_object_unref (new_file); + } + else + { + deep_count_finish (state); + } +} + +static void +deep_count_more_files_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DeepCountState *state; + GList *files, *l; + GFileInfo *info; + + state = user_data; + + if (g_cancellable_is_cancelled (state->self->priv->cancellable)) + { + deep_count_finish (state); + return; + } + + files = g_file_enumerator_next_files_finish (state->enumerator, + res, NULL); + + for (l = files; l != NULL; l = l->next) + { + info = l->data; + deep_count_one (state, info); + g_object_unref (info); + } + + if (files == NULL) + { + g_file_enumerator_close_async (state->enumerator, 0, NULL, NULL, NULL); + g_object_unref (state->enumerator); + state->enumerator = NULL; + + deep_count_next_dir (state); + } + else + { + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_LOW, + state->self->priv->cancellable, + deep_count_more_files_callback, + state); + } + + g_list_free (files); +} + +static void +deep_count_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DeepCountState *state; + GFileEnumerator *enumerator; + + state = user_data; + + if (g_cancellable_is_cancelled (state->self->priv->cancellable)) + { + deep_count_finish (state); + return; + } + + enumerator = g_file_enumerate_children_finish (G_FILE (source_object), + res, NULL); + + if (enumerator == NULL) + { + deep_count_next_dir (state); + } + else + { + state->enumerator = enumerator; + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_LOW, + state->self->priv->cancellable, + deep_count_more_files_callback, + state); + } +} + +static void +deep_count_load (DeepCountState *state, + GFile *file) +{ + state->file = g_object_ref (file); + + g_file_enumerate_children_async (state->file, + LOADER_ATTRS, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, /* flags */ + G_PRIORITY_LOW, /* prio */ + state->self->priv->cancellable, + deep_count_callback, + state); +} + +static void +deep_count_start (ShellMimeSniffer *self) +{ + DeepCountState *state; + + state = g_new0 (DeepCountState, 1); + state->self = self; + + deep_count_load (state, self->priv->file); +} + +static void +query_info_async_ready_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GFileInfo *info; + GError *error = NULL; + ShellMimeSniffer *self = user_data; + + info = g_file_query_info_finish (G_FILE (source), + res, &error); + + if (error != NULL) + { + g_task_return_error (self->priv->task, error); + + return; + } + + if (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY) + { + g_task_return_new_error (self->priv->task, + G_IO_ERROR, + G_IO_ERROR_NOT_DIRECTORY, + "Not a directory"); + + return; + } + + deep_count_start (self); +} + +static gboolean +watchdog_timeout_reached_cb (gpointer user_data) +{ + ShellMimeSniffer *self = user_data; + + self->priv->watchdog_id = 0; + g_cancellable_cancel (self->priv->cancellable); + + return FALSE; +} + +static void +start_loading_file (ShellMimeSniffer *self) +{ + g_file_query_info_async (self->priv->file, + LOADER_ATTRS, + G_FILE_QUERY_INFO_NONE, + G_PRIORITY_DEFAULT, + self->priv->cancellable, + query_info_async_ready_cb, + self); +} + +static void +shell_mime_sniffer_set_file (ShellMimeSniffer *self, + GFile *file) +{ + g_clear_object (&self->priv->file); + self->priv->file = g_object_ref (file); +} + +static void +shell_mime_sniffer_dispose (GObject *object) +{ + ShellMimeSniffer *self = SHELL_MIME_SNIFFER (object); + + g_clear_object (&self->priv->file); + g_clear_object (&self->priv->cancellable); + g_clear_object (&self->priv->task); + + if (self->priv->watchdog_id != 0) + { + g_source_remove (self->priv->watchdog_id); + self->priv->watchdog_id = 0; + } + + G_OBJECT_CLASS (shell_mime_sniffer_parent_class)->dispose (object); +} + +static void +shell_mime_sniffer_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ShellMimeSniffer *self = SHELL_MIME_SNIFFER (object); + + switch (prop_id) { + case PROP_FILE: + g_value_set_object (value, self->priv->file); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +shell_mime_sniffer_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ShellMimeSniffer *self = SHELL_MIME_SNIFFER (object); + + switch (prop_id) { + case PROP_FILE: + shell_mime_sniffer_set_file (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +shell_mime_sniffer_class_init (ShellMimeSnifferClass *klass) +{ + GObjectClass *oclass; + + oclass = G_OBJECT_CLASS (klass); + oclass->dispose = shell_mime_sniffer_dispose; + oclass->get_property = shell_mime_sniffer_get_property; + oclass->set_property = shell_mime_sniffer_set_property; + + properties[PROP_FILE] = + g_param_spec_object ("file", + "File", + "The loaded file", + G_TYPE_FILE, + G_PARAM_READWRITE); + + g_object_class_install_properties (oclass, NUM_PROPERTIES, properties); +} + +static void +shell_mime_sniffer_init (ShellMimeSniffer *self) +{ + self->priv = shell_mime_sniffer_get_instance_private (self); + init_mimetypes (); +} + +ShellMimeSniffer * +shell_mime_sniffer_new (GFile *file) +{ + return g_object_new (SHELL_TYPE_MIME_SNIFFER, + "file", file, + NULL); +} + +void +shell_mime_sniffer_sniff_async (ShellMimeSniffer *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_assert (self->priv->watchdog_id == 0); + g_assert (self->priv->task == NULL); + + self->priv->cancellable = g_cancellable_new (); + self->priv->task = g_task_new (self, self->priv->cancellable, + callback, user_data); + + self->priv->watchdog_id = + g_timeout_add (WATCHDOG_TIMEOUT, + watchdog_timeout_reached_cb, self); + g_source_set_name_by_id (self->priv->watchdog_id, "[gnome-shell] watchdog_timeout_reached_cb"); + + start_loading_file (self); +} + +gchar ** +shell_mime_sniffer_sniff_finish (ShellMimeSniffer *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_pointer (self->priv->task, error); +} diff --git a/src/hotplug-sniffer/shell-mime-sniffer.h b/src/hotplug-sniffer/shell-mime-sniffer.h new file mode 100644 index 0000000..3936eef --- /dev/null +++ b/src/hotplug-sniffer/shell-mime-sniffer.h @@ -0,0 +1,46 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright (C) 2011 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: Cosimo Cecchi + * + */ + +#ifndef __SHELL_MIME_SNIFFER_H__ +#define __SHELL_MIME_SNIFFER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define SHELL_TYPE_MIME_SNIFFER (shell_mime_sniffer_get_type ()) +G_DECLARE_FINAL_TYPE (ShellMimeSniffer, shell_mime_sniffer, + SHELL, MIME_SNIFFER, GObject) + +ShellMimeSniffer *shell_mime_sniffer_new (GFile *file); + +void shell_mime_sniffer_sniff_async (ShellMimeSniffer *self, + GAsyncReadyCallback callback, + gpointer user_data); + +gchar ** shell_mime_sniffer_sniff_finish (ShellMimeSniffer *self, + GAsyncResult *res, + GError **error); + +G_END_DECLS + +#endif /* __SHELL_MIME_SNIFFER_H__ */ diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..2458377 --- /dev/null +++ b/src/main.c @@ -0,0 +1,506 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#ifdef HAVE_MALLINFO +#include +#endif +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "shell-global.h" +#include "shell-global-private.h" +#include "shell-perf-log.h" +#include "st.h" + +extern GType gnome_shell_plugin_get_type (void); + +#define SHELL_DBUS_SERVICE "org.gnome.Shell" +#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier" + +#define WM_NAME "GNOME Shell" +#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell" + +static gboolean is_gdm_mode = FALSE; +static char *session_mode = NULL; +static int caught_signal = 0; + +#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1 +#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4 + +enum { + SHELL_DEBUG_BACKTRACE_WARNINGS = 1, + SHELL_DEBUG_BACKTRACE_SEGFAULTS = 2, +}; +static int _shell_debug; +static gboolean _tracked_signals[NSIG] = { 0 }; + +static void +shell_dbus_acquire_name (GDBusProxy *bus, + guint32 request_name_flags, + guint32 *request_name_result, + const gchar *name, + gboolean fatal) +{ + GError *error = NULL; + GVariant *request_name_variant; + + if (!(request_name_variant = g_dbus_proxy_call_sync (bus, + "RequestName", + g_variant_new ("(su)", name, request_name_flags), + 0, /* call flags */ + -1, /* timeout */ + NULL, /* cancellable */ + &error))) + { + g_printerr ("failed to acquire %s: %s\n", name, error->message); + g_clear_error (&error); + if (!fatal) + return; + exit (1); + } + g_variant_get (request_name_variant, "(u)", request_name_result); + g_variant_unref (request_name_variant); +} + +static void +shell_dbus_acquire_names (GDBusProxy *bus, + guint32 request_name_flags, + const gchar *name, + gboolean fatal, ...) G_GNUC_NULL_TERMINATED; + +static void +shell_dbus_acquire_names (GDBusProxy *bus, + guint32 request_name_flags, + const gchar *name, + gboolean fatal, ...) +{ + va_list al; + guint32 request_name_result; + va_start (al, fatal); + for (;;) + { + shell_dbus_acquire_name (bus, + request_name_flags, + &request_name_result, + name, fatal); + name = va_arg (al, gchar *); + if (!name) + break; + fatal = va_arg (al, gboolean); + } + va_end (al); +} + +static void +shell_dbus_init (gboolean replace) +{ + GDBusConnection *session; + GDBusProxy *bus; + GError *error = NULL; + guint32 request_name_flags; + guint32 request_name_result; + + session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + + if (error) { + g_printerr ("Failed to connect to session bus: %s", error->message); + exit (1); + } + + bus = g_dbus_proxy_new_sync (session, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* interface info */ + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + NULL, /* cancellable */ + &error); + + if (!bus) + { + g_printerr ("Failed to get a session bus proxy: %s", error->message); + exit (1); + } + + request_name_flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT; + if (replace) + request_name_flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE; + + shell_dbus_acquire_name (bus, + request_name_flags, + &request_name_result, + SHELL_DBUS_SERVICE, TRUE); + if (!(request_name_result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER + || request_name_result == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER)) + { + g_printerr (SHELL_DBUS_SERVICE " already exists on bus and --replace not specified\n"); + exit (1); + } + + /* + * We always specify REPLACE_EXISTING to ensure we kill off + * the existing service if it was running. + */ + request_name_flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE; + + shell_dbus_acquire_names (bus, + request_name_flags, + /* Also grab org.gnome.Panel to replace any existing panel process */ + "org.gnome.Panel", TRUE, + /* ...and the org.gnome.Magnifier service. */ + MAGNIFIER_DBUS_SERVICE, FALSE, + /* ...and the org.freedesktop.Notifications service. */ + "org.freedesktop.Notifications", FALSE, + NULL); + g_object_unref (bus); + g_object_unref (session); +} + +static void +shell_introspection_init (void) +{ + + g_irepository_prepend_search_path (MUTTER_TYPELIB_DIR); + g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR); + + /* We need to explicitly add the directories where the private libraries are + * installed to the GIR's library path, so that they can be found at runtime + * when linking using DT_RUNPATH (instead of DT_RPATH), which is the default + * for some linkers (e.g. gold) and in some distros (e.g. Debian). + */ + g_irepository_prepend_library_path (MUTTER_TYPELIB_DIR); + g_irepository_prepend_library_path (GNOME_SHELL_PKGLIBDIR); +} + +static void +shell_fonts_init (void) +{ + CoglPangoFontMap *fontmap; + + /* Disable text mipmapping; it causes problems on pre-GEM Intel + * drivers and we should just be rendering text at the right + * size rather than scaling it. If we do effects where we dynamically + * zoom labels, then we might want to reconsider. + */ + fontmap = COGL_PANGO_FONT_MAP (clutter_get_font_map ()); + cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE); +} + +static void +malloc_statistics_callback (ShellPerfLog *perf_log, + gpointer data) +{ +#ifdef HAVE_MALLINFO + struct mallinfo info = mallinfo (); + + shell_perf_log_update_statistic_i (perf_log, + "malloc.arenaSize", + info.arena); + shell_perf_log_update_statistic_i (perf_log, + "malloc.mmapSize", + info.hblkhd); + shell_perf_log_update_statistic_i (perf_log, + "malloc.usedSize", + info.uordblks); +#endif +} + +static void +shell_perf_log_init (void) +{ + ShellPerfLog *perf_log = shell_perf_log_get_default (); + + /* For probably historical reasons, mallinfo() defines the returned values, + * even those in bytes as int, not size_t. We're determined not to use + * more than 2G of malloc'ed memory, so are OK with that. + */ + shell_perf_log_define_statistic (perf_log, + "malloc.arenaSize", + "Amount of memory allocated by malloc() with brk(), in bytes", + "i"); + shell_perf_log_define_statistic (perf_log, + "malloc.mmapSize", + "Amount of memory allocated by malloc() with mmap(), in bytes", + "i"); + shell_perf_log_define_statistic (perf_log, + "malloc.usedSize", + "Amount of malloc'ed memory currently in use", + "i"); + + shell_perf_log_add_statistics_callback (perf_log, + malloc_statistics_callback, + NULL, NULL); +} + +static void +shell_a11y_init (void) +{ + cally_accessibility_init (); + + if (clutter_get_accessibility_enabled () == FALSE) + { + g_warning ("Accessibility: clutter has no accessibility enabled" + " skipping the atk-bridge load"); + } + else + { + atk_bridge_adaptor_init (NULL, NULL); + } +} + +static void +shell_init_debug (const char *debug_env) +{ + static const GDebugKey keys[] = { + { "backtrace-warnings", SHELL_DEBUG_BACKTRACE_WARNINGS }, + { "backtrace-segfaults", SHELL_DEBUG_BACKTRACE_SEGFAULTS }, + }; + + _shell_debug = g_parse_debug_string (debug_env, keys, + G_N_ELEMENTS (keys)); +} + +static void +default_log_handler (const char *log_domain, + GLogLevelFlags log_level, + const char *message, + gpointer data) +{ + GTimeVal now; + + g_get_current_time (&now); + + if (!log_domain || !g_str_has_prefix (log_domain, "tp-glib")) + g_log_default_handler (log_domain, log_level, message, data); + + /* Filter out Gjs logs, those already have the stack */ + if (log_domain && strcmp (log_domain, "Gjs") == 0) + return; + + if ((_shell_debug & SHELL_DEBUG_BACKTRACE_WARNINGS) && + ((log_level & G_LOG_LEVEL_CRITICAL) || + (log_level & G_LOG_LEVEL_WARNING))) + gjs_dumpstack (); +} + +static void +shut_up (const char *domain, + GLogLevelFlags level, + const char *message, + gpointer user_data) +{ +} + +static void +dump_gjs_stack_alarm_sigaction (int signo) +{ + g_log_set_default_handler (g_log_default_handler, NULL); + g_warning ("Failed to dump Javascript stack, got stuck"); + g_log_set_default_handler (default_log_handler, NULL); + + raise (caught_signal); +} + +static void +dump_gjs_stack_on_signal_handler (int signo) +{ + struct sigaction sa = { 0 }; + gsize i; + + /* Ignore all the signals starting this point, a part the one we'll raise + * (which is implicitly ignored here through SA_RESETHAND), this is needed + * not to get this handler being called by other signals that we were + * tracking and that might be emitted by code called starting from now. + */ + for (i = 0; i < G_N_ELEMENTS (_tracked_signals); ++i) + { + if (_tracked_signals[i] && i != signo) + signal (i, SIG_IGN); + } + + /* Waiting at least 5 seconds for the dumpstack, if it fails, we raise the error */ + caught_signal = signo; + sa.sa_handler = dump_gjs_stack_alarm_sigaction; + sigemptyset (&sa.sa_mask); + sigaction (SIGALRM, &sa, NULL); + + alarm (5); + gjs_dumpstack (); + alarm (0); + + raise (signo); +} + +static void +dump_gjs_stack_on_signal (int signo) +{ + struct sigaction sa = { 0 }; + + sa.sa_flags = SA_RESETHAND | SA_NODEFER; + sa.sa_handler = dump_gjs_stack_on_signal_handler; + sigemptyset (&sa.sa_mask); + + sigaction (signo, &sa, NULL); + _tracked_signals[signo] = TRUE; +} + +static gboolean +list_modes (const char *option_name, + const char *value, + gpointer data, + GError **error) +{ + ShellGlobal *global; + GjsContext *context; + const char *script; + int status; + + /* Many of our imports require global to be set, so rather than + * tayloring our imports carefully here to avoid that dependency, + * we just set it. + * ShellGlobal has some GTK+ dependencies, so initialize GTK+; we + * don't really care if it fails though (e.g. when running from a tty), + * so we mute all warnings */ + g_log_set_default_handler (shut_up, NULL); + gtk_init_check (NULL, NULL); + + _shell_global_init (NULL); + global = shell_global_get (); + context = _shell_global_get_gjs_context (global); + + shell_introspection_init (); + + script = "imports.ui.environment.init();" + "imports.ui.sessionMode.listModes();"; + if (!gjs_context_eval (context, script, -1, "
", &status, NULL)) + g_message ("Retrieving list of available modes failed."); + + g_object_unref (context); + exit (status); +} + +static gboolean +print_version (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + g_print ("GNOME Shell %s\n", VERSION); + exit (0); +} + +GOptionEntry gnome_shell_options[] = { + { + "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, + print_version, + N_("Print version"), + NULL + }, + { + "gdm-mode", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, + &is_gdm_mode, + N_("Mode used by GDM for login screen"), + NULL + }, + { + "mode", 0, 0, G_OPTION_ARG_STRING, + &session_mode, + N_("Use a specific mode, e.g. “gdm” for login screen"), + "MODE" + }, + { + "list-modes", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, + list_modes, + N_("List possible modes"), + NULL + }, + { NULL } +}; + +int +main (int argc, char **argv) +{ + GOptionContext *ctx; + GError *error = NULL; + int ecode; + + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + session_mode = (char *) g_getenv ("GNOME_SHELL_SESSION_MODE"); + + ctx = meta_get_option_context (); + g_option_context_add_main_entries (ctx, gnome_shell_options, GETTEXT_PACKAGE); + g_option_context_add_group (ctx, g_irepository_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + exit (1); + } + + g_option_context_free (ctx); + + meta_plugin_manager_set_plugin_type (gnome_shell_plugin_get_type ()); + + meta_set_wm_name (WM_NAME); + meta_set_gnome_wm_keybindings (GNOME_WM_KEYBINDINGS); + + /* Prevent meta_init() from causing gtk to load the atk-bridge*/ + g_setenv ("NO_AT_BRIDGE", "1", TRUE); + meta_init (); + g_unsetenv ("NO_AT_BRIDGE"); + + /* FIXME: Add gjs API to set this stuff and don't depend on the + * environment. These propagate to child processes. + */ + g_setenv ("GJS_DEBUG_OUTPUT", "stderr", TRUE); + g_setenv ("GJS_DEBUG_TOPICS", "JS ERROR;JS LOG", TRUE); + + shell_init_debug (g_getenv ("SHELL_DEBUG")); + + shell_dbus_init (meta_get_replace_current_wm ()); + shell_a11y_init (); + shell_perf_log_init (); + shell_introspection_init (); + shell_fonts_init (); + + g_log_set_default_handler (default_log_handler, NULL); + + /* Initialize the global object */ + if (session_mode == NULL) + session_mode = is_gdm_mode ? (char *)"gdm" : (char *)"user"; + + _shell_global_init ("session-mode", session_mode, NULL); + + dump_gjs_stack_on_signal (SIGABRT); + dump_gjs_stack_on_signal (SIGFPE); + dump_gjs_stack_on_signal (SIGIOT); + dump_gjs_stack_on_signal (SIGTRAP); + + if ((_shell_debug & SHELL_DEBUG_BACKTRACE_SEGFAULTS)) + { + dump_gjs_stack_on_signal (SIGBUS); + dump_gjs_stack_on_signal (SIGSEGV); + } + + ecode = meta_run (); + + g_debug ("Doing final cleanup"); + _shell_global_destroy_gjs_context (shell_global_get ()); + g_object_unref (shell_global_get ()); + + return ecode; +} diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..97a5a79 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,268 @@ +service_data = configuration_data() +service_data.set('libexecdir', libexecdir) + +subdir('calendar-server') +subdir('hotplug-sniffer') +subdir('st') +subdir('tray') + +script_data = configuration_data() +script_data.set('bindir', bindir) +script_data.set('datadir', datadir) +script_data.set('libdir', libdir) +script_data.set('libexecdir', libexecdir) +script_data.set('pkgdatadir', pkgdatadir) +script_data.set('pkglibdir', pkglibdir) +script_data.set('PYTHON', python.path()) +script_data.set('VERSION', meson.project_version()) + +foreach tool : ['gnome-shell-extension-tool', 'gnome-shell-perf-tool'] + configure_file( + input: tool + '.in', + output: tool, + configuration: script_data, + install_dir: bindir + ) +endforeach + +gnome_shell_cflags = [ + '-DCLUTTER_ENABLE_EXPERIMENTAL_API', + '-DCOGL_ENABLE_EXPERIMENTAL_API', + '-DVERSION="@0@"'.format(meson.project_version()), + '-DLOCALEDIR="@0@"'.format(localedir), + '-DDATADIR="@0@"'.format(datadir), + '-DGNOME_SHELL_LIBEXECDIR="@0@"'.format(libexecdir), + '-DGNOME_SHELL_DATADIR="@0@"'.format(pkgdatadir), + '-DGNOME_SHELL_PKGLIBDIR="@0@"'.format(pkglibdir) +] + +install_rpath = ':'.join([mutter_typelibdir, pkglibdir]) + +gnome_shell_deps = [ + gio_unix_dep, + libxml_dep, + gtk_dep, + atk_bridge_dep, + gjs_dep, + gdk_x11_dep, + clutter_dep, + cogl_pango_dep, + startup_dep, + gi_dep, + polkit_dep, + gcr_dep, + libsystemd_dep +] + +gnome_shell_deps += nm_deps +gnome_shell_deps += recorder_deps + +tools_cflags = '-DLOCALEDIR="@0@"'.format(localedir) +tools_deps = [gio_dep, gjs_dep] + +libshell_menu_sources = [ + 'gtkactionmuxer.h', + 'gtkactionmuxer.c', + 'gtkactionobservable.h', + 'gtkactionobservable.c', + 'gtkactionobserver.h', + 'gtkactionobserver.c' +] + +libshell_menu = library('gnome-shell-menu', + sources: libshell_menu_sources, + dependencies: [gio_dep, clutter_dep], + include_directories: conf_inc, + build_rpath: mutter_typelibdir, + install_rpath: mutter_typelibdir, + install_dir: pkglibdir, + install: true +) + +libshell_menu_dep = declare_dependency(link_with: libshell_menu) + +libshell_public_headers = [ + 'shell-app.h', + 'shell-app-system.h', + 'shell-app-usage.h', + 'shell-embedded-window.h', + 'shell-glsl-quad.h', + 'shell-gtk-embed.h', + 'shell-global.h', + 'shell-invert-lightness-effect.h', + 'shell-action-modes.h', + 'shell-mount-operation.h', + 'shell-perf-log.h', + 'shell-screenshot.h', + 'shell-stack.h', + 'shell-tray-icon.h', + 'shell-tray-manager.h', + 'shell-util.h', + 'shell-window-tracker.h', + 'shell-wm.h' +] + +if have_networkmanager + libshell_public_headers += 'shell-network-agent.h' +endif + +libshell_private_headers = [ + 'shell-app-private.h', + 'shell-app-system-private.h', + 'shell-global-private.h', + 'shell-window-tracker-private.h', + 'shell-wm-private.h' +] + +libshell_sources = [ + 'gnome-shell-plugin.c', + 'shell-app.c', + 'shell-app-system.c', + 'shell-app-usage.c', + 'shell-embedded-window.c', + 'shell-embedded-window-private.h', + 'shell-global.c', + 'shell-glsl-quad.c', + 'shell-gtk-embed.c', + 'shell-invert-lightness-effect.c', + 'shell-keyring-prompt.c', + 'shell-keyring-prompt.h', + 'shell-mount-operation.c', + 'shell-perf-log.c', + 'shell-polkit-authentication-agent.c', + 'shell-polkit-authentication-agent.h', + 'shell-screenshot.c', + 'shell-secure-text-buffer.c', + 'shell-secure-text-buffer.h', + 'shell-stack.c', + 'shell-tray-icon.c', + 'shell-tray-manager.c', + 'shell-util.c', + 'shell-window-tracker.c', + 'shell-wm.c' +] + +if have_networkmanager + libshell_sources += 'shell-network-agent.c' +endif + +libshell_private_sources = [] + +if enable_recorder + libshell_sources += ['shell-recorder.c'] + libshell_public_headers += ['shell-recorder.h'] + + libshell_private_sources += ['shell-recorder-src.c'] + libshell_private_headers += ['shell-recorder-src.h'] +endif + + +libshell_enums = gnome.mkenums_simple('shell-enum-types', + sources: libshell_public_headers +) + +libshell_gir_sources = [ + libshell_enums, + libshell_public_headers, + libshell_sources +] + +libshell_no_gir_sources = [ + js_resources, + libshell_private_headers, + libshell_private_sources +] + +dbus_generated = gnome.gdbus_codegen('org-gtk-application', + 'org.gtk.Application.xml', + namespace: 'Shell' +) + +libshell_no_gir_sources += dbus_generated + +libshell = library('gnome-shell', + sources: libshell_gir_sources + libshell_no_gir_sources, + dependencies: gnome_shell_deps + [libshell_menu_dep, libst_dep, mutter_dep, m_dep], + include_directories: [conf_inc, st_inc, include_directories('tray')], + c_args: gnome_shell_cflags, + link_with: [libtray], + build_rpath: mutter_typelibdir, + install_rpath: install_rpath, + install_dir: pkglibdir, + install: true +) + +libshell_dep = declare_dependency(link_with: libshell) + +libshell_gir_includes = [ + 'Clutter-@0@'.format(mutter_api_version), + 'ClutterX11-@0@'.format(mutter_api_version), + 'Meta-@0@'.format(mutter_api_version), + 'Gcr-3', + 'PolkitAgent-1.0' +] + +if have_networkmanager + libshell_gir_includes += ['NM-1.0'] +endif + +libshell_gir_includes += [ + libgvc_gir[0], + libst_gir[0] +] + +gnome.generate_gir(libshell, + sources: libshell_gir_sources, + nsversion: '0.1', + namespace: 'Shell', + includes: libshell_gir_includes, + extra_args: ['--quiet'], + install_dir_gir: pkgdatadir, + install_dir_typelib: pkglibdir, + install: true +) + +executable('gnome-shell', 'main.c', + c_args: gnome_shell_cflags + [ + '-DMUTTER_TYPELIB_DIR="@0@"'.format(mutter_typelibdir) + ], + dependencies: gnome_shell_deps + [libshell_dep, libst_dep, mutter_dep], + include_directories: [conf_inc, st_inc, include_directories('tray')], + build_rpath: mutter_typelibdir, + install_rpath: install_rpath, + install: true +) + +executable('gnome-shell-extension-prefs', + 'gnome-shell-extension-prefs.c', prefs_resources, + c_args: tools_cflags, + dependencies: tools_deps, + include_directories: [conf_inc], + install: true +) + + +if have_networkmanager + executable('gnome-shell-portal-helper', + 'gnome-shell-portal-helper.c', portal_resources, + c_args: tools_cflags, + dependencies: tools_deps, + include_directories: [conf_inc], + install_dir: libexecdir, + install: true + ) +endif + +executable('gnome-shell-perf-helper', 'shell-perf-helper.c', + dependencies: [gtk_dep, gio_dep, m_dep], + include_directories: [conf_inc], + install_dir: libexecdir, + install: true +) + +executable('run-js-test', 'run-js-test.c', + dependencies: [mutter_dep, gio_dep, gjs_dep], + include_directories: [conf_inc], + link_with: libshell, + build_rpath: mutter_typelibdir, +) diff --git a/src/org.gtk.Application.xml b/src/org.gtk.Application.xml new file mode 100644 index 0000000..161aa1d --- /dev/null +++ b/src/org.gtk.Application.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/run-js-test.c b/src/run-js-test.c new file mode 100644 index 0000000..172ec17 --- /dev/null +++ b/src/run-js-test.c @@ -0,0 +1,132 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Based on gjs/console.c from GJS + * + * Copyright (c) 2008 litl, LLC + * Copyright (c) 2010 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "shell-global.h" +#include "shell-global-private.h" + +static char *command = NULL; + +static GOptionEntry entries[] = { + { "command", 'c', 0, G_OPTION_ARG_STRING, &command, "Program passed in as a string", "COMMAND" }, + { NULL } +}; + +int +main(int argc, char **argv) +{ + GOptionContext *context; + GError *error = NULL; + ShellGlobal *global; + GjsContext *js_context; + char *script; + const char *filename; + char *title; + gsize len; + int code; + + gdk_set_allowed_backends("x11"); + + gtk_init (&argc, &argv); + + clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); + + if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) + return 1; + + gdk_x11_display_set_window_scale (gdk_display_get_default (), 1); + + context = g_option_context_new (NULL); + + /* pass unknown through to the JS script */ + g_option_context_set_ignore_unknown_options (context, TRUE); + + g_option_context_add_main_entries (context, entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + g_error ("option parsing failed: %s", error->message); + + setlocale (LC_ALL, ""); + + _shell_global_init (NULL); + global = shell_global_get (); + js_context = _shell_global_get_gjs_context (global); + + /* prepare command line arguments */ + if (!gjs_context_define_string_array (js_context, "ARGV", + argc - 2, (const char**)argv + 2, + &error)) { + g_printerr ("Failed to defined ARGV: %s", error->message); + exit (1); + } + + if (command != NULL) { + script = command; + len = strlen (script); + filename = ""; + } else if (argc <= 1) { + script = g_strdup ("const Console = imports.console; Console.interact();"); + len = strlen (script); + filename = ""; + } else /*if (argc >= 2)*/ { + error = NULL; + if (!g_file_get_contents (argv[1], &script, &len, &error)) { + g_printerr ("%s\n", error->message); + exit (1); + } + filename = argv[1]; + } + + title = g_filename_display_basename (filename); + g_set_prgname (title); + g_free (title); + + /* evaluate the script */ + error = NULL; + if (!gjs_context_eval (js_context, script, len, + filename, &code, &error)) { + g_free (script); + g_printerr ("%s\n", error->message); + exit (1); + } + + gjs_context_gc (js_context); + gjs_context_gc (js_context); + + g_object_unref (js_context); + g_free (script); + exit (code); +} diff --git a/src/shell-action-modes.h b/src/shell-action-modes.h new file mode 100644 index 0000000..a6f4718 --- /dev/null +++ b/src/shell-action-modes.h @@ -0,0 +1,35 @@ +/** + * ShellActionMode: + * @SHELL_ACTION_MODE_NONE: block action + * @SHELL_ACTION_MODE_NORMAL: allow action when in window mode, + * e.g. when the focus is in an application window + * @SHELL_ACTION_MODE_OVERVIEW: allow action while the overview + * is active + * @SHELL_ACTION_MODE_LOCK_SCREEN: allow action when the screen + * is locked, e.g. when the screen shield is shown + * @SHELL_ACTION_MODE_UNLOCK_SCREEN: allow action in the unlock + * dialog + * @SHELL_ACTION_MODE_LOGIN_SCREEN: allow action in the login screen + * @SHELL_ACTION_MODE_SYSTEM_MODAL: allow action when a system modal + * dialog (e.g. authentification or session dialogs) is open + * @SHELL_ACTION_MODE_LOOKING_GLASS: allow action in looking glass + * @SHELL_ACTION_MODE_POPUP: allow action while a shell menu is open + * @SHELL_ACTION_MODE_ALL: always allow action + * + * Controls in which GNOME Shell states an action (like keybindings and gestures) + * should be handled. +*/ +typedef enum { + SHELL_ACTION_MODE_NONE = 0, + SHELL_ACTION_MODE_NORMAL = 1 << 0, + SHELL_ACTION_MODE_OVERVIEW = 1 << 1, + SHELL_ACTION_MODE_LOCK_SCREEN = 1 << 2, + SHELL_ACTION_MODE_UNLOCK_SCREEN = 1 << 3, + SHELL_ACTION_MODE_LOGIN_SCREEN = 1 << 4, + SHELL_ACTION_MODE_SYSTEM_MODAL = 1 << 5, + SHELL_ACTION_MODE_LOOKING_GLASS = 1 << 6, + SHELL_ACTION_MODE_POPUP = 1 << 7, + + SHELL_ACTION_MODE_ALL = ~0, +} ShellActionMode; + diff --git a/src/shell-app-private.h b/src/shell-app-private.h new file mode 100644 index 0000000..b1786b3 --- /dev/null +++ b/src/shell-app-private.h @@ -0,0 +1,24 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_APP_PRIVATE_H__ +#define __SHELL_APP_PRIVATE_H__ + +#include "shell-app.h" +#include "shell-app-system.h" + +G_BEGIN_DECLS + +ShellApp* _shell_app_new_for_window (MetaWindow *window); + +ShellApp* _shell_app_new (GDesktopAppInfo *info); + +void _shell_app_set_app_info (ShellApp *app, GDesktopAppInfo *info); + +void _shell_app_handle_startup_sequence (ShellApp *app, MetaStartupSequence *sequence); + +void _shell_app_add_window (ShellApp *app, MetaWindow *window); + +void _shell_app_remove_window (ShellApp *app, MetaWindow *window); + +G_END_DECLS + +#endif /* __SHELL_APP_PRIVATE_H__ */ diff --git a/src/shell-app-system-private.h b/src/shell-app-system-private.h new file mode 100644 index 0000000..975d563 --- /dev/null +++ b/src/shell-app-system-private.h @@ -0,0 +1,9 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_APP_SYSTEM_PRIVATE_H__ +#define __SHELL_APP_SYSTEM_PRIVATE_H__ + +#include "shell-app-system.h" + +void _shell_app_system_notify_app_state_changed (ShellAppSystem *self, ShellApp *app); + +#endif diff --git a/src/shell-app-system.c b/src/shell-app-system.c new file mode 100644 index 0000000..f632cbe --- /dev/null +++ b/src/shell-app-system.c @@ -0,0 +1,458 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include "shell-app-system.h" +#include "shell-app-usage.h" +#include + +#include +#include + +#include "shell-app-private.h" +#include "shell-window-tracker-private.h" +#include "shell-app-system-private.h" +#include "shell-global.h" +#include "shell-util.h" + +/* Vendor prefixes are something that can be preprended to a .desktop + * file name. Undo this. + */ +static const char*const vendor_prefixes[] = { "gnome-", + "fedora-", + "mozilla-", + "debian-", + NULL }; + +enum { + PROP_0, + +}; + +enum { + APP_STATE_CHANGED, + INSTALLED_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +typedef struct _ShellAppSystemPrivate ShellAppSystemPrivate; + +struct _ShellAppSystem +{ + GObject parent; + + ShellAppSystemPrivate *priv; +}; + +struct _ShellAppSystemPrivate { + GHashTable *running_apps; + GHashTable *id_to_app; + GHashTable *startup_wm_class_to_id; + GList *installed_apps; +}; + +static void shell_app_system_finalize (GObject *object); + +G_DEFINE_TYPE_WITH_PRIVATE (ShellAppSystem, shell_app_system, G_TYPE_OBJECT); + +static void shell_app_system_class_init(ShellAppSystemClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *)klass; + + gobject_class->finalize = shell_app_system_finalize; + + signals[APP_STATE_CHANGED] = g_signal_new ("app-state-changed", + SHELL_TYPE_APP_SYSTEM, + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 1, + SHELL_TYPE_APP); + signals[INSTALLED_CHANGED] = + g_signal_new ("installed-changed", + SHELL_TYPE_APP_SYSTEM, + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); +} + +static void +scan_startup_wm_class_to_id (ShellAppSystem *self) +{ + ShellAppSystemPrivate *priv = self->priv; + GList *l; + + g_hash_table_remove_all (priv->startup_wm_class_to_id); + + g_list_free_full (priv->installed_apps, g_object_unref); + priv->installed_apps = g_app_info_get_all (); + + for (l = priv->installed_apps; l != NULL; l = l->next) + { + GAppInfo *info = l->data; + const char *startup_wm_class, *id, *old_id; + + id = g_app_info_get_id (info); + startup_wm_class = g_desktop_app_info_get_startup_wm_class (G_DESKTOP_APP_INFO (info)); + + if (startup_wm_class == NULL) + continue; + + /* In case multiple .desktop files set the same StartupWMClass, prefer + * the one where ID and StartupWMClass match */ + old_id = g_hash_table_lookup (priv->startup_wm_class_to_id, startup_wm_class); + if (old_id == NULL || strcmp (id, startup_wm_class) == 0) + g_hash_table_insert (priv->startup_wm_class_to_id, + g_strdup (startup_wm_class), g_strdup (id)); + } +} + +static gboolean +app_is_stale (ShellApp *app) +{ + GDesktopAppInfo *info, *old; + GAppInfo *old_info, *new_info; + gboolean is_unchanged; + + if (shell_app_is_window_backed (app)) + return FALSE; + + info = g_desktop_app_info_new (shell_app_get_id (app)); + if (!info) + return TRUE; + + old = shell_app_get_app_info (app); + old_info = G_APP_INFO (old); + new_info = G_APP_INFO (info); + + is_unchanged = + g_app_info_should_show (old_info) == g_app_info_should_show (new_info) && + strcmp (g_desktop_app_info_get_filename (old), + g_desktop_app_info_get_filename (info)) == 0 && + g_strcmp0 (g_app_info_get_executable (old_info), + g_app_info_get_executable (new_info)) == 0 && + g_strcmp0 (g_app_info_get_commandline (old_info), + g_app_info_get_commandline (new_info)) == 0 && + strcmp (g_app_info_get_name (old_info), + g_app_info_get_name (new_info)) == 0 && + g_strcmp0 (g_app_info_get_description (old_info), + g_app_info_get_description (new_info)) == 0 && + strcmp (g_app_info_get_display_name (old_info), + g_app_info_get_display_name (new_info)) == 0 && + g_icon_equal (g_app_info_get_icon (old_info), + g_app_info_get_icon (new_info)); + + g_object_unref (info); + return !is_unchanged; +} + +static gboolean +stale_app_remove_func (gpointer key, + gpointer value, + gpointer user_data) +{ + return app_is_stale (value); +} + +static void +installed_changed (GAppInfoMonitor *monitor, + gpointer user_data) +{ + ShellAppSystem *self = user_data; + + scan_startup_wm_class_to_id (self); + + g_hash_table_foreach_remove (self->priv->id_to_app, stale_app_remove_func, NULL); + + g_signal_emit (self, signals[INSTALLED_CHANGED], 0, NULL); +} + +static void +shell_app_system_init (ShellAppSystem *self) +{ + ShellAppSystemPrivate *priv; + GAppInfoMonitor *monitor; + + self->priv = priv = shell_app_system_get_instance_private (self); + + priv->running_apps = g_hash_table_new_full (NULL, NULL, (GDestroyNotify) g_object_unref, NULL); + priv->id_to_app = g_hash_table_new_full (g_str_hash, g_str_equal, + NULL, + (GDestroyNotify)g_object_unref); + + priv->startup_wm_class_to_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + monitor = g_app_info_monitor_get (); + g_signal_connect (monitor, "changed", G_CALLBACK (installed_changed), self); + installed_changed (monitor, self); +} + +static void +shell_app_system_finalize (GObject *object) +{ + ShellAppSystem *self = SHELL_APP_SYSTEM (object); + ShellAppSystemPrivate *priv = self->priv; + + g_hash_table_destroy (priv->running_apps); + g_hash_table_destroy (priv->id_to_app); + g_hash_table_destroy (priv->startup_wm_class_to_id); + g_list_free_full (priv->installed_apps, g_object_unref); + + G_OBJECT_CLASS (shell_app_system_parent_class)->finalize (object); +} + +/** + * shell_app_system_get_default: + * + * Return Value: (transfer none): The global #ShellAppSystem singleton + */ +ShellAppSystem * +shell_app_system_get_default (void) +{ + static ShellAppSystem *instance = NULL; + + if (instance == NULL) + instance = g_object_new (SHELL_TYPE_APP_SYSTEM, NULL); + + return instance; +} + +/** + * shell_app_system_lookup_app: + * + * Find a #ShellApp corresponding to an id. + * + * Return value: (transfer none): The #ShellApp for id, or %NULL if none + */ +ShellApp * +shell_app_system_lookup_app (ShellAppSystem *self, + const char *id) +{ + ShellAppSystemPrivate *priv = self->priv; + ShellApp *app; + GDesktopAppInfo *info; + + app = g_hash_table_lookup (priv->id_to_app, id); + if (app) + return app; + + info = g_desktop_app_info_new (id); + if (!info) + return NULL; + + app = _shell_app_new (info); + g_hash_table_insert (priv->id_to_app, (char *) shell_app_get_id (app), app); + g_object_unref (info); + return app; +} + +/** + * shell_app_system_lookup_heuristic_basename: + * @system: a #ShellAppSystem + * @id: Probable application identifier + * + * Find a valid application corresponding to a given + * heuristically determined application identifier + * string, or %NULL if none. + * + * Returns: (transfer none): A #ShellApp for @name + */ +ShellApp * +shell_app_system_lookup_heuristic_basename (ShellAppSystem *system, + const char *name) +{ + ShellApp *result; + const char *const *prefix; + + result = shell_app_system_lookup_app (system, name); + if (result != NULL) + return result; + + for (prefix = vendor_prefixes; *prefix != NULL; prefix++) + { + char *tmpid = g_strconcat (*prefix, name, NULL); + result = shell_app_system_lookup_app (system, tmpid); + g_free (tmpid); + if (result != NULL) + return result; + } + + return NULL; +} + +/** + * shell_app_system_lookup_desktop_wmclass: + * @system: a #ShellAppSystem + * @wmclass: (nullable): A WM_CLASS value + * + * Find a valid application whose .desktop file, without the extension + * and properly canonicalized, matches @wmclass. + * + * Returns: (transfer none): A #ShellApp for @wmclass + */ +ShellApp * +shell_app_system_lookup_desktop_wmclass (ShellAppSystem *system, + const char *wmclass) +{ + char *canonicalized; + char *desktop_file; + ShellApp *app; + + if (wmclass == NULL) + return NULL; + + /* First try without changing the case (this handles + org.example.Foo.Bar.desktop applications) + + Note that is slightly wrong in that Gtk+ would set + the WM_CLASS to Org.example.Foo.Bar, but it also + sets the instance part to org.example.Foo.Bar, so we're ok + */ + desktop_file = g_strconcat (wmclass, ".desktop", NULL); + app = shell_app_system_lookup_heuristic_basename (system, desktop_file); + g_free (desktop_file); + + if (app) + return app; + + canonicalized = g_ascii_strdown (wmclass, -1); + + /* This handles "Fedora Eclipse", probably others. + * Note g_strdelimit is modify-in-place. */ + g_strdelimit (canonicalized, " ", '-'); + + desktop_file = g_strconcat (canonicalized, ".desktop", NULL); + + app = shell_app_system_lookup_heuristic_basename (system, desktop_file); + + g_free (canonicalized); + g_free (desktop_file); + + return app; +} + +/** + * shell_app_system_lookup_startup_wmclass: + * @system: a #ShellAppSystem + * @wmclass: (nullable): A WM_CLASS value + * + * Find a valid application whose .desktop file contains a + * StartupWMClass entry matching @wmclass. + * + * Returns: (transfer none): A #ShellApp for @wmclass + */ +ShellApp * +shell_app_system_lookup_startup_wmclass (ShellAppSystem *system, + const char *wmclass) +{ + const char *id; + + if (wmclass == NULL) + return NULL; + + id = g_hash_table_lookup (system->priv->startup_wm_class_to_id, wmclass); + if (id == NULL) + return NULL; + + return shell_app_system_lookup_app (system, id); +} + +void +_shell_app_system_notify_app_state_changed (ShellAppSystem *self, + ShellApp *app) +{ + ShellAppState state = shell_app_get_state (app); + + switch (state) + { + case SHELL_APP_STATE_RUNNING: + g_hash_table_insert (self->priv->running_apps, g_object_ref (app), NULL); + break; + case SHELL_APP_STATE_STARTING: + break; + case SHELL_APP_STATE_STOPPED: + g_hash_table_remove (self->priv->running_apps, app); + break; + default: + g_warn_if_reached(); + break; + } + g_signal_emit (self, signals[APP_STATE_CHANGED], 0, app); +} + +/** + * shell_app_system_get_running: + * @self: A #ShellAppSystem + * + * Returns the set of applications which currently have at least one + * open window. The returned list will be sorted by shell_app_compare(). + * + * Returns: (element-type ShellApp) (transfer container): Active applications + */ +GSList * +shell_app_system_get_running (ShellAppSystem *self) +{ + gpointer key, value; + GSList *ret; + GHashTableIter iter; + + g_hash_table_iter_init (&iter, self->priv->running_apps); + + ret = NULL; + while (g_hash_table_iter_next (&iter, &key, &value)) + { + ShellApp *app = key; + + ret = g_slist_prepend (ret, app); + } + + ret = g_slist_sort (ret, (GCompareFunc)shell_app_compare); + + return ret; +} + +/** + * shell_app_system_search: + * @search_string: the search string to use + * + * Wrapper around g_desktop_app_info_search() that replaces results that + * don't validate as UTF-8 with the empty string. + * + * Returns: (array zero-terminated=1) (element-type GStrv) (transfer full): a + * list of strvs. Free each item with g_strfreev() and free the outer + * list with g_free(). + */ +char *** +shell_app_system_search (const char *search_string) +{ + char ***results = g_desktop_app_info_search (search_string); + char ***groups, **ids; + + for (groups = results; *groups; groups++) + for (ids = *groups; *ids; ids++) + if (!g_utf8_validate (*ids, -1, NULL)) + **ids = '\0'; + + return results; +} + +/** + * shell_app_system_get_installed: + * @self: the #ShellAppSystem + * + * Returns all installed apps, as a list of #GAppInfo + * + * Returns: (transfer none) (element-type GAppInfo): a list of #GAppInfo + * describing all known applications. This memory is owned by the + * #ShellAppSystem and should not be freed. + **/ +GList * +shell_app_system_get_installed (ShellAppSystem *self) +{ + ShellAppSystemPrivate *priv = self->priv; + + return priv->installed_apps; +} diff --git a/src/shell-app-system.h b/src/shell-app-system.h new file mode 100644 index 0000000..8719dbc --- /dev/null +++ b/src/shell-app-system.h @@ -0,0 +1,32 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_APP_SYSTEM_H__ +#define __SHELL_APP_SYSTEM_H__ + +#include +#include +#include + +#include "shell-app.h" + +#define SHELL_TYPE_APP_SYSTEM (shell_app_system_get_type ()) +G_DECLARE_FINAL_TYPE (ShellAppSystem, shell_app_system, + SHELL, APP_SYSTEM, GObject) + +ShellAppSystem *shell_app_system_get_default (void); + +ShellApp *shell_app_system_lookup_app (ShellAppSystem *system, + const char *id); +ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system, + const char *id); + +ShellApp *shell_app_system_lookup_startup_wmclass (ShellAppSystem *system, + const char *wmclass); +ShellApp *shell_app_system_lookup_desktop_wmclass (ShellAppSystem *system, + const char *wmclass); + +GSList *shell_app_system_get_running (ShellAppSystem *self); +char ***shell_app_system_search (const char *search_string); + +GList *shell_app_system_get_installed (ShellAppSystem *self); + +#endif /* __SHELL_APP_SYSTEM_H__ */ diff --git a/src/shell-app-usage.c b/src/shell-app-usage.c new file mode 100644 index 0000000..b8dc768 --- /dev/null +++ b/src/shell-app-usage.c @@ -0,0 +1,781 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "shell-app-usage.h" +#include "shell-window-tracker.h" +#include "shell-global.h" + +/* This file includes modified code from + * desktop-data-engine/engine-dbus/hippo-application-monitor.c + * in the functions collecting application usage data. + * Written by Owen Taylor, originally licensed under LGPL 2.1. + * Copyright Red Hat, Inc. 2006-2008 + */ + +/** + * SECTION:shell-app-usage + * @short_description: Track application usage/state data + * + * This class maintains some usage and state statistics for + * applications by keeping track of the approximate time an application's + * windows are focused, as well as the last workspace it was seen on. + * This time tracking is implemented by watching for focus notifications, + * and computing a time delta between them. Also we watch the + * GNOME Session "StatusChanged" signal which by default is emitted after 5 + * minutes to signify idle. + */ + +#define PRIVACY_SCHEMA "org.gnome.desktop.privacy" +#define ENABLE_MONITORING_KEY "remember-app-usage" + +#define FOCUS_TIME_MIN_SECONDS 7 /* Need 7 continuous seconds of focus */ + +#define USAGE_CLEAN_DAYS 7 /* If after 7 days we haven't seen an app, purge it */ + +/* Data is saved to file SHELL_CONFIG_DIR/DATA_FILENAME */ +#define DATA_FILENAME "application_state" + +#define IDLE_TIME_TRANSITION_SECONDS 30 /* If we transition to idle, only count + * this many seconds of usage */ + +/* The ranking algorithm we use is: every time an app score reaches SCORE_MAX, + * divide all scores by 2. Scores are raised by 1 unit every SAVE_APPS_TIMEOUT + * seconds. This mechanism allows the list to update relatively fast when + * a new app is used intensively. + * To keep the list clean, and avoid being Big Brother, apps that have not been + * seen for a week and whose score is below SCORE_MIN are removed. + */ + +/* How often we save internally app data, in seconds */ +#define SAVE_APPS_TIMEOUT_SECONDS (5 * 60) + +/* With this value, an app goes from bottom to top of the + * usage list in 50 hours of use */ +#define SCORE_MAX (3600 * 50 / FOCUS_TIME_MIN_SECONDS) + +/* If an app's score in lower than this and the app has not been used in a week, + * remove it */ +#define SCORE_MIN (SCORE_MAX >> 3) + +/* http://www.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Presence */ +#define GNOME_SESSION_STATUS_IDLE 3 + +typedef struct UsageData UsageData; + +struct _ShellAppUsage +{ + GObject parent; + + GFile *configfile; + GDBusProxy *session_proxy; + GSettings *privacy_settings; + guint idle_focus_change_id; + guint save_id; + gboolean currently_idle; + gboolean enable_monitoring; + + long watch_start_time; + ShellApp *watched_app; + + /* */ + GHashTable *app_usages; +}; + +G_DEFINE_TYPE (ShellAppUsage, shell_app_usage, G_TYPE_OBJECT); + +/* Represents an application record for a given context */ +struct UsageData +{ + gdouble score; /* Based on the number of times we'e seen the app and normalized */ + long last_seen; /* Used to clear old apps we've only seen a few times */ +}; + +static void shell_app_usage_finalize (GObject *object); + +static void on_session_status_changed (GDBusProxy *proxy, guint status, ShellAppUsage *self); +static void on_focus_app_changed (ShellWindowTracker *tracker, GParamSpec *spec, ShellAppUsage *self); +static void ensure_queued_save (ShellAppUsage *self); + +static gboolean idle_save_application_usage (gpointer data); + +static void restore_from_file (ShellAppUsage *self); + +static void update_enable_monitoring (ShellAppUsage *self); + +static void on_enable_monitoring_key_changed (GSettings *settings, + const gchar *key, + ShellAppUsage *self); + +static long +get_time (void) +{ + GTimeVal tv; + g_get_current_time (&tv); + return tv.tv_sec; +} + +static void +shell_app_usage_class_init (ShellAppUsageClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = shell_app_usage_finalize; +} + +static UsageData * +get_usage_for_app (ShellAppUsage *self, + ShellApp *app) +{ + UsageData *usage; + const char *appid = shell_app_get_id (app); + + usage = g_hash_table_lookup (self->app_usages, appid); + if (usage) + return usage; + + usage = g_new0 (UsageData, 1); + g_hash_table_insert (self->app_usages, g_strdup (appid), usage); + + return usage; +} + +/* Limit the score to a certain level so that most used apps can change */ +static void +normalize_usage (ShellAppUsage *self) +{ + GHashTableIter iter; + UsageData *usage; + + g_hash_table_iter_init (&iter, self->app_usages); + + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &usage)) + usage->score /= 2; +} + +static void +increment_usage_for_app_at_time (ShellAppUsage *self, + ShellApp *app, + long time) +{ + UsageData *usage; + guint elapsed; + guint usage_count; + + usage = get_usage_for_app (self, app); + + usage->last_seen = time; + + elapsed = time - self->watch_start_time; + usage_count = elapsed / FOCUS_TIME_MIN_SECONDS; + if (usage_count > 0) + { + usage->score += usage_count; + if (usage->score > SCORE_MAX) + normalize_usage (self); + ensure_queued_save (self); + } +} + +static void +increment_usage_for_app (ShellAppUsage *self, + ShellApp *app) +{ + long curtime = get_time (); + increment_usage_for_app_at_time (self, app, curtime); +} + +static void +on_app_state_changed (ShellAppSystem *app_system, + ShellApp *app, + gpointer user_data) +{ + ShellAppUsage *self = SHELL_APP_USAGE (user_data); + UsageData *usage; + gboolean running; + + if (shell_app_is_window_backed (app)) + return; + + usage = get_usage_for_app (self, app); + + running = shell_app_get_state (app) == SHELL_APP_STATE_RUNNING; + + if (running) + usage->last_seen = get_time (); +} + +static void +on_focus_app_changed (ShellWindowTracker *tracker, + GParamSpec *spec, + ShellAppUsage *self) +{ + if (self->watched_app != NULL) + increment_usage_for_app (self, self->watched_app); + + if (self->watched_app) + g_object_unref (self->watched_app); + + g_object_get (tracker, "focus-app", &(self->watched_app), NULL); + self->watch_start_time = get_time (); +} + +static void +on_session_status_changed (GDBusProxy *proxy, + guint status, + ShellAppUsage *self) +{ + gboolean idle; + + idle = (status >= GNOME_SESSION_STATUS_IDLE); + if (self->currently_idle == idle) + return; + + self->currently_idle = idle; + if (idle) + { + long end_time; + + /* The GNOME Session signal we watch is 5 minutes, but that's a long + * time for this purpose. Instead, just add a base 30 seconds. + */ + if (self->watched_app) + { + end_time = self->watch_start_time + IDLE_TIME_TRANSITION_SECONDS; + increment_usage_for_app_at_time (self, self->watched_app, end_time); + } + } + else + { + /* Transitioning to !idle, reset the start time */ + self->watch_start_time = get_time (); + } +} + +static void +session_proxy_signal (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, gpointer user_data) +{ + if (g_str_equal (signal_name, "StatusChanged")) + { + guint status; + g_variant_get (parameters, "(u)", &status); + on_session_status_changed (proxy, status, SHELL_APP_USAGE (user_data)); + } +} + +static void +shell_app_usage_init (ShellAppUsage *self) +{ + ShellGlobal *global; + char *shell_userdata_dir, *path; + GDBusConnection *session_bus; + ShellWindowTracker *tracker; + ShellAppSystem *app_system; + + global = shell_global_get (); + + self->app_usages = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + tracker = shell_window_tracker_get_default (); + g_signal_connect (tracker, "notify::focus-app", G_CALLBACK (on_focus_app_changed), self); + + app_system = shell_app_system_get_default (); + g_signal_connect (app_system, "app-state-changed", G_CALLBACK (on_app_state_changed), self); + + session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + self->session_proxy = g_dbus_proxy_new_sync (session_bus, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* interface info */ + "org.gnome.SessionManager", + "/org/gnome/SessionManager/Presence", + "org.gnome.SessionManager", + NULL, /* cancellable */ + NULL /* error */); + g_signal_connect (self->session_proxy, "g-signal", G_CALLBACK (session_proxy_signal), self); + g_object_unref (session_bus); + + self->currently_idle = FALSE; + self->enable_monitoring = FALSE; + + g_object_get (global, "userdatadir", &shell_userdata_dir, NULL), + path = g_build_filename (shell_userdata_dir, DATA_FILENAME, NULL); + g_free (shell_userdata_dir); + self->configfile = g_file_new_for_path (path); + g_free (path); + restore_from_file (self); + + self->privacy_settings = g_settings_new(PRIVACY_SCHEMA); + g_signal_connect (self->privacy_settings, + "changed::" ENABLE_MONITORING_KEY, + G_CALLBACK (on_enable_monitoring_key_changed), + self); + update_enable_monitoring (self); +} + +static void +shell_app_usage_finalize (GObject *object) +{ + ShellAppUsage *self = SHELL_APP_USAGE (object); + + if (self->save_id > 0) + g_source_remove (self->save_id); + + g_object_unref (self->privacy_settings); + + g_object_unref (self->configfile); + + g_object_unref (self->session_proxy); + + G_OBJECT_CLASS (shell_app_usage_parent_class)->finalize(object); +} + +static int +sort_apps_by_usage (gconstpointer a, + gconstpointer b, + gpointer datap) +{ + ShellAppUsage *self = datap; + ShellApp *app_a, *app_b; + UsageData *usage_a, *usage_b; + + app_a = (ShellApp*)a; + app_b = (ShellApp*)b; + + usage_a = g_hash_table_lookup (self->app_usages, shell_app_get_id (app_a)); + usage_b = g_hash_table_lookup (self->app_usages, shell_app_get_id (app_b)); + + return usage_b->score - usage_a->score; +} + +/** + * shell_app_usage_get_most_used: + * @usage: the usage instance to request + * + * Returns: (element-type ShellApp) (transfer full): List of applications + */ +GSList * +shell_app_usage_get_most_used (ShellAppUsage *self) +{ + GSList *apps; + char *appid; + ShellAppSystem *appsys; + GHashTableIter iter; + + appsys = shell_app_system_get_default (); + + g_hash_table_iter_init (&iter, self->app_usages); + apps = NULL; + while (g_hash_table_iter_next (&iter, (gpointer *) &appid, NULL)) + { + ShellApp *app; + + app = shell_app_system_lookup_app (appsys, appid); + if (!app) + continue; + + apps = g_slist_prepend (apps, g_object_ref (app)); + } + + apps = g_slist_sort_with_data (apps, sort_apps_by_usage, self); + + return apps; +} + + +/** + * shell_app_usage_compare: + * @self: the usage instance to request + * @id_a: ID of first app + * @id_b: ID of second app + * + * Compare @id_a and @id_b based on frequency of use. + * + * Returns: -1 if @id_a ranks higher than @id_b, 1 if @id_b ranks higher + * than @id_a, and 0 if both rank equally. + */ +int +shell_app_usage_compare (ShellAppUsage *self, + const char *id_a, + const char *id_b) +{ + UsageData *usage_a, *usage_b; + + usage_a = g_hash_table_lookup (self->app_usages, id_a); + usage_b = g_hash_table_lookup (self->app_usages, id_b); + + if (usage_a == NULL && usage_b == NULL) + return 0; + else if (usage_a == NULL) + return 1; + else if (usage_b == NULL) + return -1; + + return usage_b->score - usage_a->score; +} + +static void +ensure_queued_save (ShellAppUsage *self) +{ + if (self->save_id != 0) + return; + self->save_id = g_timeout_add_seconds (SAVE_APPS_TIMEOUT_SECONDS, idle_save_application_usage, self); + g_source_set_name_by_id (self->save_id, "[gnome-shell] idle_save_application_usage"); +} + +/* Clean up apps we see rarely. + * The logic behind this is that if an app was seen less than SCORE_MIN times + * and not seen for a week, it can probably be forgotten about. + * This should much reduce the size of the list and avoid 'pollution'. */ +static gboolean +idle_clean_usage (ShellAppUsage *self) +{ + GHashTableIter iter; + UsageData *usage; + long current_time; + long week_ago; + + current_time = get_time (); + week_ago = current_time - (7 * 24 * 60 * 60); + + g_hash_table_iter_init (&iter, self->app_usages); + + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &usage)) + { + if ((usage->score < SCORE_MIN) && + (usage->last_seen < week_ago)) + g_hash_table_iter_remove (&iter); + } + + return FALSE; +} + +static gboolean +write_escaped (GDataOutputStream *stream, + const char *str, + GError **error) +{ + gboolean ret; + char *quoted = g_markup_escape_text (str, -1); + ret = g_data_output_stream_put_string (stream, quoted, NULL, error); + g_free (quoted); + return ret; +} + +static gboolean +write_attribute_string (GDataOutputStream *stream, + const char *elt_name, + const char *str, + GError **error) +{ + gboolean ret = FALSE; + char *elt; + + elt = g_strdup_printf (" %s=\"", elt_name); + ret = g_data_output_stream_put_string (stream, elt, NULL, error); + g_free (elt); + if (!ret) + goto out; + + ret = write_escaped (stream, str, error); + if (!ret) + goto out; + + ret = g_data_output_stream_put_string (stream, "\"", NULL, error); + +out: + return ret; +} + +static gboolean +write_attribute_uint (GDataOutputStream *stream, + const char *elt_name, + guint value, + GError **error) +{ + gboolean ret; + char *buf; + + buf = g_strdup_printf ("%u", value); + ret = write_attribute_string (stream, elt_name, buf, error); + g_free (buf); + + return ret; +} + +static gboolean +write_attribute_double (GDataOutputStream *stream, + const char *elt_name, + double value, + GError **error) +{ + gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; + gboolean ret; + + g_ascii_dtostr (buf, sizeof (buf), value); + ret = write_attribute_string (stream, elt_name, buf, error); + + return ret; +} + +/* Save app data lists to file */ +static gboolean +idle_save_application_usage (gpointer data) +{ + ShellAppUsage *self = SHELL_APP_USAGE (data); + char *id; + GHashTableIter iter; + UsageData *usage; + GFileOutputStream *output; + GOutputStream *buffered_output; + GDataOutputStream *data_output; + GError *error = NULL; + + self->save_id = 0; + + /* Parent directory is already created by shell-global */ + output = g_file_replace (self->configfile, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error); + if (!output) + { + g_debug ("Could not save applications usage data: %s", error->message); + g_error_free (error); + return FALSE; + } + buffered_output = g_buffered_output_stream_new (G_OUTPUT_STREAM (output)); + g_object_unref (output); + data_output = g_data_output_stream_new (G_OUTPUT_STREAM (buffered_output)); + g_object_unref (buffered_output); + + if (!g_data_output_stream_put_string (data_output, "\n\n", NULL, &error)) + goto out; + if (!g_data_output_stream_put_string (data_output, " \n", NULL, &error)) + goto out; + + g_hash_table_iter_init (&iter, self->app_usages); + + while (g_hash_table_iter_next (&iter, (gpointer *) &id, (gpointer *) &usage)) + { + ShellApp *app; + + app = shell_app_system_lookup_app (shell_app_system_get_default(), id); + + if (!app) + continue; + + if (!g_data_output_stream_put_string (data_output, " score, &error)) + goto out; + if (!write_attribute_uint (data_output, "last-seen", usage->last_seen, &error)) + goto out; + if (!g_data_output_stream_put_string (data_output, "/>\n", NULL, &error)) + goto out; + } + if (!g_data_output_stream_put_string (data_output, " \n", NULL, &error)) + goto out; + if (!g_data_output_stream_put_string (data_output, "\n", NULL, &error)) + goto out; + +out: + if (!error) + g_output_stream_close_async (G_OUTPUT_STREAM (data_output), 0, NULL, NULL, NULL); + g_object_unref (data_output); + if (error) + { + g_debug ("Could not save applications usage data: %s", error->message); + g_error_free (error); + } + return FALSE; +} + +static void +shell_app_usage_start_element_handler (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + ShellAppUsage *self = user_data; + + if (strcmp (element_name, "application-state") == 0) + { + } + else if (strcmp (element_name, "context") == 0) + { + } + else if (strcmp (element_name, "application") == 0) + { + const char **attribute; + const char **value; + UsageData *usage; + char *appid = NULL; + + for (attribute = attribute_names, value = attribute_values; *attribute; attribute++, value++) + { + if (strcmp (*attribute, "id") == 0) + { + appid = g_strdup (*value); + break; + } + } + + if (!appid) + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_PARSE, + "Missing attribute id on <%s> element", + element_name); + return; + } + + usage = g_new0 (UsageData, 1); + g_hash_table_insert (self->app_usages, appid, usage); + + for (attribute = attribute_names, value = attribute_values; *attribute; attribute++, value++) + { + if (strcmp (*attribute, "score") == 0) + { + usage->score = g_ascii_strtod (*value, NULL); + } + else if (strcmp (*attribute, "last-seen") == 0) + { + usage->last_seen = (guint) g_ascii_strtoull (*value, NULL, 10); + } + } + } + else + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_PARSE, + "Unknown element <%s>", + element_name); + } +} + +static GMarkupParser app_state_parse_funcs = +{ + shell_app_usage_start_element_handler, + NULL, + NULL, + NULL, + NULL +}; + +/* Load data about apps usage from file */ +static void +restore_from_file (ShellAppUsage *self) +{ + GFileInputStream *input; + GMarkupParseContext *parse_context; + GError *error = NULL; + char buf[1024]; + + input = g_file_read (self->configfile, NULL, &error); + if (error) + { + if (error->code != G_IO_ERROR_NOT_FOUND) + g_warning ("Could not load applications usage data: %s", error->message); + + g_error_free (error); + return; + } + + parse_context = g_markup_parse_context_new (&app_state_parse_funcs, 0, self, NULL); + + while (TRUE) + { + gssize count = g_input_stream_read ((GInputStream*) input, buf, sizeof(buf), NULL, &error); + if (count <= 0) + goto out; + if (!g_markup_parse_context_parse (parse_context, buf, count, &error)) + goto out; + } + +out: + g_markup_parse_context_free (parse_context); + g_input_stream_close ((GInputStream*)input, NULL, NULL); + g_object_unref (input); + + idle_clean_usage (self); + + if (error) + { + g_warning ("Could not load applications usage data: %s", error->message); + g_error_free (error); + } +} + +/* Enable or disable the timers, depending on the value of ENABLE_MONITORING_KEY + * and taking care of the previous state. If selfing is disabled, we still + * report apps usage based on (possibly) saved data, but don't collect data. + */ +static void +update_enable_monitoring (ShellAppUsage *self) +{ + gboolean enable; + + enable = g_settings_get_boolean (self->privacy_settings, + ENABLE_MONITORING_KEY); + + /* Be sure not to start the timers if they were already set */ + if (enable && !self->enable_monitoring) + { + on_focus_app_changed (shell_window_tracker_get_default (), NULL, self); + } + /* ...and don't try to stop them if they were not running */ + else if (!enable && self->enable_monitoring) + { + if (self->watched_app) + g_object_unref (self->watched_app); + self->watched_app = NULL; + if (self->save_id) + { + g_source_remove (self->save_id); + self->save_id = 0; + } + } + + self->enable_monitoring = enable; +} + +/* Called when the ENABLE_MONITORING_KEY boolean has changed */ +static void +on_enable_monitoring_key_changed (GSettings *settings, + const gchar *key, + ShellAppUsage *self) +{ + update_enable_monitoring (self); +} + +/** + * shell_app_usage_get_default: + * + * Return Value: (transfer none): The global #ShellAppUsage instance + */ +ShellAppUsage * +shell_app_usage_get_default (void) +{ + static ShellAppUsage *instance; + + if (instance == NULL) + instance = g_object_new (SHELL_TYPE_APP_USAGE, NULL); + + return instance; +} diff --git a/src/shell-app-usage.h b/src/shell-app-usage.h new file mode 100644 index 0000000..4b0e169 --- /dev/null +++ b/src/shell-app-usage.h @@ -0,0 +1,23 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_APP_USAGE_H__ +#define __SHELL_APP_USAGE_H__ + +#include "shell-app.h" +#include "shell-window-tracker.h" + +G_BEGIN_DECLS + +#define SHELL_TYPE_APP_USAGE (shell_app_usage_get_type ()) +G_DECLARE_FINAL_TYPE (ShellAppUsage, shell_app_usage, + SHELL, APP_USAGE, GObject) + +ShellAppUsage* shell_app_usage_get_default(void); + +GSList *shell_app_usage_get_most_used (ShellAppUsage *usage); +int shell_app_usage_compare (ShellAppUsage *self, + const char *id_a, + const char *id_b); + +G_END_DECLS + +#endif /* __SHELL_APP_USAGE_H__ */ diff --git a/src/shell-app.c b/src/shell-app.c new file mode 100644 index 0000000..10efa91 --- /dev/null +++ b/src/shell-app.c @@ -0,0 +1,1592 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include + +#include + +#include +#include +#include + +#include "shell-app-private.h" +#include "shell-enum-types.h" +#include "shell-global.h" +#include "shell-util.h" +#include "shell-app-system-private.h" +#include "shell-window-tracker-private.h" +#include "st.h" +#include "gtkactionmuxer.h" +#include "org-gtk-application.h" + +#ifdef HAVE_SYSTEMD +#include +#include +#include +#endif + +/* This is mainly a memory usage optimization - the user is going to + * be running far fewer of the applications at one time than they have + * installed. But it also just helps keep the code more logically + * separated. + */ +typedef struct { + guint refcount; + + /* Signal connection to dirty window sort list on workspace changes */ + guint workspace_switch_id; + + GSList *windows; + + guint interesting_windows; + + /* Whether or not we need to resort the windows; this is done on demand */ + guint window_sort_stale : 1; + + /* See GApplication documentation */ + GtkActionMuxer *muxer; + char *unique_bus_name; + GDBusConnection *session; + + /* GDBus Proxy for getting application busy state */ + ShellOrgGtkApplication *application_proxy; + GCancellable *cancellable; + +} ShellAppRunningState; + +/** + * SECTION:shell-app + * @short_description: Object representing an application + * + * This object wraps a #GDesktopAppInfo, providing methods and signals + * primarily useful for running applications. + */ +struct _ShellApp +{ + GObject parent; + + int started_on_workspace; + + ShellAppState state; + + GDesktopAppInfo *info; /* If NULL, this app is backed by one or more + * MetaWindow. For purposes of app title + * etc., we use the first window added, + * because it's most likely to be what we + * want (e.g. it will be of TYPE_NORMAL from + * the way shell-window-tracker.c works). + */ + + ShellAppRunningState *running_state; + + char *window_id_string; + char *name_collation_key; +}; + +enum { + PROP_0, + PROP_STATE, + PROP_BUSY, + PROP_ID, + PROP_DBUS_ID, + PROP_ACTION_GROUP, + PROP_APP_INFO +}; + +enum { + WINDOWS_CHANGED, + LAST_SIGNAL +}; + +static guint shell_app_signals[LAST_SIGNAL] = { 0 }; + +static void create_running_state (ShellApp *app); +static void unref_running_state (ShellAppRunningState *state); + +G_DEFINE_TYPE (ShellApp, shell_app, G_TYPE_OBJECT) + +static void +shell_app_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ShellApp *app = SHELL_APP (gobject); + + switch (prop_id) + { + case PROP_STATE: + g_value_set_enum (value, app->state); + break; + case PROP_BUSY: + g_value_set_boolean (value, shell_app_get_busy (app)); + break; + case PROP_ID: + g_value_set_string (value, shell_app_get_id (app)); + break; + case PROP_ACTION_GROUP: + if (app->running_state) + g_value_set_object (value, app->running_state->muxer); + break; + case PROP_APP_INFO: + if (app->info) + g_value_set_object (value, app->info); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +shell_app_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ShellApp *app = SHELL_APP (gobject); + + switch (prop_id) + { + case PROP_APP_INFO: + _shell_app_set_app_info (app, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +const char * +shell_app_get_id (ShellApp *app) +{ + if (app->info) + return g_app_info_get_id (G_APP_INFO (app->info)); + return app->window_id_string; +} + +static MetaWindow * +window_backed_app_get_window (ShellApp *app) +{ + g_assert (app->info == NULL); + if (app->running_state) + { + g_assert (app->running_state->windows); + return app->running_state->windows->data; + } + else + return NULL; +} + +static ClutterActor * +window_backed_app_get_icon (ShellApp *app, + int size) +{ + MetaWindow *window = NULL; + StWidget *widget; + gint scale; + ShellGlobal *global; + StThemeContext *context; + + global = shell_global_get (); + context = st_theme_context_get_for_stage (shell_global_get_stage (global)); + g_object_get (context, "scale-factor", &scale, NULL); + + size *= scale; + + /* During a state transition from running to not-running for + * window-backend apps, it's possible we get a request for the icon. + * Avoid asserting here and just return an empty image. + */ + if (app->running_state != NULL) + window = window_backed_app_get_window (app); + + if (window == NULL) + { + ClutterActor *actor; + + actor = clutter_actor_new (); + g_object_set (actor, "opacity", 0, "width", (float) size, "height", (float) size, NULL); + return actor; + } + + widget = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (), + G_OBJECT (window), + "icon", + size); + st_widget_add_style_class_name (widget, "fallback-app-icon"); + + return CLUTTER_ACTOR (widget); +} + +/** + * shell_app_create_icon_texture: + * + * Look up the icon for this application, and create a #ClutterTexture + * for it at the given size. + * + * Return value: (transfer none): A floating #ClutterActor + */ +ClutterActor * +shell_app_create_icon_texture (ShellApp *app, + int size) +{ + GIcon *icon; + ClutterActor *ret; + + if (app->info == NULL) + return window_backed_app_get_icon (app, size); + + ret = st_icon_new (); + st_icon_set_icon_size (ST_ICON (ret), size); + st_icon_set_fallback_icon_name (ST_ICON (ret), "application-x-executable"); + + icon = g_app_info_get_icon (G_APP_INFO (app->info)); + st_icon_set_gicon (ST_ICON (ret), icon); + + return ret; +} + +const char * +shell_app_get_name (ShellApp *app) +{ + if (app->info) + return g_app_info_get_name (G_APP_INFO (app->info)); + else + { + MetaWindow *window = window_backed_app_get_window (app); + const char *name = NULL; + + if (window) + name = meta_window_get_wm_class (window); + if (!name) + name = C_("program", "Unknown"); + return name; + } +} + +const char * +shell_app_get_description (ShellApp *app) +{ + if (app->info) + return g_app_info_get_description (G_APP_INFO (app->info)); + else + return NULL; +} + +/** + * shell_app_is_window_backed: + * + * A window backed application is one which represents just an open + * window, i.e. there's no .desktop file assocation, so we don't know + * how to launch it again. + */ +gboolean +shell_app_is_window_backed (ShellApp *app) +{ + return app->info == NULL; +} + +typedef struct { + MetaWorkspace *workspace; + GSList **transients; +} CollectTransientsData; + +static gboolean +collect_transients_on_workspace (MetaWindow *window, + gpointer datap) +{ + CollectTransientsData *data = datap; + + if (data->workspace && meta_window_get_workspace (window) != data->workspace) + return TRUE; + + *data->transients = g_slist_prepend (*data->transients, window); + return TRUE; +} + +/* The basic idea here is that when we're targeting a window, + * if it has transients we want to pick the most recent one + * the user interacted with. + * This function makes raising GEdit with the file chooser + * open work correctly. + */ +static MetaWindow * +find_most_recent_transient_on_same_workspace (MetaDisplay *display, + MetaWindow *reference) +{ + GSList *transients, *transients_sorted, *iter; + MetaWindow *result; + CollectTransientsData data; + + transients = NULL; + data.workspace = meta_window_get_workspace (reference); + data.transients = &transients; + + meta_window_foreach_transient (reference, collect_transients_on_workspace, &data); + + transients_sorted = meta_display_sort_windows_by_stacking (display, transients); + /* Reverse this so we're top-to-bottom (yes, we should probably change the order + * returned from the sort_windows_by_stacking function) + */ + transients_sorted = g_slist_reverse (transients_sorted); + g_slist_free (transients); + transients = NULL; + + result = NULL; + for (iter = transients_sorted; iter; iter = iter->next) + { + MetaWindow *window = iter->data; + MetaWindowType wintype = meta_window_get_window_type (window); + + /* Don't want to focus UTILITY types, like the Gimp toolbars */ + if (wintype == META_WINDOW_NORMAL || + wintype == META_WINDOW_DIALOG) + { + result = window; + break; + } + } + g_slist_free (transients_sorted); + return result; +} + +static MetaWorkspace * +get_active_workspace (void) +{ + ShellGlobal *global = shell_global_get (); + MetaDisplay *display = shell_global_get_display (global); + MetaWorkspaceManager *workspace_manager = + meta_display_get_workspace_manager (display); + + return meta_workspace_manager_get_active_workspace (workspace_manager); +} + +/** + * shell_app_activate_window: + * @app: a #ShellApp + * @window: (nullable): Window to be focused + * @timestamp: Event timestamp + * + * Bring all windows for the given app to the foreground, + * but ensure that @window is on top. If @window is %NULL, + * the window with the most recent user time for the app + * will be used. + * + * This function has no effect if @app is not currently running. + */ +void +shell_app_activate_window (ShellApp *app, + MetaWindow *window, + guint32 timestamp) +{ + GSList *windows; + + if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING) + return; + + windows = shell_app_get_windows (app); + if (window == NULL && windows) + window = windows->data; + + if (!g_slist_find (windows, window)) + return; + else + { + GSList *windows_reversed, *iter; + ShellGlobal *global = shell_global_get (); + MetaDisplay *display = shell_global_get_display (global); + MetaWorkspace *active = get_active_workspace (); + MetaWorkspace *workspace = meta_window_get_workspace (window); + guint32 last_user_timestamp = meta_display_get_last_user_time (display); + MetaWindow *most_recent_transient; + + if (meta_display_xserver_time_is_before (display, timestamp, last_user_timestamp)) + { + meta_window_set_demands_attention (window); + return; + } + + /* Now raise all the other windows for the app that are on + * the same workspace, in reverse order to preserve the stacking. + */ + windows_reversed = g_slist_copy (windows); + windows_reversed = g_slist_reverse (windows_reversed); + for (iter = windows_reversed; iter; iter = iter->next) + { + MetaWindow *other_window = iter->data; + + if (other_window != window && meta_window_get_workspace (other_window) == workspace) + meta_window_raise (other_window); + } + g_slist_free (windows_reversed); + + /* If we have a transient that the user's interacted with more recently than + * the window, pick that. + */ + most_recent_transient = find_most_recent_transient_on_same_workspace (display, window); + if (most_recent_transient + && meta_display_xserver_time_is_before (display, + meta_window_get_user_time (window), + meta_window_get_user_time (most_recent_transient))) + window = most_recent_transient; + + + if (active != workspace) + meta_workspace_activate_with_focus (workspace, window, timestamp); + else + meta_window_activate (window, timestamp); + } +} + + +void +shell_app_update_window_actions (ShellApp *app, MetaWindow *window) +{ + const char *object_path; + + object_path = meta_window_get_gtk_window_object_path (window); + if (object_path != NULL) + { + GActionGroup *actions; + + actions = g_object_get_data (G_OBJECT (window), "actions"); + if (actions == NULL) + { + actions = G_ACTION_GROUP (g_dbus_action_group_get (app->running_state->session, + meta_window_get_gtk_unique_bus_name (window), + object_path)); + g_object_set_data_full (G_OBJECT (window), "actions", actions, g_object_unref); + } + + g_assert (app->running_state->muxer); + gtk_action_muxer_insert (app->running_state->muxer, "win", actions); + g_object_notify (G_OBJECT (app), "action-group"); + } +} + +/** + * shell_app_activate: + * @app: a #ShellApp + * + * Like shell_app_activate_full(), but using the default workspace and + * event timestamp. + */ +void +shell_app_activate (ShellApp *app) +{ + return shell_app_activate_full (app, -1, 0); +} + +/** + * shell_app_activate_full: + * @app: a #ShellApp + * @workspace: launch on this workspace, or -1 for default. Ignored if + * activating an existing window + * @timestamp: Event timestamp + * + * Perform an appropriate default action for operating on this application, + * dependent on its current state. For example, if the application is not + * currently running, launch it. If it is running, activate the most + * recently used NORMAL window (or if that window has a transient, the most + * recently used transient for that window). + */ +void +shell_app_activate_full (ShellApp *app, + int workspace, + guint32 timestamp) +{ + ShellGlobal *global; + + global = shell_global_get (); + + if (timestamp == 0) + timestamp = shell_global_get_current_time (global); + + switch (app->state) + { + case SHELL_APP_STATE_STOPPED: + { + GError *error = NULL; + if (!shell_app_launch (app, timestamp, workspace, FALSE, &error)) + { + char *msg; + msg = g_strdup_printf (_("Failed to launch “%s”"), shell_app_get_name (app)); + shell_global_notify_error (global, + msg, + error->message); + g_free (msg); + g_clear_error (&error); + } + } + break; + case SHELL_APP_STATE_STARTING: + break; + case SHELL_APP_STATE_RUNNING: + shell_app_activate_window (app, NULL, timestamp); + break; + default: + g_assert_not_reached(); + break; + } +} + +/** + * shell_app_open_new_window: + * @app: a #ShellApp + * @workspace: open on this workspace, or -1 for default + * + * Request that the application create a new window. + */ +void +shell_app_open_new_window (ShellApp *app, + int workspace) +{ + GActionGroup *group = NULL; + const char * const *actions; + + g_return_if_fail (app->info != NULL); + + /* First check whether the application provides a "new-window" desktop + * action - it is a safe bet that it will open a new window, and activating + * it will trigger startup notification if necessary + */ + actions = g_desktop_app_info_list_actions (G_DESKTOP_APP_INFO (app->info)); + + if (g_strv_contains (actions, "new-window")) + { + shell_app_launch_action (app, "new-window", 0, workspace); + return; + } + + /* Next, check whether the app exports an explicit "new-window" action + * that we can activate on the bus - the muxer will add startup notification + * information to the platform data, so this should work just as well as + * desktop actions. + */ + group = app->running_state ? G_ACTION_GROUP (app->running_state->muxer) + : NULL; + + if (group && + g_action_group_has_action (group, "app.new-window") && + g_action_group_get_action_parameter_type (group, "app.new-window") == NULL) + { + g_action_group_activate_action (group, "app.new-window", NULL); + + return; + } + + /* Lastly, just always launch the application again, even if we know + * it was already running. For most applications this + * should have the effect of creating a new window, whether that's + * a second process (in the case of Calculator) or IPC to existing + * instance (Firefox). There are a few less-sensical cases such + * as say Pidgin. + */ + shell_app_launch (app, 0, workspace, FALSE, NULL); +} + +/** + * shell_app_can_open_new_window: + * @app: a #ShellApp + * + * Returns %TRUE if the app supports opening a new window through + * shell_app_open_new_window() (ie, if calling that function will + * result in actually opening a new window and not something else, + * like presenting the most recently active one) + */ +gboolean +shell_app_can_open_new_window (ShellApp *app) +{ + ShellAppRunningState *state; + MetaWindow *window; + + /* Apps that are not running can always open new windows, because + activating them would open the first one */ + if (!app->running_state) + return TRUE; + + state = app->running_state; + + /* If the app has an explicit new-window action, then it can + (or it should be able to) ... + */ + if (g_action_group_has_action (G_ACTION_GROUP (state->muxer), "app.new-window")) + return TRUE; + + /* If the app doesn't have a desktop file, then nothing is possible */ + if (!app->info) + return FALSE; + + /* If the app is explicitly telling us, then we know for sure */ + if (g_desktop_app_info_has_key (G_DESKTOP_APP_INFO (app->info), + "X-GNOME-SingleWindow")) + return !g_desktop_app_info_get_boolean (G_DESKTOP_APP_INFO (app->info), + "X-GNOME-SingleWindow"); + + /* If this is a unique GtkApplication, and we don't have a new-window, then + probably we can't + + We don't consider non-unique GtkApplications here to handle cases like + evince, which don't export a new-window action because each window is in + a different process. In any case, in a non-unique GtkApplication each + Activate() knows nothing about the other instances, so it will show a + new window. + */ + + window = state->windows->data; + + if (state->unique_bus_name != NULL && + meta_window_get_gtk_application_object_path (window) != NULL) + { + if (meta_window_get_gtk_application_id (window) != NULL) + return FALSE; + else + return TRUE; + } + + /* In all other cases, we don't have a reliable source of information + or a decent heuristic, so we err on the compatibility side and say + yes. + */ + return TRUE; +} + +/** + * shell_app_get_state: + * @app: a #ShellApp + * + * Returns: State of the application + */ +ShellAppState +shell_app_get_state (ShellApp *app) +{ + return app->state; +} + +typedef struct { + ShellApp *app; + MetaWorkspace *active_workspace; +} CompareWindowsData; + +static int +shell_app_compare_windows (gconstpointer a, + gconstpointer b, + gpointer datap) +{ + MetaWindow *win_a = (gpointer)a; + MetaWindow *win_b = (gpointer)b; + CompareWindowsData *data = datap; + gboolean ws_a, ws_b; + gboolean vis_a, vis_b; + + ws_a = meta_window_get_workspace (win_a) == data->active_workspace; + ws_b = meta_window_get_workspace (win_b) == data->active_workspace; + + if (ws_a && !ws_b) + return -1; + else if (!ws_a && ws_b) + return 1; + + vis_a = meta_window_showing_on_its_workspace (win_a); + vis_b = meta_window_showing_on_its_workspace (win_b); + + if (vis_a && !vis_b) + return -1; + else if (!vis_a && vis_b) + return 1; + + return meta_window_get_user_time (win_b) - meta_window_get_user_time (win_a); +} + +/** + * shell_app_get_windows: + * @app: + * + * Get the windows which are associated with this application. The + * returned list will be sorted first by whether they're on the + * active workspace, then by whether they're visible, and finally + * by the time the user last interacted with them. + * + * Returns: (transfer none) (element-type MetaWindow): List of windows + */ +GSList * +shell_app_get_windows (ShellApp *app) +{ + if (app->running_state == NULL) + return NULL; + + if (app->running_state->window_sort_stale) + { + CompareWindowsData data; + data.app = app; + data.active_workspace = get_active_workspace (); + app->running_state->windows = g_slist_sort_with_data (app->running_state->windows, shell_app_compare_windows, &data); + app->running_state->window_sort_stale = FALSE; + } + + return app->running_state->windows; +} + +guint +shell_app_get_n_windows (ShellApp *app) +{ + if (app->running_state == NULL) + return 0; + return g_slist_length (app->running_state->windows); +} + +gboolean +shell_app_is_on_workspace (ShellApp *app, + MetaWorkspace *workspace) +{ + GSList *iter; + + if (shell_app_get_state (app) == SHELL_APP_STATE_STARTING) + { + if (app->started_on_workspace == -1 || + meta_workspace_index (workspace) == app->started_on_workspace) + return TRUE; + else + return FALSE; + } + + if (app->running_state == NULL) + return FALSE; + + for (iter = app->running_state->windows; iter; iter = iter->next) + { + if (meta_window_get_workspace (iter->data) == workspace) + return TRUE; + } + + return FALSE; +} + +static int +shell_app_get_last_user_time (ShellApp *app) +{ + GSList *iter; + guint32 last_user_time; + + last_user_time = 0; + + if (app->running_state != NULL) + { + for (iter = app->running_state->windows; iter; iter = iter->next) + last_user_time = MAX (last_user_time, meta_window_get_user_time (iter->data)); + } + + return (int)last_user_time; +} + +static gboolean +shell_app_is_minimized (ShellApp *app) +{ + GSList *iter; + + if (app->running_state == NULL) + return FALSE; + + for (iter = app->running_state->windows; iter; iter = iter->next) + { + if (meta_window_showing_on_its_workspace (iter->data)) + return FALSE; + } + + return TRUE; +} + +/** + * shell_app_compare: + * @app: + * @other: A #ShellApp + * + * Compare one #ShellApp instance to another, in the following way: + * - Running applications sort before not-running applications. + * - If one of them has non-minimized windows and the other does not, + * the one with visible windows is first. + * - Finally, the application which the user interacted with most recently + * compares earlier. + */ +int +shell_app_compare (ShellApp *app, + ShellApp *other) +{ + gboolean min_app, min_other; + + if (app->state != other->state) + { + if (app->state == SHELL_APP_STATE_RUNNING) + return -1; + return 1; + } + + min_app = shell_app_is_minimized (app); + min_other = shell_app_is_minimized (other); + + if (min_app != min_other) + { + if (min_other) + return -1; + return 1; + } + + if (app->state == SHELL_APP_STATE_RUNNING) + { + if (app->running_state->windows && !other->running_state->windows) + return -1; + else if (!app->running_state->windows && other->running_state->windows) + return 1; + + return shell_app_get_last_user_time (other) - shell_app_get_last_user_time (app); + } + + return 0; +} + +ShellApp * +_shell_app_new_for_window (MetaWindow *window) +{ + ShellApp *app; + + app = g_object_new (SHELL_TYPE_APP, NULL); + + app->window_id_string = g_strdup_printf ("window:%d", meta_window_get_stable_sequence (window)); + + _shell_app_add_window (app, window); + + return app; +} + +ShellApp * +_shell_app_new (GDesktopAppInfo *info) +{ + ShellApp *app; + + app = g_object_new (SHELL_TYPE_APP, + "app-info", info, + NULL); + + return app; +} + +void +_shell_app_set_app_info (ShellApp *app, + GDesktopAppInfo *info) +{ + g_set_object (&app->info, info); + + g_clear_pointer (&app->name_collation_key, g_free); + if (app->info) + app->name_collation_key = g_utf8_collate_key (shell_app_get_name (app), -1); +} + +static void +shell_app_state_transition (ShellApp *app, + ShellAppState state) +{ + if (app->state == state) + return; + g_return_if_fail (!(app->state == SHELL_APP_STATE_RUNNING && + state == SHELL_APP_STATE_STARTING)); + app->state = state; + + _shell_app_system_notify_app_state_changed (shell_app_system_get_default (), app); + + g_object_notify (G_OBJECT (app), "state"); +} + +static void +shell_app_on_unmanaged (MetaWindow *window, + ShellApp *app) +{ + _shell_app_remove_window (app, window); +} + +static void +shell_app_on_user_time_changed (MetaWindow *window, + GParamSpec *pspec, + ShellApp *app) +{ + g_assert (app->running_state != NULL); + + /* Ideally we don't want to emit windows-changed if the sort order + * isn't actually changing. This check catches most of those. + */ + if (window != app->running_state->windows->data) + { + app->running_state->window_sort_stale = TRUE; + g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0); + } +} + +static void +shell_app_sync_running_state (ShellApp *app) +{ + g_return_if_fail (app->running_state != NULL); + + if (app->state != SHELL_APP_STATE_STARTING) + { + if (app->running_state->interesting_windows == 0) + shell_app_state_transition (app, SHELL_APP_STATE_STOPPED); + else + shell_app_state_transition (app, SHELL_APP_STATE_RUNNING); + } +} + + +static void +shell_app_on_skip_taskbar_changed (MetaWindow *window, + GParamSpec *pspec, + ShellApp *app) +{ + g_assert (app->running_state != NULL); + + /* we rely on MetaWindow:skip-taskbar only being notified + * when it actually changes; when that assumption breaks, + * we'll have to track the "interesting" windows themselves + */ + if (meta_window_is_skip_taskbar (window)) + app->running_state->interesting_windows--; + else + app->running_state->interesting_windows++; + + shell_app_sync_running_state (app); +} + +static void +shell_app_on_ws_switch (MetaWorkspaceManager *workspace_manager, + int from, + int to, + MetaMotionDirection direction, + gpointer data) +{ + ShellApp *app = SHELL_APP (data); + + g_assert (app->running_state != NULL); + + app->running_state->window_sort_stale = TRUE; + + g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0); +} + +gboolean +shell_app_get_busy (ShellApp *app) +{ + if (app->running_state != NULL && + app->running_state->application_proxy != NULL && + shell_org_gtk_application_get_busy (app->running_state->application_proxy)) + return TRUE; + + return FALSE; +} + +static void +busy_changed_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + ShellApp *app = user_data; + + g_assert (SHELL_IS_APP (app)); + + g_object_notify (G_OBJECT (app), "busy"); +} + +static void +get_application_proxy (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ShellApp *app = user_data; + ShellOrgGtkApplication *proxy; + + g_assert (SHELL_IS_APP (app)); + + proxy = shell_org_gtk_application_proxy_new_finish (result, NULL); + if (proxy != NULL) + { + app->running_state->application_proxy = proxy; + g_signal_connect (proxy, + "notify::busy", + G_CALLBACK (busy_changed_cb), + app); + if (shell_org_gtk_application_get_busy (proxy)) + g_object_notify (G_OBJECT (app), "busy"); + } + + if (app->running_state != NULL) + g_clear_object (&app->running_state->cancellable); + + g_object_unref (app); +} + +static void +shell_app_ensure_busy_watch (ShellApp *app) +{ + ShellAppRunningState *running_state = app->running_state; + MetaWindow *window; + const gchar *object_path; + + if (running_state->application_proxy != NULL || + running_state->cancellable != NULL) + return; + + if (running_state->unique_bus_name == NULL) + return; + + window = g_slist_nth_data (running_state->windows, 0); + object_path = meta_window_get_gtk_application_object_path (window); + + if (object_path == NULL) + return; + + running_state->cancellable = g_cancellable_new(); + /* Take a reference to app to make sure it isn't finalized before + get_application_proxy runs */ + shell_org_gtk_application_proxy_new (running_state->session, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, + running_state->unique_bus_name, + object_path, + running_state->cancellable, + get_application_proxy, + g_object_ref (app)); +} + +void +_shell_app_add_window (ShellApp *app, + MetaWindow *window) +{ + if (app->running_state && g_slist_find (app->running_state->windows, window)) + return; + + g_object_freeze_notify (G_OBJECT (app)); + + if (!app->running_state) + create_running_state (app); + + app->running_state->window_sort_stale = TRUE; + app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window)); + g_signal_connect_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0); + g_signal_connect_object (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app, 0); + g_signal_connect_object (window, "notify::skip-taskbar", G_CALLBACK(shell_app_on_skip_taskbar_changed), app, 0); + + shell_app_update_app_actions (app, window); + shell_app_ensure_busy_watch (app); + + if (!meta_window_is_skip_taskbar (window)) + app->running_state->interesting_windows++; + shell_app_sync_running_state (app); + + g_object_thaw_notify (G_OBJECT (app)); + + g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0); +} + +void +_shell_app_remove_window (ShellApp *app, + MetaWindow *window) +{ + g_assert (app->running_state != NULL); + + if (!g_slist_find (app->running_state->windows, window)) + return; + + g_signal_handlers_disconnect_by_func (window, G_CALLBACK(shell_app_on_unmanaged), app); + g_signal_handlers_disconnect_by_func (window, G_CALLBACK(shell_app_on_user_time_changed), app); + g_signal_handlers_disconnect_by_func (window, G_CALLBACK(shell_app_on_skip_taskbar_changed), app); + g_object_unref (window); + app->running_state->windows = g_slist_remove (app->running_state->windows, window); + + if (!meta_window_is_skip_taskbar (window)) + app->running_state->interesting_windows--; + shell_app_sync_running_state (app); + + if (app->running_state->windows == NULL) + g_clear_pointer (&app->running_state, unref_running_state); + + g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0); +} + +/** + * shell_app_get_pids: + * @app: a #ShellApp + * + * Returns: (transfer container) (element-type int): An unordered list of process identifers associated with this application. + */ +GSList * +shell_app_get_pids (ShellApp *app) +{ + GSList *result; + GSList *iter; + + result = NULL; + for (iter = shell_app_get_windows (app); iter; iter = iter->next) + { + MetaWindow *window = iter->data; + int pid = meta_window_get_pid (window); + /* Note in the (by far) common case, app will only have one pid, so + * we'll hit the first element, so don't worry about O(N^2) here. + */ + if (!g_slist_find (result, GINT_TO_POINTER (pid))) + result = g_slist_prepend (result, GINT_TO_POINTER (pid)); + } + return result; +} + +void +_shell_app_handle_startup_sequence (ShellApp *app, + MetaStartupSequence *sequence) +{ + gboolean starting = !meta_startup_sequence_get_completed (sequence); + + /* The Shell design calls for on application launch, the app title + * appears at top, and no X window is focused. So when we get + * a startup-notification for this app, transition it to STARTING + * if it's currently stopped, set it as our application focus, + * but focus the no_focus window. + */ + if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED) + { + MetaDisplay *display = shell_global_get_display (shell_global_get ()); + MetaX11Display *x11_display = meta_display_get_x11_display (display); + + shell_app_state_transition (app, SHELL_APP_STATE_STARTING); + meta_x11_display_focus_the_no_focus_window (x11_display, + meta_startup_sequence_get_timestamp (sequence)); + app->started_on_workspace = meta_startup_sequence_get_workspace (sequence); + } + + if (!starting) + { + if (app->running_state && app->running_state->windows) + shell_app_state_transition (app, SHELL_APP_STATE_RUNNING); + else /* application have > 1 .desktop file */ + shell_app_state_transition (app, SHELL_APP_STATE_STOPPED); + } +} + +/** + * shell_app_request_quit: + * @app: A #ShellApp + * + * Initiate an asynchronous request to quit this application. + * The application may interact with the user, and the user + * might cancel the quit request from the application UI. + * + * This operation may not be supported for all applications. + * + * Returns: %TRUE if a quit request is supported for this application + */ +gboolean +shell_app_request_quit (ShellApp *app) +{ + GActionGroup *group = NULL; + GSList *iter; + + if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING) + return FALSE; + + /* First, check whether the app exports an explicit "quit" action + * that we can activate on the bus + */ + group = G_ACTION_GROUP (app->running_state->muxer); + + if (g_action_group_has_action (group, "app.quit") && + g_action_group_get_action_parameter_type (group, "app.quit") == NULL) + { + g_action_group_activate_action (group, "app.quit", NULL); + + return TRUE; + } + + /* Otherwise, fall back to closing all the app's windows */ + for (iter = app->running_state->windows; iter; iter = iter->next) + { + MetaWindow *win = iter->data; + + if (!meta_window_can_close (win)) + continue; + + meta_window_delete (win, shell_global_get_current_time (shell_global_get ())); + } + return TRUE; +} + +#if !defined(HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS) && defined(HAVE_SYSTEMD) +/* This sets up the launched application to log to the journal + * using its own identifier, instead of just "gnome-session". + */ +static void +app_child_setup (gpointer user_data) +{ + const char *appid = user_data; + int res; + int journalfd = sd_journal_stream_fd (appid, LOG_INFO, FALSE); + if (journalfd >= 0) + { + do + res = dup2 (journalfd, 1); + while (G_UNLIKELY (res == -1 && errno == EINTR)); + do + res = dup2 (journalfd, 2); + while (G_UNLIKELY (res == -1 && errno == EINTR)); + (void) close (journalfd); + } +} +#endif + +static void +wait_pid (GDesktopAppInfo *appinfo, + GPid pid, + gpointer user_data) +{ + g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL); +} + +/** + * shell_app_launch: + * @timestamp: Event timestamp, or 0 for current event timestamp + * @workspace: Start on this workspace, or -1 for default + * @discrete_gpu: Whether to start on the discrete GPU + * @error: A #GError + */ +gboolean +shell_app_launch (ShellApp *app, + guint timestamp, + int workspace, + gboolean discrete_gpu, + GError **error) +{ + ShellGlobal *global; + GAppLaunchContext *context; + gboolean ret; + GSpawnFlags flags; + + if (app->info == NULL) + { + MetaWindow *window = window_backed_app_get_window (app); + /* We don't use an error return if there no longer any windows, because the + * user attempting to activate a stale window backed app isn't something + * we would expect the caller to meaningfully handle or display an error + * message to the user. + */ + if (window) + meta_window_activate (window, timestamp); + return TRUE; + } + + global = shell_global_get (); + context = shell_global_create_app_launch_context (global, timestamp, workspace); + if (discrete_gpu) + g_app_launch_context_setenv (context, "DRI_PRIME", "1"); + + /* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn + * codepath. The shell's open file descriptors should be marked CLOEXEC + * so that they are automatically closed even with this flag set. + */ + flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD | + G_SPAWN_LEAVE_DESCRIPTORS_OPEN; + +#ifdef HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS + /* Optimized spawn path, avoiding a child_setup function */ + { + int journalfd = -1; + +#ifdef HAVE_SYSTEMD + journalfd = sd_journal_stream_fd (shell_app_get_id (app), LOG_INFO, FALSE); +#endif /* HAVE_SYSTEMD */ + + ret = g_desktop_app_info_launch_uris_as_manager_with_fds (app->info, NULL, + context, + flags, + NULL, NULL, + wait_pid, NULL, + -1, + journalfd, + journalfd, + error); + + if (journalfd >= 0) + (void) close (journalfd); + } +#else /* !HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS */ + ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL, + context, + flags, +#ifdef HAVE_SYSTEMD + app_child_setup, (gpointer)shell_app_get_id (app), +#else + NULL, NULL, +#endif + wait_pid, NULL, + error); +#endif /* HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS */ + g_object_unref (context); + + return ret; +} + +/** + * shell_app_launch_action: + * @app: the #ShellApp + * @action_name: the name of the action to launch (as obtained by + * g_desktop_app_info_list_actions()) + * @timestamp: Event timestamp, or 0 for current event timestamp + * @workspace: Start on this workspace, or -1 for default + */ +void +shell_app_launch_action (ShellApp *app, + const char *action_name, + guint timestamp, + int workspace) +{ + ShellGlobal *global; + GAppLaunchContext *context; + + global = shell_global_get (); + context = shell_global_create_app_launch_context (global, timestamp, workspace); + + g_desktop_app_info_launch_action (G_DESKTOP_APP_INFO (app->info), + action_name, context); + + g_object_unref (context); +} + +/** + * shell_app_get_app_info: + * @app: a #ShellApp + * + * Returns: (transfer none): The #GDesktopAppInfo for this app, or %NULL if backed by a window + */ +GDesktopAppInfo * +shell_app_get_app_info (ShellApp *app) +{ + return app->info; +} + +static void +create_running_state (ShellApp *app) +{ + MetaDisplay *display = shell_global_get_display (shell_global_get ()); + MetaWorkspaceManager *workspace_manager = + meta_display_get_workspace_manager (display); + + g_assert (app->running_state == NULL); + + app->running_state = g_slice_new0 (ShellAppRunningState); + app->running_state->refcount = 1; + app->running_state->workspace_switch_id = + g_signal_connect (workspace_manager, "workspace-switched", + G_CALLBACK (shell_app_on_ws_switch), app); + + app->running_state->session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (app->running_state->session != NULL); + app->running_state->muxer = gtk_action_muxer_new (); +} + +void +shell_app_update_app_actions (ShellApp *app, + MetaWindow *window) +{ + const gchar *unique_bus_name; + + /* We assume that 'gtk-application-object-path' and + * 'gtk-app-menu-object-path' are the same for all windows which + * have it set. + * + * It could be possible, however, that the first window we see + * belonging to the app didn't have them set. For this reason, we + * take the values from the first window that has them set and ignore + * all the rest (until the app is stopped and restarted). + */ + + unique_bus_name = meta_window_get_gtk_unique_bus_name (window); + + if (g_strcmp0 (app->running_state->unique_bus_name, unique_bus_name) != 0) + { + const gchar *application_object_path; + GDBusActionGroup *actions; + + application_object_path = meta_window_get_gtk_application_object_path (window); + + if (application_object_path == NULL || unique_bus_name == NULL) + return; + + g_clear_pointer (&app->running_state->unique_bus_name, g_free); + app->running_state->unique_bus_name = g_strdup (unique_bus_name); + actions = g_dbus_action_group_get (app->running_state->session, unique_bus_name, application_object_path); + gtk_action_muxer_insert (app->running_state->muxer, "app", G_ACTION_GROUP (actions)); + g_object_unref (actions); + } +} + +static void +unref_running_state (ShellAppRunningState *state) +{ + MetaDisplay *display = shell_global_get_display (shell_global_get ()); + MetaWorkspaceManager *workspace_manager = + meta_display_get_workspace_manager (display); + + g_assert (state->refcount > 0); + + state->refcount--; + if (state->refcount > 0) + return; + + g_signal_handler_disconnect (workspace_manager, state->workspace_switch_id); + + g_clear_object (&state->application_proxy); + + if (state->cancellable != NULL) + { + g_cancellable_cancel (state->cancellable); + g_clear_object (&state->cancellable); + } + + g_clear_object (&state->muxer); + g_clear_object (&state->session); + g_clear_pointer (&state->unique_bus_name, g_free); + + g_slice_free (ShellAppRunningState, state); +} + +/** + * shell_app_compare_by_name: + * @app: One app + * @other: The other app + * + * Order two applications by name. + * + * Returns: -1, 0, or 1; suitable for use as a comparison function + * for e.g. g_slist_sort() + */ +int +shell_app_compare_by_name (ShellApp *app, ShellApp *other) +{ + return strcmp (app->name_collation_key, other->name_collation_key); +} + +static void +shell_app_init (ShellApp *self) +{ + self->state = SHELL_APP_STATE_STOPPED; +} + +static void +shell_app_dispose (GObject *object) +{ + ShellApp *app = SHELL_APP (object); + + g_clear_object (&app->info); + + while (app->running_state) + _shell_app_remove_window (app, app->running_state->windows->data); + + /* We should have been transitioned when we removed all of our windows */ + g_assert (app->state == SHELL_APP_STATE_STOPPED); + g_assert (app->running_state == NULL); + + G_OBJECT_CLASS(shell_app_parent_class)->dispose (object); +} + +static void +shell_app_finalize (GObject *object) +{ + ShellApp *app = SHELL_APP (object); + + g_free (app->window_id_string); + + g_free (app->name_collation_key); + + G_OBJECT_CLASS(shell_app_parent_class)->finalize (object); +} + +static void +shell_app_class_init(ShellAppClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = shell_app_get_property; + gobject_class->set_property = shell_app_set_property; + gobject_class->dispose = shell_app_dispose; + gobject_class->finalize = shell_app_finalize; + + shell_app_signals[WINDOWS_CHANGED] = g_signal_new ("windows-changed", + SHELL_TYPE_APP, + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + /** + * ShellApp:state: + * + * The high-level state of the application, effectively whether it's + * running or not, or transitioning between those states. + */ + g_object_class_install_property (gobject_class, + PROP_STATE, + g_param_spec_enum ("state", + "State", + "Application state", + SHELL_TYPE_APP_STATE, + SHELL_APP_STATE_STOPPED, + G_PARAM_READABLE)); + + /** + * ShellApp:busy: + * + * Whether the application has marked itself as busy. + */ + g_object_class_install_property (gobject_class, + PROP_BUSY, + g_param_spec_boolean ("busy", + "Busy", + "Busy state", + FALSE, + G_PARAM_READABLE)); + + /** + * ShellApp:id: + * + * The id of this application (a desktop filename, or a special string + * like window:0xabcd1234) + */ + g_object_class_install_property (gobject_class, + PROP_ID, + g_param_spec_string ("id", + "Application id", + "The desktop file id of this ShellApp", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * ShellApp:action-group: + * + * The #GDBusActionGroup associated with this ShellApp, if any. See the + * documentation of #GApplication and #GActionGroup for details. + */ + g_object_class_install_property (gobject_class, + PROP_ACTION_GROUP, + g_param_spec_object ("action-group", + "Application Action Group", + "The action group exported by the remote application", + G_TYPE_ACTION_GROUP, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * ShellApp:app-info: + * + * The #GDesktopAppInfo associated with this ShellApp, if any. + */ + g_object_class_install_property (gobject_class, + PROP_APP_INFO, + g_param_spec_object ("app-info", + "DesktopAppInfo", + "The DesktopAppInfo associated with this app", + G_TYPE_DESKTOP_APP_INFO, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + +} diff --git a/src/shell-app.h b/src/shell-app.h new file mode 100644 index 0000000..8a09b64 --- /dev/null +++ b/src/shell-app.h @@ -0,0 +1,76 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_APP_H__ +#define __SHELL_APP_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define SHELL_TYPE_APP (shell_app_get_type ()) +G_DECLARE_FINAL_TYPE (ShellApp, shell_app, SHELL, APP, GObject) + +typedef enum { + SHELL_APP_STATE_STOPPED, + SHELL_APP_STATE_STARTING, + SHELL_APP_STATE_RUNNING +} ShellAppState; + +const char *shell_app_get_id (ShellApp *app); + +GDesktopAppInfo *shell_app_get_app_info (ShellApp *app); + +ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size); +const char *shell_app_get_name (ShellApp *app); +const char *shell_app_get_description (ShellApp *app); +gboolean shell_app_is_window_backed (ShellApp *app); + +void shell_app_activate_window (ShellApp *app, MetaWindow *window, guint32 timestamp); + +void shell_app_activate (ShellApp *app); + +void shell_app_activate_full (ShellApp *app, + int workspace, + guint32 timestamp); + +void shell_app_open_new_window (ShellApp *app, + int workspace); +gboolean shell_app_can_open_new_window (ShellApp *app); + +ShellAppState shell_app_get_state (ShellApp *app); + +gboolean shell_app_request_quit (ShellApp *app); + +guint shell_app_get_n_windows (ShellApp *app); + +GSList *shell_app_get_windows (ShellApp *app); + +GSList *shell_app_get_pids (ShellApp *app); + +gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace); + +gboolean shell_app_launch (ShellApp *app, + guint timestamp, + int workspace, + gboolean discrete_gpu, + GError **error); + +void shell_app_launch_action (ShellApp *app, + const char *action_name, + guint timestamp, + int workspace); + +int shell_app_compare_by_name (ShellApp *app, ShellApp *other); + +int shell_app_compare (ShellApp *app, ShellApp *other); + +void shell_app_update_window_actions (ShellApp *app, MetaWindow *window); +void shell_app_update_app_actions (ShellApp *app, MetaWindow *window); + +gboolean shell_app_get_busy (ShellApp *app); + +G_END_DECLS + +#endif /* __SHELL_APP_H__ */ diff --git a/src/shell-embedded-window-private.h b/src/shell-embedded-window-private.h new file mode 100644 index 0000000..5714af9 --- /dev/null +++ b/src/shell-embedded-window-private.h @@ -0,0 +1,20 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_EMBEDDED_WINDOW_PRIVATE_H__ +#define __SHELL_EMBEDDED_WINDOW_PRIVATE_H__ + +#include "shell-embedded-window.h" +#include "shell-gtk-embed.h" + +void _shell_embedded_window_set_actor (ShellEmbeddedWindow *window, + ShellGtkEmbed *embed); + +void _shell_embedded_window_allocate (ShellEmbeddedWindow *window, + int x, + int y, + int width, + int height); + +void _shell_embedded_window_map (ShellEmbeddedWindow *window); +void _shell_embedded_window_unmap (ShellEmbeddedWindow *window); + +#endif /* __SHELL_EMBEDDED_WINDOW_PRIVATE_H__ */ diff --git a/src/shell-embedded-window.c b/src/shell-embedded-window.c new file mode 100644 index 0000000..3719577 --- /dev/null +++ b/src/shell-embedded-window.c @@ -0,0 +1,248 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include +#include + +#include "shell-embedded-window-private.h" + +/* This type is a subclass of GtkWindow that ties the window to a + * ShellGtkEmbed; the resizing logic is bound to the clutter logic. + * + * The typical usage we might expect is + * + * - ShellEmbeddedWindow is created and filled with content + * - ShellEmbeddedWindow is shown with gtk_widget_show_all() + * - ShellGtkEmbed is created for the ShellEmbeddedWindow + * - actor is added to a stage + * + * The way it works is that the GtkWindow is mapped if and only if both: + * + * - gtk_widget_visible (window) [widget has been shown] + * - Actor is mapped [actor and all parents visible, actor in stage] + */ + +enum { + PROP_0 +}; + +typedef struct _ShellEmbeddedWindowPrivate ShellEmbeddedWindowPrivate; + +struct _ShellEmbeddedWindowPrivate { + ShellGtkEmbed *actor; + + GdkRectangle position; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ShellEmbeddedWindow, + shell_embedded_window, + GTK_TYPE_WINDOW); + +/* + * The normal gtk_window_show() starts all of the complicated asynchronous + * window resizing code running; we don't want or need any of that. + * Bypassing the normal code does mean that the extra geometry management + * available on GtkWindow: gridding, maximum sizes, etc, is ignored; we + * don't really want that anyways - we just want a way of embedding a + * GtkWidget into a Clutter stage. + */ +static void +shell_embedded_window_show (GtkWidget *widget) +{ + ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (widget); + ShellEmbeddedWindowPrivate *priv; + GtkWidgetClass *widget_class; + + priv = shell_embedded_window_get_instance_private (window); + + /* Skip GtkWindow, but run the default GtkWidget handling which + * marks the widget visible */ + widget_class = g_type_class_peek (GTK_TYPE_WIDGET); + widget_class->show (widget); + + if (priv->actor) + { + /* Size is 0x0 if the GtkWindow is not shown */ + clutter_actor_queue_relayout (CLUTTER_ACTOR (priv->actor)); + + if (clutter_actor_is_realized (CLUTTER_ACTOR (priv->actor))) + gtk_widget_map (widget); + } +} + +static void +shell_embedded_window_hide (GtkWidget *widget) +{ + ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (widget); + ShellEmbeddedWindowPrivate *priv; + + priv = shell_embedded_window_get_instance_private (window); + + if (priv->actor) + clutter_actor_queue_relayout (CLUTTER_ACTOR (priv->actor)); + + GTK_WIDGET_CLASS (shell_embedded_window_parent_class)->hide (widget); +} + +static gboolean +shell_embedded_window_configure_event (GtkWidget *widget, + GdkEventConfigure *event) +{ + /* Normally a configure event coming back from X triggers the + * resizing logic inside GtkWindow; we just ignore them + * since we are handling the resizing logic separately. + */ + return FALSE; +} + +static void +shell_embedded_window_check_resize (GtkContainer *container) +{ + ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (container); + ShellEmbeddedWindowPrivate *priv; + + priv = shell_embedded_window_get_instance_private (window); + + /* Check resize is called when a resize is queued on something + * inside the GtkWindow; we need to make sure that in response + * to this gtk_widget_size_request() and then + * gtk_widget_size_allocate() are called; we defer to the Clutter + * logic and assume it will do the right thing. + */ + if (priv->actor) + clutter_actor_queue_relayout (CLUTTER_ACTOR (priv->actor)); +} + +static GObject * +shell_embedded_window_constructor (GType gtype, + guint n_properties, + GObjectConstructParam *properties) +{ + GObject *object; + GObjectClass *parent_class; + + parent_class = G_OBJECT_CLASS (shell_embedded_window_parent_class); + object = parent_class->constructor (gtype, n_properties, properties); + + /* Setting the resize mode to immediate means that calling queue_resize() + * on a widget within the window will immmediately call check_resize() + * to be called, instead of having it queued to an idle. From our perspective, + * this is ideal since we just are going to queue a resize to Clutter's + * idle resize anyways. + */ + g_object_set (object, + "app-paintable", TRUE, + "resize-mode", GTK_RESIZE_IMMEDIATE, + "type", GTK_WINDOW_POPUP, + NULL); + + return object; +} + +static void +shell_embedded_window_class_init (ShellEmbeddedWindowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); + + object_class->constructor = shell_embedded_window_constructor; + + widget_class->show = shell_embedded_window_show; + widget_class->hide = shell_embedded_window_hide; + widget_class->configure_event = shell_embedded_window_configure_event; + + container_class->check_resize = shell_embedded_window_check_resize; +} + +static void +shell_embedded_window_init (ShellEmbeddedWindow *window) +{ +} + +/* + * Private routines called by ShellGtkEmbed + */ + +void +_shell_embedded_window_set_actor (ShellEmbeddedWindow *window, + ShellGtkEmbed *actor) + +{ + ShellEmbeddedWindowPrivate *priv; + + g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window)); + + priv = shell_embedded_window_get_instance_private (window); + priv->actor = actor; + + if (actor && + clutter_actor_is_mapped (CLUTTER_ACTOR (actor)) && + gtk_widget_get_visible (GTK_WIDGET (window))) + gtk_widget_map (GTK_WIDGET (window)); +} + +void +_shell_embedded_window_allocate (ShellEmbeddedWindow *window, + int x, + int y, + int width, + int height) +{ + ShellEmbeddedWindowPrivate *priv; + GtkAllocation allocation; + + g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window)); + + priv = shell_embedded_window_get_instance_private (window); + + if (priv->position.x == x && + priv->position.y == y && + priv->position.width == width && + priv->position.height == height) + return; + + priv->position.x = x; + priv->position.y = y; + priv->position.width = width; + priv->position.height = height; + + if (gtk_widget_get_realized (GTK_WIDGET (window))) + gdk_window_move_resize (gtk_widget_get_window (GTK_WIDGET (window)), + x, y, width, height); + + allocation.x = 0; + allocation.y = 0; + allocation.width = width; + allocation.height = height; + + gtk_widget_size_allocate (GTK_WIDGET (window), &allocation); +} + +void +_shell_embedded_window_map (ShellEmbeddedWindow *window) +{ + g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window)); + + if (gtk_widget_get_visible (GTK_WIDGET (window))) + gtk_widget_map (GTK_WIDGET (window)); +} + +void +_shell_embedded_window_unmap (ShellEmbeddedWindow *window) +{ + g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window)); + + gtk_widget_unmap (GTK_WIDGET (window)); +} + +/* + * Public API + */ +GtkWidget * +shell_embedded_window_new (void) +{ + return g_object_new (SHELL_TYPE_EMBEDDED_WINDOW, + NULL); +} diff --git a/src/shell-embedded-window.h b/src/shell-embedded-window.h new file mode 100644 index 0000000..835165b --- /dev/null +++ b/src/shell-embedded-window.h @@ -0,0 +1,19 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_EMBEDDED_WINDOW_H__ +#define __SHELL_EMBEDDED_WINDOW_H__ + +#include +#include + +#define SHELL_TYPE_EMBEDDED_WINDOW (shell_embedded_window_get_type ()) +G_DECLARE_DERIVABLE_TYPE (ShellEmbeddedWindow, shell_embedded_window, + SHELL, EMBEDDED_WINDOW, GtkWindow) + +struct _ShellEmbeddedWindowClass +{ + GtkWindowClass parent_class; +}; + +GtkWidget *shell_embedded_window_new (void); + +#endif /* __SHELL_EMBEDDED_WINDOW_H__ */ diff --git a/src/shell-global-private.h b/src/shell-global-private.h new file mode 100644 index 0000000..df53236 --- /dev/null +++ b/src/shell-global-private.h @@ -0,0 +1,21 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_GLOBAL_PRIVATE_H__ +#define __SHELL_GLOBAL_PRIVATE_H__ + +#include "shell-global.h" + +#include + +void _shell_global_init (const char *first_property_name, + ...); +void _shell_global_set_plugin (ShellGlobal *global, + MetaPlugin *plugin); + +void _shell_global_destroy_gjs_context (ShellGlobal *global); + +GjsContext *_shell_global_get_gjs_context (ShellGlobal *global); + +gboolean _shell_global_check_xdnd_event (ShellGlobal *global, + XEvent *xev); + +#endif /* __SHELL_GLOBAL_PRIVATE_H__ */ diff --git a/src/shell-global.c b/src/shell-global.c new file mode 100644 index 0000000..df84b6b --- /dev/null +++ b/src/shell-global.c @@ -0,0 +1,1733 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYSTEMD +#include +#include +#include +#endif + +/* Memory report bits */ +#ifdef HAVE_MALLINFO +#include +#endif + +#if defined __OpenBSD__ || defined __FreeBSD__ +#include +#endif + +#include "shell-enum-types.h" +#include "shell-global-private.h" +#include "shell-perf-log.h" +#include "shell-window-tracker.h" +#include "shell-wm.h" +#include "st.h" + +static ShellGlobal *the_object = NULL; + +struct _ShellGlobal { + GObject parent; + + ClutterStage *stage; + Window stage_xwindow; + + MetaDisplay *meta_display; + MetaWorkspaceManager *workspace_manager; + GdkDisplay *gdk_display; + MetaX11Display *x11_display; + Display *xdisplay; + + char *session_mode; + + XserverRegion input_region; + + GjsContext *js_context; + MetaPlugin *plugin; + ShellWM *wm; + GSettings *settings; + const char *datadir; + char *imagedir; + char *userdatadir; + GFile *userdatadir_path; + GFile *runtime_state_path; + + StFocusManager *focus_manager; + + guint work_count; + GSList *leisure_closures; + guint leisure_function_id; + + GHashTable *save_ops; + + gboolean has_modal; + gboolean frame_timestamps; + gboolean frame_finish_timestamp; +}; + +enum { + PROP_0, + + PROP_SESSION_MODE, + PROP_DISPLAY, + PROP_WORKSPACE_MANAGER, + PROP_SCREEN_WIDTH, + PROP_SCREEN_HEIGHT, + PROP_STAGE, + PROP_WINDOW_GROUP, + PROP_TOP_WINDOW_GROUP, + PROP_WINDOW_MANAGER, + PROP_SETTINGS, + PROP_DATADIR, + PROP_IMAGEDIR, + PROP_USERDATADIR, + PROP_FOCUS_MANAGER, + PROP_FRAME_TIMESTAMPS, + PROP_FRAME_FINISH_TIMESTAMP, +}; + +/* Signals */ +enum +{ + NOTIFY_ERROR, + LAST_SIGNAL +}; + +G_DEFINE_TYPE(ShellGlobal, shell_global, G_TYPE_OBJECT); + +static guint shell_global_signals [LAST_SIGNAL] = { 0 }; + +static void +shell_global_set_property(GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ShellGlobal *global = SHELL_GLOBAL (object); + + switch (prop_id) + { + case PROP_SESSION_MODE: + g_clear_pointer (&global->session_mode, g_free); + global->session_mode = g_ascii_strdown (g_value_get_string (value), -1); + break; + case PROP_FRAME_TIMESTAMPS: + global->frame_timestamps = g_value_get_boolean (value); + break; + case PROP_FRAME_FINISH_TIMESTAMP: + global->frame_finish_timestamp = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +shell_global_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ShellGlobal *global = SHELL_GLOBAL (object); + + switch (prop_id) + { + case PROP_SESSION_MODE: + g_value_set_string (value, shell_global_get_session_mode (global)); + break; + case PROP_DISPLAY: + g_value_set_object (value, global->meta_display); + break; + case PROP_WORKSPACE_MANAGER: + g_value_set_object (value, global->workspace_manager); + break; + case PROP_SCREEN_WIDTH: + { + int width, height; + + meta_display_get_size (global->meta_display, &width, &height); + g_value_set_int (value, width); + } + break; + case PROP_SCREEN_HEIGHT: + { + int width, height; + + meta_display_get_size (global->meta_display, &width, &height); + g_value_set_int (value, height); + } + break; + case PROP_STAGE: + g_value_set_object (value, global->stage); + break; + case PROP_WINDOW_GROUP: + g_value_set_object (value, meta_get_window_group_for_display (global->meta_display)); + break; + case PROP_TOP_WINDOW_GROUP: + g_value_set_object (value, meta_get_top_window_group_for_display (global->meta_display)); + break; + case PROP_WINDOW_MANAGER: + g_value_set_object (value, global->wm); + break; + case PROP_SETTINGS: + g_value_set_object (value, global->settings); + break; + case PROP_DATADIR: + g_value_set_string (value, global->datadir); + break; + case PROP_IMAGEDIR: + g_value_set_string (value, global->imagedir); + break; + case PROP_USERDATADIR: + g_value_set_string (value, global->userdatadir); + break; + case PROP_FOCUS_MANAGER: + g_value_set_object (value, global->focus_manager); + break; + case PROP_FRAME_TIMESTAMPS: + g_value_set_boolean (value, global->frame_timestamps); + break; + case PROP_FRAME_FINISH_TIMESTAMP: + g_value_set_boolean (value, global->frame_finish_timestamp); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +shell_global_init (ShellGlobal *global) +{ + const char *datadir = g_getenv ("GNOME_SHELL_DATADIR"); + const char *shell_js = g_getenv("GNOME_SHELL_JS"); + char *imagedir, **search_path; + char *path; + const char *byteorder_string; + + if (!datadir) + datadir = GNOME_SHELL_DATADIR; + global->datadir = datadir; + + /* We make sure imagedir ends with a '/', since the JS won't have + * access to g_build_filename() and so will end up just + * concatenating global.imagedir to a filename. + */ + imagedir = g_build_filename (datadir, "images/", NULL); + if (g_file_test (imagedir, G_FILE_TEST_IS_DIR)) + global->imagedir = imagedir; + else + { + g_free (imagedir); + global->imagedir = g_strdup_printf ("%s/", datadir); + } + + /* Ensure config dir exists for later use */ + global->userdatadir = g_build_filename (g_get_user_data_dir (), "gnome-shell", NULL); + g_mkdir_with_parents (global->userdatadir, 0700); + global->userdatadir_path = g_file_new_for_path (global->userdatadir); + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + byteorder_string = "LE"; +#else + byteorder_string = "BE"; +#endif + + /* And the runtime state */ + path = g_strdup_printf ("%s/gnome-shell/runtime-state-%s.%s", + g_get_user_runtime_dir (), + byteorder_string, + XDisplayName (NULL)); + (void) g_mkdir_with_parents (path, 0700); + global->runtime_state_path = g_file_new_for_path (path); + g_free (path); + + global->settings = g_settings_new ("org.gnome.shell"); + + if (shell_js) + { + int i, j; + search_path = g_strsplit (shell_js, ":", -1); + + /* The naive g_strsplit above will split 'resource:///foo/bar' into 'resource', + * '///foo/bar'. Combine these back together by looking for a literal 'resource' + * in the array. */ + for (i = 0, j = 0; search_path[i];) + { + char *out; + + if (strcmp (search_path[i], "resource") == 0 && search_path[i + 1] != NULL) + { + out = g_strconcat (search_path[i], ":", search_path[i + 1], NULL); + g_free (search_path[i]); + g_free (search_path[i + 1]); + i += 2; + } + else + { + out = search_path[i]; + i += 1; + } + + search_path[j++] = out; + } + + search_path[j] = NULL; /* NULL-terminate the now possibly shorter array */ + } + else + { + search_path = g_malloc0 (2 * sizeof (char *)); + search_path[0] = g_strdup ("resource:///org/gnome/shell"); + } + + global->js_context = g_object_new (GJS_TYPE_CONTEXT, + "search-path", search_path, + NULL); + + g_strfreev (search_path); + + global->save_ops = g_hash_table_new_full (g_file_hash, + (GEqualFunc) g_file_equal, + g_object_unref, g_object_unref); +} + +static void +shell_global_finalize (GObject *object) +{ + ShellGlobal *global = SHELL_GLOBAL (object); + + g_clear_object (&global->js_context); + g_object_unref (global->settings); + + the_object = NULL; + + g_clear_object (&global->userdatadir_path); + g_clear_object (&global->runtime_state_path); + + g_free (global->session_mode); + g_free (global->imagedir); + g_free (global->userdatadir); + + g_hash_table_unref (global->save_ops); + + G_OBJECT_CLASS(shell_global_parent_class)->finalize (object); +} + +static void +shell_global_class_init (ShellGlobalClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = shell_global_get_property; + gobject_class->set_property = shell_global_set_property; + gobject_class->finalize = shell_global_finalize; + + shell_global_signals[NOTIFY_ERROR] = + g_signal_new ("notify-error", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 2, + G_TYPE_STRING, + G_TYPE_STRING); + + g_object_class_install_property (gobject_class, + PROP_SESSION_MODE, + g_param_spec_string ("session-mode", + "Session Mode", + "The session mode to use", + "user", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, + PROP_SCREEN_WIDTH, + g_param_spec_int ("screen-width", + "Screen Width", + "Screen width, in pixels", + 0, G_MAXINT, 1, + G_PARAM_READABLE)); + + g_object_class_install_property (gobject_class, + PROP_SCREEN_HEIGHT, + g_param_spec_int ("screen-height", + "Screen Height", + "Screen height, in pixels", + 0, G_MAXINT, 1, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_DISPLAY, + g_param_spec_object ("display", + "Display", + "Metacity display object for the shell", + META_TYPE_DISPLAY, + G_PARAM_READABLE)); + + g_object_class_install_property (gobject_class, + PROP_WORKSPACE_MANAGER, + g_param_spec_object ("workspace-manager", + "Workspace manager", + "Workspace manager", + META_TYPE_WORKSPACE_MANAGER, + G_PARAM_READABLE)); + + g_object_class_install_property (gobject_class, + PROP_STAGE, + g_param_spec_object ("stage", + "Stage", + "Stage holding the desktop scene graph", + CLUTTER_TYPE_ACTOR, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_WINDOW_GROUP, + g_param_spec_object ("window-group", + "Window Group", + "Actor holding window actors", + CLUTTER_TYPE_ACTOR, + G_PARAM_READABLE)); + + g_object_class_install_property (gobject_class, + PROP_TOP_WINDOW_GROUP, + g_param_spec_object ("top-window-group", + "Top Window Group", + "Actor holding override-redirect windows", + CLUTTER_TYPE_ACTOR, + G_PARAM_READABLE)); + + g_object_class_install_property (gobject_class, + PROP_WINDOW_MANAGER, + g_param_spec_object ("window-manager", + "Window Manager", + "Window management interface", + SHELL_TYPE_WM, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_SETTINGS, + g_param_spec_object ("settings", + "Settings", + "GSettings instance for gnome-shell configuration", + G_TYPE_SETTINGS, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_DATADIR, + g_param_spec_string ("datadir", + "Data directory", + "Directory containing gnome-shell data files", + NULL, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_IMAGEDIR, + g_param_spec_string ("imagedir", + "Image directory", + "Directory containing gnome-shell image files", + NULL, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_USERDATADIR, + g_param_spec_string ("userdatadir", + "User data directory", + "Directory containing gnome-shell user data", + NULL, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_FOCUS_MANAGER, + g_param_spec_object ("focus-manager", + "Focus manager", + "The shell's StFocusManager", + ST_TYPE_FOCUS_MANAGER, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_FRAME_TIMESTAMPS, + g_param_spec_boolean ("frame-timestamps", + "Frame Timestamps", + "Whether to log frame timestamps in the performance log", + FALSE, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_FRAME_FINISH_TIMESTAMP, + g_param_spec_boolean ("frame-finish-timestamp", + "Frame Finish Timestamps", + "Whether at the end of a frame to call glFinish and log paintCompletedTimestamp", + FALSE, + G_PARAM_READWRITE)); +} + +/* + * _shell_global_init: (skip) + * @first_property_name: the name of the first property + * @...: the value of the first property, followed optionally by more + * name/value pairs, followed by %NULL + * + * Initializes the shell global singleton with the construction-time + * properties. + * + * There are currently no such properties, so @first_property_name should + * always be %NULL. + * + * This call must be called before shell_global_get() and shouldn't be called + * more than once. + */ +void +_shell_global_init (const char *first_property_name, + ...) +{ + va_list argument_list; + + g_return_if_fail (the_object == NULL); + + va_start (argument_list, first_property_name); + the_object = SHELL_GLOBAL (g_object_new_valist (SHELL_TYPE_GLOBAL, + first_property_name, + argument_list)); + va_end (argument_list); + +} + +/** + * shell_global_get: + * + * Gets the singleton global object that represents the desktop. + * + * Return value: (transfer none): the singleton global object + */ +ShellGlobal * +shell_global_get (void) +{ + return the_object; +} + +/** + * _shell_global_destroy_gjs_context: (skip) + * @self: global object + * + * Destroys the GjsContext held by ShellGlobal, in order to break reference + * counting cycles. (The GjsContext holds a reference to ShellGlobal because + * it's available as window.global inside JS.) + */ +void +_shell_global_destroy_gjs_context (ShellGlobal *self) +{ + g_clear_object (&self->js_context); +} + +static guint32 +get_current_time_maybe_roundtrip (ShellGlobal *global) +{ + guint32 time; + + time = shell_global_get_current_time (global); + if (time != CurrentTime) + return time; + + return meta_display_get_current_time_roundtrip (global->meta_display); +} + +static void +focus_window_changed (MetaDisplay *display, + GParamSpec *param, + gpointer user_data) +{ + ShellGlobal *global = user_data; + + if (global->has_modal) + return; + + /* If the stage window became unfocused, drop the key focus + * on Clutter's side. */ + if (!meta_stage_is_focused (global->meta_display)) + clutter_stage_set_key_focus (global->stage, NULL); +} + +static ClutterActor * +get_key_focused_actor (ShellGlobal *global) +{ + ClutterActor *actor; + + actor = clutter_stage_get_key_focus (global->stage); + + /* If there's no explicit key focus, clutter_stage_get_key_focus() + * returns the stage. This is a terrible API. */ + if (actor == CLUTTER_ACTOR (global->stage)) + actor = NULL; + + return actor; +} + +static void +sync_stage_window_focus (ShellGlobal *global) +{ + ClutterActor *actor; + + if (global->has_modal) + return; + + actor = get_key_focused_actor (global); + + /* An actor got key focus and the stage needs to be focused. */ + if (actor != NULL && !meta_stage_is_focused (global->meta_display)) + meta_focus_stage_window (global->meta_display, + get_current_time_maybe_roundtrip (global)); + + /* An actor dropped key focus. Focus the default window. */ + else if (actor == NULL && meta_stage_is_focused (global->meta_display)) + meta_display_focus_default_window (global->meta_display, + get_current_time_maybe_roundtrip (global)); +} + +static void +focus_actor_changed (ClutterStage *stage, + GParamSpec *param, + gpointer user_data) +{ + ShellGlobal *global = user_data; + sync_stage_window_focus (global); +} + +static void +sync_input_region (ShellGlobal *global) +{ + MetaDisplay *display = global->meta_display; + + if (global->has_modal) + meta_set_stage_input_region (display, None); + else + meta_set_stage_input_region (display, global->input_region); +} + +/** + * shell_global_set_stage_input_region: + * @global: the #ShellGlobal + * @rectangles: (element-type Meta.Rectangle): a list of #MetaRectangle + * describing the input region. + * + * Sets the area of the stage that is responsive to mouse clicks when + * we don't have a modal or grab. + */ +void +shell_global_set_stage_input_region (ShellGlobal *global, + GSList *rectangles) +{ + MetaRectangle *rect; + XRectangle *rects; + int nrects, i; + GSList *r; + + g_return_if_fail (SHELL_IS_GLOBAL (global)); + + nrects = g_slist_length (rectangles); + rects = g_new (XRectangle, nrects); + for (r = rectangles, i = 0; r; r = r->next, i++) + { + rect = (MetaRectangle *)r->data; + rects[i].x = rect->x; + rects[i].y = rect->y; + rects[i].width = rect->width; + rects[i].height = rect->height; + } + + if (global->input_region) + XFixesDestroyRegion (global->xdisplay, global->input_region); + + global->input_region = XFixesCreateRegion (global->xdisplay, rects, nrects); + g_free (rects); + + sync_input_region (global); +} + +/** + * shell_global_get_stage: + * + * Return value: (transfer none): The default #ClutterStage + */ +ClutterStage * +shell_global_get_stage (ShellGlobal *global) +{ + return global->stage; +} + +/** + * shell_global_get_display: + * + * Return value: (transfer none): The default #MetaDisplay + */ +MetaDisplay * +shell_global_get_display (ShellGlobal *global) +{ + return global->meta_display; +} + +/** + * shell_global_get_window_actors: + * + * Gets the list of #MetaWindowActor for the plugin's screen + * + * Return value: (element-type Meta.WindowActor) (transfer container): the list of windows + */ +GList * +shell_global_get_window_actors (ShellGlobal *global) +{ + GList *filtered = NULL; + GList *l; + + g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL); + + for (l = meta_get_window_actors (global->meta_display); l; l = l->next) + if (!meta_window_actor_is_destroyed (l->data)) + filtered = g_list_prepend (filtered, l->data); + + return g_list_reverse (filtered); +} + +static void +global_stage_notify_width (GObject *gobject, + GParamSpec *pspec, + gpointer data) +{ + ShellGlobal *global = SHELL_GLOBAL (data); + + g_object_notify (G_OBJECT (global), "screen-width"); +} + +static void +global_stage_notify_height (GObject *gobject, + GParamSpec *pspec, + gpointer data) +{ + ShellGlobal *global = SHELL_GLOBAL (data); + + g_object_notify (G_OBJECT (global), "screen-height"); +} + +static gboolean +global_stage_before_paint (gpointer data) +{ + ShellGlobal *global = SHELL_GLOBAL (data); + + if (global->frame_timestamps) + shell_perf_log_event (shell_perf_log_get_default (), + "clutter.stagePaintStart"); + + return TRUE; +} + +static gboolean +load_gl_symbol (const char *name, + void **func) +{ + *func = cogl_get_proc_address (name); + if (!*func) + { + g_warning ("failed to resolve required GL symbol \"%s\"\n", name); + return FALSE; + } + return TRUE; +} + +static void +global_stage_after_paint (ClutterStage *stage, + ShellGlobal *global) +{ + /* At this point, we've finished all layout and painting, but haven't + * actually flushed or swapped */ + + if (global->frame_timestamps && global->frame_finish_timestamp) + { + /* It's interesting to find out when the paint actually finishes + * on the GPU. We could wait for this asynchronously with + * ARB_timer_query (see https://bugzilla.gnome.org/show_bug.cgi?id=732350 + * for an implementation of this), but what we actually would + * find out then is the latency for drawing a frame, not how much + * GPU work was needed, since frames can overlap. Calling glFinish() + * is a fairly reliable way to separate out adjacent frames + * and measure the amount of GPU work. This is turned on with a + * separate property from ::frame-timestamps, since it should not + * be turned on if we're trying to actual measure latency or frame + * rate. + */ + static void (*finish) (void); + + if (!finish) + load_gl_symbol ("glFinish", (void **)&finish); + + cogl_flush (); + finish (); + + shell_perf_log_event (shell_perf_log_get_default (), + "clutter.paintCompletedTimestamp"); + } +} + +static gboolean +global_stage_after_swap (gpointer data) +{ + /* Everything is done, we're ready for a new frame */ + + ShellGlobal *global = SHELL_GLOBAL (data); + + if (global->frame_timestamps) + shell_perf_log_event (shell_perf_log_get_default (), + "clutter.stagePaintDone"); + + return TRUE; +} + +static void +update_scaling_factor (ShellGlobal *global, + MetaSettings *settings) +{ + ClutterStage *stage = CLUTTER_STAGE (global->stage); + StThemeContext *context = st_theme_context_get_for_stage (stage); + int scaling_factor; + + scaling_factor = meta_settings_get_ui_scaling_factor (settings); + g_object_set (context, "scale-factor", scaling_factor, NULL); +} + +static void +ui_scaling_factor_changed (MetaSettings *settings, + ShellGlobal *global) +{ + update_scaling_factor (global, settings); +} + +static void +entry_cursor_func (StEntry *entry, + gboolean use_ibeam, + gpointer user_data) +{ + ShellGlobal *global = user_data; + + meta_display_set_cursor (global->meta_display, + use_ibeam ? META_CURSOR_IBEAM : META_CURSOR_DEFAULT); +} + +void +_shell_global_set_plugin (ShellGlobal *global, + MetaPlugin *plugin) +{ + MetaDisplay *display; + MetaBackend *backend; + MetaSettings *settings; + + g_return_if_fail (SHELL_IS_GLOBAL (global)); + g_return_if_fail (global->plugin == NULL); + + global->plugin = plugin; + global->wm = shell_wm_new (plugin); + + display = meta_plugin_get_display (plugin); + global->meta_display = display; + global->workspace_manager = meta_display_get_workspace_manager (display); + global->x11_display = meta_display_get_x11_display (display); + global->xdisplay = meta_x11_display_get_xdisplay (global->x11_display); + + global->gdk_display = gdk_x11_lookup_xdisplay (global->xdisplay); + + global->stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); + + if (meta_is_wayland_compositor ()) + { + global->stage_xwindow = None; + } + else + { + global->stage_xwindow = clutter_x11_get_stage_window (global->stage); + } + + st_entry_set_cursor_func (entry_cursor_func, global); + + g_signal_connect (global->stage, "notify::width", + G_CALLBACK (global_stage_notify_width), global); + g_signal_connect (global->stage, "notify::height", + G_CALLBACK (global_stage_notify_height), global); + + clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT, + global_stage_before_paint, + global, NULL); + + g_signal_connect (global->stage, "after-paint", + G_CALLBACK (global_stage_after_paint), global); + + clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT, + global_stage_after_swap, + global, NULL); + + shell_perf_log_define_event (shell_perf_log_get_default(), + "clutter.stagePaintStart", + "Start of stage page repaint", + ""); + shell_perf_log_define_event (shell_perf_log_get_default(), + "clutter.paintCompletedTimestamp", + "Paint completion on GPU", + ""); + shell_perf_log_define_event (shell_perf_log_get_default(), + "clutter.stagePaintDone", + "End of frame, possibly including swap time", + ""); + + g_signal_connect (global->stage, "notify::key-focus", + G_CALLBACK (focus_actor_changed), global); + g_signal_connect (global->meta_display, "notify::focus-window", + G_CALLBACK (focus_window_changed), global); + + backend = meta_get_backend (); + settings = meta_backend_get_settings (backend); + g_signal_connect (settings, "ui-scaling-factor-changed", + G_CALLBACK (ui_scaling_factor_changed), global); + + global->focus_manager = st_focus_manager_get_for_stage (global->stage); + + update_scaling_factor (global, settings); +} + +GjsContext * +_shell_global_get_gjs_context (ShellGlobal *global) +{ + return global->js_context; +} + +/** + * shell_global_begin_modal: + * @global: a #ShellGlobal + * + * Grabs the keyboard and mouse to the stage window. The stage will + * receive all keyboard and mouse events until shell_global_end_modal() + * is called. This is used to implement "modes" for the shell, such as the + * overview mode or the "looking glass" debug overlay, that block + * application and normal key shortcuts. + * + * Returns: %TRUE if we succesfully entered the mode. %FALSE if we couldn't + * enter the mode. Failure may occur because an application has the pointer + * or keyboard grabbed, because Mutter is in a mode itself like moving a + * window or alt-Tab window selection, or because shell_global_begin_modal() + * was previouly called. + */ +gboolean +shell_global_begin_modal (ShellGlobal *global, + guint32 timestamp, + MetaModalOptions options) +{ + /* Make it an error to call begin_modal while we already + * have a modal active. */ + if (global->has_modal) + return FALSE; + + global->has_modal = meta_plugin_begin_modal (global->plugin, options, timestamp); + sync_input_region (global); + return global->has_modal; +} + +/** + * shell_global_end_modal: + * @global: a #ShellGlobal + * + * Undoes the effect of shell_global_begin_modal(). + */ +void +shell_global_end_modal (ShellGlobal *global, + guint32 timestamp) +{ + if (!global->has_modal) + return; + + meta_plugin_end_modal (global->plugin, timestamp); + global->has_modal = FALSE; + + /* If the stage window is unfocused, ensure that there's no + * actor focused on Clutter's side. */ + if (!meta_stage_is_focused (global->meta_display)) + clutter_stage_set_key_focus (global->stage, NULL); + + /* An actor dropped key focus. Focus the default window. */ + else if (get_key_focused_actor (global) && meta_stage_is_focused (global->meta_display)) + meta_display_focus_default_window (global->meta_display, + get_current_time_maybe_roundtrip (global)); + + sync_input_region (global); +} + +/* Code to close all file descriptors before we exec; copied from gspawn.c in GLib. + * + * Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering + * + * http://bugzilla.gnome.org/show_bug.cgi?id=469231 + * http://bugzilla.gnome.org/show_bug.cgi?id=357585 + */ + +static int +set_cloexec (void *data, gint fd) +{ + if (fd >= GPOINTER_TO_INT (data)) + fcntl (fd, F_SETFD, FD_CLOEXEC); + + return 0; +} + +#ifndef HAVE_FDWALK +static int +fdwalk (int (*cb)(void *data, int fd), void *data) +{ + gint open_max; + gint fd; + gint res = 0; + +#ifdef HAVE_SYS_RESOURCE_H + struct rlimit rl; +#endif + +#ifdef __linux__ + DIR *d; + + if ((d = opendir("/proc/self/fd"))) { + struct dirent *de; + + while ((de = readdir(d))) { + glong l; + gchar *e = NULL; + + if (de->d_name[0] == '.') + continue; + + errno = 0; + l = strtol(de->d_name, &e, 10); + if (errno != 0 || !e || *e) + continue; + + fd = (gint) l; + + if ((glong) fd != l) + continue; + + if (fd == dirfd(d)) + continue; + + if ((res = cb (data, fd)) != 0) + break; + } + + closedir(d); + return res; + } + + /* If /proc is not mounted or not accessible we fall back to the old + * rlimit trick */ + +#endif + +#ifdef HAVE_SYS_RESOURCE_H + if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) + open_max = rl.rlim_max; + else +#endif + open_max = sysconf (_SC_OPEN_MAX); + + for (fd = 0; fd < open_max; fd++) + if ((res = cb (data, fd)) != 0) + break; + + return res; +} +#endif + +static void +pre_exec_close_fds(void) +{ + fdwalk (set_cloexec, GINT_TO_POINTER(3)); +} + +/** + * shell_global_reexec_self: + * @global: A #ShellGlobal + * + * Restart the current process. Only intended for development purposes. + */ +void +shell_global_reexec_self (ShellGlobal *global) +{ + GPtrArray *arr; + gsize len; + +#if defined __linux__ || defined __sun + char *buf; + char *buf_p; + char *buf_end; + GError *error = NULL; + + if (!g_file_get_contents ("/proc/self/cmdline", &buf, &len, &error)) + { + g_warning ("failed to get /proc/self/cmdline: %s", error->message); + return; + } + + buf_end = buf+len; + arr = g_ptr_array_new (); + /* The cmdline file is NUL-separated */ + for (buf_p = buf; buf_p < buf_end; buf_p = buf_p + strlen (buf_p) + 1) + g_ptr_array_add (arr, buf_p); + + g_ptr_array_add (arr, NULL); +#elif defined __OpenBSD__ + gchar **args, **args_p; + gint mib[] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV }; + + if (sysctl (mib, G_N_ELEMENTS (mib), NULL, &len, NULL, 0) == -1) + return; + + args = g_malloc0 (len); + + if (sysctl (mib, G_N_ELEMENTS (mib), args, &len, NULL, 0) == -1) { + g_warning ("failed to get command line args: %d", errno); + g_free (args); + return; + } + + arr = g_ptr_array_new (); + for (args_p = args; *args_p != NULL; args_p++) { + g_ptr_array_add (arr, *args_p); + } + + g_ptr_array_add (arr, NULL); +#elif defined __FreeBSD__ + char *buf; + char *buf_p; + char *buf_end; + gint mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, getpid() }; + + if (sysctl (mib, G_N_ELEMENTS (mib), NULL, &len, NULL, 0) == -1) + return; + + buf = g_malloc0 (len); + + if (sysctl (mib, G_N_ELEMENTS (mib), buf, &len, NULL, 0) == -1) { + g_warning ("failed to get command line args: %d", errno); + g_free (buf); + return; + } + + buf_end = buf+len; + arr = g_ptr_array_new (); + /* The value returned by sysctl is NUL-separated */ + for (buf_p = buf; buf_p < buf_end; buf_p = buf_p + strlen (buf_p) + 1) + g_ptr_array_add (arr, buf_p); + + g_ptr_array_add (arr, NULL); +#else + return; +#endif + + /* Close all file descriptors other than stdin/stdout/stderr, otherwise + * they will leak and stay open after the exec. In particular, this is + * important for file descriptors that represent mapped graphics buffer + * objects. + */ + pre_exec_close_fds (); + + meta_display_close (shell_global_get_display (global), + shell_global_get_current_time (global)); + + execvp (arr->pdata[0], (char**)arr->pdata); + g_warning ("failed to reexec: %s", g_strerror (errno)); + g_ptr_array_free (arr, TRUE); +#if defined __linux__ || defined __FreeBSD__ + g_free (buf); +#elif defined __OpenBSD__ + g_free (args); +#endif +} + +/** + * shell_global_log_structured: + * @message: A message to print + * @keys: (allow-none) (array zero-terminated=1) (element-type utf8): Optional structured data + * + * Log structured data in an operating-system specific fashion. The + * parameter @opts should be an array of UTF-8 KEY=VALUE strings. + * This function does not support binary data. See + * http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html + * or more information about fields that can be used on a systemd + * system. + * + */ +void +shell_global_log_structured (const char *message, + const char *const *keys) +{ +#ifdef HAVE_SYSTEMD + const char *const*iter; + char *msgkey; + guint i, n_opts; + struct iovec *iovs; + + for (n_opts = 0, iter = keys; *iter; iter++, n_opts++) + ; + + n_opts++; /* Add one for MESSAGE= */ + iovs = g_alloca (sizeof (struct iovec) * n_opts); + + for (i = 0, iter = keys; *iter; iter++, i++) { + iovs[i].iov_base = (char*)keys[i]; + iovs[i].iov_len = strlen (keys[i]); + } + g_assert(i == n_opts-1); + msgkey = g_strconcat ("MESSAGE=", message, NULL); + iovs[i].iov_base = msgkey; + iovs[i].iov_len = strlen (msgkey); + + // The code location isn't useful since we're wrapping + sd_journal_sendv (iovs, n_opts); + g_free (msgkey); +#else + g_print ("%s\n", message); +#endif +} + +/** + * shell_global_notify_error: + * @global: a #ShellGlobal + * @msg: Error message + * @details: Error details + * + * Show a system error notification. Use this function + * when a user-initiated action results in a non-fatal problem + * from causes that may not be under system control. For + * example, an application crash. + */ +void +shell_global_notify_error (ShellGlobal *global, + const char *msg, + const char *details) +{ + g_signal_emit_by_name (global, "notify-error", msg, details); +} + +/** + * shell_global_init_xdnd: + * @global: the #ShellGlobal + * + * Enables tracking of Xdnd events + */ +void shell_global_init_xdnd (ShellGlobal *global) +{ + Window output_window = meta_get_overlay_window (global->meta_display); + long xdnd_version = 5; + + XChangeProperty (global->xdisplay, global->stage_xwindow, + gdk_x11_get_xatom_by_name ("XdndAware"), XA_ATOM, + 32, PropModeReplace, (const unsigned char *)&xdnd_version, 1); + + XChangeProperty (global->xdisplay, output_window, + gdk_x11_get_xatom_by_name ("XdndProxy"), XA_WINDOW, + 32, PropModeReplace, (const unsigned char *)&global->stage_xwindow, 1); + + /* + * XdndProxy is additionally set on the proxy window as verification that the + * XdndProxy property on the target window isn't a left-over + */ + XChangeProperty (global->xdisplay, global->stage_xwindow, + gdk_x11_get_xatom_by_name ("XdndProxy"), XA_WINDOW, + 32, PropModeReplace, (const unsigned char *)&global->stage_xwindow, 1); +} + +/** + * shell_global_get_pointer: + * @global: the #ShellGlobal + * @x: (out): the X coordinate of the pointer, in global coordinates + * @y: (out): the Y coordinate of the pointer, in global coordinates + * @mods: (out): the current set of modifier keys that are pressed down + * + * Gets the pointer coordinates and current modifier key state. + */ +void +shell_global_get_pointer (ShellGlobal *global, + int *x, + int *y, + ClutterModifierType *mods) +{ + ClutterModifierType raw_mods; + MetaCursorTracker *tracker; + + tracker = meta_cursor_tracker_get_for_display (global->meta_display); + meta_cursor_tracker_get_pointer (tracker, x, y, &raw_mods); + + *mods = raw_mods & CLUTTER_MODIFIER_MASK; +} + +/** + * shell_global_sync_pointer: + * @global: the #ShellGlobal + * + * Ensures that clutter is aware of the current pointer position, + * causing enter and leave events to be emitted if the pointer moved + * behind our back (ie, during a pointer grab). + */ +void +shell_global_sync_pointer (ShellGlobal *global) +{ + int x, y; + ClutterModifierType mods; + ClutterMotionEvent event; + + shell_global_get_pointer (global, &x, &y, &mods); + + event.type = CLUTTER_MOTION; + event.time = shell_global_get_current_time (global); + event.flags = CLUTTER_EVENT_FLAG_SYNTHETIC; + event.stage = global->stage; + event.x = x; + event.y = y; + event.modifier_state = mods; + event.axes = NULL; + event.device = clutter_device_manager_get_device (clutter_device_manager_get_default (), + META_VIRTUAL_CORE_POINTER_ID); + + /* Leaving event.source NULL will force clutter to look it up, which + * will generate enter/leave events as a side effect, if they are + * needed. We need a better way to do this though... see + * http://bugzilla.clutter-project.org/show_bug.cgi?id=2615. + */ + event.source = NULL; + + clutter_event_put ((ClutterEvent *)&event); +} + +/** + * shell_global_get_settings: + * @global: A #ShellGlobal + * + * Get the global GSettings instance. + * + * Return value: (transfer none): The GSettings object + */ +GSettings * +shell_global_get_settings (ShellGlobal *global) +{ + return global->settings; +} + +/** + * shell_global_get_current_time: + * @global: A #ShellGlobal + * + * Returns: the current X server time from the current Clutter, Gdk, or X + * event. If called from outside an event handler, this may return + * %Clutter.CURRENT_TIME (aka 0), or it may return a slightly + * out-of-date timestamp. + */ +guint32 +shell_global_get_current_time (ShellGlobal *global) +{ + guint32 time; + + /* meta_display_get_current_time() will return the correct time + when handling an X or Gdk event, but will return CurrentTime + from some Clutter event callbacks. + + clutter_get_current_event_time() will return the correct time + from a Clutter event callback, but may return CLUTTER_CURRENT_TIME + timestamp if called at other times. + + So we try meta_display_get_current_time() first, since we + can recognize a "wrong" answer from that, and then fall back + to clutter_get_current_event_time(). + */ + + time = meta_display_get_current_time (global->meta_display); + if (time != CLUTTER_CURRENT_TIME) + return time; + + return clutter_get_current_event_time (); +} + +/** + * shell_global_create_app_launch_context: + * @global: A #ShellGlobal + * @timestamp: the timestamp for the launch (or 0 for current time) + * @workspace: a workspace index, or -1 to indicate the current one + * + * Create a #GAppLaunchContext set up with the correct timestamp, and + * targeted to activate on the current workspace. + * + * Return value: (transfer full): A new #GAppLaunchContext + */ +GAppLaunchContext * +shell_global_create_app_launch_context (ShellGlobal *global, + guint32 timestamp, + int workspace) +{ + MetaWorkspaceManager *workspace_manager = global->workspace_manager; + MetaStartupNotification *sn; + MetaLaunchContext *context; + MetaWorkspace *ws = NULL; + + sn = meta_display_get_startup_notification (global->meta_display); + context = meta_startup_notification_create_launcher (sn); + + if (timestamp == 0) + timestamp = shell_global_get_current_time (global); + meta_launch_context_set_timestamp (context, timestamp); + + if (workspace < 0) + ws = meta_workspace_manager_get_active_workspace (workspace_manager); + else + ws = meta_workspace_manager_get_workspace_by_index (workspace_manager, workspace); + + meta_launch_context_set_workspace (context, ws); + + return (GAppLaunchContext *) context; +} + +typedef struct +{ + ShellLeisureFunction func; + gpointer user_data; + GDestroyNotify notify; +} LeisureClosure; + +static gboolean +run_leisure_functions (gpointer data) +{ + ShellGlobal *global = data; + GSList *closures; + GSList *iter; + + global->leisure_function_id = 0; + + /* We started more work since we scheduled the idle */ + if (global->work_count > 0) + return FALSE; + + /* No leisure closures, so we are done */ + if (global->leisure_closures == NULL) + return FALSE; + + closures = global->leisure_closures; + global->leisure_closures = NULL; + + for (iter = closures; iter; iter = iter->next) + { + LeisureClosure *closure = closures->data; + closure->func (closure->user_data); + + if (closure->notify) + closure->notify (closure->user_data); + + g_slice_free (LeisureClosure, closure); + } + + g_slist_free (closures); + + return FALSE; +} + +static void +schedule_leisure_functions (ShellGlobal *global) +{ + /* This is called when we think we are ready to run leisure functions + * by our own accounting. We try to handle other types of business + * (like ClutterAnimation) by adding a low priority idle function. + * + * This won't work properly if the mainloop goes idle waiting for + * the vertical blanking interval or waiting for work being done + * in another thread. + */ + if (!global->leisure_function_id) + { + global->leisure_function_id = g_idle_add_full (G_PRIORITY_LOW, + run_leisure_functions, + global, NULL); + g_source_set_name_by_id (global->leisure_function_id, "[gnome-shell] run_leisure_functions"); + } +} + +/** + * shell_global_begin_work: + * @global: the #ShellGlobal + * + * Marks that we are currently doing work. This is used to to track + * whether we are busy for the purposes of shell_global_run_at_leisure(). + * A count is kept and shell_global_end_work() must be called exactly + * as many times as shell_global_begin_work(). + */ +void +shell_global_begin_work (ShellGlobal *global) +{ + global->work_count++; +} + +/** + * shell_global_end_work: + * @global: the #ShellGlobal + * + * Marks the end of work that we started with shell_global_begin_work(). + * If no other work is ongoing and functions have been added with + * shell_global_run_at_leisure(), they will be run at the next + * opportunity. + */ +void +shell_global_end_work (ShellGlobal *global) +{ + g_return_if_fail (global->work_count > 0); + + global->work_count--; + if (global->work_count == 0) + schedule_leisure_functions (global); + +} + +/** + * shell_global_run_at_leisure: + * @global: the #ShellGlobal + * @func: function to call at leisure + * @user_data: data to pass to @func + * @notify: function to call to free @user_data + * + * Schedules a function to be called the next time the shell is idle. + * Idle means here no animations, no redrawing, and no ongoing background + * work. Since there is currently no way to hook into the Clutter master + * clock and know when is running, the implementation here is somewhat + * approximation. Animations done through the shell's Tweener module will + * be handled properly, but other animations may be detected as terminating + * early if they can be drawn fast enough so that the event loop goes idle + * between frames. + * + * The intent of this function is for performance measurement runs + * where a number of actions should be run serially and each action is + * timed individually. Using this function for other purposes will + * interfere with the ability to use it for performance measurement so + * should be avoided. + */ +void +shell_global_run_at_leisure (ShellGlobal *global, + ShellLeisureFunction func, + gpointer user_data, + GDestroyNotify notify) +{ + LeisureClosure *closure = g_slice_new (LeisureClosure); + closure->func = func; + closure->user_data = user_data; + closure->notify = notify; + + global->leisure_closures = g_slist_append (global->leisure_closures, + closure); + + if (global->work_count == 0) + schedule_leisure_functions (global); +} + +const char * +shell_global_get_session_mode (ShellGlobal *global) +{ + g_return_val_if_fail (SHELL_IS_GLOBAL (global), "user"); + + return global->session_mode; +} + +static void +delete_variant_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + ShellGlobal *global = user_data; + GError *error = NULL; + + if (!g_file_delete_finish (G_FILE (object), result, &error)) + { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + g_warning ("Could not delete runtime/persistent state file: %s\n", + error->message); + } + + g_error_free (error); + } + + g_hash_table_remove (global->save_ops, object); +} + +static void +replace_variant_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + ShellGlobal *global = user_data; + GError *error = NULL; + + if (!g_file_replace_contents_finish (G_FILE (object), result, NULL, &error)) + { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + g_warning ("Could not replace runtime/persistent state file: %s\n", + error->message); + } + + g_error_free (error); + } + + g_hash_table_remove (global->save_ops, object); +} + +static void +save_variant (ShellGlobal *global, + GFile *dir, + const char *property_name, + GVariant *variant) +{ + GFile *path = g_file_get_child (dir, property_name); + GCancellable *cancellable; + + cancellable = g_hash_table_lookup (global->save_ops, path); + g_cancellable_cancel (cancellable); + + cancellable = g_cancellable_new (); + g_hash_table_insert (global->save_ops, g_object_ref (path), cancellable); + + if (variant == NULL || g_variant_get_data (variant) == NULL) + { + g_file_delete_async (path, G_PRIORITY_DEFAULT, cancellable, + delete_variant_cb, global); + } + else + { + g_file_replace_contents_async (path, + g_variant_get_data (variant), + g_variant_get_size (variant), + NULL, FALSE, + G_FILE_CREATE_REPLACE_DESTINATION, + cancellable, replace_variant_cb, global); + } + + g_object_unref (path); +} + +static GVariant * +load_variant (GFile *dir, + const char *property_type, + const char *property_name) +{ + GVariant *res = NULL; + GMappedFile *mfile; + GFile *path = g_file_get_child (dir, property_name); + char *pathstr; + GError *local_error = NULL; + + pathstr = g_file_get_path (path); + mfile = g_mapped_file_new (pathstr, FALSE, &local_error); + if (!mfile) + { + if (!g_error_matches (local_error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) + { + g_warning ("Failed to open runtime state: %s", local_error->message); + } + g_clear_error (&local_error); + } + else + { + GBytes *bytes = g_mapped_file_get_bytes (mfile); + res = g_variant_new_from_bytes (G_VARIANT_TYPE (property_type), bytes, TRUE); + g_bytes_unref (bytes); + g_mapped_file_unref (mfile); + } + + g_object_unref (path); + g_free (pathstr); + + return res; +} + +/** + * shell_global_set_runtime_state: + * @global: a #ShellGlobal + * @property_name: Name of the property + * @variant: (nullable): A #GVariant, or %NULL to unset + * + * Change the value of serialized runtime state. + */ +void +shell_global_set_runtime_state (ShellGlobal *global, + const char *property_name, + GVariant *variant) +{ + save_variant (global, global->runtime_state_path, property_name, variant); +} + +/** + * shell_global_get_runtime_state: + * @global: a #ShellGlobal + * @property_type: Expected data type + * @property_name: Name of the property + * + * The shell maintains "runtime" state which does not persist across + * logout or reboot. + * + * Returns: (transfer floating): The value of a serialized property, or %NULL if none stored + */ +GVariant * +shell_global_get_runtime_state (ShellGlobal *global, + const char *property_type, + const char *property_name) +{ + return load_variant (global->runtime_state_path, property_type, property_name); +} + +/** + * shell_global_set_persistent_state: + * @global: a #ShellGlobal + * @property_name: Name of the property + * @variant: (nullable): A #GVariant, or %NULL to unset + * + * Change the value of serialized persistent state. + */ +void +shell_global_set_persistent_state (ShellGlobal *global, + const char *property_name, + GVariant *variant) +{ + save_variant (global, global->userdatadir_path, property_name, variant); +} + +/** + * shell_global_get_persistent_state: + * @global: a #ShellGlobal + * @property_type: Expected data type + * @property_name: Name of the property + * + * The shell maintains "persistent" state which will persist after + * logout or reboot. + * + * Returns: (transfer none): The value of a serialized property, or %NULL if none stored + */ +GVariant * +shell_global_get_persistent_state (ShellGlobal *global, + const char *property_type, + const char *property_name) +{ + return load_variant (global->userdatadir_path, property_type, property_name); +} diff --git a/src/shell-global.h b/src/shell-global.h new file mode 100644 index 0000000..9d9bc19 --- /dev/null +++ b/src/shell-global.h @@ -0,0 +1,103 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_GLOBAL_H__ +#define __SHELL_GLOBAL_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define SHELL_TYPE_GLOBAL (shell_global_get_type ()) +G_DECLARE_FINAL_TYPE (ShellGlobal, shell_global, SHELL, GLOBAL, GObject) + +ShellGlobal *shell_global_get (void); + +ClutterStage *shell_global_get_stage (ShellGlobal *global); +MetaDisplay *shell_global_get_display (ShellGlobal *global); +GList *shell_global_get_window_actors (ShellGlobal *global); +GSettings *shell_global_get_settings (ShellGlobal *global); +guint32 shell_global_get_current_time (ShellGlobal *global); + + +/* Input/event handling */ +gboolean shell_global_begin_modal (ShellGlobal *global, + guint32 timestamp, + MetaModalOptions options); +void shell_global_end_modal (ShellGlobal *global, + guint32 timestamp); + +void shell_global_set_stage_input_region (ShellGlobal *global, + GSList *rectangles); + +void shell_global_get_pointer (ShellGlobal *global, + int *x, + int *y, + ClutterModifierType *mods); + +typedef struct { + guint glibc_uordblks; + + guint js_bytes; + + guint gjs_boxed; + guint gjs_gobject; + guint gjs_function; + guint gjs_closure; + + /* 32 bit to avoid js conversion problems with 64 bit */ + guint last_gc_seconds_ago; +} ShellMemoryInfo; + +/* Run-at-leisure API */ +void shell_global_begin_work (ShellGlobal *global); +void shell_global_end_work (ShellGlobal *global); + +typedef void (*ShellLeisureFunction) (gpointer data); + +void shell_global_run_at_leisure (ShellGlobal *global, + ShellLeisureFunction func, + gpointer user_data, + GDestroyNotify notify); + + +/* Misc utilities / Shell API */ +void shell_global_sync_pointer (ShellGlobal *global); + +GAppLaunchContext * + shell_global_create_app_launch_context (ShellGlobal *global, + guint32 timestamp, + int workspace); + +void shell_global_notify_error (ShellGlobal *global, + const char *msg, + const char *details); + +void shell_global_init_xdnd (ShellGlobal *global); + +void shell_global_reexec_self (ShellGlobal *global); + +void shell_global_log_structured (const char *message, + const char *const *keys); + +const char * shell_global_get_session_mode (ShellGlobal *global); + +void shell_global_set_runtime_state (ShellGlobal *global, + const char *property_name, + GVariant *variant); +GVariant * shell_global_get_runtime_state (ShellGlobal *global, + const char *property_type, + const char *property_name); + +void shell_global_set_persistent_state (ShellGlobal *global, + const char *property_name, + GVariant *variant); +GVariant * shell_global_get_persistent_state (ShellGlobal *global, + const char *property_type, + const char *property_name); + +G_END_DECLS + +#endif /* __SHELL_GLOBAL_H__ */ diff --git a/src/shell-glsl-quad.c b/src/shell-glsl-quad.c new file mode 100644 index 0000000..ba62a98 --- /dev/null +++ b/src/shell-glsl-quad.c @@ -0,0 +1,203 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/** + * SECTION:shell-glsl-quad + * @short_description: Draw a rectangle using GLSL + * + * A #ShellGLSLQuad draws one single rectangle, sized to the allocation + * box, but allows running custom GLSL to the vertex and fragment + * stages of the graphic pipeline. + * + * To ease writing the shader, a single texture layer is also used. + */ + +#include "config.h" + +#include +#include "shell-glsl-quad.h" + +typedef struct _ShellGLSLQuadPrivate ShellGLSLQuadPrivate; +struct _ShellGLSLQuadPrivate +{ + CoglPipeline *pipeline; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ShellGLSLQuad, shell_glsl_quad, CLUTTER_TYPE_ACTOR); + +static gboolean +shell_glsl_quad_get_paint_volume (ClutterActor *actor, + ClutterPaintVolume *volume) +{ + return clutter_paint_volume_set_from_allocation (volume, actor); +} + +static void +shell_glsl_quad_paint (ClutterActor *actor) +{ + ShellGLSLQuad *self = SHELL_GLSL_QUAD (actor); + ShellGLSLQuadPrivate *priv; + guint8 paint_opacity; + ClutterActorBox box; + + priv = shell_glsl_quad_get_instance_private (self); + + paint_opacity = clutter_actor_get_paint_opacity (actor); + clutter_actor_get_allocation_box (actor, &box); + + cogl_pipeline_set_color4ub (priv->pipeline, + paint_opacity, + paint_opacity, + paint_opacity, + paint_opacity); + cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (), + priv->pipeline, + box.x1, box.y1, + box.x2, box.y2); +} + + +/** + * shell_glsl_quad_add_glsl_snippet: + * @quad: a #ShellGLSLQuad + * @hook: where to insert the code + * @declarations: GLSL declarations + * @code: GLSL code + * @is_replace: wheter Cogl code should be replaced by the custom shader + * + * Adds a GLSL snippet to the pipeline used for drawing the actor texture. + * See #CoglSnippet for details. + * + * This is only valid inside the a call to the build_pipeline() virtual + * function. + */ +void +shell_glsl_quad_add_glsl_snippet (ShellGLSLQuad *quad, + ShellSnippetHook hook, + const char *declarations, + const char *code, + gboolean is_replace) +{ + ShellGLSLQuadClass *klass = SHELL_GLSL_QUAD_GET_CLASS (quad); + CoglSnippet *snippet; + + g_return_if_fail (klass->base_pipeline != NULL); + + if (is_replace) + { + snippet = cogl_snippet_new ((CoglSnippetHook)hook, declarations, NULL); + cogl_snippet_set_replace (snippet, code); + } + else + { + snippet = cogl_snippet_new ((CoglSnippetHook)hook, declarations, code); + } + + if (hook == SHELL_SNIPPET_HOOK_VERTEX || + hook == SHELL_SNIPPET_HOOK_FRAGMENT) + cogl_pipeline_add_snippet (klass->base_pipeline, snippet); + else + cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet); + + cogl_object_unref (snippet); +} + +static void +shell_glsl_quad_dispose (GObject *gobject) +{ + ShellGLSLQuad *self = SHELL_GLSL_QUAD (gobject); + ShellGLSLQuadPrivate *priv; + + priv = shell_glsl_quad_get_instance_private (self); + + g_clear_pointer (&priv->pipeline, cogl_object_unref); + + G_OBJECT_CLASS (shell_glsl_quad_parent_class)->dispose (gobject); +} + +static void +shell_glsl_quad_init (ShellGLSLQuad *quad) +{ +} + +static void +shell_glsl_quad_constructed (GObject *object) +{ + ShellGLSLQuad *self; + ShellGLSLQuadClass *klass; + ShellGLSLQuadPrivate *priv; + CoglContext *ctx = + clutter_backend_get_cogl_context (clutter_get_default_backend ()); + + G_OBJECT_CLASS (shell_glsl_quad_parent_class)->constructed (object); + + /* Note that, differently from ClutterBlurEffect, we are calling + this inside constructed, not init, so klass points to the most-derived + GTypeClass, not ShellGLSLQuadClass. + */ + klass = SHELL_GLSL_QUAD_GET_CLASS (object); + self = SHELL_GLSL_QUAD (object); + priv = shell_glsl_quad_get_instance_private (self); + + if (G_UNLIKELY (klass->base_pipeline == NULL)) + { + klass->base_pipeline = cogl_pipeline_new (ctx); + cogl_pipeline_set_blend (klass->base_pipeline, "RGBA = ADD (SRC_COLOR * (SRC_COLOR[A]), DST_COLOR * (1-SRC_COLOR[A]))", NULL); + + if (klass->build_pipeline != NULL) + klass->build_pipeline (self); + } + + priv->pipeline = cogl_pipeline_copy (klass->base_pipeline); + + cogl_pipeline_set_layer_null_texture (priv->pipeline, 0, COGL_TEXTURE_TYPE_2D); +} + +static void +shell_glsl_quad_class_init (ShellGLSLQuadClass *klass) +{ + ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructed = shell_glsl_quad_constructed; + gobject_class->dispose = shell_glsl_quad_dispose; + + actor_class->get_paint_volume = shell_glsl_quad_get_paint_volume; + actor_class->paint = shell_glsl_quad_paint; +} + +/** + * shell_glsl_quad_get_uniform_location: + * @quad: a #ShellGLSLQuad + * @name: the uniform name + * + * Returns: the location of the uniform named @name, that can be + * passed to shell_glsl_quad_set_uniform_float(). + */ +int +shell_glsl_quad_get_uniform_location (ShellGLSLQuad *quad, + const char *name) +{ + ShellGLSLQuadPrivate *priv = shell_glsl_quad_get_instance_private (quad); + return cogl_pipeline_get_uniform_location (priv->pipeline, name); +} + +/** + * shell_glsl_quad_set_uniform_float: + * @quad: a #ShellGLSLQuad + * @uniform: the uniform location (as returned by shell_glsl_quad_get_uniform_location()) + * @n_components: the number of components in the uniform (eg. 3 for a vec3) + * @total_count: the total number of floats in @value + * @value: (array length=total_count): the array of floats to set @uniform + */ +void +shell_glsl_quad_set_uniform_float (ShellGLSLQuad *quad, + int uniform, + int n_components, + int total_count, + const float *value) +{ + ShellGLSLQuadPrivate *priv = shell_glsl_quad_get_instance_private (quad); + cogl_pipeline_set_uniform_float (priv->pipeline, uniform, + n_components, total_count / n_components, + value); +} diff --git a/src/shell-glsl-quad.h b/src/shell-glsl-quad.h new file mode 100644 index 0000000..da2c480 --- /dev/null +++ b/src/shell-glsl-quad.h @@ -0,0 +1,56 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_GLSL_QUAD_H__ +#define __SHELL_GLSL_QUAD_H__ + +#include "st.h" +#include + +/** + * ShellSnippetHook: + * Temporary hack to work around Cogl not exporting CoglSnippetHook in + * the 1.0 API. Don't use. + */ +typedef enum { + /* Per pipeline vertex hooks */ + SHELL_SNIPPET_HOOK_VERTEX = 0, + SHELL_SNIPPET_HOOK_VERTEX_TRANSFORM, + + /* Per pipeline fragment hooks */ + SHELL_SNIPPET_HOOK_FRAGMENT = 2048, + + /* Per layer vertex hooks */ + SHELL_SNIPPET_HOOK_TEXTURE_COORD_TRANSFORM = 4096, + + /* Per layer fragment hooks */ + SHELL_SNIPPET_HOOK_LAYER_FRAGMENT = 6144, + SHELL_SNIPPET_HOOK_TEXTURE_LOOKUP +} ShellSnippetHook; + +#define SHELL_TYPE_GLSL_QUAD (shell_glsl_quad_get_type ()) +G_DECLARE_DERIVABLE_TYPE (ShellGLSLQuad, shell_glsl_quad, + SHELL, GLSL_QUAD, ClutterActor) + +struct _ShellGLSLQuadClass +{ + ClutterActorClass parent_class; + + CoglPipeline *base_pipeline; + + void (*build_pipeline) (ShellGLSLQuad *effect); +}; + +void shell_glsl_quad_add_glsl_snippet (ShellGLSLQuad *quad, + ShellSnippetHook hook, + const char *declarations, + const char *code, + gboolean is_replace); + +int shell_glsl_quad_get_uniform_location (ShellGLSLQuad *quad, + const char *name); +void shell_glsl_quad_set_uniform_float (ShellGLSLQuad *quad, + int uniform, + int n_components, + int total_count, + const float *value); + +#endif /* __SHELL_GLSL_QUAD_H__ */ diff --git a/src/shell-gtk-embed.c b/src/shell-gtk-embed.c new file mode 100644 index 0000000..057f877 --- /dev/null +++ b/src/shell-gtk-embed.c @@ -0,0 +1,381 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include "shell-embedded-window-private.h" +#include "shell-global.h" +#include "shell-util.h" + +#include +#include +#include + +enum { + PROP_0, + + PROP_WINDOW +}; + +typedef struct _ShellGtkEmbedPrivate ShellGtkEmbedPrivate; + +struct _ShellGtkEmbedPrivate +{ + ShellEmbeddedWindow *window; + + ClutterActor *window_actor; + guint window_actor_destroyed_handler; + + guint window_created_handler; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ShellGtkEmbed, shell_gtk_embed, CLUTTER_TYPE_CLONE); + +static void shell_gtk_embed_set_window (ShellGtkEmbed *embed, + ShellEmbeddedWindow *window); + +static void +shell_gtk_embed_on_window_destroy (GtkWidget *object, + ShellGtkEmbed *embed) +{ + shell_gtk_embed_set_window (embed, NULL); +} + +static void +shell_gtk_embed_remove_window_actor (ShellGtkEmbed *embed) +{ + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + + if (priv->window_actor) + { + g_signal_handler_disconnect (priv->window_actor, + priv->window_actor_destroyed_handler); + priv->window_actor_destroyed_handler = 0; + + g_object_unref (priv->window_actor); + priv->window_actor = NULL; + } + + clutter_clone_set_source (CLUTTER_CLONE (embed), NULL); +} + +static void +shell_gtk_embed_window_created_cb (MetaDisplay *display, + MetaWindow *window, + ShellGtkEmbed *embed) +{ + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + Window xwindow = meta_window_get_xwindow (window); + GdkWindow *gdk_window = gtk_widget_get_window (GTK_WIDGET (priv->window)); + + if (gdk_window && xwindow == gdk_x11_window_get_xid (gdk_window)) + { + ClutterActor *window_actor = + CLUTTER_ACTOR (meta_window_get_compositor_private (window)); + GCallback remove_cb = G_CALLBACK (shell_gtk_embed_remove_window_actor); + cairo_region_t *empty_region; + + clutter_clone_set_source (CLUTTER_CLONE (embed), window_actor); + + /* We want to explicitly clear the clone source when the window + actor is destroyed because otherwise we might end up keeping + it alive after it has been disposed. Otherwise this can cause + a crash if there is a paint after mutter notices that the top + level window has been destroyed, which causes it to dispose + the window, and before the tray manager notices that the + window is gone which would otherwise reset the window and + unref the clone */ + priv->window_actor = g_object_ref (window_actor); + priv->window_actor_destroyed_handler = + g_signal_connect_swapped (window_actor, + "destroy", + remove_cb, + embed); + + /* Hide the original actor otherwise it will appear in the scene + as a normal window */ + clutter_actor_set_opacity (window_actor, 0); + + /* Also make sure it (or any of its children) doesn't block + events on wayland */ + shell_util_set_hidden_from_pick (window_actor, TRUE); + + /* Set an empty input shape on the window so that it can't get + any input. This probably isn't the ideal way to achieve this. + It would probably be better to force the window to go behind + Mutter's guard window, but this is quite difficult to do as + Mutter doesn't manage the stacking for override redirect + windows and the guard window is repeatedly lowered to the + bottom of the stack. */ + empty_region = cairo_region_create (); + gdk_window_input_shape_combine_region (gdk_window, + empty_region, + 0, 0 /* offset x/y */); + cairo_region_destroy (empty_region); + + gdk_window_lower (gdk_window); + + /* Now that we've found the window we don't need to listen for + new windows anymore */ + g_signal_handler_disconnect (display, + priv->window_created_handler); + priv->window_created_handler = 0; + } +} + +static void +shell_gtk_embed_on_window_mapped (GtkWidget *object, + ShellGtkEmbed *embed) +{ + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + MetaDisplay *display = shell_global_get_display (shell_global_get ()); + + if (priv->window_created_handler == 0 && priv->window_actor == NULL) + /* Listen for new windows so we can detect when Mutter has + created a MutterWindow for this window */ + priv->window_created_handler = + g_signal_connect (display, + "window-created", + G_CALLBACK (shell_gtk_embed_window_created_cb), + embed); +} + +static void +shell_gtk_embed_set_window (ShellGtkEmbed *embed, + ShellEmbeddedWindow *window) +{ + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + MetaDisplay *display = shell_global_get_display (shell_global_get ()); + + if (priv->window) + { + if (priv->window_created_handler) + { + g_signal_handler_disconnect (display, + priv->window_created_handler); + priv->window_created_handler = 0; + } + + shell_gtk_embed_remove_window_actor (embed); + + _shell_embedded_window_set_actor (priv->window, NULL); + + g_object_unref (priv->window); + + g_signal_handlers_disconnect_by_func (priv->window, + (gpointer)shell_gtk_embed_on_window_destroy, + embed); + + g_signal_handlers_disconnect_by_func (priv->window, + (gpointer)shell_gtk_embed_on_window_mapped, + embed); + } + + priv->window = window; + + if (priv->window) + { + g_object_ref (priv->window); + + _shell_embedded_window_set_actor (priv->window, embed); + + g_signal_connect (priv->window, "destroy", + G_CALLBACK (shell_gtk_embed_on_window_destroy), embed); + + g_signal_connect (priv->window, "map", + G_CALLBACK (shell_gtk_embed_on_window_mapped), embed); + } + + clutter_actor_queue_relayout (CLUTTER_ACTOR (embed)); +} + +static void +shell_gtk_embed_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (object); + + switch (prop_id) + { + case PROP_WINDOW: + shell_gtk_embed_set_window (embed, (ShellEmbeddedWindow *)g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +shell_gtk_embed_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (object); + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + + switch (prop_id) + { + case PROP_WINDOW: + g_value_set_object (value, priv->window); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +shell_gtk_embed_get_preferred_width (ClutterActor *actor, + float for_height, + float *min_width_p, + float *natural_width_p) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + + if (priv->window + && gtk_widget_get_visible (GTK_WIDGET (priv->window))) + { + GtkRequisition min_req, natural_req; + gtk_widget_get_preferred_size (GTK_WIDGET (priv->window), &min_req, &natural_req); + + *min_width_p = min_req.width; + *natural_width_p = natural_req.width; + } + else + *min_width_p = *natural_width_p = 0; +} + +static void +shell_gtk_embed_get_preferred_height (ClutterActor *actor, + float for_width, + float *min_height_p, + float *natural_height_p) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + + if (priv->window + && gtk_widget_get_visible (GTK_WIDGET (priv->window))) + { + GtkRequisition min_req, natural_req; + gtk_widget_get_preferred_size (GTK_WIDGET (priv->window), &min_req, &natural_req); + + *min_height_p = min_req.height; + *natural_height_p = natural_req.height; + } + else + *min_height_p = *natural_height_p = 0; +} + +static void +shell_gtk_embed_allocate (ClutterActor *actor, + const ClutterActorBox *box, + ClutterAllocationFlags flags) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + float wx = 0.0, wy = 0.0, x, y, ax, ay; + + CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)-> + allocate (actor, box, flags); + + /* Find the actor's new coordinates in terms of the stage (which is + * priv->window's parent window. + */ + while (actor) + { + clutter_actor_get_position (actor, &x, &y); + clutter_actor_get_anchor_point (actor, &ax, &ay); + + wx += x - ax; + wy += y - ay; + + actor = clutter_actor_get_parent (actor); + } + + _shell_embedded_window_allocate (priv->window, + (int)(0.5 + wx), (int)(0.5 + wy), + box->x2 - box->x1, + box->y2 - box->y1); +} + +static void +shell_gtk_embed_map (ClutterActor *actor) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + + _shell_embedded_window_map (priv->window); + + CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->map (actor); +} + +static void +shell_gtk_embed_unmap (ClutterActor *actor) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); + ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); + + _shell_embedded_window_unmap (priv->window); + + CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->unmap (actor); +} + +static void +shell_gtk_embed_dispose (GObject *object) +{ + ShellGtkEmbed *embed = SHELL_GTK_EMBED (object); + + G_OBJECT_CLASS (shell_gtk_embed_parent_class)->dispose (object); + + shell_gtk_embed_set_window (embed, NULL); +} + +static void +shell_gtk_embed_class_init (ShellGtkEmbedClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); + + object_class->get_property = shell_gtk_embed_get_property; + object_class->set_property = shell_gtk_embed_set_property; + object_class->dispose = shell_gtk_embed_dispose; + + actor_class->get_preferred_width = shell_gtk_embed_get_preferred_width; + actor_class->get_preferred_height = shell_gtk_embed_get_preferred_height; + actor_class->allocate = shell_gtk_embed_allocate; + actor_class->map = shell_gtk_embed_map; + actor_class->unmap = shell_gtk_embed_unmap; + + g_object_class_install_property (object_class, + PROP_WINDOW, + g_param_spec_object ("window", + "Window", + "ShellEmbeddedWindow to embed", + SHELL_TYPE_EMBEDDED_WINDOW, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +static void +shell_gtk_embed_init (ShellGtkEmbed *embed) +{ +} + +/* + * Public API + */ +ClutterActor * +shell_gtk_embed_new (ShellEmbeddedWindow *window) +{ + g_return_val_if_fail (SHELL_IS_EMBEDDED_WINDOW (window), NULL); + + return g_object_new (SHELL_TYPE_GTK_EMBED, + "window", window, + NULL); +} diff --git a/src/shell-gtk-embed.h b/src/shell-gtk-embed.h new file mode 100644 index 0000000..4cfc489 --- /dev/null +++ b/src/shell-gtk-embed.h @@ -0,0 +1,20 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_GTK_EMBED_H__ +#define __SHELL_GTK_EMBED_H__ + +#include + +#include "shell-embedded-window.h" + +#define SHELL_TYPE_GTK_EMBED (shell_gtk_embed_get_type ()) +G_DECLARE_DERIVABLE_TYPE (ShellGtkEmbed, shell_gtk_embed, + SHELL, GTK_EMBED, ClutterClone) + +struct _ShellGtkEmbedClass +{ + ClutterCloneClass parent_class; +}; + +ClutterActor *shell_gtk_embed_new (ShellEmbeddedWindow *window); + +#endif /* __SHELL_GTK_EMBED_H__ */ diff --git a/src/shell-invert-lightness-effect.c b/src/shell-invert-lightness-effect.c new file mode 100644 index 0000000..1d4658d --- /dev/null +++ b/src/shell-invert-lightness-effect.c @@ -0,0 +1,210 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright (C) 2010-2012 Inclusive Design Research Centre, OCAD University. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: + * Joseph Scheuhammer + */ + +/** + * SECTION:shell-invert-lightness-effect + * @short_description: A colorization effect where lightness is inverted but + * color is not. + * @see_also: #ClutterEffect, #ClutterOffscreenEffect + * + * #ShellInvertLightnessEffect is a sub-class of #ClutterEffect that enhances + * the appearance of a clutter actor. Specifically it inverts the lightness + * of a #ClutterActor (e.g., darker colors become lighter, white becomes black, + * and white, black). + */ + +#define SHELL_INVERT_LIGHTNESS_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT, ShellInvertLightnessEffectClass)) +#define SHELL_IS_INVERT_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT)) +#define SHELL_INVERT_LIGHTNESS_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_INVERT_LIGHTNESS_EFFEC, ShellInvertLightnessEffectClass)) + +#include "shell-invert-lightness-effect.h" + +#include + +struct _ShellInvertLightnessEffect +{ + ClutterOffscreenEffect parent_instance; + + gint tex_width; + gint tex_height; + + CoglPipeline *pipeline; +}; + +struct _ShellInvertLightnessEffectClass +{ + ClutterOffscreenEffectClass parent_class; + + CoglPipeline *base_pipeline; +}; + +/* Lightness inversion in GLSL. + */ +static const gchar *invert_lightness_source = + "cogl_texel = texture2D (cogl_sampler, cogl_tex_coord.st);\n" + "vec3 effect = vec3 (cogl_texel);\n" + "\n" + "float maxColor = max (cogl_texel.r, max (cogl_texel.g, cogl_texel.b));\n" + "float minColor = min (cogl_texel.r, min (cogl_texel.g, cogl_texel.b));\n" + "float lightness = (maxColor + minColor) / 2.0;\n" + "\n" + "float delta = (1.0 - lightness) - lightness;\n" + "effect.rgb = (effect.rgb + delta);\n" + "\n" + "cogl_texel = vec4 (effect, cogl_texel.a);\n"; + +G_DEFINE_TYPE (ShellInvertLightnessEffect, + shell_invert_lightness_effect, + CLUTTER_TYPE_OFFSCREEN_EFFECT); + +static gboolean +shell_invert_lightness_effect_pre_paint (ClutterEffect *effect) +{ + ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect); + ClutterEffectClass *parent_class; + + if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (effect))) + return FALSE; + + if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL)) + { + /* if we don't have support for GLSL shaders then we + * forcibly disable the ActorMeta + */ + g_warning ("Unable to use the ShellInvertLightnessEffect: the " + "graphics hardware or the current GL driver does not " + "implement support for the GLSL shading language."); + clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (self), FALSE); + return FALSE; + } + + parent_class = + CLUTTER_EFFECT_CLASS (shell_invert_lightness_effect_parent_class); + if (parent_class->pre_paint (effect)) + { + ClutterOffscreenEffect *offscreen_effect = + CLUTTER_OFFSCREEN_EFFECT (effect); + CoglTexture *texture; + + texture = clutter_offscreen_effect_get_texture (offscreen_effect); + self->tex_width = cogl_texture_get_width (texture); + self->tex_height = cogl_texture_get_height (texture); + + cogl_pipeline_set_layer_texture (self->pipeline, 0, texture); + + return TRUE; + } + else + return FALSE; +} + +static void +shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect) +{ + ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect); + ClutterActor *actor; + guint8 paint_opacity; + CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + + actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect)); + paint_opacity = clutter_actor_get_paint_opacity (actor); + + cogl_pipeline_set_color4ub (self->pipeline, + paint_opacity, + paint_opacity, + paint_opacity, + paint_opacity); + cogl_framebuffer_draw_rectangle (fb, self->pipeline, + 0, 0, self->tex_width, self->tex_height); +} + +static void +shell_invert_lightness_effect_dispose (GObject *gobject) +{ + ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (gobject); + + if (self->pipeline != NULL) + { + cogl_object_unref (self->pipeline); + self->pipeline = NULL; + } + + G_OBJECT_CLASS (shell_invert_lightness_effect_parent_class)->dispose (gobject); +} + +static void +shell_invert_lightness_effect_class_init (ShellInvertLightnessEffectClass *klass) +{ + ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + ClutterOffscreenEffectClass *offscreen_class; + + offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass); + offscreen_class->paint_target = shell_invert_lightness_effect_paint_target; + + effect_class->pre_paint = shell_invert_lightness_effect_pre_paint; + + gobject_class->dispose = shell_invert_lightness_effect_dispose; +} + +static void +shell_invert_lightness_effect_init (ShellInvertLightnessEffect *self) +{ + ShellInvertLightnessEffectClass *klass; + klass = SHELL_INVERT_LIGHTNESS_EFFECT_GET_CLASS (self); + + if (G_UNLIKELY (klass->base_pipeline == NULL)) + { + CoglSnippet *snippet; + CoglContext *ctx = + clutter_backend_get_cogl_context (clutter_get_default_backend ()); + + klass->base_pipeline = cogl_pipeline_new (ctx); + + snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_TEXTURE_LOOKUP, + NULL, + NULL); + cogl_snippet_set_replace (snippet, invert_lightness_source); + cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet); + cogl_object_unref (snippet); + + cogl_pipeline_set_layer_null_texture (klass->base_pipeline, + 0, /* layer number */ + COGL_TEXTURE_TYPE_2D); + } + + self->pipeline = cogl_pipeline_copy (klass->base_pipeline); +} + +/** + * shell_invert_lightness_effect_new: + * + * Creates a new #ShellInvertLightnessEffect to be used with + * clutter_actor_add_effect() + * + * Return value: (transfer full): the newly created + * #ShellInvertLightnessEffect or %NULL. Use g_object_unref() when done. + */ +ClutterEffect * +shell_invert_lightness_effect_new (void) +{ + return g_object_new (SHELL_TYPE_INVERT_LIGHTNESS_EFFECT, NULL); +} diff --git a/src/shell-invert-lightness-effect.h b/src/shell-invert-lightness-effect.h new file mode 100644 index 0000000..3d7cf3a --- /dev/null +++ b/src/shell-invert-lightness-effect.h @@ -0,0 +1,41 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright © 2010-2012 Inclusive Design Research Centre, OCAD University. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: + * Joseph Scheuhammer + */ +#ifndef __SHELL_INVERT_LIGHTNESS_EFFECT_H__ +#define __SHELL_INVERT_LIGHTNESS_EFFECT_H__ + +#include + +G_BEGIN_DECLS + +#define SHELL_TYPE_INVERT_LIGHTNESS_EFFECT (shell_invert_lightness_effect_get_type ()) +#define SHELL_INVERT_LIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT, ShellInvertLightnessEffect)) +#define SHELL_IS_INVERT_LIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT)) + +typedef struct _ShellInvertLightnessEffect ShellInvertLightnessEffect; +typedef struct _ShellInvertLightnessEffectClass ShellInvertLightnessEffectClass; + +GType shell_invert_lightness_effect_get_type (void) G_GNUC_CONST; + +ClutterEffect *shell_invert_lightness_effect_new (void); + +G_END_DECLS + +#endif /* __SHELL_INVERT_LIGHTNESS_EFFECT_H__ */ diff --git a/src/shell-keyring-prompt.c b/src/shell-keyring-prompt.c new file mode 100644 index 0000000..7ab061c --- /dev/null +++ b/src/shell-keyring-prompt.c @@ -0,0 +1,798 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright 2012 Red Hat, Inc. + * 2012 Stef Walter + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Author: Stef Walter + */ + +#include "config.h" + +#include "shell-keyring-prompt.h" +#include "shell-secure-text-buffer.h" + +#define GCR_API_SUBJECT_TO_CHANGE +#include + +#include + +#include + +typedef struct _ShellPasswordPromptPrivate ShellPasswordPromptPrivate; + +typedef enum +{ + PROMPTING_NONE, + PROMPTING_FOR_CONFIRM, + PROMPTING_FOR_PASSWORD +} PromptingMode; + +struct _ShellKeyringPrompt +{ + GObject parent; + + gchar *title; + gchar *message; + gchar *description; + gchar *warning; + gchar *choice_label; + gboolean choice_chosen; + gboolean password_new; + guint password_strength; + gchar *continue_label; + gchar *cancel_label; + + GTask *task; + ClutterText *password_actor; + ClutterText *confirm_actor; + PromptingMode mode; + gboolean shown; +}; + +enum { + PROP_0, + PROP_TITLE, + PROP_MESSAGE, + PROP_DESCRIPTION, + PROP_WARNING, + PROP_CHOICE_LABEL, + PROP_CHOICE_CHOSEN, + PROP_PASSWORD_NEW, + PROP_PASSWORD_STRENGTH, + PROP_CALLER_WINDOW, + PROP_CONTINUE_LABEL, + PROP_CANCEL_LABEL, + PROP_PASSWORD_VISIBLE, + PROP_CONFIRM_VISIBLE, + PROP_WARNING_VISIBLE, + PROP_CHOICE_VISIBLE, + PROP_PASSWORD_ACTOR, + PROP_CONFIRM_ACTOR +}; + +static void shell_keyring_prompt_iface (GcrPromptIface *iface); + +G_DEFINE_TYPE_WITH_CODE (ShellKeyringPrompt, shell_keyring_prompt, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, shell_keyring_prompt_iface); +); + +enum { + SIGNAL_SHOW_PASSWORD, + SIGNAL_SHOW_CONFIRM, + SIGNAL_LAST +}; + +static gint signals[SIGNAL_LAST]; + +static void +shell_keyring_prompt_init (ShellKeyringPrompt *self) +{ + +} + +static gchar * +remove_mnemonics (const GValue *value) +{ + const gchar mnemonic = '_'; + gchar *stripped_label, *temp; + const gchar *label; + + g_return_val_if_fail (value != NULL, NULL); + g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL); + + label = g_value_get_string (value); + g_return_val_if_fail (label != NULL, NULL); + + /* Stripped label will have the original label lenght at most */ + stripped_label = temp = g_new (gchar, strlen(label) + 1); + g_assert (stripped_label != NULL); + + while (*label != '\0') + { + if (*label == mnemonic) + label++; + *(temp++) = *(label++); + } + *temp = '\0'; + + return stripped_label; +} + +static void +shell_keyring_prompt_set_property (GObject *obj, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (obj); + + switch (prop_id) { + case PROP_TITLE: + g_free (self->title); + self->title = g_value_dup_string (value); + g_object_notify (obj, "title"); + break; + case PROP_MESSAGE: + g_free (self->message); + self->message = g_value_dup_string (value); + g_object_notify (obj, "message"); + break; + case PROP_DESCRIPTION: + g_free (self->description); + self->description = g_value_dup_string (value); + g_object_notify (obj, "description"); + break; + case PROP_WARNING: + g_free (self->warning); + self->warning = g_value_dup_string (value); + if (!self->warning) + self->warning = g_strdup (""); + g_object_notify (obj, "warning"); + g_object_notify (obj, "warning-visible"); + break; + case PROP_CHOICE_LABEL: + g_free (self->choice_label); + self->choice_label = remove_mnemonics (value); + if (!self->choice_label) + self->choice_label = g_strdup (""); + g_object_notify (obj, "choice-label"); + g_object_notify (obj, "choice-visible"); + break; + case PROP_CHOICE_CHOSEN: + self->choice_chosen = g_value_get_boolean (value); + g_object_notify (obj, "choice-chosen"); + break; + case PROP_PASSWORD_NEW: + self->password_new = g_value_get_boolean (value); + g_object_notify (obj, "password-new"); + g_object_notify (obj, "confirm-visible"); + break; + case PROP_CALLER_WINDOW: + /* ignored */ + break; + case PROP_CONTINUE_LABEL: + g_free (self->continue_label); + self->continue_label = remove_mnemonics (value); + g_object_notify (obj, "continue-label"); + break; + case PROP_CANCEL_LABEL: + g_free (self->cancel_label); + self->cancel_label = remove_mnemonics (value); + g_object_notify (obj, "cancel-label"); + break; + case PROP_PASSWORD_ACTOR: + shell_keyring_prompt_set_password_actor (self, g_value_get_object (value)); + break; + case PROP_CONFIRM_ACTOR: + shell_keyring_prompt_set_confirm_actor (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +shell_keyring_prompt_get_property (GObject *obj, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (obj); + + switch (prop_id) { + case PROP_TITLE: + g_value_set_string (value, self->title ? self->title : ""); + break; + case PROP_MESSAGE: + g_value_set_string (value, self->message ? self->message : ""); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, self->description ? self->description : ""); + break; + case PROP_WARNING: + g_value_set_string (value, self->warning ? self->warning : ""); + break; + case PROP_CHOICE_LABEL: + g_value_set_string (value, self->choice_label ? self->choice_label : ""); + break; + case PROP_CHOICE_CHOSEN: + g_value_set_boolean (value, self->choice_chosen); + break; + case PROP_PASSWORD_NEW: + g_value_set_boolean (value, self->password_new); + break; + case PROP_PASSWORD_STRENGTH: + g_value_set_int (value, self->password_strength); + break; + case PROP_CALLER_WINDOW: + g_value_set_string (value, ""); + break; + case PROP_CONTINUE_LABEL: + g_value_set_string (value, self->continue_label); + break; + case PROP_CANCEL_LABEL: + g_value_set_string (value, self->cancel_label); + break; + case PROP_PASSWORD_VISIBLE: + g_value_set_boolean (value, self->mode == PROMPTING_FOR_PASSWORD); + break; + case PROP_CONFIRM_VISIBLE: + g_value_set_boolean (value, self->password_new && + self->mode == PROMPTING_FOR_PASSWORD); + break; + case PROP_WARNING_VISIBLE: + g_value_set_boolean (value, self->warning && self->warning[0]); + break; + case PROP_CHOICE_VISIBLE: + g_value_set_boolean (value, self->choice_label && self->choice_label[0]); + break; + case PROP_PASSWORD_ACTOR: + g_value_set_object (value, shell_keyring_prompt_get_password_actor (self)); + break; + case PROP_CONFIRM_ACTOR: + g_value_set_object (value, shell_keyring_prompt_get_confirm_actor (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); + break; + } +} + +static void +shell_keyring_prompt_dispose (GObject *obj) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (obj); + + if (self->shown) + gcr_prompt_close (GCR_PROMPT (self)); + + if (self->task) + shell_keyring_prompt_cancel (self); + g_assert (self->task == NULL); + + shell_keyring_prompt_set_password_actor (self, NULL); + shell_keyring_prompt_set_confirm_actor (self, NULL); + + G_OBJECT_CLASS (shell_keyring_prompt_parent_class)->dispose (obj); +} + +static void +shell_keyring_prompt_finalize (GObject *obj) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (obj); + + g_free (self->title); + g_free (self->message); + g_free (self->description); + g_free (self->warning); + g_free (self->choice_label); + g_free (self->continue_label); + g_free (self->cancel_label); + + G_OBJECT_CLASS (shell_keyring_prompt_parent_class)->finalize (obj); +} + +static void +shell_keyring_prompt_class_init (ShellKeyringPromptClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = shell_keyring_prompt_get_property; + gobject_class->set_property = shell_keyring_prompt_set_property; + gobject_class->dispose = shell_keyring_prompt_dispose; + gobject_class->finalize = shell_keyring_prompt_finalize; + + g_object_class_override_property (gobject_class, PROP_TITLE, "title"); + + g_object_class_override_property (gobject_class, PROP_MESSAGE, "message"); + + g_object_class_override_property (gobject_class, PROP_DESCRIPTION, "description"); + + g_object_class_override_property (gobject_class, PROP_WARNING, "warning"); + + g_object_class_override_property (gobject_class, PROP_PASSWORD_NEW, "password-new"); + + g_object_class_override_property (gobject_class, PROP_PASSWORD_STRENGTH, "password-strength"); + + g_object_class_override_property (gobject_class, PROP_CHOICE_LABEL, "choice-label"); + + g_object_class_override_property (gobject_class, PROP_CHOICE_CHOSEN, "choice-chosen"); + + g_object_class_override_property (gobject_class, PROP_CALLER_WINDOW, "caller-window"); + + g_object_class_override_property (gobject_class, PROP_CONTINUE_LABEL, "continue-label"); + + g_object_class_override_property (gobject_class, PROP_CANCEL_LABEL, "cancel-label"); + + /** + * ShellKeyringPrompt:password-visible: + * + * Whether the password entry is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_PASSWORD_VISIBLE, + g_param_spec_boolean ("password-visible", "Password visible", "Password field is visible", + FALSE, G_PARAM_READABLE)); + + /** + * ShellKeyringPrompt:confirm-visible: + * + * Whether the password confirm entry is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_CONFIRM_VISIBLE, + g_param_spec_boolean ("confirm-visible", "Confirm visible", "Confirm field is visible", + FALSE, G_PARAM_READABLE)); + + /** + * ShellKeyringPrompt:warning-visible: + * + * Whether the warning label is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_WARNING_VISIBLE, + g_param_spec_boolean ("warning-visible", "Warning visible", "Warning is visible", + FALSE, G_PARAM_READABLE)); + + /** + * ShellKeyringPrompt:choice-visible: + * + * Whether the choice check box is visible or not. + */ + g_object_class_install_property (gobject_class, PROP_CHOICE_VISIBLE, + g_param_spec_boolean ("choice-visible", "Choice visible", "Choice is visible", + FALSE, G_PARAM_READABLE)); + + /** + * ShellKeyringPrompt:password-actor: + * + * Text field for password + */ + g_object_class_install_property (gobject_class, PROP_PASSWORD_ACTOR, + g_param_spec_object ("password-actor", "Password actor", "Text field for password", + CLUTTER_TYPE_TEXT, G_PARAM_READWRITE)); + + /** + * ShellKeyringPrompt:confirm-actor: + * + * Text field for confirmation password + */ + g_object_class_install_property (gobject_class, PROP_CONFIRM_ACTOR, + g_param_spec_object ("confirm-actor", "Confirm actor", "Text field for confirming password", + CLUTTER_TYPE_TEXT, G_PARAM_READWRITE)); + + signals[SIGNAL_SHOW_PASSWORD] = g_signal_new ("show-password", G_TYPE_FROM_CLASS (klass), + 0, 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[SIGNAL_SHOW_CONFIRM] = g_signal_new ("show-confirm", G_TYPE_FROM_CLASS (klass), + 0, 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +shell_keyring_prompt_password_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); + GObject *obj; + + if (self->task != NULL) { + g_warning ("this prompt can only show one prompt at a time"); + return; + } + + self->mode = PROMPTING_FOR_PASSWORD; + self->task = g_task_new (self, NULL, callback, user_data); + g_task_set_source_tag (self->task, shell_keyring_prompt_password_async); + + obj = G_OBJECT (self); + g_object_notify (obj, "password-visible"); + g_object_notify (obj, "confirm-visible"); + g_object_notify (obj, "warning-visible"); + g_object_notify (obj, "choice-visible"); + + self->shown = TRUE; + g_signal_emit (self, signals[SIGNAL_SHOW_PASSWORD], 0); +} + +static const gchar * +shell_keyring_prompt_password_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_get_source_object (G_TASK (result)) == prompt, NULL); + g_return_val_if_fail (g_async_result_is_tagged (result, + shell_keyring_prompt_password_async), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +shell_keyring_prompt_confirm_async (GcrPrompt *prompt, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); + GObject *obj; + + if (self->task != NULL) { + g_warning ("this prompt is already prompting"); + return; + } + + self->mode = PROMPTING_FOR_CONFIRM; + self->task = g_task_new (self, NULL, callback, user_data); + g_task_set_source_tag (self->task, shell_keyring_prompt_confirm_async); + + obj = G_OBJECT (self); + g_object_notify (obj, "password-visible"); + g_object_notify (obj, "confirm-visible"); + g_object_notify (obj, "warning-visible"); + g_object_notify (obj, "choice-visible"); + + self->shown = TRUE; + g_signal_emit (self, signals[SIGNAL_SHOW_CONFIRM], 0); +} + +static GcrPromptReply +shell_keyring_prompt_confirm_finish (GcrPrompt *prompt, + GAsyncResult *result, + GError **error) +{ + GTask *task = G_TASK (result); + gssize res; + + g_return_val_if_fail (g_task_get_source_object (task) == prompt, + GCR_PROMPT_REPLY_CANCEL); + g_return_val_if_fail (g_async_result_is_tagged (result, + shell_keyring_prompt_confirm_async), GCR_PROMPT_REPLY_CANCEL); + + res = g_task_propagate_int (task, error); + return res == -1 ? GCR_PROMPT_REPLY_CANCEL : (GcrPromptReply)res; +} + +static void +shell_keyring_prompt_close (GcrPrompt *prompt) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); + + /* + * We expect keyring.js to connect to this signal and do the + * actual work of closing the prompt. + */ + + self->shown = FALSE; +} + +static void +shell_keyring_prompt_iface (GcrPromptIface *iface) +{ + iface->prompt_password_async = shell_keyring_prompt_password_async; + iface->prompt_password_finish = shell_keyring_prompt_password_finish; + iface->prompt_confirm_async = shell_keyring_prompt_confirm_async; + iface->prompt_confirm_finish = shell_keyring_prompt_confirm_finish; + iface->prompt_close = shell_keyring_prompt_close; +} + +/** + * shell_keyring_prompt_new: + * + * Create new internal prompt base + * + * Returns: (transfer full): new internal prompt + */ +ShellKeyringPrompt * +shell_keyring_prompt_new (void) +{ + return g_object_new (SHELL_TYPE_KEYRING_PROMPT, NULL); +} + +/** + * shell_keyring_prompt_get_password_actor: + * @self: the internal prompt + * + * Get the prompt password text actor + * + * Returns: (transfer none) (nullable): the password actor + */ +ClutterText * +shell_keyring_prompt_get_password_actor (ShellKeyringPrompt *self) +{ + g_return_val_if_fail (SHELL_IS_KEYRING_PROMPT (self), NULL); + return self->password_actor; +} + +/** + * shell_keyring_prompt_get_confirm_actor: + * @self: the internal prompt + * + * Get the prompt password text actor + * + * Returns: (transfer none) (nullable): the password actor + */ +ClutterText * +shell_keyring_prompt_get_confirm_actor (ShellKeyringPrompt *self) +{ + g_return_val_if_fail (SHELL_IS_KEYRING_PROMPT (self), NULL); + return self->confirm_actor; +} + +static guint +calculate_password_strength (const gchar *password) +{ + int upper, lower, digit, misc; + gdouble pwstrength; + int length, i; + + /* + * This code is based on the Master Password dialog in Firefox + * (pref-masterpass.js) + * Original code triple-licensed under the MPL, GPL, and LGPL + * so is license-compatible with this file + */ + + length = strlen (password); + + /* Always return 0 for empty passwords */ + if (length == 0) + return 0; + + upper = 0; + lower = 0; + digit = 0; + misc = 0; + + for (i = 0; i < length ; i++) + { + if (g_ascii_isdigit (password[i])) + digit++; + else if (g_ascii_islower (password[i])) + lower++; + else if (g_ascii_isupper (password[i])) + upper++; + else + misc++; + } + + if (length > 5) + length = 5; + if (digit > 3) + digit = 3; + if (upper > 3) + upper = 3; + if (misc > 3) + misc = 3; + + pwstrength = ((length * 1) - 2) + + (digit * 1) + + (misc * 1.5) + + (upper * 1); + + /* Always return 1+ for non-empty passwords */ + if (pwstrength < 1.0) + pwstrength = 1.0; + if (pwstrength > 10.0) + pwstrength = 10.0; + + return (guint)pwstrength; +} + +static void +on_password_changed (ClutterText *text, + gpointer user_data) +{ + ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (user_data); + const gchar *password; + + password = clutter_text_get_text (self->password_actor); + + self->password_strength = calculate_password_strength (password); + g_object_notify (G_OBJECT (self), "password-strength"); +} + +/** + * shell_keyring_prompt_set_password_actor: + * @self: the internal prompt + * @password_actor: (nullable): the password actor + * + * Set the prompt password text actor + */ +void +shell_keyring_prompt_set_password_actor (ShellKeyringPrompt *self, + ClutterText *password_actor) +{ + ClutterTextBuffer *buffer; + + g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); + g_return_if_fail (password_actor == NULL || CLUTTER_IS_TEXT (password_actor)); + + if (password_actor) + { + buffer = shell_secure_text_buffer_new (); + clutter_text_set_buffer (password_actor, buffer); + g_object_unref (buffer); + + g_signal_connect (password_actor, "text-changed", G_CALLBACK (on_password_changed), self); + g_object_ref (password_actor); + } + if (self->password_actor) + { + g_signal_handlers_disconnect_by_func (self->password_actor, on_password_changed, self); + g_object_unref (self->password_actor); + } + + self->password_actor = password_actor; + g_object_notify (G_OBJECT (self), "password-actor"); +} + +/** + * shell_keyring_prompt_set_confirm_actor: + * @self: the internal prompt + * @confirm_actor: (nullable): the confirm password actor + * + * Set the prompt password confirmation text actor + */ +void +shell_keyring_prompt_set_confirm_actor (ShellKeyringPrompt *self, + ClutterText *confirm_actor) +{ + ClutterTextBuffer *buffer; + + g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); + g_return_if_fail (confirm_actor == NULL || CLUTTER_IS_TEXT (confirm_actor)); + + if (confirm_actor) + { + buffer = shell_secure_text_buffer_new (); + clutter_text_set_buffer (confirm_actor, buffer); + g_object_unref (buffer); + + g_object_ref (confirm_actor); + } + if (self->confirm_actor) + g_object_unref (self->confirm_actor); + self->confirm_actor = confirm_actor; + g_object_notify (G_OBJECT (self), "confirm-actor"); +} + +/** + * shell_keyring_prompt_complete: + * @self: the internal prompt + * + * Called by the implementation when the prompt completes. There are various + * checks done. %TRUE is returned if the prompt actually should complete. + * + * Returns: whether the prompt completed + */ +gboolean +shell_keyring_prompt_complete (ShellKeyringPrompt *self) +{ + GTask *res; + PromptingMode mode; + const gchar *password; + const gchar *confirm; + const gchar *env; + + g_return_val_if_fail (SHELL_IS_KEYRING_PROMPT (self), FALSE); + g_return_val_if_fail (self->mode != PROMPTING_NONE, FALSE); + g_return_val_if_fail (self->task != NULL, FALSE); + + password = clutter_text_get_text (self->password_actor); + + if (self->mode == PROMPTING_FOR_PASSWORD) + { + /* Is it a new password? */ + if (self->password_new) + { + confirm = clutter_text_get_text (self->confirm_actor); + + /* Do the passwords match? */ + if (!g_str_equal (password, confirm)) + { + gcr_prompt_set_warning (GCR_PROMPT (self), _("Passwords do not match.")); + return FALSE; + } + + /* Don't allow blank passwords if in paranoid mode */ + env = g_getenv ("GNOME_KEYRING_PARANOID"); + if (env && *env) + { + gcr_prompt_set_warning (GCR_PROMPT (self), _("Password cannot be blank")); + return FALSE; + } + } + + self->password_strength = calculate_password_strength (password); + g_object_notify (G_OBJECT (self), "password-strength"); + } + + res = self->task; + mode = self->mode; + self->task = NULL; + self->mode = PROMPTING_NONE; + + if (mode == PROMPTING_FOR_CONFIRM) + g_task_return_int (res, (gssize)GCR_PROMPT_REPLY_CONTINUE); + else + g_task_return_pointer (res, (gpointer)password, NULL); + g_object_unref (res); + + return TRUE; +} + +/** + * shell_keyring_prompt_cancel: + * @self: the internal prompt + * + * Called by implementation when the prompt is cancelled. + */ +void +shell_keyring_prompt_cancel (ShellKeyringPrompt *self) +{ + GTask *res; + PromptingMode mode; + + g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); + + /* + * If cancelled while not prompting, we should just close the prompt, + * the user wants it to go away. + */ + if (self->mode == PROMPTING_NONE) + { + if (self->shown) + gcr_prompt_close (GCR_PROMPT (self)); + return; + } + + g_return_if_fail (self->task != NULL); + + res = self->task; + mode = self->mode; + self->task = NULL; + self->mode = PROMPTING_NONE; + + if (mode == PROMPTING_FOR_CONFIRM) + g_task_return_int (res, (gssize) GCR_PROMPT_REPLY_CANCEL); + else + g_task_return_pointer (res, NULL, NULL); + g_object_unref (res); +} diff --git a/src/shell-keyring-prompt.h b/src/shell-keyring-prompt.h new file mode 100644 index 0000000..fcacf4c --- /dev/null +++ b/src/shell-keyring-prompt.h @@ -0,0 +1,57 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* shell-keyring-prompt.c - prompt handler for gnome-keyring-daemon + + Copyright (C) 2011 Stefan Walter + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + Author: Stef Walter +*/ + +#ifndef __SHELL_KEYRING_PROMPT_H__ +#define __SHELL_KEYRING_PROMPT_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +typedef struct _ShellKeyringPrompt ShellKeyringPrompt; + +#define SHELL_TYPE_KEYRING_PROMPT (shell_keyring_prompt_get_type ()) +G_DECLARE_FINAL_TYPE (ShellKeyringPrompt, shell_keyring_prompt, + SHELL, KEYRING_PROMPT, GObject) + +ShellKeyringPrompt * shell_keyring_prompt_new (void); + +ClutterText * shell_keyring_prompt_get_password_actor (ShellKeyringPrompt *self); + +void shell_keyring_prompt_set_password_actor (ShellKeyringPrompt *self, + ClutterText *password_actor); + +ClutterText * shell_keyring_prompt_get_confirm_actor (ShellKeyringPrompt *self); + +void shell_keyring_prompt_set_confirm_actor (ShellKeyringPrompt *self, + ClutterText *confirm_actor); + +gboolean shell_keyring_prompt_complete (ShellKeyringPrompt *self); + +void shell_keyring_prompt_cancel (ShellKeyringPrompt *self); + +G_END_DECLS + +#endif /* __SHELL_KEYRING_PROMPT_H__ */ diff --git a/src/shell-mount-operation.c b/src/shell-mount-operation.c new file mode 100644 index 0000000..4579aaf --- /dev/null +++ b/src/shell-mount-operation.c @@ -0,0 +1,189 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright (C) 2011 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: Cosimo Cecchi + * + */ + +#include "shell-mount-operation.h" + +/* This is a dummy class; we would like to be able to subclass the + * object from JS but we can't yet; the default GMountOperation impl + * automatically calls g_mount_operation_reply(UNHANDLED) after an idle, + * in interactive methods. We want to handle the reply outselves + * instead, so we just override the default methods with empty ones, + * except for ask-password, as we don't want to handle that. + * + * Also, we need to workaround the fact that gjs doesn't support type + * annotations for signals yet (so we can't effectively forward e.g. + * the GPid array to JS). + * See https://bugzilla.gnome.org/show_bug.cgi?id=645978 + */ + +enum { + SHOW_PROCESSES_2, + NUM_SIGNALS +}; + +static guint signals[NUM_SIGNALS] = { 0, }; + +typedef struct _ShellMountOperationPrivate ShellMountOperationPrivate; + +struct _ShellMountOperation +{ + GMountOperation parent_instance; + + ShellMountOperationPrivate *priv; +}; + +struct _ShellMountOperationPrivate { + GArray *pids; + gchar **choices; + gchar *message; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ShellMountOperation, shell_mount_operation, G_TYPE_MOUNT_OPERATION); + +static void +shell_mount_operation_init (ShellMountOperation *self) +{ + self->priv = shell_mount_operation_get_instance_private (self); +} + +static void +shell_mount_operation_ask_password (GMountOperation *op, + const char *message, + const char *default_user, + const char *default_domain, + GAskPasswordFlags flags) +{ + /* do nothing */ +} + +static void +shell_mount_operation_ask_question (GMountOperation *op, + const char *message, + const char *choices[]) +{ + /* do nothing */ +} + +static void +shell_mount_operation_show_processes (GMountOperation *operation, + const gchar *message, + GArray *processes, + const gchar *choices[]) +{ + ShellMountOperation *self = SHELL_MOUNT_OPERATION (operation); + + if (self->priv->pids != NULL) + { + g_array_unref (self->priv->pids); + self->priv->pids = NULL; + } + + g_free (self->priv->message); + g_strfreev (self->priv->choices); + + /* save the parameters */ + self->priv->pids = g_array_ref (processes); + self->priv->choices = g_strdupv ((gchar **) choices); + self->priv->message = g_strdup (message); + + g_signal_emit (self, signals[SHOW_PROCESSES_2], 0); +} + +static void +shell_mount_operation_finalize (GObject *obj) +{ + ShellMountOperation *self = SHELL_MOUNT_OPERATION (obj); + + g_strfreev (self->priv->choices); + g_free (self->priv->message); + + if (self->priv->pids != NULL) + { + g_array_unref (self->priv->pids); + self->priv->pids = NULL; + } + + G_OBJECT_CLASS (shell_mount_operation_parent_class)->finalize (obj); +} + +static void +shell_mount_operation_class_init (ShellMountOperationClass *klass) +{ + GMountOperationClass *mclass; + GObjectClass *oclass; + + mclass = G_MOUNT_OPERATION_CLASS (klass); + mclass->show_processes = shell_mount_operation_show_processes; + mclass->ask_question = shell_mount_operation_ask_question; + mclass->ask_password = shell_mount_operation_ask_password; + + oclass = G_OBJECT_CLASS (klass); + oclass->finalize = shell_mount_operation_finalize; + + signals[SHOW_PROCESSES_2] = + g_signal_new ("show-processes-2", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); +} + +GMountOperation * +shell_mount_operation_new (void) +{ + return g_object_new (SHELL_TYPE_MOUNT_OPERATION, NULL); +} + +/** + * shell_mount_operation_get_show_processes_pids: + * @self: a #ShellMountOperation + * + * Returns: (transfer full) (element-type GPid): a #GArray + */ +GArray * +shell_mount_operation_get_show_processes_pids (ShellMountOperation *self) +{ + return g_array_ref (self->priv->pids); +} + +/** + * shell_mount_operation_get_show_processes_choices: + * @self: a #ShellMountOperation + * + * Returns: (transfer full): + */ +gchar ** +shell_mount_operation_get_show_processes_choices (ShellMountOperation *self) +{ + return g_strdupv (self->priv->choices); +} + +/** + * shell_mount_operation_get_show_processes_message: + * @self: a #ShellMountOperation + * + * Returns: (transfer full): + */ +gchar * +shell_mount_operation_get_show_processes_message (ShellMountOperation *self) +{ + return g_strdup (self->priv->message); +} diff --git a/src/shell-mount-operation.h b/src/shell-mount-operation.h new file mode 100644 index 0000000..c4019a5 --- /dev/null +++ b/src/shell-mount-operation.h @@ -0,0 +1,41 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright (C) 2011 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: Cosimo Cecchi + * + */ + +#ifndef __SHELL_MOUNT_OPERATION_H__ +#define __SHELL_MOUNT_OPERATION_H__ + +#include + +G_BEGIN_DECLS + +#define SHELL_TYPE_MOUNT_OPERATION (shell_mount_operation_get_type ()) +G_DECLARE_FINAL_TYPE (ShellMountOperation, shell_mount_operation, + SHELL, MOUNT_OPERATION, GMountOperation) + +GMountOperation *shell_mount_operation_new (void); + +GArray * shell_mount_operation_get_show_processes_pids (ShellMountOperation *self); +gchar ** shell_mount_operation_get_show_processes_choices (ShellMountOperation *self); +gchar * shell_mount_operation_get_show_processes_message (ShellMountOperation *self); + +G_END_DECLS + +#endif /* __SHELL_MOUNT_OPERATION_H__ */ diff --git a/src/shell-network-agent.c b/src/shell-network-agent.c new file mode 100644 index 0000000..8e1f820 --- /dev/null +++ b/src/shell-network-agent.c @@ -0,0 +1,813 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +/* + * Copyright 2011 Red Hat, Inc. + * 2011 Giovanni Campagna + * 2017 Lubomir Rintel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include "config.h" +#include + +#include + +#include "shell-network-agent.h" + +enum { + SIGNAL_NEW_REQUEST, + SIGNAL_CANCEL_REQUEST, + SIGNAL_LAST +}; + +static gint signals[SIGNAL_LAST]; + +typedef struct { + GCancellable * cancellable; + ShellNetworkAgent *self; + + gchar *request_id; + NMConnection *connection; + gchar *setting_name; + gchar **hints; + NMSecretAgentGetSecretsFlags flags; + NMSecretAgentOldGetSecretsFunc callback; + gpointer callback_data; + + GVariantDict *entries; +} ShellAgentRequest; + +struct _ShellNetworkAgentPrivate { + /* */ + GHashTable *requests; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ShellNetworkAgent, shell_network_agent, NM_TYPE_SECRET_AGENT_OLD) + +static const SecretSchema network_agent_schema = { + "org.freedesktop.NetworkManager.Connection", + SECRET_SCHEMA_DONT_MATCH_NAME, + { + { SHELL_KEYRING_UUID_TAG, SECRET_SCHEMA_ATTRIBUTE_STRING }, + { SHELL_KEYRING_SN_TAG, SECRET_SCHEMA_ATTRIBUTE_STRING }, + { SHELL_KEYRING_SK_TAG, SECRET_SCHEMA_ATTRIBUTE_STRING }, + { NULL, 0 }, + } +}; + +static void +shell_agent_request_free (gpointer data) +{ + ShellAgentRequest *request = data; + + g_cancellable_cancel (request->cancellable); + g_object_unref (request->cancellable); + g_object_unref (request->self); + g_object_unref (request->connection); + g_free (request->setting_name); + g_strfreev (request->hints); + g_clear_pointer (&request->entries, g_variant_dict_unref); + + g_slice_free (ShellAgentRequest, request); +} + +static void +shell_agent_request_cancel (ShellAgentRequest *request) +{ + GError *error; + ShellNetworkAgent *self; + + self = request->self; + + error = g_error_new (NM_SECRET_AGENT_ERROR, + NM_SECRET_AGENT_ERROR_AGENT_CANCELED, + "Canceled by NetworkManager"); + request->callback (NM_SECRET_AGENT_OLD (self), request->connection, + NULL, error, request->callback_data); + + g_signal_emit (self, signals[SIGNAL_CANCEL_REQUEST], 0, request->request_id); + + g_hash_table_remove (self->priv->requests, request->request_id); + g_error_free (error); +} + +static void +shell_network_agent_init (ShellNetworkAgent *agent) +{ + ShellNetworkAgentPrivate *priv; + + priv = agent->priv = shell_network_agent_get_instance_private (agent); + priv->requests = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, shell_agent_request_free); +} + +static void +shell_network_agent_finalize (GObject *object) +{ + ShellNetworkAgentPrivate *priv = SHELL_NETWORK_AGENT (object)->priv; + GError *error; + GHashTableIter iter; + gpointer key; + gpointer value; + + error = g_error_new (NM_SECRET_AGENT_ERROR, + NM_SECRET_AGENT_ERROR_AGENT_CANCELED, + "The secret agent is going away"); + + g_hash_table_iter_init (&iter, priv->requests); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + ShellAgentRequest *request = value; + + request->callback (NM_SECRET_AGENT_OLD (object), + request->connection, + NULL, error, + request->callback_data); + } + + g_hash_table_destroy (priv->requests); + g_error_free (error); + + G_OBJECT_CLASS (shell_network_agent_parent_class)->finalize (object); +} + +static void +request_secrets_from_ui (ShellAgentRequest *request) +{ + g_signal_emit (request->self, signals[SIGNAL_NEW_REQUEST], 0, + request->request_id, + request->connection, + request->setting_name, + request->hints, + (int)request->flags); +} + +static void +check_always_ask_cb (NMSetting *setting, + const gchar *key, + const GValue *value, + GParamFlags flags, + gpointer user_data) +{ + gboolean *always_ask = user_data; + NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; + + if (flags & NM_SETTING_PARAM_SECRET) + { + if (nm_setting_get_secret_flags (setting, key, &secret_flags, NULL)) + { + if (secret_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED) + *always_ask = TRUE; + } + } +} + +static gboolean +has_always_ask (NMSetting *setting) +{ + gboolean always_ask = FALSE; + + nm_setting_enumerate_values (setting, check_always_ask_cb, &always_ask); + return always_ask; +} + +static gboolean +is_connection_always_ask (NMConnection *connection) +{ + NMSettingConnection *s_con; + const gchar *ctype; + NMSetting *setting; + + /* For the given connection type, check if the secrets for that connection + * are always-ask or not. + */ + s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); + g_assert (s_con); + ctype = nm_setting_connection_get_connection_type (s_con); + + setting = nm_connection_get_setting_by_name (connection, ctype); + g_return_val_if_fail (setting != NULL, FALSE); + + if (has_always_ask (setting)) + return TRUE; + + /* Try type-specific settings too; be a bit paranoid and only consider + * secrets from settings relevant to the connection type. + */ + if (NM_IS_SETTING_WIRELESS (setting)) + { + setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY); + if (setting && has_always_ask (setting)) + return TRUE; + setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X); + if (setting && has_always_ask (setting)) + return TRUE; + } + else if (NM_IS_SETTING_WIRED (setting)) + { + setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_PPPOE); + if (setting && has_always_ask (setting)) + return TRUE; + setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X); + if (setting && has_always_ask (setting)) + return TRUE; + } + + return FALSE; +} + +static void +get_secrets_keyring_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + ShellAgentRequest *closure; + ShellNetworkAgent *self; + ShellNetworkAgentPrivate *priv; + GError *secret_error = NULL; + GError *error = NULL; + GList *items; + GList *l; + gboolean secrets_found = FALSE; + GVariantBuilder builder_setting, builder_connection; + GVariant *setting; + + items = secret_service_search_finish (NULL, result, &secret_error); + + if (g_error_matches (secret_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + g_error_free (secret_error); + return; + } + + closure = user_data; + self = closure->self; + priv = self->priv; + + if (secret_error != NULL) + { + g_set_error (&error, + NM_SECRET_AGENT_ERROR, + NM_SECRET_AGENT_ERROR_FAILED, + "Internal error while retrieving secrets from the keyring (%s)", secret_error->message); + g_error_free (secret_error); + closure->callback (NM_SECRET_AGENT_OLD (closure->self), closure->connection, NULL, error, closure->callback_data); + + goto out; + } + + g_variant_builder_init (&builder_setting, NM_VARIANT_TYPE_SETTING); + + for (l = items; l; l = g_list_next (l)) + { + SecretItem *item = l->data; + GHashTable *attributes; + GHashTableIter iter; + const gchar *name, *attribute; + SecretValue *secret = secret_item_get_secret (item); + + /* This can happen if the user denied a request to unlock */ + if (secret == NULL) + continue; + + attributes = secret_item_get_attributes (item); + g_hash_table_iter_init (&iter, attributes); + while (g_hash_table_iter_next (&iter, (gpointer *)&name, (gpointer *)&attribute)) + { + if (g_strcmp0 (name, SHELL_KEYRING_SK_TAG) == 0) + { + g_variant_builder_add (&builder_setting, "{sv}", attribute, + g_variant_new_string (secret_value_get (secret, NULL))); + + secrets_found = TRUE; + + break; + } + } + + g_hash_table_unref (attributes); + secret_value_unref (secret); + } + + g_list_free_full (items, g_object_unref); + setting = g_variant_builder_end (&builder_setting); + + /* All VPN requests get sent to the VPN's auth dialog, since it knows better + * than the agent about what secrets are required. Otherwise, if no secrets + * were found and interaction is allowed the ask for some secrets, because + * NetworkManager will fail the connection if not secrets are returned + * instead of asking again with REQUEST_NEW. + */ + if (strcmp(closure->setting_name, NM_SETTING_VPN_SETTING_NAME) == 0 || + (!secrets_found && (closure->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION))) + { + nm_connection_update_secrets (closure->connection, closure->setting_name, + setting, NULL); + + closure->entries = g_variant_dict_new (setting); + request_secrets_from_ui (closure); + return; + } + + g_variant_builder_init (&builder_connection, NM_VARIANT_TYPE_CONNECTION); + g_variant_builder_add (&builder_connection, "{s@a{sv}}", + closure->setting_name, setting); + + closure->callback (NM_SECRET_AGENT_OLD (closure->self), closure->connection, + g_variant_builder_end (&builder_connection), NULL, + closure->callback_data); + + out: + g_hash_table_remove (priv->requests, closure->request_id); + g_clear_error (&error); +} + +static void +shell_network_agent_get_secrets (NMSecretAgentOld *agent, + NMConnection *connection, + const gchar *connection_path, + const gchar *setting_name, + const gchar **hints, + NMSecretAgentGetSecretsFlags flags, + NMSecretAgentOldGetSecretsFunc callback, + gpointer callback_data) +{ + ShellNetworkAgent *self = SHELL_NETWORK_AGENT (agent); + ShellAgentRequest *request; + GHashTable *attributes; + char *request_id; + + request_id = g_strdup_printf ("%s/%s", connection_path, setting_name); + if ((request = g_hash_table_lookup (self->priv->requests, request_id)) != NULL) + { + /* We already have a request pending for this (connection, setting) + * Cancel it before starting the new one. + * This will also free the request structure and associated resources. + */ + shell_agent_request_cancel (request); + } + + request = g_slice_new0 (ShellAgentRequest); + request->self = g_object_ref (self); + request->cancellable = g_cancellable_new (); + request->connection = g_object_ref (connection); + request->setting_name = g_strdup (setting_name); + request->hints = g_strdupv ((gchar **)hints); + request->flags = flags; + request->callback = callback; + request->callback_data = callback_data; + + request->request_id = request_id; + g_hash_table_replace (self->priv->requests, request->request_id, request); + + if ((flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW) || + ((flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION) + && is_connection_always_ask (request->connection))) + { + request->entries = g_variant_dict_new (NULL); + request_secrets_from_ui (request); + return; + } + + attributes = secret_attributes_build (&network_agent_schema, + SHELL_KEYRING_UUID_TAG, nm_connection_get_uuid (connection), + SHELL_KEYRING_SN_TAG, setting_name, + NULL); + + secret_service_search (NULL, &network_agent_schema, attributes, + SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK | SECRET_SEARCH_LOAD_SECRETS, + request->cancellable, get_secrets_keyring_cb, request); + + g_hash_table_unref (attributes); +} + +void +shell_network_agent_set_password (ShellNetworkAgent *self, + gchar *request_id, + gchar *setting_key, + gchar *setting_value) +{ + ShellNetworkAgentPrivate *priv; + ShellAgentRequest *request; + + g_return_if_fail (SHELL_IS_NETWORK_AGENT (self)); + + priv = self->priv; + request = g_hash_table_lookup (priv->requests, request_id); + g_return_if_fail (request != NULL); + + g_variant_dict_insert (request->entries, setting_key, "s", setting_value); +} + +void +shell_network_agent_respond (ShellNetworkAgent *self, + gchar *request_id, + ShellNetworkAgentResponse response) +{ + ShellNetworkAgentPrivate *priv; + ShellAgentRequest *request; + GVariantBuilder builder_connection; + GVariant *setting; + + g_return_if_fail (SHELL_IS_NETWORK_AGENT (self)); + + priv = self->priv; + request = g_hash_table_lookup (priv->requests, request_id); + g_return_if_fail (request != NULL); + + if (response == SHELL_NETWORK_AGENT_USER_CANCELED) + { + GError *error = g_error_new (NM_SECRET_AGENT_ERROR, + NM_SECRET_AGENT_ERROR_USER_CANCELED, + "Network dialog was canceled by the user"); + + request->callback (NM_SECRET_AGENT_OLD (self), request->connection, NULL, error, request->callback_data); + g_error_free (error); + g_hash_table_remove (priv->requests, request_id); + return; + } + + if (response == SHELL_NETWORK_AGENT_INTERNAL_ERROR) + { + GError *error = g_error_new (NM_SECRET_AGENT_ERROR, + NM_SECRET_AGENT_ERROR_FAILED, + "An internal error occurred while processing the request."); + + request->callback (NM_SECRET_AGENT_OLD (self), request->connection, NULL, error, request->callback_data); + g_error_free (error); + g_hash_table_remove (priv->requests, request_id); + return; + } + + /* response == SHELL_NETWORK_AGENT_CONFIRMED */ + + setting = g_variant_dict_end (request->entries); + + /* Save any updated secrets */ + if ((request->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION) || + (request->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW)) + { + NMConnection *dup = nm_simple_connection_new_clone (request->connection); + + nm_connection_update_secrets (dup, request->setting_name, setting, NULL); + nm_secret_agent_old_save_secrets (NM_SECRET_AGENT_OLD (self), dup, NULL, NULL); + g_object_unref (dup); + } + + g_variant_builder_init (&builder_connection, NM_VARIANT_TYPE_CONNECTION); + g_variant_builder_add (&builder_connection, "{s@a{sv}}", + request->setting_name, setting); + + request->callback (NM_SECRET_AGENT_OLD (self), request->connection, + g_variant_builder_end (&builder_connection), NULL, + request->callback_data); + + g_hash_table_remove (priv->requests, request_id); +} + +static void +shell_network_agent_cancel_get_secrets (NMSecretAgentOld *agent, + const gchar *connection_path, + const gchar *setting_name) +{ + ShellNetworkAgent *self = SHELL_NETWORK_AGENT (agent); + ShellNetworkAgentPrivate *priv = self->priv; + gchar *request_id; + ShellAgentRequest *request; + + request_id = g_strdup_printf ("%s/%s", connection_path, setting_name); + request = g_hash_table_lookup (priv->requests, request_id); + g_free (request_id); + + if (!request) + { + /* We've already sent the result, but the caller cancelled the + * operation before receiving that result. + */ + return; + } + + shell_agent_request_cancel (request); +} + +/************************* saving of secrets ****************************************/ + +static GHashTable * +create_keyring_add_attr_list (NMConnection *connection, + const gchar *connection_uuid, + const gchar *connection_id, + const gchar *setting_name, + const gchar *setting_key, + gchar **out_display_name) +{ + NMSettingConnection *s_con; + + if (connection) + { + s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); + g_return_val_if_fail (s_con != NULL, NULL); + connection_uuid = nm_setting_connection_get_uuid (s_con); + connection_id = nm_setting_connection_get_id (s_con); + } + + g_return_val_if_fail (connection_uuid != NULL, NULL); + g_return_val_if_fail (connection_id != NULL, NULL); + g_return_val_if_fail (setting_name != NULL, NULL); + g_return_val_if_fail (setting_key != NULL, NULL); + + if (out_display_name) + { + *out_display_name = g_strdup_printf ("Network secret for %s/%s/%s", + connection_id, + setting_name, + setting_key); + } + + return secret_attributes_build (&network_agent_schema, + SHELL_KEYRING_UUID_TAG, connection_uuid, + SHELL_KEYRING_SN_TAG, setting_name, + SHELL_KEYRING_SK_TAG, setting_key, + NULL); +} + +typedef struct +{ + /* Sort of ref count, indicates the number of secrets we still need to save */ + gint n_secrets; + + NMSecretAgentOld *self; + NMConnection *connection; + gpointer callback; + gpointer callback_data; +} KeyringRequest; + +static void +keyring_request_free (KeyringRequest *r) +{ + g_object_unref (r->self); + g_object_unref (r->connection); + + g_slice_free (KeyringRequest, r); +} + +static void +save_secret_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + KeyringRequest *call = user_data; + NMSecretAgentOldSaveSecretsFunc callback = call->callback; + + call->n_secrets--; + + if (call->n_secrets == 0) + { + if (callback) + callback (call->self, call->connection, NULL, call->callback_data); + keyring_request_free (call); + } +} + +static void +save_one_secret (KeyringRequest *r, + NMSetting *setting, + const gchar *key, + const gchar *secret, + const gchar *display_name) +{ + GHashTable *attrs; + gchar *alt_display_name = NULL; + const gchar *setting_name; + NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; + + /* Only save agent-owned secrets (not system-owned or always-ask) */ + nm_setting_get_secret_flags (setting, key, &secret_flags, NULL); + if (secret_flags != NM_SETTING_SECRET_FLAG_AGENT_OWNED) + return; + + setting_name = nm_setting_get_name (setting); + g_assert (setting_name); + + attrs = create_keyring_add_attr_list (r->connection, NULL, NULL, + setting_name, + key, + display_name ? NULL : &alt_display_name); + g_assert (attrs); + r->n_secrets++; + secret_password_storev (&network_agent_schema, attrs, SECRET_COLLECTION_DEFAULT, + display_name ? display_name : alt_display_name, + secret, NULL, save_secret_cb, r); + + g_hash_table_unref (attrs); + g_free (alt_display_name); +} + +static void +vpn_secret_iter_cb (const gchar *key, + const gchar *secret, + gpointer user_data) +{ + KeyringRequest *r = user_data; + NMSetting *setting; + const gchar *service_name, *id; + gchar *display_name; + + if (secret && strlen (secret)) + { + setting = nm_connection_get_setting (r->connection, NM_TYPE_SETTING_VPN); + g_assert (setting); + service_name = nm_setting_vpn_get_service_type (NM_SETTING_VPN (setting)); + g_assert (service_name); + id = nm_connection_get_id (r->connection); + g_assert (id); + + display_name = g_strdup_printf ("VPN %s secret for %s/%s/" NM_SETTING_VPN_SETTING_NAME, + key, + id, + service_name); + save_one_secret (r, setting, key, secret, display_name); + g_free (display_name); + } +} + +static void +write_one_secret_to_keyring (NMSetting *setting, + const gchar *key, + const GValue *value, + GParamFlags flags, + gpointer user_data) +{ + KeyringRequest *r = user_data; + const gchar *secret; + + /* Non-secrets obviously don't get saved in the keyring */ + if (!(flags & NM_SETTING_PARAM_SECRET)) + return; + + if (NM_IS_SETTING_VPN (setting) && (g_strcmp0 (key, NM_SETTING_VPN_SECRETS) == 0)) + { + /* Process VPN secrets specially since it's a hash of secrets, not just one */ + nm_setting_vpn_foreach_secret (NM_SETTING_VPN (setting), + vpn_secret_iter_cb, + r); + } + else + { + if (!G_VALUE_HOLDS_STRING (value)) + return; + + secret = g_value_get_string (value); + if (secret && strlen (secret)) + save_one_secret (r, setting, key, secret, NULL); + } +} + +static void +save_delete_cb (NMSecretAgentOld *agent, + NMConnection *connection, + GError *error, + gpointer user_data) +{ + KeyringRequest *r = user_data; + + /* Ignore errors; now save all new secrets */ + nm_connection_for_each_setting_value (connection, write_one_secret_to_keyring, r); + + /* If no secrets actually got saved there may be nothing to do so + * try to complete the request here. If there were secrets to save the + * request will get completed when those keyring calls return (at the next + * mainloop iteration). + */ + if (r->n_secrets == 0) + { + if (r->callback) + ((NMSecretAgentOldSaveSecretsFunc)r->callback) (agent, connection, NULL, r->callback_data); + keyring_request_free (r); + } +} + +static void +shell_network_agent_save_secrets (NMSecretAgentOld *agent, + NMConnection *connection, + const gchar *connection_path, + NMSecretAgentOldSaveSecretsFunc callback, + gpointer callback_data) +{ + KeyringRequest *r; + + r = g_slice_new (KeyringRequest); + r->n_secrets = 0; + r->self = g_object_ref (agent); + r->connection = g_object_ref (connection); + r->callback = callback; + r->callback_data = callback_data; + + /* First delete any existing items in the keyring */ + nm_secret_agent_old_delete_secrets (agent, connection, save_delete_cb, r); +} + +static void +delete_items_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + KeyringRequest *r = user_data; + GError *secret_error = NULL; + GError *error = NULL; + NMSecretAgentOldDeleteSecretsFunc callback = r->callback; + + secret_password_clear_finish (result, &secret_error); + if (secret_error != NULL) + { + error = g_error_new (NM_SECRET_AGENT_ERROR, + NM_SECRET_AGENT_ERROR_FAILED, + "The request could not be completed. Keyring result: %s", + secret_error->message); + g_error_free (secret_error); + } + + callback (r->self, r->connection, error, r->callback_data); + g_clear_error (&error); + keyring_request_free (r); +} + +static void +shell_network_agent_delete_secrets (NMSecretAgentOld *agent, + NMConnection *connection, + const gchar *connection_path, + NMSecretAgentOldDeleteSecretsFunc callback, + gpointer callback_data) +{ + KeyringRequest *r; + NMSettingConnection *s_con; + const gchar *uuid; + + r = g_slice_new (KeyringRequest); + r->n_secrets = 0; /* ignored by delete secrets calls */ + r->self = g_object_ref (agent); + r->connection = g_object_ref (connection); + r->callback = callback; + r->callback_data = callback_data; + + s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); + g_assert (s_con); + uuid = nm_setting_connection_get_uuid (s_con); + g_assert (uuid); + + secret_password_clear (&network_agent_schema, NULL, delete_items_cb, r, + SHELL_KEYRING_UUID_TAG, uuid, + NULL); +} + +void +shell_network_agent_class_init (ShellNetworkAgentClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + NMSecretAgentOldClass *agent_class = NM_SECRET_AGENT_OLD_CLASS (klass); + + gobject_class->finalize = shell_network_agent_finalize; + + agent_class->get_secrets = shell_network_agent_get_secrets; + agent_class->cancel_get_secrets = shell_network_agent_cancel_get_secrets; + agent_class->save_secrets = shell_network_agent_save_secrets; + agent_class->delete_secrets = shell_network_agent_delete_secrets; + + signals[SIGNAL_NEW_REQUEST] = g_signal_new ("new-request", + G_TYPE_FROM_CLASS (klass), + 0, /* flags */ + 0, /* class offset */ + NULL, /* accumulator */ + NULL, /* accu_data */ + NULL, /* marshaller */ + G_TYPE_NONE, /* return */ + 5, /* n_params */ + G_TYPE_STRING, + NM_TYPE_CONNECTION, + G_TYPE_STRING, + G_TYPE_STRV, + G_TYPE_INT); + + signals[SIGNAL_CANCEL_REQUEST] = g_signal_new ("cancel-request", + G_TYPE_FROM_CLASS (klass), + 0, /* flags */ + 0, /* class offset */ + NULL, /* accumulator */ + NULL, /* accu_data */ + NULL, /* marshaller */ + G_TYPE_NONE, + 1, /* n_params */ + G_TYPE_STRING); +} diff --git a/src/shell-network-agent.h b/src/shell-network-agent.h new file mode 100644 index 0000000..73dfe5b --- /dev/null +++ b/src/shell-network-agent.h @@ -0,0 +1,61 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ +#ifndef __SHELL_NETWORK_AGENT_H__ +#define __SHELL_NETWORK_AGENT_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +typedef enum { + SHELL_NETWORK_AGENT_CONFIRMED, + SHELL_NETWORK_AGENT_USER_CANCELED, + SHELL_NETWORK_AGENT_INTERNAL_ERROR +} ShellNetworkAgentResponse; + +typedef struct _ShellNetworkAgent ShellNetworkAgent; +typedef struct _ShellNetworkAgentClass ShellNetworkAgentClass; +typedef struct _ShellNetworkAgentPrivate ShellNetworkAgentPrivate; + +#define SHELL_TYPE_NETWORK_AGENT (shell_network_agent_get_type ()) +#define SHELL_NETWORK_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_NETWORK_AGENT, ShellNetworkAgent)) +#define SHELL_IS_NETWORK_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_NETWORK_AGENT)) +#define SHELL_NETWORK_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_NETWORK_AGENT, ShellNetworkAgentClass)) +#define SHELL_IS_NETWORK_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_NETWORK_AGENT)) +#define SHELL_NETWORK_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_NETWORK_AGENT, ShellNetworkAgentClass)) + +struct _ShellNetworkAgent +{ + /*< private >*/ + NMSecretAgentOld parent_instance; + + ShellNetworkAgentPrivate *priv; +}; + +struct _ShellNetworkAgentClass +{ + /*< private >*/ + NMSecretAgentOldClass parent_class; +}; + +/* used by SHELL_TYPE_NETWORK_AGENT */ +GType shell_network_agent_get_type (void); + +void shell_network_agent_set_password (ShellNetworkAgent *self, + gchar *request_id, + gchar *setting_key, + gchar *setting_value); +void shell_network_agent_respond (ShellNetworkAgent *self, + gchar *request_id, + ShellNetworkAgentResponse response); + +/* If these are kept in sync with nm-applet, secrets will be shared */ +#define SHELL_KEYRING_UUID_TAG "connection-uuid" +#define SHELL_KEYRING_SN_TAG "setting-name" +#define SHELL_KEYRING_SK_TAG "setting-key" + +G_END_DECLS + +#endif /* __SHELL_NETWORK_AGENT_H__ */ diff --git a/src/shell-perf-helper.c b/src/shell-perf-helper.c new file mode 100644 index 0000000..e5eab20 --- /dev/null +++ b/src/shell-perf-helper.c @@ -0,0 +1,391 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* gnome-shell-perf-helper: a program to create windows for performance tests + * + * Running performance tests with whatever windows a user has open results + * in unreliable results, so instead we hide all other windows and talk + * to this program over D-Bus to create just the windows we want. + */ + +#include "config.h" + +#include + +#include +#include + +#define BUS_NAME "org.gnome.Shell.PerfHelper" + +static void destroy_windows (void); +static void finish_wait_windows (void); +static void check_finish_wait_windows (void); + +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +typedef struct { + GtkWidget *window; + int width; + int height; + + guint alpha : 1; + guint maximized : 1; + guint redraws : 1; + guint mapped : 1; + guint exposed : 1; + guint pending : 1; + + gint64 start_time; + gint64 time; +} WindowInfo; + +static int opt_idle_timeout = 30; + +static GOptionEntry opt_entries[] = + { + { "idle-timeout", 'r', 0, G_OPTION_ARG_INT, &opt_idle_timeout, "Exit after N seconds", "N" }, + { NULL } + }; + +static Display *xdisplay; +static Window xroot; +static Atom atom_wm_state; +static Atom atom__net_wm_name; +static Atom atom_utf8_string; + +static guint timeout_id; +static GList *our_windows; +static GList *wait_windows_invocations; + +static gboolean +on_timeout (gpointer data) +{ + timeout_id = 0; + + destroy_windows (); + gtk_main_quit (); + + return FALSE; +} + +static void +establish_timeout (void) +{ + if (timeout_id != 0) + g_source_remove (timeout_id); + + timeout_id = g_timeout_add (opt_idle_timeout * 1000, on_timeout, NULL); + g_source_set_name_by_id (timeout_id, "[gnome-shell] on_timeout"); +} + +static void +destroy_windows (void) +{ + GList *l; + + for (l = our_windows; l; l = l->next) + { + WindowInfo *info = l->data; + gtk_widget_destroy (info->window); + g_free (info); + } + + g_list_free (our_windows); + our_windows = NULL; + + check_finish_wait_windows (); +} + +static gboolean +on_window_map_event (GtkWidget *window, + GdkEventAny *event, + WindowInfo *info) +{ + info->mapped = TRUE; + + return FALSE; +} + +static gboolean +on_window_draw (GtkWidget *window, + cairo_t *cr, + WindowInfo *info) +{ + cairo_rectangle_int_t allocation; + double x_offset, y_offset; + + gtk_widget_get_allocation (window, &allocation); + + /* We draw an arbitrary pattern of red lines near the border of the + * window to make it more clear than empty windows if something + * is drastrically wrong. + */ + + cairo_save (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + + if (info->alpha) + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); + else + cairo_set_source_rgb (cr, 1, 1, 1); + + cairo_paint (cr); + cairo_restore (cr); + + if (info->redraws) + { + double position = (info->time - info->start_time) / 1000000.; + x_offset = 20 * cos (2 * M_PI * position); + y_offset = 20 * sin (2 * M_PI * position); + } + else + { + x_offset = y_offset = 0; + } + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 10); + cairo_move_to (cr, 0, 40 + y_offset); + cairo_line_to (cr, allocation.width, 40 + y_offset); + cairo_move_to (cr, 0, allocation.height - 40 + y_offset); + cairo_line_to (cr, allocation.width, allocation.height - 40 + y_offset); + cairo_move_to (cr, 40 + x_offset, 0); + cairo_line_to (cr, 40 + x_offset, allocation.height); + cairo_move_to (cr, allocation.width - 40 + x_offset, 0); + cairo_line_to (cr, allocation.width - 40 + x_offset, allocation.height); + cairo_stroke (cr); + + info->exposed = TRUE; + + if (info->exposed && info->mapped && info->pending) + { + info->pending = FALSE; + check_finish_wait_windows (); + } + + return FALSE; +} + +static gboolean +tick_callback (GtkWidget *widget, + GdkFrameClock *frame_clock, + gpointer user_data) +{ + WindowInfo *info = user_data; + + if (info->start_time < 0) + info->start_time = info->time = gdk_frame_clock_get_frame_time (frame_clock); + else + info->time = gdk_frame_clock_get_frame_time (frame_clock); + + gtk_widget_queue_draw (widget); + + return TRUE; +} + +static void +create_window (int width, + int height, + gboolean alpha, + gboolean maximized, + gboolean redraws) +{ + WindowInfo *info; + + info = g_new0 (WindowInfo, 1); + info->width = width; + info->height = height; + info->alpha = alpha; + info->maximized = maximized; + info->redraws = redraws; + info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + if (alpha) + gtk_widget_set_visual (info->window, gdk_screen_get_rgba_visual (gdk_screen_get_default ())); + if (maximized) + gtk_window_maximize (GTK_WINDOW (info->window)); + info->pending = TRUE; + info->start_time = -1; + + gtk_widget_set_size_request (info->window, width, height); + gtk_widget_set_app_paintable (info->window, TRUE); + g_signal_connect (info->window, "map-event", G_CALLBACK (on_window_map_event), info); + g_signal_connect (info->window, "draw", G_CALLBACK (on_window_draw), info); + gtk_widget_show (info->window); + + if (info->redraws) + gtk_widget_add_tick_callback (info->window, tick_callback, + info, NULL); + + our_windows = g_list_prepend (our_windows, info); +} + +static void +finish_wait_windows (void) +{ + GList *l; + + for (l = wait_windows_invocations; l; l = l->next) + g_dbus_method_invocation_return_value (l->data, NULL); + + g_list_free (wait_windows_invocations); + wait_windows_invocations = NULL; +} + +static void +check_finish_wait_windows (void) +{ + GList *l; + gboolean have_pending = FALSE; + + for (l = our_windows; l; l = l->next) + { + WindowInfo *info = l->data; + if (info->pending) + have_pending = TRUE; + } + + if (!have_pending) + finish_wait_windows (); +} + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + /* Push off the idle timeout */ + establish_timeout (); + + if (g_strcmp0 (method_name, "Exit") == 0) + { + destroy_windows (); + + g_dbus_method_invocation_return_value (invocation, NULL); + g_dbus_connection_flush_sync (connection, NULL, NULL); + + gtk_main_quit (); + } + else if (g_strcmp0 (method_name, "CreateWindow") == 0) + { + int width, height; + gboolean alpha, maximized, redraws; + + g_variant_get (parameters, "(iibbb)", &width, &height, &alpha, &maximized, &redraws); + + create_window (width, height, alpha, maximized, redraws); + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "WaitWindows") == 0) + { + wait_windows_invocations = g_list_prepend (wait_windows_invocations, invocation); + check_finish_wait_windows (); + } + else if (g_strcmp0 (method_name, "DestroyWindows") == 0) + { + destroy_windows (); + g_dbus_method_invocation_return_value (invocation, NULL); + } +} + +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + NULL, + NULL +}; + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GDBusNodeInfo *introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + + g_dbus_connection_register_object (connection, + "/org/gnome/Shell/PerfHelper", + introspection_data->interfaces[0], + &interface_vtable, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + NULL); /* GError** */ +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + destroy_windows (); + gtk_main_quit (); +} + +int +main (int argc, char **argv) +{ + GdkDisplay *display; + GdkScreen *screen; + GOptionContext *context; + GError *error = NULL; + + /* Since we depend on this, avoid the possibility of lt-gnome-shell-perf-helper */ + g_set_prgname ("gnome-shell-perf-helper"); + + context = g_option_context_new (" - server to create windows for performance testing"); + g_option_context_add_main_entries (context, opt_entries, NULL); + g_option_context_add_group (context, gtk_get_option_group (TRUE)); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_print ("option parsing failed: %s\n", error->message); + return 1; + } + + display = gdk_display_get_default (); + screen = gdk_screen_get_default (); + + xdisplay = gdk_x11_display_get_xdisplay (display); + xroot = gdk_x11_window_get_xid (gdk_screen_get_root_window (screen)); + atom_wm_state = gdk_x11_get_xatom_by_name_for_display (display, "WM_STATE"); + atom__net_wm_name = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_NAME"); + atom_utf8_string = gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"); + + g_bus_own_name (G_BUS_TYPE_SESSION, + BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | + G_BUS_NAME_OWNER_FLAGS_REPLACE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + establish_timeout (); + + gtk_main (); + + return 0; +} diff --git a/src/shell-perf-log.c b/src/shell-perf-log.c new file mode 100644 index 0000000..cca3dc5 --- /dev/null +++ b/src/shell-perf-log.c @@ -0,0 +1,960 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include + +#include "shell-perf-log.h" + +typedef struct _ShellPerfEvent ShellPerfEvent; +typedef struct _ShellPerfStatistic ShellPerfStatistic; +typedef struct _ShellPerfStatisticsClosure ShellPerfStatisticsClosure; +typedef union _ShellPerfStatisticValue ShellPerfStatisticValue; +typedef struct _ShellPerfBlock ShellPerfBlock; + +/** + * SECTION:shell-perf-log + * @short_description: Event recorder for performance measurement + * + * ShellPerfLog provides a way for different parts of the code to + * record information for subsequent analysis and interactive + * exploration. Events exist of a timestamp, an event ID, and + * arguments to the event. + * + * Emphasis is placed on storing recorded events in a compact + * fashion so log recording disturbs the execution of the program + * as little as possible, however events should not be recorded + * at too fine a granularity - an event that is recorded once + * per frame or once per user action is appropriate, an event that + * occurs many times per frame is not. + * + * Arguments are identified by a D-Bus style signature; at the moment + * only a limited number of event signatures are supported to + * simplify the code. + */ +struct _ShellPerfLog +{ + GObject parent; + + GPtrArray *events; + GHashTable *events_by_name; + GPtrArray *statistics; + GHashTable *statistics_by_name; + + GPtrArray *statistics_closures; + + GQueue *blocks; + + gint64 start_time; + gint64 last_time; + + guint statistics_timeout_id; + + guint enabled : 1; +}; + +struct _ShellPerfEvent +{ + guint16 id; + char *name; + char *description; + char *signature; +}; + +union _ShellPerfStatisticValue +{ + int i; + gint64 x; +}; + +struct _ShellPerfStatistic +{ + ShellPerfEvent *event; + + ShellPerfStatisticValue current_value; + ShellPerfStatisticValue last_value; + + guint initialized : 1; + guint recorded : 1; +}; + +struct _ShellPerfStatisticsClosure +{ + ShellPerfStatisticsCallback callback; + gpointer user_data; + GDestroyNotify notify; +}; + +/* The events in the log are stored in a linked list of fixed size + * blocks. + * + * Note that the power-of-two nature of BLOCK_SIZE here is superficial + * since the allocated block has the 'bytes' field and malloc + * overhead. The current value is well below the size that will + * typically be independently mmapped by the malloc implementation so + * it doesn't matter. If we switched to mmapping blocks manually + * (perhaps to avoid polluting malloc statistics), we'd want to use a + * different value of BLOCK_SIZE. + */ +#define BLOCK_SIZE 8192 + +struct _ShellPerfBlock +{ + guint32 bytes; + guchar buffer[BLOCK_SIZE]; +}; + +/* Number of milliseconds between periodic statistics collection when + * events are enabled. Statistics collection can also be explicitly + * triggered. + */ +#define STATISTIC_COLLECTION_INTERVAL_MS 5000 + +/* Builtin events */ +enum { + EVENT_SET_TIME, + EVENT_STATISTICS_COLLECTED +}; + +G_DEFINE_TYPE(ShellPerfLog, shell_perf_log, G_TYPE_OBJECT); + +static gint64 +get_time (void) +{ + return g_get_monotonic_time (); +} + +static void +shell_perf_log_init (ShellPerfLog *perf_log) +{ + perf_log->events = g_ptr_array_new (); + perf_log->events_by_name = g_hash_table_new (g_str_hash, g_str_equal); + perf_log->statistics = g_ptr_array_new (); + perf_log->statistics_by_name = g_hash_table_new (g_str_hash, g_str_equal); + perf_log->statistics_closures = g_ptr_array_new (); + perf_log->blocks = g_queue_new (); + + /* This event is used when timestamp deltas are greater than + * fits in a gint32. 0xffffffff microseconds is about 70 minutes, so this + * is not going to happen in normal usage. It might happen if performance + * logging is enabled some time after starting the shell */ + shell_perf_log_define_event (perf_log, "perf.setTime", "", "x"); + g_assert (perf_log->events->len == EVENT_SET_TIME + 1); + + /* The purpose of this event is to allow us to optimize out storing + * statistics that haven't changed. We want to mark every time we + * collect statistics even if we don't record any individual + * statistics so that we can distinguish sudden changes from gradual changes. + * + * The argument is the number of microseconds that statistics collection + * took; we record that since statistics collection could start taking + * significant time if we do things like grub around in /proc/ + */ + shell_perf_log_define_event (perf_log, "perf.statisticsCollected", + "Finished collecting statistics", + "x"); + g_assert (perf_log->events->len == EVENT_STATISTICS_COLLECTED + 1); + + perf_log->start_time = perf_log->last_time = get_time(); +} + +static void +shell_perf_log_class_init (ShellPerfLogClass *class) +{ +} + +/** + * shell_perf_log_get_default: + * + * Gets the global singleton performance log. This is initially disabled + * and must be explicitly enabled with shell_perf_log_set_enabled(). + * + * Return value: (transfer none): the global singleton performance log + */ +ShellPerfLog * +shell_perf_log_get_default (void) +{ + static ShellPerfLog *perf_log; + + if (perf_log == NULL) + perf_log = g_object_new (SHELL_TYPE_PERF_LOG, NULL); + + return perf_log; +} + +static gboolean +statistics_timeout (gpointer data) +{ + ShellPerfLog *perf_log = data; + + shell_perf_log_collect_statistics (perf_log); + + return TRUE; +} + +/** + * shell_perf_log_set_enabled: + * @perf_log: a #ShellPerfLog + * @enabled: whether to record events + * + * Sets whether events are currently being recorded. + */ +void +shell_perf_log_set_enabled (ShellPerfLog *perf_log, + gboolean enabled) +{ + enabled = enabled != FALSE; + + if (enabled != perf_log->enabled) + { + perf_log->enabled = enabled; + + if (enabled) + { + perf_log->statistics_timeout_id = g_timeout_add (STATISTIC_COLLECTION_INTERVAL_MS, + statistics_timeout, + perf_log); + g_source_set_name_by_id (perf_log->statistics_timeout_id, "[gnome-shell] statistics_timeout"); + } + else + { + g_source_remove (perf_log->statistics_timeout_id); + perf_log->statistics_timeout_id = 0; + } + } +} + +static ShellPerfEvent * +define_event (ShellPerfLog *perf_log, + const char *name, + const char *description, + const char *signature) +{ + ShellPerfEvent *event; + + if (strcmp (signature, "") != 0 && + strcmp (signature, "s") != 0 && + strcmp (signature, "i") != 0 && + strcmp (signature, "x") != 0) + { + g_warning ("Only supported event signatures are '', 's', 'i', and 'x'\n"); + return NULL; + } + + if (perf_log->events->len == 65536) + { + g_warning ("Maximum number of events defined\n"); + return NULL; + } + + /* We could do stricter validation, but this will break our JSON dumps */ + if (strchr (name, '"') != NULL) + { + g_warning ("Event names can't include '\"'"); + return NULL; + } + + if (g_hash_table_lookup (perf_log->events_by_name, name) != NULL) + { + g_warning ("Duplicate event event for '%s'\n", name); + return NULL; + } + + event = g_slice_new (ShellPerfEvent); + + event->id = perf_log->events->len; + event->name = g_strdup (name); + event->signature = g_strdup (signature); + event->description = g_strdup (description); + + g_ptr_array_add (perf_log->events, event); + g_hash_table_insert (perf_log->events_by_name, event->name, event); + + return event; +} + +/** + * shell_perf_log_define_event: + * @perf_log: a #ShellPerfLog + * @name: name of the event. This should of the form + * '., for example + * 'clutter.stagePaintDone'. + * @description: human readable description of the event. + * @signature: signature defining the arguments that event takes. + * This is a string of type characters, using the same characters + * as D-Bus or GVariant. Only a very limited number of signatures + * are supported: , '', 's', 'i', and 'x'. This mean respectively: + * no arguments, one string, one 32-bit integer, and one 64-bit + * integer. + * + * Defines a performance event for later recording. + */ +void +shell_perf_log_define_event (ShellPerfLog *perf_log, + const char *name, + const char *description, + const char *signature) +{ + define_event (perf_log, name, description, signature); +} + +static ShellPerfEvent * +lookup_event (ShellPerfLog *perf_log, + const char *name, + const char *signature) +{ + ShellPerfEvent *event = g_hash_table_lookup (perf_log->events_by_name, name); + + if (G_UNLIKELY (event == NULL)) + { + g_warning ("Discarding unknown event '%s'\n", name); + return NULL; + } + + if (G_UNLIKELY (strcmp (event->signature, signature) != 0)) + { + g_warning ("Event '%s'; defined with signature '%s', used with '%s'\n", + name, event->signature, signature); + return NULL; + } + + return event; +} + +static void +record_event (ShellPerfLog *perf_log, + gint64 event_time, + ShellPerfEvent *event, + const guchar *bytes, + size_t bytes_len) +{ + ShellPerfBlock *block; + size_t total_bytes; + guint32 time_delta; + guint32 pos; + + if (!perf_log->enabled) + return; + + total_bytes = sizeof (gint32) + sizeof (gint16) + bytes_len; + if (G_UNLIKELY (bytes_len > BLOCK_SIZE || total_bytes > BLOCK_SIZE)) + { + g_warning ("Discarding oversize event '%s'\n", event->name); + return; + } + + if (event_time > perf_log->last_time + G_GINT64_CONSTANT(0xffffffff)) + { + perf_log->last_time = event_time; + record_event (perf_log, event_time, + lookup_event (perf_log, "perf.setTime", "x"), + (const guchar *)&event_time, sizeof(gint64)); + time_delta = 0; + } + else if (event_time < perf_log->last_time) + time_delta = 0; + else + time_delta = (guint32)(event_time - perf_log->last_time); + + perf_log->last_time = event_time; + + if (perf_log->blocks->tail == NULL || + total_bytes + ((ShellPerfBlock *)perf_log->blocks->tail->data)->bytes > BLOCK_SIZE) + { + block = g_new (ShellPerfBlock, 1); + block->bytes = 0; + g_queue_push_tail (perf_log->blocks, block); + } + else + { + block = (ShellPerfBlock *)perf_log->blocks->tail->data; + } + + pos = block->bytes; + + memcpy (block->buffer + pos, &time_delta, sizeof (guint32)); + pos += sizeof (guint32); + memcpy (block->buffer + pos, &event->id, sizeof (guint16)); + pos += sizeof (guint16); + memcpy (block->buffer + pos, bytes, bytes_len); + pos += bytes_len; + + block->bytes = pos; +} + +/** + * shell_perf_log_event: + * @perf_log: a #ShellPerfLog + * @name: name of the event + * + * Records a performance event with no arguments. + */ +void +shell_perf_log_event (ShellPerfLog *perf_log, + const char *name) +{ + ShellPerfEvent *event = lookup_event (perf_log, name, ""); + if (G_UNLIKELY (event == NULL)) + return; + + record_event (perf_log, get_time(), event, NULL, 0); +} + +/** + * shell_perf_log_event_i: + * @perf_log: a #ShellPerfLog + * @name: name of the event + * @arg: the argument + * + * Records a performance event with one 32-bit integer argument. + */ +void +shell_perf_log_event_i (ShellPerfLog *perf_log, + const char *name, + gint32 arg) +{ + ShellPerfEvent *event = lookup_event (perf_log, name, "i"); + if (G_UNLIKELY (event == NULL)) + return; + + record_event (perf_log, get_time(), event, + (const guchar *)&arg, sizeof (arg)); +} + +/** + * shell_perf_log_event_x: + * @perf_log: a #ShellPerfLog + * @name: name of the event + * @arg: the argument + * + * Records a performance event with one 64-bit integer argument. + */ +void +shell_perf_log_event_x (ShellPerfLog *perf_log, + const char *name, + gint64 arg) +{ + ShellPerfEvent *event = lookup_event (perf_log, name, "x"); + if (G_UNLIKELY (event == NULL)) + return; + + record_event (perf_log, get_time(), event, + (const guchar *)&arg, sizeof (arg)); +} + +/** + * shell_perf_log_event_s: + * @perf_log: a #ShellPerfLog + * @name: name of the event + * @arg: the argument + * + * Records a performance event with one string argument. + */ +void +shell_perf_log_event_s (ShellPerfLog *perf_log, + const char *name, + const char *arg) +{ + ShellPerfEvent *event = lookup_event (perf_log, name, "s"); + if (G_UNLIKELY (event == NULL)) + return; + + record_event (perf_log, get_time(), event, + (const guchar *)arg, strlen (arg) + 1); +} + +/** + * shell_perf_log_define_statistic: + * @name: name of the statistic and of the corresponding event. + * This should follow the same guidelines as for shell_perf_log_define_event() + * @description: human readable description of the statistic. + * @signature: The type of the data stored for statistic. Must + * currently be 'i' or 'x'. + * + * Defines a statistic. A statistic is a numeric value that is stored + * by the performance log and recorded periodically or when + * shell_perf_log_collect_statistics() is called explicitly. + * + * Code that defines a statistic should update it by calling + * the update function for the particular data type of the statistic, + * such as shell_perf_log_update_statistic_i(). This can be done + * at any time, but would normally done inside a function registered + * with shell_perf_log_add_statistics_callback(). These functions + * are called immediately before statistics are recorded. + */ +void +shell_perf_log_define_statistic (ShellPerfLog *perf_log, + const char *name, + const char *description, + const char *signature) +{ + ShellPerfEvent *event; + ShellPerfStatistic *statistic; + + if (strcmp (signature, "i") != 0 && + strcmp (signature, "x") != 0) + { + g_warning ("Only supported statistic signatures are 'i' and 'x'\n"); + return; + } + + event = define_event (perf_log, name, description, signature); + if (event == NULL) + return; + + statistic = g_slice_new (ShellPerfStatistic); + statistic->event = event; + + statistic->initialized = FALSE; + statistic->recorded = FALSE; + + g_ptr_array_add (perf_log->statistics, statistic); + g_hash_table_insert (perf_log->statistics_by_name, event->name, statistic); +} + +static ShellPerfStatistic * +lookup_statistic (ShellPerfLog *perf_log, + const char *name, + const char *signature) +{ + ShellPerfStatistic *statistic = g_hash_table_lookup (perf_log->statistics_by_name, name); + + if (G_UNLIKELY (statistic == NULL)) + { + g_warning ("Unknown statistic '%s'\n", name); + return NULL; + } + + if (G_UNLIKELY (strcmp (statistic->event->signature, signature) != 0)) + { + g_warning ("Statistic '%s'; defined with signature '%s', used with '%s'\n", + name, statistic->event->signature, signature); + return NULL; + } + + return statistic; +} + +/** + * shell_perf_log_update_statistic_i: + * @perf_log: a #ShellPerfLog + * @name: name of the statistic + * @value: new value for the statistic + * + * Updates the current value of an 32-bit integer statistic. + */ +void +shell_perf_log_update_statistic_i (ShellPerfLog *perf_log, + const char *name, + gint32 value) +{ + ShellPerfStatistic *statistic; + + statistic = lookup_statistic (perf_log, name, "i"); + if (G_UNLIKELY (statistic == NULL)) + return; + + statistic->current_value.i = value; + statistic->initialized = TRUE; +} + +/** + * shell_perf_log_update_statistic_x: + * @perf_log: a #ShellPerfLog + * @name: name of the statistic + * @value: new value for the statistic + * + * Updates the current value of an 64-bit integer statistic. + */ +void +shell_perf_log_update_statistic_x (ShellPerfLog *perf_log, + const char *name, + gint64 value) +{ + ShellPerfStatistic *statistic; + + statistic = lookup_statistic (perf_log, name, "x"); + if (G_UNLIKELY (statistic == NULL)) + return; + + statistic->current_value.x = value; + statistic->initialized = TRUE; +} + +/** + * shell_perf_log_add_statistics_callback: + * @perf_log: a #ShellPerfLog + * @callback: function to call before recording statistics + * @user_data: data to pass to @callback + * @notify: function to call when @user_data is no longer needed + * + * Adds a function that will be called before statistics are recorded. + * The function would typically compute one or more statistics values + * and call a function such as shell_perf_log_update_statistic_i() + * to update the value that will be recorded. + */ +void +shell_perf_log_add_statistics_callback (ShellPerfLog *perf_log, + ShellPerfStatisticsCallback callback, + gpointer user_data, + GDestroyNotify notify) +{ + ShellPerfStatisticsClosure *closure = g_slice_new (ShellPerfStatisticsClosure); + + closure->callback = callback; + closure->user_data = user_data; + closure->notify = notify; + + g_ptr_array_add (perf_log->statistics_closures, closure); +} + +/** + * shell_perf_log_collect_statistics: + * @perf_log: a #ShellPerfLog + * + * Calls all the update functions added with + * shell_perf_log_add_statistics_callback() and then records events + * for all statistics, followed by a perf.statisticsCollected event. + */ +void +shell_perf_log_collect_statistics (ShellPerfLog *perf_log) +{ + gint64 event_time = get_time (); + gint64 collection_time; + guint i; + + if (!perf_log->enabled) + return; + + for (i = 0; i < perf_log->statistics_closures->len; i++) + { + ShellPerfStatisticsClosure *closure; + + closure = g_ptr_array_index (perf_log->statistics_closures, i); + closure->callback (perf_log, closure->user_data); + } + + collection_time = get_time() - event_time; + + for (i = 0; i < perf_log->statistics->len; i++) + { + ShellPerfStatistic *statistic = g_ptr_array_index (perf_log->statistics, i); + + if (!statistic->initialized) + continue; + + switch (statistic->event->signature[0]) + { + case 'i': + if (!statistic->recorded || + statistic->current_value.i != statistic->last_value.i) + { + record_event (perf_log, event_time, statistic->event, + (const guchar *)&statistic->current_value.i, + sizeof (gint32)); + statistic->last_value.i = statistic->current_value.i; + statistic->recorded = TRUE; + } + break; + case 'x': + if (!statistic->recorded || + statistic->current_value.x != statistic->last_value.x) + { + record_event (perf_log, event_time, statistic->event, + (const guchar *)&statistic->current_value.x, + sizeof (gint64)); + statistic->last_value.x = statistic->current_value.x; + statistic->recorded = TRUE; + } + break; + default: + g_warning ("Unsupported signature in event"); + break; + } + } + + record_event (perf_log, event_time, + g_ptr_array_index (perf_log->events, EVENT_STATISTICS_COLLECTED), + (const guchar *)&collection_time, sizeof (gint64)); +} + +/** + * shell_perf_log_replay: + * @perf_log: a #ShellPerfLog + * @replay_function: (scope call): function to call for each event in the log + * @user_data: data to pass to @replay_function + * + * Replays the log by calling the given function for each event + * in the log. + */ +void +shell_perf_log_replay (ShellPerfLog *perf_log, + ShellPerfReplayFunction replay_function, + gpointer user_data) +{ + gint64 event_time = perf_log->start_time; + GList *iter; + + for (iter = perf_log->blocks->head; iter; iter = iter->next) + { + ShellPerfBlock *block = iter->data; + guint32 pos = 0; + + while (pos < block->bytes) + { + ShellPerfEvent *event; + guint16 id; + guint32 time_delta; + GValue arg = { 0, }; + + memcpy (&time_delta, block->buffer + pos, sizeof (guint32)); + pos += sizeof (guint32); + memcpy (&id, block->buffer + pos, sizeof (guint16)); + pos += sizeof (guint16); + + if (id == EVENT_SET_TIME) + { + /* Internal, we don't include in the replay */ + memcpy (&event_time, block->buffer + pos, sizeof (gint64)); + pos += sizeof (gint64); + continue; + } + else + { + event_time += time_delta; + } + + event = g_ptr_array_index (perf_log->events, id); + + if (strcmp (event->signature, "") == 0) + { + /* We need to pass something, so pass an empty string */ + g_value_init (&arg, G_TYPE_STRING); + } + else if (strcmp (event->signature, "i") == 0) + { + gint32 l; + + memcpy (&l, block->buffer + pos, sizeof (gint32)); + pos += sizeof (gint32); + + g_value_init (&arg, G_TYPE_INT); + g_value_set_int (&arg, l); + } + else if (strcmp (event->signature, "x") == 0) + { + gint64 l; + + memcpy (&l, block->buffer + pos, sizeof (gint64)); + pos += sizeof (gint64); + + g_value_init (&arg, G_TYPE_INT64); + g_value_set_int64 (&arg, l); + } + else if (strcmp (event->signature, "s") == 0) + { + g_value_init (&arg, G_TYPE_STRING); + g_value_set_string (&arg, (char *)block->buffer + pos); + pos += strlen ((char *)(block->buffer + pos)) + 1; + } + + replay_function (event_time, event->name, event->signature, &arg, user_data); + g_value_unset (&arg); + } + } +} + +static char * +escape_quotes (const char *input) +{ + GString *result; + const char *p; + + if (strchr (input, '"') == NULL) + return (char *)input; + + result = g_string_new (NULL); + for (p = input; *p; p++) + { + if (*p == '"') + g_string_append (result, "\\\""); + else + g_string_append_c (result, *p); + } + + return g_string_free (result, FALSE); +} + +static gboolean +write_string (GOutputStream *out, + const char *str, + GError **error) +{ + return g_output_stream_write_all (out, str, strlen (str), + NULL, NULL, + error); +} + +/** + * shell_perf_log_dump_events: + * @perf_log: a #ShellPerfLog + * @out: output stream into which to write the event definitions + * @error: location to store #GError, or %NULL + * + * Dump the definition of currently defined events and statistics, formatted + * as JSON, to the specified output stream. The JSON output is an array, + * with each element being a dictionary of the form: + * + * { name: , + * description: events->len; i++) + { + ShellPerfEvent *event = g_ptr_array_index (perf_log->events, i); + char *escaped_description = escape_quotes (event->description); + gboolean is_statistic = g_hash_table_lookup (perf_log->statistics_by_name, event->name) != NULL; + + if (i != 0) + g_string_append (output, ",\n "); + + g_string_append_printf (output, + "{ \"name\": \"%s\",\n" + " \"description\": \"%s\"", + event->name, escaped_description); + if (is_statistic) + g_string_append (output, ",\n \"statistic\": true"); + + g_string_append (output, " }"); + + if (escaped_description != event->description) + g_free (escaped_description); + } + + g_string_append (output, " ]"); + + return write_string (out, g_string_free (output, FALSE), error); +} + +typedef struct { + GOutputStream *out; + GError *error; + gboolean first; +} ReplayToJsonClosure; + +static void +replay_to_json (gint64 time, + const char *name, + const char *signature, + GValue *arg, + gpointer user_data) +{ + ReplayToJsonClosure *closure = user_data; + char *event_str; + + if (closure->error != NULL) + return; + + if (!closure->first) + { + if (!write_string (closure->out, ",\n ", &closure->error)) + return; + } + + closure->first = FALSE; + + if (strcmp (signature, "") == 0) + { + event_str = g_strdup_printf ("[%" G_GINT64_FORMAT ", \"%s\"]", time, name); + } + else if (strcmp (signature, "i") == 0) + { + event_str = g_strdup_printf ("[%" G_GINT64_FORMAT ", \"%s\", %i]", + time, + name, + g_value_get_int (arg)); + } + else if (strcmp (signature, "x") == 0) + { + event_str = g_strdup_printf ("[%" G_GINT64_FORMAT ", \"%s\", %"G_GINT64_FORMAT "]", + time, + name, + g_value_get_int64 (arg)); + } + else if (strcmp (signature, "s") == 0) + { + const char *arg_str = g_value_get_string (arg); + char *escaped = escape_quotes (arg_str); + + event_str = g_strdup_printf ("[%" G_GINT64_FORMAT ", \"%s\", \"%s\"]", + time, + name, + g_value_get_string (arg)); + + if (escaped != arg_str) + g_free (escaped); + } + else + { + g_assert_not_reached (); + } + + if (!write_string (closure->out, event_str, &closure->error)) + return; +} + +/** + * shell_perf_log_dump_log: + * @perf_log: a #ShellPerfLog + * @out: output stream into which to write the event log + * @error: location to store #GError, or %NULL + * + * Writes the performance event log, formatted as JSON, to the specified + * output stream. For performance reasons, the output stream passed + * in should generally be a buffered (or memory) output stream, since + * it will be written to in small pieces. The JSON output is an array + * with the elements of the array also being arrays, of the form + * '[' ', '<b>mismatched</i>'); +assertEscapes('mismatched', '<b>mismatched</i>'); + +assertConverts('mismatched/unknown', '<b>mismatched/unknown</bunknown>'); +assertEscapes('mismatched/unknown', '<b>mismatched/unknown</bunknown>'); diff --git a/tests/unit/url.js b/tests/unit/url.js new file mode 100644 index 0000000..158316b --- /dev/null +++ b/tests/unit/url.js @@ -0,0 +1,75 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +// Test cases for MessageTray URLification + +const JsUnit = imports.jsUnit; + +const Environment = imports.ui.environment; +Environment.init(); + +const Util = imports.misc.util; + +const tests = [ + { input: 'This is a test', + output: [] }, + { input: 'This is http://www.gnome.org a test', + output: [ { url: 'http://www.gnome.org', pos: 8 } ] }, + { input: 'This is http://www.gnome.org', + output: [ { url: 'http://www.gnome.org', pos: 8 } ] }, + { input: 'http://www.gnome.org a test', + output: [ { url: 'http://www.gnome.org', pos: 0 } ] }, + { input: 'http://www.gnome.org', + output: [ { url: 'http://www.gnome.org', pos: 0 } ] }, + { input: 'Go to http://www.gnome.org.', + output: [ { url: 'http://www.gnome.org', pos: 6 } ] }, + { input: 'Go to http://www.gnome.org/.', + output: [ { url: 'http://www.gnome.org/', pos: 6 } ] }, + { input: '(Go to http://www.gnome.org!)', + output: [ { url: 'http://www.gnome.org', pos: 7 } ] }, + { input: 'Use GNOME (http://www.gnome.org).', + output: [ { url: 'http://www.gnome.org', pos: 11 } ] }, + { input: 'This is a http://www.gnome.org/path test.', + output: [ { url: 'http://www.gnome.org/path', pos: 10 } ] }, + { input: 'This is a www.gnome.org scheme-less test.', + output: [ { url: 'www.gnome.org', pos: 10 } ] }, + { input: 'This is a www.gnome.org/scheme-less test.', + output: [ { url: 'www.gnome.org/scheme-less', pos: 10 } ] }, + { input: 'This is a http://www.gnome.org:99/port test.', + output: [ { url: 'http://www.gnome.org:99/port', pos: 10 } ] }, + { input: 'This is an ftp://www.gnome.org/ test.', + output: [ { url: 'ftp://www.gnome.org/', pos: 11 } ] }, + { input: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)', + output: [ { url: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)', pos: 0 } ] }, + { input: 'https://www.gnome.org/(some_url_with_unbalanced_parenthesis', + output: [ { url: 'https://www.gnome.org/', pos: 0 } ] }, + + { input: 'Visit http://www.gnome.org/ and http://developer.gnome.org', + output: [ { url: 'http://www.gnome.org/', pos: 6 }, + { url: 'http://developer.gnome.org', pos: 32 } ] }, + + { input: 'This is not.a.domain test.', + output: [ ] }, + { input: 'This is not:a.url test.', + output: [ ] }, + { input: 'This is not:/a.url/ test.', + output: [ ] }, + { input: 'This is not:/a.url/ test.', + output: [ ] }, + { input: 'This is not@a.url/ test.', + output: [ ] }, + { input: 'This is surely@not.a/url test.', + output: [ ] } +]; + +for (let i = 0; i < tests.length; i++) { + let match = Util.findUrls(tests[i].input); + + JsUnit.assertEquals('Test ' + i + ' match length', + match.length, tests[i].output.length); + for (let j = 0; j < match.length; j++) { + JsUnit.assertEquals('Test ' + i + ', match ' + j + ' url', + match[j].url, tests[i].output[j].url); + JsUnit.assertEquals('Test ' + i + ', match ' + j + ' position', + match[j].pos, tests[i].output[j].pos); + } +} diff --git a/tools/build/gnome-shell-build-setup.sh b/tools/build/gnome-shell-build-setup.sh new file mode 100755 index 0000000..59637e4 --- /dev/null +++ b/tools/build/gnome-shell-build-setup.sh @@ -0,0 +1,348 @@ +#!/bin/sh +# +# Script that sets up jhbuild to build gnome-shell. Run this to +# checkout jhbuild and the required configuration. +# +# Copyright (C) 2008, Red Hat, Inc. +# +# Some ideas and code taken from gtk-osx-build +# +# Copyright (C) 2006, 2007, 2008 Imendio AB +# + +release_file= + +if which lsb_release > /dev/null 2>&1; then + system=`lsb_release -is` + version=`lsb_release -rs` +elif [ -f /etc/fedora-release ] ; then + system=Fedora + release_file=/etc/fedora-release +elif [ -f /etc/SuSE-release ] ; then + system=SUSE + release_file=/etc/SuSE-release +elif [ -f /etc/mandriva-release ]; then + system=MandrivaLinux + release_file=/etc/mandriva-release +fi + +if [ x$release_file != x ] ; then + version=`sed 's/[^0-9\.]*\([0-9\.]\+\).*/\1/' < $release_file` +fi + +# This is the configuration of packages that we'll need to successfully jhbuild. +# Each line is of the form: +# +# name_of_depenency: :package [:package...] +# +# The dependency name is purely informative and isn't otherwise used. distro_chars are: +# +# f: Fedora +# d: Debian/Ubuntu +# s: SuSE +# m: Mandriva +# +# Rather than have some complicated system here, when we have packages that depend +# on distribution version, we just tweak the package list in the code below. +# Where known, the module that requires a library is commented. + +all_packages() { +cat <:package + IFS=: + set $word + IFS=' ' + case $1 in + *$distribution_char*) echo $2 + esac + done + done +} + +# We try to make it clear what we're doing via sudo so if a user gets prompted +# for their password, they have some idea why. +run_via_sudo() { + echo "Running: sudo $@" + if sudo "$@" ; then : ; else + echo 1>&2 "Command failed." + echo 1>&2 "Exiting gnome-shell-build-setup.sh. You can run it again safely." + exit 1 + fi +} + +if test "x$system" = xUbuntu -o "x$system" = xDebian -o "x$system" = xLinuxMint ; then + reqd=`packages_for_distribution d` + + if apt-cache show libxcb-util0-dev > /dev/null 2> /dev/null; then + reqd="$reqd libxcb-util0-dev" + else + reqd="$reqd libxcb-event1-dev libxcb-aux0-dev" + fi + + if apt-cache show autopoint > /dev/null 2> /dev/null; then + reqd="$reqd autopoint" + fi + + if [ ! -x /usr/bin/dpkg-checkbuilddeps -o ! -x /usr/bin/apt-file ]; then + echo "Installing base dependencies" + run_via_sudo apt-get install dpkg-dev apt-file + fi + + echo "Updating apt-file cache" + run_via_sudo apt-file update + + # libcurl comes in both gnutls and openssl flavors. If the openssl + # flavor of the runtime is installed, install the matching -dev + # package, but default to the gnutls version. (the libcurl3 vs. libcurl4 + # mismatch is intentional and is how things are packaged.) + + if ! dpkg-checkbuilddeps -d libcurl-dev /dev/null 2> /dev/null; then + if dpkg -s libcurl3 /dev/null 2> /dev/null; then + missing="libcurl4-openssl-dev $missing" + elif dpkg -s libcurl3-nss /dev/null 2> /dev/null; then + missing="libcurl4-nss-dev $missing" + else + missing="libcurl4-gnutls-dev $missing" + fi + fi + + for pkg in $reqd ; do + if ! dpkg-checkbuilddeps -d $pkg /dev/null 2> /dev/null; then + missing="$pkg $missing" + fi + done + if test ! "x$missing" = x; then + echo "Installing packages" + run_via_sudo apt-get install $missing + fi +fi + +if test "x$system" = xFedora ; then + reqd=`packages_for_distribution f` + + if expr $version = 14 > /dev/null ; then + reqd="$reqd gettext-autopoint" + elif expr $version \>= 15 > /dev/null ; then + reqd="$reqd gettext-devel" + fi + + # For evolution-data-server: + # /usr/include/db.h moved packages in Fedora 18 + if expr $version \>= 18 > /dev/null ; then + reqd="$reqd libdb-devel" + else + reqd="$reqd db4-devel" + fi + + echo -n "Computing packages to install ... " + for pkg in $reqd ; do + if ! rpm -q --whatprovides $pkg > /dev/null 2>&1; then + missing="$pkg $missing" + fi + done + echo "done" + + if test ! "x$missing" = x; then + echo -n "Installing packages ... " + missing_str= + for pkg in $missing ; do + missing_str="$missing_str${missing_str:+,}\"$pkg\"" + done + gdbus call -e -d org.freedesktop.PackageKit -o /org/freedesktop/PackageKit -m org.freedesktop.PackageKit.Modify.InstallPackageNames 0 "[$missing_str]" "hide-finished,show-warnings" + echo "done" + fi +fi + +if test "x$system" = xSUSE -o "x$system" = "xSUSE LINUX" ; then + reqd=`packages_for_distribution s` + if test ! "x$reqd" = x; then + echo "Please run 'su --command=\"zypper install $reqd\"' and try again." + echo + exit 1 + fi +fi + +if test "x$system" = xMandrivaLinux ; then + reqd=`packages_for_distribution m` + if test ! "x$reqd" = x; then + gurpmi --auto $reqd + fi +fi + +SOURCE=$HOME/Source +BASEURL=http://git.gnome.org/browse/gnome-shell/plain/tools/build + +if [ -d $SOURCE ] ; then : ; else + mkdir $SOURCE + echo "Created $SOURCE" +fi + +checkout_git() { + module=$1 + source=$2 + + if [ -d $SOURCE/$1 ] ; then + if [ -d $SOURCE/$1/.git ] ; then + echo -n "Updating $1 ... " + ( cd $SOURCE/$1 && git pull --rebase > /dev/null ) || exit 1 + echo "done" + else + echo "$SOURCE/$1 is not a git repository" + echo "You should remove it and rerun this script" + exit 1 + fi + else + echo -n "Checking out $1 into $SOURCE/$1 ... " + cd $SOURCE + git clone $2 > /dev/null || exit 1 + echo "done" + fi +} + +checkout_git jhbuild git://git.gnome.org/jhbuild + +echo -n "Installing jhbuild ... " +(cd $SOURCE/jhbuild && + ./autogen.sh --simple-install && + make -f Makefile.plain DISABLE_GETTEXT=1 bindir=$HOME/bin install) >/dev/null +echo "done" + +if [ -e $HOME/.jhbuildrc ] ; then + if grep JHBUILDRC_GNOME_SHELL $HOME/.jhbuildrc > /dev/null ; then : ; else + mv $HOME/.jhbuildrc $HOME/.jhbuildrc.bak + echo "Saved ~/.jhbuildrc as ~/.jhbuildrc.bak" + fi +fi + +echo -n "Writing ~/.jhbuildrc ... " +curl -L -s -o $HOME/.jhbuildrc $BASEURL/jhbuildrc-gnome-shell +echo "done" + +if [ ! -f $HOME/.jhbuildrc-custom ]; then + echo -n "Writing example ~/.jhbuildrc-custom ... " + curl -L -s -o $HOME/.jhbuildrc-custom $BASEURL/jhbuildrc-custom-example + echo "done" +fi + +if [ -d $HOME/gnome-shell -a \! -d $HOME/gnome ] ; then + cat <