├── .gitignore ├── LICENSE ├── POTFILES.in ├── README.md ├── appfolders-manager@maestroschan.fr.zip ├── appfolders-manager@maestroschan.fr ├── appfolderDialog.js ├── convenience.js ├── dragAndDrop.js ├── extension.js ├── locale │ ├── appfolders-manager.pot │ ├── be │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── de │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── el │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── hr │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── hu │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── it │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── nl_NL │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── pl │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── pt_BR │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── ru │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── sr │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── sr@latin │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── tr │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ ├── uk_UA │ │ └── LC_MESSAGES │ │ │ ├── appfolders-manager.mo │ │ │ └── appfolders-manager.po │ └── zh_CN │ │ └── LC_MESSAGES │ │ ├── appfolders-manager.mo │ │ └── appfolders-manager.po ├── metadata.json ├── prefs.js ├── schemas │ ├── gschemas.compiled │ └── org.gnome.shell.extensions.appfolders-manager.gschema.xml └── stylesheet.css ├── build-a-zip.sh ├── install.sh └── update-and-compile-translations.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /_* 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /POTFILES.in: -------------------------------------------------------------------------------- 1 | appfolders-manager@maestroschan.fr/extension.js 2 | appfolders-manager@maestroschan.fr/dragAndDrop.js 3 | appfolders-manager@maestroschan.fr/appfolderDialog.js 4 | appfolders-manager@maestroschan.fr/prefs.js 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Appfolders Management 2 | 3 | for GNOME Shell 3.28 to 3.32 4 | 5 | **After 3.33, GNOME Shell handles this feature natively.** 6 | 7 | [](https://extensions.gnome.org/extension/1217/appfolders-manager/) 8 | 9 | A GNOME Shell extension allowing easy management of "appfolders" directly from the applications view. 10 | 11 | ### Available in : 12 | 13 | * Belarusian - [DeadMetaler](https://github.com/DeadMetaler) 14 | * Brazilian Portuguese - [Fábio Nogueira](https://github.com/frnogueira) 15 | * Croatian - [Milo Ivir](https://github.com/milotype) 16 | * English - [Romain T.](https://github.com/maoschanz/) 17 | * French - [Romain T.](https://github.com/maoschanz/) 18 | * German - [Marcel Hoppe](https://github.com/hobbypunk90) 19 | * Greek - [dirosis](https://github.com/dirosis) 20 | * Hungarian - [Balázs Úr](https://github.com/urbalazs) 21 | * Italian - [amivaleo](https://github.com/amivaleo) 22 | * Polish - [Piotr Komur](https://github.com/pkomur) 23 | * Russian - [DeadMetaler](https://github.com/DeadMetaler) 24 | * Serbian - [Slobodan Terzić](https://github.com/Faenriis) 25 | * Turkish - [Serdar Sağlam](https://github.com/TeknoMobil) 26 | * Ukrainian - [Igor Gordiichuk](https://github.com/IgorHordiichuk) 27 | 28 | A huge _thank you_ to all translators! 29 | 30 | ### Current version 31 | 32 | Features : 33 | 34 | * Create new folders 35 | * Delete folders 36 | * Rename folders 37 | 38 | * Add a category to a folder 39 | * Remove a category from a folder 40 | 41 | * Add applications to folders 42 | * Remove applications from folders 43 | 44 | ![Screenshot which isn't the current version at all (in french, sorry)](https://i.imgur.com/xNAVlbF.png) 45 | 46 | ![Screenshot of the dialog for editing an appfolder (in french, sorry)](https://i.imgur.com/KZViAjt.png) 47 | 48 | (categories are defined by a [freedesktop standard](https://standards.freedesktop.org/menu-spec/latest/apa.html), see [this section](https://standards.freedesktop.org/menu-spec/latest/apas02.html) to learn more about additional categories available) 49 | 50 | Drag-and-drop is possible. 51 | 52 | ### Installation 53 | 54 | #### Recommended way to do 55 | 56 | Install it from [extensions.gnome.org](https://extensions.gnome.org/extension/1217/appfolders-manager/) or from *GNOME Software*. 57 | 58 | #### Manual installation 59 | 60 | - Download the .zip archive and extract files in `~/.local/share/gnome-shell/extensions/appfolders-manager@maestroschan.fr` 61 | - Restart GNOME Shell. 62 | - Enable the extension. 63 | 64 | ### See also 65 | 66 | - [a GTK+ application which manages appfolders](https://github.com/muflone/gnome-appfolders-manager) 67 | - [the "official" way to do it for GNOME 3.14 to 3.32](https://wiki.gnome.org/Apps/Software) 68 | 69 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr.zip -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/appfolderDialog.js: -------------------------------------------------------------------------------- 1 | // appfolderDialog.js 2 | // GPLv3 3 | 4 | const Signals = imports.signals; 5 | const Config = imports.misc.config; 6 | 7 | const Clutter = imports.gi.Clutter; 8 | const Gio = imports.gi.Gio; 9 | const St = imports.gi.St; 10 | const Gtk = imports.gi.Gtk; 11 | 12 | const Main = imports.ui.main; 13 | const ModalDialog = imports.ui.modalDialog; 14 | const PopupMenu = imports.ui.popupMenu; 15 | const ShellEntry = imports.ui.shellEntry; 16 | 17 | const ExtensionUtils = imports.misc.extensionUtils; 18 | const Me = ExtensionUtils.getCurrentExtension(); 19 | const Extension = Me.imports.extension; 20 | 21 | const Gettext = imports.gettext.domain('appfolders-manager'); 22 | const _ = Gettext.gettext; 23 | 24 | let FOLDER_SCHEMA; 25 | let FOLDER_LIST; 26 | 27 | //------------------------------------------------------------------------------ 28 | 29 | // This is a modal dialog for creating a new folder, or renaming or modifying 30 | // categories of existing folders. 31 | var AppfolderDialog = class AppfolderDialog { 32 | 33 | // build a new dialog. If folder is null, the dialog will be for creating a 34 | // new folder, else app is null, and the dialog will be for editing an 35 | // existing folder 36 | constructor (folder, app, id) { 37 | this._folder = folder; 38 | this._app = app; 39 | this._id = id; 40 | this.super_dialog = new ModalDialog.ModalDialog({ destroyOnClose: true }); 41 | 42 | FOLDER_SCHEMA = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' }); 43 | FOLDER_LIST = FOLDER_SCHEMA.get_strv('folder-children'); 44 | 45 | let nameSection = this._buildNameSection(); 46 | let categoriesSection = this._buildCategoriesSection(); 47 | 48 | this.super_dialog.contentLayout.style = 'spacing: 20px'; 49 | this.super_dialog.contentLayout.add(nameSection, { 50 | x_fill: false, 51 | x_align: St.Align.START, 52 | y_align: St.Align.START 53 | }); 54 | if (Extension.SETTINGS.get_boolean('categories')) { 55 | this.super_dialog.contentLayout.add(categoriesSection, { 56 | x_fill: false, 57 | x_align: St.Align.START, 58 | y_align: St.Align.START 59 | }); 60 | } 61 | 62 | if (this._folder == null) { 63 | this.super_dialog.setButtons([ 64 | { action: this.destroy.bind(this), 65 | label: _("Cancel"), 66 | key: Clutter.Escape }, 67 | 68 | { action: this._apply.bind(this), 69 | label: _("Create"), 70 | key: Clutter.Return } 71 | ]); 72 | } else { 73 | this.super_dialog.setButtons([ 74 | { action: this.destroy.bind(this), 75 | label: _("Cancel"), 76 | key: Clutter.Escape }, 77 | 78 | { action: this._deleteFolder.bind(this), 79 | label: _("Delete"), 80 | key: Clutter.Delete }, 81 | 82 | { action: this._apply.bind(this), 83 | label: _("Apply"), 84 | key: Clutter.Return } 85 | ]); 86 | } 87 | 88 | this._nameEntryText.connect('key-press-event', (o, e) => { 89 | let symbol = e.get_key_symbol(); 90 | 91 | if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) { 92 | this.super_dialog.popModal(); 93 | this._apply(); 94 | } 95 | }); 96 | } 97 | 98 | // build the section of the UI handling the folder's name and returns it. 99 | _buildNameSection () { 100 | let nameSection = new St.BoxLayout({ 101 | style: 'spacing: 5px;', 102 | vertical: true, 103 | x_expand: true, 104 | natural_width_set: true, 105 | natural_width: 350, 106 | }); 107 | 108 | let nameLabel = new St.Label({ 109 | text: _("Folder's name:"), 110 | style: 'font-weight: bold;', 111 | }); 112 | nameSection.add(nameLabel, { y_align: St.Align.START }); 113 | 114 | this._nameEntry = new St.Entry({ 115 | x_expand: true, 116 | }); 117 | this._nameEntryText = null; ///??? 118 | this._nameEntryText = this._nameEntry.clutter_text; 119 | 120 | nameSection.add(this._nameEntry, { y_align: St.Align.START }); 121 | ShellEntry.addContextMenu(this._nameEntry); 122 | this.super_dialog.setInitialKeyFocus(this._nameEntryText); 123 | 124 | if (this._folder != null) { 125 | this._nameEntryText.set_text(this._folder.get_string('name')); 126 | } 127 | 128 | return nameSection; 129 | } 130 | 131 | // build the section of the UI handling the folder's categories and returns it. 132 | _buildCategoriesSection () { 133 | let categoriesSection = new St.BoxLayout({ 134 | style: 'spacing: 5px;', 135 | vertical: true, 136 | x_expand: true, 137 | natural_width_set: true, 138 | natural_width: 350, 139 | }); 140 | 141 | let categoriesLabel = new St.Label({ 142 | text: _("Categories:"), 143 | style: 'font-weight: bold;', 144 | }); 145 | categoriesSection.add(categoriesLabel, { 146 | x_fill: false, 147 | x_align: St.Align.START, 148 | y_align: St.Align.START, 149 | }); 150 | 151 | let categoriesBox = new St.BoxLayout({ 152 | style: 'spacing: 5px;', 153 | vertical: false, 154 | x_expand: true, 155 | }); 156 | 157 | // at the left, how to add categories 158 | let addCategoryBox = new St.BoxLayout({ 159 | style: 'spacing: 5px;', 160 | vertical: true, 161 | x_expand: true, 162 | }); 163 | 164 | this._categoryEntry = new St.Entry({ 165 | can_focus: true, 166 | x_expand: true, 167 | hint_text: _("Other category?"), 168 | secondary_icon: new St.Icon({ 169 | icon_name: 'list-add-symbolic', 170 | icon_size: 16, 171 | style_class: 'system-status-icon', 172 | y_align: Clutter.ActorAlign.CENTER, 173 | }), 174 | }); 175 | ShellEntry.addContextMenu(this._categoryEntry, null); 176 | this._categoryEntry.connect('secondary-icon-clicked', this._addCategory.bind(this)); 177 | 178 | this._categoryEntryText = null; ///??? 179 | this._categoryEntryText = this._categoryEntry.clutter_text; 180 | this._catSelectButton = new SelectCategoryButton(this); 181 | 182 | addCategoryBox.add(this._catSelectButton.actor, { y_align: St.Align.CENTER }); 183 | addCategoryBox.add(this._categoryEntry, { y_align: St.Align.START }); 184 | categoriesBox.add(addCategoryBox, { 185 | x_fill: true, 186 | x_align: St.Align.START, 187 | y_align: St.Align.START, 188 | }); 189 | 190 | // at the right, a list of categories 191 | this.listContainer = new St.BoxLayout({ 192 | vertical: true, 193 | x_expand: true, 194 | }); 195 | this.noCatLabel = new St.Label({ text: _("No category") }); 196 | this.listContainer.add_actor(this.noCatLabel); 197 | categoriesBox.add(this.listContainer, { 198 | x_fill: true, 199 | x_align: St.Align.END, 200 | y_align: St.Align.START, 201 | }); 202 | 203 | categoriesSection.add(categoriesBox, { 204 | x_fill: true, 205 | x_align: St.Align.START, 206 | y_align: St.Align.START, 207 | }); 208 | 209 | // Load categories is necessary even if no this._folder, because it 210 | // initializes the value of this._categories 211 | this._loadCategories(); 212 | 213 | return categoriesSection; 214 | } 215 | 216 | open () { 217 | this.super_dialog.open(); 218 | } 219 | 220 | // returns if a folder id already exists 221 | _alreadyExists (folderId) { 222 | for(var i = 0; i < FOLDER_LIST.length; i++) { 223 | if (FOLDER_LIST[i] == folderId) { 224 | // this._showError( _("This appfolder already exists.") ); 225 | return true; 226 | } 227 | } 228 | return false; 229 | } 230 | 231 | destroy () { 232 | if (Extension.DEBUG) { 233 | log('[AppfolderDialog v2] destroying dialog'); 234 | } 235 | this._catSelectButton.destroy(); // XXX crée des erreurs osef 236 | this.super_dialog.destroy(); // XXX crée des erreurs reloues ??? 237 | } 238 | 239 | // Generates a valid folder id, which has no space, no dot, no slash, is not 240 | // empty, and doesn't already exist. 241 | _folderId (newName) { 242 | let folderId = this._removeChar(newName, " "); 243 | folderId = this._removeChar(folderId, "."); 244 | folderId = this._removeChar(folderId, "/"); 245 | if(folderId == "") { 246 | folderId = "unnamedFolder"; 247 | } 248 | if(this._alreadyExists(folderId)) { 249 | // probably unnecessary 250 | folderId = this._folderId(folderId + '_'); 251 | } 252 | return folderId; 253 | } 254 | 255 | _removeChar(folderId, char) { 256 | let tmp0 = folderId.split(char); 257 | folderId = ""; 258 | for(var i = 0; i < tmp0.length; i++) { 259 | folderId += tmp0[i]; 260 | } 261 | return folderId; 262 | } 263 | 264 | // creates a folder from the data filled by the user (with no properties) 265 | _create () { 266 | let folderId = this._folderId(this._nameEntryText.get_text()); 267 | 268 | FOLDER_LIST.push(folderId); 269 | FOLDER_SCHEMA.set_strv('folder-children', FOLDER_LIST); 270 | 271 | this._folder = new Gio.Settings({ 272 | schema_id: 'org.gnome.desktop.app-folders.folder', 273 | path: '/org/gnome/desktop/app-folders/folders/' + folderId + '/' 274 | }); 275 | // this._folder.set_string('name', this._nameEntryText.get_text()); //superflu 276 | // est-il nécessaire d'initialiser la clé apps à [] ?? 277 | this._addToFolder(); 278 | } 279 | 280 | // sets the name to the folder 281 | _applyName () { 282 | let newName = this._nameEntryText.get_text(); 283 | this._folder.set_string('name', newName); // génère un bug ? 284 | return Clutter.EVENT_STOP; 285 | } 286 | 287 | // loads categories, as set in gsettings, to the UI 288 | _loadCategories () { 289 | if (this._folder == null) { 290 | this._categories = []; 291 | } else { 292 | this._categories = this._folder.get_strv('categories'); 293 | if ((this._categories == null) || (this._categories.length == 0)) { 294 | this._categories = []; 295 | } else { 296 | this.noCatLabel.visible = false; 297 | } 298 | } 299 | this._categoriesButtons = []; 300 | for (var i = 0; i < this._categories.length; i++) { 301 | this._addCategoryBox(i); 302 | } 303 | } 304 | 305 | _addCategoryBox (i) { 306 | let aCategory = new AppCategoryBox(this, i); 307 | this.listContainer.add_actor(aCategory.super_box); 308 | } 309 | 310 | // adds a category to the UI (will be added to gsettings when pressing 311 | // "apply" only) 312 | _addCategory (entry, new_cat_name) { 313 | if (new_cat_name == null) { 314 | new_cat_name = this._categoryEntryText.get_text(); 315 | } 316 | if (this._categories.indexOf(new_cat_name) != -1) { 317 | return; 318 | } 319 | if (new_cat_name == '') { 320 | return; 321 | } 322 | this._categories.push(new_cat_name); 323 | this._categoryEntryText.set_text(''); 324 | this.noCatLabel.visible = false; 325 | this._addCategoryBox(this._categories.length-1); 326 | } 327 | 328 | // adds all categories to gsettings 329 | _applyCategories () { 330 | this._folder.set_strv('categories', this._categories); 331 | return Clutter.EVENT_STOP; 332 | } 333 | 334 | // Apply everything by calling methods above, and reload the view 335 | _apply () { 336 | if (this._app != null) { 337 | this._create(); 338 | // this._addToFolder(); 339 | } 340 | this._applyCategories(); 341 | this._applyName(); 342 | this.destroy(); 343 | 344 | Main.overview.viewSelector.appDisplay._views[1].view._redisplay(); 345 | if (Extension.DEBUG) { 346 | log('[AppfolderDialog v2] reload the view'); 347 | } 348 | } 349 | 350 | // initializes the folder with its first app. This is not optional since 351 | // empty folders are not displayed. TODO use the equivalent method from 352 | // extension.js 353 | _addToFolder () { 354 | let content = this._folder.get_strv('apps'); 355 | content.push(this._app); 356 | this._folder.set_strv('apps', content); 357 | } 358 | 359 | // Delete the folder, using the extension.js method 360 | _deleteFolder () { 361 | if (this._folder != null) { 362 | Extension.deleteFolder(this._id); 363 | } 364 | this.destroy(); 365 | } 366 | }; 367 | 368 | //------------------------------------------------------------------------------ 369 | 370 | // Very complex way to have a menubutton for displaying a menu with standard 371 | // categories. Button part. 372 | class SelectCategoryButton { 373 | constructor (dialog) { 374 | this._dialog = dialog; 375 | 376 | let catSelectBox = new St.BoxLayout({ 377 | vertical: false, 378 | x_expand: true, 379 | }); 380 | let catSelectLabel = new St.Label({ 381 | text: _("Select a category…"), 382 | x_align: Clutter.ActorAlign.START, 383 | y_align: Clutter.ActorAlign.CENTER, 384 | x_expand: true, 385 | }); 386 | let catSelectIcon = new St.Icon({ 387 | icon_name: 'pan-down-symbolic', 388 | icon_size: 16, 389 | style_class: 'system-status-icon', 390 | x_expand: false, 391 | x_align: Clutter.ActorAlign.END, 392 | y_align: Clutter.ActorAlign.CENTER, 393 | }); 394 | catSelectBox.add(catSelectLabel, { y_align: St.Align.MIDDLE }); 395 | catSelectBox.add(catSelectIcon, { y_align: St.Align.END }); 396 | this.actor = new St.Button ({ 397 | x_align: Clutter.ActorAlign.CENTER, 398 | y_align: Clutter.ActorAlign.CENTER, 399 | child: catSelectBox, 400 | style_class: 'button', 401 | style: 'padding: 5px 5px;', 402 | x_expand: true, 403 | y_expand: false, 404 | x_fill: true, 405 | y_fill: true, 406 | }); 407 | this.actor.connect('button-press-event', this._onButtonPress.bind(this)); 408 | 409 | this._menu = null; 410 | if (Config.PACKAGE_VERSION < '3.33') { 411 | // desesperate effort to get useless 3.34 compatibility 412 | this._menuManager = new PopupMenu.PopupMenuManager(this); 413 | } else { 414 | // main case 415 | this._menuManager = new PopupMenu.PopupMenuManager(this.actor); 416 | } 417 | } 418 | 419 | popupMenu () { 420 | this.actor.fake_release(); 421 | if (!this._menu) { 422 | this._menu = new SelectCategoryMenu(this, this._dialog); 423 | this._menu.super_menu.connect('open-state-changed', (menu, isPoppedUp) => { 424 | if (!isPoppedUp) { 425 | this.actor.sync_hover(); 426 | this.emit('menu-state-changed', false); 427 | } 428 | }); 429 | this._menuManager.addMenu(this._menu.super_menu); 430 | } 431 | this.emit('menu-state-changed', true); 432 | this.actor.set_hover(true); 433 | this._menu.popup(); 434 | this._menuManager.ignoreRelease(); 435 | return false; 436 | } 437 | 438 | _onButtonPress (actor, event) { 439 | this.popupMenu(); 440 | return Clutter.EVENT_STOP; 441 | } 442 | 443 | destroy () { 444 | if (this._menu) { 445 | this._menu.destroy(); 446 | } 447 | // if uncommented with 3.28 XXX TypeError: this.parent is not a function 448 | // this.actor.destroy(); 449 | } 450 | }; 451 | Signals.addSignalMethods(SelectCategoryButton.prototype); 452 | 453 | //------------------------------------------------------------------------------ 454 | 455 | // Very complex way to have a menubutton for displaying a menu with standard 456 | // categories. Menu part. 457 | class SelectCategoryMenu { 458 | constructor (source, dialog) { 459 | this.super_menu = new PopupMenu.PopupMenu(source.actor, 0.5, St.Side.RIGHT); 460 | this._source = source; 461 | this._dialog = dialog; 462 | this.super_menu.actor.add_style_class_name('app-well-menu'); 463 | this._source.actor.connect('destroy', this.super_menu.destroy.bind(this)); 464 | 465 | // We want to keep the item hovered while the menu is up //XXX used ?? 466 | this.super_menu.blockSourceEvents = true; 467 | 468 | Main.uiGroup.add_actor(this.super_menu.actor); 469 | 470 | // This is a really terrible hack to overwrite _redisplay without 471 | // actually inheriting from PopupMenu.PopupMenu 472 | this.super_menu._redisplay = this._redisplay; 473 | this.super_menu._dialog = this._dialog; 474 | } 475 | 476 | _redisplay () { 477 | this.removeAll(); 478 | let mainCategories = ['AudioVideo', 'Audio', 'Video', 'Development', 479 | 'Education', 'Game', 'Graphics', 'Network', 'Office', 'Science', 480 | 'Settings', 'System', 'Utility']; 481 | // XXX not translatable because they're ids not really labels 482 | for (var i=0; i { 486 | this._dialog._addCategory(null, labelItem); 487 | }); 488 | this.addMenuItem(item); 489 | } 490 | } 491 | 492 | popup (activatingButton) { 493 | this.super_menu._redisplay(); 494 | this.super_menu.open(); 495 | } 496 | 497 | destroy () { 498 | this.super_menu.close(); // FIXME error in the logs but i don't care 499 | this.super_menu.destroy(); 500 | } 501 | }; 502 | Signals.addSignalMethods(SelectCategoryMenu.prototype); 503 | 504 | //------------------------------------------------------------------------------ 505 | 506 | // This custom widget is a deletable row, displaying a category name. 507 | class AppCategoryBox { 508 | constructor (dialog, i) { 509 | this.super_box = new St.BoxLayout({ 510 | vertical: false, 511 | style_class: 'appCategoryBox', 512 | }); 513 | this._dialog = dialog; 514 | this.catName = this._dialog._categories[i]; 515 | this.super_box.add_actor(new St.Label({ 516 | text: this.catName, 517 | y_align: Clutter.ActorAlign.CENTER, 518 | x_align: Clutter.ActorAlign.CENTER, 519 | })); 520 | this.super_box.add_actor( new St.BoxLayout({ x_expand: true }) ); 521 | this.deleteButton = new St.Button({ 522 | x_expand: false, 523 | y_expand: true, 524 | style_class: 'appCategoryDeleteBtn', 525 | y_align: Clutter.ActorAlign.CENTER, 526 | x_align: Clutter.ActorAlign.CENTER, 527 | child: new St.Icon({ 528 | icon_name: 'edit-delete-symbolic', 529 | icon_size: 16, 530 | style_class: 'system-status-icon', 531 | x_expand: false, 532 | y_expand: true, 533 | style: 'margin: 3px;', 534 | y_align: Clutter.ActorAlign.CENTER, 535 | x_align: Clutter.ActorAlign.CENTER, 536 | }), 537 | }); 538 | this.super_box.add_actor(this.deleteButton); 539 | this.deleteButton.connect('clicked', this.removeFromList.bind(this)); 540 | } 541 | 542 | removeFromList () { 543 | this._dialog._categories.splice(this._dialog._categories.indexOf(this.catName), 1); 544 | if (this._dialog._categories.length == 0) { 545 | this._dialog.noCatLabel.visible = true; 546 | } 547 | this.destroy(); 548 | } 549 | 550 | destroy () { 551 | this.deleteButton.destroy(); 552 | this.super_box.destroy(); 553 | } 554 | }; 555 | 556 | //------------------------------------------------------------------------------ 557 | 558 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/convenience.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 | /* 3 | Copyright (c) 2011-2012, Giovanni Campagna 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * Neither the name of the GNOME nor the 13 | names of its contributors may be used to endorse or promote products 14 | derived from this software without specific prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | const Gettext = imports.gettext; 29 | const Gio = imports.gi.Gio; 30 | 31 | const Config = imports.misc.config; 32 | const ExtensionUtils = imports.misc.extensionUtils; 33 | 34 | /** 35 | * initTranslations: 36 | * @domain: (optional): the gettext domain to use 37 | * 38 | * Initialize Gettext to load translations from extensionsdir/locale. 39 | * If @domain is not provided, it will be taken from metadata['gettext-domain'] 40 | */ 41 | function initTranslations(domain) { 42 | let extension = ExtensionUtils.getCurrentExtension(); 43 | domain = domain || extension.metadata['gettext-domain']; 44 | 45 | // check if this extension was built with "make zip-file", and thus 46 | // has the locale files in a subfolder 47 | // otherwise assume that extension has been installed in the 48 | // same prefix as gnome-shell 49 | let localeDir = extension.dir.get_child('locale'); 50 | if (localeDir.query_exists(null)) 51 | Gettext.bindtextdomain(domain, localeDir.get_path()); 52 | else 53 | Gettext.bindtextdomain(domain, Config.LOCALEDIR); 54 | } 55 | 56 | /** 57 | * getSettings: 58 | * @schema: (optional): the GSettings schema id 59 | * 60 | * Builds and return a GSettings schema for @schema, using schema files 61 | * in extensionsdir/schemas. If @schema is not provided, it is taken from 62 | * metadata['settings-schema']. 63 | */ 64 | function getSettings(schema) { 65 | let extension = ExtensionUtils.getCurrentExtension(); 66 | schema = schema || extension.metadata['settings-schema']; 67 | 68 | const GioSSS = Gio.SettingsSchemaSource; 69 | 70 | // check if this extension was built with "make zip-file", and thus 71 | // has the schema files in a subfolder 72 | // otherwise assume that extension has been installed in the 73 | // same prefix as gnome-shell (and therefore schemas are available 74 | // in the standard folders) 75 | let schemaDir = extension.dir.get_child('schemas'); 76 | let schemaSource; 77 | if (schemaDir.query_exists(null)) { 78 | schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), 79 | GioSSS.get_default(), 80 | false); 81 | } else { 82 | schemaSource = GioSSS.get_default(); 83 | } 84 | 85 | let schemaObj = schemaSource.lookup(schema, true); 86 | if (!schemaObj) 87 | throw new Error('Schema ' + schema + ' could not be found for extension ' 88 | + extension.metadata.uuid + '. Please check your installation.'); 89 | 90 | return new Gio.Settings({ settings_schema: schemaObj }); 91 | } 92 | 93 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/dragAndDrop.js: -------------------------------------------------------------------------------- 1 | // dragAndDrop.js 2 | // GPLv3 3 | 4 | const DND = imports.ui.dnd; 5 | const AppDisplay = imports.ui.appDisplay; 6 | const Clutter = imports.gi.Clutter; 7 | const St = imports.gi.St; 8 | const Main = imports.ui.main; 9 | const Mainloop = imports.mainloop; 10 | 11 | const ExtensionUtils = imports.misc.extensionUtils; 12 | const Me = ExtensionUtils.getCurrentExtension(); 13 | const Extension = Me.imports.extension; 14 | 15 | const CHANGE_PAGE_TIMEOUT = 400; 16 | 17 | const Gettext = imports.gettext.domain('appfolders-manager'); 18 | const _ = Gettext.gettext; 19 | 20 | //------------------------------------------------------------------------------ 21 | 22 | var OVERLAY_MANAGER; 23 | 24 | /* This method is called by extension.js' enable function. It does code injections 25 | * to AppDisplay.AppIcon, connecting it to DND-related signals. 26 | */ 27 | function initDND () { 28 | OVERLAY_MANAGER = new OverlayManager(); 29 | } 30 | 31 | //------------------------------------------------------------------------------ 32 | 33 | /* Amazing! A singleton! It allows easy (and safer?) access to general methods, 34 | * managing other objects: it creates/updates/deletes all overlays (for folders, 35 | * pages, creation, removing). 36 | */ 37 | class OverlayManager { 38 | constructor () { 39 | this.addActions = []; 40 | this.removeAction = new FolderActionArea('remove'); 41 | this.createAction = new FolderActionArea('create'); 42 | this.upAction = new NavigationArea('up'); 43 | this.downAction = new NavigationArea('down'); 44 | 45 | this.next_drag_should_recompute = true; 46 | this.current_width = 0; 47 | } 48 | 49 | on_drag_begin () { 50 | this.ensurePopdowned(); 51 | this.ensureFolderOverlayActors(); 52 | this.updateFoldersVisibility(); 53 | this.updateState(true); 54 | } 55 | 56 | on_drag_end () { 57 | // force to compute new positions if a drop occurs 58 | this.next_drag_should_recompute = true; 59 | this.updateState(false); 60 | } 61 | 62 | on_drag_cancelled () { 63 | this.updateState(false); 64 | } 65 | 66 | updateArrowVisibility () { 67 | let grid = Main.overview.viewSelector.appDisplay._views[1].view._grid; 68 | if (grid.currentPage == 0) { 69 | this.upAction.setActive(false); 70 | } else { 71 | this.upAction.setActive(true); 72 | } 73 | if (grid.currentPage == grid._nPages -1) { 74 | this.downAction.setActive(false); 75 | } else { 76 | this.downAction.setActive(true); 77 | } 78 | this.upAction.show(); 79 | this.downAction.show(); 80 | } 81 | 82 | updateState (isDragging) { 83 | if (isDragging) { 84 | this.removeAction.show(); 85 | if (this.openedFolder == null) { 86 | this.removeAction.setActive(false); 87 | } else { 88 | this.removeAction.setActive(true); 89 | } 90 | this.createAction.show(); 91 | this.updateArrowVisibility(); 92 | } else { 93 | this.hideAll(); 94 | } 95 | } 96 | 97 | hideAll () { 98 | this.removeAction.hide(); 99 | this.createAction.hide(); 100 | this.upAction.hide(); 101 | this.downAction.hide(); 102 | this.hideAllFolders(); 103 | } 104 | 105 | hideAllFolders () { 106 | for (var i = 0; i < this.addActions.length; i++) { 107 | this.addActions[i].hide(); 108 | } 109 | } 110 | 111 | updateActorsPositions () { 112 | let monitor = Main.layoutManager.primaryMonitor; 113 | let viewSelector = Main.overview.viewSelector; 114 | this.topOfTheGrid = viewSelector.actor.get_parent().get_parent().get_allocation_box().y1; 115 | let temp = viewSelector.appDisplay._views[1].view.actor.get_parent(); 116 | let bottomOfTheGrid = this.topOfTheGrid + temp.get_allocation_box().y2; 117 | 118 | let _availHeight = bottomOfTheGrid - this.topOfTheGrid; 119 | let _availWidth = viewSelector.appDisplay._views[1].view._grid.actor.width; 120 | let sideMargin = (monitor.width - _availWidth) / 2; 121 | 122 | let xMiddle = ( monitor.x + monitor.width ) / 2; 123 | let yMiddle = ( monitor.y + monitor.height ) / 2; 124 | 125 | // Positions of areas 126 | this.removeAction.setPosition( xMiddle , bottomOfTheGrid ); 127 | this.createAction.setPosition( xMiddle, Main.overview._panelGhost.height ); 128 | this.upAction.setPosition( 0, Main.overview._panelGhost.height ); 129 | this.downAction.setPosition( 0, bottomOfTheGrid ); 130 | 131 | // Sizes of areas 132 | this.removeAction.setSize(xMiddle, monitor.height - bottomOfTheGrid); 133 | this.createAction.setSize(xMiddle, this.topOfTheGrid - Main.overview._panelGhost.height); 134 | this.upAction.setSize(xMiddle, this.topOfTheGrid - Main.overview._panelGhost.height); 135 | this.downAction.setSize(xMiddle, monitor.height - bottomOfTheGrid); 136 | 137 | this.updateArrowVisibility(); 138 | } 139 | 140 | ensureFolderOverlayActors () { 141 | // A folder was opened, and just closed. 142 | if (this.openedFolder != null) { 143 | this.updateActorsPositions(); 144 | this.computeFolderOverlayActors(); 145 | this.next_drag_should_recompute = true; 146 | return; 147 | } 148 | 149 | // The grid "moved" or the whole shit needs forced updating 150 | let allAppsGrid = Main.overview.viewSelector.appDisplay._views[1].view._grid; 151 | let new_width = allAppsGrid.actor.allocation.get_width(); 152 | if (new_width != this.current_width || this.next_drag_should_recompute) { 153 | this.next_drag_should_recompute = false; 154 | this.updateActorsPositions(); 155 | this.computeFolderOverlayActors(); 156 | } 157 | } 158 | 159 | computeFolderOverlayActors () { 160 | let monitor = Main.layoutManager.primaryMonitor; 161 | let xMiddle = ( monitor.x + monitor.width ) / 2; 162 | let yMiddle = ( monitor.y + monitor.height ) / 2; 163 | let allAppsGrid = Main.overview.viewSelector.appDisplay._views[1].view._grid; 164 | 165 | let nItems = 0; 166 | let indexes = []; 167 | let folders = []; 168 | let x, y; 169 | 170 | Main.overview.viewSelector.appDisplay._views[1].view._allItems.forEach(function(icon) { 171 | if (icon.actor.visible) { 172 | if (icon instanceof AppDisplay.FolderIcon) { 173 | indexes.push(nItems); 174 | folders.push(icon); 175 | } 176 | nItems++; 177 | } 178 | }); 179 | 180 | this.current_width = allAppsGrid.actor.allocation.get_width(); 181 | let x_correction = (monitor.width - this.current_width)/2; 182 | let availHeightPerPage = (allAppsGrid.actor.height)/(allAppsGrid._nPages); 183 | 184 | for (var i = 0; i < this.addActions.length; i++) { 185 | this.addActions[i].actor.destroy(); 186 | } 187 | 188 | for (var i = 0; i < indexes.length; i++) { 189 | let inPageIndex = indexes[i] % allAppsGrid._childrenPerPage; 190 | let page = Math.floor(indexes[i] / allAppsGrid._childrenPerPage); 191 | x = folders[i].actor.get_allocation_box().x1; 192 | y = folders[i].actor.get_allocation_box().y1; 193 | 194 | // Invalid coords (example: when dragging out of the folder) should 195 | // not produce a visible overlay, a negative page number is an easy 196 | // way to be sure it stays hidden. 197 | if (x == 0) { 198 | page = -1; 199 | } 200 | x = Math.floor(x + x_correction); 201 | y = y + this.topOfTheGrid; 202 | y = y - (page * availHeightPerPage); 203 | 204 | this.addActions[i] = new FolderArea(folders[i].id, x, y, page); 205 | } 206 | } 207 | 208 | updateFoldersVisibility () { 209 | let appView = Main.overview.viewSelector.appDisplay._views[1].view; 210 | for (var i = 0; i < this.addActions.length; i++) { 211 | if ((this.addActions[i].page == appView._grid.currentPage) && (!appView._currentPopup)) { 212 | this.addActions[i].show(); 213 | } else { 214 | this.addActions[i].hide(); 215 | } 216 | } 217 | } 218 | 219 | ensurePopdowned () { 220 | let appView = Main.overview.viewSelector.appDisplay._views[1].view; 221 | if (appView._currentPopup) { 222 | this.openedFolder = appView._currentPopup._source.id; 223 | appView._currentPopup.popdown(); 224 | } else { 225 | this.openedFolder = null; 226 | } 227 | } 228 | 229 | goToPage (nb) { 230 | Main.overview.viewSelector.appDisplay._views[1].view.goToPage( nb ); 231 | this.updateArrowVisibility(); 232 | this.hideAllFolders(); 233 | this.updateFoldersVisibility(); //load folders of the new page 234 | } 235 | 236 | destroy () { 237 | for (let i = 0; i > this.addActions.length; i++) { 238 | this.addActions[i].destroy(); 239 | } 240 | this.removeAction.destroy(); 241 | this.createAction.destroy(); 242 | this.upAction.destroy(); 243 | this.downAction.destroy(); 244 | //log('OverlayManager destroyed'); 245 | } 246 | }; 247 | 248 | //------------------------------------------------------------------------------ 249 | 250 | // Abstract overlay with very generic methods 251 | class DroppableArea { 252 | 253 | constructor (id) { 254 | this.id = id; 255 | this.styleClass = 'folderArea'; 256 | 257 | this.actor = new St.BoxLayout ({ 258 | width: 10, 259 | height: 10, 260 | visible: false, 261 | }); 262 | this.actor._delegate = this; 263 | 264 | this.lock = true; 265 | this.use_frame = Extension.DEBUG; 266 | } 267 | 268 | setPosition (x, y) { 269 | let monitor = Main.layoutManager.primaryMonitor; 270 | this.actor.set_position(monitor.x + x, monitor.y + y); 271 | } 272 | 273 | setSize (w, h) { 274 | this.actor.width = w; 275 | this.actor.height = h; 276 | } 277 | 278 | hide () { 279 | this.actor.visible = false; 280 | this.lock = true; 281 | } 282 | 283 | show () { 284 | this.actor.visible = true; 285 | } 286 | 287 | setActive (active) { 288 | this._active = active; 289 | if (this._active) { 290 | this.actor.style_class = this.styleClass; 291 | } else { 292 | this.actor.style_class = 'insensitiveArea'; 293 | } 294 | } 295 | 296 | destroy () { 297 | this.actor.destroy(); 298 | } 299 | } 300 | 301 | /* Overlay representing an "action". Actions can be creating a folder, or 302 | * removing an app from a folder. These areas accept drop, and display a label. 303 | */ 304 | class FolderActionArea extends DroppableArea { 305 | constructor (id) { 306 | super(id); 307 | 308 | let x, y, label; 309 | 310 | switch (this.id) { 311 | case 'create': 312 | label = _("Create a new folder"); 313 | this.styleClass = 'shadowedAreaTop'; 314 | break; 315 | case 'remove': 316 | label = ''; 317 | this.styleClass = 'shadowedAreaBottom'; 318 | break; 319 | default: 320 | label = 'invalid id'; 321 | break; 322 | } 323 | if (this.use_frame) { 324 | this.styleClass = 'framedArea'; 325 | } 326 | this.actor.style_class = this.styleClass; 327 | 328 | this.label = new St.Label({ 329 | text: label, 330 | style_class: 'dropAreaLabel', 331 | x_expand: true, 332 | y_expand: true, 333 | x_align: Clutter.ActorAlign.CENTER, 334 | y_align: Clutter.ActorAlign.CENTER, 335 | }); 336 | this.actor.add(this.label); 337 | 338 | this.setPosition(10, 10); 339 | Main.layoutManager.overviewGroup.add_actor(this.actor); 340 | } 341 | 342 | getRemoveLabel () { 343 | let label; 344 | if (OVERLAY_MANAGER.openedFolder == null) { 345 | label = '…'; 346 | } else { 347 | let folder_schema = Extension.folderSchema (OVERLAY_MANAGER.openedFolder); 348 | label = folder_schema.get_string('name'); 349 | } 350 | return (_("Remove from %s")).replace('%s', label); 351 | } 352 | 353 | setActive (active) { 354 | super.setActive(active); 355 | if (this.id == 'remove') { 356 | this.label.text = this.getRemoveLabel(); 357 | } 358 | } 359 | 360 | handleDragOver (source, actor, x, y, time) { 361 | if (source instanceof AppDisplay.AppIcon && this._active) { 362 | return DND.DragMotionResult.MOVE_DROP; 363 | } 364 | Main.overview.endItemDrag(this); 365 | return DND.DragMotionResult.NO_DROP; 366 | } 367 | 368 | acceptDrop (source, actor, x, y, time) { 369 | if ((source instanceof AppDisplay.AppIcon) && (this.id == 'create')) { 370 | Extension.createNewFolder(source); 371 | Main.overview.endItemDrag(this); 372 | return true; 373 | } 374 | if ((source instanceof AppDisplay.AppIcon) && (this.id == 'remove')) { 375 | this.removeApp(source); 376 | Main.overview.endItemDrag(this); 377 | return true; 378 | } 379 | Main.overview.endItemDrag(this); 380 | return false; 381 | } 382 | 383 | removeApp (source) { 384 | let id = source.app.get_id(); 385 | Extension.removeFromFolder(id, OVERLAY_MANAGER.openedFolder); 386 | OVERLAY_MANAGER.updateState(false); 387 | Main.overview.viewSelector.appDisplay._views[1].view._redisplay(); 388 | } 389 | 390 | destroy () { 391 | this.label.destroy(); 392 | super.destroy(); 393 | } 394 | }; 395 | 396 | /* Overlay reacting to hover, but isn't droppable. The goal is to go to an other 397 | * page of the grid while dragging an app. 398 | */ 399 | class NavigationArea extends DroppableArea { 400 | constructor (id) { 401 | super(id); 402 | 403 | let x, y, i; 404 | switch (this.id) { 405 | case 'up': 406 | i = 'pan-up-symbolic'; 407 | this.styleClass = 'shadowedAreaTop'; 408 | break; 409 | case 'down': 410 | i = 'pan-down-symbolic'; 411 | this.styleClass = 'shadowedAreaBottom'; 412 | break; 413 | default: 414 | i = 'dialog-error-symbolic'; 415 | break; 416 | } 417 | if (this.use_frame) { 418 | this.styleClass = 'framedArea'; 419 | } 420 | this.actor.style_class = this.styleClass; 421 | 422 | this.actor.add(new St.Icon({ 423 | icon_name: i, 424 | icon_size: 24, 425 | style_class: 'system-status-icon', 426 | x_expand: true, 427 | y_expand: true, 428 | x_align: Clutter.ActorAlign.CENTER, 429 | y_align: Clutter.ActorAlign.CENTER, 430 | })); 431 | 432 | this.setPosition(x, y); 433 | Main.layoutManager.overviewGroup.add_actor(this.actor); 434 | } 435 | 436 | handleDragOver (source, actor, x, y, time) { 437 | if (this.id == 'up' && this._active) { 438 | this.pageUp(); 439 | return DND.DragMotionResult.CONTINUE; 440 | } 441 | 442 | if (this.id == 'down' && this._active) { 443 | this.pageDown(); 444 | return DND.DragMotionResult.CONTINUE; 445 | } 446 | 447 | Main.overview.endItemDrag(this); 448 | return DND.DragMotionResult.NO_DROP; 449 | } 450 | 451 | pageUp () { 452 | if(this.lock && !this.timeoutSet) { 453 | this._timeoutId = Mainloop.timeout_add(CHANGE_PAGE_TIMEOUT, this.unlock.bind(this)); 454 | this.timeoutSet = true; 455 | } 456 | if(!this.lock) { 457 | let currentPage = Main.overview.viewSelector.appDisplay._views[1].view._grid.currentPage; 458 | this.lock = true; 459 | OVERLAY_MANAGER.goToPage(currentPage - 1); 460 | } 461 | } 462 | 463 | pageDown () { 464 | if(this.lock && !this.timeoutSet) { 465 | this._timeoutId = Mainloop.timeout_add(CHANGE_PAGE_TIMEOUT, this.unlock.bind(this)); 466 | this.timeoutSet = true; 467 | } 468 | if(!this.lock) { 469 | let currentPage = Main.overview.viewSelector.appDisplay._views[1].view._grid.currentPage; 470 | this.lock = true; 471 | OVERLAY_MANAGER.goToPage(currentPage + 1); 472 | } 473 | } 474 | 475 | acceptDrop (source, actor, x, y, time) { 476 | Main.overview.endItemDrag(this); 477 | return false; 478 | } 479 | 480 | unlock () { 481 | this.lock = false; 482 | this.timeoutSet = false; 483 | Mainloop.source_remove(this._timeoutId); 484 | } 485 | }; 486 | 487 | /* This overlay is the area upon a folder. Position and visibility of the actor 488 | * is handled by exterior functions. 489 | * "this.id" is the folder's id, a string, as written in the gsettings key. 490 | * Dropping an app on this folder will add it to the folder 491 | */ 492 | class FolderArea extends DroppableArea { 493 | constructor (id, asked_x, asked_y, page) { 494 | super(id); 495 | this.page = page; 496 | 497 | let grid = Main.overview.viewSelector.appDisplay._views[1].view._grid; 498 | this.actor.width = grid._getHItemSize(); 499 | this.actor.height = grid._getVItemSize(); 500 | 501 | if (this.use_frame) { 502 | this.styleClass = 'framedArea'; 503 | this.actor.add(new St.Label({ 504 | text: this.id, 505 | x_expand: true, 506 | y_expand: true, 507 | x_align: Clutter.ActorAlign.CENTER, 508 | y_align: Clutter.ActorAlign.CENTER, 509 | })); 510 | } else { 511 | this.styleClass = 'folderArea'; 512 | this.actor.add(new St.Icon({ 513 | icon_name: 'list-add-symbolic', 514 | icon_size: 24, 515 | style_class: 'system-status-icon', 516 | x_expand: true, 517 | y_expand: true, 518 | x_align: Clutter.ActorAlign.CENTER, 519 | y_align: Clutter.ActorAlign.CENTER, 520 | })); 521 | } 522 | if (this.use_frame) { 523 | this.styleClass = 'framedArea'; 524 | } 525 | this.actor.style_class = this.styleClass; 526 | 527 | this.setPosition(asked_x, asked_y); 528 | Main.layoutManager.overviewGroup.add_actor(this.actor); 529 | } 530 | 531 | handleDragOver (source, actor, x, y, time) { 532 | if (source instanceof AppDisplay.AppIcon) { 533 | return DND.DragMotionResult.MOVE_DROP; 534 | } 535 | Main.overview.endItemDrag(this); 536 | return DND.DragMotionResult.NO_DROP; 537 | } 538 | 539 | acceptDrop (source, actor, x, y, time) { //FIXME recharger la vue ou au minimum les miniatures des dossiers 540 | if ((source instanceof AppDisplay.AppIcon) && 541 | !Extension.isInFolder(source.id, this.id)) { 542 | Extension.addToFolder(source, this.id); 543 | Main.overview.endItemDrag(this); 544 | return true; 545 | } 546 | Main.overview.endItemDrag(this); 547 | return false; 548 | } 549 | }; 550 | 551 | //------------------------------------------------------------------------------ 552 | 553 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/extension.js: -------------------------------------------------------------------------------- 1 | // extension.js 2 | // GPLv3 3 | 4 | const Clutter = imports.gi.Clutter; 5 | const Gio = imports.gi.Gio; 6 | const St = imports.gi.St; 7 | const Main = imports.ui.main; 8 | const AppDisplay = imports.ui.appDisplay; 9 | const PopupMenu = imports.ui.popupMenu; 10 | const Meta = imports.gi.Meta; 11 | const Mainloop = imports.mainloop; 12 | 13 | const ExtensionUtils = imports.misc.extensionUtils; 14 | const Me = ExtensionUtils.getCurrentExtension(); 15 | const Convenience = Me.imports.convenience; 16 | 17 | const AppfolderDialog = Me.imports.appfolderDialog; 18 | const DragAndDrop = Me.imports.dragAndDrop; 19 | 20 | const Gettext = imports.gettext.domain('appfolders-manager'); 21 | const _ = Gettext.gettext; 22 | 23 | let FOLDER_SCHEMA; 24 | let FOLDER_LIST; 25 | let INIT_TIME; 26 | var SETTINGS = null; 27 | var DEBUG = false; 28 | 29 | function init () { 30 | Convenience.initTranslations(); 31 | INIT_TIME = getTimeStamp(); 32 | } 33 | 34 | function getTimeStamp () { 35 | let today = new Date(); 36 | let str = today.getDate() + '' + today.getHours() + '' + today.getMinutes() 37 | + '' + today.getSeconds(); 38 | return parseInt(str); 39 | } 40 | 41 | //------------------------------------------------------------------------------ 42 | /* do not edit this section */ 43 | 44 | function injectToFunction(parent, name, func) { 45 | let origin = parent[name]; 46 | parent[name] = function() { 47 | let ret; 48 | ret = origin.apply(this, arguments); 49 | if (ret === undefined) 50 | ret = func.apply(this, arguments); 51 | return ret; 52 | } 53 | return origin; 54 | } 55 | 56 | function removeInjection(object, injection, name) { 57 | if (injection[name] === undefined) 58 | delete object[name]; 59 | else 60 | object[name] = injection[name]; 61 | } 62 | 63 | var injections=[]; 64 | 65 | //------------------------------------------------------------------------------ 66 | 67 | /* this function injects items (1 or 2 submenus) in AppIconMenu's _redisplay method. */ 68 | function injectionInAppsMenus() { 69 | injections['_redisplay'] = injectToFunction(AppDisplay.AppIconMenu.prototype, '_redisplay', function() { 70 | let activePage = Main.overview.viewSelector.getActivePage(); 71 | if (activePage == 2 || activePage == 3) { 72 | // ok 73 | } else { 74 | // page 1 is the windows overview, so appicons here are in the dash, 75 | // where menu items are not welcome 76 | return; 77 | } 78 | 79 | this._appendSeparator(); // TODO injecter ailleurs dans le menu? 80 | 81 | let mainAppView = Main.overview.viewSelector.appDisplay._views[1].view; 82 | FOLDER_LIST = FOLDER_SCHEMA.get_strv('folder-children'); 83 | 84 | //---------------------------------------------------------------------- 85 | 86 | let addto = new PopupMenu.PopupSubMenuMenuItem(_("Add to")); 87 | 88 | let newAppFolder = new PopupMenu.PopupMenuItem('+ ' + _("New AppFolder")); 89 | newAppFolder.connect('activate', () => { 90 | this._source._menuManager._grabHelper.ungrab({ actor: this.actor }); 91 | // XXX broken scrolling ?? 92 | // We can't popdown the folder immediately because the 93 | // AppDisplay.AppFolderPopup.popdown() method tries to ungrab 94 | // the global focus from the folder's popup actor, which isn't 95 | // having the focus since the menu is still open. Menus' animation 96 | // lasts ~0.25s so we will wait 0.30s before doing anything. 97 | let a = Mainloop.timeout_add(300, () => { 98 | if (mainAppView._currentPopup) { 99 | mainAppView._currentPopup.popdown(); 100 | } 101 | createNewFolder(this._source); 102 | mainAppView._redisplay(); 103 | Mainloop.source_remove(a); 104 | }); 105 | }); 106 | addto.menu.addMenuItem(newAppFolder); 107 | 108 | for (var i = 0 ; i < FOLDER_LIST.length ; i++) { 109 | let _folder = FOLDER_LIST[i]; 110 | let shouldShow = !isInFolder( this._source.app.get_id(), _folder ); 111 | let iFolderSchema = folderSchema(_folder); 112 | let item = new PopupMenu.PopupMenuItem( AppDisplay._getFolderName(iFolderSchema) ); 113 | if (DEBUG) { 114 | shouldShow = true; //TODO ??? et l'exclusion ? 115 | } 116 | if(shouldShow) { 117 | item.connect('activate', () => { 118 | this._source._menuManager._grabHelper.ungrab({ actor: this.actor }); 119 | // XXX broken scrolling ?? 120 | // We can't popdown the folder immediatly because the 121 | // AppDisplay.AppFolderPopup.popdown() method tries to 122 | // ungrab the global focus from the folder's popup actor, 123 | // which isn't having the focus since the menu is still 124 | // open. Menus' animation lasts ~0.25s so we will wait 0.30s 125 | // before doing anything. 126 | let a = Mainloop.timeout_add(300, () => { 127 | if (mainAppView._currentPopup) { 128 | mainAppView._currentPopup.popdown(); 129 | } 130 | addToFolder(this._source, _folder); 131 | mainAppView._redisplay(); 132 | Mainloop.source_remove(a); 133 | }); 134 | }); 135 | addto.menu.addMenuItem(item); 136 | } 137 | } 138 | this.addMenuItem(addto); 139 | 140 | //---------------------------------------------------------------------- 141 | 142 | let removeFrom = new PopupMenu.PopupSubMenuMenuItem(_("Remove from")); 143 | let shouldShow2 = false; 144 | for (var i = 0 ; i < FOLDER_LIST.length ; i++) { 145 | let _folder = FOLDER_LIST[i]; 146 | let appId = this._source.app.get_id(); 147 | let shouldShow = isInFolder(appId, _folder); 148 | let iFolderSchema = folderSchema(_folder); 149 | let item = new PopupMenu.PopupMenuItem( AppDisplay._getFolderName(iFolderSchema) ); 150 | 151 | if (DEBUG) { 152 | shouldShow = true; //FIXME ??? et l'exclusion ? 153 | } 154 | 155 | if(shouldShow) { 156 | item.connect('activate', () => { 157 | this._source._menuManager._grabHelper.ungrab({ actor: this.actor }); 158 | // XXX broken scrolling ?? 159 | // We can't popdown the folder immediatly because the 160 | // AppDisplay.AppFolderPopup.popdown() method tries to 161 | // ungrab the global focus from the folder's popup actor, 162 | // which isn't having the focus since the menu is still 163 | // open. Menus' animation last ~0.25s so we will wait 0.30s 164 | // before doing anything. 165 | let a = Mainloop.timeout_add(300, () => { 166 | if (mainAppView._currentPopup) { 167 | mainAppView._currentPopup.popdown(); 168 | } 169 | removeFromFolder(appId, _folder); 170 | mainAppView._redisplay(); 171 | Mainloop.source_remove(a); 172 | }); 173 | }); 174 | removeFrom.menu.addMenuItem(item); 175 | shouldShow2 = true; 176 | } 177 | } 178 | if (shouldShow2) { 179 | this.addMenuItem(removeFrom); 180 | } 181 | }); 182 | } 183 | 184 | //------------------------------------------------------------------------------ 185 | 186 | function injectionInIcons() { 187 | // Right-click on a FolderIcon launches a new AppfolderDialog 188 | AppDisplay.FolderIcon = class extends AppDisplay.FolderIcon { 189 | constructor (id, path, parentView) { 190 | super(id, path, parentView); 191 | if (!this._isCustom) { 192 | this.actor.connect('button-press-event', this._onButtonPress.bind(this)); 193 | } 194 | this._isCustom = true; 195 | } 196 | 197 | _onButtonPress (actor, event) { 198 | let button = event.get_button(); 199 | if (button == 3) { 200 | let tmp = new Gio.Settings({ 201 | schema_id: 'org.gnome.desktop.app-folders.folder', 202 | path: '/org/gnome/desktop/app-folders/folders/' + this.id + '/' 203 | }); 204 | let dialog = new AppfolderDialog.AppfolderDialog(tmp, null, this.id); 205 | dialog.open(); 206 | } 207 | return Clutter.EVENT_PROPAGATE; 208 | } 209 | }; 210 | 211 | // Dragging an AppIcon triggers the DND mode 212 | AppDisplay.AppIcon = class extends AppDisplay.AppIcon { 213 | constructor (app, params) { 214 | super(app, params); 215 | if (!this._isCustom) { 216 | this._draggable.connect('drag-begin', this.onDragBeginExt.bind(this)); 217 | this._draggable.connect('drag-cancelled', this.onDragCancelledExt.bind(this)); 218 | this._draggable.connect('drag-end', this.onDragEndExt.bind(this)); 219 | } 220 | this._isCustom = true; 221 | } 222 | 223 | onDragBeginExt () { 224 | if (Main.overview.viewSelector.getActivePage() != 2) { 225 | return; 226 | } 227 | this._removeMenuTimeout(); // why ? 228 | Main.overview.beginItemDrag(this); 229 | DragAndDrop.OVERLAY_MANAGER.on_drag_begin(); 230 | } 231 | 232 | onDragEndExt () { 233 | Main.overview.endItemDrag(this); 234 | DragAndDrop.OVERLAY_MANAGER.on_drag_end(); 235 | } 236 | 237 | onDragCancelledExt () { 238 | Main.overview.cancelledItemDrag(this); 239 | DragAndDrop.OVERLAY_MANAGER.on_drag_cancelled(); 240 | } 241 | }; 242 | } 243 | 244 | //------------------------------------------------------------------------------ 245 | //---------------------------------- Generic ----------------------------------- 246 | //--------------------------------- functions ---------------------------------- 247 | //------------------------------------------------------------------------------ 248 | /* These functions perform the requested actions but do not care about poping 249 | * down opened menu or opened folder, nor about hiding/showing/activating 250 | * dropping areas, nor about redisplaying the view. 251 | */ 252 | function removeFromFolder (app_id, folder_id) { 253 | let folder_schema = folderSchema(folder_id); 254 | if ( isInFolder(app_id, folder_id) ) { 255 | let pastContent = folder_schema.get_strv('apps'); 256 | let presentContent = []; 257 | for(var i=0; i { 276 | let tmp = []; 277 | FOLDER_LIST = FOLDER_SCHEMA.get_strv('folder-children'); 278 | for(var j=0;j < FOLDER_LIST.length;j++){ 279 | if(FOLDER_LIST[j] != folder_id) { 280 | tmp.push(FOLDER_LIST[j]); 281 | } 282 | } 283 | 284 | FOLDER_LIST = tmp; 285 | FOLDER_SCHEMA.set_strv('folder-children', FOLDER_LIST); 286 | 287 | // ?? XXX (ne fonctionne pas mieux hors du meta.later_add) 288 | if (SETTINGS.get_boolean('total-deletion')) { 289 | let folder_schema = folderSchema (folder_id); 290 | folder_schema.reset('apps'); // génère un bug volumineux ? 291 | folder_schema.reset('categories'); // génère un bug volumineux ? 292 | folder_schema.reset('excluded-apps'); // génère un bug volumineux ? 293 | folder_schema.reset('name'); // génère un bug volumineux ? 294 | } 295 | }); 296 | 297 | return true; 298 | } 299 | 300 | //------------------------------------------------------------------------------ 301 | 302 | function mergeFolders (folder_staying_id, folder_dying_id) { 303 | // this method is not used XXX 304 | 305 | let folder_dying_schema = folderSchema (folder_dying_id); 306 | let folder_staying_schema = folderSchema (folder_staying_id); 307 | let newerContent = folder_dying_schema.get_strv('categories'); 308 | let presentContent = folder_staying_schema.get_strv('categories'); 309 | for (var i=0; i 105) { 433 | Main.overview.viewSelector.appDisplay._views[1].view._redisplay(); 434 | } 435 | // FIXME FIXME FIXME it works like shit, when it works 436 | } 437 | 438 | function disable () { 439 | AppDisplay.FolderIcon.prototype._onButtonPress = null; 440 | AppDisplay.FolderIcon.prototype.popupMenu = null; 441 | 442 | removeInjection(AppDisplay.AppIconMenu.prototype, injections, '_redisplay'); 443 | 444 | // Overwrite the shit i did in FolderIcon 445 | AppDisplay.FolderIcon = class extends AppDisplay.FolderIcon { 446 | _onButtonPress (actor, event) { 447 | return Clutter.EVENT_PROPAGATE; 448 | } 449 | }; 450 | 451 | // Overwrite the shit i did in AppIcon 452 | AppDisplay.AppIcon = class extends AppDisplay.AppIcon { 453 | onDragBeginExt () {} 454 | onDragEndExt () {} 455 | onDragCancelledExt () {} 456 | }; 457 | 458 | DragAndDrop.OVERLAY_MANAGER.destroy(); 459 | } 460 | 461 | //------------------------------------------------------------------------------ 462 | 463 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/appfolders-manager.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: appfolders-manager@maestroschan.fr/extension.js:83 21 | msgid "Add to" 22 | msgstr "" 23 | 24 | #: appfolders-manager@maestroschan.fr/extension.js:85 25 | msgid "New AppFolder" 26 | msgstr "" 27 | 28 | #: appfolders-manager@maestroschan.fr/extension.js:139 29 | msgid "Remove from" 30 | msgstr "" 31 | 32 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 33 | msgid "Create a new folder" 34 | msgstr "" 35 | 36 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 37 | #, javascript-format 38 | msgid "Remove from %s" 39 | msgstr "" 40 | 41 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 42 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 43 | msgid "Cancel" 44 | msgstr "" 45 | 46 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 47 | msgid "Create" 48 | msgstr "" 49 | 50 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 51 | msgid "Delete" 52 | msgstr "" 53 | 54 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 55 | msgid "Apply" 56 | msgstr "" 57 | 58 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 59 | msgid "Folder's name:" 60 | msgstr "" 61 | 62 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 63 | msgid "Categories:" 64 | msgstr "" 65 | 66 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 67 | msgid "Other category?" 68 | msgstr "" 69 | 70 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 71 | msgid "No category" 72 | msgstr "" 73 | 74 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 75 | msgid "Select a category…" 76 | msgstr "" 77 | 78 | #: appfolders-manager@maestroschan.fr/prefs.js:31 79 | msgid "Modifications will be effective after reloading the extension." 80 | msgstr "" 81 | 82 | #: appfolders-manager@maestroschan.fr/prefs.js:38 83 | msgid "Main settings" 84 | msgstr "" 85 | 86 | #: appfolders-manager@maestroschan.fr/prefs.js:39 87 | msgid "Categories" 88 | msgstr "" 89 | 90 | #: appfolders-manager@maestroschan.fr/prefs.js:46 91 | msgid "Delete all related settings when an appfolder is deleted" 92 | msgstr "" 93 | 94 | #: appfolders-manager@maestroschan.fr/prefs.js:48 95 | msgid "Use the right-click menus in addition to the drag-and-drop" 96 | msgstr "" 97 | 98 | #: appfolders-manager@maestroschan.fr/prefs.js:56 99 | msgid "Use categories" 100 | msgstr "" 101 | 102 | #: appfolders-manager@maestroschan.fr/prefs.js:59 103 | msgid "More informations about \"additional categories\"" 104 | msgstr "" 105 | 106 | #: appfolders-manager@maestroschan.fr/prefs.js:74 107 | msgid "Report bugs or ideas" 108 | msgstr "" 109 | 110 | #: appfolders-manager@maestroschan.fr/prefs.js:85 111 | msgid "" 112 | "This extension can be deactivated once your applications are organized as " 113 | "wished." 114 | msgstr "" 115 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/be/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/be/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/be/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2018-12-30 14:03+0300\n" 12 | "Last-Translator: Максім Крапіўка \n" 13 | "Language-Team: \n" 14 | "Language: be\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 2.2\n" 19 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 20 | "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" 21 | 22 | #: appfolders-manager@maestroschan.fr/extension.js:83 23 | msgid "Add to" 24 | msgstr "Дадаць у" 25 | 26 | #: appfolders-manager@maestroschan.fr/extension.js:85 27 | msgid "New AppFolder" 28 | msgstr "Новая папка праграм" 29 | 30 | #: appfolders-manager@maestroschan.fr/extension.js:139 31 | msgid "Remove from" 32 | msgstr "Выдаліць з" 33 | 34 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 35 | msgid "Create a new folder" 36 | msgstr "Стварыць новую папку" 37 | 38 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 39 | #, javascript-format 40 | msgid "Remove from %s" 41 | msgstr "Выдаліць з %s" 42 | 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 45 | msgid "Cancel" 46 | msgstr "Скасаваць" 47 | 48 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 49 | msgid "Create" 50 | msgstr "" 51 | 52 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 53 | msgid "Delete" 54 | msgstr "Выдаліць" 55 | 56 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 57 | msgid "Apply" 58 | msgstr "Дастасаваць" 59 | 60 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 61 | msgid "Folder's name:" 62 | msgstr "Назва папкі" 63 | 64 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 65 | msgid "Categories:" 66 | msgstr "Катэгорыі:" 67 | 68 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 69 | msgid "Other category?" 70 | msgstr "Іншая катэгорыя?" 71 | 72 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 73 | msgid "No category" 74 | msgstr "Без катэгорыі" 75 | 76 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 77 | msgid "Select a category…" 78 | msgstr "Выбраць катэгорыю..." 79 | 80 | #: appfolders-manager@maestroschan.fr/prefs.js:31 81 | msgid "Modifications will be effective after reloading the extension." 82 | msgstr "Змены ўступяць у сілу пасля перазагрузкі пашырэння." 83 | 84 | #: appfolders-manager@maestroschan.fr/prefs.js:38 85 | msgid "Main settings" 86 | msgstr "Галоўныя налады" 87 | 88 | #: appfolders-manager@maestroschan.fr/prefs.js:39 89 | msgid "Categories" 90 | msgstr "Катэгорыі" 91 | 92 | #: appfolders-manager@maestroschan.fr/prefs.js:46 93 | msgid "Delete all related settings when an appfolder is deleted" 94 | msgstr "Выдаляць усе звязаныя налады пры выдаленні папкі праграм" 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:48 97 | msgid "Use the right-click menus in addition to the drag-and-drop" 98 | msgstr "" 99 | "Выкарыстоўваць націсканне правай кнопкай мышы ў дадатак да перацягвання " 100 | "значкоў" 101 | 102 | #: appfolders-manager@maestroschan.fr/prefs.js:56 103 | msgid "Use categories" 104 | msgstr "Выкарыстоўваць катэгорыі" 105 | 106 | #: appfolders-manager@maestroschan.fr/prefs.js:59 107 | msgid "More informations about \"additional categories\"" 108 | msgstr "Больш інфармацыі пра «дадатковыя» катэгорыі" 109 | 110 | #: appfolders-manager@maestroschan.fr/prefs.js:74 111 | msgid "Report bugs or ideas" 112 | msgstr "Паведаміць пра памылкі або ідэі" 113 | 114 | #: appfolders-manager@maestroschan.fr/prefs.js:85 115 | msgid "" 116 | "This extension can be deactivated once your applications are organized as " 117 | "wished." 118 | msgstr "" 119 | "Гэта пашырэнне можна адключыць, пасля таго як вы канчаткова наладзіце " 120 | "арганізацыю сваіх праграм." 121 | 122 | #~ msgid "Standard specification" 123 | #~ msgstr "Стандартная спецыфікацыя" 124 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/de/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/de/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/de/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 12 | "PO-Revision-Date: 2019-05-15 11:21+0200\n" 13 | "Last-Translator: Markus Neumeister\n" 14 | "Language-Team: https://github.com/hobbypunk90/appfolders-manager-gnome-" 15 | "extension\n" 16 | "Language: de\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "X-Generator: Poedit 2.0.6\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #: appfolders-manager@maestroschan.fr/extension.js:83 24 | msgid "Add to" 25 | msgstr "Hinzufügen zu" 26 | 27 | #: appfolders-manager@maestroschan.fr/extension.js:85 28 | msgid "New AppFolder" 29 | msgstr "Neuer Ordner" 30 | 31 | #: appfolders-manager@maestroschan.fr/extension.js:139 32 | msgid "Remove from" 33 | msgstr "Löschen aus" 34 | 35 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 36 | msgid "Create a new folder" 37 | msgstr "Neuen Ordner erstellen" 38 | 39 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 40 | #, javascript-format 41 | msgid "Remove from %s" 42 | msgstr "Löschen aus %s" 43 | 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 45 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 46 | msgid "Cancel" 47 | msgstr "Abbrechen" 48 | 49 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 50 | msgid "Create" 51 | msgstr "Erstellen" 52 | 53 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 54 | msgid "Delete" 55 | msgstr "Löschen" 56 | 57 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 58 | msgid "Apply" 59 | msgstr "Anwenden" 60 | 61 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 62 | msgid "Folder's name:" 63 | msgstr "Ordner Name:" 64 | 65 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 66 | msgid "Categories:" 67 | msgstr "Kategorien:" 68 | 69 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 70 | msgid "Other category?" 71 | msgstr "Neue Kategorie?" 72 | 73 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 74 | msgid "No category" 75 | msgstr "Keine Kategorie" 76 | 77 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 78 | msgid "Select a category…" 79 | msgstr "Kategorie auswählen..." 80 | 81 | #: appfolders-manager@maestroschan.fr/prefs.js:31 82 | msgid "Modifications will be effective after reloading the extension." 83 | msgstr "Änderungen werden nach Neustart der Erweiterung übernommen." 84 | 85 | #: appfolders-manager@maestroschan.fr/prefs.js:38 86 | msgid "Main settings" 87 | msgstr "Einstellungen" 88 | 89 | #: appfolders-manager@maestroschan.fr/prefs.js:39 90 | msgid "Categories" 91 | msgstr "Kategorien" 92 | 93 | #: appfolders-manager@maestroschan.fr/prefs.js:46 94 | msgid "Delete all related settings when an appfolder is deleted" 95 | msgstr "Lösche alle Einstellungen, wenn ein Ordner gelöscht wird" 96 | 97 | #: appfolders-manager@maestroschan.fr/prefs.js:48 98 | msgid "Use the right-click menus in addition to the drag-and-drop" 99 | msgstr "Rechtsklick-Menü zusätzlich zu Drag-und-Drop benutzen" 100 | 101 | #: appfolders-manager@maestroschan.fr/prefs.js:56 102 | msgid "Use categories" 103 | msgstr "Kategorien benutzen" 104 | 105 | #: appfolders-manager@maestroschan.fr/prefs.js:59 106 | msgid "More informations about \"additional categories\"" 107 | msgstr "Mehr Informationen über \"Zusätzliche Kategorien\"" 108 | 109 | #: appfolders-manager@maestroschan.fr/prefs.js:74 110 | msgid "Report bugs or ideas" 111 | msgstr "Bugs oder Ideen übermittlen" 112 | 113 | #: appfolders-manager@maestroschan.fr/prefs.js:85 114 | msgid "" 115 | "This extension can be deactivated once your applications are organized as " 116 | "wished." 117 | msgstr "" 118 | "Diese Erweiterung kann deaktiviert werden, sobald die Anwendungen wie " 119 | "gewünscht organisiert wurden." 120 | 121 | #~ msgid "This appfolder already exists." 122 | #~ msgstr "Dieser Ordner existiert bereits." 123 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/el/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/el/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/el/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 12 | "PO-Revision-Date: 2017-05-29 23:26+0300\n" 13 | "Last-Translator: \n" 14 | "Language-Team: \n" 15 | "Language: el\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "X-Generator: Poedit 2.0.1\n" 20 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 21 | 22 | #: appfolders-manager@maestroschan.fr/extension.js:83 23 | msgid "Add to" 24 | msgstr "Προσθήκη σε" 25 | 26 | #: appfolders-manager@maestroschan.fr/extension.js:85 27 | msgid "New AppFolder" 28 | msgstr "Νέος φάκελος" 29 | 30 | #: appfolders-manager@maestroschan.fr/extension.js:139 31 | msgid "Remove from" 32 | msgstr "Αφαίρεση από" 33 | 34 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 35 | msgid "Create a new folder" 36 | msgstr "" 37 | 38 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 39 | #, fuzzy, javascript-format 40 | msgid "Remove from %s" 41 | msgstr "Αφαίρεση από" 42 | 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 45 | msgid "Cancel" 46 | msgstr "Αναίρεση" 47 | 48 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 49 | msgid "Create" 50 | msgstr "" 51 | 52 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 53 | msgid "Delete" 54 | msgstr "Διαγραφή" 55 | 56 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 57 | msgid "Apply" 58 | msgstr "" 59 | 60 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 61 | msgid "Folder's name:" 62 | msgstr "" 63 | 64 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 65 | msgid "Categories:" 66 | msgstr "" 67 | 68 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 69 | msgid "Other category?" 70 | msgstr "" 71 | 72 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 73 | msgid "No category" 74 | msgstr "" 75 | 76 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 77 | msgid "Select a category…" 78 | msgstr "" 79 | 80 | #: appfolders-manager@maestroschan.fr/prefs.js:31 81 | msgid "Modifications will be effective after reloading the extension." 82 | msgstr "" 83 | "Οι τροποποιήσεις απαιτούν την επανεκκίνηση της επέκτασης για να " 84 | "λειτουργήσουν." 85 | 86 | #: appfolders-manager@maestroschan.fr/prefs.js:38 87 | msgid "Main settings" 88 | msgstr "" 89 | 90 | #: appfolders-manager@maestroschan.fr/prefs.js:39 91 | msgid "Categories" 92 | msgstr "" 93 | 94 | #: appfolders-manager@maestroschan.fr/prefs.js:46 95 | msgid "Delete all related settings when an appfolder is deleted" 96 | msgstr "Διαγραφή όλων των σχετικών ρυθμίσεων κατά την διαγραφή ενός φακέλου" 97 | 98 | #: appfolders-manager@maestroschan.fr/prefs.js:48 99 | msgid "Use the right-click menus in addition to the drag-and-drop" 100 | msgstr "" 101 | 102 | #: appfolders-manager@maestroschan.fr/prefs.js:56 103 | msgid "Use categories" 104 | msgstr "" 105 | 106 | #: appfolders-manager@maestroschan.fr/prefs.js:59 107 | msgid "More informations about \"additional categories\"" 108 | msgstr "" 109 | 110 | #: appfolders-manager@maestroschan.fr/prefs.js:74 111 | msgid "Report bugs or ideas" 112 | msgstr "" 113 | 114 | #: appfolders-manager@maestroschan.fr/prefs.js:85 115 | msgid "" 116 | "This extension can be deactivated once your applications are organized as " 117 | "wished." 118 | msgstr "" 119 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/fr/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/fr/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/fr/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: \n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 6 | "PO-Revision-Date: 2017-02-05 16:47+0100\n" 7 | "Last-Translator: \n" 8 | "Language-Team: \n" 9 | "Language: fr\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Generator: Poedit 1.8.11\n" 14 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 15 | 16 | #: appfolders-manager@maestroschan.fr/extension.js:83 17 | msgid "Add to" 18 | msgstr "Ajouter à" 19 | 20 | #: appfolders-manager@maestroschan.fr/extension.js:85 21 | msgid "New AppFolder" 22 | msgstr "Nouvel AppFolder" 23 | 24 | #: appfolders-manager@maestroschan.fr/extension.js:139 25 | msgid "Remove from" 26 | msgstr "Retirer de" 27 | 28 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 29 | msgid "Create a new folder" 30 | msgstr "Créer un nouveau dossier" 31 | 32 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 33 | #, javascript-format 34 | msgid "Remove from %s" 35 | msgstr "Retirer de %s" 36 | 37 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 38 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 39 | msgid "Cancel" 40 | msgstr "Annuler" 41 | 42 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 43 | msgid "Create" 44 | msgstr "Créer" 45 | 46 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 47 | msgid "Delete" 48 | msgstr "Supprimer" 49 | 50 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 51 | msgid "Apply" 52 | msgstr "Appliquer" 53 | 54 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 55 | msgid "Folder's name:" 56 | msgstr "Nom du dossier :" 57 | 58 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 59 | msgid "Categories:" 60 | msgstr "Catégories :" 61 | 62 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 63 | msgid "Other category?" 64 | msgstr "Autre catégorie ?" 65 | 66 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 67 | msgid "No category" 68 | msgstr "Aucune catégorie" 69 | 70 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 71 | msgid "Select a category…" 72 | msgstr "Choisir une catégorie…" 73 | 74 | #: appfolders-manager@maestroschan.fr/prefs.js:31 75 | msgid "Modifications will be effective after reloading the extension." 76 | msgstr "Les modifications prendront effet après avoir rechargé l'extension" 77 | 78 | #: appfolders-manager@maestroschan.fr/prefs.js:38 79 | msgid "Main settings" 80 | msgstr "Réglages principaux" 81 | 82 | #: appfolders-manager@maestroschan.fr/prefs.js:39 83 | msgid "Categories" 84 | msgstr "Catégories" 85 | 86 | #: appfolders-manager@maestroschan.fr/prefs.js:46 87 | msgid "Delete all related settings when an appfolder is deleted" 88 | msgstr "" 89 | "Supprimer tous les réglages relatifs à un appfolder lors de sa suppression" 90 | 91 | #: appfolders-manager@maestroschan.fr/prefs.js:48 92 | msgid "Use the right-click menus in addition to the drag-and-drop" 93 | msgstr "Utiliser le menu du clic-droit en complément du glisser-déposer" 94 | 95 | #: appfolders-manager@maestroschan.fr/prefs.js:56 96 | msgid "Use categories" 97 | msgstr "Utiliser des catégories" 98 | 99 | #: appfolders-manager@maestroschan.fr/prefs.js:59 100 | msgid "More informations about \"additional categories\"" 101 | msgstr "Plus d'informations à propos des \"catégories supplémentaires\"" 102 | 103 | #: appfolders-manager@maestroschan.fr/prefs.js:74 104 | msgid "Report bugs or ideas" 105 | msgstr "Reporter un bug ou une idée" 106 | 107 | #: appfolders-manager@maestroschan.fr/prefs.js:85 108 | msgid "" 109 | "This extension can be deactivated once your applications are organized as " 110 | "wished." 111 | msgstr "" 112 | "Cette extension peut être désactivée une fois que vos applications sont " 113 | "organisées comme souhaité." 114 | 115 | #~ msgid "Standard specification" 116 | #~ msgstr "Spécification standard" 117 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/hr/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/hr/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/hr/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # Croatian translation of appfolders-manager. 2 | # Copyright (C) 2018-2020 Romain F. T. 3 | # This file is distributed under the same license as the appfolders-manager package. 4 | # Milo Ivir , 2020. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: appfolders-manager\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2020-01-24 21:58+0100\n" 11 | "PO-Revision-Date: 2020-01-25 01:39+0100\n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "X-Generator: Poedit 1.8.12\n" 17 | "Last-Translator: Milo Ivir \n" 18 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 19 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 20 | "Language: hr\n" 21 | 22 | #: appfolders-manager@maestroschan.fr/extension.js:83 23 | msgid "Add to" 24 | msgstr "Dodaj u" 25 | 26 | #: appfolders-manager@maestroschan.fr/extension.js:85 27 | msgid "New AppFolder" 28 | msgstr "Nova mapa programa" 29 | 30 | #: appfolders-manager@maestroschan.fr/extension.js:139 31 | msgid "Remove from" 32 | msgstr "Ukloni iz" 33 | 34 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 35 | msgid "Create a new folder" 36 | msgstr "Stvori novu mapu" 37 | 38 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 39 | #, javascript-format 40 | msgid "Remove from %s" 41 | msgstr "Ukloni iz %s" 42 | 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 45 | msgid "Cancel" 46 | msgstr "Odustani" 47 | 48 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 49 | msgid "Create" 50 | msgstr "Stvori" 51 | 52 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 53 | msgid "Delete" 54 | msgstr "Izbriši" 55 | 56 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 57 | msgid "Apply" 58 | msgstr "Primijeni" 59 | 60 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 61 | msgid "Folder's name:" 62 | msgstr "Ime mape:" 63 | 64 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 65 | msgid "Categories:" 66 | msgstr "Kategorije:" 67 | 68 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 69 | msgid "Other category?" 70 | msgstr "Druga kategorija?" 71 | 72 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 73 | msgid "No category" 74 | msgstr "Nijedna kategorija" 75 | 76 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 77 | msgid "Select a category…" 78 | msgstr "Odaberi kategoriju …" 79 | 80 | #: appfolders-manager@maestroschan.fr/prefs.js:31 81 | msgid "Modifications will be effective after reloading the extension." 82 | msgstr "Promjene će se primijeniti nakon ponovnog pokretanja proširenja." 83 | 84 | #: appfolders-manager@maestroschan.fr/prefs.js:38 85 | msgid "Main settings" 86 | msgstr "Glavne postavke" 87 | 88 | #: appfolders-manager@maestroschan.fr/prefs.js:39 89 | msgid "Categories" 90 | msgstr "Kategorije" 91 | 92 | #: appfolders-manager@maestroschan.fr/prefs.js:46 93 | msgid "Delete all related settings when an appfolder is deleted" 94 | msgstr "Izbriši sve povezane postavke kad se briše mapa programa" 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:48 97 | msgid "Use the right-click menus in addition to the drag-and-drop" 98 | msgstr "" 99 | "Koristi funkciju desnog klika za izbornike dodatno uz funkciju povuci-i-" 100 | "ispusti" 101 | 102 | #: appfolders-manager@maestroschan.fr/prefs.js:56 103 | msgid "Use categories" 104 | msgstr "Koristi kategorije" 105 | 106 | #: appfolders-manager@maestroschan.fr/prefs.js:59 107 | msgid "More informations about \"additional categories\"" 108 | msgstr "Daljnje informacije o „dodatnim kategorijama”" 109 | 110 | #: appfolders-manager@maestroschan.fr/prefs.js:74 111 | msgid "Report bugs or ideas" 112 | msgstr "Prijavi greške ili ideje" 113 | 114 | #: appfolders-manager@maestroschan.fr/prefs.js:85 115 | msgid "" 116 | "This extension can be deactivated once your applications are organized as " 117 | "wished." 118 | msgstr "" 119 | "Ovo proširenje se može deaktivirati nakon što su programi raspoređeni po " 120 | "želji." 121 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/hu/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/hu/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/hu/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # Hungarian translation for appfolders-manager. 2 | # Copyright (C) 2017 Free Software Foundation, Inc. 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Balázs Úr , 2017. 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: appfolders-manager master\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2017-05-31 20:41+0100\n" 12 | "Last-Translator: Balázs Úr \n" 13 | "Language-Team: Hungarian \n" 14 | "Language: hu\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | "X-Generator: Lokalize 2.0\n" 20 | 21 | #: appfolders-manager@maestroschan.fr/extension.js:83 22 | msgid "Add to" 23 | msgstr "Hozzáadás ehhez" 24 | 25 | #: appfolders-manager@maestroschan.fr/extension.js:85 26 | msgid "New AppFolder" 27 | msgstr "Új alkalmazásmappa" 28 | 29 | #: appfolders-manager@maestroschan.fr/extension.js:139 30 | msgid "Remove from" 31 | msgstr "Eltávolítás innen" 32 | 33 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 34 | msgid "Create a new folder" 35 | msgstr "" 36 | 37 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 38 | #, fuzzy, javascript-format 39 | msgid "Remove from %s" 40 | msgstr "Eltávolítás innen" 41 | 42 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 44 | msgid "Cancel" 45 | msgstr "Mégse" 46 | 47 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 48 | msgid "Create" 49 | msgstr "" 50 | 51 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 52 | msgid "Delete" 53 | msgstr "Törlés" 54 | 55 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 56 | msgid "Apply" 57 | msgstr "" 58 | 59 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 60 | msgid "Folder's name:" 61 | msgstr "" 62 | 63 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 64 | msgid "Categories:" 65 | msgstr "" 66 | 67 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 68 | msgid "Other category?" 69 | msgstr "" 70 | 71 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 72 | msgid "No category" 73 | msgstr "" 74 | 75 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 76 | msgid "Select a category…" 77 | msgstr "" 78 | 79 | #: appfolders-manager@maestroschan.fr/prefs.js:31 80 | msgid "Modifications will be effective after reloading the extension." 81 | msgstr "A módosítások a kiterjesztés újratöltése után lépnek hatályba." 82 | 83 | #: appfolders-manager@maestroschan.fr/prefs.js:38 84 | msgid "Main settings" 85 | msgstr "" 86 | 87 | #: appfolders-manager@maestroschan.fr/prefs.js:39 88 | msgid "Categories" 89 | msgstr "" 90 | 91 | #: appfolders-manager@maestroschan.fr/prefs.js:46 92 | msgid "Delete all related settings when an appfolder is deleted" 93 | msgstr "" 94 | "Az összes kapcsolódó beállítás törlése, ha egy alkalmazásmappa törölve lesz" 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:48 97 | msgid "Use the right-click menus in addition to the drag-and-drop" 98 | msgstr "" 99 | 100 | #: appfolders-manager@maestroschan.fr/prefs.js:56 101 | msgid "Use categories" 102 | msgstr "" 103 | 104 | #: appfolders-manager@maestroschan.fr/prefs.js:59 105 | msgid "More informations about \"additional categories\"" 106 | msgstr "" 107 | 108 | #: appfolders-manager@maestroschan.fr/prefs.js:74 109 | msgid "Report bugs or ideas" 110 | msgstr "" 111 | 112 | #: appfolders-manager@maestroschan.fr/prefs.js:85 113 | msgid "" 114 | "This extension can be deactivated once your applications are organized as " 115 | "wished." 116 | msgstr "" 117 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/it/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/it/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/it/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2019-08-19 17:21+0100\n" 12 | "Last-Translator: Albano Battistella\n" 13 | "Language-Team: \n" 14 | "Language: it_IT\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 2.0.4\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | 21 | #: appfolders-manager@maestroschan.fr/extension.js:83 22 | msgid "Add to" 23 | msgstr "Aggiungi a" 24 | 25 | #: appfolders-manager@maestroschan.fr/extension.js:85 26 | msgid "New AppFolder" 27 | msgstr "Nuova AppFolder" 28 | 29 | #: appfolders-manager@maestroschan.fr/extension.js:139 30 | msgid "Remove from" 31 | msgstr "Rimuovi da" 32 | 33 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 34 | msgid "Create a new folder" 35 | msgstr "Crea nuova Cartella" 36 | 37 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 38 | #, fuzzy, javascript-format 39 | msgid "Remove from %s" 40 | msgstr "Rimuovi da" 41 | 42 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 44 | msgid "Cancel" 45 | msgstr "Annulla" 46 | 47 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 48 | msgid "Create" 49 | msgstr "Crea" 50 | 51 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 52 | msgid "Delete" 53 | msgstr "Elimina" 54 | 55 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 56 | msgid "Apply" 57 | msgstr "Applica" 58 | 59 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 60 | msgid "Folder's name:" 61 | msgstr "Nome Cartella:" 62 | 63 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 64 | msgid "Categories:" 65 | msgstr "Categorie:" 66 | 67 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 68 | msgid "Other category?" 69 | msgstr "Altra Categoria?" 70 | 71 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 72 | msgid "No category" 73 | msgstr "Nessuna Categoria" 74 | 75 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 76 | msgid "Select a category…" 77 | msgstr "Seleziona una categoria…" 78 | 79 | #: appfolders-manager@maestroschan.fr/prefs.js:31 80 | msgid "Modifications will be effective after reloading the extension." 81 | msgstr "Le modifiche avranno effetto dopo aver ricaricato l'estensione." 82 | 83 | #: appfolders-manager@maestroschan.fr/prefs.js:38 84 | msgid "Main settings" 85 | msgstr "Impostazioni Principali" 86 | 87 | #: appfolders-manager@maestroschan.fr/prefs.js:39 88 | msgid "Categories" 89 | msgstr "Categorie" 90 | 91 | #: appfolders-manager@maestroschan.fr/prefs.js:46 92 | msgid "Delete all related settings when an appfolder is deleted" 93 | msgstr "Elimina tutte le impostazioni dell'AppFolder quando viene rimossa" 94 | 95 | #: appfolders-manager@maestroschan.fr/prefs.js:48 96 | msgid "Use the right-click menus in addition to the drag-and-drop" 97 | msgstr "Utilizzare il menu di scelta rapida oltre al trascinamento della selezione" 98 | 99 | #: appfolders-manager@maestroschan.fr/prefs.js:56 100 | msgid "Use categories" 101 | msgstr "Usa aggiuntive" 102 | 103 | #: appfolders-manager@maestroschan.fr/prefs.js:59 104 | msgid "More informations about \"additional categories\"" 105 | msgstr "Maggiori informazioni sulle \"categorie aggiuntive\"" 106 | 107 | #: appfolders-manager@maestroschan.fr/prefs.js:74 108 | msgid "Report bugs or ideas" 109 | msgstr "Invia segnalazioni di bug o idee" 110 | 111 | #: appfolders-manager@maestroschan.fr/prefs.js:85 112 | msgid "" 113 | "This extension can be deactivated once your applications are organized as " 114 | "wished." 115 | msgstr "" 116 | "Questa estensione può essere disattivata dopo aver organizzato le applicazioni come " 117 | "desiderato." 118 | 119 | #~ msgid "Standard specification" 120 | #~ msgstr "Specifiche standard" 121 | 122 | #~ msgid "This appfolder already exists." 123 | #~ msgstr "Questa appfolder esiste già." 124 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/nl_NL/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/nl_NL/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/nl_NL/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2019-05-27 21:43+0200\n" 12 | "Last-Translator: Heimen Stoffels \n" 13 | "Language-Team: \n" 14 | "Language: nl_NL\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 2.1.1\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | 21 | #: appfolders-manager@maestroschan.fr/extension.js:83 22 | msgid "Add to" 23 | msgstr "Toevoegen aan" 24 | 25 | #: appfolders-manager@maestroschan.fr/extension.js:85 26 | msgid "New AppFolder" 27 | msgstr "Nieuwe map" 28 | 29 | #: appfolders-manager@maestroschan.fr/extension.js:139 30 | msgid "Remove from" 31 | msgstr "Verwijderen uit" 32 | 33 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 34 | msgid "Create a new folder" 35 | msgstr "Nieuwe map creëren" 36 | 37 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 38 | #, javascript-format 39 | msgid "Remove from %s" 40 | msgstr "Verwijderen uit %s" 41 | 42 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 44 | msgid "Cancel" 45 | msgstr "Annuleren" 46 | 47 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 48 | msgid "Create" 49 | msgstr "Creëren" 50 | 51 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 52 | msgid "Delete" 53 | msgstr "Verwijderen" 54 | 55 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 56 | msgid "Apply" 57 | msgstr "Toepassen" 58 | 59 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 60 | msgid "Folder's name:" 61 | msgstr "Naam van de map:" 62 | 63 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 64 | msgid "Categories:" 65 | msgstr "Categorieën:" 66 | 67 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 68 | msgid "Other category?" 69 | msgstr "Andere categorie?" 70 | 71 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 72 | msgid "No category" 73 | msgstr "Geen categorie" 74 | 75 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 76 | msgid "Select a category…" 77 | msgstr "Kies een categorie…" 78 | 79 | #: appfolders-manager@maestroschan.fr/prefs.js:31 80 | msgid "Modifications will be effective after reloading the extension." 81 | msgstr "De wijzigingen worden toegepast na het herladen van de uitbreiding." 82 | 83 | #: appfolders-manager@maestroschan.fr/prefs.js:38 84 | msgid "Main settings" 85 | msgstr "Algemene instellingen" 86 | 87 | #: appfolders-manager@maestroschan.fr/prefs.js:39 88 | msgid "Categories" 89 | msgstr "Categorieën" 90 | 91 | #: appfolders-manager@maestroschan.fr/prefs.js:46 92 | msgid "Delete all related settings when an appfolder is deleted" 93 | msgstr "Mapinstellingen wissen na het verwijderen van een map" 94 | 95 | #: appfolders-manager@maestroschan.fr/prefs.js:48 96 | msgid "Use the right-click menus in addition to the drag-and-drop" 97 | msgstr "Rechtermuisknop gebruiken (naast slepen-en-neerzetten)" 98 | 99 | #: appfolders-manager@maestroschan.fr/prefs.js:56 100 | msgid "Use categories" 101 | msgstr "Categorieën gebruiken" 102 | 103 | #: appfolders-manager@maestroschan.fr/prefs.js:59 104 | msgid "More informations about \"additional categories\"" 105 | msgstr "Meer informatie over 'aanvullende categorieën'" 106 | 107 | #: appfolders-manager@maestroschan.fr/prefs.js:74 108 | msgid "Report bugs or ideas" 109 | msgstr "Bugs melden of ideeën bespreken" 110 | 111 | #: appfolders-manager@maestroschan.fr/prefs.js:85 112 | msgid "" 113 | "This extension can be deactivated once your applications are organized as " 114 | "wished." 115 | msgstr "" 116 | "Deze uitbreiding kan worden uitgeschakeld zodra je toepassingen naar wens " 117 | "zijn ingedeeld." 118 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/pl/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/pl/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/pl/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: Appfolders Management (GNOME extension)\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 12 | "PO-Revision-Date: 2019-05-19 18:23+0200\n" 13 | "Last-Translator: Alex \n" 14 | "Language-Team: Piotr Komur\n" 15 | "Language: pl\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "X-Generator: Poedit 2.2.1\n" 20 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " 21 | "|| n%100>=20) ? 1 : 2);\n" 22 | 23 | #: appfolders-manager@maestroschan.fr/extension.js:83 24 | msgid "Add to" 25 | msgstr "Dodaj do folderu" 26 | 27 | #: appfolders-manager@maestroschan.fr/extension.js:85 28 | msgid "New AppFolder" 29 | msgstr "Nowy folder programów" 30 | 31 | #: appfolders-manager@maestroschan.fr/extension.js:139 32 | msgid "Remove from" 33 | msgstr "Usuń z folderu" 34 | 35 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 36 | msgid "Create a new folder" 37 | msgstr "Utwórz nowy folder" 38 | 39 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 40 | #, javascript-format 41 | msgid "Remove from %s" 42 | msgstr "Usuń z %s" 43 | 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 45 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 46 | msgid "Cancel" 47 | msgstr "Anuluj" 48 | 49 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 50 | msgid "Create" 51 | msgstr "Utwórz" 52 | 53 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 54 | msgid "Delete" 55 | msgstr "Usuń" 56 | 57 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 58 | msgid "Apply" 59 | msgstr "Zastosuj" 60 | 61 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 62 | msgid "Folder's name:" 63 | msgstr "Nazwa folderu:" 64 | 65 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 66 | msgid "Categories:" 67 | msgstr "Kategorie programów:" 68 | 69 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 70 | msgid "Other category?" 71 | msgstr "Nowa kategoria" 72 | 73 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 74 | msgid "No category" 75 | msgstr "Brak wybranych kategorii" 76 | 77 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 78 | msgid "Select a category…" 79 | msgstr "Wybierz kategorię…" 80 | 81 | #: appfolders-manager@maestroschan.fr/prefs.js:31 82 | msgid "Modifications will be effective after reloading the extension." 83 | msgstr "Zmiany będą aktywne po ponownym zrestartowaniu środowiska Gnome." 84 | 85 | #: appfolders-manager@maestroschan.fr/prefs.js:38 86 | msgid "Main settings" 87 | msgstr "Ustawienia" 88 | 89 | #: appfolders-manager@maestroschan.fr/prefs.js:39 90 | msgid "Categories" 91 | msgstr "Kategorie" 92 | 93 | #: appfolders-manager@maestroschan.fr/prefs.js:46 94 | msgid "Delete all related settings when an appfolder is deleted" 95 | msgstr "Usuń powiązane zmiany wraz z usunięciem folderu programów" 96 | 97 | #: appfolders-manager@maestroschan.fr/prefs.js:48 98 | msgid "Use the right-click menus in addition to the drag-and-drop" 99 | msgstr "" 100 | "Użyj menu pod prawym przyciskiem myszy w dodatku do metody \"przeciągnij i " 101 | "upuść\"" 102 | 103 | #: appfolders-manager@maestroschan.fr/prefs.js:56 104 | msgid "Use categories" 105 | msgstr "Użyj standardowych kategorii" 106 | 107 | #: appfolders-manager@maestroschan.fr/prefs.js:59 108 | msgid "More informations about \"additional categories\"" 109 | msgstr "Więcej informacji o \"standardowych kategoriach\"" 110 | 111 | #: appfolders-manager@maestroschan.fr/prefs.js:74 112 | msgid "Report bugs or ideas" 113 | msgstr "Zgłoś błędy lub nowe funkcje" 114 | 115 | #: appfolders-manager@maestroschan.fr/prefs.js:85 116 | msgid "" 117 | "This extension can be deactivated once your applications are organized as " 118 | "wished." 119 | msgstr "" 120 | "Można dezaktywować to rozszerzenie po zakończeniu porządkowania programów w " 121 | "folderach." 122 | 123 | #~ msgid "Standard specification" 124 | #~ msgstr "Specyfikacja standardu" 125 | 126 | #~ msgid "This appfolder already exists." 127 | #~ msgstr "Folder o tej nazwie już istnieje." 128 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/pt_BR/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/pt_BR/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/pt_BR/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2019-02-10 11:19-0200\n" 12 | "Last-Translator: Fábio Nogueira \n" 13 | "Language-Team: \n" 14 | "Language: pt_BR\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 2.2.1\n" 19 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 20 | 21 | #: appfolders-manager@maestroschan.fr/extension.js:83 22 | msgid "Add to" 23 | msgstr "Adicionar para" 24 | 25 | #: appfolders-manager@maestroschan.fr/extension.js:85 26 | msgid "New AppFolder" 27 | msgstr "Nova AppFolder" 28 | 29 | #: appfolders-manager@maestroschan.fr/extension.js:139 30 | msgid "Remove from" 31 | msgstr "Remover de" 32 | 33 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 34 | msgid "Create a new folder" 35 | msgstr "Criar uma nova pasta" 36 | 37 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 38 | #, javascript-format 39 | msgid "Remove from %s" 40 | msgstr "Remover de %s" 41 | 42 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 44 | msgid "Cancel" 45 | msgstr "Cancelar" 46 | 47 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 48 | msgid "Create" 49 | msgstr "Criar" 50 | 51 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 52 | msgid "Delete" 53 | msgstr "Excluir" 54 | 55 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 56 | msgid "Apply" 57 | msgstr "Aplicar" 58 | 59 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 60 | msgid "Folder's name:" 61 | msgstr "Nome da pasta:" 62 | 63 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 64 | msgid "Categories:" 65 | msgstr "Categorias:" 66 | 67 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 68 | msgid "Other category?" 69 | msgstr "Outra categoria?" 70 | 71 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 72 | msgid "No category" 73 | msgstr "Nenhuma categoria" 74 | 75 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 76 | msgid "Select a category…" 77 | msgstr "Selecione uma categoria…" 78 | 79 | #: appfolders-manager@maestroschan.fr/prefs.js:31 80 | msgid "Modifications will be effective after reloading the extension." 81 | msgstr "As modificações entrarão em vigor depois de recarregar a extensão." 82 | 83 | #: appfolders-manager@maestroschan.fr/prefs.js:38 84 | msgid "Main settings" 85 | msgstr "Configurações principais" 86 | 87 | #: appfolders-manager@maestroschan.fr/prefs.js:39 88 | msgid "Categories" 89 | msgstr "Categorias" 90 | 91 | #: appfolders-manager@maestroschan.fr/prefs.js:46 92 | msgid "Delete all related settings when an appfolder is deleted" 93 | msgstr "" 94 | "Excluir todas as configurações relacionadas quando um appfolder for excluído" 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:48 97 | msgid "Use the right-click menus in addition to the drag-and-drop" 98 | msgstr "Use os menus do botão direito, além do arrastar e soltar" 99 | 100 | #: appfolders-manager@maestroschan.fr/prefs.js:56 101 | msgid "Use categories" 102 | msgstr "Usar categorias" 103 | 104 | #: appfolders-manager@maestroschan.fr/prefs.js:59 105 | msgid "More informations about \"additional categories\"" 106 | msgstr "Mais informações sobre \"categorias adicionais\"" 107 | 108 | #: appfolders-manager@maestroschan.fr/prefs.js:74 109 | msgid "Report bugs or ideas" 110 | msgstr "Comunicar erros ou ideias" 111 | 112 | #: appfolders-manager@maestroschan.fr/prefs.js:85 113 | msgid "" 114 | "This extension can be deactivated once your applications are organized as " 115 | "wished." 116 | msgstr "" 117 | "Esta extensão pode ser desativada assim que seus aplicativos forem " 118 | "organizados conforme desejado." 119 | 120 | #~ msgid "Standard specification" 121 | #~ msgstr "Especificação padrão" 122 | 123 | #~ msgid "This appfolder already exists." 124 | #~ msgstr "Esta appfolder já existe." 125 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/ru/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/ru/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/ru/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: Max Krapiŭka \n" 13 | "Language-Team: RUSSIAN \n" 14 | "Language: be\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: appfolders-manager@maestroschan.fr/extension.js:83 20 | msgid "Add to" 21 | msgstr "Добавить в" 22 | 23 | #: appfolders-manager@maestroschan.fr/extension.js:85 24 | msgid "New AppFolder" 25 | msgstr "Новая папка" 26 | 27 | #: appfolders-manager@maestroschan.fr/extension.js:139 28 | msgid "Remove from" 29 | msgstr "Удалить из" 30 | 31 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 32 | msgid "Create a new folder" 33 | msgstr "" 34 | 35 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 36 | #, fuzzy, javascript-format 37 | msgid "Remove from %s" 38 | msgstr "Удалить из" 39 | 40 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 41 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 42 | msgid "Cancel" 43 | msgstr "Отмена" 44 | 45 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 46 | msgid "Create" 47 | msgstr "Стварыць" 48 | 49 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 50 | msgid "Delete" 51 | msgstr "Удалить" 52 | 53 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 54 | msgid "Apply" 55 | msgstr "" 56 | 57 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 58 | msgid "Folder's name:" 59 | msgstr "" 60 | 61 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 62 | msgid "Categories:" 63 | msgstr "" 64 | 65 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 66 | #, fuzzy 67 | msgid "Other category?" 68 | msgstr "Удалить категорию" 69 | 70 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 71 | #, fuzzy 72 | msgid "No category" 73 | msgstr "Добавить категорию" 74 | 75 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 76 | #, fuzzy 77 | msgid "Select a category…" 78 | msgstr "Удалить категорию" 79 | 80 | #: appfolders-manager@maestroschan.fr/prefs.js:31 81 | msgid "Modifications will be effective after reloading the extension." 82 | msgstr "Изменения вступят в силу после перезагрузки расширения." 83 | 84 | #: appfolders-manager@maestroschan.fr/prefs.js:38 85 | msgid "Main settings" 86 | msgstr "" 87 | 88 | #: appfolders-manager@maestroschan.fr/prefs.js:39 89 | msgid "Categories" 90 | msgstr "" 91 | 92 | #: appfolders-manager@maestroschan.fr/prefs.js:46 93 | msgid "Delete all related settings when an appfolder is deleted" 94 | msgstr "Удалять все связанные настройки при удалении папки приложений." 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:48 97 | msgid "Use the right-click menus in addition to the drag-and-drop" 98 | msgstr "" 99 | 100 | #: appfolders-manager@maestroschan.fr/prefs.js:56 101 | #, fuzzy 102 | msgid "Use categories" 103 | msgstr "Дополнительные категории" 104 | 105 | #: appfolders-manager@maestroschan.fr/prefs.js:59 106 | msgid "More informations about \"additional categories\"" 107 | msgstr "Больше информации про \"дополнительные категории\"" 108 | 109 | #: appfolders-manager@maestroschan.fr/prefs.js:74 110 | msgid "Report bugs or ideas" 111 | msgstr "Сообщить об ошибках, предложить идеи" 112 | 113 | #: appfolders-manager@maestroschan.fr/prefs.js:85 114 | msgid "" 115 | "This extension can be deactivated once your applications are organized as " 116 | "wished." 117 | msgstr "" 118 | "Это расширение может быть деактивировано, после того как вы окончательно " 119 | "настроите организацию своих приложений." 120 | 121 | #~ msgid "Standard specification" 122 | #~ msgstr "Стандартная спецификация" 123 | 124 | #~ msgid "This appfolder already exists." 125 | #~ msgstr "Эта папка приложений уже существует" 126 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/sr/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/sr/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/sr/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 12 | "PO-Revision-Date: 2017-09-15 16:40+0200\n" 13 | "Last-Translator: \n" 14 | "Language-Team: \n" 15 | "Language: sr\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "X-Generator: Poedit 2.0.3\n" 20 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 21 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 22 | 23 | #: appfolders-manager@maestroschan.fr/extension.js:83 24 | msgid "Add to" 25 | msgstr "Додај у" 26 | 27 | #: appfolders-manager@maestroschan.fr/extension.js:85 28 | msgid "New AppFolder" 29 | msgstr "Нова фаскила програма" 30 | 31 | #: appfolders-manager@maestroschan.fr/extension.js:139 32 | msgid "Remove from" 33 | msgstr "Уклони ставку" 34 | 35 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 36 | msgid "Create a new folder" 37 | msgstr "" 38 | 39 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 40 | #, fuzzy, javascript-format 41 | msgid "Remove from %s" 42 | msgstr "Уклони ставку" 43 | 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 45 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 46 | msgid "Cancel" 47 | msgstr "Откажи" 48 | 49 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 50 | msgid "Create" 51 | msgstr "Направи" 52 | 53 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 54 | msgid "Delete" 55 | msgstr "Обриши" 56 | 57 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 58 | msgid "Apply" 59 | msgstr "" 60 | 61 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 62 | msgid "Folder's name:" 63 | msgstr "" 64 | 65 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 66 | msgid "Categories:" 67 | msgstr "" 68 | 69 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 70 | #, fuzzy 71 | msgid "Other category?" 72 | msgstr "Уклони категорију" 73 | 74 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 75 | #, fuzzy 76 | msgid "No category" 77 | msgstr "Додај категорију" 78 | 79 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 80 | #, fuzzy 81 | msgid "Select a category…" 82 | msgstr "Уклони категорију" 83 | 84 | #: appfolders-manager@maestroschan.fr/prefs.js:31 85 | msgid "Modifications will be effective after reloading the extension." 86 | msgstr "Измене ће ступити на снагу по поновном учитавању проширења." 87 | 88 | #: appfolders-manager@maestroschan.fr/prefs.js:38 89 | msgid "Main settings" 90 | msgstr "" 91 | 92 | #: appfolders-manager@maestroschan.fr/prefs.js:39 93 | msgid "Categories" 94 | msgstr "" 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:46 97 | msgid "Delete all related settings when an appfolder is deleted" 98 | msgstr "Обриши све припадајуће поставке при брисању проширења" 99 | 100 | #: appfolders-manager@maestroschan.fr/prefs.js:48 101 | msgid "Use the right-click menus in addition to the drag-and-drop" 102 | msgstr "" 103 | 104 | #: appfolders-manager@maestroschan.fr/prefs.js:56 105 | #, fuzzy 106 | msgid "Use categories" 107 | msgstr "Додатне категорије" 108 | 109 | #: appfolders-manager@maestroschan.fr/prefs.js:59 110 | msgid "More informations about \"additional categories\"" 111 | msgstr "" 112 | 113 | #: appfolders-manager@maestroschan.fr/prefs.js:74 114 | msgid "Report bugs or ideas" 115 | msgstr "" 116 | 117 | #: appfolders-manager@maestroschan.fr/prefs.js:85 118 | msgid "" 119 | "This extension can be deactivated once your applications are organized as " 120 | "wished." 121 | msgstr "" 122 | 123 | #~ msgid "This appfolder already exists." 124 | #~ msgstr "Ова фасцикла програма већ постоји." 125 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/sr@latin/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/sr@latin/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/sr@latin/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 12 | "PO-Revision-Date: 2017-09-15 16:40+0200\n" 13 | "Last-Translator: \n" 14 | "Language-Team: \n" 15 | "Language: sr@latin\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "X-Generator: Poedit 2.0.3\n" 20 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 21 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 22 | 23 | #: appfolders-manager@maestroschan.fr/extension.js:83 24 | msgid "Add to" 25 | msgstr "Dodaj u" 26 | 27 | #: appfolders-manager@maestroschan.fr/extension.js:85 28 | msgid "New AppFolder" 29 | msgstr "Nova faskila programa" 30 | 31 | #: appfolders-manager@maestroschan.fr/extension.js:139 32 | msgid "Remove from" 33 | msgstr "Ukloni stavku" 34 | 35 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 36 | msgid "Create a new folder" 37 | msgstr "" 38 | 39 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 40 | #, fuzzy, javascript-format 41 | msgid "Remove from %s" 42 | msgstr "Ukloni stavku" 43 | 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 45 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 46 | msgid "Cancel" 47 | msgstr "Otkaži" 48 | 49 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 50 | msgid "Create" 51 | msgstr "Napravi" 52 | 53 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 54 | msgid "Delete" 55 | msgstr "Obriši" 56 | 57 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 58 | msgid "Apply" 59 | msgstr "" 60 | 61 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 62 | msgid "Folder's name:" 63 | msgstr "" 64 | 65 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 66 | msgid "Categories:" 67 | msgstr "" 68 | 69 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 70 | #, fuzzy 71 | msgid "Other category?" 72 | msgstr "Ukloni kategoriju" 73 | 74 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 75 | #, fuzzy 76 | msgid "No category" 77 | msgstr "Dodaj kategoriju" 78 | 79 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 80 | #, fuzzy 81 | msgid "Select a category…" 82 | msgstr "Ukloni kategoriju" 83 | 84 | #: appfolders-manager@maestroschan.fr/prefs.js:31 85 | msgid "Modifications will be effective after reloading the extension." 86 | msgstr "Izmene će stupiti na snagu po ponovnom učitavanju proširenja." 87 | 88 | #: appfolders-manager@maestroschan.fr/prefs.js:38 89 | msgid "Main settings" 90 | msgstr "" 91 | 92 | #: appfolders-manager@maestroschan.fr/prefs.js:39 93 | msgid "Categories" 94 | msgstr "" 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:46 97 | msgid "Delete all related settings when an appfolder is deleted" 98 | msgstr "Obriši sve pripadajuće postavke pri brisanju proširenja" 99 | 100 | #: appfolders-manager@maestroschan.fr/prefs.js:48 101 | msgid "Use the right-click menus in addition to the drag-and-drop" 102 | msgstr "" 103 | 104 | #: appfolders-manager@maestroschan.fr/prefs.js:56 105 | #, fuzzy 106 | msgid "Use categories" 107 | msgstr "Dodatne kategorije" 108 | 109 | #: appfolders-manager@maestroschan.fr/prefs.js:59 110 | msgid "More informations about \"additional categories\"" 111 | msgstr "" 112 | 113 | #: appfolders-manager@maestroschan.fr/prefs.js:74 114 | msgid "Report bugs or ideas" 115 | msgstr "" 116 | 117 | #: appfolders-manager@maestroschan.fr/prefs.js:85 118 | msgid "" 119 | "This extension can be deactivated once your applications are organized as " 120 | "wished." 121 | msgstr "" 122 | 123 | #~ msgid "This appfolder already exists." 124 | #~ msgstr "Ova fascikla programa već postoji." 125 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/tr/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/tr/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/tr/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # Uygulama klasörleme Türkçe çeviri. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Serdar Sağlam , 2019. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: v13\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2019-01-19 12:10+0300\n" 12 | "Last-Translator: Serdar Sağlam \n" 13 | "Language-Team: Türkçe \n" 14 | "Language: tr\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: appfolders-manager@maestroschan.fr/extension.js:83 20 | msgid "Add to" 21 | msgstr "Klasör Grubuna Taşı" 22 | 23 | #: appfolders-manager@maestroschan.fr/extension.js:85 24 | msgid "New AppFolder" 25 | msgstr "Yeni Klasör Grubu" 26 | 27 | #: appfolders-manager@maestroschan.fr/extension.js:139 28 | msgid "Remove from" 29 | msgstr "Buradan Kaldır" 30 | 31 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 32 | msgid "Create a new folder" 33 | msgstr "Yeni klasör oluştur" 34 | 35 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 36 | #, javascript-format 37 | msgid "Remove from %s" 38 | msgstr "Buradan Kaldır %s" 39 | 40 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 41 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 42 | msgid "Cancel" 43 | msgstr "İptal" 44 | 45 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 46 | msgid "Create" 47 | msgstr "Oluştur" 48 | 49 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 50 | msgid "Delete" 51 | msgstr "Sil" 52 | 53 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 54 | msgid "Apply" 55 | msgstr "Onayla" 56 | 57 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 58 | msgid "Folder's name:" 59 | msgstr "Klasör İsmi:" 60 | 61 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 62 | msgid "Categories:" 63 | msgstr "Kategoriler:" 64 | 65 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 66 | msgid "Other category?" 67 | msgstr "Diğer Kategori?" 68 | 69 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 70 | msgid "No category" 71 | msgstr "Kategori Yok" 72 | 73 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 74 | msgid "Select a category…" 75 | msgstr "Kategori Seç…" 76 | 77 | #: appfolders-manager@maestroschan.fr/prefs.js:31 78 | msgid "Modifications will be effective after reloading the extension." 79 | msgstr "Değişiklikler,eklenti yeniden başladıktan sonra etkili olacaktır." 80 | 81 | #: appfolders-manager@maestroschan.fr/prefs.js:38 82 | msgid "Main settings" 83 | msgstr "Ayarlar" 84 | 85 | #: appfolders-manager@maestroschan.fr/prefs.js:39 86 | msgid "Categories" 87 | msgstr "Kategoriler" 88 | 89 | #: appfolders-manager@maestroschan.fr/prefs.js:46 90 | msgid "Delete all related settings when an appfolder is deleted" 91 | msgstr "Bir klasör grubu silindiğinde tüm ilgili ayarları silin" 92 | 93 | #: appfolders-manager@maestroschan.fr/prefs.js:48 94 | msgid "Use the right-click menus in addition to the drag-and-drop" 95 | msgstr "Sürükle ve bırak işlevine ek olarak sağ tıklama menülerini kullanın" 96 | 97 | #: appfolders-manager@maestroschan.fr/prefs.js:56 98 | msgid "Use categories" 99 | msgstr "Kategorileri Kullan" 100 | 101 | #: appfolders-manager@maestroschan.fr/prefs.js:59 102 | msgid "More informations about \"additional categories\"" 103 | msgstr "Hakkında daha fazla bilgi \"ek kategoriler\"" 104 | 105 | #: appfolders-manager@maestroschan.fr/prefs.js:74 106 | msgid "Report bugs or ideas" 107 | msgstr "Yeni bir fikir veya hata bildirin" 108 | 109 | #: appfolders-manager@maestroschan.fr/prefs.js:85 110 | msgid "" 111 | "This extension can be deactivated once your applications are organized as " 112 | "wished." 113 | msgstr "" 114 | "Menüleri istediğiniz şekilde düzenlendiğinde bu uzantı devre dışı " 115 | "bırakılabilir." 116 | 117 | #~ msgid "Standard specification" 118 | #~ msgstr "Standart şartname" 119 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/uk_UA/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/uk_UA/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/uk_UA/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2019-07-31 13:15+0300\n" 12 | "Last-Translator: Igor Gordiichuk \n" 13 | "Language-Team: \n" 14 | "Language: uk_UA\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 2.2.3\n" 19 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 20 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 21 | 22 | #: appfolders-manager@maestroschan.fr/extension.js:83 23 | msgid "Add to" 24 | msgstr "Додати до" 25 | 26 | #: appfolders-manager@maestroschan.fr/extension.js:85 27 | msgid "New AppFolder" 28 | msgstr "Нова тека програм" 29 | 30 | #: appfolders-manager@maestroschan.fr/extension.js:139 31 | msgid "Remove from" 32 | msgstr "Вилучити з" 33 | 34 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 35 | msgid "Create a new folder" 36 | msgstr "Створити нову теку" 37 | 38 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 39 | #, javascript-format 40 | msgid "Remove from %s" 41 | msgstr "Вилучити з %s" 42 | 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 45 | msgid "Cancel" 46 | msgstr "Скасувати" 47 | 48 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 49 | msgid "Create" 50 | msgstr "Створити" 51 | 52 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 53 | msgid "Delete" 54 | msgstr "Вилучити" 55 | 56 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 57 | msgid "Apply" 58 | msgstr "Застосовувати" 59 | 60 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 61 | msgid "Folder's name:" 62 | msgstr "Назва теки:" 63 | 64 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 65 | msgid "Categories:" 66 | msgstr "Категорії:" 67 | 68 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 69 | msgid "Other category?" 70 | msgstr "Інша категорія?" 71 | 72 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 73 | msgid "No category" 74 | msgstr "Без категорії" 75 | 76 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 77 | msgid "Select a category…" 78 | msgstr "Обрати категорію…" 79 | 80 | #: appfolders-manager@maestroschan.fr/prefs.js:31 81 | msgid "Modifications will be effective after reloading the extension." 82 | msgstr "Зміни буде застосовано після перезавантаження розширення." 83 | 84 | #: appfolders-manager@maestroschan.fr/prefs.js:38 85 | msgid "Main settings" 86 | msgstr "Основні налаштування" 87 | 88 | #: appfolders-manager@maestroschan.fr/prefs.js:39 89 | msgid "Categories" 90 | msgstr "Категорії" 91 | 92 | #: appfolders-manager@maestroschan.fr/prefs.js:46 93 | msgid "Delete all related settings when an appfolder is deleted" 94 | msgstr "Вилучити всі пов'язані налаштування, коли видаляється тека" 95 | 96 | #: appfolders-manager@maestroschan.fr/prefs.js:48 97 | msgid "Use the right-click menus in addition to the drag-and-drop" 98 | msgstr "Використовувати контекстне меню додатково до перетягування мишкою" 99 | 100 | #: appfolders-manager@maestroschan.fr/prefs.js:56 101 | msgid "Use categories" 102 | msgstr "Використати категорії" 103 | 104 | #: appfolders-manager@maestroschan.fr/prefs.js:59 105 | msgid "More informations about \"additional categories\"" 106 | msgstr "Більше інформації про \"додаткові категорії\"" 107 | 108 | #: appfolders-manager@maestroschan.fr/prefs.js:74 109 | msgid "Report bugs or ideas" 110 | msgstr "Повідомити про ваду або запропонувати ідею" 111 | 112 | #: appfolders-manager@maestroschan.fr/prefs.js:85 113 | msgid "" 114 | "This extension can be deactivated once your applications are organized as " 115 | "wished." 116 | msgstr "Це розширення можна деактивувати, якщо програми було впорядковано." 117 | 118 | #~ msgid "Standard specification" 119 | #~ msgstr "Стандартні категорії" 120 | 121 | #~ msgid "This appfolder already exists." 122 | #~ msgstr "Ця тека програм вже існує." 123 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/zh_CN/LC_MESSAGES/appfolders-manager.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/locale/zh_CN/LC_MESSAGES/appfolders-manager.mo -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/locale/zh_CN/LC_MESSAGES/appfolders-manager.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2019-07-02 22:54+0200\n" 11 | "PO-Revision-Date: 2018-12-19 05:43+0200\n" 12 | "Last-Translator: Zodiac \n" 13 | "Language-Team: \n" 14 | "Language: zh_CN\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 2.2\n" 19 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 20 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 21 | 22 | #: appfolders-manager@maestroschan.fr/extension.js:83 23 | msgid "Add to" 24 | msgstr "添加到" 25 | 26 | #: appfolders-manager@maestroschan.fr/extension.js:85 27 | msgid "New AppFolder" 28 | msgstr "新建App文件夹" 29 | 30 | #: appfolders-manager@maestroschan.fr/extension.js:139 31 | msgid "Remove from" 32 | msgstr "从以下移除" 33 | 34 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:312 35 | msgid "Create a new folder" 36 | msgstr "新建文件夹" 37 | 38 | #: appfolders-manager@maestroschan.fr/dragAndDrop.js:350 39 | #, fuzzy, javascript-format 40 | msgid "Remove from %s" 41 | msgstr "从以下移除 %s" 42 | 43 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:62 44 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:72 45 | msgid "Cancel" 46 | msgstr "取消" 47 | 48 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:66 49 | msgid "Create" 50 | msgstr "新建" 51 | 52 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:76 53 | msgid "Delete" 54 | msgstr "删除" 55 | 56 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:80 57 | msgid "Apply" 58 | msgstr "应用" 59 | 60 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:106 61 | msgid "Folder's name:" 62 | msgstr "文件夹名称:" 63 | 64 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:139 65 | msgid "Categories:" 66 | msgstr "目录:" 67 | 68 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:164 69 | msgid "Other category?" 70 | msgstr "其他目录?" 71 | 72 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:192 73 | msgid "No category" 74 | msgstr "没有此目录" 75 | 76 | #: appfolders-manager@maestroschan.fr/appfolderDialog.js:375 77 | #, fuzzy 78 | msgid "Select a category…" 79 | msgstr "选择一个目录..." 80 | 81 | #: appfolders-manager@maestroschan.fr/prefs.js:31 82 | msgid "Modifications will be effective after reloading the extension." 83 | msgstr "改变将会在重启扩展后生效。" 84 | 85 | #: appfolders-manager@maestroschan.fr/prefs.js:38 86 | msgid "Main settings" 87 | msgstr "主要设置" 88 | 89 | #: appfolders-manager@maestroschan.fr/prefs.js:39 90 | msgid "Categories" 91 | msgstr "目录" 92 | 93 | #: appfolders-manager@maestroschan.fr/prefs.js:46 94 | msgid "Delete all related settings when an appfolder is deleted" 95 | msgstr "删除App文件夹时同时也删除相关设置" 96 | 97 | #: appfolders-manager@maestroschan.fr/prefs.js:48 98 | msgid "Use the right-click menus in addition to the drag-and-drop" 99 | msgstr "除了拖放之外,还可以使用右键单击菜单" 100 | 101 | #: appfolders-manager@maestroschan.fr/prefs.js:56 102 | msgid "Use categories" 103 | msgstr "使用目录" 104 | 105 | #: appfolders-manager@maestroschan.fr/prefs.js:59 106 | msgid "More informations about \"additional categories\"" 107 | msgstr "更多信息关于 \"附加目录\"" 108 | 109 | #: appfolders-manager@maestroschan.fr/prefs.js:74 110 | msgid "Report bugs or ideas" 111 | msgstr "报告Bug或建议" 112 | 113 | #: appfolders-manager@maestroschan.fr/prefs.js:85 114 | msgid "" 115 | "This extension can be deactivated once your applications are organized as " 116 | "wished." 117 | msgstr "一旦您组织好了您的App,这个扩展就可以被停用了。" 118 | 119 | #~ msgid "Standard specification" 120 | #~ msgstr "标准规范" 121 | 122 | #~ msgid "This appfolder already exists." 123 | #~ msgstr "这个文件夹已经存在。" 124 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "_generated": "Generated by SweetTooth, do not edit", 3 | "description": "An easy way to arrange your applications in folders, directly from the applications grid. Create folders and add/remove apps using drag-and-drop, rename/delete them with a right-click.", 4 | "gettext-domain": "appfolders-manager", 5 | "name": "Appfolders Management extension", 6 | "shell-version": [ 7 | "3.26", 8 | "3.28", 9 | "3.30", 10 | "3.32" 11 | ], 12 | "url": "https://github.com/maoschanz/appfolders-manager-gnome-extension", 13 | "uuid": "appfolders-manager@maestroschan.fr", 14 | "version": 0 15 | } 16 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/prefs.js: -------------------------------------------------------------------------------- 1 | 2 | const GObject = imports.gi.GObject; 3 | const Gtk = imports.gi.Gtk; 4 | 5 | const Gettext = imports.gettext.domain('appfolders-manager'); 6 | const _ = Gettext.gettext; 7 | 8 | const ExtensionUtils = imports.misc.extensionUtils; 9 | const Me = ExtensionUtils.getCurrentExtension(); 10 | const Convenience = Me.imports.convenience; 11 | 12 | //------------------------------------------------------------------------------ 13 | 14 | const appfoldersManagerSettingsWidget = new GObject.Class({ 15 | Name: 'appfoldersManager.Prefs.Widget', 16 | GTypeName: 'appfoldersManagerPrefsWidget', 17 | Extends: Gtk.Box, 18 | 19 | _init: function (params) { 20 | this.parent(params); 21 | this.margin = 30; 22 | this.spacing = 18; 23 | this.set_orientation(Gtk.Orientation.VERTICAL); 24 | 25 | this._settings = Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager'); 26 | 27 | // The goal of this bullshit is to force the boolean to appear in dconf 28 | this._settings.set_boolean('debug', this._settings.get_boolean('debug')); 29 | 30 | //---------------------------------------------------------------------- 31 | 32 | let labelMain = new Gtk.Label({ 33 | label: _("Modifications will be effective after reloading the extension."), 34 | use_markup: true, 35 | wrap: true, 36 | halign: Gtk.Align.START 37 | }); 38 | this.add(labelMain); 39 | 40 | let generalSection = this.add_section(_("Main settings")); 41 | let categoriesSection = this.add_section(_("Categories")); 42 | 43 | //---------------------------------------------------------------------- 44 | 45 | // let autoDeleteBox = this.build_switch('auto-deletion', 46 | // _("Delete automatically empty folders")); 47 | let deleteAllBox = this.build_switch('total-deletion', 48 | _("Delete all related settings when an appfolder is deleted")); 49 | let menusBox = this.build_switch('extend-menus', 50 | _("Use the right-click menus in addition to the drag-and-drop")); 51 | 52 | // this.add_row(autoDeleteBox, generalSection); 53 | this.add_row(deleteAllBox, generalSection); 54 | this.add_row(menusBox, generalSection); 55 | 56 | //---------------------------------------------------------------------- 57 | 58 | let categoriesBox = this.build_switch('categories', _("Use categories")); 59 | 60 | let categoriesLinkButton = new Gtk.LinkButton({ 61 | label: _("More informations about \"additional categories\""), 62 | uri: "https://standards.freedesktop.org/menu-spec/latest/apas02.html" 63 | }); 64 | 65 | this.add_row(categoriesBox, categoriesSection); 66 | this.add_row(categoriesLinkButton, categoriesSection); 67 | 68 | //---------------------------------------------------------------------- 69 | 70 | let aboutBox = new Gtk.Box({ 71 | orientation: Gtk.Orientation.HORIZONTAL, 72 | spacing: 10 73 | }); 74 | let about_label = new Gtk.Label({ 75 | label: '(v' + Me.metadata.version.toString() + ')', 76 | halign: Gtk.Align.START 77 | }); 78 | let url_button = new Gtk.LinkButton({ 79 | label: _("Report bugs or ideas"), 80 | uri: Me.metadata.url.toString() 81 | }); 82 | aboutBox.pack_start(url_button, false, false, 0); 83 | aboutBox.pack_end(about_label, false, false, 0); 84 | 85 | this.pack_end(aboutBox, false, false, 0); 86 | 87 | //---------------------------------------------------------------------- 88 | 89 | let desacLabel = new Gtk.Label({ 90 | label: _("This extension can be deactivated once your applications are organized as wished."), 91 | wrap: true, 92 | halign: Gtk.Align.CENTER 93 | }); 94 | this.pack_end(desacLabel, false, false, 0); 95 | }, 96 | 97 | add_section: function (titre) { 98 | let section = new Gtk.Box({ 99 | orientation: Gtk.Orientation.VERTICAL, 100 | margin: 6, 101 | spacing: 6, 102 | }); 103 | 104 | let frame = new Gtk.Frame({ 105 | label: titre, 106 | label_xalign: 0.1, 107 | }); 108 | frame.add(section); 109 | this.add(frame); 110 | return section; 111 | }, 112 | 113 | add_row: function (filledbox, section) { 114 | section.add(filledbox); 115 | }, 116 | 117 | build_switch: function (key, label) { 118 | let rowLabel = new Gtk.Label({ 119 | label: label, 120 | halign: Gtk.Align.START, 121 | wrap: true, 122 | visible: true, 123 | }); 124 | 125 | let rowSwitch = new Gtk.Switch({ valign: Gtk.Align.CENTER }); 126 | rowSwitch.set_state(this._settings.get_boolean(key)); 127 | rowSwitch.connect('notify::active', (widget) => { 128 | this._settings.set_boolean(key, widget.active); 129 | }); 130 | 131 | let rowBox = new Gtk.Box({ 132 | orientation: Gtk.Orientation.HORIZONTAL, 133 | spacing: 15, 134 | margin: 6, 135 | visible: true, 136 | }); 137 | rowBox.pack_start(rowLabel, false, false, 0); 138 | rowBox.pack_end(rowSwitch, false, false, 0); 139 | 140 | return rowBox; 141 | }, 142 | }); 143 | 144 | //------------------------------------------------------------------------------ 145 | 146 | function init() { 147 | Convenience.initTranslations(); 148 | } 149 | 150 | // I guess this is like the "enable" in extension.js : something called each 151 | // time the user tries to access the settings' window 152 | function buildPrefsWidget () { 153 | let widget = new appfoldersManagerSettingsWidget(); 154 | widget.show_all(); 155 | 156 | return widget; 157 | } 158 | 159 | //------------------------------------------------------------------------------ 160 | 161 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/schemas/gschemas.compiled: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maoschanz/appfolders-manager-gnome-extension/ca28768810bd2cf867a7529aa8b580a931946fc5/appfolders-manager@maestroschan.fr/schemas/gschemas.compiled -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/schemas/org.gnome.shell.extensions.appfolders-manager.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | true 6 | Complete deletion of an appfolder 7 | if a deleted appfolder should be 100% deleted (false = restauration is possible) 8 | 9 | 10 | true 11 | Use categories 12 | If the interface for managing categories should be shown. 13 | 14 | 15 | false 16 | Debug key 17 | this is not supposed to be activated by the user 18 | 19 | 20 | true 21 | Show items in right-click menus 22 | The legacy interface, with submenus in the right-click menu on application icons, can be shown in addition to the default drag-and-drop behavior. 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /appfolders-manager@maestroschan.fr/stylesheet.css: -------------------------------------------------------------------------------- 1 | .dropAreaLabel { 2 | font-size: 24px; 3 | font-weight: bold; 4 | } 5 | 6 | .framedArea { 7 | background-color: rgba(255,255,255,0.0); 8 | border-color: rgba(255,255,255,1.0); 9 | border-width: 1px; 10 | color: rgba(255, 255, 255, 1.0); 11 | } 12 | 13 | .shadowedAreaTop { 14 | background-gradient-start: rgba(0, 0, 0, 0.7); 15 | background-gradient-end: rgba(0, 0, 0, 0.1); 16 | background-gradient-direction: vertical; 17 | color: rgba(255, 255, 255, 1.0); 18 | } 19 | 20 | .shadowedAreaBottom { 21 | background-gradient-start: rgba(0, 0, 0, 0.1); 22 | background-gradient-end: rgba(0, 0, 0, 0.7); 23 | background-gradient-direction: vertical; 24 | color: rgba(255, 255, 255, 1.0); 25 | } 26 | 27 | .folderArea { 28 | background-gradient-start: rgba(0, 0, 0, 0.4); 29 | background-gradient-end: rgba(0, 0, 0, 0.0); 30 | background-gradient-direction: vertical; 31 | border-color: rgba(255,255,255,1.0); 32 | border-radius: 4px; 33 | border-width: 2px; 34 | color: rgba(255, 255, 255, 1.0); 35 | } 36 | 37 | .insensitiveArea { 38 | background-color: rgba(0, 0, 0, 0.1); 39 | color: rgba(100, 100, 100, 0.6); 40 | } 41 | 42 | .appCategoryBox { 43 | background-color: rgba(100, 100, 100, 0.3); 44 | border-radius: 3px; 45 | margin: 3px; 46 | padding: 2px; 47 | padding-left: 6px; 48 | } 49 | 50 | .appCategoryDeleteBtn { 51 | background-color: rgba(100, 100, 100, 0.3); 52 | border-radius: 3px; 53 | } 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /build-a-zip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #./update-and-compile-translations.sh --all 4 | 5 | cd appfolders-manager@maestroschan.fr 6 | 7 | glib-compile-schemas ./schemas 8 | 9 | zip ../appfolders-manager@maestroschan.fr.zip *.js 10 | zip ../appfolders-manager@maestroschan.fr.zip *.css 11 | zip ../appfolders-manager@maestroschan.fr.zip *json 12 | 13 | zip -r ../appfolders-manager@maestroschan.fr.zip schemas 14 | zip -r ../appfolders-manager@maestroschan.fr.zip locale 15 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if (( $EUID == 0 )); then 4 | if [ ! -d "/usr/share/gnome-shell/extensions" ]; then 5 | mkdir /usr/share/gnome-shell/extensions 6 | fi 7 | INSTALL_DIR="/usr/share/gnome-shell/extensions" 8 | else 9 | if [ ! -d "$HOME/.local/share/gnome-shell/extensions" ]; then 10 | mkdir $HOME/.local/share/gnome-shell/extensions 11 | fi 12 | INSTALL_DIR="$HOME/.local/share/gnome-shell/extensions" 13 | fi 14 | 15 | echo "Installing extension files in $INSTALL_DIR/appfolders-manager@maestroschan.fr" 16 | cp -r appfolders-manager@maestroschan.fr $INSTALL_DIR 17 | 18 | echo "Done." 19 | exit 0 20 | 21 | -------------------------------------------------------------------------------- /update-and-compile-translations.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | EXTENSION_ID="appfolders-manager@maestroschan.fr" 4 | TRANSLATION_ID="appfolders-manager" 5 | 6 | ##### 7 | 8 | if [ $# = 0 ]; then 9 | echo "No parameter, exiting now." 10 | echo "" 11 | echo "Parameters and options for this script:" 12 | echo " xx update only the language xx, and compile only xx" 13 | echo " --pot update the pot file" 14 | echo " --compile compile all languages (without updating them first)" 15 | echo " --all update all translations files, and compile them all" 16 | echo " --add xx add a .po file for the language xx" 17 | exit 1 18 | fi 19 | 20 | ##### 21 | 22 | function update_pot () { 23 | echo "Generating .pot file..." 24 | xgettext --files-from=POTFILES.in --from-code=UTF-8 --output=$EXTENSION_ID/locale/$TRANSLATION_ID.pot 25 | } 26 | 27 | function update_lang () { 28 | echo "Updating translation for: $1" 29 | msgmerge $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.po $prefix/$TRANSLATION_ID.pot > $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.temp.po 30 | mv $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.temp.po $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.po 31 | } 32 | 33 | function compile_lang () { 34 | echo "Compiling translation for: $1" 35 | msgfmt $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.po -o $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.mo 36 | } 37 | 38 | function create_po () { 39 | mkdir -p $prefix/$1/LC_MESSAGES 40 | touch $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.po 41 | echo "msgid \"\" 42 | msgstr \"\" 43 | \"Project-Id-Version: \\n\" 44 | \"Report-Msgid-Bugs-To: \\n\" 45 | \"POT-Creation-Date: 2019-07-02 18:58+0200\\n\" 46 | \"PO-Revision-Date: 2017-02-05 16:47+0100\\n\" 47 | \"Last-Translator: \\n\" 48 | \"Language-Team: \\n\" 49 | \"Language: $1\\n\" 50 | \"MIME-Version: 1.0\\n\" 51 | \"Content-Type: text/plain; charset=UTF-8\\n\" 52 | \"Content-Transfer-Encoding: 8bit\\n\" 53 | \"X-Generator: \\n\" 54 | \"Plural-Forms: nplurals=2; plural=(n > 1);\\n\" 55 | " > $prefix/$1/LC_MESSAGES/$TRANSLATION_ID.po 56 | update_lang $1 57 | } 58 | 59 | ##### 60 | 61 | IFS=' 62 | ' 63 | liste=`ls ./$EXTENSION_ID/locale/` 64 | prefix="./$EXTENSION_ID/locale" 65 | 66 | ##### 67 | 68 | if [ $1 = "--all" ]; then 69 | update_pot 70 | for lang_id in $liste 71 | do 72 | if [ "$lang_id" != "$TRANSLATION_ID.pot" ]; then 73 | update_lang $lang_id 74 | compile_lang $lang_id 75 | fi 76 | done 77 | elif [ $1 = "--pot" ]; then 78 | update_pot 79 | elif [ $1 = "--compile-only" ]; then 80 | for lang_id in $liste 81 | do 82 | if [ "$lang_id" != "$TRANSLATION_ID.pot" ]; then 83 | compile_lang $lang_id 84 | fi 85 | done 86 | elif [ $1 = "--add" ]; then 87 | create_po $2 88 | else 89 | for lang_id in $@ 90 | do 91 | if [ "$lang_id" != "$TRANSLATION_ID.pot" ]; then 92 | update_lang $lang_id 93 | compile_lang $lang_id 94 | fi 95 | done 96 | fi 97 | 98 | exit 0 99 | 100 | --------------------------------------------------------------------------------