Compare commits
64 Commits
Author | SHA1 | Date | |
---|---|---|---|
5d1c241f53 | |||
cb9bb62a21 | |||
bde127b893 | |||
51537cf31c | |||
a3d2cfa503 | |||
f36e4b6ed5 | |||
40a003e5ac | |||
5fa6996210 | |||
5dba928154 | |||
ab9fb0f351 | |||
c2ba11425c | |||
98ab6ae70d | |||
2bf544e272 | |||
8f6c64f607 | |||
5f509855e2 | |||
7097796c3f | |||
1e87315554 | |||
6b86b6a3e2 | |||
ab59b74124 | |||
2f61d9e94b | |||
b8a7291e1d | |||
222919cfc1 | |||
db30fbe3e9 | |||
03062d0d9d | |||
ac2066673f | |||
19f6281f84 | |||
7dce433978 | |||
96699b996c | |||
390431c5e0 | |||
afb405782c | |||
12b31e6bd0 | |||
d76c219026 | |||
d26b320ab7 | |||
132a8bb53e | |||
c79251101d | |||
f7dc59e370 | |||
d0d91c49b8 | |||
6b6045578c | |||
b5f141f596 | |||
0790503f16 | |||
222698954f | |||
25a8f484e4 | |||
fae7ba52dc | |||
9f87ffc054 | |||
2e8ade4da0 | |||
235ffa29dc | |||
8d2a87781e | |||
d14bf9a12a | |||
12f2053613 | |||
0abbd52646 | |||
96f1d1b08d | |||
d3384d29e4 | |||
6de2fd6324 | |||
a9c74ed78f | |||
c02d0f3a7d | |||
bd84de38a3 | |||
bda8ba5ed1 | |||
67b9386b4b | |||
62a34c5116 | |||
d1ed344cef | |||
9ccd343764 | |||
61c7092184 | |||
b2454bd1b2 | |||
ff73f76527 |
46
NEWS
46
NEWS
@ -1,3 +1,49 @@
|
||||
3.36.5
|
||||
======
|
||||
* Fix extension updates when many extensions are installed [Jeremias; !1363]
|
||||
* Fix missing icons in on-screen keyboard [Emre; #2631, #3007]
|
||||
* Fix delay when showing calendar events [Sebastian; #2992]
|
||||
* Fix app picker regressions on small displays [Sebastian; #2234, !1375, !1378]
|
||||
* Fix top bar navigation when NumLock is active [Olivier; #550]
|
||||
* Delay login animation until wallpaper has loaded [Michael; #734996]
|
||||
* Revert changes that caused mispositioning in overview in multi-monitor setups
|
||||
[Robert; #2971]
|
||||
* Reset auth prompt on login screen on VT switch before fade in [Ray; #2997]
|
||||
* Fix stuck grab when destroying open popup menu [Florian; #3022]
|
||||
* Misc. bug fixes and cleanups [Florian, Carlos, Andre, Jonas; !1357, !1371,
|
||||
!1381, #3037, #3005, !1386, !1390]
|
||||
|
||||
Contributors:
|
||||
Michael Catanzaro, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
|
||||
Sebastian Keller, Robert Mader, Andre Moreira Magalhaes, Florian Müllner,
|
||||
Jeremias Ortega, Ray Strode, Emre Uyguroglu
|
||||
|
||||
Translators:
|
||||
Boyuan Yang [zh_CN], Rafael Fontenelle [pt_BR]
|
||||
|
||||
3.36.4
|
||||
======
|
||||
* Hide switch-user button on lock screen if unsupported [Chingkai; #2687]
|
||||
* Improve world clocks styling [PrOF-kk; #2825]
|
||||
* Improve calendar-server performance [Florian, Milan; #1875]
|
||||
* Fix regressions in redesigned modal dialogs [Florian, Jonas; #2491, !1336]
|
||||
* Better support sandboxed apps with multiple .desktop files [Florian; #219]
|
||||
* Fix on-screen keyboard size in portrait orientation [Florian; #2349]
|
||||
* Support scrolling anywhere in slider menu items [Peter; #2795]
|
||||
* Fixed crash [Marco; #2643]
|
||||
* Plugged leaks [Sebastian, Florian; !1306, !1341]
|
||||
* Misc. bug fixes and cleanups [Jonas, Daniel, Florian, Sebastian, MOZGIII,
|
||||
Koki; !1119, !1289, !1331, !1192, !1340, !1327, !1279]
|
||||
|
||||
Contributors:
|
||||
Marco Trevisan (Treviño), Chingkai, Milan Crha, Jonas Dreßler, Koki Fukuda,
|
||||
Sebastian Keller, MOZGIII, Robert Mader, Florian Müllner, PrOF-kk,
|
||||
Peter Simonyi, Daniel van Vugt
|
||||
|
||||
Translators:
|
||||
Matej Urbančič [sl], sicklylife [ja], Fabio Tomat [fur],
|
||||
Baurzhan Muftakhidinov [kk], Daniel Șerbănescu [ro]
|
||||
|
||||
3.36.3
|
||||
======
|
||||
* Add gnome-shell-extension-prefs wrapper for compatibility [Florian; !1220]
|
||||
|
@ -1,12 +1,19 @@
|
||||
<node>
|
||||
<interface name="org.gnome.Shell.CalendarServer">
|
||||
<method name="GetEvents">
|
||||
<arg type="x" direction="in" />
|
||||
<arg type="x" direction="in" />
|
||||
<arg type="b" direction="in" />
|
||||
<arg type="a(sssbxxa{sv})" direction="out" />
|
||||
<method name="SetTimeRange">
|
||||
<arg type="x" name="since" direction="in"/>
|
||||
<arg type="x" name="until" direction="in"/>
|
||||
<arg type="b" name="force_reload" direction="in"/>
|
||||
</method>
|
||||
<signal name="EventsAddedOrUpdated">
|
||||
<arg type="a(ssbxxa{sv})" name="events" direction="out"/>
|
||||
</signal>
|
||||
<signal name="EventsRemoved">
|
||||
<arg type="as" name="ids" direction="out"/>
|
||||
</signal>
|
||||
<signal name="ClientDisappeared">
|
||||
<arg type="s" name="source_uid" direction="out"/>
|
||||
</signal>
|
||||
<property name="HasCalendars" type="b" access="read" />
|
||||
<signal name="Changed" />
|
||||
</interface>
|
||||
</node>
|
||||
|
@ -9,21 +9,21 @@
|
||||
<file>dash-placeholder.svg</file>
|
||||
<file>gnome-shell.css</file>
|
||||
<file>gnome-shell-high-contrast.css</file>
|
||||
<file alias="icons/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
|
||||
<file>no-events.svg</file>
|
||||
<file>no-notifications.svg</file>
|
||||
<file>pad-osd.css</file>
|
||||
<file alias="icons/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
|
||||
<file alias="icons/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
|
||||
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
||||
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||
<file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
||||
<file alias="icons/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
|
||||
<file alias="icons/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
|
||||
<file alias="icons/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
|
||||
<file alias="icons/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file>
|
||||
<file alias="icons/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file>
|
||||
<file>process-working.svg</file>
|
||||
<file>toggle-off.svg</file>
|
||||
<file>toggle-off-dark.svg</file>
|
||||
|
@ -7,7 +7,7 @@ $app_icon_padding: 24px;
|
||||
.icon-grid {
|
||||
-shell-grid-horizontal-item-size: $app_icon_size + $app_icon_padding * 2;
|
||||
-shell-grid-vertical-item-size: $app_icon_size + $app_icon_padding * 2;
|
||||
spacing: $base_spacing * 6;
|
||||
spacing: $base_spacing * 4;
|
||||
|
||||
.overview-icon {
|
||||
icon-size: $app_icon_size;
|
||||
|
@ -204,9 +204,11 @@
|
||||
.world-clocks-time {
|
||||
font-weight: bold;
|
||||
color: $fg_color;
|
||||
font-feature-settings: "lnum";
|
||||
font-feature-settings: "tnum";
|
||||
@include fontsize($base_font_size);
|
||||
text-align: right;
|
||||
|
||||
&:ltr { text-align: right; }
|
||||
&:rtl { text-align: left; }
|
||||
}
|
||||
|
||||
// timezone offset label
|
||||
|
@ -138,11 +138,10 @@
|
||||
.user-widget.horizontal .user-widget-label {
|
||||
@include fontsize($base_font_size + 2);
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
padding-left: 15px;
|
||||
|
||||
&:ltr { padding-left: 14px; }
|
||||
&:rtl { padding-right: 14px; }
|
||||
&:ltr { padding-left: 14px; text-align: left; }
|
||||
&:rtl { padding-right: 14px; text-align: right; }
|
||||
}
|
||||
|
||||
.user-widget.vertical .user-widget-label {
|
||||
|
@ -71,9 +71,11 @@
|
||||
> .event-time {
|
||||
color: transparentize($fg_color, 0.5);
|
||||
@include fontsize($base_font_size - 2);
|
||||
text-align: right;
|
||||
/* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
|
||||
padding-bottom: 0.13em;
|
||||
|
||||
&:ltr { text-align: right };
|
||||
&:rtl { text-align: left };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,8 +76,10 @@ $popover_arrow_height: 12px;
|
||||
|
||||
// container for radio and check boxes
|
||||
.popup-menu-ornament {
|
||||
text-align: right;
|
||||
width: 1.2em;
|
||||
|
||||
&:ltr { text-align: right };
|
||||
&:rtl { text-align: left };
|
||||
}
|
||||
|
||||
// separator
|
||||
|
@ -952,16 +952,15 @@ var LoginDialog = GObject.registerClass({
|
||||
if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
return;
|
||||
|
||||
if (this._authPrompt.verificationStatus !== AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
this._authPrompt.reset();
|
||||
|
||||
this._bindOpacity();
|
||||
this.ease({
|
||||
opacity: 255,
|
||||
duration: _FADE_ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => {
|
||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
this._authPrompt.reset();
|
||||
this._unbindOpacity();
|
||||
},
|
||||
onComplete: () => this._unbindOpacity(),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -853,6 +853,9 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
||||
if (index === -1)
|
||||
return;
|
||||
|
||||
this._arrows[index].destroy();
|
||||
this._arrows.splice(index, 1);
|
||||
|
||||
this.icons.splice(index, 1);
|
||||
this.removeItem(index);
|
||||
}
|
||||
|
@ -1336,6 +1336,10 @@ class FolderView extends BaseAppView {
|
||||
this._parentView = parentView;
|
||||
this._grid._delegate = this;
|
||||
|
||||
this._relayoutLaterId = 0;
|
||||
this._oldWidth = null;
|
||||
this._oldHeight = null;
|
||||
|
||||
this._scrollView = new St.ScrollView({
|
||||
overlay_scrollbars: true,
|
||||
x_expand: true,
|
||||
@ -1357,6 +1361,8 @@ class FolderView extends BaseAppView {
|
||||
action.connect('pan', this._onPan.bind(this));
|
||||
this._scrollView.add_action(action);
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
|
||||
this._redisplay();
|
||||
}
|
||||
|
||||
@ -1399,6 +1405,18 @@ class FolderView extends BaseAppView {
|
||||
return false;
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
if (this._relayoutLaterId) {
|
||||
Meta.later_remove(this._relayoutLaterId);
|
||||
this._relayoutLaterId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
_relayoutLater() {
|
||||
this._relayoutLaterId = 0;
|
||||
this._grid.queue_relayout();
|
||||
}
|
||||
|
||||
adaptToSize(width, height) {
|
||||
this._parentAvailableWidth = width;
|
||||
this._parentAvailableHeight = height;
|
||||
@ -1418,6 +1436,16 @@ class FolderView extends BaseAppView {
|
||||
this._grid.bottomPadding = Math.max(this._grid.bottomPadding, 0);
|
||||
this._grid.leftPadding = Math.max(this._grid.leftPadding, 0);
|
||||
this._grid.rightPadding = Math.max(this._grid.rightPadding, 0);
|
||||
|
||||
if (width !== this._oldWidth || height !== this._oldHeight) {
|
||||
this._oldWidth = width;
|
||||
this._oldHeight = height;
|
||||
|
||||
if (!this._relayoutLaterId) {
|
||||
this._relayoutLaterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
||||
this._relayoutLater.bind(this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_loadApps() {
|
||||
|
@ -347,6 +347,8 @@ var Background = GObject.registerClass({
|
||||
this.set_color(color);
|
||||
else
|
||||
this.set_gradient(shadingType, color, secondColor);
|
||||
|
||||
this._setLoaded();
|
||||
}
|
||||
|
||||
_watchFile(file) {
|
||||
@ -758,10 +760,27 @@ var BackgroundManager = class BackgroundManager {
|
||||
this._updateBackgroundActor();
|
||||
});
|
||||
|
||||
let loadedSignalId;
|
||||
if (background.isLoaded) {
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
||||
this.emit('loaded');
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
} else {
|
||||
loadedSignalId = background.connect('loaded', () => {
|
||||
background.disconnect(loadedSignalId);
|
||||
loadedSignalId = null;
|
||||
this.emit('loaded');
|
||||
});
|
||||
}
|
||||
|
||||
backgroundActor.connect('destroy', () => {
|
||||
if (changeSignalId)
|
||||
background.disconnect(changeSignalId);
|
||||
|
||||
if (loadedSignalId)
|
||||
background.disconnect(loadedSignalId);
|
||||
|
||||
if (backgroundActor.loadedSignalId)
|
||||
background.disconnect(backgroundActor.loadedSignalId);
|
||||
});
|
||||
|
@ -220,7 +220,12 @@ class DBusEventSource extends EventSourceBase {
|
||||
}
|
||||
}
|
||||
|
||||
this._dbusProxy.connectSignal('Changed', this._onChanged.bind(this));
|
||||
this._dbusProxy.connectSignal('EventsAddedOrUpdated',
|
||||
this._onEventsAddedOrUpdated.bind(this));
|
||||
this._dbusProxy.connectSignal('EventsRemoved',
|
||||
this._onEventsRemoved.bind(this));
|
||||
this._dbusProxy.connectSignal('ClientDisappeared',
|
||||
this._onClientDisappeared.bind(this));
|
||||
|
||||
this._dbusProxy.connect('notify::g-name-owner', () => {
|
||||
if (this._dbusProxy.g_name_owner)
|
||||
@ -257,7 +262,7 @@ class DBusEventSource extends EventSourceBase {
|
||||
}
|
||||
|
||||
_resetCache() {
|
||||
this._events = [];
|
||||
this._events = new Map();
|
||||
this._lastRequestBegin = null;
|
||||
this._lastRequestEnd = null;
|
||||
}
|
||||
@ -273,28 +278,47 @@ class DBusEventSource extends EventSourceBase {
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
_onChanged() {
|
||||
this._loadEvents(false);
|
||||
_onEventsAddedOrUpdated(dbusProxy, nameOwner, argArray) {
|
||||
const [appointments = []] = argArray;
|
||||
let changed = false;
|
||||
|
||||
for (let n = 0; n < appointments.length; n++) {
|
||||
const [id, summary, allDay, startTime, endTime] = appointments[n];
|
||||
const date = new Date(startTime * 1000);
|
||||
const end = new Date(endTime * 1000);
|
||||
let event = new CalendarEvent(id, date, end, summary, allDay);
|
||||
this._events.set(event.id, event);
|
||||
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (changed)
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
_onEventsReceived(results, _error) {
|
||||
let newEvents = [];
|
||||
let appointments = results[0] || [];
|
||||
for (let n = 0; n < appointments.length; n++) {
|
||||
let a = appointments[n];
|
||||
let date = new Date(a[4] * 1000);
|
||||
let end = new Date(a[5] * 1000);
|
||||
let id = a[0];
|
||||
let summary = a[1];
|
||||
let allDay = a[3];
|
||||
let event = new CalendarEvent(id, date, end, summary, allDay);
|
||||
newEvents.push(event);
|
||||
}
|
||||
newEvents.sort((ev1, ev2) => ev1.date.getTime() - ev2.date.getTime());
|
||||
_onEventsRemoved(dbusProxy, nameOwner, argArray) {
|
||||
const [ids = []] = argArray;
|
||||
|
||||
this._events = newEvents;
|
||||
this._isLoading = false;
|
||||
this.emit('changed');
|
||||
let changed = false;
|
||||
for (const id of ids)
|
||||
changed |= this._events.delete(id);
|
||||
|
||||
if (changed)
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
_onClientDisappeared(dbusProxy, nameOwner, argArray) {
|
||||
let [sourceUid = ''] = argArray;
|
||||
sourceUid += '\n';
|
||||
|
||||
let changed = false;
|
||||
for (const id of this._events.keys()) {
|
||||
if (id.startsWith(sourceUid))
|
||||
changed |= this._events.delete(id);
|
||||
}
|
||||
|
||||
if (changed)
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
_loadEvents(forceReload) {
|
||||
@ -303,33 +327,38 @@ class DBusEventSource extends EventSourceBase {
|
||||
return;
|
||||
|
||||
if (this._curRequestBegin && this._curRequestEnd) {
|
||||
this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
|
||||
this._curRequestEnd.getTime() / 1000,
|
||||
forceReload,
|
||||
this._onEventsReceived.bind(this),
|
||||
Gio.DBusCallFlags.NONE);
|
||||
if (forceReload) {
|
||||
this._events.clear();
|
||||
this.emit('changed');
|
||||
}
|
||||
this._dbusProxy.SetTimeRangeRemote(
|
||||
this._curRequestBegin.getTime() / 1000,
|
||||
this._curRequestEnd.getTime() / 1000,
|
||||
forceReload,
|
||||
Gio.DBusCallFlags.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
requestRange(begin, end) {
|
||||
if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) {
|
||||
this._isLoading = true;
|
||||
this._lastRequestBegin = begin;
|
||||
this._lastRequestEnd = end;
|
||||
this._curRequestBegin = begin;
|
||||
this._curRequestEnd = end;
|
||||
this._loadEvents(false);
|
||||
this._loadEvents(true);
|
||||
}
|
||||
}
|
||||
|
||||
*_getFilteredEvents(begin, end) {
|
||||
for (const event of this._events.values()) {
|
||||
if (_dateIntervalsOverlap(event.date, event.end, begin, end))
|
||||
yield event;
|
||||
}
|
||||
}
|
||||
|
||||
getEvents(begin, end) {
|
||||
let result = [];
|
||||
for (let n = 0; n < this._events.length; n++) {
|
||||
let event = this._events[n];
|
||||
let result = [...this._getFilteredEvents(begin, end)];
|
||||
|
||||
if (_dateIntervalsOverlap(event.date, event.end, begin, end))
|
||||
result.push(event);
|
||||
}
|
||||
result.sort((event1, event2) => {
|
||||
// sort events by end time on ending day
|
||||
let d1 = event1.date < begin && event1.end <= end ? event1.end : event1.date;
|
||||
@ -343,12 +372,8 @@ class DBusEventSource extends EventSourceBase {
|
||||
let dayBegin = _getBeginningOfDay(day);
|
||||
let dayEnd = _getEndOfDay(day);
|
||||
|
||||
let events = this.getEvents(dayBegin, dayEnd);
|
||||
|
||||
if (events.length == 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
const { done } = this._getFilteredEvents(dayBegin, dayEnd).next();
|
||||
return !done;
|
||||
}
|
||||
});
|
||||
|
||||
@ -700,12 +725,11 @@ var Calendar = GObject.registerClass({
|
||||
var EventMessage = GObject.registerClass(
|
||||
class EventMessage extends MessageList.Message {
|
||||
_init(event, date) {
|
||||
super._init('', event.summary);
|
||||
super._init('', '');
|
||||
|
||||
this._event = event;
|
||||
this._date = date;
|
||||
|
||||
this.setTitle(this._formatEventTime());
|
||||
this.update(event);
|
||||
|
||||
this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' });
|
||||
this.setIcon(this._icon);
|
||||
@ -717,6 +741,13 @@ class EventMessage extends MessageList.Message {
|
||||
super.vfunc_style_changed();
|
||||
}
|
||||
|
||||
update(event) {
|
||||
this._event = event;
|
||||
|
||||
this.setTitle(this._formatEventTime());
|
||||
this.setBody(event.summary);
|
||||
}
|
||||
|
||||
_formatEventTime() {
|
||||
let periodBegin = _getBeginningOfDay(this._date);
|
||||
let periodEnd = _getEndOfDay(this._date);
|
||||
@ -874,7 +905,7 @@ class EventsSection extends MessageList.MessageListSection {
|
||||
}
|
||||
|
||||
_reloadEvents() {
|
||||
if (this._eventSource.isLoading)
|
||||
if (this._eventSource.isLoading || this._reloading)
|
||||
return;
|
||||
|
||||
this._reloading = true;
|
||||
@ -900,6 +931,7 @@ class EventsSection extends MessageList.MessageListSection {
|
||||
this._messageById.set(event.id, message);
|
||||
this.addMessage(message, false);
|
||||
} else {
|
||||
message.update(event);
|
||||
this.moveMessage(message, i, false);
|
||||
}
|
||||
}
|
||||
|
@ -594,6 +594,7 @@ class DateMenuButton extends PanelMenu.Button {
|
||||
|
||||
this._clockDisplay = new St.Label({ style_class: 'clock' });
|
||||
this._clockDisplay.clutter_text.y_align = Clutter.ActorAlign.CENTER;
|
||||
this._clockDisplay.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
|
||||
this._indicator = new MessagesIndicator();
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported Dialog, MessageDialogContent, ListSection, ListSectionItem */
|
||||
|
||||
const { Clutter, GObject, Meta, Pango, St } = imports.gi;
|
||||
const { Clutter, GLib, GObject, Meta, Pango, St } = imports.gi;
|
||||
|
||||
function _setLabel(label, value) {
|
||||
label.set({
|
||||
@ -221,13 +221,16 @@ var MessageDialogContent = GObject.registerClass({
|
||||
this._updateTitleStyleLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||
this._updateTitleStyleLater = 0;
|
||||
this._title.add_style_class_name('leightweight');
|
||||
return false;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
set title(title) {
|
||||
if (this._title.text === title)
|
||||
return;
|
||||
|
||||
_setLabel(this._title, title);
|
||||
|
||||
this._title.remove_style_class_name('leightweight');
|
||||
@ -237,6 +240,9 @@ var MessageDialogContent = GObject.registerClass({
|
||||
}
|
||||
|
||||
set description(description) {
|
||||
if (this._description.text === description)
|
||||
return;
|
||||
|
||||
_setLabel(this._description, description);
|
||||
this.notify('description');
|
||||
}
|
||||
|
@ -139,7 +139,9 @@ function checkForUpdates() {
|
||||
return;
|
||||
if (extension.hasUpdate)
|
||||
return;
|
||||
metadatas[uuid] = extension.metadata;
|
||||
metadatas[uuid] = {
|
||||
version: extension.metadata.version,
|
||||
};
|
||||
});
|
||||
|
||||
if (Object.keys(metadatas).length === 0)
|
||||
|
@ -845,8 +845,10 @@ var IconGrid = GObject.registerClass({
|
||||
// Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up
|
||||
_updateIconSizes() {
|
||||
this._updateIconSizesLaterId = 0;
|
||||
let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize);
|
||||
let newIconSize = Math.floor(ICON_SIZE * scale);
|
||||
let extraWidth = Math.max(0, this._hItemSize - ICON_SIZE);
|
||||
let extraHeight = Math.max(0, this._vItemSize - ICON_SIZE);
|
||||
let newIconSize = Math.min(this._fixedHItemSize - extraWidth,
|
||||
this._fixedVItemSize - extraHeight);
|
||||
for (let i in this._items)
|
||||
this._items[i].icon.setIconSize(newIconSize);
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* exported InhibitShortcutsDialog */
|
||||
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
|
||||
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Pango, Shell, St } = imports.gi;
|
||||
|
||||
const Dialog = imports.ui.dialog;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@ -90,6 +90,8 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
text: _('You can restore shortcuts by pressing %s.').format(restoreAccel),
|
||||
style_class: 'message-dialog-description',
|
||||
});
|
||||
restoreLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
restoreLabel.clutter_text.line_wrap = true;
|
||||
content.add_child(restoreLabel);
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ const defaultKeysPost = [
|
||||
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
|
||||
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
||||
[{ label: '=/<', width: 3, level: 3, right: true }],
|
||||
[{ action: 'emoji', icon: 'face-smile-symbolic' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
|
||||
[{ action: 'emoji', icon: 'face-smile-symbolic' }, { action: 'languageMenu', extraClassName: 'layout-key', icon: 'keyboard-layout-filled-symbolic' }, { action: 'hide', extraClassName: 'hide-key', icon: 'go-down-symbolic' }]],
|
||||
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
|
||||
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
||||
[{ label: '?123', width: 3, level: 2, right: true }],
|
||||
@ -61,6 +61,24 @@ class AspectContainer extends St.Widget {
|
||||
this.queue_relayout();
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width(forHeight) {
|
||||
let [min, nat] = super.vfunc_get_preferred_width(forHeight);
|
||||
|
||||
if (forHeight > 0)
|
||||
nat = forHeight * this._ratio;
|
||||
|
||||
return [min, nat];
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height(forWidth) {
|
||||
let [min, nat] = super.vfunc_get_preferred_height(forWidth);
|
||||
|
||||
if (forWidth > 0)
|
||||
nat = forWidth / this._ratio;
|
||||
|
||||
return [min, nat];
|
||||
}
|
||||
|
||||
vfunc_allocate(box, flags) {
|
||||
if (box.get_width() > 0 && box.get_height() > 0) {
|
||||
let sizeRatio = box.get_width() / box.get_height();
|
||||
@ -1074,8 +1092,8 @@ var Keypad = GObject.registerClass({
|
||||
{ label: '8', keyval: Clutter.KEY_8, left: 1, top: 2 },
|
||||
{ label: '9', keyval: Clutter.KEY_9, left: 2, top: 2 },
|
||||
{ label: '0', keyval: Clutter.KEY_0, left: 1, top: 3 },
|
||||
{ label: '⌫', keyval: Clutter.KEY_BackSpace, left: 3, top: 0 },
|
||||
{ keyval: Clutter.KEY_Return, extraClassName: 'enter-key', left: 3, top: 1, height: 2 },
|
||||
{ keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic', left: 3, top: 0 },
|
||||
{ keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic', left: 3, top: 1, height: 2 },
|
||||
];
|
||||
|
||||
super._init({
|
||||
@ -1092,7 +1110,7 @@ var Keypad = GObject.registerClass({
|
||||
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
let cur = keys[i];
|
||||
let key = new Key(cur.label || "", []);
|
||||
let key = new Key(cur.label || "", [], cur.icon);
|
||||
|
||||
if (keys[i].extraClassName)
|
||||
key.keyButton.add_style_class_name(cur.extraClassName);
|
||||
@ -1609,7 +1627,9 @@ class Keyboard extends St.BoxLayout {
|
||||
* we allow the OSK being smaller than 1/3rd of the monitor height
|
||||
* there.
|
||||
*/
|
||||
this.height = Math.min(maxHeight, this.get_preferred_height(monitor.width));
|
||||
const forWidth = this.get_theme_node().adjust_for_width(monitor.width);
|
||||
const [, natHeight] = this.get_preferred_height(forWidth);
|
||||
this.height = Math.min(maxHeight, natHeight);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -470,6 +470,15 @@ var LayoutManager = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
_waitLoaded(bgManager) {
|
||||
return new Promise(resolve => {
|
||||
const id = bgManager.connect('loaded', () => {
|
||||
bgManager.disconnect(id);
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
_updateBackgrounds() {
|
||||
for (let i = 0; i < this._bgManagers.length; i++)
|
||||
this._bgManagers[i].destroy();
|
||||
@ -477,7 +486,7 @@ var LayoutManager = GObject.registerClass({
|
||||
this._bgManagers = [];
|
||||
|
||||
if (Main.sessionMode.isGreeter)
|
||||
return;
|
||||
return Promise.resolve();
|
||||
|
||||
for (let i = 0; i < this.monitors.length; i++) {
|
||||
let bgManager = this._createBackgroundManager(i);
|
||||
@ -486,6 +495,8 @@ var LayoutManager = GObject.registerClass({
|
||||
if (i != this.primaryIndex && this._startingUp)
|
||||
bgManager.backgroundActor.hide();
|
||||
}
|
||||
|
||||
return Promise.all(this._bgManagers.map(this._waitLoaded));
|
||||
}
|
||||
|
||||
_updateKeyboardBox() {
|
||||
@ -644,7 +655,7 @@ var LayoutManager = GObject.registerClass({
|
||||
// When starting a normal user session, we want to grow it out of the middle
|
||||
// of the screen.
|
||||
|
||||
_prepareStartupAnimation() {
|
||||
async _prepareStartupAnimation() {
|
||||
// During the initial transition, add a simple actor to block all events,
|
||||
// so they don't get delivered to X11 windows that have been transformed.
|
||||
this._coverPane = new Clutter.Actor({ opacity: 0,
|
||||
@ -661,8 +672,6 @@ var LayoutManager = GObject.registerClass({
|
||||
} else if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
} else {
|
||||
this._updateBackgrounds();
|
||||
|
||||
// We need to force an update of the regions now before we scale
|
||||
// the UI group to get the correct allocation for the struts.
|
||||
this._updateRegions();
|
||||
@ -678,6 +687,8 @@ var LayoutManager = GObject.registerClass({
|
||||
this.uiGroup.scale_x = this.uiGroup.scale_y = 0.75;
|
||||
this.uiGroup.opacity = 0;
|
||||
global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
|
||||
|
||||
await this._updateBackgrounds();
|
||||
}
|
||||
|
||||
this.emit('startup-prepared');
|
||||
@ -1229,8 +1240,9 @@ class HotCorner extends Clutter.Actor {
|
||||
return;
|
||||
|
||||
if (Main.overview.shouldToggleByCornerOrButton()) {
|
||||
this._ripples.playAnimation(this._x, this._y);
|
||||
Main.overview.toggle();
|
||||
if (Main.overview.animationInProgress)
|
||||
this._ripples.playAnimation(this._x, this._y);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,10 @@
|
||||
const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
// Time for initial animation going into Overview mode;
|
||||
// this is defined here to make it available in imports.
|
||||
var ANIMATION_TIME = 250;
|
||||
|
||||
const Background = imports.ui.background;
|
||||
const DND = imports.ui.dnd;
|
||||
const LayoutManager = imports.ui.layout;
|
||||
@ -14,9 +18,6 @@ const OverviewControls = imports.ui.overviewControls;
|
||||
const Params = imports.misc.params;
|
||||
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
||||
|
||||
// Time for initial animation going into Overview mode
|
||||
var ANIMATION_TIME = 250;
|
||||
|
||||
// Must be less than ANIMATION_TIME, since we switch to
|
||||
// or from the overview completely after ANIMATION_TIME,
|
||||
// and don't want the shading animation to get cut off
|
||||
|
@ -8,8 +8,9 @@ const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
const ViewSelector = imports.ui.viewSelector;
|
||||
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
||||
const Overview = imports.ui.overview;
|
||||
|
||||
var SIDE_CONTROLS_ANIMATION_TIME = 160;
|
||||
var SIDE_CONTROLS_ANIMATION_TIME = Overview.ANIMATION_TIME;
|
||||
|
||||
function getRtlSlideDirection(direction, actor) {
|
||||
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
|
||||
|
@ -183,10 +183,9 @@ var Button = GObject.registerClass({
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
super._onDestroy();
|
||||
|
||||
if (this.menu)
|
||||
this.menu.destroy();
|
||||
super._onDestroy();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -881,9 +881,10 @@ var PopupMenu = class extends PopupMenuBase {
|
||||
|
||||
let state = event.get_state();
|
||||
|
||||
// if user has a modifier down (except capslock)
|
||||
// if user has a modifier down (except capslock and numlock)
|
||||
// then don't handle the key press here
|
||||
state &= ~Clutter.ModifierType.LOCK_MASK;
|
||||
state &= ~Clutter.ModifierType.MOD2_MASK;
|
||||
state &= Clutter.ModifierType.MODIFIER_MASK;
|
||||
|
||||
if (state)
|
||||
@ -1324,7 +1325,7 @@ var PopupMenuManager = class {
|
||||
|
||||
removeMenu(menu) {
|
||||
if (menu == this.activeMenu)
|
||||
this._closeMenu(false, menu);
|
||||
this._grabHelper.ungrab({ actor: menu.actor });
|
||||
|
||||
let position = this._findMenu(menu);
|
||||
if (position == -1) // not a menu we manage
|
||||
|
@ -48,7 +48,9 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
this._item.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.emit('key-press-event', event);
|
||||
});
|
||||
|
||||
this._item.connect('scroll-event', (actor, event) => {
|
||||
return this._slider.emit('scroll-event', event);
|
||||
});
|
||||
}
|
||||
|
||||
_sliderChanged() {
|
||||
|
@ -86,6 +86,8 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
|
||||
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
|
||||
this._sessionUpdated();
|
||||
|
||||
this._sync();
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
|
@ -56,6 +56,9 @@ var StreamSlider = class {
|
||||
this.item.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.emit('key-press-event', event);
|
||||
});
|
||||
this.item.connect('scroll-event', (actor, event) => {
|
||||
return this._slider.emit('scroll-event', event);
|
||||
});
|
||||
|
||||
this._stream = null;
|
||||
this._volumeCancellable = null;
|
||||
|
@ -524,6 +524,10 @@ var UnlockDialog = GObject.registerClass({
|
||||
|
||||
this._bgManagers = [];
|
||||
|
||||
const themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
this._scaleChangedId = themeContext.connect('notify::scale-factor',
|
||||
() => this._updateBackgroundEffects());
|
||||
|
||||
this._updateBackgrounds();
|
||||
this._monitorsChangedId =
|
||||
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
|
||||
@ -566,9 +570,17 @@ var UnlockDialog = GObject.registerClass({
|
||||
this._otherUserButton.set_pivot_point(0.5, 0.5);
|
||||
this._otherUserButton.connect('clicked', this._otherUserClicked.bind(this));
|
||||
|
||||
let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
|
||||
screenSaverSettings.bind('user-switch-enabled',
|
||||
this._otherUserButton, 'visible', Gio.SettingsBindFlags.GET);
|
||||
this._screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
|
||||
|
||||
this._userSwitchEnabledId = 0;
|
||||
this._userSwitchEnabledId = this._screenSaverSettings.connect('changed::user-switch-enabled',
|
||||
this._updateUserSwitchVisibility.bind(this));
|
||||
|
||||
this._userLoadedId = 0;
|
||||
this._userLoadedId = this._user.connect('notify::is-loaded',
|
||||
this._updateUserSwitchVisibility.bind(this));
|
||||
|
||||
this._updateUserSwitchVisibility();
|
||||
|
||||
// Main Box
|
||||
let mainBox = new St.Widget();
|
||||
@ -618,6 +630,7 @@ var UnlockDialog = GObject.registerClass({
|
||||
y: monitor.y,
|
||||
width: monitor.width,
|
||||
height: monitor.height,
|
||||
effect: new Shell.BlurEffect({ name: 'blur' }),
|
||||
});
|
||||
|
||||
let bgManager = new Background.BackgroundManager({
|
||||
@ -629,19 +642,17 @@ var UnlockDialog = GObject.registerClass({
|
||||
this._bgManagers.push(bgManager);
|
||||
|
||||
this._backgroundGroup.add_child(widget);
|
||||
}
|
||||
|
||||
_updateBackgroundEffects() {
|
||||
const themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
|
||||
let effect = new Shell.BlurEffect({
|
||||
brightness: BLUR_BRIGHTNESS,
|
||||
sigma: BLUR_SIGMA * themeContext.scale_factor,
|
||||
});
|
||||
|
||||
this._scaleChangedId = themeContext.connect('notify::scale-factor', () => {
|
||||
effect.sigma = BLUR_SIGMA * themeContext.scale_factor;
|
||||
});
|
||||
|
||||
widget.add_effect(effect);
|
||||
for (const widget of this._backgroundGroup.get_children()) {
|
||||
widget.get_effect('blur').set({
|
||||
brightness: BLUR_BRIGHTNESS,
|
||||
sigma: BLUR_SIGMA * themeContext.scale_factor,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_updateBackgrounds() {
|
||||
@ -653,6 +664,7 @@ var UnlockDialog = GObject.registerClass({
|
||||
|
||||
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
|
||||
this._createBackground(i);
|
||||
this._updateBackgroundEffects();
|
||||
}
|
||||
|
||||
_ensureAuthPrompt() {
|
||||
@ -828,6 +840,21 @@ var UnlockDialog = GObject.registerClass({
|
||||
this._gdmClient = null;
|
||||
delete this._gdmClient;
|
||||
}
|
||||
|
||||
if (this._userLoadedId) {
|
||||
this._user.disconnect(this._userLoadedId);
|
||||
this._userLoadedId = 0;
|
||||
}
|
||||
|
||||
if (this._userSwitchEnabledId) {
|
||||
this._screenSaverSettings.disconnect(this._userSwitchEnabledId);
|
||||
this._userSwitchEnabledId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
_updateUserSwitchVisibility() {
|
||||
this._otherUserButton.visible = this._userManager.can_switch() &&
|
||||
this._screenSaverSettings.get_boolean('user-switch-enabled');
|
||||
}
|
||||
|
||||
cancel() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
project('gnome-shell', 'c',
|
||||
version: '3.36.3',
|
||||
version: '3.36.5',
|
||||
meson_version: '>= 0.47.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
@ -19,7 +19,7 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
|
||||
libmutter_pc = 'libmutter-' + mutter_api_version
|
||||
|
||||
ecal_req = '>= 3.33.1'
|
||||
eds_req = '>= 3.17.2'
|
||||
eds_req = '>= 3.33.1'
|
||||
gcr_req = '>= 3.7.5'
|
||||
gio_req = '>= 2.56.0'
|
||||
gi_req = '>= 1.49.1'
|
||||
|
184
po/fur.po
184
po/fur.po
@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: video-subtitles master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-03-31 11:15+0000\n"
|
||||
"PO-Revision-Date: 2020-04-30 00:24+0200\n"
|
||||
"POT-Creation-Date: 2020-06-14 15:15+0000\n"
|
||||
"PO-Revision-Date: 2020-06-21 10:40+0200\n"
|
||||
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
|
||||
"Language-Team: Friulian <fur@li.org>\n"
|
||||
"Language: fur\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.3\n"
|
||||
"X-Generator: Poedit 2.3.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: data/50-gnome-shell-system.xml:6
|
||||
@ -392,7 +392,7 @@ msgid "Network Login"
|
||||
msgstr "Acès di rêt"
|
||||
|
||||
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
|
||||
msgid "Something’s gone wrong"
|
||||
msgstr "Alc al è lât stuart"
|
||||
|
||||
@ -420,7 +420,7 @@ msgstr "Visite la pagjine principâl de estension"
|
||||
|
||||
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
|
||||
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
|
||||
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
|
||||
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
|
||||
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
|
||||
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
|
||||
msgid "Cancel"
|
||||
@ -476,71 +476,71 @@ msgid "(or swipe finger)"
|
||||
msgstr "(o passe cul dêt)"
|
||||
|
||||
#. Translators: The name of the power-off action in search
|
||||
#: js/misc/systemActions.js:89
|
||||
#: js/misc/systemActions.js:93
|
||||
msgctxt "search-result"
|
||||
msgid "Power Off"
|
||||
msgstr "Distudâ"
|
||||
|
||||
#. Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||
#: js/misc/systemActions.js:92
|
||||
#: js/misc/systemActions.js:96
|
||||
msgid "power off;shutdown;reboot;restart;halt;stop"
|
||||
msgstr "distudâ;studâ;tornâ a inviâ;fermâ"
|
||||
|
||||
#. Translators: The name of the lock screen action in search
|
||||
#: js/misc/systemActions.js:97
|
||||
#: js/misc/systemActions.js:101
|
||||
msgctxt "search-result"
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bloc schermi"
|
||||
|
||||
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||
#: js/misc/systemActions.js:100
|
||||
#: js/misc/systemActions.js:104
|
||||
msgid "lock screen"
|
||||
msgstr "bloc schermi"
|
||||
|
||||
#. Translators: The name of the logout action in search
|
||||
#: js/misc/systemActions.js:105
|
||||
#: js/misc/systemActions.js:109
|
||||
msgctxt "search-result"
|
||||
msgid "Log Out"
|
||||
msgstr "Jessî"
|
||||
|
||||
#. Translators: A list of keywords that match the logout action, separated by semicolons
|
||||
#: js/misc/systemActions.js:108
|
||||
#: js/misc/systemActions.js:112
|
||||
msgid "logout;log out;sign off"
|
||||
msgstr "jessî;sierâ session;disconeti"
|
||||
|
||||
#. Translators: The name of the suspend action in search
|
||||
#: js/misc/systemActions.js:113
|
||||
#: js/misc/systemActions.js:117
|
||||
msgctxt "search-result"
|
||||
msgid "Suspend"
|
||||
msgstr "Sospindi"
|
||||
|
||||
#. Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||
#: js/misc/systemActions.js:116
|
||||
#: js/misc/systemActions.js:120
|
||||
msgid "suspend;sleep"
|
||||
msgstr "sospindi;polse"
|
||||
|
||||
#. Translators: The name of the switch user action in search
|
||||
#: js/misc/systemActions.js:121
|
||||
#: js/misc/systemActions.js:125
|
||||
msgctxt "search-result"
|
||||
msgid "Switch User"
|
||||
msgstr "Cambi Utent"
|
||||
|
||||
#. Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||
#: js/misc/systemActions.js:124
|
||||
#: js/misc/systemActions.js:128
|
||||
msgid "switch user"
|
||||
msgstr "cambiâ utent"
|
||||
|
||||
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||
#: js/misc/systemActions.js:131
|
||||
#: js/misc/systemActions.js:135
|
||||
msgid "lock orientation;unlock orientation;screen;rotation"
|
||||
msgstr "bloc orientament;sbloc orientament;schermi;rotazion"
|
||||
|
||||
#: js/misc/systemActions.js:251
|
||||
#: js/misc/systemActions.js:255
|
||||
msgctxt "search-result"
|
||||
msgid "Unlock Screen Rotation"
|
||||
msgstr "Sbloche rotazion schermi"
|
||||
|
||||
#: js/misc/systemActions.js:252
|
||||
#: js/misc/systemActions.js:256
|
||||
msgctxt "search-result"
|
||||
msgid "Lock Screen Rotation"
|
||||
msgstr "Bloche rotazion schermi"
|
||||
@ -706,53 +706,53 @@ msgstr "Dinee acès"
|
||||
msgid "Grant Access"
|
||||
msgstr "Garantìs l'acès"
|
||||
|
||||
#: js/ui/appDisplay.js:932
|
||||
#: js/ui/appDisplay.js:939
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Cartele cence non"
|
||||
|
||||
#: js/ui/appDisplay.js:955
|
||||
#: js/ui/appDisplay.js:962
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "Lis aplicazions dopradis dispès a vignaran mostradis culì"
|
||||
|
||||
#: js/ui/appDisplay.js:1090
|
||||
#: js/ui/appDisplay.js:1097
|
||||
msgid "Frequent"
|
||||
msgstr "Dispès"
|
||||
|
||||
#: js/ui/appDisplay.js:1097
|
||||
#: js/ui/appDisplay.js:1104
|
||||
msgid "All"
|
||||
msgstr "Dutis"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
|
||||
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
|
||||
msgid "Open Windows"
|
||||
msgstr "Barcons vierts"
|
||||
|
||||
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "Gnûf barcon"
|
||||
|
||||
#: js/ui/appDisplay.js:2504
|
||||
#: js/ui/appDisplay.js:2511
|
||||
msgid "Launch using Dedicated Graphics Card"
|
||||
msgstr "Invie doprant une schede grafiche dedicade"
|
||||
|
||||
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Gjave dai preferîts"
|
||||
|
||||
#: js/ui/appDisplay.js:2538
|
||||
#: js/ui/appDisplay.js:2545
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Zonte tai preferîts"
|
||||
|
||||
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "Mostre Detais"
|
||||
|
||||
#: js/ui/appFavorites.js:152
|
||||
#: js/ui/appFavorites.js:153
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s al è stât zontât tai tiei preferîts."
|
||||
|
||||
#: js/ui/appFavorites.js:185
|
||||
#: js/ui/appFavorites.js:186
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s al è stât gjavât dai tiei preferîts."
|
||||
@ -1099,114 +1099,114 @@ msgstr "%-d di %B dal %Y"
|
||||
msgid "%A %B %e %Y"
|
||||
msgstr "%A %e di %B dal %Y"
|
||||
|
||||
#: js/ui/dateMenu.js:161
|
||||
#: js/ui/dateMenu.js:162
|
||||
msgid "Add world clocks…"
|
||||
msgstr "Zonte orlois mondiâi…"
|
||||
|
||||
#: js/ui/dateMenu.js:162
|
||||
#: js/ui/dateMenu.js:163
|
||||
msgid "World Clocks"
|
||||
msgstr "Orlois mondiâi"
|
||||
|
||||
#: js/ui/dateMenu.js:289
|
||||
#: js/ui/dateMenu.js:308
|
||||
msgid "Weather"
|
||||
msgstr "Timp"
|
||||
|
||||
#: js/ui/dateMenu.js:418
|
||||
#: js/ui/dateMenu.js:437
|
||||
msgid "Select a location…"
|
||||
msgstr "Selezione une posizion…"
|
||||
|
||||
#: js/ui/dateMenu.js:426
|
||||
#: js/ui/dateMenu.js:445
|
||||
msgid "Loading…"
|
||||
msgstr "Daûr a cjariâ…"
|
||||
|
||||
#: js/ui/dateMenu.js:436
|
||||
#: js/ui/dateMenu.js:455
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Va in rêt pes informazions sul timp"
|
||||
|
||||
#: js/ui/dateMenu.js:438
|
||||
#: js/ui/dateMenu.js:457
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "Lis informazions sul timp al moment no son disponibilis"
|
||||
|
||||
#: js/ui/endSessionDialog.js:39
|
||||
#: js/ui/endSessionDialog.js:37
|
||||
#, javascript-format
|
||||
msgctxt "title"
|
||||
msgid "Log Out %s"
|
||||
msgstr "Termine session di %s"
|
||||
|
||||
#: js/ui/endSessionDialog.js:40
|
||||
#: js/ui/endSessionDialog.js:38
|
||||
msgctxt "title"
|
||||
msgid "Log Out"
|
||||
msgstr "Termine session"
|
||||
|
||||
#: js/ui/endSessionDialog.js:42
|
||||
#: js/ui/endSessionDialog.js:40
|
||||
#, javascript-format
|
||||
msgid "%s will be logged out automatically in %d second."
|
||||
msgid_plural "%s will be logged out automatically in %d seconds."
|
||||
msgstr[0] "%s al jessarà in automatic chi di %d secont."
|
||||
msgstr[1] "%s al jessarà in automatic chi di %d seconts."
|
||||
|
||||
#: js/ui/endSessionDialog.js:47
|
||||
#: js/ui/endSessionDialog.js:45
|
||||
#, javascript-format
|
||||
msgid "You will be logged out automatically in %d second."
|
||||
msgid_plural "You will be logged out automatically in %d seconds."
|
||||
msgstr[0] "Tu jessarâs in automatic chi di %d secont."
|
||||
msgstr[1] "Tu jessarâs in automatic chi di %d seconts."
|
||||
|
||||
#: js/ui/endSessionDialog.js:53
|
||||
#: js/ui/endSessionDialog.js:51
|
||||
msgctxt "button"
|
||||
msgid "Log Out"
|
||||
msgstr "Jes"
|
||||
|
||||
#: js/ui/endSessionDialog.js:58
|
||||
#: js/ui/endSessionDialog.js:56
|
||||
msgctxt "title"
|
||||
msgid "Power Off"
|
||||
msgstr "Distude"
|
||||
|
||||
#: js/ui/endSessionDialog.js:59
|
||||
#: js/ui/endSessionDialog.js:57
|
||||
msgctxt "title"
|
||||
msgid "Install Updates & Power Off"
|
||||
msgstr "Instale inzornaments e distude"
|
||||
|
||||
#: js/ui/endSessionDialog.js:61
|
||||
#: js/ui/endSessionDialog.js:59
|
||||
#, javascript-format
|
||||
msgid "The system will power off automatically in %d second."
|
||||
msgid_plural "The system will power off automatically in %d seconds."
|
||||
msgstr[0] "Il sisteme si distudarà in automatic chi di %d secont."
|
||||
msgstr[1] "Il sisteme si studarà in automatic chi di %d seconts."
|
||||
|
||||
#: js/ui/endSessionDialog.js:65
|
||||
#: js/ui/endSessionDialog.js:63
|
||||
msgctxt "checkbox"
|
||||
msgid "Install pending software updates"
|
||||
msgstr "Instale i inzornaments software in spiete"
|
||||
|
||||
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
|
||||
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
|
||||
msgctxt "button"
|
||||
msgid "Restart"
|
||||
msgstr "Torne invie"
|
||||
|
||||
#: js/ui/endSessionDialog.js:70
|
||||
#: js/ui/endSessionDialog.js:68
|
||||
msgctxt "button"
|
||||
msgid "Power Off"
|
||||
msgstr "Distude"
|
||||
|
||||
#: js/ui/endSessionDialog.js:76
|
||||
#: js/ui/endSessionDialog.js:74
|
||||
msgctxt "title"
|
||||
msgid "Restart"
|
||||
msgstr "Torne invie"
|
||||
|
||||
#: js/ui/endSessionDialog.js:78
|
||||
#: js/ui/endSessionDialog.js:76
|
||||
#, javascript-format
|
||||
msgid "The system will restart automatically in %d second."
|
||||
msgid_plural "The system will restart automatically in %d seconds."
|
||||
msgstr[0] "Il sisteme si tornarà a inviâ in automatic chi di %d secont."
|
||||
msgstr[1] "Il sisteme si tornarà a inviâ in automatic chi di %d secont."
|
||||
|
||||
#: js/ui/endSessionDialog.js:91
|
||||
#: js/ui/endSessionDialog.js:89
|
||||
msgctxt "title"
|
||||
msgid "Restart & Install Updates"
|
||||
msgstr "Torne a inviâ e instale inzornaments"
|
||||
|
||||
#: js/ui/endSessionDialog.js:93
|
||||
#: js/ui/endSessionDialog.js:91
|
||||
#, javascript-format
|
||||
msgid "The system will automatically restart and install updates in %d second."
|
||||
msgid_plural ""
|
||||
@ -1218,22 +1218,22 @@ msgstr[1] ""
|
||||
"Il sisteme al tornarà a inviâsi in automatic instalant i inzornaments chi di "
|
||||
"%d seconts."
|
||||
|
||||
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
|
||||
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
|
||||
msgctxt "button"
|
||||
msgid "Restart & Install"
|
||||
msgstr "Torne invie e instale"
|
||||
|
||||
#: js/ui/endSessionDialog.js:100
|
||||
#: js/ui/endSessionDialog.js:98
|
||||
msgctxt "button"
|
||||
msgid "Install & Power Off"
|
||||
msgstr "Instale e distude"
|
||||
|
||||
#: js/ui/endSessionDialog.js:101
|
||||
#: js/ui/endSessionDialog.js:99
|
||||
msgctxt "checkbox"
|
||||
msgid "Power off after updates are installed"
|
||||
msgstr "Distude dopo vê instalât i inzornaments"
|
||||
|
||||
#: js/ui/endSessionDialog.js:108
|
||||
#: js/ui/endSessionDialog.js:106
|
||||
msgctxt "title"
|
||||
msgid "Restart & Install Upgrade"
|
||||
msgstr "Torne invie e instale avanzament"
|
||||
@ -1241,7 +1241,7 @@ msgstr "Torne invie e instale avanzament"
|
||||
#. Translators: This is the text displayed for system upgrades in the
|
||||
#. shut down dialog. First %s gets replaced with the distro name and
|
||||
#. second %s with the distro version to upgrade to
|
||||
#: js/ui/endSessionDialog.js:113
|
||||
#: js/ui/endSessionDialog.js:111
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"%s %s will be installed after restart. Upgrade installation can take a long "
|
||||
@ -1251,28 +1251,28 @@ msgstr ""
|
||||
"dal avanzament e pues tirâ a dilunc: siguriti di vê fat i backup e che il to "
|
||||
"computer al sedi tacât."
|
||||
|
||||
#: js/ui/endSessionDialog.js:261
|
||||
#: js/ui/endSessionDialog.js:259
|
||||
msgid "Running on battery power: Please plug in before installing updates."
|
||||
msgstr ""
|
||||
"Funzionament su batarie: par plasê tache la spine prime di instalâ i "
|
||||
"inzornaments."
|
||||
|
||||
#: js/ui/endSessionDialog.js:270
|
||||
#: js/ui/endSessionDialog.js:268
|
||||
msgid "Some applications are busy or have unsaved work"
|
||||
msgstr "Cualchi aplicazion e je impegnade opûr e à lavôrs no salvâts"
|
||||
|
||||
#: js/ui/endSessionDialog.js:275
|
||||
#: js/ui/endSessionDialog.js:273
|
||||
msgid "Other users are logged in"
|
||||
msgstr "Altris utents a son jentrâts"
|
||||
|
||||
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||
#: js/ui/endSessionDialog.js:588
|
||||
#: js/ui/endSessionDialog.js:586
|
||||
#, javascript-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (rimot)"
|
||||
|
||||
#. Translators: Console here refers to a tty like a VT console
|
||||
#: js/ui/endSessionDialog.js:591
|
||||
#: js/ui/endSessionDialog.js:589
|
||||
#, javascript-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (locâl vie tastiere)"
|
||||
@ -1290,11 +1290,11 @@ msgstr "Instale estension"
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Scjariâ e instalâ '%s' da extensions.gnome.org?"
|
||||
|
||||
#: js/ui/extensionSystem.js:233
|
||||
#: js/ui/extensionSystem.js:253
|
||||
msgid "Extension Updates Available"
|
||||
msgstr "Inzonraments di estensions disponibii"
|
||||
|
||||
#: js/ui/extensionSystem.js:234
|
||||
#: js/ui/extensionSystem.js:254
|
||||
msgid "Extension updates are ready to be installed."
|
||||
msgstr "I inzornaments des estensions a son pronts par jessi instalâts."
|
||||
|
||||
@ -1442,11 +1442,11 @@ msgstr "Viôt sorzint"
|
||||
msgid "Web Page"
|
||||
msgstr "Pagjine Web"
|
||||
|
||||
#: js/ui/main.js:277
|
||||
#: js/ui/main.js:279
|
||||
msgid "Logged in as a privileged user"
|
||||
msgstr "Jentre come utent privilegjât"
|
||||
|
||||
#: js/ui/main.js:278
|
||||
#: js/ui/main.js:280
|
||||
msgid ""
|
||||
"Running a session as a privileged user should be avoided for security "
|
||||
"reasons. If possible, you should log in as a normal user."
|
||||
@ -1454,23 +1454,23 @@ msgstr ""
|
||||
"Si varès di evitâ di eseguî une session come utent privilegjât par resons di "
|
||||
"sigurece. Se pussibil, tu varessis di jentrâ come utent normâl."
|
||||
|
||||
#: js/ui/main.js:317
|
||||
#: js/ui/main.js:319
|
||||
msgid "Screen Lock disabled"
|
||||
msgstr "Bloc dal schermi disabilitât"
|
||||
|
||||
#: js/ui/main.js:318
|
||||
#: js/ui/main.js:320
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "Il bloc dal schermi al à bisugne dal gjestôr dai visôrs di GNOME."
|
||||
|
||||
#: js/ui/messageTray.js:1551
|
||||
#: js/ui/messageTray.js:1548
|
||||
msgid "System Information"
|
||||
msgstr "Informazion di sisteme"
|
||||
|
||||
#: js/ui/mpris.js:199
|
||||
#: js/ui/mpris.js:204
|
||||
msgid "Unknown artist"
|
||||
msgstr "Artist no cognossût"
|
||||
|
||||
#: js/ui/mpris.js:209
|
||||
#: js/ui/mpris.js:214
|
||||
msgid "Unknown title"
|
||||
msgstr "Titul no cognossût"
|
||||
|
||||
@ -1516,24 +1516,24 @@ msgstr "Assegne batidure"
|
||||
msgid "Done"
|
||||
msgstr "Fat"
|
||||
|
||||
#: js/ui/padOsd.js:745
|
||||
#: js/ui/padOsd.js:732
|
||||
msgid "Edit…"
|
||||
msgstr "Modifiche…"
|
||||
|
||||
# masculin o feminin
|
||||
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
|
||||
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
|
||||
msgid "None"
|
||||
msgstr "Nissune"
|
||||
|
||||
#: js/ui/padOsd.js:863
|
||||
#: js/ui/padOsd.js:845
|
||||
msgid "Press a button to configure"
|
||||
msgstr "Frache un boton par configurâ"
|
||||
|
||||
#: js/ui/padOsd.js:864
|
||||
#: js/ui/padOsd.js:846
|
||||
msgid "Press Esc to exit"
|
||||
msgstr "Frache Esc par jessî"
|
||||
|
||||
#: js/ui/padOsd.js:867
|
||||
#: js/ui/padOsd.js:849
|
||||
msgid "Press any key to exit"
|
||||
msgstr "Frache un tast par jessî"
|
||||
|
||||
@ -1543,16 +1543,16 @@ msgstr "Jes"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: js/ui/panel.js:434
|
||||
#: js/ui/panel.js:437
|
||||
msgid "Activities"
|
||||
msgstr "Ativitâts"
|
||||
|
||||
#: js/ui/panel.js:713
|
||||
#: js/ui/panel.js:716
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sisteme"
|
||||
|
||||
#: js/ui/panel.js:826
|
||||
#: js/ui/panel.js:829
|
||||
msgid "Top Bar"
|
||||
msgstr "Sbare parsore"
|
||||
|
||||
@ -1584,11 +1584,11 @@ msgstr "GNOME al à di blocâ il visôr"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
|
||||
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
|
||||
msgid "Unable to lock"
|
||||
msgstr "Impussibil blocâ"
|
||||
|
||||
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
|
||||
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Il bloc al è stât dineât di une aplicazion"
|
||||
|
||||
@ -2241,7 +2241,7 @@ msgstr "Ripristine impostazions"
|
||||
msgid "Keep Changes"
|
||||
msgstr "Ten lis modifichis"
|
||||
|
||||
#: js/ui/windowManager.js:85
|
||||
#: js/ui/windowManager.js:86
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
msgid_plural "Settings changes will revert in %d seconds"
|
||||
@ -2252,7 +2252,7 @@ msgstr[1] ""
|
||||
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#: js/ui/windowManager.js:544
|
||||
#: js/ui/windowManager.js:546
|
||||
#, javascript-format
|
||||
msgid "%d × %d"
|
||||
msgstr "%d × %d"
|
||||
@ -2345,12 +2345,12 @@ msgstr "Dopre une modalitât specifiche, par esempli “gdm” pe videade di ac
|
||||
msgid "List possible modes"
|
||||
msgstr "Liste modalitâts pussibilis"
|
||||
|
||||
#: src/shell-app.c:279
|
||||
#: src/shell-app.c:286
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "No cognossût"
|
||||
|
||||
#: src/shell-app.c:530
|
||||
#: src/shell-app.c:537
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "No soi rivât a eseguî '%s'"
|
||||
@ -2473,19 +2473,19 @@ msgstr ""
|
||||
"prestazion. Se si verifichin problemis cul vuestri sisteme, si consee di "
|
||||
"disabilitâ dutis lis estensions."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
|
||||
msgid "Manually Installed"
|
||||
msgstr "Instalât a man"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
|
||||
msgid "Built-In"
|
||||
msgstr "Integrade"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
|
||||
msgid "No Installed Extensions"
|
||||
msgstr "Nissune estension instalade"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
|
||||
msgid ""
|
||||
"We’re very sorry, but it was not possible to get the list of installed "
|
||||
"extensions. Make sure you are logged into GNOME and try again."
|
||||
@ -2493,7 +2493,11 @@ msgstr ""
|
||||
"Nus displâs, ma nol è stât pussibil otignî la liste des estensions "
|
||||
"instaladis. Controle di jessi jentrât in GNOME e torne prove."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
|
||||
msgid "Extension Updates Ready"
|
||||
msgstr "Inzonraments di estensions pronts"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
|
||||
msgid "Log Out…"
|
||||
msgstr "Jes…"
|
||||
|
||||
|
40
po/ja.po
40
po/ja.po
@ -1,5 +1,5 @@
|
||||
# Japanese translation of gnome-shell package.
|
||||
# Copyright (C) 2009-2020 the gnome-shell copyright holder.
|
||||
# Copyright (C) 2010-2017, 2019-2020 the gnome-shell copyright holder.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Nishio Futoshi <fut_nis@d3.dion.ne.jp>, 2010.
|
||||
# Kiyotaka NISHIBORI <ml.nishibori.kiyotaka@gmail.com>, 2011.
|
||||
@ -16,8 +16,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-05-11 14:00+0000\n"
|
||||
"PO-Revision-Date: 2020-05-13 23:00+0900\n"
|
||||
"POT-Creation-Date: 2020-06-10 16:14+0000\n"
|
||||
"PO-Revision-Date: 2020-06-11 19:00+0900\n"
|
||||
"Last-Translator: sicklylife <translation@sicklylife.jp>\n"
|
||||
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
|
||||
"Language: ja\n"
|
||||
@ -1093,31 +1093,31 @@ msgstr "%Y年%-m月%-e日"
|
||||
msgid "%A %B %e %Y"
|
||||
msgstr "%Y年%-m月%-e日 (%a)"
|
||||
|
||||
#: js/ui/dateMenu.js:161
|
||||
#: js/ui/dateMenu.js:162
|
||||
msgid "Add world clocks…"
|
||||
msgstr "世界時計を追加…"
|
||||
|
||||
#: js/ui/dateMenu.js:162
|
||||
#: js/ui/dateMenu.js:163
|
||||
msgid "World Clocks"
|
||||
msgstr "世界時計"
|
||||
|
||||
#: js/ui/dateMenu.js:289
|
||||
#: js/ui/dateMenu.js:308
|
||||
msgid "Weather"
|
||||
msgstr "天気"
|
||||
|
||||
#: js/ui/dateMenu.js:418
|
||||
#: js/ui/dateMenu.js:437
|
||||
msgid "Select a location…"
|
||||
msgstr "場所を選択…"
|
||||
|
||||
#: js/ui/dateMenu.js:426
|
||||
#: js/ui/dateMenu.js:445
|
||||
msgid "Loading…"
|
||||
msgstr "読み込み中…"
|
||||
|
||||
#: js/ui/dateMenu.js:436
|
||||
#: js/ui/dateMenu.js:455
|
||||
msgid "Go online for weather information"
|
||||
msgstr "気象情報取得のためにネットワークに接続してください"
|
||||
|
||||
#: js/ui/dateMenu.js:438
|
||||
#: js/ui/dateMenu.js:457
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "気象情報を取得できません"
|
||||
|
||||
@ -1275,11 +1275,11 @@ msgstr "拡張機能をインストール"
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "extensions.gnome.org から“%s”をダウンロードしてインストールしますか?"
|
||||
|
||||
#: js/ui/extensionSystem.js:252
|
||||
#: js/ui/extensionSystem.js:253
|
||||
msgid "Extension Updates Available"
|
||||
msgstr "拡張機能のアップデートが利用可能です"
|
||||
|
||||
#: js/ui/extensionSystem.js:253
|
||||
#: js/ui/extensionSystem.js:254
|
||||
msgid "Extension updates are ready to be installed."
|
||||
msgstr "拡張機能のアップデートをインストールする準備ができました。"
|
||||
|
||||
@ -1449,11 +1449,11 @@ msgstr "画面ロックには GNOME ディスプレイマネージャーが必
|
||||
msgid "System Information"
|
||||
msgstr "システム情報"
|
||||
|
||||
#: js/ui/mpris.js:199
|
||||
#: js/ui/mpris.js:204
|
||||
msgid "Unknown artist"
|
||||
msgstr "不明なアーティスト"
|
||||
|
||||
#: js/ui/mpris.js:209
|
||||
#: js/ui/mpris.js:214
|
||||
msgid "Unknown title"
|
||||
msgstr "不明なタイトル"
|
||||
|
||||
@ -1499,23 +1499,23 @@ msgstr "キーストロークを割り当て"
|
||||
msgid "Done"
|
||||
msgstr "完了"
|
||||
|
||||
#: js/ui/padOsd.js:745
|
||||
#: js/ui/padOsd.js:732
|
||||
msgid "Edit…"
|
||||
msgstr "編集…"
|
||||
|
||||
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
|
||||
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
|
||||
msgid "None"
|
||||
msgstr "なし"
|
||||
|
||||
#: js/ui/padOsd.js:863
|
||||
#: js/ui/padOsd.js:845
|
||||
msgid "Press a button to configure"
|
||||
msgstr "ボタンを押して設定してください"
|
||||
|
||||
#: js/ui/padOsd.js:864
|
||||
#: js/ui/padOsd.js:846
|
||||
msgid "Press Esc to exit"
|
||||
msgstr "Esc を押すと終了します"
|
||||
|
||||
#: js/ui/padOsd.js:867
|
||||
#: js/ui/padOsd.js:849
|
||||
msgid "Press any key to exit"
|
||||
msgstr "キーを押すと終了します"
|
||||
|
||||
@ -2469,7 +2469,7 @@ msgstr ""
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
|
||||
msgid "Extension Updates Ready"
|
||||
msgstr "拡張機能を更新できます"
|
||||
msgstr "拡張機能の更新準備完了"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
|
||||
msgid "Log Out…"
|
||||
|
274
po/pt_BR.po
274
po/pt_BR.po
@ -24,8 +24,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-03-31 07:15+0000\n"
|
||||
"PO-Revision-Date: 2020-04-22 09:30-0300\n"
|
||||
"POT-Creation-Date: 2020-07-17 21:36+0000\n"
|
||||
"PO-Revision-Date: 2020-07-18 10:42-0300\n"
|
||||
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||
"Language: pt_BR\n"
|
||||
@ -42,11 +42,11 @@ msgstr "Sistema"
|
||||
|
||||
#: data/50-gnome-shell-system.xml:9
|
||||
msgid "Show the notification list"
|
||||
msgstr "Mostra a lista de notificação"
|
||||
msgstr "Mostrar a lista de notificação"
|
||||
|
||||
#: data/50-gnome-shell-system.xml:12
|
||||
msgid "Focus the active notification"
|
||||
msgstr "Ativar as notificação ativas"
|
||||
msgstr "Focar na notificação ativa"
|
||||
|
||||
#: data/50-gnome-shell-system.xml:15
|
||||
msgid "Show the overview"
|
||||
@ -58,7 +58,7 @@ msgstr "Mostrar todos os aplicativos"
|
||||
|
||||
#: data/50-gnome-shell-system.xml:21
|
||||
msgid "Open the application menu"
|
||||
msgstr "Abre o menu do aplicativo"
|
||||
msgstr "Abrir o menu do aplicativo"
|
||||
|
||||
#: data/org.gnome.Shell.desktop.in.in:4
|
||||
msgid "GNOME Shell"
|
||||
@ -414,7 +414,7 @@ msgid "Network Login"
|
||||
msgstr "Sessão de Rede"
|
||||
|
||||
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
|
||||
msgid "Something’s gone wrong"
|
||||
msgstr "Algo deu errado"
|
||||
|
||||
@ -442,7 +442,7 @@ msgstr "Visita a página web da extensão"
|
||||
|
||||
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
|
||||
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
|
||||
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
|
||||
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:183
|
||||
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
|
||||
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
|
||||
msgid "Cancel"
|
||||
@ -498,71 +498,71 @@ msgid "(or swipe finger)"
|
||||
msgstr "(ou deslize o dedo)"
|
||||
|
||||
#. Translators: The name of the power-off action in search
|
||||
#: js/misc/systemActions.js:89
|
||||
#: js/misc/systemActions.js:93
|
||||
msgctxt "search-result"
|
||||
msgid "Power Off"
|
||||
msgstr "Desligar"
|
||||
|
||||
#. Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||
#: js/misc/systemActions.js:92
|
||||
#: js/misc/systemActions.js:96
|
||||
msgid "power off;shutdown;reboot;restart;halt;stop"
|
||||
msgstr "desligar;desligamento;reinicialização;reiniciar"
|
||||
|
||||
#. Translators: The name of the lock screen action in search
|
||||
#: js/misc/systemActions.js:97
|
||||
#: js/misc/systemActions.js:101
|
||||
msgctxt "search-result"
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bloquear tela"
|
||||
|
||||
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||
#: js/misc/systemActions.js:100
|
||||
#: js/misc/systemActions.js:104
|
||||
msgid "lock screen"
|
||||
msgstr "tela de bloqueio"
|
||||
|
||||
#. Translators: The name of the logout action in search
|
||||
#: js/misc/systemActions.js:105
|
||||
#: js/misc/systemActions.js:109
|
||||
msgctxt "search-result"
|
||||
msgid "Log Out"
|
||||
msgstr "Encerrar sessão"
|
||||
|
||||
#. Translators: A list of keywords that match the logout action, separated by semicolons
|
||||
#: js/misc/systemActions.js:108
|
||||
#: js/misc/systemActions.js:112
|
||||
msgid "logout;log out;sign off"
|
||||
msgstr "encerrar sessão;desconectar;sair"
|
||||
|
||||
#. Translators: The name of the suspend action in search
|
||||
#: js/misc/systemActions.js:113
|
||||
#: js/misc/systemActions.js:117
|
||||
msgctxt "search-result"
|
||||
msgid "Suspend"
|
||||
msgstr "Suspender"
|
||||
|
||||
#. Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||
#: js/misc/systemActions.js:116
|
||||
#: js/misc/systemActions.js:120
|
||||
msgid "suspend;sleep"
|
||||
msgstr "suspender;dormir"
|
||||
|
||||
#. Translators: The name of the switch user action in search
|
||||
#: js/misc/systemActions.js:121
|
||||
#: js/misc/systemActions.js:125
|
||||
msgctxt "search-result"
|
||||
msgid "Switch User"
|
||||
msgstr "Alternar usuário"
|
||||
|
||||
#. Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||
#: js/misc/systemActions.js:124
|
||||
#: js/misc/systemActions.js:128
|
||||
msgid "switch user"
|
||||
msgstr "alternar usuário;trocar de usuário"
|
||||
|
||||
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||
#: js/misc/systemActions.js:131
|
||||
#: js/misc/systemActions.js:135
|
||||
msgid "lock orientation;unlock orientation;screen;rotation"
|
||||
msgstr "bloqueio de orientação;desbloqueio de orientação;tela;rotação"
|
||||
|
||||
#: js/misc/systemActions.js:251
|
||||
#: js/misc/systemActions.js:255
|
||||
msgctxt "search-result"
|
||||
msgid "Unlock Screen Rotation"
|
||||
msgstr "Desbloquear rotação de tela"
|
||||
|
||||
#: js/misc/systemActions.js:252
|
||||
#: js/misc/systemActions.js:256
|
||||
msgctxt "search-result"
|
||||
msgid "Lock Screen Rotation"
|
||||
msgstr "Bloquear rotação de tela"
|
||||
@ -728,53 +728,53 @@ msgstr "Negar acesso"
|
||||
msgid "Grant Access"
|
||||
msgstr "Conceder acesso"
|
||||
|
||||
#: js/ui/appDisplay.js:932
|
||||
#: js/ui/appDisplay.js:939
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Pasta sem nome"
|
||||
|
||||
#: js/ui/appDisplay.js:955
|
||||
#: js/ui/appDisplay.js:962
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
|
||||
|
||||
#: js/ui/appDisplay.js:1090
|
||||
#: js/ui/appDisplay.js:1097
|
||||
msgid "Frequent"
|
||||
msgstr "Frequente"
|
||||
|
||||
#: js/ui/appDisplay.js:1097
|
||||
#: js/ui/appDisplay.js:1104
|
||||
msgid "All"
|
||||
msgstr "Todos"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
|
||||
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75
|
||||
msgid "Open Windows"
|
||||
msgstr "Janelas abertas"
|
||||
|
||||
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "Nova janela"
|
||||
|
||||
#: js/ui/appDisplay.js:2504
|
||||
#: js/ui/appDisplay.js:2511
|
||||
msgid "Launch using Dedicated Graphics Card"
|
||||
msgstr "Inicia usando placa de vídeo dedicada"
|
||||
|
||||
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Remover dos favoritos"
|
||||
|
||||
#: js/ui/appDisplay.js:2538
|
||||
#: js/ui/appDisplay.js:2545
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Adicionar aos favoritos"
|
||||
|
||||
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "Mostrar detalhes"
|
||||
|
||||
#: js/ui/appFavorites.js:152
|
||||
#: js/ui/appFavorites.js:153
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s foi adicionado aos seus favoritos."
|
||||
|
||||
#: js/ui/appFavorites.js:185
|
||||
#: js/ui/appFavorites.js:186
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s foi removido dos seus favoritos."
|
||||
@ -795,7 +795,7 @@ msgstr "Fones de ouvido"
|
||||
msgid "Headset"
|
||||
msgstr "Fone de ouvido com microfone"
|
||||
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||
msgid "Microphone"
|
||||
msgstr "Microfone"
|
||||
|
||||
@ -869,7 +869,7 @@ msgstr "S"
|
||||
#. * "%OB" is the new format specifier introduced in glibc 2.27,
|
||||
#. * in most cases you should not change it.
|
||||
#.
|
||||
#: js/ui/calendar.js:371
|
||||
#: js/ui/calendar.js:396
|
||||
msgid "%OB"
|
||||
msgstr "%OB"
|
||||
|
||||
@ -882,61 +882,61 @@ msgstr "%OB"
|
||||
#. * in most cases you should not use the old "%B" here unless you
|
||||
#. * absolutely know what you are doing.
|
||||
#.
|
||||
#: js/ui/calendar.js:381
|
||||
#: js/ui/calendar.js:406
|
||||
msgid "%OB %Y"
|
||||
msgstr "%OB de %Y"
|
||||
|
||||
#: js/ui/calendar.js:440
|
||||
#: js/ui/calendar.js:465
|
||||
msgid "Previous month"
|
||||
msgstr "Mês anterior"
|
||||
|
||||
#: js/ui/calendar.js:455
|
||||
#: js/ui/calendar.js:480
|
||||
msgid "Next month"
|
||||
msgstr "Próximo mês"
|
||||
|
||||
#: js/ui/calendar.js:605
|
||||
#: js/ui/calendar.js:630
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: js/ui/calendar.js:661
|
||||
#: js/ui/calendar.js:686
|
||||
msgid "Week %V"
|
||||
msgstr "Semana %V"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#: js/ui/calendar.js:730
|
||||
#: js/ui/calendar.js:761
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Dia todo"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: js/ui/calendar.js:868
|
||||
#: js/ui/calendar.js:899
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %-d"
|
||||
msgstr "%A, %-d de %B"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: js/ui/calendar.js:871
|
||||
#: js/ui/calendar.js:902
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %-d, %Y"
|
||||
msgstr "%A, %-d de %B de %Y"
|
||||
|
||||
#: js/ui/calendar.js:1100
|
||||
#: js/ui/calendar.js:1132
|
||||
msgid "No Notifications"
|
||||
msgstr "Nenhuma notificação"
|
||||
|
||||
#: js/ui/calendar.js:1103
|
||||
#: js/ui/calendar.js:1135
|
||||
msgid "No Events"
|
||||
msgstr "Nenhum evento"
|
||||
|
||||
#: js/ui/calendar.js:1157
|
||||
#: js/ui/calendar.js:1189
|
||||
msgid "Do Not Disturb"
|
||||
msgstr "Não perturbe"
|
||||
|
||||
#: js/ui/calendar.js:1176
|
||||
#: js/ui/calendar.js:1208
|
||||
msgid "Clear"
|
||||
msgstr "Limpar"
|
||||
|
||||
@ -1122,114 +1122,114 @@ msgstr "%-d de %B de %Y"
|
||||
msgid "%A %B %e %Y"
|
||||
msgstr "%A, %e de %B de %Y"
|
||||
|
||||
#: js/ui/dateMenu.js:161
|
||||
#: js/ui/dateMenu.js:162
|
||||
msgid "Add world clocks…"
|
||||
msgstr "Adicionar relógios mundiais…"
|
||||
|
||||
#: js/ui/dateMenu.js:162
|
||||
#: js/ui/dateMenu.js:163
|
||||
msgid "World Clocks"
|
||||
msgstr "Relógios mundiais"
|
||||
|
||||
#: js/ui/dateMenu.js:289
|
||||
#: js/ui/dateMenu.js:308
|
||||
msgid "Weather"
|
||||
msgstr "Meteorologia"
|
||||
|
||||
#: js/ui/dateMenu.js:418
|
||||
#: js/ui/dateMenu.js:437
|
||||
msgid "Select a location…"
|
||||
msgstr "Selecione uma localização…"
|
||||
|
||||
#: js/ui/dateMenu.js:426
|
||||
#: js/ui/dateMenu.js:445
|
||||
msgid "Loading…"
|
||||
msgstr "Carregando…"
|
||||
|
||||
#: js/ui/dateMenu.js:436
|
||||
#: js/ui/dateMenu.js:455
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Conecte-se à internet para obter as informações meteorológicas"
|
||||
|
||||
#: js/ui/dateMenu.js:438
|
||||
#: js/ui/dateMenu.js:457
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "No momento as informações meteorológicas não estão disponíveis"
|
||||
|
||||
#: js/ui/endSessionDialog.js:39
|
||||
#: js/ui/endSessionDialog.js:37
|
||||
#, javascript-format
|
||||
msgctxt "title"
|
||||
msgid "Log Out %s"
|
||||
msgstr "Encerrar sessão de %s"
|
||||
|
||||
#: js/ui/endSessionDialog.js:40
|
||||
#: js/ui/endSessionDialog.js:38
|
||||
msgctxt "title"
|
||||
msgid "Log Out"
|
||||
msgstr "Encerrar sessão"
|
||||
|
||||
#: js/ui/endSessionDialog.js:42
|
||||
#: js/ui/endSessionDialog.js:40
|
||||
#, javascript-format
|
||||
msgid "%s will be logged out automatically in %d second."
|
||||
msgid_plural "%s will be logged out automatically in %d seconds."
|
||||
msgstr[0] "%s encerrará a sessão automaticamente em %d segundo."
|
||||
msgstr[1] "%s encerrará a sessão automaticamente em %d segundos."
|
||||
|
||||
#: js/ui/endSessionDialog.js:47
|
||||
#: js/ui/endSessionDialog.js:45
|
||||
#, javascript-format
|
||||
msgid "You will be logged out automatically in %d second."
|
||||
msgid_plural "You will be logged out automatically in %d seconds."
|
||||
msgstr[0] "Sua sessão será encerrada automaticamente em %d segundo."
|
||||
msgstr[1] "Sua sessão será encerrada automaticamente em %d segundos."
|
||||
|
||||
#: js/ui/endSessionDialog.js:53
|
||||
#: js/ui/endSessionDialog.js:51
|
||||
msgctxt "button"
|
||||
msgid "Log Out"
|
||||
msgstr "Encerrar sessão"
|
||||
|
||||
#: js/ui/endSessionDialog.js:58
|
||||
#: js/ui/endSessionDialog.js:56
|
||||
msgctxt "title"
|
||||
msgid "Power Off"
|
||||
msgstr "Desligar"
|
||||
|
||||
#: js/ui/endSessionDialog.js:59
|
||||
#: js/ui/endSessionDialog.js:57
|
||||
msgctxt "title"
|
||||
msgid "Install Updates & Power Off"
|
||||
msgstr "Instalar atualizações & desligar"
|
||||
|
||||
#: js/ui/endSessionDialog.js:61
|
||||
#: js/ui/endSessionDialog.js:59
|
||||
#, javascript-format
|
||||
msgid "The system will power off automatically in %d second."
|
||||
msgid_plural "The system will power off automatically in %d seconds."
|
||||
msgstr[0] "O sistema será desligado automaticamente em %d segundo."
|
||||
msgstr[1] "O sistema será desligado automaticamente em %d segundos."
|
||||
|
||||
#: js/ui/endSessionDialog.js:65
|
||||
#: js/ui/endSessionDialog.js:63
|
||||
msgctxt "checkbox"
|
||||
msgid "Install pending software updates"
|
||||
msgstr "Instalar atualizações de software pendentes"
|
||||
|
||||
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
|
||||
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
|
||||
msgctxt "button"
|
||||
msgid "Restart"
|
||||
msgstr "Reiniciar"
|
||||
|
||||
#: js/ui/endSessionDialog.js:70
|
||||
#: js/ui/endSessionDialog.js:68
|
||||
msgctxt "button"
|
||||
msgid "Power Off"
|
||||
msgstr "Desligar"
|
||||
|
||||
#: js/ui/endSessionDialog.js:76
|
||||
#: js/ui/endSessionDialog.js:74
|
||||
msgctxt "title"
|
||||
msgid "Restart"
|
||||
msgstr "Reiniciar"
|
||||
|
||||
#: js/ui/endSessionDialog.js:78
|
||||
#: js/ui/endSessionDialog.js:76
|
||||
#, javascript-format
|
||||
msgid "The system will restart automatically in %d second."
|
||||
msgid_plural "The system will restart automatically in %d seconds."
|
||||
msgstr[0] "O sistema irá reiniciar automaticamente em %d segundo."
|
||||
msgstr[1] "O sistema irá reiniciar automaticamente em %d segundos."
|
||||
|
||||
#: js/ui/endSessionDialog.js:91
|
||||
#: js/ui/endSessionDialog.js:89
|
||||
msgctxt "title"
|
||||
msgid "Restart & Install Updates"
|
||||
msgstr "Reiniciar & instalar atualizações"
|
||||
|
||||
#: js/ui/endSessionDialog.js:93
|
||||
#: js/ui/endSessionDialog.js:91
|
||||
#, javascript-format
|
||||
msgid "The system will automatically restart and install updates in %d second."
|
||||
msgid_plural ""
|
||||
@ -1241,22 +1241,22 @@ msgstr[1] ""
|
||||
"O sistema irá reiniciar e instalar atualizações automaticamente em %d "
|
||||
"segundos."
|
||||
|
||||
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
|
||||
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
|
||||
msgctxt "button"
|
||||
msgid "Restart & Install"
|
||||
msgstr "Reiniciar & instalar"
|
||||
|
||||
#: js/ui/endSessionDialog.js:100
|
||||
#: js/ui/endSessionDialog.js:98
|
||||
msgctxt "button"
|
||||
msgid "Install & Power Off"
|
||||
msgstr "Instalar & desligar"
|
||||
|
||||
#: js/ui/endSessionDialog.js:101
|
||||
#: js/ui/endSessionDialog.js:99
|
||||
msgctxt "checkbox"
|
||||
msgid "Power off after updates are installed"
|
||||
msgstr "Desligar após atualizações serem instaladas"
|
||||
|
||||
#: js/ui/endSessionDialog.js:108
|
||||
#: js/ui/endSessionDialog.js:106
|
||||
msgctxt "title"
|
||||
msgid "Restart & Install Upgrade"
|
||||
msgstr "Reiniciar & instalar atualizações"
|
||||
@ -1264,7 +1264,7 @@ msgstr "Reiniciar & instalar atualizações"
|
||||
#. Translators: This is the text displayed for system upgrades in the
|
||||
#. shut down dialog. First %s gets replaced with the distro name and
|
||||
#. second %s with the distro version to upgrade to
|
||||
#: js/ui/endSessionDialog.js:113
|
||||
#: js/ui/endSessionDialog.js:111
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"%s %s will be installed after restart. Upgrade installation can take a long "
|
||||
@ -1274,49 +1274,49 @@ msgstr ""
|
||||
"pode levar um longo tempo: certifique-se de que fez cópia de segurança (back "
|
||||
"up) e que o computador esteja ligado na tomada."
|
||||
|
||||
#: js/ui/endSessionDialog.js:261
|
||||
#: js/ui/endSessionDialog.js:259
|
||||
msgid "Running on battery power: Please plug in before installing updates."
|
||||
msgstr ""
|
||||
"Funcionando na bateria: conecte na tomada antes de instalar atualizações."
|
||||
|
||||
#: js/ui/endSessionDialog.js:270
|
||||
#: js/ui/endSessionDialog.js:268
|
||||
msgid "Some applications are busy or have unsaved work"
|
||||
msgstr "Alguns aplicativos estão ocupados ou possuem trabalhos não salvos"
|
||||
|
||||
#: js/ui/endSessionDialog.js:275
|
||||
#: js/ui/endSessionDialog.js:273
|
||||
msgid "Other users are logged in"
|
||||
msgstr "Outros usuários estão com sessão aberta"
|
||||
|
||||
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||
#: js/ui/endSessionDialog.js:588
|
||||
#: js/ui/endSessionDialog.js:586
|
||||
#, javascript-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (remoto)"
|
||||
|
||||
#. Translators: Console here refers to a tty like a VT console
|
||||
#: js/ui/endSessionDialog.js:591
|
||||
#: js/ui/endSessionDialog.js:589
|
||||
#, javascript-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (console)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
msgid "Install"
|
||||
msgstr "Instalar"
|
||||
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
msgid "Install Extension"
|
||||
msgstr "Instalar extensão"
|
||||
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Baixar e instalar “%s” de extensions.gnome.org?"
|
||||
|
||||
#: js/ui/extensionSystem.js:233
|
||||
#: js/ui/extensionSystem.js:253
|
||||
msgid "Extension Updates Available"
|
||||
msgstr "Atualizações de extensões disponíveis"
|
||||
|
||||
#: js/ui/extensionSystem.js:234
|
||||
#: js/ui/extensionSystem.js:254
|
||||
msgid "Extension updates are ready to be installed."
|
||||
msgstr "Atualizações de extensões estão prontas para serem instaladas."
|
||||
|
||||
@ -1340,11 +1340,11 @@ msgstr "Um aplicativo deseja inibir atalhos"
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "Você pode restaurar os atalhos pressionando %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Deny"
|
||||
msgstr "Negar"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
msgid "Allow"
|
||||
msgstr "Permitir"
|
||||
|
||||
@ -1413,7 +1413,7 @@ msgstr "Desligar"
|
||||
msgid "Leave Off"
|
||||
msgstr "Deixar desativado"
|
||||
|
||||
#: js/ui/keyboard.js:207
|
||||
#: js/ui/keyboard.js:225
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Configurações regionais e de idioma"
|
||||
|
||||
@ -1465,11 +1465,11 @@ msgstr "Ver fonte"
|
||||
msgid "Web Page"
|
||||
msgstr "Página web"
|
||||
|
||||
#: js/ui/main.js:277
|
||||
#: js/ui/main.js:279
|
||||
msgid "Logged in as a privileged user"
|
||||
msgstr "Sessão aberta como um usuário privilegiado"
|
||||
|
||||
#: js/ui/main.js:278
|
||||
#: js/ui/main.js:280
|
||||
msgid ""
|
||||
"Running a session as a privileged user should be avoided for security "
|
||||
"reasons. If possible, you should log in as a normal user."
|
||||
@ -1477,33 +1477,33 @@ msgstr ""
|
||||
"Usar uma sessão como um usuário privilegiado deve ser evitado por motivos de "
|
||||
"segurança. Se possível, você deve abrir uma sessão como um usuário normal."
|
||||
|
||||
#: js/ui/main.js:317
|
||||
#: js/ui/main.js:319
|
||||
msgid "Screen Lock disabled"
|
||||
msgstr "Bloqueio de tela desabilitado"
|
||||
|
||||
#: js/ui/main.js:318
|
||||
#: js/ui/main.js:320
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "O bloqueio de tela requer o gerenciador de exibição do GNOME."
|
||||
|
||||
#: js/ui/messageTray.js:1551
|
||||
#: js/ui/messageTray.js:1548
|
||||
msgid "System Information"
|
||||
msgstr "Informações do sistema"
|
||||
|
||||
#: js/ui/mpris.js:199
|
||||
#: js/ui/mpris.js:204
|
||||
msgid "Unknown artist"
|
||||
msgstr "Artista desconhecido"
|
||||
|
||||
#: js/ui/mpris.js:209
|
||||
#: js/ui/mpris.js:214
|
||||
msgid "Unknown title"
|
||||
msgstr "Título desconhecido"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "Desfazer"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "Panorama"
|
||||
|
||||
@ -1511,7 +1511,7 @@ msgstr "Panorama"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
msgstr "Digite para pesquisar"
|
||||
|
||||
@ -1539,23 +1539,23 @@ msgstr "Atribuir atalho"
|
||||
msgid "Done"
|
||||
msgstr "Concluído"
|
||||
|
||||
#: js/ui/padOsd.js:745
|
||||
#: js/ui/padOsd.js:732
|
||||
msgid "Edit…"
|
||||
msgstr "Editar…"
|
||||
|
||||
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
|
||||
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
|
||||
msgid "None"
|
||||
msgstr "Nenhum"
|
||||
|
||||
#: js/ui/padOsd.js:863
|
||||
#: js/ui/padOsd.js:845
|
||||
msgid "Press a button to configure"
|
||||
msgstr "Pressione um botão para configurar"
|
||||
|
||||
#: js/ui/padOsd.js:864
|
||||
#: js/ui/padOsd.js:846
|
||||
msgid "Press Esc to exit"
|
||||
msgstr "Pressione Esc para sair"
|
||||
|
||||
#: js/ui/padOsd.js:867
|
||||
#: js/ui/padOsd.js:849
|
||||
msgid "Press any key to exit"
|
||||
msgstr "Pressione qualquer tecla para sair"
|
||||
|
||||
@ -1565,16 +1565,16 @@ msgstr "Sair"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: js/ui/panel.js:434
|
||||
#: js/ui/panel.js:437
|
||||
msgid "Activities"
|
||||
msgstr "Atividades"
|
||||
|
||||
#: js/ui/panel.js:713
|
||||
#: js/ui/panel.js:716
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: js/ui/panel.js:826
|
||||
#: js/ui/panel.js:829
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
@ -1605,11 +1605,11 @@ msgstr "GNOME precisa bloquear a tela"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
|
||||
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
|
||||
msgid "Unable to lock"
|
||||
msgstr "Não foi possível bloquear"
|
||||
|
||||
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
|
||||
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "O bloqueio foi impedido por um aplicativo"
|
||||
|
||||
@ -2175,11 +2175,11 @@ msgstr "Erro de autorização de thunderbolt"
|
||||
msgid "Could not authorize the Thunderbolt device: %s"
|
||||
msgstr "Não foi possível autorizar o dispositivo Thunderbolt: %s"
|
||||
|
||||
#: js/ui/status/volume.js:151
|
||||
#: js/ui/status/volume.js:154
|
||||
msgid "Volume changed"
|
||||
msgstr "Volume alterado"
|
||||
|
||||
#: js/ui/status/volume.js:222
|
||||
#: js/ui/status/volume.js:225
|
||||
msgid "Volume"
|
||||
msgstr "Volume"
|
||||
|
||||
@ -2225,11 +2225,11 @@ msgstr "Deslize para desbloquear"
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "Clique ou pressione uma tecla para desbloquear"
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
#: js/ui/unlockDialog.js:554
|
||||
msgid "Unlock Window"
|
||||
msgstr "Desbloquear janela"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:563
|
||||
msgid "Log in as another user"
|
||||
msgstr "Iniciar sessão como outro usuário"
|
||||
|
||||
@ -2264,7 +2264,7 @@ msgstr "Reverter configurações"
|
||||
msgid "Keep Changes"
|
||||
msgstr "Manter alterações"
|
||||
|
||||
#: js/ui/windowManager.js:85
|
||||
#: js/ui/windowManager.js:86
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
msgid_plural "Settings changes will revert in %d seconds"
|
||||
@ -2273,7 +2273,7 @@ msgstr[1] "Alterações nas configurações serão revertidas em %d segundos"
|
||||
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#: js/ui/windowManager.js:544
|
||||
#: js/ui/windowManager.js:546
|
||||
#, javascript-format
|
||||
msgid "%d × %d"
|
||||
msgstr "%d × %d"
|
||||
@ -2367,12 +2367,12 @@ msgstr ""
|
||||
msgid "List possible modes"
|
||||
msgstr "Listar modos possíveis"
|
||||
|
||||
#: src/shell-app.c:279
|
||||
#: src/shell-app.c:286
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconhecido"
|
||||
|
||||
#: src/shell-app.c:530
|
||||
#: src/shell-app.c:537
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Erro ao lançar “%s”"
|
||||
@ -2412,7 +2412,7 @@ msgstr ""
|
||||
|
||||
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
|
||||
msgid "Configure GNOME Shell Extensions"
|
||||
msgstr "Configurar extensões do Shell do GNOME"
|
||||
msgstr "Configure extensões do Shell do GNOME"
|
||||
|
||||
#: subprojects/extensions-app/js/main.js:144
|
||||
#, javascript-format
|
||||
@ -2443,7 +2443,7 @@ msgstr[0] "%d extensão será atualizada na próxima sessão."
|
||||
msgstr[1] "%d extensões serão atualizadas na próxima sessão."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extension-row.ui:100
|
||||
#: subprojects/extensions-tool/src/command-create.c:211
|
||||
#: subprojects/extensions-tool/src/command-create.c:235
|
||||
#: subprojects/extensions-tool/src/main.c:173
|
||||
msgid "Description"
|
||||
msgstr "Descrição"
|
||||
@ -2495,19 +2495,19 @@ msgstr ""
|
||||
"desempenho. Se você encontrar problemas com o seu sistema, é recomendável "
|
||||
"desativar todas as extensões."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
|
||||
msgid "Manually Installed"
|
||||
msgstr "Instalada manualmente"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
|
||||
msgid "Built-In"
|
||||
msgstr "Interna"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
|
||||
msgid "No Installed Extensions"
|
||||
msgstr "Nenhuma extensão instalada"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
|
||||
msgid ""
|
||||
"We’re very sorry, but it was not possible to get the list of installed "
|
||||
"extensions. Make sure you are logged into GNOME and try again."
|
||||
@ -2515,17 +2515,21 @@ msgstr ""
|
||||
"Sentimos muito, mas não foi possível obter a lista de extensões instaladas. "
|
||||
"Certifique-se de estar em uma sessão do GNOME e tente novamente."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
|
||||
msgid "Extension Updates Ready"
|
||||
msgstr "Atualizações de extensões prontas"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
|
||||
msgid "Log Out…"
|
||||
msgstr "Encerrar sessão…"
|
||||
|
||||
#. Translators: a file path to an extension directory
|
||||
#: subprojects/extensions-tool/src/command-create.c:125
|
||||
#: subprojects/extensions-tool/src/command-create.c:149
|
||||
#, c-format
|
||||
msgid "The new extension was successfully created in %s.\n"
|
||||
msgstr "A nova extensão foi criada com sucesso em %s.\n"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:194
|
||||
#: subprojects/extensions-tool/src/command-create.c:218
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Name should be a very short (ideally descriptive) string.\n"
|
||||
@ -2534,12 +2538,12 @@ msgstr ""
|
||||
"O nome deve ser uma string muito curta (idealmente descritiva.\n"
|
||||
"Exemplos são: %s"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:197
|
||||
#: subprojects/extensions-tool/src/command-create.c:221
|
||||
#: subprojects/extensions-tool/src/main.c:170
|
||||
msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:208
|
||||
#: subprojects/extensions-tool/src/command-create.c:232
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Description is a single-sentence explanation of what your extension does.\n"
|
||||
@ -2548,7 +2552,7 @@ msgstr ""
|
||||
"Descrição é uma explicação uma só frase do que sua extensão faz.\n"
|
||||
"Exemplos são: %s"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:222
|
||||
#: subprojects/extensions-tool/src/command-create.c:246
|
||||
msgid ""
|
||||
"UUID is a globally-unique identifier for your extension.\n"
|
||||
"This should be in the format of an email address (clicktofocus@janedoe."
|
||||
@ -2558,40 +2562,40 @@ msgstr ""
|
||||
"Deve estar no formato de um endereço de e-mail (cliqueparafoco@janedoe."
|
||||
"example.com)\n"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:244
|
||||
#: subprojects/extensions-tool/src/command-create.c:268
|
||||
msgid "The unique identifier of the new extension"
|
||||
msgstr "O identificador único para a nova extensão"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:247
|
||||
#: subprojects/extensions-tool/src/command-create.c:271
|
||||
msgid "NAME"
|
||||
msgstr "NOME"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:248
|
||||
#: subprojects/extensions-tool/src/command-create.c:272
|
||||
msgid "The user-visible name of the new extension"
|
||||
msgstr "O nome visível do usuário da nova extensão"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:250
|
||||
#: subprojects/extensions-tool/src/command-create.c:274
|
||||
msgid "DESCRIPTION"
|
||||
msgstr "DESCRIÇÃO"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:252
|
||||
#: subprojects/extensions-tool/src/command-create.c:276
|
||||
msgid "A short description of what the extension does"
|
||||
msgstr "Uma descrição curta do que a extensão faz"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:255
|
||||
#: subprojects/extensions-tool/src/command-create.c:279
|
||||
msgid "Enter extension information interactively"
|
||||
msgstr "Insira as informações da extensão interativamente"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:263
|
||||
#: subprojects/extensions-tool/src/command-create.c:287
|
||||
msgid "Create a new extension"
|
||||
msgstr "Cria uma nova extensão"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:280
|
||||
#: subprojects/extensions-tool/src/command-create.c:304
|
||||
#: subprojects/extensions-tool/src/command-list.c:168
|
||||
msgid "Unknown arguments"
|
||||
msgstr "Argumentos desconhecidos"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:289
|
||||
#: subprojects/extensions-tool/src/command-create.c:313
|
||||
msgid "UUID, name and description are required"
|
||||
msgstr "UUID, nome e descrição são necessários"
|
||||
|
||||
|
76
po/ro.po
76
po/ro.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-05-12 14:15+0000\n"
|
||||
"PO-Revision-Date: 2020-05-12 22:07+0200\n"
|
||||
"POT-Creation-Date: 2020-06-30 14:09+0000\n"
|
||||
"PO-Revision-Date: 2020-07-06 13:36+0200\n"
|
||||
"Last-Translator: Florentina Mușat <florentina.musat.28 [at] gmail [dot] "
|
||||
"com>\n"
|
||||
"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
|
||||
@ -22,7 +22,7 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n"
|
||||
"%100<=19) ? 1 : 2);\n"
|
||||
"20)) ? 1: 2);\n"
|
||||
"X-Generator: Poedit 2.3\n"
|
||||
"X-Generator: Poedit 2.3.1\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
@ -865,7 +865,7 @@ msgstr "S"
|
||||
#. * "%OB" is the new format specifier introduced in glibc 2.27,
|
||||
#. * in most cases you should not change it.
|
||||
#.
|
||||
#: js/ui/calendar.js:371
|
||||
#: js/ui/calendar.js:396
|
||||
msgid "%OB"
|
||||
msgstr "%OB"
|
||||
|
||||
@ -878,61 +878,61 @@ msgstr "%OB"
|
||||
#. * in most cases you should not use the old "%B" here unless you
|
||||
#. * absolutely know what you are doing.
|
||||
#.
|
||||
#: js/ui/calendar.js:381
|
||||
#: js/ui/calendar.js:406
|
||||
msgid "%OB %Y"
|
||||
msgstr "%OB %Y"
|
||||
|
||||
#: js/ui/calendar.js:440
|
||||
#: js/ui/calendar.js:465
|
||||
msgid "Previous month"
|
||||
msgstr "Luna precedentă"
|
||||
|
||||
#: js/ui/calendar.js:455
|
||||
#: js/ui/calendar.js:480
|
||||
msgid "Next month"
|
||||
msgstr "Luna viitoare"
|
||||
|
||||
#: js/ui/calendar.js:605
|
||||
#: js/ui/calendar.js:630
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: js/ui/calendar.js:661
|
||||
#: js/ui/calendar.js:686
|
||||
msgid "Week %V"
|
||||
msgstr "Săptămâna %V"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#: js/ui/calendar.js:730
|
||||
#: js/ui/calendar.js:761
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Toată ziua"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: js/ui/calendar.js:868
|
||||
#: js/ui/calendar.js:899
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %-d"
|
||||
msgstr "%A, %B %-d"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: js/ui/calendar.js:871
|
||||
#: js/ui/calendar.js:902
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %-d, %Y"
|
||||
msgstr "%A, %B %-d, %Y"
|
||||
|
||||
#: js/ui/calendar.js:1100
|
||||
#: js/ui/calendar.js:1132
|
||||
msgid "No Notifications"
|
||||
msgstr "Nu există notificări"
|
||||
|
||||
#: js/ui/calendar.js:1103
|
||||
#: js/ui/calendar.js:1135
|
||||
msgid "No Events"
|
||||
msgstr "Nu există evenimente"
|
||||
|
||||
#: js/ui/calendar.js:1157
|
||||
#: js/ui/calendar.js:1189
|
||||
msgid "Do Not Disturb"
|
||||
msgstr "Nu deranjați"
|
||||
|
||||
#: js/ui/calendar.js:1176
|
||||
#: js/ui/calendar.js:1208
|
||||
msgid "Clear"
|
||||
msgstr "Curăță"
|
||||
|
||||
@ -1118,31 +1118,31 @@ msgstr "%B %-d %Y"
|
||||
msgid "%A %B %e %Y"
|
||||
msgstr "%A %B %e %Y"
|
||||
|
||||
#: js/ui/dateMenu.js:161
|
||||
#: js/ui/dateMenu.js:162
|
||||
msgid "Add world clocks…"
|
||||
msgstr "Adaugă un fus orar…"
|
||||
|
||||
#: js/ui/dateMenu.js:162
|
||||
#: js/ui/dateMenu.js:163
|
||||
msgid "World Clocks"
|
||||
msgstr "Fusuri orare"
|
||||
|
||||
#: js/ui/dateMenu.js:289
|
||||
#: js/ui/dateMenu.js:308
|
||||
msgid "Weather"
|
||||
msgstr "Vreme"
|
||||
|
||||
#: js/ui/dateMenu.js:418
|
||||
#: js/ui/dateMenu.js:437
|
||||
msgid "Select a location…"
|
||||
msgstr "Selectați o locație…"
|
||||
|
||||
#: js/ui/dateMenu.js:426
|
||||
#: js/ui/dateMenu.js:445
|
||||
msgid "Loading…"
|
||||
msgstr "Se încarcă…"
|
||||
|
||||
#: js/ui/dateMenu.js:436
|
||||
#: js/ui/dateMenu.js:455
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Conectați-vă la internet pentru informații despre vreme"
|
||||
|
||||
#: js/ui/dateMenu.js:438
|
||||
#: js/ui/dateMenu.js:457
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "Informațiile despre vreme nu sunt disponibile momentan"
|
||||
|
||||
@ -1309,11 +1309,11 @@ msgstr "Instalează extensia"
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Descărcați și instalați „%s” de la extensions.gnome.org?"
|
||||
|
||||
#: js/ui/extensionSystem.js:252
|
||||
#: js/ui/extensionSystem.js:253
|
||||
msgid "Extension Updates Available"
|
||||
msgstr "Sunt disponibile actualizări pentru extensii"
|
||||
|
||||
#: js/ui/extensionSystem.js:253
|
||||
#: js/ui/extensionSystem.js:254
|
||||
msgid "Extension updates are ready to be installed."
|
||||
msgstr "Actualizările de extensie sunt gata de instalare."
|
||||
|
||||
@ -1487,21 +1487,21 @@ msgstr "Blocarea ecranului necesită managerul de afișaj GNOME."
|
||||
msgid "System Information"
|
||||
msgstr "Informații despre sistem"
|
||||
|
||||
#: js/ui/mpris.js:199
|
||||
#: js/ui/mpris.js:204
|
||||
msgid "Unknown artist"
|
||||
msgstr "Artist necunoscut"
|
||||
|
||||
#: js/ui/mpris.js:209
|
||||
#: js/ui/mpris.js:214
|
||||
msgid "Unknown title"
|
||||
msgstr "Titlu necunoscut"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "Anulează"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "Prezentare generală"
|
||||
|
||||
@ -1509,7 +1509,7 @@ msgstr "Prezentare generală"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
msgstr "Tastați pentru a căuta"
|
||||
|
||||
@ -1537,23 +1537,23 @@ msgstr "Alochează tasta apăsată"
|
||||
msgid "Done"
|
||||
msgstr "Gata"
|
||||
|
||||
#: js/ui/padOsd.js:745
|
||||
#: js/ui/padOsd.js:732
|
||||
msgid "Edit…"
|
||||
msgstr "Editează…"
|
||||
|
||||
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
|
||||
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
|
||||
msgid "None"
|
||||
msgstr "Nespecificat"
|
||||
|
||||
#: js/ui/padOsd.js:863
|
||||
#: js/ui/padOsd.js:845
|
||||
msgid "Press a button to configure"
|
||||
msgstr "Apăsați un buton de configurat"
|
||||
|
||||
#: js/ui/padOsd.js:864
|
||||
#: js/ui/padOsd.js:846
|
||||
msgid "Press Esc to exit"
|
||||
msgstr "Apăsați Esc pentru a ieși"
|
||||
|
||||
#: js/ui/padOsd.js:867
|
||||
#: js/ui/padOsd.js:849
|
||||
msgid "Press any key to exit"
|
||||
msgstr "Apăsați orice tastă pentru a ieși"
|
||||
|
||||
@ -2224,13 +2224,13 @@ msgstr "Glisează în sus pentru a debloca"
|
||||
|
||||
#: js/ui/unlockDialog.js:378
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "Dați clic sau apăsați o tastă pentru a debloca"
|
||||
msgstr "Apăsați clic sau o tastă pentru a debloca"
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
#: js/ui/unlockDialog.js:554
|
||||
msgid "Unlock Window"
|
||||
msgstr "Deblochează fereastră"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:563
|
||||
msgid "Log in as another user"
|
||||
msgstr "Intră în sesiune ca utilizator diferit"
|
||||
|
||||
|
1758
po/zh_CN.po
1758
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
@ -45,199 +45,155 @@ struct _ClientData
|
||||
gulong backend_died_id;
|
||||
};
|
||||
|
||||
struct _CalendarSourceData
|
||||
{
|
||||
ECalClientSourceType source_type;
|
||||
CalendarSources *sources;
|
||||
guint changed_signal;
|
||||
|
||||
/* ESource -> EClient */
|
||||
GHashTable *clients;
|
||||
|
||||
guint timeout_id;
|
||||
|
||||
guint loaded : 1;
|
||||
};
|
||||
|
||||
typedef struct _CalendarSourcesPrivate CalendarSourcesPrivate;
|
||||
|
||||
struct _CalendarSources
|
||||
{
|
||||
GObject parent;
|
||||
CalendarSourcesPrivate *priv;
|
||||
|
||||
ESourceRegistryWatcher *registry_watcher;
|
||||
gulong filter_id;
|
||||
gulong appeared_id;
|
||||
gulong disappeared_id;
|
||||
|
||||
GMutex clients_lock;
|
||||
GHashTable *clients; /* ESource -> ClientData */
|
||||
};
|
||||
|
||||
struct _CalendarSourcesPrivate
|
||||
{
|
||||
ESourceRegistry *registry;
|
||||
gulong source_added_id;
|
||||
gulong source_changed_id;
|
||||
gulong source_removed_id;
|
||||
|
||||
CalendarSourceData appointment_sources;
|
||||
CalendarSourceData task_sources;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (CalendarSources, calendar_sources, G_TYPE_OBJECT)
|
||||
|
||||
static void calendar_sources_finalize (GObject *object);
|
||||
|
||||
static void backend_died_cb (EClient *client, CalendarSourceData *source_data);
|
||||
static void calendar_sources_registry_source_changed_cb (ESourceRegistry *registry,
|
||||
ESource *source,
|
||||
CalendarSources *sources);
|
||||
static void calendar_sources_registry_source_removed_cb (ESourceRegistry *registry,
|
||||
ESource *source,
|
||||
CalendarSources *sources);
|
||||
G_DEFINE_TYPE (CalendarSources, calendar_sources, G_TYPE_OBJECT)
|
||||
|
||||
enum
|
||||
{
|
||||
APPOINTMENT_SOURCES_CHANGED,
|
||||
TASK_SOURCES_CHANGED,
|
||||
CLIENT_APPEARED,
|
||||
CLIENT_DISAPPEARED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
static guint signals [LAST_SIGNAL] = { 0, };
|
||||
|
||||
static GObjectClass *parent_class = NULL;
|
||||
static CalendarSources *calendar_sources_singleton = NULL;
|
||||
static void
|
||||
calendar_sources_client_connected_cb (GObject *source_object,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
CalendarSources *sources = CALENDAR_SOURCES (source_object);
|
||||
ESource *source = user_data;
|
||||
EClient *client;
|
||||
g_autoptr (GError) error = NULL;
|
||||
|
||||
/* The calendar_sources_connect_client_sync() already stored the 'client'
|
||||
* into the sources->clients */
|
||||
client = calendar_sources_connect_client_finish (sources, result, &error);
|
||||
if (error)
|
||||
{
|
||||
g_warning ("Could not load source '%s': %s",
|
||||
e_source_get_uid (source),
|
||||
error->message);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_signal_emit (sources, signals[CLIENT_APPEARED], 0, client, NULL);
|
||||
}
|
||||
|
||||
g_clear_object (&client);
|
||||
g_clear_object (&source);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
registry_watcher_filter_cb (ESourceRegistryWatcher *watcher,
|
||||
ESource *source,
|
||||
CalendarSources *sources)
|
||||
{
|
||||
return e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR) &&
|
||||
e_source_selectable_get_selected (e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR));
|
||||
}
|
||||
|
||||
static void
|
||||
registry_watcher_source_appeared_cb (ESourceRegistryWatcher *watcher,
|
||||
ESource *source,
|
||||
CalendarSources *sources)
|
||||
{
|
||||
ECalClientSourceType source_type;
|
||||
|
||||
if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
|
||||
source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS;
|
||||
else if (e_source_has_extension (source, E_SOURCE_EXTENSION_MEMO_LIST))
|
||||
source_type = E_CAL_CLIENT_SOURCE_TYPE_MEMOS;
|
||||
else if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST))
|
||||
source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS;
|
||||
else
|
||||
g_return_if_reached ();
|
||||
|
||||
calendar_sources_connect_client (sources, source, source_type, 30, NULL, calendar_sources_client_connected_cb, g_object_ref (source));
|
||||
}
|
||||
|
||||
static void
|
||||
registry_watcher_source_disappeared_cb (ESourceRegistryWatcher *watcher,
|
||||
ESource *source,
|
||||
CalendarSources *sources)
|
||||
{
|
||||
gboolean emit;
|
||||
|
||||
g_mutex_lock (&sources->clients_lock);
|
||||
|
||||
emit = g_hash_table_remove (sources->clients, source);
|
||||
|
||||
g_mutex_unlock (&sources->clients_lock);
|
||||
|
||||
if (emit)
|
||||
g_signal_emit (sources, signals[CLIENT_DISAPPEARED], 0, e_source_get_uid (source), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
client_data_free (ClientData *data)
|
||||
{
|
||||
g_clear_signal_handler (&data->backend_died_id, data->client);
|
||||
g_signal_handler_disconnect (data->client, data->backend_died_id);
|
||||
g_object_unref (data->client);
|
||||
g_slice_free (ClientData, data);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_sources_class_init (CalendarSourcesClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = (GObjectClass *) klass;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class->finalize = calendar_sources_finalize;
|
||||
|
||||
signals [APPOINTMENT_SOURCES_CHANGED] =
|
||||
g_signal_new ("appointment-sources-changed",
|
||||
G_TYPE_FROM_CLASS (gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
|
||||
signals [TASK_SOURCES_CHANGED] =
|
||||
g_signal_new ("task-sources-changed",
|
||||
G_TYPE_FROM_CLASS (gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_sources_init (CalendarSources *sources)
|
||||
calendar_sources_constructed (GObject *object)
|
||||
{
|
||||
CalendarSources *sources = CALENDAR_SOURCES (object);
|
||||
ESourceRegistry *registry = NULL;
|
||||
GError *error = NULL;
|
||||
GDBusConnection *session_bus;
|
||||
GVariant *result;
|
||||
|
||||
sources->priv = calendar_sources_get_instance_private (sources);
|
||||
|
||||
/* WORKAROUND: the hardcoded timeout for e_source_registry_new_sync()
|
||||
(and other library calls that eventually call g_dbus_proxy_new[_sync]())
|
||||
is 25 seconds. This has been shown to be too small for
|
||||
evolution-source-registry in certain cases (slow disk, concurrent IO,
|
||||
many configured sources), so we first ensure that the service
|
||||
starts with a manual call and a higher timeout.
|
||||
|
||||
HACK: every time the DBus API is bumped in e-d-s we need
|
||||
to update this!
|
||||
*/
|
||||
session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
|
||||
if (session_bus == NULL)
|
||||
{
|
||||
g_error ("Failed to connect to the session bus: %s", error->message);
|
||||
}
|
||||
|
||||
result = g_dbus_connection_call_sync (session_bus, "org.freedesktop.DBus",
|
||||
"/", "org.freedesktop.DBus",
|
||||
"StartServiceByName",
|
||||
g_variant_new ("(su)",
|
||||
"org.gnome.evolution.dataserver.Sources5",
|
||||
0),
|
||||
NULL,
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
60 * 1000,
|
||||
NULL, &error);
|
||||
if (result != NULL)
|
||||
{
|
||||
g_variant_unref (result);
|
||||
sources->priv->registry = e_source_registry_new_sync (NULL, &error);
|
||||
}
|
||||
G_OBJECT_CLASS (calendar_sources_parent_class)->constructed (object);
|
||||
|
||||
registry = e_source_registry_new_sync (NULL, &error);
|
||||
if (error != NULL)
|
||||
{
|
||||
/* Any error is fatal, but we don't want to crash gnome-shell-calendar-server
|
||||
because of e-d-s problems. So just exit here.
|
||||
*/
|
||||
g_warning ("Failed to start evolution-source-registry: %s", error->message);
|
||||
exit(EXIT_FAILURE);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
g_object_unref (session_bus);
|
||||
g_return_if_fail (registry != NULL);
|
||||
|
||||
sources->priv->source_added_id = g_signal_connect (sources->priv->registry,
|
||||
"source-added",
|
||||
G_CALLBACK (calendar_sources_registry_source_changed_cb),
|
||||
sources);
|
||||
sources->priv->source_changed_id = g_signal_connect (sources->priv->registry,
|
||||
"source-changed",
|
||||
G_CALLBACK (calendar_sources_registry_source_changed_cb),
|
||||
sources);
|
||||
sources->priv->source_removed_id = g_signal_connect (sources->priv->registry,
|
||||
"source-removed",
|
||||
G_CALLBACK (calendar_sources_registry_source_removed_cb),
|
||||
sources);
|
||||
sources->registry_watcher = e_source_registry_watcher_new (registry, NULL);
|
||||
|
||||
sources->priv->appointment_sources.source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS;
|
||||
sources->priv->appointment_sources.sources = sources;
|
||||
sources->priv->appointment_sources.changed_signal = signals [APPOINTMENT_SOURCES_CHANGED];
|
||||
sources->priv->appointment_sources.clients = g_hash_table_new_full ((GHashFunc) e_source_hash,
|
||||
(GEqualFunc) e_source_equal,
|
||||
(GDestroyNotify) g_object_unref,
|
||||
(GDestroyNotify) client_data_free);
|
||||
sources->priv->appointment_sources.timeout_id = 0;
|
||||
g_clear_object (®istry);
|
||||
|
||||
sources->priv->task_sources.source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS;
|
||||
sources->priv->task_sources.sources = sources;
|
||||
sources->priv->task_sources.changed_signal = signals [TASK_SOURCES_CHANGED];
|
||||
sources->priv->task_sources.clients = g_hash_table_new_full ((GHashFunc) e_source_hash,
|
||||
(GEqualFunc) e_source_equal,
|
||||
(GDestroyNotify) g_object_unref,
|
||||
(GDestroyNotify) client_data_free);
|
||||
sources->priv->task_sources.timeout_id = 0;
|
||||
}
|
||||
sources->clients = g_hash_table_new_full ((GHashFunc) e_source_hash,
|
||||
(GEqualFunc) e_source_equal,
|
||||
(GDestroyNotify) g_object_unref,
|
||||
(GDestroyNotify) client_data_free);
|
||||
sources->filter_id = g_signal_connect (sources->registry_watcher,
|
||||
"filter",
|
||||
G_CALLBACK (registry_watcher_filter_cb),
|
||||
sources);
|
||||
sources->appeared_id = g_signal_connect (sources->registry_watcher,
|
||||
"appeared",
|
||||
G_CALLBACK (registry_watcher_source_appeared_cb),
|
||||
sources);
|
||||
sources->disappeared_id = g_signal_connect (sources->registry_watcher,
|
||||
"disappeared",
|
||||
G_CALLBACK (registry_watcher_source_disappeared_cb),
|
||||
sources);
|
||||
|
||||
static void
|
||||
calendar_sources_finalize_source_data (CalendarSources *sources,
|
||||
CalendarSourceData *source_data)
|
||||
{
|
||||
if (source_data->loaded)
|
||||
{
|
||||
g_hash_table_destroy (source_data->clients);
|
||||
source_data->clients = NULL;
|
||||
|
||||
g_clear_handle_id (&source_data->timeout_id, g_source_remove);
|
||||
|
||||
source_data->loaded = FALSE;
|
||||
}
|
||||
e_source_registry_watcher_reclaim (sources->registry_watcher);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -245,28 +201,67 @@ calendar_sources_finalize (GObject *object)
|
||||
{
|
||||
CalendarSources *sources = CALENDAR_SOURCES (object);
|
||||
|
||||
if (sources->priv->registry)
|
||||
g_clear_pointer (&sources->clients, g_hash_table_destroy);
|
||||
|
||||
if (sources->registry_watcher)
|
||||
{
|
||||
g_clear_signal_handler (&sources->priv->source_added_id,
|
||||
sources->priv->registry);
|
||||
g_clear_signal_handler (&sources->priv->source_changed_id,
|
||||
sources->priv->registry);
|
||||
g_clear_signal_handler (&sources->priv->source_removed_id,
|
||||
sources->priv->registry);
|
||||
g_object_unref (sources->priv->registry);
|
||||
g_signal_handler_disconnect (sources->registry_watcher,
|
||||
sources->filter_id);
|
||||
g_signal_handler_disconnect (sources->registry_watcher,
|
||||
sources->appeared_id);
|
||||
g_signal_handler_disconnect (sources->registry_watcher,
|
||||
sources->disappeared_id);
|
||||
g_clear_object (&sources->registry_watcher);
|
||||
}
|
||||
sources->priv->registry = NULL;
|
||||
|
||||
calendar_sources_finalize_source_data (sources, &sources->priv->appointment_sources);
|
||||
calendar_sources_finalize_source_data (sources, &sources->priv->task_sources);
|
||||
g_mutex_clear (&sources->clients_lock);
|
||||
|
||||
if (G_OBJECT_CLASS (parent_class)->finalize)
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
G_OBJECT_CLASS (calendar_sources_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_sources_class_init (CalendarSourcesClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = (GObjectClass *) klass;
|
||||
|
||||
gobject_class->constructed = calendar_sources_constructed;
|
||||
gobject_class->finalize = calendar_sources_finalize;
|
||||
|
||||
signals [CLIENT_APPEARED] =
|
||||
g_signal_new ("client-appeared",
|
||||
G_TYPE_FROM_CLASS (gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
E_TYPE_CAL_CLIENT);
|
||||
|
||||
signals [CLIENT_DISAPPEARED] =
|
||||
g_signal_new ("client-disappeared",
|
||||
G_TYPE_FROM_CLASS (gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
G_TYPE_STRING); /* ESource::uid of the disappeared client */
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_sources_init (CalendarSources *sources)
|
||||
{
|
||||
g_mutex_init (&sources->clients_lock);
|
||||
}
|
||||
|
||||
CalendarSources *
|
||||
calendar_sources_get (void)
|
||||
{
|
||||
static CalendarSources *calendar_sources_singleton = NULL;
|
||||
gpointer singleton_location = &calendar_sources_singleton;
|
||||
|
||||
if (calendar_sources_singleton)
|
||||
@ -274,85 +269,70 @@ calendar_sources_get (void)
|
||||
|
||||
calendar_sources_singleton = g_object_new (CALENDAR_TYPE_SOURCES, NULL);
|
||||
g_object_add_weak_pointer (G_OBJECT (calendar_sources_singleton),
|
||||
singleton_location);
|
||||
singleton_location);
|
||||
|
||||
return calendar_sources_singleton;
|
||||
}
|
||||
|
||||
/* The clients are just created here but not loaded */
|
||||
static void
|
||||
create_client_for_source (ESource *source,
|
||||
ECalClientSourceType source_type,
|
||||
CalendarSourceData *source_data)
|
||||
ESourceRegistry *
|
||||
calendar_sources_get_registry (CalendarSources *sources)
|
||||
{
|
||||
ClientData *data;
|
||||
EClient *client;
|
||||
GError *error = NULL;
|
||||
|
||||
client = g_hash_table_lookup (source_data->clients, source);
|
||||
g_return_if_fail (client == NULL);
|
||||
|
||||
client = e_cal_client_connect_sync (source, source_type, -1, NULL, &error);
|
||||
if (!client)
|
||||
{
|
||||
g_warning ("Could not load source '%s': %s",
|
||||
e_source_get_uid (source),
|
||||
error->message);
|
||||
g_clear_error(&error);
|
||||
return;
|
||||
}
|
||||
|
||||
data = g_slice_new0 (ClientData);
|
||||
data->client = E_CAL_CLIENT (client); /* takes ownership */
|
||||
data->backend_died_id = g_signal_connect (client,
|
||||
"backend-died",
|
||||
G_CALLBACK (backend_died_cb),
|
||||
source_data);
|
||||
|
||||
g_hash_table_insert (source_data->clients, g_object_ref (source), data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
debug_dump_ecal_list (GHashTable *clients)
|
||||
{
|
||||
#ifdef CALENDAR_ENABLE_DEBUG
|
||||
GList *list, *link;
|
||||
|
||||
dprintf ("Loaded clients:\n");
|
||||
list = g_hash_table_get_keys (clients);
|
||||
for (link = list; link != NULL; link = g_list_next (link))
|
||||
{
|
||||
ESource *source = E_SOURCE (link->data);
|
||||
|
||||
dprintf (" %s %s\n",
|
||||
e_source_get_uid (source),
|
||||
e_source_get_display_name (source));
|
||||
}
|
||||
g_list_free (list);
|
||||
#endif
|
||||
return e_source_registry_watcher_get_registry (sources->registry_watcher);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_sources_load_esource_list (ESourceRegistry *registry,
|
||||
CalendarSourceData *source_data);
|
||||
|
||||
static gboolean
|
||||
backend_restart (gpointer data)
|
||||
gather_event_clients_cb (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
CalendarSourceData *source_data = data;
|
||||
ESourceRegistry *registry;
|
||||
GSList **plist = user_data;
|
||||
ClientData *cd = value;
|
||||
|
||||
registry = source_data->sources->priv->registry;
|
||||
calendar_sources_load_esource_list (registry, source_data);
|
||||
g_signal_emit (source_data->sources, source_data->changed_signal, 0);
|
||||
if (cd)
|
||||
*plist = g_slist_prepend (*plist, g_object_ref (cd->client));
|
||||
}
|
||||
|
||||
source_data->timeout_id = 0;
|
||||
|
||||
return FALSE;
|
||||
GSList *
|
||||
calendar_sources_ref_clients (CalendarSources *sources)
|
||||
{
|
||||
GSList *list = NULL;
|
||||
|
||||
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL);
|
||||
|
||||
g_mutex_lock (&sources->clients_lock);
|
||||
g_hash_table_foreach (sources->clients, gather_event_clients_cb, &list);
|
||||
g_mutex_unlock (&sources->clients_lock);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
gboolean
|
||||
calendar_sources_has_clients (CalendarSources *sources)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer value;
|
||||
gboolean has = FALSE;
|
||||
|
||||
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), FALSE);
|
||||
|
||||
g_mutex_lock (&sources->clients_lock);
|
||||
|
||||
g_hash_table_iter_init (&iter, sources->clients);
|
||||
while (!has && g_hash_table_iter_next (&iter, NULL, &value))
|
||||
{
|
||||
ClientData *cd = value;
|
||||
|
||||
has = cd != NULL;
|
||||
}
|
||||
|
||||
g_mutex_unlock (&sources->clients_lock);
|
||||
|
||||
return has;
|
||||
}
|
||||
|
||||
static void
|
||||
backend_died_cb (EClient *client, CalendarSourceData *source_data)
|
||||
backend_died_cb (EClient *client,
|
||||
CalendarSources *sources)
|
||||
{
|
||||
ESource *source;
|
||||
const char *display_name;
|
||||
@ -360,196 +340,167 @@ backend_died_cb (EClient *client, CalendarSourceData *source_data)
|
||||
source = e_client_get_source (client);
|
||||
display_name = e_source_get_display_name (source);
|
||||
g_warning ("The calendar backend for '%s' has crashed.", display_name);
|
||||
g_hash_table_remove (source_data->clients, source);
|
||||
|
||||
g_clear_handle_id (&source_data->timeout_id, g_source_remove);
|
||||
|
||||
source_data->timeout_id = g_timeout_add_seconds (2, backend_restart,
|
||||
source_data);
|
||||
g_source_set_name_by_id (source_data->timeout_id, "[gnome-shell] backend_restart");
|
||||
g_mutex_lock (&sources->clients_lock);
|
||||
g_hash_table_remove (sources->clients, source);
|
||||
g_mutex_unlock (&sources->clients_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_sources_load_esource_list (ESourceRegistry *registry,
|
||||
CalendarSourceData *source_data)
|
||||
static EClient *
|
||||
calendar_sources_connect_client_sync (CalendarSources *sources,
|
||||
ESource *source,
|
||||
ECalClientSourceType source_type,
|
||||
guint32 wait_for_connected_seconds,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
GList *list, *link;
|
||||
const gchar *extension_name;
|
||||
EClient *client = NULL;
|
||||
ClientData *client_data;
|
||||
|
||||
switch (source_data->source_type)
|
||||
g_mutex_lock (&sources->clients_lock);
|
||||
client_data = g_hash_table_lookup (sources->clients, source);
|
||||
if (client_data)
|
||||
client = E_CLIENT (g_object_ref (client_data->client));
|
||||
g_mutex_unlock (&sources->clients_lock);
|
||||
|
||||
if (client)
|
||||
return client;
|
||||
|
||||
client = e_cal_client_connect_sync (source, source_type, wait_for_connected_seconds, cancellable, error);
|
||||
if (!client)
|
||||
return NULL;
|
||||
|
||||
g_mutex_lock (&sources->clients_lock);
|
||||
client_data = g_hash_table_lookup (sources->clients, source);
|
||||
if (client_data)
|
||||
{
|
||||
case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
|
||||
extension_name = E_SOURCE_EXTENSION_CALENDAR;
|
||||
break;
|
||||
case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
|
||||
extension_name = E_SOURCE_EXTENSION_TASK_LIST;
|
||||
break;
|
||||
default:
|
||||
g_return_if_reached ();
|
||||
g_clear_object (&client);
|
||||
client = E_CLIENT (g_object_ref (client_data->client));
|
||||
}
|
||||
|
||||
list = e_source_registry_list_sources (registry, extension_name);
|
||||
|
||||
for (link = list; link != NULL; link = g_list_next (link))
|
||||
else
|
||||
{
|
||||
ESource *source = E_SOURCE (link->data);
|
||||
ESourceSelectable *extension;
|
||||
gboolean show_source;
|
||||
client_data = g_slice_new0 (ClientData);
|
||||
client_data->client = E_CAL_CLIENT (g_object_ref (client));
|
||||
client_data->backend_died_id = g_signal_connect (client,
|
||||
"backend-died",
|
||||
G_CALLBACK (backend_died_cb),
|
||||
sources);
|
||||
|
||||
extension = e_source_get_extension (source, extension_name);
|
||||
show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension);
|
||||
|
||||
if (show_source)
|
||||
create_client_for_source (source, source_data->source_type, source_data);
|
||||
g_hash_table_insert (sources->clients, g_object_ref (source), client_data);
|
||||
}
|
||||
g_mutex_unlock (&sources->clients_lock);
|
||||
|
||||
debug_dump_ecal_list (source_data->clients);
|
||||
|
||||
g_list_free_full (list, g_object_unref);
|
||||
return client;
|
||||
}
|
||||
|
||||
typedef struct _AsyncContext {
|
||||
ESource *source;
|
||||
ECalClientSourceType source_type;
|
||||
guint32 wait_for_connected_seconds;
|
||||
} AsyncContext;
|
||||
|
||||
static void
|
||||
calendar_sources_registry_source_changed_cb (ESourceRegistry *registry,
|
||||
ESource *source,
|
||||
CalendarSources *sources)
|
||||
async_context_free (gpointer ptr)
|
||||
{
|
||||
if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
|
||||
AsyncContext *ctx = ptr;
|
||||
|
||||
if (ctx)
|
||||
{
|
||||
CalendarSourceData *source_data;
|
||||
ESourceSelectable *extension;
|
||||
gboolean have_client;
|
||||
gboolean show_source;
|
||||
|
||||
source_data = &sources->priv->appointment_sources;
|
||||
extension = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR);
|
||||
have_client = (g_hash_table_lookup (source_data->clients, source) != NULL);
|
||||
show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension);
|
||||
|
||||
if (!show_source && have_client)
|
||||
{
|
||||
g_hash_table_remove (source_data->clients, source);
|
||||
g_signal_emit (sources, source_data->changed_signal, 0);
|
||||
}
|
||||
if (show_source && !have_client)
|
||||
{
|
||||
create_client_for_source (source, source_data->source_type, source_data);
|
||||
g_signal_emit (sources, source_data->changed_signal, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST))
|
||||
{
|
||||
CalendarSourceData *source_data;
|
||||
ESourceSelectable *extension;
|
||||
gboolean have_client;
|
||||
gboolean show_source;
|
||||
|
||||
source_data = &sources->priv->task_sources;
|
||||
extension = e_source_get_extension (source, E_SOURCE_EXTENSION_TASK_LIST);
|
||||
have_client = (g_hash_table_lookup (source_data->clients, source) != NULL);
|
||||
show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension);
|
||||
|
||||
if (!show_source && have_client)
|
||||
{
|
||||
g_hash_table_remove (source_data->clients, source);
|
||||
g_signal_emit (sources, source_data->changed_signal, 0);
|
||||
}
|
||||
if (show_source && !have_client)
|
||||
{
|
||||
create_client_for_source (source, source_data->source_type, source_data);
|
||||
g_signal_emit (sources, source_data->changed_signal, 0);
|
||||
}
|
||||
g_clear_object (&ctx->source);
|
||||
g_slice_free (AsyncContext, ctx);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_sources_registry_source_removed_cb (ESourceRegistry *registry,
|
||||
ESource *source,
|
||||
CalendarSources *sources)
|
||||
calendar_sources_connect_client_thread (GTask *task,
|
||||
gpointer source_object,
|
||||
gpointer task_data,
|
||||
GCancellable *cancellable)
|
||||
{
|
||||
if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
|
||||
CalendarSources *sources = source_object;
|
||||
AsyncContext *ctx = task_data;
|
||||
EClient *client;
|
||||
GError *local_error = NULL;
|
||||
|
||||
client = calendar_sources_connect_client_sync (sources, ctx->source, ctx->source_type,
|
||||
ctx->wait_for_connected_seconds, cancellable, &local_error);
|
||||
if (!client)
|
||||
{
|
||||
CalendarSourceData *source_data;
|
||||
|
||||
source_data = &sources->priv->appointment_sources;
|
||||
g_hash_table_remove (source_data->clients, source);
|
||||
g_signal_emit (sources, source_data->changed_signal, 0);
|
||||
}
|
||||
|
||||
if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST))
|
||||
{
|
||||
CalendarSourceData *source_data;
|
||||
|
||||
source_data = &sources->priv->task_sources;
|
||||
g_hash_table_remove (source_data->clients, source);
|
||||
g_signal_emit (sources, source_data->changed_signal, 0);
|
||||
if (local_error)
|
||||
g_task_return_error (task, local_error);
|
||||
else
|
||||
g_task_return_pointer (task, NULL, NULL);
|
||||
} else {
|
||||
g_task_return_pointer (task, client, g_object_unref);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ensure_appointment_sources (CalendarSources *sources)
|
||||
void
|
||||
calendar_sources_connect_client (CalendarSources *sources,
|
||||
ESource *source,
|
||||
ECalClientSourceType source_type,
|
||||
guint32 wait_for_connected_seconds,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
if (!sources->priv->appointment_sources.loaded)
|
||||
AsyncContext *ctx;
|
||||
g_autoptr (GTask) task = NULL;
|
||||
|
||||
ctx = g_slice_new0 (AsyncContext);
|
||||
ctx->source = g_object_ref (source);
|
||||
ctx->source_type = source_type;
|
||||
ctx->wait_for_connected_seconds = wait_for_connected_seconds;
|
||||
|
||||
task = g_task_new (sources, cancellable, callback, user_data);
|
||||
g_task_set_source_tag (task, calendar_sources_connect_client);
|
||||
g_task_set_task_data (task, ctx, async_context_free);
|
||||
|
||||
g_task_run_in_thread (task, calendar_sources_connect_client_thread);
|
||||
}
|
||||
|
||||
EClient *
|
||||
calendar_sources_connect_client_finish (CalendarSources *sources,
|
||||
GAsyncResult *result,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (g_task_is_valid (result, sources), NULL);
|
||||
g_return_val_if_fail (g_async_result_is_tagged (result, calendar_sources_connect_client), NULL);
|
||||
|
||||
return g_task_propagate_pointer (G_TASK (result), error);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
print_debug (const gchar *format,
|
||||
...)
|
||||
{
|
||||
g_autofree char *s = NULL;
|
||||
g_autofree char *timestamp = NULL;
|
||||
va_list ap;
|
||||
g_autoptr (GDateTime) now = NULL;
|
||||
static volatile gsize once_init_value = 0;
|
||||
static gboolean show_debug = FALSE;
|
||||
static guint pid = 0;
|
||||
|
||||
if (g_once_init_enter (&once_init_value))
|
||||
{
|
||||
calendar_sources_load_esource_list (sources->priv->registry,
|
||||
&sources->priv->appointment_sources);
|
||||
sources->priv->appointment_sources.loaded = TRUE;
|
||||
show_debug = (g_getenv ("CALENDAR_SERVER_DEBUG") != NULL);
|
||||
pid = getpid ();
|
||||
g_once_init_leave (&once_init_value, 1);
|
||||
}
|
||||
}
|
||||
|
||||
GList *
|
||||
calendar_sources_get_appointment_clients (CalendarSources *sources)
|
||||
{
|
||||
GList *list, *link;
|
||||
|
||||
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL);
|
||||
|
||||
ensure_appointment_sources (sources);
|
||||
|
||||
list = g_hash_table_get_values (sources->priv->appointment_sources.clients);
|
||||
|
||||
for (link = list; link != NULL; link = g_list_next (link))
|
||||
link->data = ((ClientData *) link->data)->client;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static void
|
||||
ensure_task_sources (CalendarSources *sources)
|
||||
{
|
||||
if (!sources->priv->task_sources.loaded)
|
||||
{
|
||||
calendar_sources_load_esource_list (sources->priv->registry,
|
||||
&sources->priv->task_sources);
|
||||
sources->priv->task_sources.loaded = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
GList *
|
||||
calendar_sources_get_task_clients (CalendarSources *sources)
|
||||
{
|
||||
GList *list, *link;
|
||||
|
||||
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL);
|
||||
|
||||
ensure_task_sources (sources);
|
||||
|
||||
list = g_hash_table_get_values (sources->priv->task_sources.clients);
|
||||
|
||||
for (link = list; link != NULL; link = g_list_next (link))
|
||||
link->data = ((ClientData *) link->data)->client;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
gboolean
|
||||
calendar_sources_has_sources (CalendarSources *sources)
|
||||
{
|
||||
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), FALSE);
|
||||
|
||||
ensure_appointment_sources (sources);
|
||||
ensure_task_sources (sources);
|
||||
|
||||
return g_hash_table_size (sources->priv->appointment_sources.clients) > 0 ||
|
||||
g_hash_table_size (sources->priv->task_sources.clients) > 0;
|
||||
|
||||
if (!show_debug)
|
||||
goto out;
|
||||
|
||||
now = g_date_time_new_now_local ();
|
||||
timestamp = g_date_time_format (now, "%H:%M:%S");
|
||||
|
||||
va_start (ap, format);
|
||||
s = g_strdup_vprintf (format, ap);
|
||||
va_end (ap);
|
||||
|
||||
g_print ("gnome-shell-calendar-server[%d]: %s.%03d: %s\n",
|
||||
pid, timestamp, g_date_time_get_microsecond (now), s);
|
||||
out:
|
||||
;
|
||||
}
|
||||
|
@ -26,17 +26,38 @@
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#define EDS_DISABLE_DEPRECATED
|
||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
||||
#include <libedataserver/libedataserver.h>
|
||||
#include <libecal/libecal.h>
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CALENDAR_TYPE_SOURCES (calendar_sources_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (CalendarSources, calendar_sources,
|
||||
CALENDAR, SOURCES, GObject)
|
||||
|
||||
CalendarSources *calendar_sources_get (void);
|
||||
GList *calendar_sources_get_appointment_clients (CalendarSources *sources);
|
||||
GList *calendar_sources_get_task_clients (CalendarSources *sources);
|
||||
CalendarSources *calendar_sources_get (void);
|
||||
ESourceRegistry *calendar_sources_get_registry (CalendarSources *sources);
|
||||
GSList *calendar_sources_ref_clients (CalendarSources *sources);
|
||||
gboolean calendar_sources_has_clients (CalendarSources *sources);
|
||||
|
||||
gboolean calendar_sources_has_sources (CalendarSources *sources);
|
||||
void calendar_sources_connect_client (CalendarSources *sources,
|
||||
ESource *source,
|
||||
ECalClientSourceType source_type,
|
||||
guint32 wait_for_connected_seconds,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
EClient *calendar_sources_connect_client_finish
|
||||
(CalendarSources *sources,
|
||||
GAsyncResult *result,
|
||||
GError **error);
|
||||
|
||||
/* Set the environment variable CALENDAR_SERVER_DEBUG to show debug */
|
||||
void print_debug (const gchar *str,
|
||||
...) G_GNUC_PRINTF (1, 2);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -253,7 +253,9 @@ deep_count_one (DeepCountState *state,
|
||||
else
|
||||
{
|
||||
content_type = g_file_info_get_content_type (info);
|
||||
add_content_type_to_cache (state, content_type);
|
||||
|
||||
if (content_type)
|
||||
add_content_type_to_cache (state, content_type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -119,6 +119,16 @@ shell_window_tracker_class_init (ShellWindowTrackerClass *klass)
|
||||
G_TYPE_NONE, 0);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
check_app_id_prefix (ShellApp *app,
|
||||
const char *prefix)
|
||||
{
|
||||
if (prefix == NULL)
|
||||
return TRUE;
|
||||
|
||||
return g_str_has_prefix (shell_app_get_id (app), prefix);
|
||||
}
|
||||
|
||||
/*
|
||||
* get_app_from_window_wmclass:
|
||||
*
|
||||
@ -135,9 +145,15 @@ get_app_from_window_wmclass (MetaWindow *window)
|
||||
ShellAppSystem *appsys;
|
||||
const char *wm_class;
|
||||
const char *wm_instance;
|
||||
const char *sandbox_id;
|
||||
g_autofree char *app_prefix = NULL;
|
||||
|
||||
appsys = shell_app_system_get_default ();
|
||||
|
||||
sandbox_id = meta_window_get_sandboxed_app_id (window);
|
||||
if (sandbox_id)
|
||||
app_prefix = g_strdup_printf ("%s.", sandbox_id);
|
||||
|
||||
/* Notes on the heuristics used here:
|
||||
much of the complexity here comes from the desire to support
|
||||
Chrome apps.
|
||||
@ -176,23 +192,23 @@ get_app_from_window_wmclass (MetaWindow *window)
|
||||
/* first try a match from WM_CLASS (instance part) to StartupWMClass */
|
||||
wm_instance = meta_window_get_wm_class_instance (window);
|
||||
app = shell_app_system_lookup_startup_wmclass (appsys, wm_instance);
|
||||
if (app != NULL)
|
||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
||||
return g_object_ref (app);
|
||||
|
||||
/* then try a match from WM_CLASS to StartupWMClass */
|
||||
wm_class = meta_window_get_wm_class (window);
|
||||
app = shell_app_system_lookup_startup_wmclass (appsys, wm_class);
|
||||
if (app != NULL)
|
||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
||||
return g_object_ref (app);
|
||||
|
||||
/* then try a match from WM_CLASS (instance part) to .desktop */
|
||||
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_instance);
|
||||
if (app != NULL)
|
||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
||||
return g_object_ref (app);
|
||||
|
||||
/* finally, try a match from WM_CLASS to .desktop */
|
||||
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_class);
|
||||
if (app != NULL)
|
||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
||||
return g_object_ref (app);
|
||||
|
||||
return NULL;
|
||||
@ -214,7 +230,7 @@ get_app_from_id (MetaWindow *window,
|
||||
{
|
||||
ShellApp *app;
|
||||
ShellAppSystem *appsys;
|
||||
char *desktop_file;
|
||||
g_autofree char *desktop_file = NULL;
|
||||
|
||||
g_return_val_if_fail (id != NULL, NULL);
|
||||
|
||||
@ -223,10 +239,9 @@ get_app_from_id (MetaWindow *window,
|
||||
desktop_file = g_strconcat (id, ".desktop", NULL);
|
||||
app = shell_app_system_lookup_app (appsys, desktop_file);
|
||||
if (app)
|
||||
g_object_ref (app);
|
||||
return g_object_ref (app);
|
||||
|
||||
g_free (desktop_file);
|
||||
return app;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -391,6 +406,13 @@ get_app_for_window (ShellWindowTracker *tracker,
|
||||
if (meta_window_is_remote (window))
|
||||
return _shell_app_new_for_window (window);
|
||||
|
||||
/* Check if the app's WM_CLASS specifies an app; this is
|
||||
* canonical if it does.
|
||||
*/
|
||||
result = get_app_from_window_wmclass (window);
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
||||
/* Check if the window was opened from within a sandbox; if this
|
||||
* is the case, a corresponding .desktop file is guaranteed to match;
|
||||
*/
|
||||
@ -405,13 +427,6 @@ get_app_for_window (ShellWindowTracker *tracker,
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
||||
/* Check if the app's WM_CLASS specifies an app; this is
|
||||
* canonical if it does.
|
||||
*/
|
||||
result = get_app_from_window_wmclass (window);
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
||||
result = get_app_from_window_pid (tracker, window);
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
@ -679,6 +679,8 @@ st_entry_key_press_event (ClutterActor *actor,
|
||||
ST_CLIPBOARD_TYPE_CLIPBOARD,
|
||||
text);
|
||||
|
||||
g_free (text);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -705,6 +707,8 @@ st_entry_key_press_event (ClutterActor *actor,
|
||||
clutter_text_delete_selection ((ClutterText *) priv->entry);
|
||||
}
|
||||
|
||||
g_free (text);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -509,6 +509,8 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
|
||||
|
||||
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
|
||||
clutter_actor_get_position (actor, &x, &y);
|
||||
x *= resource_scale;
|
||||
y *= resource_scale;
|
||||
|
||||
cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
|
||||
cogl_framebuffer_translate (fb, -x, -y, 0);
|
||||
|
@ -262,8 +262,10 @@ st_viewport_allocate (ClutterActor *actor,
|
||||
clutter_actor_set_allocation (actor, box, flags);
|
||||
|
||||
content_box = viewport_box;
|
||||
content_box.x2 += MAX (0, min_width - avail_width);
|
||||
content_box.y2 += MAX (0, min_height - avail_height);
|
||||
if (priv->hadjustment)
|
||||
content_box.x2 += MAX (0, min_width - avail_width);
|
||||
if (priv->vadjustment)
|
||||
content_box.y2 += MAX (0, min_height - avail_height);
|
||||
|
||||
clutter_layout_manager_allocate (layout, CLUTTER_CONTAINER (actor),
|
||||
&content_box, flags);
|
||||
|
@ -38,6 +38,8 @@
|
||||
</description>
|
||||
|
||||
<releases>
|
||||
<release version="3.36.5" date="2020-08-11"/>
|
||||
<release version="3.36.4" date="2020-07-07"/>
|
||||
<release version="3.36.3" date="2020-06-03"/>
|
||||
<release version="3.36.2" date="2020-04-29"/>
|
||||
<release version="3.36.1" date="2020-03-29"/>
|
||||
|
@ -1,5 +1,5 @@
|
||||
project('gnome-extensions-app',
|
||||
version: '3.36.3',
|
||||
version: '3.36.5',
|
||||
meson_version: '>= 0.47.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
|
@ -1,5 +1,5 @@
|
||||
project('gnome-extensions-tool', 'c',
|
||||
version: '3.36.3',
|
||||
version: '3.36.5',
|
||||
meson_version: '>= 0.47.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
|
@ -48,6 +48,23 @@ get_shell_version (GError **error)
|
||||
return g_strjoinv (".", split_version);
|
||||
}
|
||||
|
||||
static char *
|
||||
escape_json_string (const char *string)
|
||||
{
|
||||
GString *escaped = g_string_new (string);
|
||||
|
||||
for (gsize i = 0; i < escaped->len; ++i)
|
||||
{
|
||||
if (escaped->str[i] == '"' || escaped->str[i] == '\\')
|
||||
{
|
||||
g_string_insert_c (escaped, i, '\\');
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
return g_string_free (escaped, FALSE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
create_metadata (GFile *target_dir,
|
||||
const char *uuid,
|
||||
@ -55,6 +72,9 @@ create_metadata (GFile *target_dir,
|
||||
const char *description,
|
||||
GError **error)
|
||||
{
|
||||
g_autofree char *uuid_escaped = NULL;
|
||||
g_autofree char *name_escaped = NULL;
|
||||
g_autofree char *desc_escaped = NULL;
|
||||
g_autoptr (GFile) target = NULL;
|
||||
g_autoptr (GString) json = NULL;
|
||||
g_autofree char *version = NULL;
|
||||
@ -63,11 +83,15 @@ create_metadata (GFile *target_dir,
|
||||
if (version == NULL)
|
||||
return FALSE;
|
||||
|
||||
uuid_escaped = escape_json_string (uuid);
|
||||
name_escaped = escape_json_string (name);
|
||||
desc_escaped = escape_json_string (description);
|
||||
|
||||
json = g_string_new ("{\n");
|
||||
|
||||
g_string_append_printf (json, " \"name\": \"%s\",\n", name);
|
||||
g_string_append_printf (json, " \"description\": \"%s\",\n", description);
|
||||
g_string_append_printf (json, " \"uuid\": \"%s\",\n", uuid);
|
||||
g_string_append_printf (json, " \"name\": \"%s\",\n", name_escaped);
|
||||
g_string_append_printf (json, " \"description\": \"%s\",\n", desc_escaped);
|
||||
g_string_append_printf (json, " \"uuid\": \"%s\",\n", uuid_escaped);
|
||||
g_string_append_printf (json, " \"shell-version\": [\n");
|
||||
g_string_append_printf (json, " \"%s\"\n", version);
|
||||
g_string_append_printf (json, " ]\n}\n");
|
||||
|
@ -1,5 +1,5 @@
|
||||
project('shew', 'c',
|
||||
version: '3.36.3',
|
||||
version: '3.36.5',
|
||||
meson_version: '>= 0.47.0',
|
||||
license: 'LGPLv2+',
|
||||
)
|
||||
|
Reference in New Issue
Block a user