#
This commit is contained in:
@@ -0,0 +1,542 @@
|
||||
// appfolderDialog.js
|
||||
// GPLv3
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const St = imports.gi.St;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const ShellEntry = imports.ui.shellEntry;
|
||||
const Signals = imports.signals;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
const Extension = Me.imports.extension;
|
||||
|
||||
const Gettext = imports.gettext.domain('appfolders-manager');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
let FOLDER_SCHEMA;
|
||||
let FOLDER_LIST;
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
// This is a modal dialog for creating a new folder, or renaming or modifying
|
||||
// categories of existing folders.
|
||||
var AppfolderDialog = class AppfolderDialog {
|
||||
|
||||
// build a new dialog. If folder is null, the dialog will be for creating a new
|
||||
// folder, else app is null, and the dialog will be for editing an existing folder
|
||||
constructor (folder, app, id) {
|
||||
this._folder = folder;
|
||||
this._app = app;
|
||||
this._id = id;
|
||||
this.super_dialog = new ModalDialog.ModalDialog({ destroyOnClose: true });
|
||||
|
||||
FOLDER_SCHEMA = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' });
|
||||
FOLDER_LIST = FOLDER_SCHEMA.get_strv('folder-children');
|
||||
|
||||
let nameSection = this._buildNameSection();
|
||||
let categoriesSection = this._buildCategoriesSection();
|
||||
|
||||
this.super_dialog.contentLayout.style = 'spacing: 20px';
|
||||
this.super_dialog.contentLayout.add(nameSection, {
|
||||
x_fill: false,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START
|
||||
});
|
||||
if ( Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('categories') ) {
|
||||
this.super_dialog.contentLayout.add(categoriesSection, {
|
||||
x_fill: false,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START
|
||||
});
|
||||
}
|
||||
|
||||
if (this._folder == null) {
|
||||
this.super_dialog.setButtons([
|
||||
{ action: this.destroy.bind(this),
|
||||
label: _("Cancel"),
|
||||
key: Clutter.Escape },
|
||||
|
||||
{ action: this._apply.bind(this),
|
||||
label: _("Create"),
|
||||
key: Clutter.Return }
|
||||
]);
|
||||
} else {
|
||||
this.super_dialog.setButtons([
|
||||
{ action: this.destroy.bind(this),
|
||||
label: _("Cancel"),
|
||||
key: Clutter.Escape },
|
||||
|
||||
{ action: this._deleteFolder.bind(this),
|
||||
label: _("Delete"),
|
||||
key: Clutter.Delete },
|
||||
|
||||
{ action: this._apply.bind(this),
|
||||
label: _("Apply"),
|
||||
key: Clutter.Return }
|
||||
]);
|
||||
}
|
||||
|
||||
this._nameEntryText.connect('key-press-event', (o, e) => {
|
||||
let symbol = e.get_key_symbol();
|
||||
|
||||
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
|
||||
this.super_dialog.popModal();
|
||||
this._apply();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// build the section of the UI handling the folder's name and returns it.
|
||||
_buildNameSection () {
|
||||
let nameSection = new St.BoxLayout({
|
||||
style: 'spacing: 5px;',
|
||||
vertical: true,
|
||||
x_expand: true,
|
||||
natural_width_set: true,
|
||||
natural_width: 350,
|
||||
});
|
||||
|
||||
let nameLabel = new St.Label({
|
||||
text: _("Folder's name:"),
|
||||
style: 'font-weight: bold;',
|
||||
});
|
||||
nameSection.add(nameLabel, { y_align: St.Align.START });
|
||||
|
||||
this._nameEntry = new St.Entry({
|
||||
x_expand: true,
|
||||
});
|
||||
this._nameEntryText = null; ///???
|
||||
this._nameEntryText = this._nameEntry.clutter_text;
|
||||
|
||||
nameSection.add(this._nameEntry, { y_align: St.Align.START });
|
||||
ShellEntry.addContextMenu(this._nameEntry);
|
||||
this.super_dialog.setInitialKeyFocus(this._nameEntryText);
|
||||
|
||||
if (this._folder != null) {
|
||||
this._nameEntryText.set_text(this._folder.get_string('name'));
|
||||
}
|
||||
|
||||
return nameSection;
|
||||
}
|
||||
|
||||
// build the section of the UI handling the folder's categories and returns it.
|
||||
_buildCategoriesSection () {
|
||||
let categoriesSection = new St.BoxLayout({
|
||||
style: 'spacing: 5px;',
|
||||
vertical: true,
|
||||
x_expand: true,
|
||||
natural_width_set: true,
|
||||
natural_width: 350,
|
||||
});
|
||||
|
||||
let categoriesLabel = new St.Label({
|
||||
text: _("Categories:"),
|
||||
style: 'font-weight: bold;',
|
||||
});
|
||||
categoriesSection.add(categoriesLabel, {
|
||||
x_fill: false,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START,
|
||||
});
|
||||
|
||||
let categoriesBox = new St.BoxLayout({
|
||||
style: 'spacing: 5px;',
|
||||
vertical: false,
|
||||
x_expand: true,
|
||||
});
|
||||
|
||||
// at the left, how to add categories
|
||||
let addCategoryBox = new St.BoxLayout({
|
||||
style: 'spacing: 5px;',
|
||||
vertical: true,
|
||||
x_expand: true,
|
||||
});
|
||||
|
||||
this._categoryEntry = new St.Entry({
|
||||
can_focus: true,
|
||||
x_expand: true,
|
||||
hint_text: _("Other category?"),
|
||||
secondary_icon: new St.Icon({
|
||||
icon_name: 'list-add-symbolic',
|
||||
icon_size: 16,
|
||||
style_class: 'system-status-icon',
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
}),
|
||||
});
|
||||
ShellEntry.addContextMenu(this._categoryEntry, null);
|
||||
this._categoryEntry.connect('secondary-icon-clicked', this._addCategory.bind(this));
|
||||
|
||||
this._categoryEntryText = null; ///???
|
||||
this._categoryEntryText = this._categoryEntry.clutter_text;
|
||||
this._catSelectButton = new SelectCategoryButton(this);
|
||||
|
||||
addCategoryBox.add(this._catSelectButton.actor, { y_align: St.Align.CENTER });
|
||||
addCategoryBox.add(this._categoryEntry, { y_align: St.Align.START });
|
||||
categoriesBox.add(addCategoryBox, {
|
||||
x_fill: true,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START,
|
||||
});
|
||||
|
||||
// at the right, a list of categories
|
||||
this.listContainer = new St.BoxLayout({
|
||||
vertical: true,
|
||||
x_expand: true,
|
||||
});
|
||||
this.noCatLabel = new St.Label({ text: _("No category") });
|
||||
this.listContainer.add_actor(this.noCatLabel);
|
||||
categoriesBox.add(this.listContainer, {
|
||||
x_fill: true,
|
||||
x_align: St.Align.END,
|
||||
y_align: St.Align.START,
|
||||
});
|
||||
|
||||
categoriesSection.add(categoriesBox, {
|
||||
x_fill: true,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START,
|
||||
});
|
||||
|
||||
// Load categories is necessary even if no this._folder,
|
||||
// because it initializes the value of this._categories
|
||||
this._loadCategories();
|
||||
|
||||
return categoriesSection;
|
||||
}
|
||||
|
||||
open () {
|
||||
this.super_dialog.open();
|
||||
}
|
||||
|
||||
// returns if a folder id already exists
|
||||
_alreadyExists (folderId) {
|
||||
for(var i = 0; i < FOLDER_LIST.length; i++) {
|
||||
if (FOLDER_LIST[i] == folderId) {
|
||||
// this._showError( _("This appfolder already exists.") );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
destroy () {
|
||||
if ( Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('debug') ) {
|
||||
log('[AppfolderDialog v2] destroying dialog');
|
||||
}
|
||||
this._catSelectButton.destroy(); // TODO ?
|
||||
this.super_dialog.destroy(); //XXX crée des erreurs reloues ???
|
||||
}
|
||||
|
||||
// Generates a valid folder id, which as no space, no dot, no slash, and which
|
||||
// doesn't already exist.
|
||||
_folderId (newName) {
|
||||
let tmp0 = newName.split(" ");
|
||||
let folderId = "";
|
||||
for(var i = 0; i < tmp0.length; i++) {
|
||||
folderId += tmp0[i];
|
||||
}
|
||||
tmp0 = folderId.split(".");
|
||||
folderId = "";
|
||||
for(var i = 0; i < tmp0.length; i++) {
|
||||
folderId += tmp0[i];
|
||||
}
|
||||
tmp0 = folderId.split("/");
|
||||
folderId = "";
|
||||
for(var i = 0; i < tmp0.length; i++) {
|
||||
folderId += tmp0[i];
|
||||
}
|
||||
if(this._alreadyExists(folderId)) {
|
||||
folderId = this._folderId(folderId+'_');
|
||||
}
|
||||
return folderId;
|
||||
}
|
||||
|
||||
// creates a folder from the data filled by the user (with no properties)
|
||||
_create () {
|
||||
let folderId = this._folderId(this._nameEntryText.get_text());
|
||||
|
||||
FOLDER_LIST.push(folderId);
|
||||
FOLDER_SCHEMA.set_strv('folder-children', FOLDER_LIST);
|
||||
|
||||
this._folder = new Gio.Settings({
|
||||
schema_id: 'org.gnome.desktop.app-folders.folder',
|
||||
path: '/org/gnome/desktop/app-folders/folders/' + folderId + '/'
|
||||
});
|
||||
// this._folder.set_string('name', this._nameEntryText.get_text()); //superflu
|
||||
// est-il nécessaire d'initialiser la clé apps à [] ??
|
||||
this._addToFolder();
|
||||
}
|
||||
|
||||
// sets the name to the folder
|
||||
_applyName () {
|
||||
let newName = this._nameEntryText.get_text();
|
||||
this._folder.set_string('name', newName); // génère un bug ?
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
// loads categories, as set in gsettings, to the UI
|
||||
_loadCategories () {
|
||||
if (this._folder == null) {
|
||||
this._categories = [];
|
||||
} else {
|
||||
this._categories = this._folder.get_strv('categories');
|
||||
if ((this._categories == null) || (this._categories.length == 0)) {
|
||||
this._categories = [];
|
||||
} else {
|
||||
this.noCatLabel.visible = false;
|
||||
}
|
||||
}
|
||||
this._categoriesButtons = [];
|
||||
for (var i = 0; i < this._categories.length; i++) {
|
||||
this._addCategoryBox(i);
|
||||
}
|
||||
}
|
||||
|
||||
_addCategoryBox (i) {
|
||||
let aCategory = new AppCategoryBox(this, i);
|
||||
this.listContainer.add_actor(aCategory.super_box);
|
||||
}
|
||||
|
||||
// adds a category to the UI (will be added to gsettings when pressing "apply" only)
|
||||
_addCategory (entry, new_cat_name) {
|
||||
if (new_cat_name == null) {
|
||||
new_cat_name = this._categoryEntryText.get_text();
|
||||
}
|
||||
if (this._categories.indexOf(new_cat_name) != -1) {
|
||||
return;
|
||||
}
|
||||
if (new_cat_name == '') {
|
||||
return;
|
||||
}
|
||||
this._categories.push(new_cat_name);
|
||||
this._categoryEntryText.set_text('');
|
||||
this.noCatLabel.visible = false;
|
||||
this._addCategoryBox(this._categories.length-1);
|
||||
}
|
||||
|
||||
// adds all categories to gsettings
|
||||
_applyCategories () {
|
||||
this._folder.set_strv('categories', this._categories);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
// Apply everything by calling methods above, and reload the view
|
||||
_apply () {
|
||||
if (this._app != null) {
|
||||
this._create();
|
||||
// this._addToFolder();
|
||||
}
|
||||
this._applyCategories();
|
||||
this._applyName();
|
||||
this.destroy();
|
||||
//-----------------------
|
||||
Main.overview.viewSelector.appDisplay._views[1].view._redisplay();
|
||||
if ( Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('debug') ) {
|
||||
log('[AppfolderDialog v2] reload the view');
|
||||
}
|
||||
}
|
||||
|
||||
// initializes the folder with its first app. This is not optional since empty
|
||||
// folders are not displayed. TODO use the equivalent method from extension.js
|
||||
_addToFolder () {
|
||||
let content = this._folder.get_strv('apps');
|
||||
content.push(this._app);
|
||||
this._folder.set_strv('apps', content);
|
||||
}
|
||||
|
||||
// Delete the folder, using the extension.js method
|
||||
_deleteFolder () {
|
||||
if (this._folder != null) {
|
||||
Extension.deleteFolder(this._id);
|
||||
}
|
||||
this.destroy();
|
||||
}
|
||||
};
|
||||
|
||||
//------------------------------------------------
|
||||
|
||||
// Very complex way to have a menubutton for displaying a menu with standard
|
||||
// categories. Button part.
|
||||
class SelectCategoryButton {
|
||||
constructor (dialog) {
|
||||
this._dialog = dialog;
|
||||
|
||||
let catSelectBox = new St.BoxLayout({
|
||||
vertical: false,
|
||||
x_expand: true,
|
||||
});
|
||||
let catSelectLabel = new St.Label({
|
||||
text: _("Select a category…"),
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
x_expand: true,
|
||||
});
|
||||
let catSelectIcon = new St.Icon({
|
||||
icon_name: 'pan-down-symbolic',
|
||||
icon_size: 16,
|
||||
style_class: 'system-status-icon',
|
||||
x_expand: false,
|
||||
x_align: Clutter.ActorAlign.END,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
catSelectBox.add(catSelectLabel, { y_align: St.Align.MIDDLE });
|
||||
catSelectBox.add(catSelectIcon, { y_align: St.Align.END });
|
||||
this.actor = new St.Button ({
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
child: catSelectBox,
|
||||
style_class: 'button',
|
||||
style: 'padding: 5px 5px;',
|
||||
x_expand: true,
|
||||
y_expand: false,
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
});
|
||||
this.actor.connect('button-press-event', this._onButtonPress.bind(this));
|
||||
|
||||
this._menu = null;
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
}
|
||||
|
||||
popupMenu () {
|
||||
this.actor.fake_release();
|
||||
if (!this._menu) {
|
||||
this._menu = new SelectCategoryMenu(this, this._dialog);
|
||||
this._menu.super_menu.connect('open-state-changed', (menu, isPoppedUp) => {
|
||||
if (!isPoppedUp) {
|
||||
this.actor.sync_hover();
|
||||
this.emit('menu-state-changed', false);
|
||||
}
|
||||
});
|
||||
this._menuManager.addMenu(this._menu.super_menu);
|
||||
}
|
||||
this.emit('menu-state-changed', true);
|
||||
this.actor.set_hover(true);
|
||||
this._menu.popup();
|
||||
this._menuManager.ignoreRelease();
|
||||
return false;
|
||||
}
|
||||
|
||||
_onButtonPress (actor, event) {
|
||||
this.popupMenu();
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
destroy () {
|
||||
if (this._menu) {
|
||||
this._menu.destroy();
|
||||
}
|
||||
this.actor.destroy();
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(SelectCategoryButton.prototype);
|
||||
|
||||
//------------------------------------------------
|
||||
|
||||
// Very complex way to have a menubutton for displaying a menu with standard
|
||||
// categories. Menu part.
|
||||
class SelectCategoryMenu {
|
||||
constructor (source, dialog) {
|
||||
this.super_menu = new PopupMenu.PopupMenu(source.actor, 0.5, St.Side.RIGHT);
|
||||
this._source = source;
|
||||
this._dialog = dialog;
|
||||
this.super_menu.actor.add_style_class_name('app-well-menu');
|
||||
this._source.actor.connect('destroy', this.super_menu.destroy.bind(this));
|
||||
|
||||
// We want to keep the item hovered while the menu is up //XXX used ??
|
||||
this.super_menu.blockSourceEvents = true;
|
||||
|
||||
Main.uiGroup.add_actor(this.super_menu.actor);
|
||||
|
||||
// This is a really terrible hack to overwrite _redisplay without
|
||||
// actually inheriting from PopupMenu.PopupMenu
|
||||
this.super_menu._redisplay = this._redisplay;
|
||||
this.super_menu._dialog = this._dialog;
|
||||
}
|
||||
|
||||
_redisplay () {
|
||||
this.removeAll();
|
||||
let mainCategories = ['AudioVideo', 'Audio', 'Video', 'Development',
|
||||
'Education', 'Game', 'Graphics', 'Network', 'Office', 'Science',
|
||||
'Settings', 'System', 'Utility'];
|
||||
for (var i=0; i<mainCategories.length; i++) {
|
||||
let labelItem = mainCategories[i] ;
|
||||
let item = new PopupMenu.PopupMenuItem( labelItem );
|
||||
item.connect('activate', () => {
|
||||
this._dialog._addCategory(null, labelItem);
|
||||
});
|
||||
this.addMenuItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
popup (activatingButton) {
|
||||
this.super_menu._redisplay();
|
||||
this.super_menu.open();
|
||||
}
|
||||
|
||||
destroy () {
|
||||
this.super_menu.close(); //FIXME error in the logs but i don't care
|
||||
this.super_menu.destroy();
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(SelectCategoryMenu.prototype);
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
// This custom widget is a deletable row, displaying a category name.
|
||||
class AppCategoryBox {
|
||||
constructor (dialog, i) {
|
||||
this.super_box = new St.BoxLayout({
|
||||
vertical: false,
|
||||
style_class: 'appCategoryBox',
|
||||
});
|
||||
this._dialog = dialog;
|
||||
this.catName = this._dialog._categories[i];
|
||||
this.super_box.add_actor(new St.Label({
|
||||
text: this.catName,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
}));
|
||||
this.super_box.add_actor( new St.BoxLayout({ x_expand: true }) );
|
||||
this.deleteButton = new St.Button({
|
||||
x_expand: false,
|
||||
y_expand: true,
|
||||
style_class: 'appCategoryDeleteBtn',
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
child: new St.Icon({
|
||||
icon_name: 'edit-delete-symbolic',
|
||||
icon_size: 16,
|
||||
style_class: 'system-status-icon',
|
||||
x_expand: false,
|
||||
y_expand: true,
|
||||
style: 'margin: 3px;',
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
}),
|
||||
});
|
||||
this.super_box.add_actor(this.deleteButton);
|
||||
this.deleteButton.connect('clicked', this.removeFromList.bind(this));
|
||||
}
|
||||
|
||||
removeFromList () {
|
||||
this._dialog._categories.splice(this._dialog._categories.indexOf(this.catName), 1);
|
||||
if (this._dialog._categories.length == 0) {
|
||||
this._dialog.noCatLabel.visible = true;
|
||||
}
|
||||
this.destroy();
|
||||
}
|
||||
|
||||
destroy () {
|
||||
this.deleteButton.destroy();
|
||||
this.super_box.destroy();
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -0,0 +1,92 @@
|
||||
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
/*
|
||||
Copyright (c) 2011-2012, Giovanni Campagna <scampa.giovanni@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the GNOME nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
const Gettext = imports.gettext;
|
||||
const Gio = imports.gi.Gio;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
|
||||
/**
|
||||
* initTranslations:
|
||||
* @domain: (optional): the gettext domain to use
|
||||
*
|
||||
* Initialize Gettext to load translations from extensionsdir/locale.
|
||||
* If @domain is not provided, it will be taken from metadata['gettext-domain']
|
||||
*/
|
||||
function initTranslations(domain) {
|
||||
let extension = ExtensionUtils.getCurrentExtension();
|
||||
domain = domain || extension.metadata['gettext-domain'];
|
||||
|
||||
// check if this extension was built with "make zip-file", and thus
|
||||
// has the locale files in a subfolder
|
||||
// otherwise assume that extension has been installed in the
|
||||
// same prefix as gnome-shell
|
||||
let localeDir = extension.dir.get_child('locale');
|
||||
if (localeDir.query_exists(null))
|
||||
Gettext.bindtextdomain(domain, localeDir.get_path());
|
||||
else
|
||||
Gettext.bindtextdomain(domain, Config.LOCALEDIR);
|
||||
}
|
||||
|
||||
/**
|
||||
* getSettings:
|
||||
* @schema: (optional): the GSettings schema id
|
||||
*
|
||||
* Builds and return a GSettings schema for @schema, using schema files
|
||||
* in extensionsdir/schemas. If @schema is not provided, it is taken from
|
||||
* metadata['settings-schema'].
|
||||
*/
|
||||
function getSettings(schema) {
|
||||
let extension = ExtensionUtils.getCurrentExtension();
|
||||
schema = schema || extension.metadata['settings-schema'];
|
||||
|
||||
const GioSSS = Gio.SettingsSchemaSource;
|
||||
|
||||
// check if this extension was built with "make zip-file", and thus
|
||||
// has the schema files in a subfolder
|
||||
// otherwise assume that extension has been installed in the
|
||||
// same prefix as gnome-shell (and therefore schemas are available
|
||||
// in the standard folders)
|
||||
let schemaDir = extension.dir.get_child('schemas');
|
||||
let schemaSource;
|
||||
if (schemaDir.query_exists(null)) {
|
||||
schemaSource = GioSSS.new_from_directory(schemaDir.get_path(),
|
||||
GioSSS.get_default(),
|
||||
false);
|
||||
} else {
|
||||
schemaSource = GioSSS.get_default();
|
||||
}
|
||||
|
||||
let schemaObj = schemaSource.lookup(schema, true);
|
||||
if (!schemaObj)
|
||||
throw new Error('Schema ' + schema + ' could not be found for extension '
|
||||
+ extension.metadata.uuid + '. Please check your installation.');
|
||||
|
||||
return new Gio.Settings({ settings_schema: schemaObj });
|
||||
}
|
||||
|
@@ -0,0 +1,550 @@
|
||||
// dragAndDrop.js
|
||||
// GPLv3
|
||||
|
||||
const DND = imports.ui.dnd;
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const St = imports.gi.St;
|
||||
const Main = imports.ui.main;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
const Extension = Me.imports.extension;
|
||||
|
||||
const CHANGE_PAGE_TIMEOUT = 400;
|
||||
|
||||
const Gettext = imports.gettext.domain('appfolders-manager');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
//-------------------------------------------------
|
||||
|
||||
var OVERLAY_MANAGER;
|
||||
|
||||
/* This method is called by extension.js' enable function. It does code injections
|
||||
* to AppDisplay.AppIcon, connecting it to DND-related signals.
|
||||
*/
|
||||
function initDND () {
|
||||
OVERLAY_MANAGER = new OverlayManager();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
/* Amazing! A singleton! It allows easy (and safer?) access to general methods,
|
||||
* managing other objects: it creates/updates/deletes all overlays (for folders,
|
||||
* pages, creation, removing).
|
||||
*/
|
||||
class OverlayManager {
|
||||
constructor () {
|
||||
this.addActions = [];
|
||||
this.removeAction = new FolderActionArea('remove');
|
||||
this.createAction = new FolderActionArea('create');
|
||||
this.upAction = new NavigationArea('up');
|
||||
this.downAction = new NavigationArea('down');
|
||||
|
||||
this.next_drag_should_recompute = true;
|
||||
this.current_width = 0;
|
||||
}
|
||||
|
||||
on_drag_begin () {
|
||||
this.ensurePopdowned();
|
||||
this.ensureFolderOverlayActors();
|
||||
this.updateFoldersVisibility();
|
||||
this.updateState(true);
|
||||
}
|
||||
|
||||
on_drag_end () {
|
||||
// force to compute new positions if a drop occurs
|
||||
this.next_drag_should_recompute = true;
|
||||
this.updateState(false);
|
||||
}
|
||||
|
||||
on_drag_cancelled () {
|
||||
this.updateState(false);
|
||||
}
|
||||
|
||||
updateArrowVisibility () {
|
||||
let grid = Main.overview.viewSelector.appDisplay._views[1].view._grid;
|
||||
if (grid.currentPage == 0) {
|
||||
this.upAction.setActive(false);
|
||||
} else {
|
||||
this.upAction.setActive(true);
|
||||
}
|
||||
if (grid.currentPage == grid._nPages -1) {
|
||||
this.downAction.setActive(false);
|
||||
} else {
|
||||
this.downAction.setActive(true);
|
||||
}
|
||||
this.upAction.show();
|
||||
this.downAction.show();
|
||||
}
|
||||
|
||||
updateState (isDragging) {
|
||||
if (isDragging) {
|
||||
this.removeAction.show();
|
||||
if (this.openedFolder == null) {
|
||||
this.removeAction.setActive(false);
|
||||
} else {
|
||||
this.removeAction.setActive(true);
|
||||
}
|
||||
this.createAction.show();
|
||||
this.updateArrowVisibility();
|
||||
} else {
|
||||
this.hideAll();
|
||||
}
|
||||
}
|
||||
|
||||
hideAll () {
|
||||
this.removeAction.hide();
|
||||
this.createAction.hide();
|
||||
this.upAction.hide();
|
||||
this.downAction.hide();
|
||||
this.hideAllFolders();
|
||||
}
|
||||
|
||||
hideAllFolders () {
|
||||
for (var i = 0; i < this.addActions.length; i++) {
|
||||
this.addActions[i].hide();
|
||||
}
|
||||
}
|
||||
|
||||
updateActorsPositions () {
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
this.topOfTheGrid = Main.overview.viewSelector.actor.get_parent().get_parent().get_allocation_box().y1;
|
||||
let temp = Main.overview.viewSelector.appDisplay._views[1].view.actor.get_parent();
|
||||
let bottomOfTheGrid = this.topOfTheGrid + temp.get_allocation_box().y2;
|
||||
|
||||
let _availHeight = bottomOfTheGrid - this.topOfTheGrid;
|
||||
let _availWidth = Main.overview.viewSelector.appDisplay._views[1].view._grid.actor.width;
|
||||
let sideMargin = (monitor.width - _availWidth) / 2;
|
||||
|
||||
let xMiddle = ( monitor.x + monitor.width ) / 2;
|
||||
let yMiddle = ( monitor.y + monitor.height ) / 2;
|
||||
|
||||
// Positions of areas
|
||||
this.removeAction.setPosition( xMiddle , bottomOfTheGrid );
|
||||
this.createAction.setPosition( xMiddle, Main.overview._panelGhost.height );
|
||||
this.upAction.setPosition( 0, Main.overview._panelGhost.height );
|
||||
this.downAction.setPosition( 0, bottomOfTheGrid );
|
||||
|
||||
// Sizes of areas
|
||||
this.removeAction.setSize(xMiddle, monitor.height - bottomOfTheGrid);
|
||||
this.createAction.setSize(xMiddle, this.topOfTheGrid - Main.overview._panelGhost.height);
|
||||
this.upAction.setSize(xMiddle, this.topOfTheGrid - Main.overview._panelGhost.height);
|
||||
this.downAction.setSize(xMiddle, monitor.height - bottomOfTheGrid);
|
||||
|
||||
this.updateArrowVisibility();
|
||||
}
|
||||
|
||||
ensureFolderOverlayActors () {
|
||||
// A folder was opened, and just closed.
|
||||
if (this.openedFolder != null) {
|
||||
this.updateActorsPositions();
|
||||
this.computeFolderOverlayActors();
|
||||
this.next_drag_should_recompute = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// The grid "moved" or the whole shit needs forced updating
|
||||
let allAppsGrid = Main.overview.viewSelector.appDisplay._views[1].view._grid;
|
||||
let new_width = allAppsGrid.actor.allocation.get_width();
|
||||
if (new_width != this.current_width || this.next_drag_should_recompute) {
|
||||
this.next_drag_should_recompute = false;
|
||||
this.updateActorsPositions();
|
||||
this.computeFolderOverlayActors();
|
||||
}
|
||||
}
|
||||
|
||||
computeFolderOverlayActors () {
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
let xMiddle = ( monitor.x + monitor.width ) / 2;
|
||||
let yMiddle = ( monitor.y + monitor.height ) / 2;
|
||||
let allAppsGrid = Main.overview.viewSelector.appDisplay._views[1].view._grid;
|
||||
|
||||
let nItems = 0;
|
||||
let indexes = [];
|
||||
let folders = [];
|
||||
let x, y;
|
||||
|
||||
Main.overview.viewSelector.appDisplay._views[1].view._allItems.forEach(function(icon) {
|
||||
if (icon.actor.visible) {
|
||||
if (icon instanceof AppDisplay.FolderIcon) {
|
||||
indexes.push(nItems);
|
||||
folders.push(icon);
|
||||
}
|
||||
nItems++;
|
||||
}
|
||||
});
|
||||
|
||||
this.current_width = allAppsGrid.actor.allocation.get_width();
|
||||
let x_correction = (monitor.width - this.current_width)/2;
|
||||
let availHeightPerPage = (allAppsGrid.actor.height)/(allAppsGrid._nPages);
|
||||
|
||||
for (var i = 0; i < this.addActions.length; i++) {
|
||||
this.addActions[i].actor.destroy();
|
||||
}
|
||||
|
||||
for (var i = 0; i < indexes.length; i++) {
|
||||
let inPageIndex = indexes[i] % allAppsGrid._childrenPerPage;
|
||||
let page = Math.floor(indexes[i] / allAppsGrid._childrenPerPage);
|
||||
x = folders[i].actor.get_allocation_box().x1;
|
||||
y = folders[i].actor.get_allocation_box().y1;
|
||||
|
||||
// Invalid coords (example: when dragging out of the folder) should
|
||||
// not produce a visible overlay, a negative page number is an easy
|
||||
// way to be sure it stays hidden.
|
||||
if (x == 0) {
|
||||
page = -1;
|
||||
}
|
||||
x = Math.floor(x + x_correction);
|
||||
y = y + this.topOfTheGrid;
|
||||
y = y - (page * availHeightPerPage);
|
||||
|
||||
this.addActions[i] = new FolderArea(folders[i].id, x, y, page);
|
||||
}
|
||||
}
|
||||
|
||||
updateFoldersVisibility () {
|
||||
let appView = Main.overview.viewSelector.appDisplay._views[1].view;
|
||||
for (var i = 0; i < this.addActions.length; i++) {
|
||||
if ((this.addActions[i].page == appView._grid.currentPage) && (!appView._currentPopup)) {
|
||||
this.addActions[i].show();
|
||||
} else {
|
||||
this.addActions[i].hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ensurePopdowned () {
|
||||
let appView = Main.overview.viewSelector.appDisplay._views[1].view;
|
||||
if (appView._currentPopup) {
|
||||
this.openedFolder = appView._currentPopup._source.id;
|
||||
appView._currentPopup.popdown();
|
||||
} else {
|
||||
this.openedFolder = null;
|
||||
}
|
||||
}
|
||||
|
||||
goToPage (nb) {
|
||||
Main.overview.viewSelector.appDisplay._views[1].view.goToPage( nb );
|
||||
this.updateArrowVisibility();
|
||||
this.hideAllFolders();
|
||||
this.updateFoldersVisibility(); //load folders of the new page
|
||||
}
|
||||
|
||||
destroy () {
|
||||
for (let i = 0; i > this.addActions.length; i++) {
|
||||
this.addActions[i].destroy();
|
||||
}
|
||||
this.removeAction.destroy();
|
||||
this.createAction.destroy();
|
||||
this.upAction.destroy();
|
||||
this.downAction.destroy();
|
||||
//log('OverlayManager destroyed');
|
||||
}
|
||||
};
|
||||
|
||||
//-------------------------------------------------------
|
||||
|
||||
// Abstract overlay with very generic methods
|
||||
class DroppableArea {
|
||||
|
||||
constructor (id) {
|
||||
this.id = id;
|
||||
this.styleClass = 'folderArea';
|
||||
|
||||
this.actor = new St.BoxLayout ({
|
||||
width: 10,
|
||||
height: 10,
|
||||
visible: false,
|
||||
});
|
||||
this.actor._delegate = this;
|
||||
|
||||
this.lock = true;
|
||||
this.use_frame = Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('debug');
|
||||
}
|
||||
|
||||
setPosition (x, y) {
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
this.actor.set_position(monitor.x + x, monitor.y + y);
|
||||
}
|
||||
|
||||
setSize (w, h) {
|
||||
this.actor.width = w;
|
||||
this.actor.height = h;
|
||||
}
|
||||
|
||||
hide () {
|
||||
this.actor.visible = false;
|
||||
this.lock = true;
|
||||
}
|
||||
|
||||
show () {
|
||||
this.actor.visible = true;
|
||||
}
|
||||
|
||||
setActive (active) {
|
||||
this._active = active;
|
||||
if (this._active) {
|
||||
this.actor.style_class = this.styleClass;
|
||||
} else {
|
||||
this.actor.style_class = 'insensitiveArea';
|
||||
}
|
||||
}
|
||||
|
||||
destroy () {
|
||||
this.actor.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
/* Overlay representing an "action". Actions can be creating a folder, or
|
||||
* removing an app from a folder. These areas accept drop, and display a label.
|
||||
*/
|
||||
class FolderActionArea extends DroppableArea {
|
||||
constructor (id) {
|
||||
super(id);
|
||||
|
||||
let x, y, label;
|
||||
|
||||
switch (this.id) {
|
||||
case 'create':
|
||||
label = _("Create a new folder");
|
||||
this.styleClass = 'shadowedAreaTop';
|
||||
break;
|
||||
case 'remove':
|
||||
label = '';
|
||||
this.styleClass = 'shadowedAreaBottom';
|
||||
break;
|
||||
default:
|
||||
label = 'invalid id';
|
||||
break;
|
||||
}
|
||||
if (this.use_frame) {
|
||||
this.styleClass = 'framedArea';
|
||||
}
|
||||
this.actor.style_class = this.styleClass;
|
||||
|
||||
this.label = new St.Label({
|
||||
text: label,
|
||||
style_class: 'dropAreaLabel',
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
this.actor.add(this.label);
|
||||
|
||||
this.setPosition(10, 10);
|
||||
Main.layoutManager.overviewGroup.add_actor(this.actor);
|
||||
}
|
||||
|
||||
getRemoveLabel () {
|
||||
let label;
|
||||
if (OVERLAY_MANAGER.openedFolder == null) {
|
||||
label = '…';
|
||||
} else {
|
||||
let folder_schema = Extension.folderSchema (OVERLAY_MANAGER.openedFolder);
|
||||
label = folder_schema.get_string('name');
|
||||
}
|
||||
return (_("Remove from %s")).replace('%s', label);
|
||||
}
|
||||
|
||||
setActive (active) {
|
||||
super.setActive(active);
|
||||
if (this.id == 'remove') {
|
||||
this.label.text = this.getRemoveLabel();
|
||||
}
|
||||
}
|
||||
|
||||
handleDragOver (source, actor, x, y, time) {
|
||||
if (source instanceof AppDisplay.AppIcon && this._active) {
|
||||
return DND.DragMotionResult.MOVE_DROP;
|
||||
}
|
||||
Main.overview.endItemDrag(this);
|
||||
return DND.DragMotionResult.NO_DROP;
|
||||
}
|
||||
|
||||
acceptDrop (source, actor, x, y, time) {
|
||||
if ((source instanceof AppDisplay.AppIcon) && (this.id == 'create')) {
|
||||
Extension.createNewFolder(source);
|
||||
Main.overview.endItemDrag(this);
|
||||
return true;
|
||||
}
|
||||
if ((source instanceof AppDisplay.AppIcon) && (this.id == 'remove')) {
|
||||
this.removeApp(source);
|
||||
Main.overview.endItemDrag(this);
|
||||
return true;
|
||||
}
|
||||
Main.overview.endItemDrag(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
removeApp (source) {
|
||||
let id = source.app.get_id();
|
||||
Extension.removeFromFolder(id, OVERLAY_MANAGER.openedFolder);
|
||||
OVERLAY_MANAGER.updateState(false);
|
||||
Main.overview.viewSelector.appDisplay._views[1].view._redisplay();
|
||||
}
|
||||
|
||||
destroy () {
|
||||
this.label.destroy();
|
||||
super.destroy();
|
||||
}
|
||||
};
|
||||
|
||||
/* Overlay reacting to hover, but isn't droppable. The goal is to go to an other
|
||||
* page of the grid while dragging an app.
|
||||
*/
|
||||
class NavigationArea extends DroppableArea {
|
||||
constructor (id) {
|
||||
super(id);
|
||||
|
||||
let x, y, i;
|
||||
switch (this.id) {
|
||||
case 'up':
|
||||
i = 'pan-up-symbolic';
|
||||
this.styleClass = 'shadowedAreaTop';
|
||||
break;
|
||||
case 'down':
|
||||
i = 'pan-down-symbolic';
|
||||
this.styleClass = 'shadowedAreaBottom';
|
||||
break;
|
||||
default:
|
||||
i = 'dialog-error-symbolic';
|
||||
break;
|
||||
}
|
||||
if (this.use_frame) {
|
||||
this.styleClass = 'framedArea';
|
||||
}
|
||||
this.actor.style_class = this.styleClass;
|
||||
|
||||
this.actor.add(new St.Icon({
|
||||
icon_name: i,
|
||||
icon_size: 24,
|
||||
style_class: 'system-status-icon',
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
}));
|
||||
|
||||
this.setPosition(x, y);
|
||||
Main.layoutManager.overviewGroup.add_actor(this.actor);
|
||||
}
|
||||
|
||||
handleDragOver (source, actor, x, y, time) {
|
||||
if (this.id == 'up' && this._active) {
|
||||
this.pageUp();
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
}
|
||||
|
||||
if (this.id == 'down' && this._active) {
|
||||
this.pageDown();
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
}
|
||||
|
||||
Main.overview.endItemDrag(this);
|
||||
return DND.DragMotionResult.NO_DROP;
|
||||
}
|
||||
|
||||
pageUp () {
|
||||
if(this.lock && !this.timeoutSet) {
|
||||
this._timeoutId = Mainloop.timeout_add(CHANGE_PAGE_TIMEOUT, this.unlock.bind(this));
|
||||
this.timeoutSet = true;
|
||||
}
|
||||
if(!this.lock) {
|
||||
let currentPage = Main.overview.viewSelector.appDisplay._views[1].view._grid.currentPage;
|
||||
this.lock = true;
|
||||
OVERLAY_MANAGER.goToPage(currentPage - 1);
|
||||
}
|
||||
}
|
||||
|
||||
pageDown () {
|
||||
if(this.lock && !this.timeoutSet) {
|
||||
this._timeoutId = Mainloop.timeout_add(CHANGE_PAGE_TIMEOUT, this.unlock.bind(this));
|
||||
this.timeoutSet = true;
|
||||
}
|
||||
if(!this.lock) {
|
||||
let currentPage = Main.overview.viewSelector.appDisplay._views[1].view._grid.currentPage;
|
||||
this.lock = true;
|
||||
OVERLAY_MANAGER.goToPage(currentPage + 1);
|
||||
}
|
||||
}
|
||||
|
||||
acceptDrop (source, actor, x, y, time) {
|
||||
Main.overview.endItemDrag(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
unlock () {
|
||||
this.lock = false;
|
||||
this.timeoutSet = false;
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
}
|
||||
};
|
||||
|
||||
/* This overlay is the area upon a folder. Position and visibility of the actor
|
||||
* is handled by exterior functions.
|
||||
* "this.id" is the folder's id, a string, as written in the gsettings key.
|
||||
* Dropping an app on this folder will add it to the folder
|
||||
*/
|
||||
class FolderArea extends DroppableArea {
|
||||
constructor (id, asked_x, asked_y, page) {
|
||||
super(id);
|
||||
this.page = page;
|
||||
|
||||
let grid = Main.overview.viewSelector.appDisplay._views[1].view._grid;
|
||||
this.actor.width = grid._getHItemSize();
|
||||
this.actor.height = grid._getVItemSize();
|
||||
|
||||
if (this.use_frame) {
|
||||
this.styleClass = 'framedArea';
|
||||
this.actor.add(new St.Label({
|
||||
text: this.id,
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
}));
|
||||
} else {
|
||||
this.styleClass = 'folderArea';
|
||||
this.actor.add(new St.Icon({
|
||||
icon_name: 'list-add-symbolic',
|
||||
icon_size: 24,
|
||||
style_class: 'system-status-icon',
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
}));
|
||||
}
|
||||
if (this.use_frame) {
|
||||
this.styleClass = 'framedArea';
|
||||
}
|
||||
this.actor.style_class = this.styleClass;
|
||||
|
||||
this.setPosition(asked_x, asked_y);
|
||||
Main.layoutManager.overviewGroup.add_actor(this.actor);
|
||||
}
|
||||
|
||||
handleDragOver (source, actor, x, y, time) {
|
||||
if (source instanceof AppDisplay.AppIcon) {
|
||||
return DND.DragMotionResult.MOVE_DROP;
|
||||
}
|
||||
Main.overview.endItemDrag(this);
|
||||
return DND.DragMotionResult.NO_DROP;
|
||||
}
|
||||
|
||||
acceptDrop (source, actor, x, y, time) { //FIXME recharger la vue ou au minimum les miniatures des dossiers
|
||||
if ((source instanceof AppDisplay.AppIcon) &&
|
||||
!Extension.isInFolder(source.id, this.id)) {
|
||||
Extension.addToFolder(source, this.id);
|
||||
Main.overview.endItemDrag(this);
|
||||
return true;
|
||||
}
|
||||
Main.overview.endItemDrag(this);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
@@ -0,0 +1,445 @@
|
||||
// extension.js
|
||||
// GPLv3
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const St = imports.gi.St;
|
||||
const Main = imports.ui.main;
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const AppfolderDialog = Me.imports.appfolderDialog;
|
||||
const DragAndDrop = Me.imports.dragAndDrop;
|
||||
|
||||
const Gettext = imports.gettext.domain('appfolders-manager');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
let FOLDER_SCHEMA;
|
||||
let FOLDER_LIST;
|
||||
|
||||
let INIT_TIME;
|
||||
|
||||
function init () {
|
||||
Convenience.initTranslations();
|
||||
INIT_TIME = getTimeStamp();
|
||||
}
|
||||
|
||||
function getTimeStamp () {
|
||||
let today = new Date();
|
||||
let str = today.getDate() + '' + today.getHours() + '' + today.getMinutes()
|
||||
+ '' + today.getSeconds();
|
||||
return parseInt(str);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/* do not edit this section */
|
||||
|
||||
function injectToFunction(parent, name, func) {
|
||||
let origin = parent[name];
|
||||
parent[name] = function() {
|
||||
let ret;
|
||||
ret = origin.apply(this, arguments);
|
||||
if (ret === undefined)
|
||||
ret = func.apply(this, arguments);
|
||||
return ret;
|
||||
}
|
||||
return origin;
|
||||
}
|
||||
|
||||
function removeInjection(object, injection, name) {
|
||||
if (injection[name] === undefined)
|
||||
delete object[name];
|
||||
else
|
||||
object[name] = injection[name];
|
||||
}
|
||||
|
||||
var injections=[];
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/* this function injects items (1 or 2 submenus) in AppIconMenu's _redisplay method. */
|
||||
function injectionInAppsMenus() {
|
||||
injections['_redisplay'] = injectToFunction(AppDisplay.AppIconMenu.prototype, '_redisplay', function() {
|
||||
if (Main.overview.viewSelector.getActivePage() == 2
|
||||
|| Main.overview.viewSelector.getActivePage() == 3) {
|
||||
//ok
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
this._appendSeparator(); //TODO injecter ailleurs dans le menu?
|
||||
|
||||
let mainAppView = Main.overview.viewSelector.appDisplay._views[1].view;
|
||||
FOLDER_LIST = FOLDER_SCHEMA.get_strv('folder-children');
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
||||
let addto = new PopupMenu.PopupSubMenuMenuItem(_("Add to"));
|
||||
|
||||
let newAppFolder = new PopupMenu.PopupMenuItem('+ ' + _("New AppFolder"));
|
||||
newAppFolder.connect('activate', () => {
|
||||
this._source._menuManager._grabHelper.ungrab({ actor: this.actor });
|
||||
// XXX broken scrolling ??
|
||||
// We can't popdown the folder immediately because the
|
||||
// AppDisplay.AppFolderPopup.popdown() method tries to ungrab
|
||||
// the global focus from the folder's popup actor, which isn't
|
||||
// having the focus since the menu is still open. Menus' animation
|
||||
// last ~0.25s so we will wait 0.30s before doing anything.
|
||||
let a = Mainloop.timeout_add(300, () => {
|
||||
if (mainAppView._currentPopup) {
|
||||
mainAppView._currentPopup.popdown();
|
||||
}
|
||||
createNewFolder(this._source);
|
||||
mainAppView._redisplay();
|
||||
Mainloop.source_remove(a);
|
||||
});
|
||||
});
|
||||
addto.menu.addMenuItem(newAppFolder);
|
||||
|
||||
for (var i = 0 ; i < FOLDER_LIST.length ; i++) {
|
||||
let _folder = FOLDER_LIST[i];
|
||||
let shouldShow = !isInFolder( this._source.app.get_id(), _folder );
|
||||
let iFolderSchema = folderSchema(_folder);
|
||||
let item = new PopupMenu.PopupMenuItem( AppDisplay._getFolderName(iFolderSchema) );
|
||||
if ( Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('debug') ) {
|
||||
shouldShow = true; //TODO ??? et l'exclusion ?
|
||||
}
|
||||
if(shouldShow) {
|
||||
item.connect('activate', () => {
|
||||
this._source._menuManager._grabHelper.ungrab({ actor: this.actor });
|
||||
// XXX broken scrolling ??
|
||||
// We can't popdown the folder immediatly because the
|
||||
// AppDisplay.AppFolderPopup.popdown() method tries to
|
||||
// ungrab the global focus from the folder's popup actor,
|
||||
// which isn't having the focus since the menu is still
|
||||
// open. Menus' animation last ~0.25s so we will wait 0.30s
|
||||
// before doing anything.
|
||||
let a = Mainloop.timeout_add(300, () => {
|
||||
if (mainAppView._currentPopup) {
|
||||
mainAppView._currentPopup.popdown();
|
||||
}
|
||||
addToFolder(this._source, _folder);
|
||||
mainAppView._redisplay();
|
||||
Mainloop.source_remove(a);
|
||||
});
|
||||
});
|
||||
addto.menu.addMenuItem(item);
|
||||
}
|
||||
}
|
||||
this.addMenuItem(addto);
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
let removeFrom = new PopupMenu.PopupSubMenuMenuItem(_("Remove from"));
|
||||
let shouldShow2 = false;
|
||||
for (var i = 0 ; i < FOLDER_LIST.length ; i++) {
|
||||
let _folder = FOLDER_LIST[i];
|
||||
let appId = this._source.app.get_id();
|
||||
let shouldShow = isInFolder(appId, _folder);
|
||||
let iFolderSchema = folderSchema(_folder);
|
||||
let item = new PopupMenu.PopupMenuItem( AppDisplay._getFolderName(iFolderSchema) );
|
||||
|
||||
if ( Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('debug') ) {
|
||||
shouldShow = true; //FIXME ??? et l'exclusion ?
|
||||
}
|
||||
|
||||
if(shouldShow) {
|
||||
item.connect('activate', () => {
|
||||
this._source._menuManager._grabHelper.ungrab({ actor: this.actor });
|
||||
// XXX broken scrolling ??
|
||||
// We can't popdown the folder immediatly because the
|
||||
// AppDisplay.AppFolderPopup.popdown() method tries to
|
||||
// ungrab the global focus from the folder's popup actor,
|
||||
// which isn't having the focus since the menu is still
|
||||
// open. Menus' animation last ~0.25s so we will wait 0.30s
|
||||
// before doing anything.
|
||||
let a = Mainloop.timeout_add(300, () => {
|
||||
if (mainAppView._currentPopup) {
|
||||
mainAppView._currentPopup.popdown();
|
||||
}
|
||||
removeFromFolder(appId, _folder);
|
||||
mainAppView._redisplay();
|
||||
Mainloop.source_remove(a);
|
||||
});
|
||||
});
|
||||
removeFrom.menu.addMenuItem(item);
|
||||
shouldShow2 = true;
|
||||
}
|
||||
}
|
||||
if (shouldShow2) {
|
||||
this.addMenuItem(removeFrom);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//------------------------------------------------
|
||||
|
||||
function injectionInIcons() {
|
||||
// Right-click on a FolderIcon launches a new AppfolderDialog
|
||||
AppDisplay.FolderIcon = class extends AppDisplay.FolderIcon {
|
||||
constructor (id, path, parentView) {
|
||||
super(id, path, parentView);
|
||||
if (!this.isCustom) {
|
||||
this.actor.connect('button-press-event', this._onButtonPress.bind(this));
|
||||
}
|
||||
this.isCustom = true;
|
||||
}
|
||||
|
||||
_onButtonPress (actor, event) {
|
||||
let button = event.get_button();
|
||||
if (button == 3) {
|
||||
let tmp = new Gio.Settings({
|
||||
schema_id: 'org.gnome.desktop.app-folders.folder',
|
||||
path: '/org/gnome/desktop/app-folders/folders/' + this.id + '/'
|
||||
});
|
||||
let dialog = new AppfolderDialog.AppfolderDialog(tmp, null, this.id);
|
||||
dialog.open();
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
};
|
||||
|
||||
// Dragging an AppIcon triggers the DND mode
|
||||
AppDisplay.AppIcon = class extends AppDisplay.AppIcon {
|
||||
constructor (app, params) {
|
||||
super(app, params);
|
||||
if (!this.isCustom) {
|
||||
this._draggable.connect('drag-begin', this.onDragBeginExt.bind(this));
|
||||
this._draggable.connect('drag-cancelled', this.onDragCancelledExt.bind(this));
|
||||
this._draggable.connect('drag-end', this.onDragEndExt.bind(this));
|
||||
}
|
||||
this.isCustom = true;
|
||||
}
|
||||
|
||||
onDragBeginExt () {
|
||||
if (Main.overview.viewSelector.getActivePage() != 2) {
|
||||
return;
|
||||
}
|
||||
this._removeMenuTimeout(); // why ?
|
||||
Main.overview.beginItemDrag(this);
|
||||
DragAndDrop.OVERLAY_MANAGER.on_drag_begin();
|
||||
}
|
||||
|
||||
onDragEndExt () {
|
||||
Main.overview.endItemDrag(this);
|
||||
DragAndDrop.OVERLAY_MANAGER.on_drag_end();
|
||||
}
|
||||
|
||||
onDragCancelledExt () {
|
||||
Main.overview.cancelledItemDrag(this);
|
||||
DragAndDrop.OVERLAY_MANAGER.on_drag_cancelled();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//---------------------------------- Generic -----------------------------------
|
||||
//--------------------------------- functions ----------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
/* These functions perform the requested actions but do not care about popdowning
|
||||
* open menu/open folder, nor about hiding/showing/activating dropping areas, nor
|
||||
* about redisplaying the view.
|
||||
*/
|
||||
function removeFromFolder (app_id, folder_id) {
|
||||
let folder_schema = folderSchema(folder_id);
|
||||
if ( isInFolder(app_id, folder_id) ) {
|
||||
let pastContent = folder_schema.get_strv('apps');
|
||||
let presentContent = [];
|
||||
for(var i=0; i<pastContent.length; i++){
|
||||
if(pastContent[i] != app_id) {
|
||||
presentContent.push(pastContent[i]);
|
||||
}
|
||||
}
|
||||
folder_schema.set_strv('apps', presentContent);
|
||||
} else {
|
||||
let content = folder_schema.get_strv('excluded-apps');
|
||||
content.push(app_id);
|
||||
folder_schema.set_strv('excluded-apps', content);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
function deleteFolder (folder_id) {
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||
let tmp = [];
|
||||
FOLDER_LIST = FOLDER_SCHEMA.get_strv('folder-children');
|
||||
for(var j=0;j < FOLDER_LIST.length;j++){
|
||||
if(FOLDER_LIST[j] != folder_id) {
|
||||
tmp.push(FOLDER_LIST[j]);
|
||||
}
|
||||
}
|
||||
|
||||
FOLDER_LIST = tmp;
|
||||
FOLDER_SCHEMA.set_strv('folder-children', FOLDER_LIST);
|
||||
|
||||
// ?? XXX (ne fonctionne pas mieux hors du meta.later_add)
|
||||
if ( Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('total-deletion') ) {
|
||||
let folder_schema = folderSchema (folder_id);
|
||||
folder_schema.reset('apps'); // génère un bug volumineux ?
|
||||
folder_schema.reset('categories'); // génère un bug volumineux ?
|
||||
folder_schema.reset('excluded-apps'); // génère un bug volumineux ?
|
||||
folder_schema.reset('name'); // génère un bug volumineux ?
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
function mergeFolders (folder_staying_id, folder_dying_id) { //unused XXX
|
||||
|
||||
let folder_dying_schema = folderSchema (folder_dying_id);
|
||||
let folder_staying_schema = folderSchema (folder_staying_id);
|
||||
let newerContent = folder_dying_schema.get_strv('categories');
|
||||
let presentContent = folder_staying_schema.get_strv('categories');
|
||||
for(var i=0;i<newerContent.length;i++){
|
||||
if(presentContent.indexOf(newerContent[i]) == -1) {
|
||||
presentContent.push(newerContent[i]);
|
||||
}
|
||||
}
|
||||
folder_staying_schema.set_strv('categories', presentContent);
|
||||
|
||||
newerContent = folder_dying_schema.get_strv('excluded-apps');
|
||||
presentContent = folder_staying_schema.get_strv('excluded-apps');
|
||||
for(var i=0;i<newerContent.length;i++){
|
||||
if(presentContent.indexOf(newerContent[i]) == -1) {
|
||||
presentContent.push(newerContent[i]);
|
||||
}
|
||||
}
|
||||
folder_staying_schema.set_strv('excluded-apps', presentContent);
|
||||
|
||||
newerContent = folder_dying_schema.get_strv('apps');
|
||||
presentContent = folder_staying_schema.get_strv('apps');
|
||||
for(var i=0;i<newerContent.length;i++){
|
||||
if(presentContent.indexOf(newerContent[i]) == -1) {
|
||||
// if(!isInFolder(newerContent[i], folder_staying_id)) {
|
||||
presentContent.push(newerContent[i]);
|
||||
//TODO utiliser addToFolder malgré ses paramètres chiants
|
||||
}
|
||||
}
|
||||
folder_staying_schema.set_strv('apps', presentContent);
|
||||
deleteFolder(folder_dying_id);
|
||||
return true;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
function createNewFolder (app_source) {
|
||||
let id = app_source.app.get_id();
|
||||
|
||||
let dialog = new AppfolderDialog.AppfolderDialog(null , id);
|
||||
dialog.open();
|
||||
return true;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
function addToFolder (app_source, folder_id) {
|
||||
let id = app_source.app.get_id();
|
||||
let folder_schema = folderSchema (folder_id);
|
||||
|
||||
//un-exclude the application if it was excluded TODO else don't do it at all
|
||||
let pastExcluded = folder_schema.get_strv('excluded-apps');
|
||||
let presentExcluded = [];
|
||||
for(let i=0; i<pastExcluded.length; i++){
|
||||
if(pastExcluded[i] != id) {
|
||||
presentExcluded.push(pastExcluded[i]);
|
||||
}
|
||||
}
|
||||
if (presentExcluded.length > 0) {
|
||||
folder_schema.set_strv('excluded-apps', presentExcluded);
|
||||
}
|
||||
|
||||
//actually add the app
|
||||
let content = folder_schema.get_strv('apps');
|
||||
content.push(id);
|
||||
folder_schema.set_strv('apps', content); //XXX verbose errors
|
||||
|
||||
//update icons in the ugliest possible way
|
||||
let icons = Main.overview.viewSelector.appDisplay._views[1].view.folderIcons;
|
||||
for (let i=0; i<icons.length; i++) {
|
||||
let size = icons[i].icon._iconBin.width;
|
||||
icons[i].icon.icon = icons[i]._createIcon(size);
|
||||
icons[i].icon._iconBin.child = icons[i].icon.icon;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
function isInFolder (app_id, folder_id) {
|
||||
let folder_schema = folderSchema(folder_id);
|
||||
let isIn = false;
|
||||
let content_ = folder_schema.get_strv('apps');
|
||||
for(var j=0; j<content_.length; j++) {
|
||||
if(content_[j] == app_id) {
|
||||
isIn = true;
|
||||
}
|
||||
}
|
||||
return isIn;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
function folderSchema (folder_id) {
|
||||
let a = new Gio.Settings({
|
||||
schema_id: 'org.gnome.desktop.app-folders.folder',
|
||||
path: '/org/gnome/desktop/app-folders/folders/' + folder_id + '/'
|
||||
});
|
||||
return a;
|
||||
} // TODO et AppDisplay._getFolderName ??
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
function enable() {
|
||||
FOLDER_SCHEMA = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' });
|
||||
FOLDER_LIST = FOLDER_SCHEMA.get_strv('folder-children');
|
||||
|
||||
injectionInIcons();
|
||||
if( Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager').get_boolean('extend-menus') ) {
|
||||
injectionInAppsMenus();
|
||||
}
|
||||
DragAndDrop.initDND();
|
||||
|
||||
// Reload the view if the user load the extension at least a minute after
|
||||
// opening the session. XXX works like shit
|
||||
let delta = getTimeStamp() - INIT_TIME;
|
||||
if (delta < 0 || delta > 105) {
|
||||
Main.overview.viewSelector.appDisplay._views[1].view._redisplay();
|
||||
}
|
||||
}
|
||||
|
||||
function disable() {
|
||||
AppDisplay.FolderIcon.prototype._onButtonPress = null;
|
||||
AppDisplay.FolderIcon.prototype.popupMenu = null;
|
||||
|
||||
removeInjection(AppDisplay.AppIconMenu.prototype, injections, '_redisplay');
|
||||
|
||||
// Overwrite my shit for FolderIcon
|
||||
AppDisplay.FolderIcon = class extends AppDisplay.FolderIcon {
|
||||
_onButtonPress (actor, event) {
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
};
|
||||
|
||||
// Overwrite my shit for AppIcon
|
||||
AppDisplay.AppIcon = class extends AppDisplay.AppIcon {
|
||||
onDragBeginExt () {}
|
||||
onDragEndExt () {}
|
||||
onDragCancelledExt () {}
|
||||
};
|
||||
|
||||
DragAndDrop.OVERLAY_MANAGER.destroy();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
@@ -0,0 +1,114 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
msgid "Select a category…"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
Binary file not shown.
@@ -0,0 +1,123 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2018-12-30 14:03+0300\n"
|
||||
"Last-Translator: Максім Крапіўка <metalomaniax@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: be\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Дадаць у"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Новая папка праграм"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Выдаліць з"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr "Стварыць новую папку"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Выдаліць з %s"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Скасаваць"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Выдаліць"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr "Дастасаваць"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr "Назва папкі"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr "Катэгорыі:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr "Іншая катэгорыя?"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr "Без катэгорыі"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
msgid "Select a category…"
|
||||
msgstr "Выбраць катэгорыю..."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Змены ўступяць у сілу пасля перазагрузкі пашырэння."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr "Галоўныя налады"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr "Катэгорыі"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Выдаляць усе звязаныя налады пры выдаленні папкі праграм"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
"Выкарыстоўваць націсканне правай кнопкай мышы ў дадатак да перацягвання "
|
||||
"значкоў"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr "Выкарыстоўваць катэгорыі"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Больш інфармацыі пра «дадатковыя» катэгорыі"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Паведаміць пра памылкі або ідэі"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
"Гэта пашырэнне можна адключыць, пасля таго як вы канчаткова наладзіце "
|
||||
"арганізацыю сваіх праграм."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Стандартная спецыфікацыя"
|
Binary file not shown.
@@ -0,0 +1,124 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2017-10-28 01:50+0200\n"
|
||||
"Last-Translator: Jonatan Hatakeyama Zeidler <jonatan_zeidler@gmx.de>\n"
|
||||
"Language-Team: https://github.com/hobbypunk90/appfolders-manager-gnome-"
|
||||
"extension\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.4\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Hinzufügen zu"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Neuer Ordner"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Löschen aus"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Löschen aus"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Erstelle"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
#, fuzzy
|
||||
msgid "Other category?"
|
||||
msgstr "Lösche eine Kategorie"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
#, fuzzy
|
||||
msgid "No category"
|
||||
msgstr "Kategorie hinzufügen"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
#, fuzzy
|
||||
msgid "Select a category…"
|
||||
msgstr "Lösche eine Kategorie"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Änderungen werden nach Neustart der Erweiterung übernommen."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Lösche alle Einstellungen, wenn ein Ordner gelöscht wird"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
#, fuzzy
|
||||
msgid "Use categories"
|
||||
msgstr "Hinzugefügte Kategorien"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Dieser Ordner existiert bereits."
|
Binary file not shown.
@@ -0,0 +1,118 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2017-05-29 23:26+0300\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Προσθήκη σε"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Νέος φάκελος"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Αφαίρεση από"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Αφαίρεση από"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Αναίρεση"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Διαγραφή"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
msgid "Select a category…"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr ""
|
||||
"Οι τροποποιήσεις απαιτούν την επανεκκίνηση της επέκτασης για να "
|
||||
"λειτουργήσουν."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Διαγραφή όλων των σχετικών ρυθμίσεων κατά την διαγραφή ενός φακέλου"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
Binary file not shown.
@@ -0,0 +1,116 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2017-02-05 16:47+0100\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Ajouter à"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Nouvel AppFolder"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Retirer de"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr "Créer un nouveau dossier"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Retirer de %s"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Créer"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr "Appliquer"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr "Nom du dossier :"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr "Catégories :"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr "Autre catégorie ?"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr "Aucune catégorie"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
msgid "Select a category…"
|
||||
msgstr "Choisir une catégorie…"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Les modifications prendront effet après avoir rechargé l'extension"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr "Réglages principaux"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr "Catégories"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr ""
|
||||
"Supprimer tous les réglages relatifs à un appfolder lors de sa suppression"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr "Utiliser le menu du clic-droit en complément du glisser-déposer"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr "Utiliser des catégories"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Plus d'informations à propos des \"catégories supplémentaires\""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Reporter un bug ou une idée"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
"Cette extension peut être désactivée une fois que vos applications sont "
|
||||
"organisées comme souhaité."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Spécification standard"
|
Binary file not shown.
@@ -0,0 +1,116 @@
|
||||
# Hungarian translation for appfolders-manager.
|
||||
# Copyright (C) 2017 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Balázs Úr <urbalazs@gmail.com>, 2017.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: appfolders-manager master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2017-05-31 20:41+0100\n"
|
||||
"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
|
||||
"Language-Team: Hungarian <openscope@googlegroups.com>\n"
|
||||
"Language: hu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 2.0\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Hozzáadás ehhez"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Új alkalmazásmappa"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Eltávolítás innen"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Eltávolítás innen"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Mégse"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Törlés"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
msgid "Select a category…"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "A módosítások a kiterjesztés újratöltése után lépnek hatályba."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr ""
|
||||
"Az összes kapcsolódó beállítás törlése, ha egy alkalmazásmappa törölve lesz"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
Binary file not shown.
@@ -0,0 +1,127 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2018-03-08 17:21+0100\n"
|
||||
"Last-Translator: Jimmy Scionti <jimmy.scionti@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: it_IT\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.4\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Aggiungi a"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Nuova AppFolder"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Rimuovi da"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Rimuovi da"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Crea"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Elimina"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
#, fuzzy
|
||||
msgid "Other category?"
|
||||
msgstr "Rimuovi una categoria"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
#, fuzzy
|
||||
msgid "No category"
|
||||
msgstr "Aggiungi una categoria"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
#, fuzzy
|
||||
msgid "Select a category…"
|
||||
msgstr "Rimuovi una categoria"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Le modifiche avranno effetto dopo aver ricaricato l'estensione."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Elimina tutte le impostazioni dell'AppFolder quando viene rimossa"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
#, fuzzy
|
||||
msgid "Use categories"
|
||||
msgstr "Categorie aggiuntive"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Maggiori informazioni sulle \"categorie aggiuntive\""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Invia segnalazioni di bug o idee"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
"Questa estensione può essere disattivata dopo aver organizzato le "
|
||||
"applicazione come desiderato."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Specifiche standards"
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Questa AppFolder esiste già."
|
Binary file not shown.
@@ -0,0 +1,126 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Appfolders Management (GNOME extension)\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2018-12-19 21:13+0100\n"
|
||||
"Last-Translator: Piotr Komur <pkomur@gmail.com>\n"
|
||||
"Language-Team: Piotr Komur\n"
|
||||
"Language: pl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Dodaj do folderu"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Nowy folder programów"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Usuń z folderu"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr "Utwórz nowy folder"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Usuń z folderu"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Anuluj"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Utwórz"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Usuń"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr "Zastosuj"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr "Nazwa folderu:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr "Kategorie programów:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr "Nowa kategoria"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr "Brak wybranych kategorii"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
#, fuzzy
|
||||
msgid "Select a category…"
|
||||
msgstr "Wybierz kategorię"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Zmiany będą aktywne po ponownym zrestartowaniu środowiska Gnome."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr "Kategorie"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Usuń powiązane zmiany wraz z usunięciem folderu programów."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr "Użyj standardowych kategorii"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Więcej informacji o \"standardowych kategoriach\""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Zgłoś błędy lub nowe funkcje"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
"Można dezaktywować to rozszerzenie po zakończeniu porządkowania programów w "
|
||||
"folderach."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Specyfikacja standardu"
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Folder o tej nazwie już istnieje."
|
Binary file not shown.
@@ -0,0 +1,124 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2019-02-10 11:19-0200\n"
|
||||
"Last-Translator: Fábio Nogueira <fnogueira@gnome.org>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Adicionar para"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Nova AppFolder"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Remover de"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr "Criar uma nova pasta"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Remover de %s"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Criar"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Excluir"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr "Aplicar"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr "Nome da pasta:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr "Categorias:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr "Outra categoria?"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr "Nenhuma categoria"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
msgid "Select a category…"
|
||||
msgstr "Selecione uma categoria…"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "As modificações entrarão em vigor depois de recarregar a extensão."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr "Configurações principais"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr "Categorias"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr ""
|
||||
"Excluir todas as configurações relacionadas quando um appfolder for excluído"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr "Use os menus do botão direito, além do arrastar e soltar"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr "Usar categorias"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Mais informações sobre \"categorias adicionais\""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Comunicar erros ou ideias"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
"Esta extensão pode ser desativada assim que seus aplicativos forem "
|
||||
"organizados conforme desejado."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Especificação padrão"
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Esta appfolder já existe."
|
Binary file not shown.
@@ -0,0 +1,125 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Max Krapiŭka <metalomaniax@gmail.com>\n"
|
||||
"Language-Team: RUSSIAN <metalomaniax@gmail.com>\n"
|
||||
"Language: be\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Добавить в"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Новая папка"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Удалить из"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Удалить из"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Отмена"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Стварыць"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
#, fuzzy
|
||||
msgid "Other category?"
|
||||
msgstr "Удалить категорию"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
#, fuzzy
|
||||
msgid "No category"
|
||||
msgstr "Добавить категорию"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
#, fuzzy
|
||||
msgid "Select a category…"
|
||||
msgstr "Удалить категорию"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Изменения вступят в силу после перезагрузки расширения."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Удалять все связанные настройки при удалении папки приложений."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
#, fuzzy
|
||||
msgid "Use categories"
|
||||
msgstr "Дополнительные категории"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Больше информации про \"дополнительные категории\""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Сообщить об ошибках, предложить идеи"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
"Это расширение может быть деактивировано, после того как вы окончательно "
|
||||
"настроите организацию своих приложений."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Стандартная спецификация"
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Эта папка приложений уже существует"
|
Binary file not shown.
@@ -0,0 +1,124 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2017-09-15 16:40+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: sr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Додај у"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Нова фаскила програма"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Уклони ставку"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Уклони ставку"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Откажи"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Направи"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Обриши"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
#, fuzzy
|
||||
msgid "Other category?"
|
||||
msgstr "Уклони категорију"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
#, fuzzy
|
||||
msgid "No category"
|
||||
msgstr "Додај категорију"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
#, fuzzy
|
||||
msgid "Select a category…"
|
||||
msgstr "Уклони категорију"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Измене ће ступити на снагу по поновном учитавању проширења."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Обриши све припадајуће поставке при брисању проширења"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
#, fuzzy
|
||||
msgid "Use categories"
|
||||
msgstr "Додатне категорије"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Ова фасцикла програма већ постоји."
|
Binary file not shown.
@@ -0,0 +1,124 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2017-09-15 16:40+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: sr@latin\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Dodaj u"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Nova faskila programa"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Ukloni stavku"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Ukloni stavku"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Otkaži"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Napravi"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Obriši"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
#, fuzzy
|
||||
msgid "Other category?"
|
||||
msgstr "Ukloni kategoriju"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
#, fuzzy
|
||||
msgid "No category"
|
||||
msgstr "Dodaj kategoriju"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
#, fuzzy
|
||||
msgid "Select a category…"
|
||||
msgstr "Ukloni kategoriju"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Izmene će stupiti na snagu po ponovnom učitavanju proširenja."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Obriši sve pripadajuće postavke pri brisanju proširenja"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
#, fuzzy
|
||||
msgid "Use categories"
|
||||
msgstr "Dodatne kategorije"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Ova fascikla programa već postoji."
|
Binary file not shown.
@@ -0,0 +1,118 @@
|
||||
# Uygulama klasörleme Türkçe çeviri.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Serdar Sağlam <teknomobil@yandex.com>, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: v13\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2019-01-19 12:10+0300\n"
|
||||
"Last-Translator: Serdar Sağlam <teknomobil@yandex.com>\n"
|
||||
"Language-Team: Türkçe <teknomobil@yandex.com>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Klasör Grubuna Taşı"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Yeni Klasör Grubu"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Buradan Kaldır"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr "Yeni klasör oluştur"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Buradan Kaldır %s"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "İptal"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr "Oluştur"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Sil"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr "Onayla"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr "Klasör İsmi:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr "Kategoriler:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr "Diğer Kategori?"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr "Kategori Yok"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
msgid "Select a category…"
|
||||
msgstr "Kategori Seç…"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Değişiklikler,eklenti yeniden başladıktan sonra etkili olacaktır."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr "Ayarlar"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr "Kategoriler"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Bir klasör grubu silindiğinde tüm ilgili ayarları silin"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr "Sürükle ve bırak işlevine ek olarak sağ tıklama menülerini kullanın"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr "Kategorileri Kullan"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Hakkında daha fazla bilgi \"ek kategoriler\""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Yeni bir fikir veya hata bildirin"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr ""
|
||||
"Menüleri istediğiniz şekilde düzenlendiğinde bu uzantı devre dışı "
|
||||
"bırakılabilir."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Standart şartname"
|
Binary file not shown.
@@ -0,0 +1,123 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-27 21:15+0200\n"
|
||||
"PO-Revision-Date: 2018-12-19 05:43+0200\n"
|
||||
"Last-Translator: Igor Gordiichuk <igor_ck@outlook.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: uk_UA\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:83
|
||||
msgid "Add to"
|
||||
msgstr "Додати до"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:85
|
||||
msgid "New AppFolder"
|
||||
msgstr "Нова тека програм"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/extension.js:139
|
||||
msgid "Remove from"
|
||||
msgstr "Вилучити з"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:312
|
||||
msgid "Create a new folder"
|
||||
msgstr "Створити нову теку"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/dragAndDrop.js:350
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove from %s"
|
||||
msgstr "Вилучити з "
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:62
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:72
|
||||
msgid "Cancel"
|
||||
msgstr "Скасувати"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:66
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:76
|
||||
msgid "Delete"
|
||||
msgstr "Вилучити"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:80
|
||||
msgid "Apply"
|
||||
msgstr "Застосовувати"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:106
|
||||
msgid "Folder's name:"
|
||||
msgstr "Назва теки:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:139
|
||||
msgid "Categories:"
|
||||
msgstr "Категорії:"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:164
|
||||
msgid "Other category?"
|
||||
msgstr "Інша категорія?"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:192
|
||||
msgid "No category"
|
||||
msgstr "Без категорії"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/appfolderDialog.js:375
|
||||
#, fuzzy
|
||||
msgid "Select a category…"
|
||||
msgstr "Обрати категорію"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:31
|
||||
msgid "Modifications will be effective after reloading the extension."
|
||||
msgstr "Зміни буде застосовано після перезавантаження розширення."
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:38
|
||||
msgid "Main settings"
|
||||
msgstr "Основні налаштування"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:39
|
||||
msgid "Categories"
|
||||
msgstr "Категорії"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:46
|
||||
msgid "Delete all related settings when an appfolder is deleted"
|
||||
msgstr "Вилучити всі пов'язані налаштування, коли видаляється тека"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:48
|
||||
msgid "Use the right-click menus in addition to the drag-and-drop"
|
||||
msgstr "Використовувати контекстне меню додатково до перетягування мишкою"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:56
|
||||
msgid "Use categories"
|
||||
msgstr "Використати категорії"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:59
|
||||
msgid "More informations about \"additional categories\""
|
||||
msgstr "Більше інформації про \"додаткові категорії\""
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:74
|
||||
msgid "Report bugs or ideas"
|
||||
msgstr "Повідомити про ваду або запропонувати ідею"
|
||||
|
||||
#: appfolders-manager@maestroschan.fr/prefs.js:85
|
||||
msgid ""
|
||||
"This extension can be deactivated once your applications are organized as "
|
||||
"wished."
|
||||
msgstr "Це розширення можна деактивувати, якщо програми було впорядковано."
|
||||
|
||||
#~ msgid "Standard specification"
|
||||
#~ msgstr "Стандартні категорії"
|
||||
|
||||
#~ msgid "This appfolder already exists."
|
||||
#~ msgstr "Ця тека програм вже існує."
|
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"_generated": "Generated by SweetTooth, do not edit",
|
||||
"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.",
|
||||
"gettext-domain": "appfolders-manager",
|
||||
"name": "Appfolders Management extension",
|
||||
"shell-version": [
|
||||
"3.26",
|
||||
"3.28",
|
||||
"3.30",
|
||||
"3.32"
|
||||
],
|
||||
"url": "https://github.com/maoschanz/appfolders-manager-gnome-extension",
|
||||
"uuid": "appfolders-manager@maestroschan.fr",
|
||||
"version": 16
|
||||
}
|
@@ -0,0 +1,153 @@
|
||||
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
|
||||
const Gettext = imports.gettext.domain('appfolders-manager');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
//-----------------------------------------------
|
||||
|
||||
const appfoldersManagerSettingsWidget = new GObject.Class({
|
||||
Name: 'appfoldersManager.Prefs.Widget',
|
||||
GTypeName: 'appfoldersManagerPrefsWidget',
|
||||
Extends: Gtk.Box,
|
||||
|
||||
_init: function (params) {
|
||||
this.parent(params);
|
||||
this.margin = 30;
|
||||
this.spacing = 18;
|
||||
this.set_orientation(Gtk.Orientation.VERTICAL);
|
||||
|
||||
this._settings = Convenience.getSettings('org.gnome.shell.extensions.appfolders-manager');
|
||||
this._settings.set_boolean('debug', this._settings.get_boolean('debug'));
|
||||
|
||||
//----------------------------
|
||||
|
||||
let labelMain = new Gtk.Label({
|
||||
label: _("Modifications will be effective after reloading the extension."),
|
||||
use_markup: true,
|
||||
wrap: true,
|
||||
halign: Gtk.Align.START
|
||||
});
|
||||
this.add(labelMain);
|
||||
|
||||
let generalSection = this.add_section(_("Main settings"));
|
||||
let categoriesSection = this.add_section(_("Categories"));
|
||||
|
||||
//----------------------------
|
||||
|
||||
// let autoDeleteBox = this.build_switch('auto-deletion',
|
||||
// _("Delete automatically empty folders"));
|
||||
let deleteAllBox = this.build_switch('total-deletion',
|
||||
_("Delete all related settings when an appfolder is deleted"));
|
||||
let menusBox = this.build_switch('extend-menus',
|
||||
_("Use the right-click menus in addition to the drag-and-drop"));
|
||||
|
||||
// this.add_row(autoDeleteBox, generalSection);
|
||||
this.add_row(deleteAllBox, generalSection);
|
||||
this.add_row(menusBox, generalSection);
|
||||
|
||||
//-------------------------
|
||||
|
||||
let categoriesBox = this.build_switch('categories', _("Use categories"));
|
||||
|
||||
let categoriesLinkButton = new Gtk.LinkButton({
|
||||
label: _("More informations about \"additional categories\""),
|
||||
uri: "https://standards.freedesktop.org/menu-spec/latest/apas02.html"
|
||||
});
|
||||
|
||||
this.add_row(categoriesBox, categoriesSection);
|
||||
this.add_row(categoriesLinkButton, categoriesSection);
|
||||
|
||||
//-------------------------
|
||||
|
||||
let aboutBox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL, spacing: 10 });
|
||||
let about_label = new Gtk.Label({
|
||||
label: '(v' + Me.metadata.version.toString() + ')',
|
||||
halign: Gtk.Align.START
|
||||
});
|
||||
let url_button = new Gtk.LinkButton({
|
||||
label: _("Report bugs or ideas"),
|
||||
uri: Me.metadata.url.toString()
|
||||
});
|
||||
aboutBox.pack_start(url_button, false, false, 0);
|
||||
aboutBox.pack_end(about_label, false, false, 0);
|
||||
|
||||
this.pack_end(aboutBox, false, false, 0);
|
||||
|
||||
//-------------------------
|
||||
|
||||
let desacLabel = new Gtk.Label({
|
||||
label: _("This extension can be deactivated once your applications are organized as wished."),
|
||||
wrap: true,
|
||||
halign: Gtk.Align.CENTER
|
||||
});
|
||||
this.pack_end(desacLabel, false, false, 0);
|
||||
},
|
||||
|
||||
add_section: function (titre) {
|
||||
let section = new Gtk.Box({
|
||||
orientation: Gtk.Orientation.VERTICAL,
|
||||
margin: 6,
|
||||
spacing: 6,
|
||||
});
|
||||
|
||||
let frame = new Gtk.Frame({
|
||||
label: titre,
|
||||
label_xalign: 0.1,
|
||||
});
|
||||
frame.add(section);
|
||||
this.add(frame);
|
||||
return section;
|
||||
},
|
||||
|
||||
add_row: function (filledbox, section) {
|
||||
section.add(filledbox);
|
||||
},
|
||||
|
||||
build_switch: function (key, label) {
|
||||
let rowLabel = new Gtk.Label({
|
||||
label: label,
|
||||
halign: Gtk.Align.START,
|
||||
wrap: true,
|
||||
visible: true,
|
||||
});
|
||||
|
||||
let rowSwitch = new Gtk.Switch({ valign: Gtk.Align.CENTER });
|
||||
rowSwitch.set_state(this._settings.get_boolean(key));
|
||||
rowSwitch.connect('notify::active', (widget) => {
|
||||
this._settings.set_boolean(key, widget.active);
|
||||
});
|
||||
|
||||
let rowBox = new Gtk.Box({
|
||||
orientation: Gtk.Orientation.HORIZONTAL,
|
||||
spacing: 15,
|
||||
margin: 6,
|
||||
visible: true,
|
||||
});
|
||||
rowBox.pack_start(rowLabel, false, false, 0);
|
||||
rowBox.pack_end(rowSwitch, false, false, 0);
|
||||
|
||||
return rowBox;
|
||||
},
|
||||
});
|
||||
|
||||
//-----------------------------------------------
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
//I guess this is like the "enable" in extension.js : something called each
|
||||
//time he user try to access the settings' window
|
||||
function buildPrefsWidget () {
|
||||
let widget = new appfoldersManagerSettingsWidget();
|
||||
widget.show_all();
|
||||
|
||||
return widget;
|
||||
}
|
||||
|
Binary file not shown.
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schemalist gettext-domain="appfolders-manager">
|
||||
<schema id="org.gnome.shell.extensions.appfolders-manager" path="/org/gnome/shell/extensions/appfolders-manager/">
|
||||
<key type="b" name="total-deletion">
|
||||
<default>true</default>
|
||||
<summary>Complete deletion of an appfolder</summary>
|
||||
<description>if a deleted appfolder should be 100% deleted (false = restauration is possible)</description>
|
||||
</key>
|
||||
<key type="b" name="categories">
|
||||
<default>true</default>
|
||||
<summary>Use categories</summary>
|
||||
<description>If the interface for managing categories should be shown.</description>
|
||||
</key>
|
||||
<key type="b" name="debug">
|
||||
<default>false</default>
|
||||
<summary>Debug key</summary>
|
||||
<description>this is not supposed to be activated by the user</description>
|
||||
</key>
|
||||
<key type="b" name="extend-menus">
|
||||
<default>true</default>
|
||||
<summary>Show items in right-click menus</summary>
|
||||
<description>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.</description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
@@ -0,0 +1,56 @@
|
||||
.dropAreaLabel {
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.framedArea {
|
||||
background-color: rgba(255,255,255,0.0);
|
||||
border-color: rgba(255,255,255,1.0);
|
||||
border-width: 1px;
|
||||
color: rgba(255, 255, 255, 1.0);
|
||||
}
|
||||
|
||||
.shadowedAreaTop {
|
||||
background-gradient-start: rgba(0, 0, 0, 0.7);
|
||||
background-gradient-end: rgba(0, 0, 0, 0.1);
|
||||
background-gradient-direction: vertical;
|
||||
color: rgba(255, 255, 255, 1.0);
|
||||
}
|
||||
|
||||
.shadowedAreaBottom {
|
||||
background-gradient-start: rgba(0, 0, 0, 0.1);
|
||||
background-gradient-end: rgba(0, 0, 0, 0.7);
|
||||
background-gradient-direction: vertical;
|
||||
color: rgba(255, 255, 255, 1.0);
|
||||
}
|
||||
|
||||
.folderArea {
|
||||
background-gradient-start: rgba(0, 0, 0, 0.4);
|
||||
background-gradient-end: rgba(0, 0, 0, 0.0);
|
||||
background-gradient-direction: vertical;
|
||||
border-color: rgba(255,255,255,1.0);
|
||||
border-radius: 4px;
|
||||
border-width: 2px;
|
||||
color: rgba(255, 255, 255, 1.0);
|
||||
}
|
||||
|
||||
.insensitiveArea {
|
||||
background-color: rgba(0, 0, 0, 0.1);
|
||||
color: rgba(100, 100, 100, 0.6);
|
||||
}
|
||||
|
||||
.appCategoryBox {
|
||||
background-color: rgba(100, 100, 100, 0.3);
|
||||
border-radius: 3px;
|
||||
margin: 3px;
|
||||
padding: 2px;
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
.appCategoryDeleteBtn {
|
||||
background-color: rgba(100, 100, 100, 0.3);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user