This commit is contained in:
davedatum
2019-10-26 21:50:28 +01:00
parent 302349855d
commit bdc807428d
426 changed files with 26974 additions and 52 deletions

View File

@@ -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();
}
};

View File

@@ -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 });
}

View File

@@ -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;
}
};

View File

@@ -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();
}
//------------------------------------------------------------------------------

View File

@@ -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 ""

View File

@@ -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 "Стандартная спецыфікацыя"

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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à."

View File

@@ -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."

View File

@@ -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."

View File

@@ -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 "Эта папка приложений уже существует"

View File

@@ -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 "Ова фасцикла програма већ постоји."

View File

@@ -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."

View File

@@ -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"

View File

@@ -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 "Ця тека програм вже існує."

View File

@@ -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
}

View File

@@ -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;
}

View File

@@ -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>

View File

@@ -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;
}