Compare commits

...

80 Commits

Author SHA1 Message Date
f2ac198831
Merge branch 'master' of gitlab.gnome.org:World/podcasts 2020-06-21 21:15:03 +01:00
Jordan Petridis
abd263f127 Merge branch 'wip/exalm/tnum' into 'master'
Tabular figures; model buttons for speed rate popover

See merge request World/podcasts!134
2020-06-21 18:27:08 +00:00
Alexander Mikhaylenko
9c2d4ac6a7
episode: Use tabular figures
Prevents jumping during downloads.
2020-06-21 21:17:00 +03:00
Alexander Mikhaylenko
4d950ac17e
player: Use tabular figures for duration 2020-06-21 21:17:00 +03:00
Alexander Mikhaylenko
5e688c104c
player_rate: Use tabular figures for speed rate menu
Since gtk::ModelButton allows to set markup, the menu entries can now use
tabular figures.

Make the labels untranslatable, as they are generic enough already, and
being translatable would make even less sense with markup.
2020-06-21 21:17:00 +03:00
Alexander Mikhaylenko
4ce0819c68
player: Use model buttons for rate popover
Also simplify the xml.
2020-06-21 21:16:58 +03:00
Jordan Petridis
f7d9d0555c
meson: keep track of changes in Cargo.toml and lockfile 2020-06-21 18:55:25 +03:00
Jordan Petridis
b754182e0d
cargo fmt 2020-06-21 18:38:29 +03:00
Jordan Petridis
7b3a607b5e
improve test.sh further
Before we were able to call the script with ninja directly,
we were trying to override some of the envvars to fix how/where
cargo artifacts where stored.

This is no longer an issue as ninja is making sure the proper
setup will be met. This is also makes it so that Builder
doesn't rebuild everything since $BUILDDIR was empty before
causing rebuilds of the whole world.
2020-06-21 18:30:48 +03:00
Jordan Petridis
0e47e9c07f
test.sh: run the build proccess multithreaded 2020-06-21 18:21:32 +03:00
Jordan Petridis
c140e5a163
downloader: remove unused dependency on error-chain 2020-06-21 18:12:23 +03:00
Jordan Petridis
0bc379bf42 Merge branch 'alatiera/spelling' into 'master'
Fix spelling of things

See merge request World/podcasts!143
2020-06-21 15:11:41 +00:00
Jordan Petridis
9f0a3a0d9f
Fix spelling of things 2020-06-21 18:10:53 +03:00
Jordan Petridis
355cf9a36c Merge branch 'alatiera/rever-futures-upgrade' into 'master'
Revert 096197cf81

See merge request World/podcasts!144
2020-06-21 15:06:57 +00:00
Jordan Petridis
d9792e99c1
Revert 096197cf81
It breaks the testsuite 'sometime' which is fairly annoying.
The whole testuite setup is crap though and likely needs to be
fixed first.

Will re-revert the changes once a new stable release of the app
is done.
2020-06-21 17:03:36 +03:00
Jordan Petridis
6cb7de7fb3 Merge branch 'more-clone' into 'master'
Use clone! macro in more cases

See merge request World/podcasts!141
2020-06-21 13:38:19 +00:00
Julian Hofer
cb0860cddf
Use clone! macro in more cases 2020-06-20 18:30:44 +03:00
Thibault Martin
6edeb59b16 Update French translation 2020-06-19 17:35:06 +00:00
Jordan Petridis
a245aa73d4 Merge branch 'window-cleanup' into 'master'
Cleanup windows.rs

See merge request World/podcasts!140
2020-06-19 12:00:10 +00:00
Julian Hofer
08be9bdb4e Fix broken window.connect_delete_event
It was never called with the original configuration
2020-06-19 09:51:35 +00:00
Julian Hofer
2ee2181211 Cleanup windows.rs
It shouldn't result in any functional changes, but some unnecessary
parts were removed and windows.rs is now tracked by meson
2020-06-19 09:51:35 +00:00
Jordan Petridis
59e1c7d6f4
cargo update deps 2020-06-19 12:05:03 +03:00
Jordan Petridis
c2aca6e3a0
Flatpak: use the 3.36 runtime
Nightly has moved into fd.o-sdk 20.08 base and the rust-sdk
extension for that base is in flux and I haven't had time to
deal with it yet.
2020-06-19 11:42:44 +03:00
5f39da9273
Added playback speed 1.75, 2.0, 2.25, 2.5, 2.75, 3.0 in player 2020-06-19 00:21:16 +01:00
e16d69737e
Added playback speed 1.75, 2.0, 2.25, 2.5, 2.75, 3.0 to UI 2020-06-19 00:20:41 +01:00
Tim Sabsch
e6e2af38d3 Update German translation 2020-05-17 13:58:11 +00:00
Dz Chen
975697728e Add Chinese (China) translation 2020-04-18 10:36:24 +00:00
Yuri Chornoivan
a2789c9dba Add Ukrainian translation 2020-04-06 16:50:41 +00:00
Jordan Petridis
096197cf81 Merge branch 'futures-upgrade' into 'master'
Upgrade to Futures 0.3

See merge request World/podcasts!139
2020-03-21 20:33:45 +00:00
Julian Hofer
f9d577f596 Convert more functions to "async fn" 2020-03-18 01:09:11 +00:00
Julian Hofer
429356a217 Use tokio main-macro 2020-03-18 01:09:11 +00:00
Julian Hofer
636e2aefde Add tokio features and remove lazy keyword 2020-03-18 01:09:11 +00:00
Julian Hofer
e830589e38 Remove unused imports 2020-03-18 01:09:11 +00:00
Julian Hofer
933ba62f39 Upgrade to Futures 0.3 2020-03-18 01:09:11 +00:00
Goran Vidović
93f7aa4457 Update Croatian translation 2020-03-15 14:53:33 +00:00
Milo Casagrande
3ef45c42fb Update Italian translation 2020-03-06 08:47:09 +00:00
Nathan Follens
071e5978aa Update Dutch translation 2020-02-26 13:31:59 +00:00
Kukuh Syafaat
fba5102705 Update Indonesian translation 2020-02-24 15:33:10 +00:00
Jiri Grönroos
138e308c32 Update Finnish translation 2020-02-23 11:44:49 +00:00
Emin Tufan Çetin
fa8f1a0c8e Update Turkish translation 2020-02-19 07:54:22 +00:00
Balázs Úr
7325c3b4d3 Update Hungarian translation 2020-02-17 22:32:08 +00:00
Jordan Petridis
3e5ddb2aff Merge branch 'switch-clone' into 'master'
Switch to glib::clone macro and fix some typos

See merge request World/podcasts!138
2020-02-17 11:43:19 +00:00
Julian Hofer
d1ebbde778
Switch to glib::clone macro and fix some typos 2020-02-17 13:11:44 +02:00
Anders Jonsson
8a042c5714 Update Swedish translation 2020-02-13 21:39:22 +00:00
Piotr Drąg
7a2c252bbc Update Polish translation 2020-02-09 11:20:36 +00:00
Jordan Petridis
7d212174a6 Merge branch 'synchronize-feed-updates' into 'master'
Synchronize feed updates

Closes #166

See merge request World/podcasts!133
2020-02-08 21:42:04 +00:00
Timofey
685b35cb23 Rename refresh to schedule_refresh 2020-02-08 15:47:27 +00:00
Timofey
1175a54266 Synchronize feed updates 2020-02-08 15:47:27 +00:00
Yuri Gomes
d38064e1c0 Update Brazilian Portuguese translation 2020-02-08 02:46:04 +00:00
Jordan Petridis
59a57a740f Merge branch 'alatiera/updates' into 'master'
Update gtk-rs

See merge request World/podcasts!137
2020-02-07 19:22:28 +00:00
Jordan Petridis
f319851753
Upgrade gtk-rs stack 2020-02-07 20:48:04 +02:00
Jordan Petridis
ce424977c0 cargo update 2020-02-07 18:20:19 +00:00
Jordan Petridis
62c6b0d4cb flatpak: stop setting custom RUSTFLAGS
Builder no longer makes use of them
2020-02-07 18:20:19 +00:00
Daniel Mustieles
7685570da9 Update Spanish translation 2020-02-07 12:20:57 +00:00
Jordan Petridis
ff0c488968 Merge branch 'Remove-warnings' into 'master'
Get rid of warnings

See merge request World/podcasts!136
2020-02-07 12:13:46 +00:00
Julian Hofer
ebc6c8df4d Directly import ClassStruct and InstanceStruct 2020-02-07 11:44:03 +00:00
Julian Hofer
06a2c3ab12 Get rid of clippy warnings 2020-02-07 11:44:03 +00:00
Jordan Petridis
e877da1825 Merge branch 'potfiles-200202' into 'master'
Update POTFILES.in 200202

See merge request World/podcasts!135
2020-02-07 11:33:18 +00:00
Piotr Drąg
0b744b1179 Update POTFILES.in 2020-02-02 13:47:51 +01:00
Jordan Petridis
1041f21724 Merge branch 'now-playing' into 'master'
Adaptive "Now Playing" toolbar

Closes #158

See merge request World/podcasts!131
2020-02-01 14:52:59 +00:00
James Westman
73012f7976 Adaptive "Now Playing" toolbar
The "Now Playing" toolbar now shrinks to fit on small screens. On all
screen sizes, clicking the toolbar reveals a HdyDialog with the same
controls.

Also fixes #158.
2020-02-01 14:01:37 +00:00
Jordan Petridis
a1b4cece7d flatpak: set RUSTFLAGS to none to workaround a cargo bug 2020-02-01 16:00:48 +02:00
Fabio Tomat
ac4cd50929 Update Friulian translation 2020-01-21 10:01:04 +00:00
Kukuh Syafaat
bb5b3846a6 Update Indonesian translation 2020-01-17 03:10:59 +00:00
Piotr Drąg
3a11fbcf18 Update Polish translation 2019-12-25 16:05:48 +00:00
Anders Jonsson
a8da740ada Update Swedish translation 2019-12-22 11:01:49 +00:00
Jordi Mas i Hernandez
082ec0f592 Update Catalan translation 2019-12-16 06:31:10 +00:00
Daniel Mustieles
d49cad0bc0 Update Spanish translation 2019-12-11 11:32:00 +00:00
Rafael Fontenelle
75d8676de5 Update Brazilian Portuguese translation 2019-12-09 13:24:11 +00:00
Jordan Petridis
8228bc8996 Merge branch 'fix-81' into 'master'
Improve show description UI

Closes #81

See merge request World/podcasts!129
2019-12-08 20:02:52 +00:00
James Westman
8081990895 Improve show description UI
Instead of being a scroll window inside a scroll window, the show
description now shows just the first paragraph by default, then displays
a "Read More" button if there is more to the description. Clicking the
button reveals the rest.

Currently, to keep the button from glitching when updating it from the
size-allocate signal, a GtkRevealer with a transition-duration of
1 millisecond is used. It's a hacky workaround but I'm not quite sure
how to do it better.

Fixes #81
2019-12-08 19:26:25 +00:00
Jordan Petridis
eb2d5419f9
CI: fix typo in a9ba3fcbab 2019-12-08 20:53:44 +02:00
Jordan Petridis
a9ba3fcbab
CI: Refactor to use the citemplate
https://gitlab.gnome.org/GNOME/Initiatives/wikis/DevOps-with-Flatpak
2019-12-08 20:45:01 +02:00
Jordan Petridis
bcd610e2e3
cargo fmt 2019-11-18 10:23:59 +02:00
Jordan Petridis
217362fe14 Merge branch 'add-entry-activate' into 'master'
headerbar: Add activate handler to add entry

See merge request World/podcasts!130
2019-10-29 09:47:39 +00:00
James Westman
0e0d860cd2 headerbar: Add activate handler to add entry
This way, pressing Enter after typing/pasting a URL adds the podcast
feed, instead of needing to press the button separately.
2019-10-28 11:57:51 -05:00
Jordan Petridis
a8246a96cd Merge branch 'fix-156' into 'master'
Fix extra window appearing for some podcasts

Closes #156

See merge request World/podcasts!128
2019-10-25 00:28:19 +00:00
James Westman
33d28d1e7b Fix extra window appearing for some podcasts
Fixes #156.
2019-10-24 23:51:20 +00:00
Jordan Petridis
377d7bdf47 Merge branch 'fix-80-c' into 'master'
headerbar: Use Handy widgets

See merge request World/podcasts!127
2019-10-24 21:20:15 +00:00
James Westman
f6eb3dd90e headerbar: Use Handy widgets 2019-10-24 15:46:46 -05:00
66 changed files with 5416 additions and 3321 deletions

View File

@ -1,89 +1,24 @@
stages: include:
- lint - project: 'gnome/citemplates'
- test file: 'flatpak/flatpak-ci-initiative-sdk-extensions.yml'
- review # ref: ''
variables:
BUNDLE: "org.gnome.Podcasts.Devel.flatpak"
flatpak: flatpak:
image: "registry.gitlab.gnome.org/gnome/gnome-runtime-images/rust_bundle:master" image: 'registry.gitlab.gnome.org/gnome/gnome-runtime-images/rust_bundle:3.36'
stage: "test" variables:
variables: MANIFEST_PATH: "org.gnome.Podcasts.Devel.json"
MANIFEST_PATH: "org.gnome.Podcasts.Devel.json" FLATPAK_MODULE: "gnome-podcasts"
FLATPAK_MODULE: "gnome-podcasts" MESON_ARGS: "-Dprofile=development"
CONFIGURE_ARGS: "-Dprofile=development" APP_ID: "org.gnome.Podcasts.Devel"
DBUS_ID: "org.gnome.Podcasts.Devel" RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
BUNDLE: "org.gnome.Podcasts.Devel.flatpak"
script: extends: '.flatpak'
- flatpak-builder --stop-at=${FLATPAK_MODULE} app ${MANIFEST_PATH}
# Build the flatpak repo
- flatpak-builder --run app ${MANIFEST_PATH} meson --prefix=/app ${CONFIGURE_ARGS} _build
- flatpak-builder --run app ${MANIFEST_PATH} ninja -C _build install
# Run the tests
- |
xvfb-run -a -s "-screen 0 1024x768x24" \
flatpak-builder --run \
--env=CARGO_HOME="${CI_PROJECT_DIR}/target/cargo-home" \
--env=CARGO_TARGET_DIR="${CI_PROJECT_DIR}/target/" \
app ${MANIFEST_PATH} \
ninja -C _build test
# Create a flatpak bundle
- flatpak-builder --finish-only app ${MANIFEST_PATH}
- flatpak build-export repo app
- flatpak build-bundle repo ${BUNDLE} ${DBUS_ID}
artifacts:
paths:
- $BUNDLE
expire_in: 2 days
cache:
key: "flatpak"
paths:
- .flatpak-builder/downloads/
- .flatpak-builder/git/
- target/
- target_test/
review:
stage: review
dependencies:
- flatpak
script:
- echo "Generating flatpak deployment"
artifacts:
paths:
- $BUNDLE
expire_in: 30 days
environment:
name: review/$CI_COMMIT_REF_NAME
url: https://gitlab.gnome.org/$CI_PROJECT_PATH/-/jobs/$CI_JOB_ID/artifacts/raw/${BUNDLE}
on_stop: stop_review
except:
- master@World/podcasts
- tags
stop_review:
stage: review
script:
- echo "Stopping flatpak deployment"
when: manual
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
except:
- master@World/podcasts
- tags
# Configure and run rustfmt # Configure and run rustfmt
# Exits and builds fails if on bad format # Exits and builds fails if on bad format
rustfmt: rustfmt:
image: "rust:slim" image: "rust:slim"
stage: "lint" stage: ".pre"
script: script:
- rustup component add rustfmt - rustup component add rustfmt
# Create blank versions of our configured files # Create blank versions of our configured files

2901
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@ dependency('glib-2.0', version: '>= 2.56')
dependency('gio-2.0', version: '>= 2.56') dependency('gio-2.0', version: '>= 2.56')
dependency('gdk-pixbuf-2.0') dependency('gdk-pixbuf-2.0')
dependency('gtk+-3.0', version: '>= 3.24.11') dependency('gtk+-3.0', version: '>= 3.24.11')
dependency('libhandy-0.0', version: '>= 0.0.11') dependency('libhandy-0.0', version: '>= 0.0.13')
dependency('gstreamer-1.0', version: '>= 1.16') dependency('gstreamer-1.0', version: '>= 1.16')
dependency('gstreamer-base-1.0', version: '>= 1.16') dependency('gstreamer-base-1.0', version: '>= 1.16')
@ -40,6 +40,14 @@ else
version_suffix = '' version_suffix = ''
endif endif
podcast_toml = files(
'Cargo.toml',
'Cargo.lock',
'podcasts-data/Cargo.toml',
'podcasts-downloader/Cargo.toml',
'podcasts-gtk/Cargo.toml',
)
application_id = 'org.gnome.Podcasts@0@'.format(profile) application_id = 'org.gnome.Podcasts@0@'.format(profile)
i18n = import('i18n') i18n = import('i18n')
gnome = import('gnome') gnome = import('gnome')

View File

@ -1,7 +1,7 @@
{ {
"app-id" : "org.gnome.Podcasts.Devel", "app-id" : "org.gnome.Podcasts.Devel",
"runtime" : "org.gnome.Platform", "runtime" : "org.gnome.Platform",
"runtime-version" : "master", "runtime-version" : "3.36",
"sdk" : "org.gnome.Sdk", "sdk" : "org.gnome.Sdk",
"sdk-extensions" : [ "sdk-extensions" : [
"org.freedesktop.Sdk.Extension.rust-stable" "org.freedesktop.Sdk.Extension.rust-stable"
@ -25,8 +25,8 @@
"--share=network" "--share=network"
], ],
"env" : { "env" : {
"RUSTFLAGS" : "--error-format=short --remap-path-prefix =../",
"CARGO_HOME" : "/run/build/Podcasts/cargo", "CARGO_HOME" : "/run/build/Podcasts/cargo",
"RUSTFLAGS" : "",
"RUST_BACKTRACE" : "1" "RUST_BACKTRACE" : "1"
} }
}, },
@ -50,7 +50,7 @@
{ {
"type" : "git", "type" : "git",
"url" : "https://source.puri.sm/Librem5/libhandy.git", "url" : "https://source.puri.sm/Librem5/libhandy.git",
"commit" : "f5909a897f70143bdd2f89f47a63c1bf848330ce" "tag" : "v0.0.13"
} }
] ]
}, },

View File

@ -1,7 +1,7 @@
{ {
"app-id" : "org.gnome.Podcasts", "app-id" : "org.gnome.Podcasts",
"runtime" : "org.gnome.Platform", "runtime" : "org.gnome.Platform",
"runtime-version" : "master", "runtime-version" : "3.36",
"sdk" : "org.gnome.Sdk", "sdk" : "org.gnome.Sdk",
"sdk-extensions" : [ "sdk-extensions" : [
"org.freedesktop.Sdk.Extension.rust-stable" "org.freedesktop.Sdk.Extension.rust-stable"
@ -27,7 +27,6 @@
], ],
"env" : { "env" : {
"CARGO_HOME" : "/run/build/Podcasts/cargo", "CARGO_HOME" : "/run/build/Podcasts/cargo",
"RUSTFLAGS" : "--error-format=short --remap-path-prefix =../",
"RUST_BACKTRACE" : "1" "RUST_BACKTRACE" : "1"
} }
}, },
@ -51,7 +50,7 @@
{ {
"type" : "git", "type" : "git",
"url" : "https://source.puri.sm/Librem5/libhandy.git", "url" : "https://source.puri.sm/Librem5/libhandy.git",
"commit" : "f5909a897f70143bdd2f89f47a63c1bf848330ce" "tag" : "v0.0.13"
} }
] ]
}, },

View File

@ -5,31 +5,31 @@ version = "0.1.0"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
ammonia = "3.0.0" ammonia = "3.1.0"
chrono = "0.4.9" chrono = "0.4.11"
derive_builder = "0.8.0" derive_builder = "0.9.0"
lazy_static = "1.4.0" lazy_static = "1.4.0"
log = "0.4.8" log = "0.4.8"
rayon = "1.2.0" rayon = "1.3.1"
rfc822_sanitizer = "0.3.3" rfc822_sanitizer = "0.3.3"
rss = "1.8.0" rss = "1.9.0"
url = "2.1.0" url = "2.1.1"
xdg = "2.2.0" xdg = "2.2.0"
xml-rs = "0.8.0" xml-rs = "0.8.3"
futures = "0.1.29" futures = "0.1.29"
hyper = "0.12.35" hyper = "0.12.35"
http = "0.1.19" http = "0.1.19"
tokio = "0.1.22" tokio = "0.1.22"
hyper-tls = "0.3.2" hyper-tls = "0.3.2"
native-tls = "0.2.3" native-tls = "0.2.3"
num_cpus = "1.10.1" num_cpus = "1.13.0"
failure = "0.1.6" failure = "0.1.8"
failure_derive = "0.1.6" failure_derive = "0.1.8"
base64 = "0.10.1" base64 = "0.12.2"
[dependencies.diesel] [dependencies.diesel]
features = ["sqlite", "r2d2"] features = ["sqlite", "r2d2"]
version = "1.4.3" version = "1.4.5"
[dependencies.diesel_migrations] [dependencies.diesel_migrations]
features = ["sqlite"] features = ["sqlite"]

View File

@ -84,7 +84,10 @@ pub enum DataError {
FeedRedirect(Source), FeedRedirect(Source),
#[fail(display = "Feed is up to date")] #[fail(display = "Feed is up to date")]
FeedNotModified(Source), FeedNotModified(Source),
#[fail(display = "Error occured while Parsing an Episode. Reason: {}", reason)] #[fail(
display = "Error occurred while Parsing an Episode. Reason: {}",
reason
)]
ParseEpisodeError { reason: String, parent_id: i32 }, ParseEpisodeError { reason: String, parent_id: i32 },
#[fail(display = "Episode was not changed and thus skipped.")] #[fail(display = "Episode was not changed and thus skipped.")]
EpisodeNotChanged, EpisodeNotChanged,

View File

@ -18,7 +18,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
#![cfg_attr(feature = "cargo-clippy", allow(unit_arg))] #![allow(clippy::unit_arg)]
//! Index Feeds. //! Index Feeds.
use futures::future::*; use futures::future::*;
@ -198,7 +198,7 @@ mod tests {
}) })
.collect(); .collect();
// Index the channes // Index the channels
let stream_ = stream::iter_ok(feeds).for_each(|x| x.index()); let stream_ = stream::iter_ok(feeds).for_each(|x| x.index());
tokio::run(stream_.map_err(|_| ())); tokio::run(stream_.map_err(|_| ()));

View File

@ -111,7 +111,7 @@ pub use crate::models::{Episode, EpisodeWidgetModel, Show, ShowCoverModel, Sourc
/// It originates from the Tor-browser UA. /// It originates from the Tor-browser UA.
pub const USER_AGENT: &str = "Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0"; pub const USER_AGENT: &str = "Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0";
/// [XDG Base Direcotory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) Paths. /// [XDG Base Directory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) Paths.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub mod xdg_dirs { pub mod xdg_dirs {
use std::path::PathBuf; use std::path::PathBuf;
@ -137,7 +137,7 @@ pub mod xdg_dirs {
PODCASTS_XDG.create_cache_directory(PODCASTS_XDG.get_cache_home()).unwrap() PODCASTS_XDG.create_cache_directory(PODCASTS_XDG.get_cache_home()).unwrap()
}; };
/// GNOME Podcasts Download Direcotry `PathBuf`. /// GNOME Podcasts Download Directory `PathBuf`.
pub static ref DL_DIR: PathBuf = { pub static ref DL_DIR: PathBuf = {
PODCASTS_XDG.create_data_directory("Downloads").unwrap() PODCASTS_XDG.create_data_directory("Downloads").unwrap()
}; };

View File

@ -255,7 +255,7 @@ impl NewEpisodeMinimal {
return Err(err); return Err(err);
}; };
// Default to rfc2822 represantation of epoch 0. // Default to rfc2822 representation of epoch 0.
let date = parse_rfc822(item.pub_date().unwrap_or("Thu, 1 Jan 1970 00:00:00 +0000")); let date = parse_rfc822(item.pub_date().unwrap_or("Thu, 1 Jan 1970 00:00:00 +0000"));
// Should treat information from the rss feeds as invalid by default. // Should treat information from the rss feeds as invalid by default.
// Case: "Thu, 05 Aug 2016 06:00:00 -0400" <-- Actually that was friday. // Case: "Thu, 05 Aug 2016 06:00:00 -0400" <-- Actually that was friday.
@ -342,7 +342,7 @@ mod tests {
use std::io::BufReader; use std::io::BufReader;
// TODO: Add tests for other feeds too. // TODO: Add tests for other feeds too.
// Especially if you find an *intresting* generated feed. // Especially if you find an *interesting* generated feed.
// Known prebuilt expected objects. // Known prebuilt expected objects.
lazy_static! { lazy_static! {

View File

@ -216,7 +216,10 @@ impl Source {
self = self.save()?; self = self.save()?;
debug!("Updated Source: {:#?}", &self); debug!("Updated Source: {:#?}", &self);
info!("Feed url of Source {}, was updated succesfully.", self.id()); info!(
"Feed url of Source {}, was updated successfully.",
self.id()
);
} }
Ok(self) Ok(self)

View File

@ -43,7 +43,7 @@ use failure::Error;
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
// FIXME: Make it a Diesel model // FIXME: Make it a Diesel model
/// Represents an `outline` xml element as per the `OPML` [specification][spec] /// Represents an `outline` xml element as per the `OPML` [specification][spec]
/// not `RSS` related sub-elements are ommited. /// not `RSS` related sub-elements are omitted.
/// ///
/// [spec]: http://dev.opml.org/spec2.html /// [spec]: http://dev.opml.org/spec2.html
pub struct Opml { pub struct Opml {
@ -82,7 +82,7 @@ pub fn import_from_file<P: AsRef<Path>>(path: P) -> Result<Vec<Source>, DataErro
import_to_db(content.as_slice()).map_err(From::from) import_to_db(content.as_slice()).map_err(From::from)
} }
/// Export a file to `P`, taking the feeds from the database and outputing /// Export a file to `P`, taking the feeds from the database and outputting
/// them in opml format. /// them in opml format.
pub fn export_from_db<P: AsRef<Path>>(path: P, export_title: &str) -> Result<(), Error> { pub fn export_from_db<P: AsRef<Path>>(path: P, export_title: &str) -> Result<(), Error> {
let file = File::create(path)?; let file = File::create(path)?;
@ -163,7 +163,7 @@ pub fn export_to_file<F: Write>(file: F, export_title: &str) -> Result<(), Error
Ok(()) Ok(())
} }
/// Extracts the `outline` elemnts from a reader `R` and returns a `HashSet` of `Opml` structs. /// Extracts the `outline` elements from a reader `R` and returns a `HashSet` of `Opml` structs.
pub fn extract_sources<R: Read>(reader: R) -> Result<HashSet<Opml>, reader::Error> { pub fn extract_sources<R: Read>(reader: R) -> Result<HashSet<Opml>, reader::Error> {
let mut list = HashSet::new(); let mut list = HashSet::new();
let parser = reader::EventReader::new(reader); let parser = reader::EventReader::new(reader);

View File

@ -56,7 +56,7 @@ fn download_checker() -> Result<(), DataError> {
Ok(()) Ok(())
} }
/// Delete watched `episodes` that have exceded their liftime after played. /// Delete watched `episodes` that have exceeded their lifetime after played.
fn played_cleaner(cleanup_date: DateTime<Utc>) -> Result<(), DataError> { fn played_cleaner(cleanup_date: DateTime<Utc>) -> Result<(), DataError> {
let mut episodes = dbqueries::get_played_cleaner_episodes()?; let mut episodes = dbqueries::get_played_cleaner_episodes()?;
let now_utc = cleanup_date.timestamp() as i32; let now_utc = cleanup_date.timestamp() as i32;
@ -68,7 +68,7 @@ fn played_cleaner(cleanup_date: DateTime<Utc>) -> Result<(), DataError> {
let limit = ep.played().unwrap(); let limit = ep.played().unwrap();
if now_utc > limit { if now_utc > limit {
delete_local_content(ep) delete_local_content(ep)
.map(|_| info!("Episode {:?} was deleted succesfully.", ep.local_uri())) .map(|_| info!("Episode {:?} was deleted successfully.", ep.local_uri()))
.map_err(|err| error!("Error: {}", err)) .map_err(|err| error!("Error: {}", err))
.map_err(|_| error!("Failed to delete file: {:?}", ep.local_uri())) .map_err(|_| error!("Failed to delete file: {:?}", ep.local_uri()))
.ok(); .ok();
@ -144,11 +144,11 @@ pub fn get_download_folder(pd_title: &str) -> Result<String, DataError> {
// TODO: Write Tests // TODO: Write Tests
pub fn delete_show(pd: &Show) -> Result<(), DataError> { pub fn delete_show(pd: &Show) -> Result<(), DataError> {
dbqueries::remove_feed(pd)?; dbqueries::remove_feed(pd)?;
info!("{} was removed succesfully.", pd.title()); info!("{} was removed successfully.", pd.title());
let fold = get_download_folder(pd.title())?; let fold = get_download_folder(pd.title())?;
fs::remove_dir_all(&fold)?; fs::remove_dir_all(&fold)?;
info!("All the content at, {} was removed succesfully", &fold); info!("All the content at, {} was removed successfully", &fold);
Ok(()) Ok(())
} }
@ -161,7 +161,6 @@ use crate::Feed;
pub fn get_feed(file_path: &str, id: i32) -> Feed { pub fn get_feed(file_path: &str, id: i32) -> Feed {
use crate::feed::FeedBuilder; use crate::feed::FeedBuilder;
use rss::Channel; use rss::Channel;
use std::fs;
use std::io::BufReader; use std::io::BufReader;
// open the xml file // open the xml file

View File

@ -5,14 +5,13 @@ version = "0.1.0"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
error-chain = "0.12.1"
log = "0.4.8" log = "0.4.8"
mime_guess = "2.0.1" mime_guess = "2.0.3"
reqwest = "0.9.22" reqwest = "0.9.22"
tempdir = "0.3.7" tempdir = "0.3.7"
glob = "0.3.0" glob = "0.3.0"
failure = "0.1.6" failure = "0.1.8"
failure_derive = "0.1.6" failure_derive = "0.1.8"
[dependencies.podcasts-data] [dependencies.podcasts-data]
path = "../podcasts-data" path = "../podcasts-data"

View File

@ -54,7 +54,7 @@ pub trait DownloadProgress {
// Sorry to those who will have to work with that code. // Sorry to those who will have to work with that code.
// Would much rather use a crate, // Would much rather use a crate,
// or bindings for a lib like youtube-dl(python), // or bindings for a lib like youtube-dl(python),
// But cant seem to find one. // But can't seem to find one.
// TODO: Write unit-tests. // TODO: Write unit-tests.
fn download_into( fn download_into(
dir: &str, dir: &str,
@ -64,7 +64,7 @@ fn download_into(
) -> Result<String, DownloadError> { ) -> Result<String, DownloadError> {
info!("GET request to: {}", url); info!("GET request to: {}", url);
// Haven't included the loop check as // Haven't included the loop check as
// Steal the Stars would tigger it as // Steal the Stars would trigger it as
// it has a loop back before giving correct url // it has a loop back before giving correct url
let policy = RedirectPolicy::custom(|attempt| { let policy = RedirectPolicy::custom(|attempt| {
info!("Redirect Attempt URL: {:?}", attempt.url()); info!("Redirect Attempt URL: {:?}", attempt.url());
@ -104,7 +104,7 @@ fn download_into(
.and_then(|h| h.to_str().ok()) .and_then(|h| h.to_str().ok())
.map(From::from); .map(From::from);
ct_len.map(|x| info!("File Lenght: {}", x)); ct_len.map(|x| info!("File Length: {}", x));
ct_type.map(|x| info!("Content Type: {}", x)); ct_type.map(|x| info!("Content Type: {}", x));
let ext = get_ext(ct_type).unwrap_or_else(|| String::from("unknown")); let ext = get_ext(ct_type).unwrap_or_else(|| String::from("unknown"));
@ -131,7 +131,7 @@ fn download_into(
let target = format!("{}/{}.{}", dir, file_title, ext); let target = format!("{}/{}.{}", dir, file_title, ext);
// Rename/move the tempfile into a permanent place upon success. // Rename/move the tempfile into a permanent place upon success.
rename(out_file, &target)?; rename(out_file, &target)?;
info!("Downloading of {} completed succesfully.", &target); info!("Downloading of {} completed successfully.", &target);
Ok(target) Ok(target)
} }
@ -153,7 +153,7 @@ fn get_ext(content: Option<&str>) -> Option<String> {
// TODO: Refactor... Somehow. // TODO: Refactor... Somehow.
/// Handles the I/O of fetching a remote file and saving into a Buffer and A /// Handles the I/O of fetching a remote file and saving into a Buffer and A
/// File. /// File.
#[allow(needless_pass_by_value)] #[allow(clippy::needless_pass_by_value)]
fn save_io( fn save_io(
file: &str, file: &str,
resp: &mut reqwest::Response, resp: &mut reqwest::Response,
@ -219,10 +219,10 @@ pub fn get_episode(
progress, progress,
)?; )?;
// If download succedes set episode local_uri to dlpath. // If download succeeds set episode local_uri to dlpath.
ep.set_local_uri(Some(&path)); ep.set_local_uri(Some(&path));
// Over-write episode lenght // Over-write episode length
let size = fs::metadata(path); let size = fs::metadata(path);
if let Ok(s) = size { if let Ok(s) = size {
ep.set_length(Some(s.len() as i32)) ep.set_length(Some(s.len() as i32))

View File

@ -19,7 +19,7 @@
#![recursion_limit = "1024"] #![recursion_limit = "1024"]
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![cfg_attr(feature = "cargo-clippy", allow(blacklisted_name))] #![allow(clippy::blacklisted_name)]
// Enable lint group collections // Enable lint group collections
#![warn(nonstandard_style, edition_2018, rust_2018_idioms, bad_style, unused)] #![warn(nonstandard_style, edition_2018, rust_2018_idioms, bad_style, unused)]
// standalone lints // standalone lints

View File

@ -5,50 +5,47 @@ version = "0.1.0"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
chrono = "0.4.9" chrono = "0.4.11"
crossbeam-channel = "0.3.9" crossbeam-channel = "0.3.9"
gdk = "0.11.0" gdk = "0.12.1"
gdk-pixbuf = "0.7.0" gdk-pixbuf = "0.8.0"
gobject-sys = "0.9.0" gobject-sys = "0.9.1"
glib-sys = "0.9.0" glib-sys = "0.9.1"
gst = { version = "0.14.0", package = "gstreamer" } gst = { version = "0.15.7", package = "gstreamer" }
gst-player = { version = "0.14.0", package = "gstreamer-player" } gst-player = { version = "0.15.5", package = "gstreamer-player" }
humansize = "1.1.0" humansize = "1.1.0"
lazy_static = "1.4.0" lazy_static = "1.4.0"
log = "0.4.8" log = "0.4.8"
loggerv = "0.7.2" loggerv = "0.7.2"
open = "1.3.2" open = "1.4.0"
rayon = "1.2.0" rayon = "1.3.1"
url = "2.1.0" url = "2.1.0"
failure = "0.1.6" failure = "0.1.8"
failure_derive = "0.1.6" failure_derive = "0.1.8"
fragile = "0.3.0" fragile = "1.0.0"
regex = "1.3.1" regex = "1.3.9"
reqwest = "0.9.22" reqwest = "0.9.22"
serde_json = "1.0.41" serde_json = "1.0.55"
# html2text = "0.1.8" html2text = "0.1.12"
html2text = { git = "https://github.com/jugglerchris/rust-html2text" } mpris-player = "0.5.0"
mpris-player = "0.4.0" pango = "0.8.0"
glib = "0.9.3"
[dependencies.gettext-rs] [dependencies.gettext-rs]
git = "https://github.com/danigm/gettext-rs" git = "https://github.com/danigm/gettext-rs"
branch = "no-gettext" branch = "no-gettext"
features = ["gettext-system"] features = ["gettext-system"]
[dependencies.glib]
features = ["subclassing"]
version = "0.8.2"
[dependencies.gio] [dependencies.gio]
features = ["v2_50", "subclassing"] features = ["v2_50"]
version = "0.7.0" version = "0.8.1"
[dependencies.gtk] [dependencies.gtk]
features = ["v3_24", "subclassing"] features = ["v3_24"]
version = "0.7.0" version = "0.8.1"
[dependencies.libhandy] [dependencies.libhandy]
version = "0.4.0" version = "0.5.0"
features = [ "v0_0_10"] features = [ "v0_0_10"]
# [dependencies.mpris-player] # [dependencies.mpris-player]

View File

@ -23,3 +23,5 @@ pt_BR
sk sk
sv sv
tr tr
uk
zh_CN

View File

@ -13,6 +13,8 @@ podcasts-gtk/resources/gtk/help-overlay.ui
podcasts-gtk/resources/gtk/home_episode.ui podcasts-gtk/resources/gtk/home_episode.ui
podcasts-gtk/resources/gtk/home_view.ui podcasts-gtk/resources/gtk/home_view.ui
podcasts-gtk/resources/gtk/inapp_notif.ui podcasts-gtk/resources/gtk/inapp_notif.ui
podcasts-gtk/resources/gtk/player_dialog.ui
podcasts-gtk/resources/gtk/player_rate.ui
podcasts-gtk/resources/gtk/player_toolbar.ui podcasts-gtk/resources/gtk/player_toolbar.ui
podcasts-gtk/resources/gtk/secondary_menu.ui podcasts-gtk/resources/gtk/secondary_menu.ui
podcasts-gtk/resources/gtk/show_menu.ui podcasts-gtk/resources/gtk/show_menu.ui
@ -42,3 +44,4 @@ podcasts-gtk/src/widgets/player.rs
podcasts-gtk/src/widgets/show_menu.rs podcasts-gtk/src/widgets/show_menu.rs
podcasts-gtk/src/widgets/show.rs podcasts-gtk/src/widgets/show.rs
podcasts-gtk/src/widgets/shows_view.rs podcasts-gtk/src/widgets/shows_view.rs
podcasts-gtk/src/window.rs

View File

@ -35,7 +35,7 @@ msgstr "Amplada de l'última finestra principal oberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window" msgid "Maximized state of the last open main window"
msgstr "Estat de maximització de l'ultima finestra principal oberta" msgstr "Estat de maximització de l'última finestra principal oberta"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme" msgid "Enable or disable dark theme"

View File

@ -8,16 +8,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-02-02 15:17+0000\n" "POT-Creation-Date: 2020-04-06 16:50+0000\n"
"PO-Revision-Date: 2019-03-09 17:13+0100\n" "PO-Revision-Date: 2020-05-09 16:54+0200\n"
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n" "Last-Translator: Onno Giesmann <nutzer3105@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n" "Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.1\n" "X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -71,8 +71,8 @@ msgstr "Zeitintervall zwischen automatischen Löschvorgängen"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:124 podcasts-gtk/src/app.rs:455 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:353
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:82
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasts" msgstr "Podcasts"
@ -81,11 +81,6 @@ msgstr "Podcasts"
msgid "Listen to your favorite podcasts, right from your desktop." msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Hören Sie Ihre Lieblings-Podcasts direkt in Ihrer Arbeitsumgebung." msgstr "Hören Sie Ihre Lieblings-Podcasts direkt in Ihrer Arbeitsumgebung."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;" msgid "Podcast;RSS;"
@ -95,7 +90,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Podcast-Anwendung für GNOME" msgstr "Podcast-Anwendung für GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -121,19 +116,23 @@ msgstr "Neue Podcasts mittels Quellen-Adresse hinzufügen"
msgid "Import shows from another device" msgid "Import shows from another device"
msgstr "Podcasts von einem anderen Gerät importieren" msgstr "Podcasts von einem anderen Gerät importieren"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180 #: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Sie haben sich diese Folge bereits angehört."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…" msgid "Calculating episode size…"
msgstr "Größe der Folge wird ermittelt …" msgstr "Größe der Folge wird ermittelt …"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220 #: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode" msgid "Play this episode"
msgstr "Diese Folge abspielen" msgstr "Diese Folge abspielen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241 #: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process" msgid "Cancel the download process"
msgstr "Herunterladen abbrechen" msgstr "Herunterladen abbrechen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264 #: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode" msgid "Download this episode"
msgstr "Diese Folge herunterladen" msgstr "Diese Folge herunterladen"
@ -150,19 +149,15 @@ msgid "_Export Shows"
msgstr "Podcasts e_xportieren" msgstr "Podcasts e_xportieren"
#: podcasts-gtk/resources/gtk/hamburger.ui:22 #: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Einstellungen"
#: podcasts-gtk/resources/gtk/hamburger.ui:27
msgid "_Keyboard Shortcuts" msgid "_Keyboard Shortcuts"
msgstr "Tasten_kürzel" msgstr "Tasten_kürzel"
#: podcasts-gtk/resources/gtk/hamburger.ui:35 #: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts" msgid "_About Podcasts"
msgstr "Info zu _Podcasts" msgstr "Info zu _Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Neue Quelle hinzufügen" msgstr "Neue Quelle hinzufügen"
@ -174,15 +169,11 @@ msgstr "Hinzuzufügende Quellen-Adresse eingeben"
msgid "Add" msgid "Add"
msgstr "Hinzufügen" msgstr "Hinzufügen"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "Sie haben diese Quelle bereits abonniert!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Titel anzeigen" msgstr "Titel anzeigen"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Zurück" msgstr "Zurück"
@ -197,11 +188,6 @@ msgstr "Auf neue Folgen prüfen"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25 #: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window" msgctxt "shortcut window"
msgid "Preferences"
msgstr "Einstellungen"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application" msgid "Quit the application"
msgstr "Die Anwendung beenden" msgstr "Die Anwendung beenden"
@ -233,71 +219,54 @@ msgstr "Eine anwendungsinterne Aktionsmeldung"
msgid "Undo" msgid "Undo"
msgstr "Rückgängig" msgstr "Rückgängig"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "10 Sekunden zurückspulen" msgstr "Läuft gerade"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Wiedergeben"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pause"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "10 Sekunden vorspulen"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Die Wiedergabegeschwindigkeit ändern" msgstr "Die Wiedergabegeschwindigkeit ändern"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "1,5-fache Geschwindigkeit" msgstr "1,5-fache Geschwindigkeit"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "1,25-fache Geschwindigkeit" msgstr "1,25-fache Geschwindigkeit"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Normale Geschwidigkeit" msgstr "Normale Geschwindigkeit"
#: podcasts-gtk/resources/gtk/prefs.ui:42 #: podcasts-gtk/resources/gtk/player_toolbar.ui:97
#: podcasts-gtk/resources/gtk/prefs.ui:295 msgid "Rewind 10 seconds"
msgid "Preferences" msgstr "10 Sekunden zurückspulen"
msgstr "Einstellungen"
#: podcasts-gtk/resources/gtk/prefs.ui:76 #: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Appearance" msgid "Play"
msgstr "Erscheinungsbild" msgstr "Wiedergeben"
#: podcasts-gtk/resources/gtk/prefs.ui:120 #: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Dark Theme" msgid "Pause"
msgstr "Dunkles Thema" msgstr "Pause"
#: podcasts-gtk/resources/gtk/prefs.ui:166 #: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Delete played episodes" msgid "Fast forward 10 seconds"
msgstr "Angehörte Folgen löschen" msgstr "10 Sekunden vorspulen"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Nach"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
@ -323,38 +292,14 @@ msgstr "Alle als angehört markieren"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Abbestellen" msgstr "Abbestellen"
#: podcasts-gtk/src/app.rs:369 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Weiterlesen"
#: podcasts-gtk/src/app.rs:287
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Neue Folgen werden abgerufen" msgstr "Neue Folgen werden abgerufen"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "Sie haben diese Show nun abonniert"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "Ungültige Adresse"
#: podcasts-gtk/src/prefs.rs:78
msgid "Seconds"
msgstr "Sekunden"
#: podcasts-gtk/src/prefs.rs:79
msgid "Minutes"
msgstr "Minuten"
#: podcasts-gtk/src/prefs.rs:80
msgid "Hours"
msgstr "Stunden"
#: podcasts-gtk/src/prefs.rs:81
msgid "Days"
msgstr "Tage"
#: podcasts-gtk/src/prefs.rs:82
msgid "Weeks"
msgstr "Wochen"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Neu" msgstr "Neu"
@ -363,43 +308,43 @@ msgstr "Neu"
msgid "Shows" msgid "Shows"
msgstr "Podcasts" msgstr "Podcasts"
#: podcasts-gtk/src/utils.rs:377 #: podcasts-gtk/src/utils.rs:398
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Wählen Sie die Datei aus, aus der Sie Shows importieren wollen." msgstr "Wählen Sie die Datei aus, aus der Sie Podcasts importieren wollen."
#: podcasts-gtk/src/utils.rs:380 #: podcasts-gtk/src/utils.rs:401
msgid "_Import" msgid "_Import"
msgstr "_Importieren" msgstr "_Importieren"
#: podcasts-gtk/src/utils.rs:389 podcasts-gtk/src/utils.rs:435 #: podcasts-gtk/src/utils.rs:410 podcasts-gtk/src/utils.rs:457
msgid "OPML file" msgid "OPML file"
msgstr "OPML-Datei" msgstr "OPML-Datei"
#: podcasts-gtk/src/utils.rs:406 #: podcasts-gtk/src/utils.rs:427
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Die importierte Datei konnte nicht ausgewertet werden" msgstr "Die importierte Datei konnte nicht ausgewertet werden"
#: podcasts-gtk/src/utils.rs:411 podcasts-gtk/src/utils.rs:453 #: podcasts-gtk/src/utils.rs:432 podcasts-gtk/src/utils.rs:475
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Auf die gewählte Datei konnte nicht zugegriffen werden." msgstr "Auf die gewählte Datei konnte nicht zugegriffen werden."
#: podcasts-gtk/src/utils.rs:423 #: podcasts-gtk/src/utils.rs:445
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Podcasts exportieren nach …" msgstr "Podcasts exportieren nach …"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:448
msgid "_Export" msgid "_Export"
msgstr "E_xportieren" msgstr "E_xportieren"
#: podcasts-gtk/src/utils.rs:427 #: podcasts-gtk/src/utils.rs:449
msgid "_Cancel" msgid "_Cancel"
msgstr "A_bbrechen" msgstr "A_bbrechen"
#: podcasts-gtk/src/utils.rs:447 #: podcasts-gtk/src/utils.rs:469
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcasts Abonnements" msgstr "GNOME Podcasts Abonnements"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:470
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Export der Podcasts ist fehlgeschlagen" msgstr "Export der Podcasts ist fehlgeschlagen"
@ -415,24 +360,71 @@ msgstr "Erfahren Sie mehr über GNOME Podcasts"
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr ""
"Mario Blättermann <mario.blaettermann@gmail.com>\n" "Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Tim Sabsch <tim@sabsch.com>" "Tim Sabsch <tim@sabsch.com>\n"
"Onno Giesmann <nutzer3105@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:149 #: podcasts-gtk/src/widgets/episode.rs:149
msgid "{} min" msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:536 #: podcasts-gtk/src/widgets/player.rs:828
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Die Medienwiedergabe konnte eine Aktion nicht ausführen." msgstr "Die Medienwiedergabe konnte eine Aktion nicht ausführen."
#: podcasts-gtk/src/widgets/show_menu.rs:169 #: podcasts-gtk/src/widgets/show_menu.rs:174
msgid "Marked all episodes as listened" msgid "Marked all episodes as listened"
msgstr "Alle Folgen als angehört markieren" msgstr "Alle Folgen als angehört markieren"
#: podcasts-gtk/src/widgets/show_menu.rs:174 #: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Abonnement von {} gekündigt" msgstr "Abonnement von {} gekündigt"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Einstellungen"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Sie haben diese Quelle bereits abonniert!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Einstellungen"
#~ msgid "Preferences"
#~ msgstr "Einstellungen"
#~ msgid "Appearance"
#~ msgstr "Erscheinungsbild"
#~ msgid "Dark Theme"
#~ msgstr "Dunkles Thema"
#~ msgid "Delete played episodes"
#~ msgstr "Angehörte Folgen löschen"
#~ msgid "After"
#~ msgstr "Nach"
#~ msgid "Invalid URL"
#~ msgstr "Ungültige Adresse"
#~ msgid "Seconds"
#~ msgstr "Sekunden"
#~ msgid "Minutes"
#~ msgstr "Minuten"
#~ msgid "Hours"
#~ msgstr "Stunden"
#~ msgid "Days"
#~ msgstr "Tage"
#~ msgid "Weeks"
#~ msgstr "Wochen"
#~ msgid "_About" #~ msgid "_About"
#~ msgstr "I_nfo" #~ msgstr "I_nfo"

View File

@ -5,22 +5,22 @@
# Daniel Garcia Moreno <danigm@wadobo.com>, 2018. # Daniel Garcia Moreno <danigm@wadobo.com>, 2018.
# Rodrigo <rodhos92@gmail.com>, 2018. # Rodrigo <rodhos92@gmail.com>, 2018.
# Rodrigo Lledó <rodhos92@gmail.com>, 2019. # Rodrigo Lledó <rodhos92@gmail.com>, 2019.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2018-2019. # Daniel Mustieles <daniel.mustieles@gmail.com>, 2018-2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-podcasts\n" "Project-Id-Version: gnome-podcasts\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-06-15 10:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-06-19 12:19+0200\n" "PO-Revision-Date: 2020-02-07 13:18+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: es <gnome-es-list@gnome.org>\n" "Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es\n" "Language: es_ES\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.32.0\n" "X-Generator: Gtranslator 3.34.0\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -75,8 +75,8 @@ msgstr "Cuántos periodos de tiempo hay que esperar entre limpiezas automáticas
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasts" msgstr "Podcasts"
@ -94,7 +94,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Aplicación de Podcast para GNOME" msgstr "Aplicación de Podcast para GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -119,7 +119,6 @@ msgid "Import shows from another device"
msgstr "Importar programas de otro dispositivo" msgstr "Importar programas de otro dispositivo"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79 #: podcasts-gtk/resources/gtk/episode_widget.ui:79
#| msgid "You've already listened to this episode."
msgid "Youve already listened to this episode." msgid "Youve already listened to this episode."
msgstr "Ya ha escuchado este episodio." msgstr "Ya ha escuchado este episodio."
@ -160,7 +159,7 @@ msgid "_About Podcasts"
msgstr "_Acerca de Podcasts" msgstr "_Acerca de Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:177 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Añadir un canal nuevo" msgstr "Añadir un canal nuevo"
@ -172,11 +171,11 @@ msgstr "Introduzca la dirección del canal que añadir"
msgid "Add" msgid "Add"
msgstr "Añadir" msgstr "Añadir"
#: podcasts-gtk/resources/gtk/headerbar.ui:157 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title" msgid "Show Title"
msgstr "Título del programa" msgstr "Título del programa"
#: podcasts-gtk/resources/gtk/headerbar.ui:198 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Atrás" msgstr "Atrás"
@ -222,51 +221,55 @@ msgstr "Una notificación de acción dentro de la aplicación"
msgid "Undo" msgid "Undo"
msgstr "Deshacer" msgstr "Deshacer"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Retroceder 10 segundos" msgstr "Reproduciendo ahora"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Reproducir"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Avanzar 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Cambiar velocidad de reproducción" msgstr "Cambiar velocidad de reproducción"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1.00×" msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1.50×" msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "velocidad 1.5" msgstr "velocidad 1.5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1.25×" msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "velocidad 1.25" msgstr "velocidad 1.25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Velocidad normal" msgstr "Velocidad normal"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Retroceder 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Reproducir"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Avanzar 10 segundos"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "_Marcar todos los episodios como reproducidos" msgstr "_Marcar todos los episodios como reproducidos"
@ -291,18 +294,14 @@ msgstr "Marcar todo como reproducido"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Cancelar suscripción" msgstr "Cancelar suscripción"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Leer más"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Obteniendo nuevos episodios" msgstr "Obteniendo nuevos episodios"
#: podcasts-gtk/src/headerbar.rs:127
msgid "You are already subscribed to this show"
msgstr "Ya está suscrito a este programa"
#: podcasts-gtk/src/headerbar.rs:145
msgid "Invalid URL"
msgstr "URL no válido"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Nuevo" msgstr "Nuevo"
@ -311,43 +310,43 @@ msgstr "Nuevo"
msgid "Shows" msgid "Shows"
msgstr "Programas" msgstr "Programas"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Selecciona el fichero desde el que quiere importar programas." msgstr "Selecciona el fichero desde el que quiere importar programas."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Importar" msgstr "_Importar"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "fichero OPML" msgstr "fichero OPML"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Fallo al analizar el fichero importado" msgstr "Fallo al analizar el fichero importado"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "No se ha podido acceder al archivo seleccionado." msgstr "No se ha podido acceder al archivo seleccionado."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Exportar programas a…" msgstr "Exportar programas a…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Exportar" msgstr "_Exportar"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_Cancelar" msgstr "_Cancelar"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "Suscripciones a podcasts de GNOME" msgstr "Suscripciones a podcasts de GNOME"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Falló al exportar podcasts" msgstr "Falló al exportar podcasts"
@ -370,7 +369,7 @@ msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "El reproductor no ha podido reproducir una acción." msgstr "El reproductor no ha podido reproducir una acción."
@ -382,6 +381,12 @@ msgstr "Marcar todos los episodios como escuchados"
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Suscripción cancelada para {}" msgstr "Suscripción cancelada para {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Ya está suscrito a este programa"
#~ msgid "Invalid URL"
#~ msgstr "URL no válido"
#~ msgid "You are already subscribed to that feed!" #~ msgid "You are already subscribed to that feed!"
#~ msgstr "¡Ya está suscrito a este canal!" #~ msgstr "¡Ya está suscrito a este canal!"

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-05-18 12:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-06-01 20:20+0300\n" "PO-Revision-Date: 2020-02-23 13:44+0200\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n" "Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: Finnish <lokalisointi-lista@googlegroups.com>\n" "Language-Team: Finnish <lokalisointi-lista@googlegroups.com>\n"
"Language: fi\n" "Language: fi\n"
@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.0.6\n" "X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -69,8 +69,8 @@ msgstr ""
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcastit" msgstr "Podcastit"
@ -88,7 +88,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Podcast-sovellus Gnomelle" msgstr "Podcast-sovellus Gnomelle"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -153,7 +153,7 @@ msgid "_About Podcasts"
msgstr "_Tietoja - Podcastit" msgstr "_Tietoja - Podcastit"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Lisää uusi syöte" msgstr "Lisää uusi syöte"
@ -165,15 +165,11 @@ msgstr "Anna lisättävän syötteen osoite"
msgid "Add" msgid "Add"
msgstr "Lisää" msgstr "Lisää"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "Olet jo tilannut kyseisen syötteen!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Ohjelman nimi" msgstr "Ohjelman nimi"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Takaisin" msgstr "Takaisin"
@ -219,51 +215,55 @@ msgstr "Sovelluksen sisäinen ilmoitus"
msgid "Undo" msgid "Undo"
msgstr "Kumoa" msgstr "Kumoa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Siirry taakse 10 sekuntia" msgstr "Nyt toistetaan"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Toista"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Keskeytä"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Siirry eteen 10 sekuntia"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Vaihda toistonopeutta" msgstr "Vaihda toistonopeutta"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1.00×" msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1.50×" msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "1,5-kertainen nopeus" msgstr "1,5-kertainen nopeus"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1.25×" msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "1,25-kertainen nopeus" msgstr "1,25-kertainen nopeus"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Tavallinen nopeus" msgstr "Tavallinen nopeus"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Siirry taakse 10 sekuntia"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Toista"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Keskeytä"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Siirry eteen 10 sekuntia"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "_Merkitse kaikki jaksot toistetuiksi" msgstr "_Merkitse kaikki jaksot toistetuiksi"
@ -288,18 +288,14 @@ msgstr "Merkitse kaikki toistetuiksi"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Lopeta tilaus" msgstr "Lopeta tilaus"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Lue lisää"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Noudetaan uusia jaksoja" msgstr "Noudetaan uusia jaksoja"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "Olet jo tilannut tämän ohjelman"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "Virheellinen osoite"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Uudet" msgstr "Uudet"
@ -308,43 +304,43 @@ msgstr "Uudet"
msgid "Shows" msgid "Shows"
msgstr "Ohjelmat" msgstr "Ohjelmat"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Valitse tiedosto, josta haluat tuoda ohjelmia." msgstr "Valitse tiedosto, josta haluat tuoda ohjelmia."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Tuo" msgstr "_Tuo"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "OPML-tiedosto" msgstr "OPML-tiedosto"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Tuotua tiedostoa ei voitu jäsentää" msgstr "Tuotua tiedostoa ei voitu jäsentää"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Valittua tiedostoa ei voitu käyttää." msgstr "Valittua tiedostoa ei voitu käyttää."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Vie jaksot…" msgstr "Vie jaksot…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Vie" msgstr "_Vie"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_Peru" msgstr "_Peru"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "Gnomen podcastsovelluksen tilaukset" msgstr "Gnomen podcastsovelluksen tilaukset"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Podcastien vienti epäonnistui" msgstr "Podcastien vienti epäonnistui"
@ -365,7 +361,7 @@ msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Mediasoitin ei kyennyt suorittamaan toimintoa." msgstr "Mediasoitin ei kyennyt suorittamaan toimintoa."
@ -377,6 +373,15 @@ msgstr "Merkitse kaikki jaksot toistetuiksi"
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Lopeta syötteen {} tilaus" msgstr "Lopeta syötteen {} tilaus"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Olet jo tilannut kyseisen syötteen!"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Olet jo tilannut tämän ohjelman"
#~ msgid "Invalid URL"
#~ msgstr "Virheellinen osoite"
#~ msgid "@icon@" #~ msgid "@icon@"
#~ msgstr "@icon@" #~ msgstr "@icon@"

View File

@ -2,22 +2,23 @@
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER # Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# arverne73 <arverne@wanadoo.fr>, 2018. # arverne73 <arverne@wanadoo.fr>, 2018.
# Alexandre Franke <alexandre.franke@gmail.com>, 2018 # Alexandre Franke <alexandre.franke@gmail.com>, 2018, 2020
# Thibault Martin <mail@thibaultmart.in>, 2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-10-23 10:23+0000\n" "POT-Creation-Date: 2020-06-03 20:13+0000\n"
"PO-Revision-Date: 2018-10-29 13:53+0100\n" "PO-Revision-Date: 2020-06-19 17:15+0200\n"
"Last-Translator: Alexandre Franke <alexandre.franke@gmail.com>\n" "Last-Translator: Thibault Martin <mail@thibaultmart.in>\n"
"Language-Team: French <gnomefr@traduc.org>\n" "Language-Team: French <gnomefr@traduc.org>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n"
"X-Generator: Poedit 2.0.6\n" "X-Generator: Gtranslator 3.36.0\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -49,8 +50,7 @@ msgstr "Indique sil faut actualiser périodiquement le contenu"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes" msgid "How many periods of time to wait between automatic refreshes"
msgstr "" msgstr "Nombre de délais à attendre entre les actualisations automatiques"
"Nombre de périodes de délais à attendre entre les actualisations automatiques"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes" msgid "What period of time to wait between automatic refreshes"
@ -71,8 +71,8 @@ msgstr "Délai entre les nettoyages automatiques"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:92 podcasts-gtk/src/app.rs:416 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:353
#: podcasts-gtk/src/widgets/aboutdialog.rs:37 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:82
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasts" msgstr "Podcasts"
@ -81,11 +81,6 @@ msgstr "Podcasts"
msgid "Listen to your favorite podcasts, right from your desktop." msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Écouter vos podcasts favoris directement sur votre bureau." msgstr "Écouter vos podcasts favoris directement sur votre bureau."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;" msgid "Podcast;RSS;"
@ -95,13 +90,13 @@ msgstr "Podcast;RSS;Baladodiffusion;Émissions;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Application de podcast pour GNOME" msgstr "Application de podcast pour GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:68 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46 #: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet" msgid "This show does not have episodes yet"
msgstr "Cette émission na pas encore dépisodes" msgstr "Cette émission na pas encore dépisode"
#: podcasts-gtk/resources/gtk/empty_view.ui:62 #: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report." msgid "If you think this is an error, please consider writing a bug report."
@ -119,19 +114,23 @@ msgstr "Ajouter de nouvelles émissions via une URL de flux"
msgid "Import shows from another device" msgid "Import shows from another device"
msgstr "Importer des émissions à partir dun autre appareil" msgstr "Importer des émissions à partir dun autre appareil"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180 #: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Vous avez déjà écouté cet épisode."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…" msgid "Calculating episode size…"
msgstr "Calcul de la taille de lépisode…" msgstr "Calcul de la taille de lépisode…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220 #: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode" msgid "Play this episode"
msgstr "Lire cet épisode" msgstr "Lire cet épisode"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241 #: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process" msgid "Cancel the download process"
msgstr "Annuler le téléchargement" msgstr "Annuler le téléchargement"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264 #: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode" msgid "Download this episode"
msgstr "Télécharger cet épisode" msgstr "Télécharger cet épisode"
@ -143,20 +142,20 @@ msgstr "_Chercher de nouveaux épisodes"
msgid "_Import Shows" msgid "_Import Shows"
msgstr "_Importer les émissions" msgstr "_Importer les émissions"
#: podcasts-gtk/resources/gtk/hamburger.ui:22 #: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Preferences" msgid "_Export Shows"
msgstr "_Préférences" msgstr "_Exporter les émissions"
#: podcasts-gtk/resources/gtk/hamburger.ui:27 #: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts" msgid "_Keyboard Shortcuts"
msgstr "_Raccourcis clavier" msgstr "_Raccourcis clavier"
#: podcasts-gtk/resources/gtk/hamburger.ui:35 #: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts" msgid "_About Podcasts"
msgstr "À _propos de Podcasts" msgstr "À _propos de Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Ajouter un nouveau flux" msgstr "Ajouter un nouveau flux"
@ -168,15 +167,11 @@ msgstr "Entrer ladresse du flux à ajouter"
msgid "Add" msgid "Add"
msgstr "Ajouter" msgstr "Ajouter"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "Vous êtes déjà abonné à ce flux !"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Titre de lémission" msgstr "Titre de lémission"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Retour" msgstr "Retour"
@ -191,11 +186,6 @@ msgstr "Chercher de nouveaux épisodes"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25 #: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window" msgctxt "shortcut window"
msgid "Preferences"
msgstr "Préférences"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application" msgid "Quit the application"
msgstr "Quitter lapplication" msgstr "Quitter lapplication"
@ -227,71 +217,54 @@ msgstr "Une notification daction intégrée à lapplication"
msgid "Undo" msgid "Undo"
msgstr "Annuler" msgstr "Annuler"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Reculer de 10 secondes" msgstr "Lecture en cours"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Lire"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pause"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Avancer de 10 secondes"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Changer la vitesse de lecture" msgstr "Changer la vitesse de lecture"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "Débit × 1,5" msgstr "Débit × 1,5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "Débit × 1,25" msgstr "Débit × 1,25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Vitesse normale" msgstr "Vitesse normale"
#: podcasts-gtk/resources/gtk/prefs.ui:42 #: podcasts-gtk/resources/gtk/player_toolbar.ui:97
#: podcasts-gtk/resources/gtk/prefs.ui:295 msgid "Rewind 10 seconds"
msgid "Preferences" msgstr "Reculer de 10 secondes"
msgstr "Préférences"
#: podcasts-gtk/resources/gtk/prefs.ui:76 #: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Appearance" msgid "Play"
msgstr "Apparence" msgstr "Lire"
#: podcasts-gtk/resources/gtk/prefs.ui:120 #: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Dark Theme" msgid "Pause"
msgstr "Thème sombre" msgstr "Pause"
#: podcasts-gtk/resources/gtk/prefs.ui:166 #: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Delete played episodes" msgid "Fast forward 10 seconds"
msgstr "Supprimer les épisodes lus" msgstr "Avancer de 10 secondes"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Après"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
@ -317,91 +290,135 @@ msgstr "Marquer tout comme lu"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Se désabonner" msgstr "Se désabonner"
#: podcasts-gtk/src/app.rs:333 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "En savoir plus"
#: podcasts-gtk/src/app.rs:287
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Récupérer les nouveaux épisodes" msgstr "Récupérer les nouveaux épisodes"
#: podcasts-gtk/src/headerbar.rs:98 #: podcasts-gtk/src/stacks/content.rs:54
msgid "You are already subscribed to this show"
msgstr "Vous êtes déjà abonné à cette émission"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "URL non valide"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "Secondes"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "Minutes"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "Heures"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "Jours"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "Semaines"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New" msgid "New"
msgstr "Nouveau" msgstr "Nouveau"
#: podcasts-gtk/src/stacks/content.rs:36 #: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows" msgid "Shows"
msgstr "Émissions" msgstr "Émissions"
#: podcasts-gtk/src/utils.rs:357 #: podcasts-gtk/src/utils.rs:398
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Sélectionnez le fichier à partir duquel importer les émissions." msgstr "Sélectionnez le fichier à partir duquel importer les émissions."
#: podcasts-gtk/src/utils.rs:360 #: podcasts-gtk/src/utils.rs:401
msgid "_Import" msgid "_Import"
msgstr "_Importer" msgstr "_Importer"
#: podcasts-gtk/src/utils.rs:369 #: podcasts-gtk/src/utils.rs:410 podcasts-gtk/src/utils.rs:457
msgid "OPML file" msgid "OPML file"
msgstr "Fichier OPML" msgstr "Fichier OPML"
#: podcasts-gtk/src/utils.rs:386 #: podcasts-gtk/src/utils.rs:427
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Échec de lanalyse du fichier importé" msgstr "Échec de lanalyse du fichier importé"
#: podcasts-gtk/src/utils.rs:391 #: podcasts-gtk/src/utils.rs:432 podcasts-gtk/src/utils.rs:475
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Le fichier sélectionné nest pas accessible." msgstr "Le fichier sélectionné nest pas accessible."
#: podcasts-gtk/src/widgets/aboutdialog.rs:32 #: podcasts-gtk/src/utils.rs:445
msgid "Export shows to…"
msgstr "Exporter les émissions vers…"
#: podcasts-gtk/src/utils.rs:448
msgid "_Export"
msgstr "_Exporter"
#: podcasts-gtk/src/utils.rs:449
msgid "_Cancel"
msgstr "A_nnuler"
#: podcasts-gtk/src/utils.rs:469
msgid "GNOME Podcasts Subscriptions"
msgstr "Abonnements GNOME Podcasts"
#: podcasts-gtk/src/utils.rs:470
msgid "Failed to export podcasts"
msgstr "Échec de lexportation des podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop." msgid "Podcast Client for the GNOME Desktop."
msgstr "Client de podcast pour le bureau GNOME." msgstr "Client de podcast pour le bureau GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:39 #: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts" msgid "Learn more about GNOME Podcasts"
msgstr "En apprendre plus sur GNOME Podcasts" msgstr "En apprendre plus sur GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:44 #: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits" msgid "translator-credits"
msgstr "Alexandre Franke" msgstr ""
"Alexandre Franke\n"
"Thibault Martin"
#: podcasts-gtk/src/widgets/episode.rs:130 #: podcasts-gtk/src/widgets/episode.rs:149
msgid "{} min" msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:365 #: podcasts-gtk/src/widgets/player.rs:828
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Le lecteur na pas pu réaliser laction." msgstr "Le lecteur na pas pu réaliser laction."
#: podcasts-gtk/src/widgets/show_menu.rs:150 #: podcasts-gtk/src/widgets/show_menu.rs:174
msgid "Marked all episodes as listened" msgid "Marked all episodes as listened"
msgstr "Marquer tous les épisodes comme écoutés" msgstr "Marquer tous les épisodes comme écoutés"
#: podcasts-gtk/src/widgets/show_menu.rs:155 #: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Se désabonner de {}" msgstr "Se désabonner de {}"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Préférences"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Vous êtes déjà abonné à ce flux !"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Préférences"
#~ msgid "Preferences"
#~ msgstr "Préférences"
#~ msgid "Appearance"
#~ msgstr "Apparence"
#~ msgid "Dark Theme"
#~ msgstr "Thème sombre"
#~ msgid "Delete played episodes"
#~ msgstr "Supprimer les épisodes lus"
#~ msgid "After"
#~ msgstr "Après"
#~ msgid "Invalid URL"
#~ msgstr "URL non valide"
#~ msgid "Seconds"
#~ msgstr "Secondes"
#~ msgid "Minutes"
#~ msgstr "Minutes"
#~ msgid "Hours"
#~ msgstr "Heures"
#~ msgid "Days"
#~ msgstr "Jours"
#~ msgid "Weeks"
#~ msgstr "Semaines"

View File

@ -7,15 +7,15 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-09-03 13:42+0000\n" "POT-Creation-Date: 2019-12-08 20:03+0000\n"
"PO-Revision-Date: 2018-09-04 20:17+0200\n" "PO-Revision-Date: 2020-01-21 11:00+0100\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <fur@li.org>\n" "Language-Team: Friulian <fur@li.org>\n"
"Language: fur\n" "Language: fur\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Last-Translator: \n" "X-Generator: Poedit 2.2.4\n"
"X-Generator: Poedit 2.0.7\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -68,8 +68,8 @@ msgstr "Ce periodi di timp di spietâ tra lis netisiis automatichis"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:91 podcasts-gtk/src/app.rs:414 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:31 #: podcasts-gtk/src/widgets/aboutdialog.rs:56
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasts" msgstr "Podcasts"
@ -78,11 +78,6 @@ msgstr "Podcasts"
msgid "Listen to your favorite podcasts, right from your desktop." msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Scolte i tiei podcast preferîts, daurman dal to scritori." msgstr "Scolte i tiei podcast preferîts, daurman dal to scritori."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;" msgid "Podcast;RSS;"
@ -92,7 +87,7 @@ msgstr "Podcast;RSS;Regjistrazion;Trasmission;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Aplicazion podcast par GNOME" msgstr "Aplicazion podcast par GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:51 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -102,7 +97,9 @@ msgstr "Chest spetacul nol à ancjemò episodis"
#: podcasts-gtk/resources/gtk/empty_view.ui:62 #: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report." msgid "If you think this is an error, please consider writing a bug report."
msgstr "Se tu pensis che chest al sedi un erôr, considere di scrivi une segnalazion di erôr." msgstr ""
"Se tu pensis che chest al sedi un erôr, considere di scrivi une segnalazion "
"di erôr."
#: podcasts-gtk/resources/gtk/empty_view.ui:106 #: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows" msgid "Get some shows"
@ -116,22 +113,26 @@ msgstr "Zonte gnûfs spetacui vie URL di feed"
msgid "Import shows from another device" msgid "Import shows from another device"
msgstr "Impuarte i spetacui di un altri dispositîf" msgstr "Impuarte i spetacui di un altri dispositîf"
#: podcasts-gtk/resources/gtk/episode_widget.ui:178 #: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Tu âs za scoltât chest episodi."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…" msgid "Calculating episode size…"
msgstr "Calcul de dimension dal episodi…" msgstr "Calcul de dimension dal episodi…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:214 #: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Cancel"
msgstr "Anule"
#: podcasts-gtk/resources/gtk/episode_widget.ui:232
msgid "Download this episode"
msgstr "Discjarie chest episodi"
#: podcasts-gtk/resources/gtk/episode_widget.ui:256
msgid "Play this episode" msgid "Play this episode"
msgstr "Viôt chest episodi" msgstr "Viôt chest episodi"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Anule il procès di discjariament"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Discjarie chest episodi"
#: podcasts-gtk/resources/gtk/hamburger.ui:7 #: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes" msgid "_Check for New Episodes"
msgstr "_Controle par gnûfs episodis" msgstr "_Controle par gnûfs episodis"
@ -140,20 +141,20 @@ msgstr "_Controle par gnûfs episodis"
msgid "_Import Shows" msgid "_Import Shows"
msgstr "_Impuarte spetacui" msgstr "_Impuarte spetacui"
#: podcasts-gtk/resources/gtk/hamburger.ui:22 #: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Preferences" msgid "_Export Shows"
msgstr "_Preferencis" msgstr "_Espuarte spetacui"
#: podcasts-gtk/resources/gtk/hamburger.ui:29 #: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts" msgid "_Keyboard Shortcuts"
msgstr "_Scurtis tastiere" msgstr "_Scurtis tastiere"
#: podcasts-gtk/resources/gtk/hamburger.ui:37 #: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About" msgid "_About Podcasts"
msgstr "_Informazions" msgstr "_Informazions su Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Zonte un gnûf feed" msgstr "Zonte un gnûf feed"
@ -165,15 +166,11 @@ msgstr "Inserìs la direzion dal feed di zontâ"
msgid "Add" msgid "Add"
msgstr "Zonte" msgstr "Zonte"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "Tu sês za sotscrit a chest feed!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Titul dal spetacul" msgstr "Titul dal spetacul"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Indaûr" msgstr "Indaûr"
@ -188,11 +185,6 @@ msgstr "Controle se a son gnûfs episodis"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25 #: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window" msgctxt "shortcut window"
msgid "Preferences"
msgstr "Preferencis"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application" msgid "Quit the application"
msgstr "Jes de aplicazion" msgstr "Jes de aplicazion"
@ -269,27 +261,6 @@ msgstr "rapuart di velocitât 1.25"
msgid "Normal speed" msgid "Normal speed"
msgstr "Velocitât normâl" msgstr "Velocitât normâl"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "Preferencis"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "Aspiet"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "Teme scûr"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "Elimine i episodis viodûts"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Dopo"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "_Segne ducj i episodis come viodûts" msgstr "_Segne ducj i episodis come viodûts"
@ -314,91 +285,136 @@ msgstr "Segne dut come viodût"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Anule sotscrizion" msgstr "Anule sotscrizion"
#: podcasts-gtk/src/app.rs:332 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Lei di plui"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Daûr a recuperâ i gnûfs episodis" msgstr "Daûr a recuperâ i gnûfs episodis"
#: podcasts-gtk/src/headerbar.rs:98 #: podcasts-gtk/src/stacks/content.rs:54
msgid "You are already subscribed to this show"
msgstr "Tu sês za sotscrit a chest spetacul"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "URL no valit"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "Seconts"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "Minûts"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "Oris"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "Diis"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "Setemanis"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New" msgid "New"
msgstr "Gnûf" msgstr "Gnûf"
#: podcasts-gtk/src/stacks/content.rs:36 #: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows" msgid "Shows"
msgstr "Spetacui" msgstr "Spetacui"
#: podcasts-gtk/src/utils.rs:357 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Selezione il file che di chei si desidere impuartâ i spetacui." msgstr "Selezione il file che di chei si desidere impuartâ i spetacui."
#: podcasts-gtk/src/utils.rs:360 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Impuarte" msgstr "_Impuarte"
#: podcasts-gtk/src/utils.rs:369 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "File OPML" msgstr "File OPML"
#: podcasts-gtk/src/utils.rs:386 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "No si è rivâts a analizâ il file impuartât" msgstr "No si è rivâts a analizâ il file impuartât"
#: podcasts-gtk/src/utils.rs:391 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Il file selezionât nol pues jessi doprât." msgstr "Il file selezionât nol pues jessi doprât."
#: podcasts-gtk/src/widgets/aboutdialog.rs:26 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…"
msgstr "_Espuarte spetacui su…"
#: podcasts-gtk/src/utils.rs:447
msgid "_Export"
msgstr "_Espuarte"
#: podcasts-gtk/src/utils.rs:448
msgid "_Cancel"
msgstr "_Anule"
#: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions"
msgstr "Sotscrizions di GNOME Podcasts"
#: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts"
msgstr "No si è rivâts a espuartâ i podcast"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop." msgid "Podcast Client for the GNOME Desktop."
msgstr "Client podcast pal scritori GNOME." msgstr "Client podcast pal scritori GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:33 #: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts" msgid "Learn more about GNOME Podcasts"
msgstr "Plui informazions su GNOME Podcasts" msgstr "Plui informazions su GNOME Podcasts"
#: podcasts-gtk/src/widgets/aboutdialog.rs:38 #: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits" msgid "translator-credits"
msgstr "Fabio Tomat <f.t.public@gmail.com>" msgstr "Fabio Tomat <f.t.public@gmail.com>"
#: podcasts-gtk/src/widgets/episode.rs:129 #: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min" msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:301 #: podcasts-gtk/src/widgets/player.rs:539
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Il riprodutôr multimediâl nol è stât bon di eseguî une azion." msgstr "Il riprodutôr multimediâl nol è stât bon di eseguî une azion."
#: podcasts-gtk/src/widgets/show_menu.rs:150 #: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened" msgid "Marked all episodes as listened"
msgstr "Segnât ducj i episodis come scoltâts" msgstr "Segnât ducj i episodis come scoltâts"
#: podcasts-gtk/src/widgets/show_menu.rs:155 #: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Sotscrizion anulade di {}" msgstr "Sotscrizion anulade di {}"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Preferencis"
#~ msgid "_About"
#~ msgstr "_Informazions"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "Tu sês za sotscrit a chest feed!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Preferencis"
#~ msgid "Preferences"
#~ msgstr "Preferencis"
#~ msgid "Appearance"
#~ msgstr "Aspiet"
#~ msgid "Dark Theme"
#~ msgstr "Teme scûr"
#~ msgid "Delete played episodes"
#~ msgstr "Elimine i episodis viodûts"
#~ msgid "After"
#~ msgstr "Dopo"
#~ msgid "Invalid URL"
#~ msgstr "URL no valit"
#~ msgid "Seconds"
#~ msgstr "Seconts"
#~ msgid "Minutes"
#~ msgstr "Minûts"
#~ msgid "Hours"
#~ msgstr "Oris"
#~ msgid "Days"
#~ msgstr "Diis"
#~ msgid "Weeks"
#~ msgstr "Setemanis"

View File

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-06-15 10:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-06-22 22:30+0200\n" "PO-Revision-Date: 2020-03-15 15:53+0100\n"
"Last-Translator: gogo <trebelnik2@gmail.com>\n" "Last-Translator: gogo <linux.hr@protonmail.com>\n"
"Language-Team: Croatian <hr@li.org>\n" "Language-Team: Croatian <hr@li.org>\n"
"Language: hr\n" "Language: hr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.2.1\n" "X-Generator: Poedit 2.0.6\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -73,8 +73,8 @@ msgstr "Koliko vremensko razdoblje treba pričekati između automatskih čišće
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasti" msgstr "Podcasti"
@ -92,7 +92,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Podcast aplikacija za GNOME" msgstr "Podcast aplikacija za GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -157,7 +157,7 @@ msgid "_About Podcasts"
msgstr "_O Podcasti" msgstr "_O Podcasti"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:177 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Dodaj novi kanal" msgstr "Dodaj novi kanal"
@ -169,11 +169,11 @@ msgstr "Upišite adresu kanala za dodavanje"
msgid "Add" msgid "Add"
msgstr "Dodaj" msgstr "Dodaj"
#: podcasts-gtk/resources/gtk/headerbar.ui:157 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title" msgid "Show Title"
msgstr "Prikaži naslov" msgstr "Prikaži naslov"
#: podcasts-gtk/resources/gtk/headerbar.ui:198 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Natrag" msgstr "Natrag"
@ -219,51 +219,55 @@ msgstr "Obavijesti radnja iz aplikacije"
msgid "Undo" msgid "Undo"
msgstr "Vrati" msgstr "Vrati"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Premotaj 10 sekundi" msgstr "Trenutna reprodukcija"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Reproduciraj"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pauziraj"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Brzo premotaj 10 sekundi"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Promijeni brzinu reprodukcije" msgstr "Promijeni brzinu reprodukcije"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1.00×" msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1.50×" msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "1.5 brže" msgstr "1.5 brže"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1.25×" msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "1.25 brže" msgstr "1.25 brže"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Normalna brzina" msgstr "Normalna brzina"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Premotaj 10 sekundi"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Reproduciraj"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pauziraj"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Brzo premotaj 10 sekundi"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "_Označi se epizode kao odslušane" msgstr "_Označi se epizode kao odslušane"
@ -288,18 +292,14 @@ msgstr "Označi sve kao odslušano"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Ukini pretplatu" msgstr "Ukini pretplatu"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Pročitaj više"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Preuzimanje novi epizoda" msgstr "Preuzimanje novi epizoda"
#: podcasts-gtk/src/headerbar.rs:127
msgid "You are already subscribed to this show"
msgstr "Već ste pretplaćeni na ovu emisiju"
#: podcasts-gtk/src/headerbar.rs:145
msgid "Invalid URL"
msgstr "Nevažeći URL"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Novo" msgstr "Novo"
@ -308,43 +308,43 @@ msgstr "Novo"
msgid "Shows" msgid "Shows"
msgstr "Emisije" msgstr "Emisije"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Odaberite datoteku iz koje želite uvesti emisije." msgstr "Odaberite datoteku iz koje želite uvesti emisije."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Uvoz" msgstr "_Uvoz"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "OPML datoteka" msgstr "OPML datoteka"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Neuspjela obrada uvezene datoteke" msgstr "Neuspjela obrada uvezene datoteke"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Nemoguć pristup dabranoj datoteci." msgstr "Nemoguć pristup dabranoj datoteci."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "_Izvezi emisije u…" msgstr "_Izvezi emisije u…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Uvoz" msgstr "_Uvoz"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_Odustani" msgstr "_Odustani"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcast pretplate" msgstr "GNOME Podcast pretplate"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Neuspjeli uvoz podcasta" msgstr "Neuspjeli uvoz podcasta"
@ -367,7 +367,7 @@ msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Medijski reproduktor nije uspio izvršiti radnju." msgstr "Medijski reproduktor nije uspio izvršiti radnju."
@ -379,6 +379,12 @@ msgstr "Označi sve epizodae kao odslušane"
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Ukini pretplatu za {}" msgstr "Ukini pretplatu za {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Već ste pretplaćeni na ovu emisiju"
#~ msgid "Invalid URL"
#~ msgstr "Nevažeći URL"
#~ msgid "_Preferences" #~ msgid "_Preferences"
#~ msgstr "_Osobitosti" #~ msgstr "_Osobitosti"

View File

@ -1,15 +1,15 @@
# Hungarian translation for podcasts. # Hungarian translation for podcasts.
# Copyright (C) 2018, 2019. Free Software Foundation, Inc. # Copyright (C) 2018, 2019, 2020 Free Software Foundation, Inc.
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# #
# Meskó Balázs <mesko.balazs at fsf dot hu>, 2018. # Meskó Balázs <mesko.balazs at fsf dot hu>, 2018.
# Balázs Úr <ur.balazs at fsf dot hu>, 2019. # Balázs Úr <ur.balazs at fsf dot hu>, 2019, 2020.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-05-18 12:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-06-03 22:27+0200\n" "PO-Revision-Date: 2020-02-17 23:31+0100\n"
"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n" "Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n" "Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
"Language: hu\n" "Language: hu\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 18.12.3\n" "X-Generator: Lokalize 19.04.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -70,8 +70,8 @@ msgstr "Milyen időközöket várjon az automatikus tisztítások között"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcastok" msgstr "Podcastok"
@ -89,7 +89,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Podcast alkalmazás a GNOME-hoz" msgstr "Podcast alkalmazás a GNOME-hoz"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -114,7 +114,6 @@ msgid "Import shows from another device"
msgstr "Műsorok importálása egy másik eszközről" msgstr "Műsorok importálása egy másik eszközről"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79 #: podcasts-gtk/resources/gtk/episode_widget.ui:79
#| msgid "You are already subscribed to this show"
msgid "Youve already listened to this episode." msgid "Youve already listened to this episode."
msgstr "Már meghallgatta ezt az epizódot." msgstr "Már meghallgatta ezt az epizódot."
@ -155,7 +154,7 @@ msgid "_About Podcasts"
msgstr "A Podcastok _névjegye" msgstr "A Podcastok _névjegye"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Új csatorna hozzáadása" msgstr "Új csatorna hozzáadása"
@ -167,15 +166,11 @@ msgstr "Adja meg a hozzáadandó csatorna címét"
msgid "Add" msgid "Add"
msgstr "Hozzáadás" msgstr "Hozzáadás"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "Már feliratkozott erre a csatornára."
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Műsor címe" msgstr "Műsor címe"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Vissza" msgstr "Vissza"
@ -221,51 +216,55 @@ msgstr "Alkalmazáson belüli műveletértesítések"
msgid "Undo" msgid "Undo"
msgstr "Visszavonás" msgstr "Visszavonás"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Visszatekerés 10 másodperccel" msgstr "Most játssza"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Lejátszás"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Szünet"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Előretekerés 10 másodperccel"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Lejátszási sebesség módosítása" msgstr "Lejátszási sebesség módosítása"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "1,5-szeres sebesség" msgstr "1,5-szeres sebesség"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "1,25-szörös sebesség" msgstr "1,25-szörös sebesség"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Normál sebesség" msgstr "Normál sebesség"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Visszatekerés 10 másodperccel"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Lejátszás"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Szünet"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Előretekerés 10 másodperccel"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "Összes epizód meg_jelölése lejátszottként" msgstr "Összes epizód meg_jelölése lejátszottként"
@ -290,18 +289,14 @@ msgstr "Összes megjelölése lejátszottként"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Leiratkozás" msgstr "Leiratkozás"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Olvassa tovább"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Új epizódok lekérése" msgstr "Új epizódok lekérése"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "Már feliratkozott erre a műsorra"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "Érvénytelen URL"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Új" msgstr "Új"
@ -310,43 +305,43 @@ msgstr "Új"
msgid "Shows" msgid "Shows"
msgstr "Műsorok" msgstr "Műsorok"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Válasszon egy fájlt, amelyből műsorokat akar importálni." msgstr "Válasszon egy fájlt, amelyből műsorokat akar importálni."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Importálás" msgstr "_Importálás"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "OPML fájl" msgstr "OPML fájl"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Az importált fájl feldolgozása meghiúsult" msgstr "Az importált fájl feldolgozása meghiúsult"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "A kiválasztott fájlok nem érhetőek el." msgstr "A kiválasztott fájlok nem érhetőek el."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Műsorok exportálása ide…" msgstr "Műsorok exportálása ide…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Exportálás" msgstr "_Exportálás"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_Mégse" msgstr "_Mégse"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcastok feliratkozások" msgstr "GNOME Podcastok feliratkozások"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "A podcastok exportálása meghiúsult" msgstr "A podcastok exportálása meghiúsult"
@ -367,7 +362,7 @@ msgid "{} min"
msgstr "{} perc" msgstr "{} perc"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "A médialejátszó nem tudott végrehajtani egy műveletet." msgstr "A médialejátszó nem tudott végrehajtani egy műveletet."

View File

@ -1,21 +1,21 @@
# Indonesian translation for podcasts. # Indonesian translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER # Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2018, 2019. # Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2018-2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-06-15 10:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-07-11 15:21+0700\n" "PO-Revision-Date: 2020-02-13 19:33+0700\n"
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n" "Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n" "Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n" "Language: id\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.3\n" "X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -68,8 +68,8 @@ msgstr "Berapa lama waktu untuk menunggu di antara pembersihan otomatis"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcast" msgstr "Podcast"
@ -87,7 +87,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Aplikasi Podcast untuk GNOME" msgstr "Aplikasi Podcast untuk GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -154,7 +154,7 @@ msgid "_About Podcasts"
msgstr "Tent_ang Podcast" msgstr "Tent_ang Podcast"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:177 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Tambahkan feed baru" msgstr "Tambahkan feed baru"
@ -166,11 +166,11 @@ msgstr "Masukkan alamat feed untuk ditambahkan"
msgid "Add" msgid "Add"
msgstr "Tambah" msgstr "Tambah"
#: podcasts-gtk/resources/gtk/headerbar.ui:157 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title" msgid "Show Title"
msgstr "Tampilkan Judul" msgstr "Tampilkan Judul"
#: podcasts-gtk/resources/gtk/headerbar.ui:198 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Kembali" msgstr "Kembali"
@ -216,51 +216,55 @@ msgstr "Notifikasi aksi dalam aplikasi"
msgid "Undo" msgid "Undo"
msgstr "Tak Jadi" msgstr "Tak Jadi"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Putar mundur 10 detik" msgstr "Sedang Diputar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Putar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Jeda"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Maju cepat 10 detik"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Ubah kecepatan pemutaran" msgstr "Ubah kecepatan pemutaran"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "Ubah kecepatan pemutaran" msgstr "Ubah kecepatan pemutaran"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1.50×" msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "tingkat kecepatan 1.5" msgstr "tingkat kecepatan 1.5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1.25×" msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "tingkat kecepatan 1.25" msgstr "tingkat kecepatan 1.25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Kecepatan normal" msgstr "Kecepatan normal"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Putar mundur 10 detik"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Putar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Jeda"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Maju cepat 10 detik"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "Tandai Se_mua Episode sebagai Sudah Diputar" msgstr "Tandai Se_mua Episode sebagai Sudah Diputar"
@ -285,18 +289,14 @@ msgstr "Tandai Semua sebagai Sudah Diputar"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Berhenti Berlangganan" msgstr "Berhenti Berlangganan"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Baca Lebih Lanjut"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Mengambil episode baru" msgstr "Mengambil episode baru"
#: podcasts-gtk/src/headerbar.rs:127
msgid "You are already subscribed to this show"
msgstr "Anda sudah berlangganan ke acara ini"
#: podcasts-gtk/src/headerbar.rs:145
msgid "Invalid URL"
msgstr "URL tak valid"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Baru" msgstr "Baru"
@ -305,43 +305,43 @@ msgstr "Baru"
msgid "Shows" msgid "Shows"
msgstr "Acara" msgstr "Acara"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Pilih berkas dari mana Anda ingin mengimpor acara." msgstr "Pilih berkas dari mana Anda ingin mengimpor acara."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Impor" msgstr "_Impor"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "Berkas OPML" msgstr "Berkas OPML"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Gagal mengurai berkas yang diimpor" msgstr "Gagal mengurai berkas yang diimpor"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Berkas yang dipilih tidak dapat diakses." msgstr "Berkas yang dipilih tidak dapat diakses."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Ekspor acara ke…" msgstr "Ekspor acara ke…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Ekspor" msgstr "_Ekspor"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_Batal" msgstr "_Batal"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "Berlangganan GNOME Podcast" msgstr "Berlangganan GNOME Podcast"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Gagal mengekspor podcast" msgstr "Gagal mengekspor podcast"
@ -355,14 +355,14 @@ msgstr "Pelajari lebih lanjut tentang GNOME Podcast"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63 #: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits" msgid "translator-credits"
msgstr "Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2018, 2019." msgstr "Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2018-2020."
#: podcasts-gtk/src/widgets/episode.rs:148 #: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min" msgid "{} min"
msgstr "{} mnt" msgstr "{} mnt"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Pemutar media tidak dapat melakukan aksi." msgstr "Pemutar media tidak dapat melakukan aksi."
@ -374,6 +374,12 @@ msgstr "Tandai semua episode sebagai sudah didengarkan"
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Berhenti berlangganan dari {}" msgstr "Berhenti berlangganan dari {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Anda sudah berlangganan ke acara ini"
#~ msgid "Invalid URL"
#~ msgstr "URL tak valid"
#~ msgid "@icon@" #~ msgid "@icon@"
#~ msgstr "@icon@" #~ msgstr "@icon@"

View File

@ -1,14 +1,14 @@
# Italian translation for podcasts. # Italian translation for podcasts.
# Copyright (C) 2018, 2019 podcasts's Free Software Foundation, Inc. # Copyright (C) 2018, 2019, 2020 podcasts's Free Software Foundation, Inc.
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# Milo Casagrande <milo@milo.name>, 2018, 2019. # Milo Casagrande <milo@milo.name>, 2018, 2019, 2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-02-02 15:17+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-02-28 09:25+0100\n" "PO-Revision-Date: 2020-03-06 09:41+0100\n"
"Last-Translator: Milo Casagrande <milo@milo.name>\n" "Last-Translator: Milo Casagrande <milo@milo.name>\n"
"Language-Team: Italian <gnome-it-list@gnome.org>\n" "Language-Team: Italian <gnome-it-list@gnome.org>\n"
"Language: it\n" "Language: it\n"
@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.1\n" "X-Generator: Poedit 2.2.4\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -69,8 +69,8 @@ msgstr "Che periodi di tempo aspettare tra la pulizia automatica"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:124 podcasts-gtk/src/app.rs:455 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcast" msgstr "Podcast"
@ -79,11 +79,6 @@ msgstr "Podcast"
msgid "Listen to your favorite podcasts, right from your desktop." msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Ascoltare i propri podcast preferiti, direttamente proprio computer." msgstr "Ascoltare i propri podcast preferiti, direttamente proprio computer."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;" msgid "Podcast;RSS;"
@ -93,7 +88,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Applicazione per podcast per GNOME" msgstr "Applicazione per podcast per GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -117,19 +112,23 @@ msgstr "Aggiungi nuovi show via URL"
msgid "Import shows from another device" msgid "Import shows from another device"
msgstr "Importa show da un altro dispositivo" msgstr "Importa show da un altro dispositivo"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180 #: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Questo episodio è già stato ascoltato."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…" msgid "Calculating episode size…"
msgstr "Calcolo dimensione episodio…" msgstr "Calcolo dimensione episodio…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220 #: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode" msgid "Play this episode"
msgstr "Riproduci questo episodio" msgstr "Riproduci questo episodio"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241 #: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process" msgid "Cancel the download process"
msgstr "Annulla lo scaricamento" msgstr "Annulla lo scaricamento"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264 #: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode" msgid "Download this episode"
msgstr "Scarica questo episodio" msgstr "Scarica questo episodio"
@ -146,19 +145,15 @@ msgid "_Export Shows"
msgstr "_Esporta show" msgstr "_Esporta show"
#: podcasts-gtk/resources/gtk/hamburger.ui:22 #: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "Preferen_ze"
#: podcasts-gtk/resources/gtk/hamburger.ui:27
msgid "_Keyboard Shortcuts" msgid "_Keyboard Shortcuts"
msgstr "_Scorciatoie da tastiera" msgstr "_Scorciatoie da tastiera"
#: podcasts-gtk/resources/gtk/hamburger.ui:35 #: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts" msgid "_About Podcasts"
msgstr "I_nformazioni su Podcast" msgstr "I_nformazioni su Podcast"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Aggiungi nuovo feed" msgstr "Aggiungi nuovo feed"
@ -170,15 +165,11 @@ msgstr "Inserire un indirizzo da aggiungere"
msgid "Add" msgid "Add"
msgstr "Aggiungi" msgstr "Aggiungi"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "Si è già abbonati a questo feed."
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Titolo show" msgstr "Titolo show"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Indietro" msgstr "Indietro"
@ -193,11 +184,6 @@ msgstr "Controlla presenza nuovi episodi"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25 #: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window" msgctxt "shortcut window"
msgid "Preferences"
msgstr "Preferenze"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application" msgid "Quit the application"
msgstr "Esce dall'applicazione" msgstr "Esce dall'applicazione"
@ -229,71 +215,54 @@ msgstr "Una notifica"
msgid "Undo" msgid "Undo"
msgstr "Annulla" msgstr "Annulla"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Indietro 10 secondi" msgstr "In riproduzione"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Riproduci"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Avanti veloce 10 secondi"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Modifica la velocità di riproduzione" msgstr "Modifica la velocità di riproduzione"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "1,5 volte la velocità" msgstr "1,5 volte la velocità"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "1,25 volte la velocità" msgstr "1,25 volte la velocità"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Velocità normale" msgstr "Velocità normale"
#: podcasts-gtk/resources/gtk/prefs.ui:42 #: podcasts-gtk/resources/gtk/player_toolbar.ui:97
#: podcasts-gtk/resources/gtk/prefs.ui:295 msgid "Rewind 10 seconds"
msgid "Preferences" msgstr "Indietro 10 secondi"
msgstr "Preferenze"
#: podcasts-gtk/resources/gtk/prefs.ui:76 #: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Appearance" msgid "Play"
msgstr "Aspetto" msgstr "Riproduci"
#: podcasts-gtk/resources/gtk/prefs.ui:120 #: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Dark Theme" msgid "Pause"
msgstr "Tema scuro" msgstr "Pausa"
#: podcasts-gtk/resources/gtk/prefs.ui:166 #: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Delete played episodes" msgid "Fast forward 10 seconds"
msgstr "Eliminare episodi ascoltati" msgstr "Avanti veloce 10 secondi"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Dopo"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
@ -319,38 +288,14 @@ msgstr "Segna tutti ascoltati"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Annulla abbonamento" msgstr "Annulla abbonamento"
#: podcasts-gtk/src/app.rs:369 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Leggi altro"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Scaricamento nuovi episodi" msgstr "Scaricamento nuovi episodi"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "Si è già abbonati a questo show"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "URL non valido"
#: podcasts-gtk/src/prefs.rs:78
msgid "Seconds"
msgstr "Secondi"
#: podcasts-gtk/src/prefs.rs:79
msgid "Minutes"
msgstr "Minuti"
#: podcasts-gtk/src/prefs.rs:80
msgid "Hours"
msgstr "Ore"
#: podcasts-gtk/src/prefs.rs:81
msgid "Days"
msgstr "Giorni"
#: podcasts-gtk/src/prefs.rs:82
msgid "Weeks"
msgstr "Settimane"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Nuovo" msgstr "Nuovo"
@ -359,43 +304,43 @@ msgstr "Nuovo"
msgid "Shows" msgid "Shows"
msgstr "Show" msgstr "Show"
#: podcasts-gtk/src/utils.rs:377 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Selezionare il file da cui importare gli show." msgstr "Selezionare il file da cui importare gli show."
#: podcasts-gtk/src/utils.rs:380 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Importa" msgstr "_Importa"
#: podcasts-gtk/src/utils.rs:389 podcasts-gtk/src/utils.rs:435 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "File OPML" msgstr "File OPML"
#: podcasts-gtk/src/utils.rs:406 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Analisi del file importato non riuscita" msgstr "Analisi del file importato non riuscita"
#: podcasts-gtk/src/utils.rs:411 podcasts-gtk/src/utils.rs:453 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Impossibile accedere al file selezionato." msgstr "Impossibile accedere al file selezionato."
#: podcasts-gtk/src/utils.rs:423 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Esporta show su…" msgstr "Esporta show su…"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Esporta" msgstr "_Esporta"
#: podcasts-gtk/src/utils.rs:427 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "A_nnulla" msgstr "A_nnulla"
#: podcasts-gtk/src/utils.rs:447 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "Abbonamenti Podcast GNOME" msgstr "Abbonamenti Podcast GNOME"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Esportazioni podcast non riuscita" msgstr "Esportazioni podcast non riuscita"
@ -411,22 +356,19 @@ msgstr "Maggiori informazioni su Podcast GNOME"
msgid "translator-credits" msgid "translator-credits"
msgstr "Milo Casagrande <milo@milo.name>" msgstr "Milo Casagrande <milo@milo.name>"
#: podcasts-gtk/src/widgets/episode.rs:149 #: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min" msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:536 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Il riproduttore multimediale non può eseguire un'azione." msgstr "Il riproduttore multimediale non può eseguire un'azione."
#: podcasts-gtk/src/widgets/show_menu.rs:169 #: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened" msgid "Marked all episodes as listened"
msgstr "Episodi segnati come letti" msgstr "Episodi segnati come letti"
#: podcasts-gtk/src/widgets/show_menu.rs:174 #: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Abbonamento a {} annullato" msgstr "Abbonamento a {} annullato"
#~ msgid "_About"
#~ msgstr "I_nformazioni"

View File

@ -1,14 +1,14 @@
# Dutch translation for podcasts. # Dutch translation for podcasts.
# Copyright (C) 2019 podcasts's COPYRIGHT HOLDER # Copyright (C) 2019 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# Nathan Follens <nthn@unseen.is>, 2019. # Nathan Follens <nthn@unseen.is>, 2019-2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-02-02 15:17+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-02-26 12:47+0100\n" "PO-Revision-Date: 2020-02-26 14:31+0100\n"
"Last-Translator: Nathan Follens <nthn@unseen.is>\n" "Last-Translator: Nathan Follens <nthn@unseen.is>\n"
"Language-Team: Dutch <gnome-nl-list@gnome.org>\n" "Language-Team: Dutch <gnome-nl-list@gnome.org>\n"
"Language: nl\n" "Language: nl\n"
@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.1\n" "X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -69,8 +69,8 @@ msgstr "Hoe lang te wachten tussen automatische opruimbeurten"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:124 podcasts-gtk/src/app.rs:455 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasts" msgstr "Podcasts"
@ -79,11 +79,6 @@ msgstr "Podcasts"
msgid "Listen to your favorite podcasts, right from your desktop." msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Luister naar uw favoriete podcasts, rechtstreeks vanop uw bureaublad." msgstr "Luister naar uw favoriete podcasts, rechtstreeks vanop uw bureaublad."
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;" msgid "Podcast;RSS;"
@ -93,7 +88,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Podcast-toepassing voor Gnome" msgstr "Podcast-toepassing voor Gnome"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -117,19 +112,23 @@ msgstr "Nieuwe shows toevoegen via feed-URL"
msgid "Import shows from another device" msgid "Import shows from another device"
msgstr "Shows importeren van een ander apparaat" msgstr "Shows importeren van een ander apparaat"
#: podcasts-gtk/resources/gtk/episode_widget.ui:180 #: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "U heeft deze aflevering reeds beluisterd."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…" msgid "Calculating episode size…"
msgstr "Grootte van aflevering berekenen…" msgstr "Grootte van aflevering berekenen…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:220 #: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode" msgid "Play this episode"
msgstr "Deze aflevering afspelen" msgstr "Deze aflevering afspelen"
#: podcasts-gtk/resources/gtk/episode_widget.ui:241 #: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process" msgid "Cancel the download process"
msgstr "Downloadproces annuleren" msgstr "Downloadproces annuleren"
#: podcasts-gtk/resources/gtk/episode_widget.ui:264 #: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode" msgid "Download this episode"
msgstr "Deze aflevering downloaden" msgstr "Deze aflevering downloaden"
@ -146,19 +145,15 @@ msgid "_Export Shows"
msgstr "Shows _exporteren" msgstr "Shows _exporteren"
#: podcasts-gtk/resources/gtk/hamburger.ui:22 #: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "_Voorkeuren"
#: podcasts-gtk/resources/gtk/hamburger.ui:27
msgid "_Keyboard Shortcuts" msgid "_Keyboard Shortcuts"
msgstr "_Sneltoetsen" msgstr "_Sneltoetsen"
#: podcasts-gtk/resources/gtk/hamburger.ui:35 #: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts" msgid "_About Podcasts"
msgstr "_Over Podcasts" msgstr "_Over Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Nieuwe feed toevoegen" msgstr "Nieuwe feed toevoegen"
@ -170,15 +165,11 @@ msgstr "Voer het toe te voegen feedadres in"
msgid "Add" msgid "Add"
msgstr "Toevoegen" msgstr "Toevoegen"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "U bent reeds geabonneerd op die feed!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Titel tonen" msgstr "Titel tonen"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Terug" msgstr "Terug"
@ -193,11 +184,6 @@ msgstr "Controleren op nieuwe afleveringen"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25 #: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window" msgctxt "shortcut window"
msgid "Preferences"
msgstr "Voorkeuren"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application" msgid "Quit the application"
msgstr "De toepassing afsluiten" msgstr "De toepassing afsluiten"
@ -229,71 +215,54 @@ msgstr "Een in-app-actiemelding"
msgid "Undo" msgid "Undo"
msgstr "Ongedaan maken" msgstr "Ongedaan maken"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "10 seconden terugspoelen" msgstr "U luistert naar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Afspelen"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pauzeren"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "10 seconden doorspoelen"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "De afspeelsnelheid wijzigen" msgstr "De afspeelsnelheid wijzigen"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "1,5 snelheid" msgstr "1,5 snelheid"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "1,25 snelheid" msgstr "1,25 snelheid"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Normale snelheid" msgstr "Normale snelheid"
#: podcasts-gtk/resources/gtk/prefs.ui:42 #: podcasts-gtk/resources/gtk/player_toolbar.ui:97
#: podcasts-gtk/resources/gtk/prefs.ui:295 msgid "Rewind 10 seconds"
msgid "Preferences" msgstr "10 seconden terugspoelen"
msgstr "Voorkeuren"
#: podcasts-gtk/resources/gtk/prefs.ui:76 #: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Appearance" msgid "Play"
msgstr "Uiterlijk" msgstr "Afspelen"
#: podcasts-gtk/resources/gtk/prefs.ui:120 #: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Dark Theme" msgid "Pause"
msgstr "Donker thema" msgstr "Pauzeren"
#: podcasts-gtk/resources/gtk/prefs.ui:166 #: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Delete played episodes" msgid "Fast forward 10 seconds"
msgstr "Afgespeelde afleveringen verwijderen" msgstr "10 seconden doorspoelen"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "Na"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
@ -319,38 +288,14 @@ msgstr "Alles markeren als afgespeeld"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Opzeggen" msgstr "Opzeggen"
#: podcasts-gtk/src/app.rs:369 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Lees meer"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Nieuwe afleveringen worden opgehaald" msgstr "Nieuwe afleveringen worden opgehaald"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "U bent reeds geabonneerd op deze show"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "Ongeldige URL"
#: podcasts-gtk/src/prefs.rs:78
msgid "Seconds"
msgstr "Seconden"
#: podcasts-gtk/src/prefs.rs:79
msgid "Minutes"
msgstr "Minuten"
#: podcasts-gtk/src/prefs.rs:80
msgid "Hours"
msgstr "Uur"
#: podcasts-gtk/src/prefs.rs:81
msgid "Days"
msgstr "Dagen"
#: podcasts-gtk/src/prefs.rs:82
msgid "Weeks"
msgstr "Weken"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Nieuw" msgstr "Nieuw"
@ -359,43 +304,43 @@ msgstr "Nieuw"
msgid "Shows" msgid "Shows"
msgstr "Shows" msgstr "Shows"
#: podcasts-gtk/src/utils.rs:377 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Selecteer het bestand waaruit u shows wilt importeren." msgstr "Selecteer het bestand waaruit u shows wilt importeren."
#: podcasts-gtk/src/utils.rs:380 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Importeren" msgstr "_Importeren"
#: podcasts-gtk/src/utils.rs:389 podcasts-gtk/src/utils.rs:435 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "OPML-bestand" msgstr "OPML-bestand"
#: podcasts-gtk/src/utils.rs:406 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Verwerken van geïmporteerd bestand mislukt" msgstr "Verwerken van geïmporteerd bestand mislukt"
#: podcasts-gtk/src/utils.rs:411 podcasts-gtk/src/utils.rs:453 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Kon geen toegang verkrijgen tot geselecteerd bestand." msgstr "Kon geen toegang verkrijgen tot geselecteerd bestand."
#: podcasts-gtk/src/utils.rs:423 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Shows exporteren naar…" msgstr "Shows exporteren naar…"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Exporteren" msgstr "_Exporteren"
#: podcasts-gtk/src/utils.rs:427 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_Annuleren" msgstr "_Annuleren"
#: podcasts-gtk/src/utils.rs:447 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "Gnome Podcasts-abonnementen" msgstr "Gnome Podcasts-abonnementen"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Exporteren van podcasts mislukt" msgstr "Exporteren van podcasts mislukt"
@ -414,19 +359,65 @@ msgstr ""
"\n" "\n"
"Meer info over Gnome-NL http://nl.gnome.org/" "Meer info over Gnome-NL http://nl.gnome.org/"
#: podcasts-gtk/src/widgets/episode.rs:149 #: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min" msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:536 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "De mediaspeler kon een handeling niet uitvoeren." msgstr "De mediaspeler kon een handeling niet uitvoeren."
#: podcasts-gtk/src/widgets/show_menu.rs:169 #: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Marked all episodes as listened" msgid "Marked all episodes as listened"
msgstr "Alle afleveringen markeren als beluisterd" msgstr "Alle afleveringen markeren als beluisterd"
#: podcasts-gtk/src/widgets/show_menu.rs:174 #: podcasts-gtk/src/widgets/show_menu.rs:184
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Abonnement op {} opgezegd" msgstr "Abonnement op {} opgezegd"
#~ msgid "@icon@"
#~ msgstr "@icon@"
#~ msgid "_Preferences"
#~ msgstr "_Voorkeuren"
#~ msgid "You are already subscribed to that feed!"
#~ msgstr "U bent reeds geabonneerd op die feed!"
#~ msgctxt "shortcut window"
#~ msgid "Preferences"
#~ msgstr "Voorkeuren"
#~ msgid "Preferences"
#~ msgstr "Voorkeuren"
#~ msgid "Appearance"
#~ msgstr "Uiterlijk"
#~ msgid "Dark Theme"
#~ msgstr "Donker thema"
#~ msgid "Delete played episodes"
#~ msgstr "Afgespeelde afleveringen verwijderen"
#~ msgid "After"
#~ msgstr "Na"
#~ msgid "Invalid URL"
#~ msgstr "Ongeldige URL"
#~ msgid "Seconds"
#~ msgstr "Seconden"
#~ msgid "Minutes"
#~ msgstr "Minuten"
#~ msgid "Hours"
#~ msgstr "Uur"
#~ msgid "Days"
#~ msgstr "Dagen"
#~ msgid "Weeks"
#~ msgstr "Weken"

View File

@ -1,15 +1,15 @@
# Polish translation for podcasts. # Polish translation for podcasts.
# Copyright © 2018-2019 the podcasts authors. # Copyright © 2018-2020 the podcasts authors.
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# Piotr Drąg <piotrdrag@gmail.com>, 2018-2019. # Piotr Drąg <piotrdrag@gmail.com>, 2018-2020.
# Aviary.pl <community-poland@mozilla.org>, 2018-2019. # Aviary.pl <community-poland@mozilla.org>, 2018-2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts\n" "Project-Id-Version: podcasts\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-05-18 12:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-05-19 12:37+0200\n" "PO-Revision-Date: 2020-02-09 12:19+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <community-poland@mozilla.org>\n" "Language-Team: Polish <community-poland@mozilla.org>\n"
"Language: pl\n" "Language: pl\n"
@ -70,8 +70,8 @@ msgstr "Jaki okres czekać między automatycznym czyszczeniem"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasty" msgstr "Podcasty"
@ -89,7 +89,7 @@ msgstr "Podcast;Podkasty;RSS;Atom;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Aplikacja do słuchania podcastów w GNOME" msgstr "Aplikacja do słuchania podcastów w GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -154,7 +154,7 @@ msgid "_About Podcasts"
msgstr "_O programie" msgstr "_O programie"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Dodaje nowy kanał" msgstr "Dodaje nowy kanał"
@ -166,15 +166,11 @@ msgstr "Adres kanału do dodania"
msgid "Add" msgid "Add"
msgstr "Dodaj" msgstr "Dodaj"
#: podcasts-gtk/resources/gtk/headerbar.ui:133 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "You are already subscribed to that feed!"
msgstr "Ten kanał jest już subskrybowany."
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title" msgid "Show Title"
msgstr "Tytuł programu" msgstr "Tytuł programu"
#: podcasts-gtk/resources/gtk/headerbar.ui:210 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Wstecz" msgstr "Wstecz"
@ -220,51 +216,55 @@ msgstr "Powiadomienie z działaniem w programie"
msgid "Undo" msgid "Undo"
msgstr "Cofnij" msgstr "Cofnij"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Przewija wstecz o 10 sekund" msgstr "Odtwarzanie"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Odtwarza"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Wstrzymuje"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Przewija wprzód o 10 sekund"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Zmienia prędkość odtwarzania" msgstr "Zmienia prędkość odtwarzania"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "Prędkość 1,5" msgstr "Prędkość 1,5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "Prędkość 1,25" msgstr "Prędkość 1,25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Zwykła prędkość" msgstr "Zwykła prędkość"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Przewija wstecz o 10 sekund"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Odtwarza"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Wstrzymuje"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Przewija wprzód o 10 sekund"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "_Oznacz wszystkie odcinki jako odtworzone" msgstr "_Oznacz wszystkie odcinki jako odtworzone"
@ -289,18 +289,14 @@ msgstr "Oznacz wszystkie jako odtworzone"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Zrezygnuj z subskrypcji" msgstr "Zrezygnuj z subskrypcji"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Czytaj dalej"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Pobieranie nowych odcinków" msgstr "Pobieranie nowych odcinków"
#: podcasts-gtk/src/headerbar.rs:117
msgid "You are already subscribed to this show"
msgstr "Ten program jest już subskrybowany"
#: podcasts-gtk/src/headerbar.rs:125
msgid "Invalid URL"
msgstr "Nieprawidłowy adres"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Nowe" msgstr "Nowe"
@ -309,43 +305,43 @@ msgstr "Nowe"
msgid "Shows" msgid "Shows"
msgstr "Programy" msgstr "Programy"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Proszę wybrać plik, z którego zaimportować programy." msgstr "Proszę wybrać plik, z którego zaimportować programy."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "Zai_mportuj" msgstr "Zai_mportuj"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "Plik OPML" msgstr "Plik OPML"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Przetworzenie zaimportowanego pliku się nie powiodło" msgstr "Przetworzenie zaimportowanego pliku się nie powiodło"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Nie można uzyskać dostępu do wybranego pliku." msgstr "Nie można uzyskać dostępu do wybranego pliku."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Eksport programów do…" msgstr "Eksport programów do…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "Wy_eksportuj" msgstr "Wy_eksportuj"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_Anuluj" msgstr "_Anuluj"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "Subskrypcje Podcastów GNOME" msgstr "Subskrypcje Podcastów GNOME"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Wyeksportowanie podcastów się nie powiodło" msgstr "Wyeksportowanie podcastów się nie powiodło"
@ -360,15 +356,15 @@ msgstr "Więcej informacji o Podcastach GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63 #: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr ""
"Piotr Drąg <piotrdrag@gmail.com>, 2018-2019\n" "Piotr Drąg <piotrdrag@gmail.com>, 2018-2020\n"
"Aviary.pl <community-poland@mozilla.org>, 2018-2019" "Aviary.pl <community-poland@mozilla.org>, 2018-2020"
#: podcasts-gtk/src/widgets/episode.rs:148 #: podcasts-gtk/src/widgets/episode.rs:148
msgid "{} min" msgid "{} min"
msgstr "{}min" msgstr "{}min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Odtwarzacz multimediów nie może wykonać działania." msgstr "Odtwarzacz multimediów nie może wykonać działania."

View File

@ -1,23 +1,23 @@
# Brazilian Portuguese translation for podcasts. # Brazilian Portuguese translation for podcasts.
# Copyright (C) 2019 podcasts's COPYRIGHT HOLDER # Copyright (C) 2020 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# Yuri Otávio Lopes Gomes <yuriotavio@hotmail.com>, 2018. # Yuri Otávio Lopes Gomes <yuriotavio@hotmail.com>, 2018, 2020.
# Rafael Fontenelle <rafaelff@gnome.org>, 2018-2019. # Rafael Fontenelle <rafaelff@gnome.org>, 2018-2019.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-06-09 02:38+0000\n" "POT-Creation-Date: 2020-02-07 19:22+0000\n"
"PO-Revision-Date: 2019-06-13 15:32-0300\n" "PO-Revision-Date: 2020-02-07 15:18-0300\n"
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n" "Last-Translator: Yuri Otávio Lopes Gomes <yuriotavio@hotmail.com>\n"
"Language-Team: Portuguese - Brazil <gnome-pt_br-list@gnome.org>\n" "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n" "Language: pt_BR\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.2.3\n" "X-Generator: Poedit 2.3\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -71,8 +71,8 @@ msgstr "Qual período de tempo deve esperar entre limpezas automáticas"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:329
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcasts" msgstr "Podcasts"
@ -90,7 +90,7 @@ msgstr "Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Aplicativo de podcast para o GNOME" msgstr "Aplicativo de podcast para o GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -157,7 +157,7 @@ msgid "_About Podcasts"
msgstr "_Sobre Podcasts" msgstr "_Sobre Podcasts"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:177 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Adiciona um novo feed" msgstr "Adiciona um novo feed"
@ -169,11 +169,11 @@ msgstr "Insira o endereço do feed para adicioná-lo"
msgid "Add" msgid "Add"
msgstr "Adicionar" msgstr "Adicionar"
#: podcasts-gtk/resources/gtk/headerbar.ui:157 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title" msgid "Show Title"
msgstr "Mostrar título" msgstr "Mostrar título"
#: podcasts-gtk/resources/gtk/headerbar.ui:198 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Voltar" msgstr "Voltar"
@ -219,51 +219,55 @@ msgstr "Uma notificação de ação no aplicativo"
msgid "Undo" msgid "Undo"
msgstr "Desfazer" msgstr "Desfazer"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Retroceder 10 segundos" msgstr "Reproduzindo agora"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Reproduz"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Adianta 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Altera a velocidade de reprodução" msgstr "Altera a velocidade de reprodução"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "Taxa de velocidade de 1,5" msgstr "Taxa de velocidade de 1,5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "Taxa de velocidade de 1,25" msgstr "Taxa de velocidade de 1,25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Velocidade normal" msgstr "Velocidade normal"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Retroceder 10 segundos"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Reproduz"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Adianta 10 segundos"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "_Marcar todos os episódios como reproduzidos" msgstr "_Marcar todos os episódios como reproduzidos"
@ -288,18 +292,14 @@ msgstr "Marcar todos como reproduzidos"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Desinscrever" msgstr "Desinscrever"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Leia mais"
#: podcasts-gtk/src/app.rs:264
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Buscando novos episódios" msgstr "Buscando novos episódios"
#: podcasts-gtk/src/headerbar.rs:120
msgid "You are already subscribed to this show"
msgstr "Você já está inscrito neste podcast"
#: podcasts-gtk/src/headerbar.rs:135
msgid "Invalid URL"
msgstr "URL inválida"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Novo" msgstr "Novo"
@ -308,43 +308,43 @@ msgstr "Novo"
msgid "Shows" msgid "Shows"
msgstr "Podcasts" msgstr "Podcasts"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Selecione o arquivo a partir do qual você deseja importar podcasts." msgstr "Selecione o arquivo a partir do qual você deseja importar podcasts."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Importar" msgstr "_Importar"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:455
msgid "OPML file" msgid "OPML file"
msgstr "Arquivo OPML" msgstr "Arquivo OPML"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Falha ao analisar o arquivo importado" msgstr "Falha ao analisar o arquivo importado"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:473
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "O arquivo selecionado não pôde ser acessado." msgstr "O arquivo selecionado não pôde ser acessado."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:443
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Exportar podcasts para…" msgstr "Exportar podcasts para…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:446
msgid "_Export" msgid "_Export"
msgstr "_Exportar" msgstr "_Exportar"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:447
msgid "_Cancel" msgid "_Cancel"
msgstr "_Cancelar" msgstr "_Cancelar"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:467
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "Inscrições do GNOME Podcasts" msgstr "Inscrições do GNOME Podcasts"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:468
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Falha ao exportar podcasts" msgstr "Falha ao exportar podcasts"
@ -367,7 +367,7 @@ msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:822
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "O reprodutor de mídia não conseguiu executar uma ação." msgstr "O reprodutor de mídia não conseguiu executar uma ação."
@ -379,6 +379,12 @@ msgstr "Marcados todos os episódios como ouvidos"
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Desinscrito de {}" msgstr "Desinscrito de {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Você já está inscrito neste podcast"
#~ msgid "Invalid URL"
#~ msgstr "URL inválida"
#~ msgid "@icon@" #~ msgid "@icon@"
#~ msgstr "@icon@" #~ msgstr "@icon@"

View File

@ -1,14 +1,14 @@
# Swedish translation for podcasts. # Swedish translation for podcasts.
# Copyright © 2018, 2019 podcasts's COPYRIGHT HOLDER # Copyright © 2018-2020 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2018, 2019. # Anders Jonsson <anders.jonsson@norsjovallen.se>, 2018, 2019, 2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-06-15 10:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-08-22 17:54+0200\n" "PO-Revision-Date: 2020-02-13 22:38+0100\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n" "Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n" "Language: sv\n"
@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.3\n" "X-Generator: Poedit 2.2.4\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15 #: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window" msgid "Top position of the last open main window"
@ -69,8 +69,8 @@ msgstr "Vilken sorts tidsperiod att vänta mellan automatiska upprensningar"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Poddsändningar" msgstr "Poddsändningar"
@ -88,7 +88,7 @@ msgstr "Poddsändning;Podcast;RSS;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "Poddsändningsprogram för GNOME" msgstr "Poddsändningsprogram för GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -153,7 +153,7 @@ msgid "_About Podcasts"
msgstr "_Om Poddsändningar" msgstr "_Om Poddsändningar"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:177 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Lägg till ett nytt flöde" msgstr "Lägg till ett nytt flöde"
@ -165,11 +165,11 @@ msgstr "Ange flödesadress att lägga till"
msgid "Add" msgid "Add"
msgstr "Lägg till" msgstr "Lägg till"
#: podcasts-gtk/resources/gtk/headerbar.ui:157 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title" msgid "Show Title"
msgstr "Visa titel" msgstr "Visa titel"
#: podcasts-gtk/resources/gtk/headerbar.ui:198 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Bakåt" msgstr "Bakåt"
@ -215,51 +215,55 @@ msgstr "En åtgärdsavisering i programmet"
msgid "Undo" msgid "Undo"
msgstr "Ångra" msgstr "Ångra"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "Spola tillbaka 10 sekunder" msgstr "Spelar nu"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Spela"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "Spola framåt 10 sekunder"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Ändra uppspelningshastigheten" msgstr "Ändra uppspelningshastigheten"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1,00×" msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1,50×" msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "Hastighetsfaktor 1,5" msgstr "Hastighetsfaktor 1,5"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1,25×" msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "Hastighetsfaktor 1,25" msgstr "Hastighetsfaktor 1,25"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Normal hastighet" msgstr "Normal hastighet"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "Spola tillbaka 10 sekunder"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Spela"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Pausa"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "Spola framåt 10 sekunder"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "_Markera alla avsnitt som spelade" msgstr "_Markera alla avsnitt som spelade"
@ -284,18 +288,14 @@ msgstr "Markera alla som spelade"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Säg upp prenumeration" msgstr "Säg upp prenumeration"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Läs mer"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Hämtar nya avsnitt" msgstr "Hämtar nya avsnitt"
#: podcasts-gtk/src/headerbar.rs:127
msgid "You are already subscribed to this show"
msgstr "Du prenumererar redan på denna show"
#: podcasts-gtk/src/headerbar.rs:145
msgid "Invalid URL"
msgstr "Ogiltig URL"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Nytt" msgstr "Nytt"
@ -304,43 +304,43 @@ msgstr "Nytt"
msgid "Shows" msgid "Shows"
msgstr "Shower" msgstr "Shower"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Välj filen från vilken du vill importera shower." msgstr "Välj filen från vilken du vill importera shower."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_Importera" msgstr "_Importera"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "OPML-fil" msgstr "OPML-fil"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "Misslyckades med att tolka den importerade filen" msgstr "Misslyckades med att tolka den importerade filen"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Den markerade filen kunde inte kommas åt." msgstr "Den markerade filen kunde inte kommas åt."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Exportera shower till…" msgstr "Exportera shower till…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Exportera" msgstr "_Exportera"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "A_vbryt" msgstr "A_vbryt"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Poddsändningar-prenumerationer" msgstr "GNOME Poddsändningar-prenumerationer"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Misslyckades med att exportera poddsändningar" msgstr "Misslyckades med att exportera poddsändningar"
@ -365,7 +365,7 @@ msgid "{} min"
msgstr "{} min" msgstr "{} min"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Mediaspelaren kunde inte utföra en åtgärd." msgstr "Mediaspelaren kunde inte utföra en åtgärd."
@ -377,6 +377,12 @@ msgstr "Markerade alla avsnitt som lyssnade"
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "Sade upp prenumeration från {}" msgstr "Sade upp prenumeration från {}"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Du prenumererar redan på denna show"
#~ msgid "Invalid URL"
#~ msgstr "Ogiltig URL"
#~ msgid "@icon@" #~ msgid "@icon@"
#~ msgstr "@icon@" #~ msgstr "@icon@"

View File

@ -2,16 +2,16 @@
# Copyright (C) 2018-2019 podcasts's COPYRIGHT HOLDER # Copyright (C) 2018-2019 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package. # This file is distributed under the same license as the podcasts package.
# #
# Emin Tufan Çetin <etcetin@gmail.com>, 2018-2019. # Emin Tufan Çetin <etcetin@gmail.com>, 2018-2020.
# Sabri Ünal <libreajans@gmail.com>, 2019. # Sabri Ünal <libreajans@gmail.com>, 2019.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: podcasts master\n" "Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2019-06-15 10:55+0000\n" "POT-Creation-Date: 2020-02-07 11:33+0000\n"
"PO-Revision-Date: 2019-09-04 15:16+0300\n" "PO-Revision-Date: 2020-02-19 10:52+0300\n"
"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n" "Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Türkçe <gnome-turk@gnome.org>\n" "Language-Team: Türkçe <gnome-turk@gnome.org>\n"
"Language: tr\n" "Language: tr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -71,8 +71,8 @@ msgstr "Kendiliğinden temizlemeler arasında beklenecek zaman aralığı"
#. Weird magic I copy-pasted that sets the Application Name in the Shell. #. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3 #: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:109 podcasts-gtk/src/app.rs:433 #: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:330
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 #: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:80
msgid "Podcasts" msgid "Podcasts"
msgstr "Podcastler" msgstr "Podcastler"
@ -90,7 +90,7 @@ msgstr "Podcast;RSS;Pod Yayını;"
msgid "Podcast app for GNOME" msgid "Podcast app for GNOME"
msgstr "GNOME için Podcast uygulaması" msgstr "GNOME için Podcast uygulaması"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:77 #: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis" msgid "Jordan Petridis"
msgstr "Jordan Petridis" msgstr "Jordan Petridis"
@ -155,7 +155,7 @@ msgid "_About Podcasts"
msgstr "Podcastler _Hakkında" msgstr "Podcastler _Hakkında"
#: podcasts-gtk/resources/gtk/headerbar.ui:35 #: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:177 #: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed" msgid "Add a new feed"
msgstr "Yeni besleme ekle" msgstr "Yeni besleme ekle"
@ -167,11 +167,11 @@ msgstr "Eklenecek besleme adresini gir"
msgid "Add" msgid "Add"
msgstr "Ekle" msgstr "Ekle"
#: podcasts-gtk/resources/gtk/headerbar.ui:157 #: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title" msgid "Show Title"
msgstr "Gösteri Başlığı" msgstr "Gösteri Başlığı"
#: podcasts-gtk/resources/gtk/headerbar.ui:198 #: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back" msgid "Back"
msgstr "Geri" msgstr "Geri"
@ -217,51 +217,55 @@ msgstr "Uygulama içi eylem bildirimi"
msgid "Undo" msgid "Undo"
msgstr "Geri al" msgstr "Geri al"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72 #: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Rewind 10 seconds" msgid "Now Playing"
msgstr "10 saniye geri sar" msgstr "Şimdi Oynatılıyor"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87 #: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Play"
msgstr "Oynat"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "Duraklat"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "10 saniye ileri sar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed" msgid "Change the playback speed"
msgstr "Kayıttan yürütme hızını değiştir" msgstr "Kayıttan yürütme hızını değiştir"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300 #: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380 #: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×" msgid "1.00×"
msgstr "1.00×" msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344 #: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×" msgid "1.50×"
msgstr "1.50×" msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348 #: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate" msgid "1.5 speed rate"
msgstr "1.5 hız oranı" msgstr "1.5 hız oranı"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362 #: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×" msgid "1.25×"
msgstr "1.25×" msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366 #: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate" msgid "1.25 speed rate"
msgstr "1.25 hız oranı" msgstr "1.25 hız oranı"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384 #: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed" msgid "Normal speed"
msgstr "Olağan hız" msgstr "Olağan hız"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "10 saniye geri sar"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Oynat"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Duraklat"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "10 saniye ileri sar"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7 #: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played" msgid "_Mark All Episodes as Played"
msgstr "Tüm Bölümleri Oynatıldı Olarak _İmle" msgstr "Tüm Bölümleri Oynatıldı Olarak _İmle"
@ -286,18 +290,14 @@ msgstr "Tümünü Oynatıldı Olarak İmle"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "Abonelikten Çık" msgstr "Abonelikten Çık"
#: podcasts-gtk/src/app.rs:351 #: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Daha Çoğunu Oku"
#: podcasts-gtk/src/app.rs:265
msgid "Fetching new episodes" msgid "Fetching new episodes"
msgstr "Yeni bölümler alınıyor" msgstr "Yeni bölümler alınıyor"
#: podcasts-gtk/src/headerbar.rs:127
msgid "You are already subscribed to this show"
msgstr "Bu gösteriye zaten abonesiniz"
#: podcasts-gtk/src/headerbar.rs:145
msgid "Invalid URL"
msgstr "Geçersiz URL"
#: podcasts-gtk/src/stacks/content.rs:54 #: podcasts-gtk/src/stacks/content.rs:54
msgid "New" msgid "New"
msgstr "Yeni" msgstr "Yeni"
@ -306,43 +306,43 @@ msgstr "Yeni"
msgid "Shows" msgid "Shows"
msgstr "Gösteriler" msgstr "Gösteriler"
#: podcasts-gtk/src/utils.rs:397 #: podcasts-gtk/src/utils.rs:396
msgid "Select the file from which to you want to import shows." msgid "Select the file from which to you want to import shows."
msgstr "Gösterileri içe aktarmak istediğiniz dosyayı seçin." msgstr "Gösterileri içe aktarmak istediğiniz dosyayı seçin."
#: podcasts-gtk/src/utils.rs:400 #: podcasts-gtk/src/utils.rs:399
msgid "_Import" msgid "_Import"
msgstr "_İçe Aktar" msgstr "_İçe Aktar"
#: podcasts-gtk/src/utils.rs:409 podcasts-gtk/src/utils.rs:457 #: podcasts-gtk/src/utils.rs:408 podcasts-gtk/src/utils.rs:456
msgid "OPML file" msgid "OPML file"
msgstr "OPML dosyası" msgstr "OPML dosyası"
#: podcasts-gtk/src/utils.rs:426 #: podcasts-gtk/src/utils.rs:425
msgid "Failed to parse the imported file" msgid "Failed to parse the imported file"
msgstr "İçe aktarılan dosya ayrıştırılamadı" msgstr "İçe aktarılan dosya ayrıştırılamadı"
#: podcasts-gtk/src/utils.rs:431 podcasts-gtk/src/utils.rs:475 #: podcasts-gtk/src/utils.rs:430 podcasts-gtk/src/utils.rs:474
msgid "Selected file could not be accessed." msgid "Selected file could not be accessed."
msgstr "Seçilen dosyaya erişilemedi." msgstr "Seçilen dosyaya erişilemedi."
#: podcasts-gtk/src/utils.rs:445 #: podcasts-gtk/src/utils.rs:444
msgid "Export shows to…" msgid "Export shows to…"
msgstr "Gösterileri dışa aktar…" msgstr "Gösterileri dışa aktar…"
#: podcasts-gtk/src/utils.rs:448 #: podcasts-gtk/src/utils.rs:447
msgid "_Export" msgid "_Export"
msgstr "_Dışa Aktar" msgstr "_Dışa Aktar"
#: podcasts-gtk/src/utils.rs:449 #: podcasts-gtk/src/utils.rs:448
msgid "_Cancel" msgid "_Cancel"
msgstr "_İptal" msgstr "_İptal"
#: podcasts-gtk/src/utils.rs:469 #: podcasts-gtk/src/utils.rs:468
msgid "GNOME Podcasts Subscriptions" msgid "GNOME Podcasts Subscriptions"
msgstr "GNOME Podcastler Abonelikleri" msgstr "GNOME Podcastler Abonelikleri"
#: podcasts-gtk/src/utils.rs:470 #: podcasts-gtk/src/utils.rs:469
msgid "Failed to export podcasts" msgid "Failed to export podcasts"
msgstr "Podcastler dışa aktarılamadı" msgstr "Podcastler dışa aktarılamadı"
@ -365,7 +365,7 @@ msgid "{} min"
msgstr "{} dak" msgstr "{} dak"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); #. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:534 #: podcasts-gtk/src/widgets/player.rs:824
msgid "The media player was unable to execute an action." msgid "The media player was unable to execute an action."
msgstr "Ortam oynatıcı eylemi yürütemiyor." msgstr "Ortam oynatıcı eylemi yürütemiyor."
@ -377,6 +377,12 @@ msgstr "Tüm bölümler dinlendi olarak imlendi"
msgid "Unsubscribed from {}" msgid "Unsubscribed from {}"
msgstr "{} aboneliğinden çıkıldı" msgstr "{} aboneliğinden çıkıldı"
#~ msgid "You are already subscribed to this show"
#~ msgstr "Bu gösteriye zaten abonesiniz"
#~ msgid "Invalid URL"
#~ msgstr "Geçersiz URL"
#~ msgid "@icon@" #~ msgid "@icon@"
#~ msgstr "@icon@" #~ msgstr "@icon@"

386
podcasts-gtk/po/uk.po Normal file
View File

@ -0,0 +1,386 @@
# Ukrainian translation for podcasts.
# Copyright (C) 2020 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
#
# Yuri Chornoivan <yurchor@ukr.net>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2020-03-21 20:34+0000\n"
"PO-Revision-Date: 2020-04-06 19:49+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Lokalize 20.07.70\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr ""
"Розташування останнього відкритого головного вікна за вертикаллю (згори)"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr ""
"Розташування останнього відкритого головного вікна за горизонталлю (ліворуч)"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "Висота останнього відкритого головного вікна"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "Ширина останнього відкритого головного вікна"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "Стан максимізації останнього відкритого головного вікна"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "Увімкнути або вимкнути темну тему"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "Чи слід періодично оновлювати дані"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr ""
"Скільки періодів часу слід очікувати між двома послідовними автоматичними"
" оновленнями"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr ""
"Який період часу слід використовувати для очікування між двома послідовними"
" автоматичними оновленнями"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "Чи слід оновлювати дані після запуску"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr ""
"Скільки періодів часу слід очікувати між двома послідовними автоматичними"
" очищеннями"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr ""
"Який період часу слід використовувати для очікування між двома послідовними"
" автоматичними очищеннями"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/resources/gtk/headerbar.ui:158 podcasts-gtk/src/app.rs:353
#: podcasts-gtk/src/widgets/aboutdialog.rs:56 podcasts-gtk/src/window.rs:82
msgid "Podcasts"
msgstr "Подкасти"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "Слухайте ваші улюблені подкасти безпосередньо з вашої стільниці."
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;подкаст;рсс;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "Програма для прослуховування подкастів у GNOME"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:84
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "У цьому шоу ще немає серій"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr ""
"Якщо ви вважаєте це помилкою, будь ласка, повідомте про неї розробникам."
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "Отримати шоу"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "Додайте нові шоу за допомогою адреси стрічки"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "Імпортувати шоу з іншого пристрою"
#: podcasts-gtk/resources/gtk/episode_widget.ui:79
msgid "Youve already listened to this episode."
msgstr "Ви вже прослуховували цю серію."
#: podcasts-gtk/resources/gtk/episode_widget.ui:208
msgid "Calculating episode size…"
msgstr "Обчислюємо розмір серії…"
#: podcasts-gtk/resources/gtk/episode_widget.ui:248
msgid "Play this episode"
msgstr "Відтворити цю серію"
#: podcasts-gtk/resources/gtk/episode_widget.ui:269
msgid "Cancel the download process"
msgstr "Скасувати процедуру отримання"
#: podcasts-gtk/resources/gtk/episode_widget.ui:292
msgid "Download this episode"
msgstr "Отримати цю серію"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "_Шукати нові серії"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "_Імпортувати шоу"
#: podcasts-gtk/resources/gtk/hamburger.ui:16
msgid "_Export Shows"
msgstr "_Експортувати шоу"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Keyboard Shortcuts"
msgstr "_Клавіатурні скорочення"
#: podcasts-gtk/resources/gtk/hamburger.ui:30
msgid "_About Podcasts"
msgstr "_Про «Подкасти»"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:186
msgid "Add a new feed"
msgstr "Додати нову подачу"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "Введіть адресу подачі для додавання"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "Додати"
#: podcasts-gtk/resources/gtk/headerbar.ui:171
msgid "Show Title"
msgstr "Показувати заголовок"
#: podcasts-gtk/resources/gtk/headerbar.ui:207
msgid "Back"
msgstr "Назад"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "Загальне"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "Шукати нові серії"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "Вийти з програми"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "Сьогодні"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "Вчора"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "Цього тижня"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "Цього місяця"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "Старіше"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "Сповіщення про дію у програмі"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "Скасувати"
#: podcasts-gtk/resources/gtk/player_dialog.ui:14
msgid "Now Playing"
msgstr "Зараз відтворюється"
#: podcasts-gtk/resources/gtk/player_rate.ui:32
msgid "Change the playback speed"
msgstr "Змінити швидкість відтворення"
#: podcasts-gtk/resources/gtk/player_rate.ui:47
#: podcasts-gtk/resources/gtk/player_rate.ui:122
msgid "1.00×"
msgstr "1,00×"
#: podcasts-gtk/resources/gtk/player_rate.ui:86
msgid "1.50×"
msgstr "1,50×"
#: podcasts-gtk/resources/gtk/player_rate.ui:90
msgid "1.5 speed rate"
msgstr "Швидкість відтворення 1,5"
#: podcasts-gtk/resources/gtk/player_rate.ui:104
msgid "1.25×"
msgstr "1,25×"
#: podcasts-gtk/resources/gtk/player_rate.ui:108
msgid "1.25 speed rate"
msgstr "Швидкість відтворення 1,25"
#: podcasts-gtk/resources/gtk/player_rate.ui:126
msgid "Normal speed"
msgstr "Звичайна швидкість"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:97
msgid "Rewind 10 seconds"
msgstr "На 10 назад"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:112
msgid "Play"
msgstr "Відтворити"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:128
msgid "Pause"
msgstr "Пауза"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:144
msgid "Fast forward 10 seconds"
msgstr "На 10 секунд вперед"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "П_означити усі серії як відтворені"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "_Сайт"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "_Відписатись"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "Відкрити сайт"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "Позначити усе як відтворене"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "Відписатися"
#: podcasts-gtk/resources/gtk/show_widget.ui:99
msgid "Read More"
msgstr "Дізнатися більше"
#: podcasts-gtk/src/app.rs:287
msgid "Fetching new episodes"
msgstr "Отримання нових серій"
#: podcasts-gtk/src/stacks/content.rs:54
msgid "New"
msgstr "Створити"
#: podcasts-gtk/src/stacks/content.rs:55
msgid "Shows"
msgstr "Шоу"
#: podcasts-gtk/src/utils.rs:398
msgid "Select the file from which to you want to import shows."
msgstr "Виберіть файл, з якого ви хочете імпортувати шоу."
#: podcasts-gtk/src/utils.rs:401
msgid "_Import"
msgstr "_Імпортувати"
#: podcasts-gtk/src/utils.rs:410 podcasts-gtk/src/utils.rs:457
msgid "OPML file"
msgstr "файл OPML"
#: podcasts-gtk/src/utils.rs:427
msgid "Failed to parse the imported file"
msgstr "Не вдалося обробити імпортований файл"
#: podcasts-gtk/src/utils.rs:432 podcasts-gtk/src/utils.rs:475
msgid "Selected file could not be accessed."
msgstr "Не вдалося отримати доступ до вибраного файла."
#: podcasts-gtk/src/utils.rs:445
msgid "Export shows to…"
msgstr "Експортувати шоу до…"
#: podcasts-gtk/src/utils.rs:448
msgid "_Export"
msgstr "_Експортувати"
#: podcasts-gtk/src/utils.rs:449
msgid "_Cancel"
msgstr "_Скасувати"
#: podcasts-gtk/src/utils.rs:469
msgid "GNOME Podcasts Subscriptions"
msgstr "Підписки на подкасти GNOME"
#: podcasts-gtk/src/utils.rs:470
msgid "Failed to export podcasts"
msgstr "Не вдалося експортувати подкасти"
#: podcasts-gtk/src/widgets/aboutdialog.rs:51
msgid "Podcast Client for the GNOME Desktop."
msgstr "Клієнт подкастів для стільниці GNOME."
#: podcasts-gtk/src/widgets/aboutdialog.rs:58
msgid "Learn more about GNOME Podcasts"
msgstr "Дізнатися більше про «Подкасти» GNOME"
#: podcasts-gtk/src/widgets/aboutdialog.rs:63
msgid "translator-credits"
msgstr "Юрій Чорноіван <yurchor@ukr.net>"
#: podcasts-gtk/src/widgets/episode.rs:149
msgid "{} min"
msgstr "{} хв."
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:828
msgid "The media player was unable to execute an action."
msgstr "Програвачеві мультимедійних даних не вдалося виконати цю дію."
#: podcasts-gtk/src/widgets/show_menu.rs:174
msgid "Marked all episodes as listened"
msgstr "Усі серії позначено як прослухані"
#: podcasts-gtk/src/widgets/show_menu.rs:179
msgid "Unsubscribed from {}"
msgstr "Скасовано підписку на {}"

405
podcasts-gtk/po/zh_CN.po Normal file
View File

@ -0,0 +1,405 @@
# Chinese (China) translation for podcasts.
# Copyright (C) 2018 podcasts's COPYRIGHT HOLDER
# This file is distributed under the same license as the podcasts package.
# Dingzhong Chen <wsxy162@gmail.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: podcasts master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/podcasts/issues\n"
"POT-Creation-Date: 2018-09-06 18:29+0000\n"
"PO-Revision-Date: 2018-09-07 12:07+0800\n"
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Last-Translator: Dingzhong Chen <wsxy162@gmail.com>\n"
"X-Generator: Gtranslator 2.91.7\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:15
msgid "Top position of the last open main window"
msgstr "最后打开的主窗口顶部位置"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:19
msgid "Left position of the last open main window"
msgstr "最后打开的主窗口左侧位置"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:23
msgid "Height of the last open main window"
msgstr "最后打开的主窗口高度"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:27
msgid "Width of the last open main window"
msgstr "最后打开的主窗口宽度"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:31
msgid "Maximized state of the last open main window"
msgstr "最后打开的主窗口最大化状态"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:36
msgid "Enable or disable dark theme"
msgstr "启用或禁用暗色主题"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:41
msgid "Whether to periodically refresh content"
msgstr "是否定期刷新内容"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:46
msgid "How many periods of time to wait between automatic refreshes"
msgstr "自动刷新之间要等待多久的时间"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:50
msgid "What period of time to wait between automatic refreshes"
msgstr "自动刷新之间要等待的时间段"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:54
msgid "Whether to refresh content after startup"
msgstr "启动后是否刷新内容"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:60
msgid "How many periods of time to wait between automatic cleanups"
msgstr "自动清理之间要等待多久的时间"
#: podcasts-gtk/resources/org.gnome.Podcasts.gschema.xml:64
msgid "What period of time to wait between automatic cleanups"
msgstr "自动清理之间要等待的时间段"
#. Weird magic I copy-pasted that sets the Application Name in the Shell.
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:3
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:4
#: podcasts-gtk/src/app.rs:91 podcasts-gtk/src/app.rs:414
#: podcasts-gtk/src/widgets/aboutdialog.rs:31
msgid "Podcasts"
msgstr "播客"
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:4
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:10
msgid "Listen to your favorite podcasts, right from your desktop."
msgstr "直接在您的桌面上收听喜欢的播客。"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:6
msgid "@icon@"
msgstr "@icon@"
#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
#: podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in:13
msgid "Podcast;RSS;"
msgstr "Podcast;RSS;播客;订阅;聚合;"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:8
msgid "Podcast app for GNOME"
msgstr "GNOME 的播客应用"
#: podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in:51
msgid "Jordan Petridis"
msgstr "Jordan Petridis"
#: podcasts-gtk/resources/gtk/empty_view.ui:46
msgid "This show does not have episodes yet"
msgstr "这个节目还没有剧集"
#: podcasts-gtk/resources/gtk/empty_view.ui:62
msgid "If you think this is an error, please consider writing a bug report."
msgstr "如果您认为这是个错误,请考虑编写个缺陷报告。"
#: podcasts-gtk/resources/gtk/empty_view.ui:106
msgid "Get some shows"
msgstr "获取节目"
#: podcasts-gtk/resources/gtk/empty_view.ui:143
msgid "Add new shows via feed URL"
msgstr "通过订阅源 URL 添加新节目"
#: podcasts-gtk/resources/gtk/empty_view.ui:172
msgid "Import shows from another device"
msgstr "从另一设备导入节目"
#: podcasts-gtk/resources/gtk/episode_widget.ui:178
msgid "Calculating episode size…"
msgstr "正在计算剧集大小……"
#: podcasts-gtk/resources/gtk/episode_widget.ui:214
msgid "Cancel"
msgstr "取消"
#: podcasts-gtk/resources/gtk/episode_widget.ui:232
msgid "Download this episode"
msgstr "下载此剧集"
#: podcasts-gtk/resources/gtk/episode_widget.ui:256
msgid "Play this episode"
msgstr "播放此剧集"
#: podcasts-gtk/resources/gtk/hamburger.ui:7
msgid "_Check for New Episodes"
msgstr "检查新剧集(_C)"
#: podcasts-gtk/resources/gtk/hamburger.ui:12
msgid "_Import Shows"
msgstr "导入节目(_I)"
#: podcasts-gtk/resources/gtk/hamburger.ui:22
msgid "_Preferences"
msgstr "首选项(_P)"
#: podcasts-gtk/resources/gtk/hamburger.ui:29
msgid "_Keyboard Shortcuts"
msgstr "键盘快捷键(_K)"
#: podcasts-gtk/resources/gtk/hamburger.ui:37
msgid "_About"
msgstr "关于(_A)"
#: podcasts-gtk/resources/gtk/headerbar.ui:35
#: podcasts-gtk/resources/gtk/headerbar.ui:189
msgid "Add a new feed"
msgstr "添加新订阅源"
#: podcasts-gtk/resources/gtk/headerbar.ui:53
msgid "Enter feed address to add"
msgstr "输入要添加的订阅源地址"
#: podcasts-gtk/resources/gtk/headerbar.ui:89
msgid "Add"
msgstr "添加"
#: podcasts-gtk/resources/gtk/headerbar.ui:133
msgid "You are already subscribed to that feed!"
msgstr "您已经订阅了那条订阅源!"
#: podcasts-gtk/resources/gtk/headerbar.ui:169
msgid "Show Title"
msgstr "显示标题"
#: podcasts-gtk/resources/gtk/headerbar.ui:210
msgid "Back"
msgstr "后退"
#: podcasts-gtk/resources/gtk/help-overlay.ui:12
msgid "General"
msgstr "常规"
#: podcasts-gtk/resources/gtk/help-overlay.ui:18
msgctxt "shortcut window"
msgid "Check for new episodes"
msgstr "检查新剧集"
#: podcasts-gtk/resources/gtk/help-overlay.ui:25
msgctxt "shortcut window"
msgid "Preferences"
msgstr "首选项"
#: podcasts-gtk/resources/gtk/help-overlay.ui:32
msgctxt "shortcut window"
msgid "Quit the application"
msgstr "退出程序"
#: podcasts-gtk/resources/gtk/home_view.ui:56
msgid "Today"
msgstr "今天"
#: podcasts-gtk/resources/gtk/home_view.ui:112
msgid "Yesterday"
msgstr "昨天"
#: podcasts-gtk/resources/gtk/home_view.ui:168
msgid "This Week"
msgstr "本周"
#: podcasts-gtk/resources/gtk/home_view.ui:224
msgid "This Month"
msgstr "本月"
#: podcasts-gtk/resources/gtk/home_view.ui:281
msgid "Older"
msgstr "更早"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:101
msgid "An in-app action notification"
msgstr "应用内操作通知"
#: podcasts-gtk/resources/gtk/inapp_notif.ui:112
msgid "Undo"
msgstr "撤消"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:72
msgid "Rewind 10 seconds"
msgstr "后退 10 秒"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:87
msgid "Play"
msgstr "播放"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:103
msgid "Pause"
msgstr "暂停"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:119
msgid "Fast forward 10 seconds"
msgstr "快进 10 秒"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:285
msgid "Change the playback speed"
msgstr "更改播放速度"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:300
#: podcasts-gtk/resources/gtk/player_toolbar.ui:380
msgid "1.00×"
msgstr "1.00×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:344
msgid "1.50×"
msgstr "1.50×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:348
msgid "1.5 speed rate"
msgstr "1.5 倍速率"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:362
msgid "1.25×"
msgstr "1.25×"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:366
msgid "1.25 speed rate"
msgstr "1.25 倍速率"
#: podcasts-gtk/resources/gtk/player_toolbar.ui:384
msgid "Normal speed"
msgstr "正常速度"
#: podcasts-gtk/resources/gtk/prefs.ui:42
#: podcasts-gtk/resources/gtk/prefs.ui:295
msgid "Preferences"
msgstr "首选项"
#: podcasts-gtk/resources/gtk/prefs.ui:76
msgid "Appearance"
msgstr "外观"
#: podcasts-gtk/resources/gtk/prefs.ui:120
msgid "Dark Theme"
msgstr "暗色主题"
#: podcasts-gtk/resources/gtk/prefs.ui:166
msgid "Delete played episodes"
msgstr "删除播放过的剧集"
#: podcasts-gtk/resources/gtk/prefs.ui:211
msgid "After"
msgstr "经过"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:7
msgid "_Mark All Episodes as Played"
msgstr "标记所有剧集为已播放(_M)"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:11
msgid "_Website"
msgstr "网站(_W)"
#: podcasts-gtk/resources/gtk/secondary_menu.ui:15
msgid "_Unsubscribe"
msgstr "退订(_U)"
#: podcasts-gtk/resources/gtk/show_menu.ui:51
msgid "Open Website"
msgstr "打开网站"
#: podcasts-gtk/resources/gtk/show_menu.ui:64
msgid "Mark All as Played"
msgstr "全部标记为已播放"
#: podcasts-gtk/resources/gtk/show_menu.ui:89
msgid "Unsubscribe"
msgstr "退订"
#: podcasts-gtk/src/app.rs:332
msgid "Fetching new episodes"
msgstr "正在提取新剧集"
#: podcasts-gtk/src/headerbar.rs:98
msgid "You are already subscribed to this show"
msgstr "您已经订阅了此节目"
#: podcasts-gtk/src/headerbar.rs:106
msgid "Invalid URL"
msgstr "无效的 URL"
#: podcasts-gtk/src/prefs.rs:59
msgid "Seconds"
msgstr "秒"
#: podcasts-gtk/src/prefs.rs:60
msgid "Minutes"
msgstr "分"
#: podcasts-gtk/src/prefs.rs:61
msgid "Hours"
msgstr "小时"
#: podcasts-gtk/src/prefs.rs:62
msgid "Days"
msgstr "天"
#: podcasts-gtk/src/prefs.rs:63
msgid "Weeks"
msgstr "周"
#: podcasts-gtk/src/stacks/content.rs:35
msgid "New"
msgstr "更新"
#: podcasts-gtk/src/stacks/content.rs:36
msgid "Shows"
msgstr "节目"
#: podcasts-gtk/src/utils.rs:357
msgid "Select the file from which to you want to import shows."
msgstr "选择您想要从中导入节目的文件。"
#: podcasts-gtk/src/utils.rs:360
msgid "_Import"
msgstr "导入(_I)"
#: podcasts-gtk/src/utils.rs:369
msgid "OPML file"
msgstr "OPML 文件"
#: podcasts-gtk/src/utils.rs:386
msgid "Failed to parse the imported file"
msgstr "解析导入文件失败"
#: podcasts-gtk/src/utils.rs:391
msgid "Selected file could not be accessed."
msgstr "所选文件无法访问。"
#: podcasts-gtk/src/widgets/aboutdialog.rs:26
msgid "Podcast Client for the GNOME Desktop."
msgstr "GNOME 桌面的播客客户端。"
#: podcasts-gtk/src/widgets/aboutdialog.rs:33
msgid "Learn more about GNOME Podcasts"
msgstr "了解关于 GNOME 播客的更多信息"
#: podcasts-gtk/src/widgets/aboutdialog.rs:38
msgid "translator-credits"
msgstr "Dingzhong Chen <wsxy162@gmail.com>, 2018."
#: podcasts-gtk/src/widgets/episode.rs:129
msgid "{} min"
msgstr "{} 分钟"
#. sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
#: podcasts-gtk/src/widgets/player.rs:301
msgid "The media player was unable to execute an action."
msgstr "媒体播放器无法执行此操作。"
#: podcasts-gtk/src/widgets/show_menu.rs:150
msgid "Marked all episodes as listened"
msgstr "标记所有剧集为已听过"
#: podcasts-gtk/src/widgets/show_menu.rs:155
msgid "Unsubscribed from {}"
msgstr "已退订 {}"

View File

@ -110,6 +110,9 @@ Tobias Bernard
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -143,6 +146,9 @@ Tobias Bernard
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -177,6 +183,9 @@ Tobias Bernard
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -212,6 +221,9 @@ Tobias Bernard
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>

View File

@ -129,43 +129,52 @@ Tobias Bernard
</object> </object>
</child> </child>
</object> </object>
<object class="GtkHeaderBar" id="headerbar"> <object class="HdyHeaderBar" id="headerbar">
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="show_close_button">True</property> <property name="show_close_button">True</property>
<property name="centering-policy">strict</property>
<child type="title"> <child type="title">
<object class="GtkBox"> <object class="GtkStack" id="title_stack">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="transition_type">crossfade</property>
<child> <child>
<object class="GtkStackSwitcher" id="switch"> <object class="HdySqueezer" id="switch_squeezer">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">center</property> <property name="transition_type">crossfade</property>
<property name="valign">center</property> <child>
<object class="HdyViewSwitcher" id="switch">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="policy">wide</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Podcasts</property>
<style>
<class name="title"/>
</style>
</object>
</child>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="show_title"> <object class="GtkLabel" id="show_title">
<property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="no_show_all">True</property> <property name="no_show_all">True</property>
<property name="label" translatable="yes">Show Title</property> <property name="label" translatable="yes">Show Title</property>
<property name="ellipsize">end</property> <property name="ellipsize">end</property>
<property name="track_visited_links">False</property> <property name="track_visited_links">False</property>
<attributes> <style>
<attribute name="weight" value="bold"/> <class name="title" />
</attributes> </style>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child> </child>
</object> </object>
</child> </child>

View File

@ -0,0 +1,306 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<requires lib="libhandy" version="0.0"/>
<object class="HdyDialog" id="dialog">
<property name="can_focus">False</property>
<property name="type_hint">dialog</property>
<property name="modal">True</property>
<child type="titlebar">
<object class="HdyHeaderBar" id="headerbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Now Playing</property>
<child>
<object class="GtkButton" id="close">
<property name="visible">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">go-previous-symbolic</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">6</property>
<property name="margin_right">6</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="orientation">vertical</property>
<property name="spacing">18</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkImage" id="cover">
<property name="width_request">256</property>
<property name="height_request">256</property>
<property name="margin">18</property>
<property name="margin-top">36</property>
<property name="margin-bottom">6</property>
<property name="valign">center</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="orientation">vertical</property>
<property name="margin-start">6</property>
<property name="margin-end">6</property>
<child>
<object class="GtkLabel" id="episode_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="label">Episode Title</property>
<property name="wrap">True</property>
<property name="justify">center</property>
<style>
<class name="bold-label" />
</style>
</object>
</child>
<child>
<object class="GtkLabel" id="show_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="label">Show Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<child>
<object class="GtkLabel" id="progressed">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="width_chars">5</property>
<property name="xalign">1</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
<style>
<class name="dim-label"/>
<class name="small-label"/>
</style>
</object>
</child>
<child>
<object class="GtkScale" id="slider">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="draw_value">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="duration">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="width_chars">5</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
<style>
<class name="dim-label"/>
<class name="small-label"/>
</style>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="spacing">12</property>
<child>
<object class="GtkButton" id="rewind">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="width_request">60</property>
<property name="height_request">60</property>
<property name="valign">center</property>
<property name="margin-end">12</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">skip-back-large-symbolic</property>
<property name="icon_size">5</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkStack" id="play_pause">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="play">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="width_request">80</property>
<property name="height_request">80</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-start-symbolic</property>
<property name="icon_size">6</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
</child>
<child>
<object class="GtkButton" id="pause">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="width_request">80</property>
<property name="height_request">80</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-pause-symbolic</property>
<property name="icon_size">6</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkButton" id="forward">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="width_request">60</property>
<property name="height_request">60</property>
<property name="valign">center</property>
<property name="margin-start">12</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">skip-forward-large-symbolic</property>
<property name="icon_size">5</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkBox" id="bottom">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@ -0,0 +1,269 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0
Copyright (C) 2017 - 2018
This file is part of GNOME Podcast.
GNOME Podcast is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GNOME Podcast is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNOME Podcast. If not, see <http://www.gnu.org/licenses/>.
Authors:
Jordan Petridis
Tobias Bernard
-->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class="GtkMenuButton" id="rate_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Change the playback speed</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin_start">6</property>
<property name="direction">up</property>
<property name="popover">rate_popover</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="rate_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">1.00×</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">pan-down-symbolic</property>
<property name="icon_size">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkPopover" id="rate_popover">
<property name="can_focus">False</property>
<property name="relative_to">rate_button</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin">6</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkModelButton" id="rate_4_00">
<property name="text">&lt;span font-features="tnum=1"&gt;4.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">4.0 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_75">
<property name="text">&lt;span font-features="tnum=1"&gt;3.75×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.75 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_50">
<property name="text">&lt;span font-features="tnum=1"&gt;3.50×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.5 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_25">
<property name="text">&lt;span font-features="tnum=1"&gt;3.25×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.25 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_3_00">
<property name="text">&lt;span font-features="tnum=1"&gt;3.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">3.0 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_75">
<property name="text">&lt;span font-features="tnum=1"&gt;2.75×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.75 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_50">
<property name="text">&lt;span font-features="tnum=1"&gt;2.50×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.5 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">6</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_25">
<property name="text">&lt;span font-features="tnum=1"&gt;2.25×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.25 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">7</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_2_00">
<property name="text">&lt;span font-features="tnum=1"&gt;2.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">2.0 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">8</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_1_75">
<property name="text">&lt;span font-features="tnum=1"&gt;1.75×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">1.75 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">9</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_1_50">
<property name="text">&lt;span font-features="tnum=1"&gt;1.50×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">1.5 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">10</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="rate_1_25">
<property name="text">&lt;span font-features="tnum=1"&gt;1.25×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">1.25 speed rate</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">11</property>
</packing>
</child>
<child>
<object class="GtkModelButton" id="normal_rate">
<property name="text">&lt;span font-features="tnum=1"&gt;1.00×&lt;/span&gt;</property>
<property name="use-markup">True</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">Normal speed</property>
<property name="active">True</property>
<property name="role">radio</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">12</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@ -54,344 +54,371 @@ Tobias Bernard
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="icon_name">skip-back-symbolic</property> <property name="icon_name">skip-back-symbolic</property>
</object> </object>
<object class="GtkActionBar" id="action_bar"> <object class="GtkBox" id="container">
<property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="no_show_all">True</property> <property name="orientation">vertical</property>
<property name="valign">center</property> <property name="spacing">0</property>
<child> <child>
<object class="GtkBox" id="buttons"> <object class="GtkProgressBar" id="progress_bar">
<property name="visible">True</property> <property name="no_show_all">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<child>
<object class="GtkButton" id="rewind_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Rewind 10 seconds</property>
<property name="image">rewind</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="play_button">
<property name="width_request">60</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Play</property>
<property name="image">play_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="pause_button">
<property name="width_request">60</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Pause</property>
<property name="image">pause_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="ff_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Fast forward 10 seconds</property>
<property name="image">fast_forward</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<style> <style>
<class name="linked"/> <class name="playback-progress"/>
</style> </style>
</object> </object>
<packing>
<property name="position">0</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkBox" id="info"> <object class="GtkEventBox" id="evbox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child> <child>
<object class="GtkImage" id="show_cover"> <object class="GtkActionBar" id="action_bar">
<property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="pixel_size">34</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child> <child>
<object class="GtkLabel" id="show_label"> <object class="HdySqueezer" id="squeezer">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="transition_type">crossfade</property>
<property name="halign">start</property> <child>
<property name="label">Show Title</property> <object class="GtkBox" id="full">
<property name="wrap">True</property> <property name="visible">True</property>
<property name="ellipsize">end</property> <property name="spacing">6</property>
<property name="max_width_chars">20</property> <child>
<style> <object class="GtkBox" id="buttons">
<class name="player-show-label"/> <property name="visible">True</property>
</style> <property name="can_focus">False</property>
<property name="valign">center</property>
<child>
<object class="GtkButton" id="rewind_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Rewind 10 seconds</property>
<property name="image">rewind</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="play_button">
<property name="width_request">60</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Play</property>
<property name="image">play_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="pause_button">
<property name="width_request">60</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Pause</property>
<property name="image">pause_image</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="ff_button">
<property name="width_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Fast forward 10 seconds</property>
<property name="image">fast_forward</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<style>
<class name="linked"/>
</style>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="info">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="width_request">150</property>
<child>
<object class="GtkImage" id="show_cover">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="pixel_size">34</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="show_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Show Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">20</property>
<property name="xalign">0</property>
<style>
<class name="player-show-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="episode_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Episode Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">20</property>
<property name="xalign">0</property>
<style>
<class name="player-episode-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkScale" id="seek">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="round_digits">1</property>
<property name="draw_value">False</property>
<property name="width_request">150</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="timer">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="progress_time_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">/</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="total_duration_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
<attributes>
<attribute name="font-features" value="tnum=1"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="show_cover_small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="pixel_size">34</property>
<property name="icon_name">image-x-generic-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="show_label_small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Show Title</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<style>
<class name="player-show-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="episode_label_small">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Episode Title</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<style>
<class name="player-episode-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkStack" id="play_pause_small">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="play_button_small">
<property name="visible">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">media-playback-start-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkButton" id="pause_button_small">
<property name="visible">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">media-playback-pause-symbolic</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
</object>
</child>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="episode_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label">Episode Title</property>
<property name="wrap">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">20</property>
<style>
<class name="player-episode-label"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child> </child>
<style>
<class name="player-actionbar"/>
</style>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScale" id="seek">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="round_digits">1</property>
<property name="draw_value">False</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="timer">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="progress_time_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">/</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="total_duration_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label">0:00</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="rate_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Change the playback speed</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin_start">6</property>
<property name="direction">up</property>
<property name="popover">rate_popover</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="rate_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">1.00×</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">go-down-symbolic</property>
<property name="icon_size">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="position">4</property>
</packing>
</child>
</object>
<object class="GtkPopover" id="rate_popover">
<property name="can_focus">False</property>
<property name="relative_to">rate_button</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_start">6</property>
<property name="margin_end">6</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="orientation">vertical</property>
<property name="spacing">3</property>
<child>
<object class="GtkRadioButton" id="rate_1_50">
<property name="label" translatable="yes">1.50×</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">1.5 speed rate</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="draw_indicator">True</property>
<property name="group">normal_rate</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="rate_1_25">
<property name="label" translatable="yes">1.25×</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">1.25 speed rate</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="draw_indicator">True</property>
<property name="group">normal_rate</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="normal_rate">
<property name="label" translatable="yes">1.00×</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Normal speed</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child> </child>
</object> </object>
</child> </child>

View File

@ -58,38 +58,78 @@ Tobias Bernard
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkScrolledWindow"> <object class="HdyColumn">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="maximum_width">600</property>
<property name="hscrollbar_policy">never</property>
<property name="min_content_height">80</property>
<child> <child>
<object class="GtkViewport"> <object class="GtkStack" id="description_stack">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">True</property>
<property name="shadow_type">none</property> <property name="vhomogeneous">False</property>
<property name="transition_type">none</property>
<property name="interpolate_size">True</property>
<property name="margin">12</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">fill</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="description_short">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="use_markup">True</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<property name="wrap_mode">word-char</property>
<property name="ellipsize">end</property>
<property name="lines">4</property>
</object>
</child>
<child>
<object class="GtkRevealer" id="description_button_revealer">
<property name="visible">True</property>
<property name="reveal_child">False</property>
<property name="transition_duration">1</property>
<child>
<object class="GtkButton" id="description_button">
<property name="label" translatable="yes">Read More</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">False</property>
<property name="halign">center</property>
<property name="margin_top">12</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="name">short</property>
</packing>
</child>
<child> <child>
<object class="GtkLabel" id="description"> <object class="GtkLabel" id="description">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="label">This is embarrasing!
Sorry, we could not find a description for this Show.</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
<property name="justify">center</property> <property name="justify">center</property>
<property name="wrap">True</property> <property name="wrap">True</property>
<property name="wrap_mode">word-char</property> <property name="wrap_mode">word-char</property>
</object> </object>
<packing>
<property name="name">full</property>
<property name="position">1</property>
</packing>
</child> </child>
</object> </object>
</child> </child>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child> </child>
</object> </object>
<packing> <packing>

View File

@ -18,3 +18,24 @@ list, border {
.player-show-label { .player-show-label {
font-size: smaller; font-size: smaller;
} }
.small-label {
font-size: smaller;
}
.bold-label {
font-weight: bold;
}
progressbar.playback-progress trough {
border-radius: 0;
}
progressbar.playback-progress trough progress {
border-radius: 0;
border-right: none;
border-left: none;
}
actionbar.player-small revealer box {
border-top: none
}

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666665 8.4666669"
version="1.1"
id="svg2916"
sodipodi:docname="skip-back-large-symbolic.svg"
inkscape:version="0.92.4 (unknown)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="731"
id="namedview11"
showgrid="false"
inkscape:zoom="7.375"
inkscape:cx="16"
inkscape:cy="16"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2916" />
<defs
id="defs2910" />
<metadata
id="metadata2913">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 4.2324219,1.3222656 a 0.26464845,0.26464845 0 1 0 0,0.5292969 C 5.3033196,1.8515612 6.2679165,2.4969489 6.6777344,3.4863281 7.0875525,4.4757119 6.8607584,5.6118992 6.1035156,6.3691406 5.3462755,7.1263812 4.2100855,7.3531746 3.2207031,6.9433594 2.2313192,6.5335432 1.5878886,5.5689483 1.5878906,4.4980469 a 0.2646484,0.2646484 0 1 0 -0.5292968,0 c -2.5e-6,1.28341 0.7732681,2.442454 1.9589843,2.9335937 1.1857144,0.4911386 2.5534315,0.2200067 3.4609375,-0.6875 C 7.3860249,5.836633 7.6571577,4.4689192 7.1660156,3.2832031 6.6748739,2.0974925 5.5158274,1.3222641 4.2324219,1.3222656 Z"
id="path7994"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path7996"
d="M 4.2332975,0.794 V 1.05858 2.11691 2.3815 H 3.9687142 C 3.9164802,2.38149 3.8654129,2.366 3.8219524,2.3371 l -0.79375,-0.52916 c -0.157054,-0.10475 -0.157054,-0.33554 0,-0.44028 l 0.79375,-0.52917 c 0.043461,-0.029 0.094528,-0.0444 0.1467618,-0.0444 h 0.0031 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
d="m 2.6458333,5.8208334 h 1.400175 v -0.4699 h -0.42545 V 3.6173835 h -0.327025 l -0.758825,0.4381499 0.206375,0.3937 0.3302,-0.17145 v 1.07315 h -0.42545 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5132" />
<path
inkscape:connector-curvature="0"
d="m 5.0778791,5.8525834 c 0.5588,0 0.936625,-0.4572 0.936625,-1.146175 0,-0.6731 -0.371475,-1.1207749 -0.92075,-1.1207749 -0.561975,0 -0.9398,0.4571999 -0.9398,1.1429999 0,0.6731 0.371475,1.12395 0.923925,1.12395 z m 0.0127,-0.4699 c -0.225425,0 -0.371475,-0.269875 -0.371475,-0.6731 0,-0.3937 0.14605,-0.65405 0.36195,-0.65405 0.219075,0 0.3683,0.269875 0.3683,0.676275 0,0.390525 -0.14605,0.650875 -0.358775,0.650875 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5134" />
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666665 8.4666669"
version="1.1"
id="svg2916"
sodipodi:docname="skip-forward-large-symbolic.svg"
inkscape:version="0.92.4 (unknown)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="731"
id="namedview11"
showgrid="false"
inkscape:zoom="7.375"
inkscape:cx="16"
inkscape:cy="16"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2916" />
<defs
id="defs2910" />
<metadata
id="metadata2913">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<path
inkscape:connector-curvature="0"
d="m 2.6458333,5.8208334 h 1.400175 v -0.4699 h -0.42545 V 3.6173835 h -0.327025 l -0.758825,0.4381499 0.206375,0.3937 0.3302,-0.17145 v 1.07315 h -0.42545 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5132" />
<path
inkscape:connector-curvature="0"
d="m 5.0778791,5.8525834 c 0.5588,0 0.936625,-0.4572 0.936625,-1.146175 0,-0.6731 -0.371475,-1.1207749 -0.92075,-1.1207749 -0.561975,0 -0.9398,0.4571999 -0.9398,1.1429999 0,0.6731 0.371475,1.12395 0.923925,1.12395 z m 0.0127,-0.4699 c -0.225425,0 -0.371475,-0.269875 -0.371475,-0.6731 0,-0.3937 0.14605,-0.65405 0.36195,-0.65405 0.219075,0 0.3683,0.269875 0.3683,0.676275 0,0.390525 -0.14605,0.650875 -0.358775,0.650875 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:3.17499995px;line-height:1.25;font-family:Cantarell;-inkscape-font-specification:'Cantarell Ultra-Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.26458335"
id="path5134" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 4.2324219,1.3222656 C 2.9490163,1.3222641 1.7899699,2.0974925 1.2988281,3.2832031 0.80768607,4.4689192 1.080772,5.836633 1.9882812,6.7441406 c 0.9075061,0.9075067 2.2732701,1.1786386 3.4589844,0.6875 1.1857163,-0.4911397 1.96094,-1.6501837 1.9609375,-2.9335937 a 0.26464845,0.26464845 0 1 0 -0.5292969,0 C 6.8789083,5.5689483 6.2354777,6.5335432 5.2460938,6.9433594 4.2567114,7.3531746 3.1185682,7.1263812 2.3613281,6.3691406 1.6040853,5.6118992 1.3792443,4.4757119 1.7890625,3.4863281 2.1988804,2.4969489 3.1615242,1.8515612 4.2324219,1.8515625 a 0.26464845,0.26464845 0 1 0 0,-0.5292969 z"
id="path5156"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 4.2327462,0.794 V 1.05858 2.11691 2.3815 h 0.2645833 c 0.052234,-1e-5 0.1033013,-0.0155 0.1467618,-0.0444 l 0.79375,-0.52916 c 0.157054,-0.10475 0.157054,-0.33554 0,-0.44028 l -0.79375,-0.52917 c -0.043461,-0.029 -0.094528,-0.0444 -0.1467618,-0.0444 h -0.0031 z"
id="path5158" />
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -51,13 +51,13 @@
<release version="0.4.5" date="2018-08-31"> <release version="0.4.5" date="2018-08-31">
<description> <description>
<p> <p>
Podcasts 0.4.5 brings a month of bug fixes, performance improvements and initial tranlations support. Podcasts 0.4.5 brings a month of bug fixes, performance improvements and initial translations support.
</p> </p>
<ul> <ul>
<li>Finish, Polish, Turkish, Spanish, German, Galician, Indonesian and Korean Translations were added.</li> <li>Finish, Polish, Turkish, Spanish, German, Galician, Indonesian and Korean Translations were added.</li>
<li>Views now adapt better to different window sizes, thanks to libhandy HdyColumn</li> <li>Views now adapt better to different window sizes, thanks to libhandy HdyColumn</li>
<li>The update indacator was moved to an In-App notification</li> <li>The update indacator was moved to an In-App notification</li>
<li>Performance improvments when loading Show Cover images.</li> <li>Performance improvements when loading Show Cover images.</li>
<li>Improved handling of HTTP Redirects</li> <li>Improved handling of HTTP Redirects</li>
</ul> </ul>
</description> </description>

View File

@ -11,8 +11,12 @@
<file compressed="true" preprocess="xml-stripblanks">gtk/hamburger.ui</file> <file compressed="true" preprocess="xml-stripblanks">gtk/hamburger.ui</file>
<file compressed="true" preprocess="xml-stripblanks">gtk/show_menu.ui</file> <file compressed="true" preprocess="xml-stripblanks">gtk/show_menu.ui</file>
<file compressed="true" preprocess="xml-stripblanks">gtk/help-overlay.ui</file> <file compressed="true" preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
<file compressed="true" preprocess="xml-stripblanks">gtk/player_dialog.ui</file>
<file compressed="true" preprocess="xml-stripblanks">gtk/player_rate.ui</file>
<file compressed="true" preprocess="xml-stripblanks">gtk/player_toolbar.ui</file> <file compressed="true" preprocess="xml-stripblanks">gtk/player_toolbar.ui</file>
<file compressed="true" preprocess="xml-stripblanks">icons/skip-back-large-symbolic.svg</file>
<file compressed="true" preprocess="xml-stripblanks">icons/skip-back-symbolic.svg</file> <file compressed="true" preprocess="xml-stripblanks">icons/skip-back-symbolic.svg</file>
<file compressed="true" preprocess="xml-stripblanks">icons/skip-forward-large-symbolic.svg</file>
<file compressed="true" preprocess="xml-stripblanks">icons/skip-forward-symbolic.svg</file> <file compressed="true" preprocess="xml-stripblanks">icons/skip-forward-symbolic.svg</file>
<file compressed="true">gtk/style.css</file> <file compressed="true">gtk/style.css</file>
</gresource> </gresource>

View File

@ -17,11 +17,11 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
#![allow(clippy::new_without_default)]
#![allow(new_without_default)] use glib::clone;
use glib::subclass;
use glib::subclass::prelude::*; use glib::subclass::prelude::*;
use glib::subclass::simple::{ClassStruct, InstanceStruct};
use glib::translate::*; use glib::translate::*;
use glib::{glib_object_impl, glib_object_subclass, glib_object_wrapper, glib_wrapper}; use glib::{glib_object_impl, glib_object_subclass, glib_object_wrapper, glib_wrapper};
@ -35,7 +35,7 @@ use gettextrs::{bindtextdomain, setlocale, textdomain, LocaleCategory};
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use fragile::Fragile; use fragile::Fragile;
use podcasts_data::Show; use podcasts_data::{Show, Source};
use crate::settings; use crate::settings;
use crate::stacks::PopulatedState; use crate::stacks::PopulatedState;
@ -59,8 +59,8 @@ pub struct PdApplicationPrivate {
impl ObjectSubclass for PdApplicationPrivate { impl ObjectSubclass for PdApplicationPrivate {
const NAME: &'static str = "PdApplication"; const NAME: &'static str = "PdApplication";
type ParentType = gtk::Application; type ParentType = gtk::Application;
type Instance = subclass::simple::InstanceStruct<Self>; type Instance = InstanceStruct<Self>;
type Class = subclass::simple::ClassStruct<Self>; type Class = ClassStruct<Self>;
glib_object_subclass!(); glib_object_subclass!();
@ -95,7 +95,10 @@ impl gio::subclass::prelude::ApplicationImpl for PdApplicationPrivate {
window.present(); window.present();
self.window.replace(Some(window)); self.window.replace(Some(window));
// Setup the Action channel // Setup the Action channel
gtk::timeout_add(25, clone!(app => move || app.setup_action_channel())); gtk::timeout_add(
25,
clone!(@strong app => move || app.setup_action_channel()),
);
} }
fn startup(&self, app: &gio::Application) { fn startup(&self, app: &gio::Application) {
@ -119,7 +122,7 @@ impl gio::subclass::prelude::ApplicationImpl for PdApplicationPrivate {
impl gtk::subclass::application::GtkApplicationImpl for PdApplicationPrivate {} impl gtk::subclass::application::GtkApplicationImpl for PdApplicationPrivate {}
glib_wrapper! { glib_wrapper! {
pub struct PdApplication(Object<subclass::simple::InstanceStruct<PdApplicationPrivate>, subclass::simple::ClassStruct<PdApplicationPrivate>, PdApplicationClass>) @extends gio::Application, gtk::Application; pub struct PdApplication(Object<InstanceStruct<PdApplicationPrivate>, ClassStruct<PdApplicationPrivate>, PdApplicationClass>) @extends gio::Application, gtk::Application;
match fn { match fn {
get_type => || PdApplicationPrivate::get_type().to_glib(), get_type => || PdApplicationPrivate::get_type().to_glib(),
@ -139,7 +142,9 @@ pub(crate) enum Action {
HeaderBarShowTile(String), HeaderBarShowTile(String),
HeaderBarNormal, HeaderBarNormal,
MarkAllPlayerNotification(Arc<Show>), MarkAllPlayerNotification(Arc<Show>),
UpdateFeed(Option<Vec<Source>>),
ShowUpdateNotif(Receiver<bool>), ShowUpdateNotif(Receiver<bool>),
StopUpdating,
RemoveShow(Arc<Show>), RemoveShow(Arc<Show>),
ErrorNotification(String), ErrorNotification(String),
InitEpisode(i32), InitEpisode(i32),
@ -249,6 +254,17 @@ impl PdApplication {
let notif = InAppNotification::new(&err, 6000, callback, undo_cb); let notif = InAppNotification::new(&err, 6000, callback, undo_cb);
notif.show(&window.overlay); notif.show(&window.overlay);
} }
Action::UpdateFeed(source) => {
if window.updating.get() {
info!("Ignoring feed update request (another one is already running)")
} else {
window.updating.set(true);
utils::refresh_feed(source, window.sender.clone())
}
}
Action::StopUpdating => {
window.updating.set(false);
}
Action::ShowUpdateNotif(receiver) => { Action::ShowUpdateNotif(receiver) => {
let sender = window.sender.clone(); let sender = window.sender.clone();
let callback = move |revealer: gtk::Revealer| match receiver.try_recv() { let callback = move |revealer: gtk::Revealer| match receiver.try_recv() {
@ -256,9 +272,15 @@ impl PdApplication {
Err(TryRecvError::Disconnected) => glib::Continue(false), Err(TryRecvError::Disconnected) => glib::Continue(false),
Ok(_) => { Ok(_) => {
revealer.set_reveal_child(false); revealer.set_reveal_child(false);
sender
.send(Action::StopUpdating)
.expect("Action channel blew up somehow");
sender sender
.send(Action::RefreshAllViews) .send(Action::RefreshAllViews)
.expect("Action channel blew up somehow"); .expect("Action channel blew up somehow");
glib::Continue(false) glib::Continue(false)
} }
}; };
@ -270,6 +292,7 @@ impl PdApplication {
let old = window.updater.replace(Some(updater)); let old = window.updater.replace(Some(updater));
old.map(|i| i.destroy()); old.map(|i| i.destroy());
window window
.updater .updater
.borrow() .borrow()

View File

@ -18,8 +18,11 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use gio; use gio;
use glib::clone;
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
use libhandy;
use libhandy::prelude::*;
use crossbeam_channel::Sender; use crossbeam_channel::Sender;
use failure::Error; use failure::Error;
@ -30,7 +33,7 @@ use podcasts_data::{dbqueries, Source};
use crate::app::Action; use crate::app::Action;
use crate::stacks::Content; use crate::stacks::Content;
use crate::utils::{itunes_to_rss, refresh}; use crate::utils::{itunes_to_rss, schedule_refresh};
use std::rc::Rc; use std::rc::Rc;
@ -39,9 +42,12 @@ use crate::i18n::i18n;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
// TODO: Make a proper state machine for the headerbar states // TODO: Make a proper state machine for the headerbar states
pub(crate) struct Header { pub(crate) struct Header {
pub(crate) container: gtk::HeaderBar, pub(crate) container: libhandy::HeaderBar,
pub(crate) switch: gtk::StackSwitcher, pub(crate) switch: libhandy::ViewSwitcher,
pub(crate) bottom_switcher: libhandy::ViewSwitcherBar,
switch_squeezer: libhandy::Squeezer,
back: gtk::Button, back: gtk::Button,
title_stack: gtk::Stack,
show_title: gtk::Label, show_title: gtk::Label,
hamburger: gtk::MenuButton, hamburger: gtk::MenuButton,
add: AddPopover, add: AddPopover,
@ -78,9 +84,9 @@ impl AddPopover {
url.to_owned() url.to_owned()
}; };
rayon::spawn(clone!(sender => move || { rayon::spawn(clone!(@strong sender => move || {
if let Ok(source) = Source::from_url(&url) { if let Ok(source) = Source::from_url(&url) {
refresh(Some(vec![source]), sender.clone()); schedule_refresh(Some(vec![source]), sender.clone());
} else { } else {
error!("Failed to convert, url: {}, to a source entry", url); error!("Failed to convert, url: {}, to a source entry", url);
} }
@ -169,8 +175,10 @@ impl Default for Header {
let menus = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/hamburger.ui"); let menus = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/hamburger.ui");
let header = builder.get_object("headerbar").unwrap(); let header = builder.get_object("headerbar").unwrap();
let switch = builder.get_object("switch").unwrap(); let switch: libhandy::ViewSwitcher = builder.get_object("switch").unwrap();
let back = builder.get_object("back").unwrap(); let back = builder.get_object("back").unwrap();
let title_stack = builder.get_object("title_stack").unwrap();
let switch_squeezer: libhandy::Squeezer = builder.get_object("switch_squeezer").unwrap();
let show_title = builder.get_object("show_title").unwrap(); let show_title = builder.get_object("show_title").unwrap();
// The hamburger menu // The hamburger menu
@ -192,10 +200,17 @@ impl Default for Header {
add: add_button, add: add_button,
}; };
// View switcher bar that goes at the bottom of the window
let switcher = libhandy::ViewSwitcherBar::new();
switcher.set_reveal(false);
Header { Header {
container: header, container: header,
switch, switch,
back, back,
title_stack,
switch_squeezer,
bottom_switcher: switcher,
show_title, show_title,
hamburger, hamburger,
add, add,
@ -213,43 +228,57 @@ impl Header {
} }
pub(crate) fn init(s: &Rc<Self>, content: &Content, sender: &Sender<Action>) { pub(crate) fn init(s: &Rc<Self>, content: &Content, sender: &Sender<Action>) {
let weak = Rc::downgrade(s); s.bottom_switcher.set_stack(Some(&content.get_stack()));
s.switch.set_stack(Some(&content.get_stack())); s.switch.set_stack(Some(&content.get_stack()));
s.add.entry.connect_changed(clone!(weak => move |_| { s.add.entry.connect_changed(clone!(@weak s => move |_| {
weak.upgrade().map(|h| { s.add.on_entry_changed()
h.add.on_entry_changed() .map_err(|err| error!("Error: {}", err))
.map_err(|err| error!("Error: {}", err)) .ok();
.ok();
});
})); }));
s.add.add.connect_clicked(clone!(weak, sender => move |_| { s.add
weak.upgrade().map(|h| h.add.on_add_clicked(&sender)); .add
})); .connect_clicked(clone!(@weak s, @strong sender => move |_| {
s.add.on_add_clicked(&sender).unwrap();
}));
s.back.connect_clicked(clone!(weak, sender => move |_| { s.add
weak.upgrade().map(|h| h.switch_to_normal()); .entry
sender.send(Action::ShowShowsAnimated).expect("Action channel blew up somehow"); .connect_activate(clone!(@weak s, @strong sender => move |_| {
})); if s.add.add.get_sensitive() {
s.add.on_add_clicked(&sender).unwrap();
}
}));
s.back
.connect_clicked(clone!(@weak s, @strong sender => move |_| {
s.switch_to_normal();
sender.send(Action::ShowShowsAnimated).expect("Action channel blew up somehow");
}));
s.switch_squeezer
.connect_property_visible_child_notify(clone!(@weak s => move |_| {
s.update_bottom_switcher();
}));
s.update_bottom_switcher();
} }
pub(crate) fn switch_to_back(&self, title: &str) { pub(crate) fn switch_to_back(&self, title: &str) {
self.switch.hide();
self.add.toggle.hide(); self.add.toggle.hide();
self.back.show(); self.back.show();
self.set_show_title(title); self.set_show_title(title);
self.show_title.show(); self.title_stack.set_visible_child(&self.show_title);
self.bottom_switcher.set_reveal(false);
self.hamburger.hide(); self.hamburger.hide();
self.dots.show(); self.dots.show();
} }
pub(crate) fn switch_to_normal(&self) { pub(crate) fn switch_to_normal(&self) {
self.switch.show();
self.add.toggle.show(); self.add.toggle.show();
self.back.hide(); self.back.hide();
self.show_title.hide(); self.title_stack.set_visible_child(&self.switch_squeezer);
self.update_bottom_switcher();
self.hamburger.show(); self.hamburger.show();
self.dots.hide(); self.dots.hide();
} }
@ -265,4 +294,10 @@ impl Header {
pub(crate) fn set_secondary_menu(&self, pop: &gtk::PopoverMenu) { pub(crate) fn set_secondary_menu(&self, pop: &gtk::PopoverMenu) {
self.dots.set_popover(Some(pop)); self.dots.set_popover(Some(pop));
} }
fn update_bottom_switcher(&self) {
if let Some(child) = self.switch_squeezer.get_visible_child() {
self.bottom_switcher.set_reveal(child != self.switch);
}
}
} }

View File

@ -17,11 +17,12 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
#![cfg_attr( #![allow(
feature = "cargo-clippy", clippy::clone_on_ref_ptr,
allow(clone_on_ref_ptr, blacklisted_name, match_same_arms,) clippy::blacklisted_name,
clippy::match_same_arms,
unknown_lints
)] )]
#![allow(unknown_lints)]
// Enable lint group collections // Enable lint group collections
#![warn(nonstandard_style, edition_2018, rust_2018_idioms, bad_style, unused)] #![warn(nonstandard_style, edition_2018, rust_2018_idioms, bad_style, unused)]
// standalone lints // standalone lints
@ -59,25 +60,6 @@ use log::Level;
use gtk::prelude::*; use gtk::prelude::*;
// https://gtk-rs.org/docs-src/tutorial/closures
#[macro_export]
macro_rules! clone {
(@param _) => ( _ );
(@param $x:ident) => ( $x );
($($n:ident),+ => move || $body:expr) => (
{
$( let $n = $n.clone(); )+
move || $body
}
);
($($n:ident),+ => move |$($p:tt),+| $body:expr) => (
{
$( let $n = $n.clone(); )+
move |$(clone!(@param $p),)+| $body
}
);
}
mod stacks; mod stacks;
mod widgets; mod widgets;

View File

@ -54,12 +54,14 @@ podcasts_sources = files(
'main.rs', 'main.rs',
'manager.rs', 'manager.rs',
'settings.rs', 'settings.rs',
'utils.rs' 'utils.rs',
'window.rs',
) )
cargo_release = custom_target('cargo-build', cargo_release = custom_target('cargo-build',
build_by_default: true, build_by_default: true,
input: [ input: [
podcast_toml,
data_sources, data_sources,
downloader_sources, downloader_sources,
podcasts_sources, podcasts_sources,

View File

@ -81,11 +81,21 @@ impl WindowGeometry {
} }
pub(crate) fn write(&self, settings: &gio::Settings) { pub(crate) fn write(&self, settings: &gio::Settings) {
settings.set_int("persist-window-geometry-left", self.left); settings
settings.set_int("persist-window-geometry-top", self.top); .set_int("persist-window-geometry-left", self.left)
settings.set_int("persist-window-geometry-width", self.width); .unwrap();
settings.set_int("persist-window-geometry-height", self.height); settings
settings.set_boolean("persist-window-geometry-maximized", self.is_maximized); .set_int("persist-window-geometry-top", self.top)
.unwrap();
settings
.set_int("persist-window-geometry-width", self.width)
.unwrap();
settings
.set_int("persist-window-geometry-height", self.height)
.unwrap();
settings
.set_boolean("persist-window-geometry-maximized", self.is_maximized)
.unwrap();
} }
} }

View File

@ -54,6 +54,15 @@ impl Content {
stack.add_titled(&home.borrow().get_stack(), "home", &i18n("New")); stack.add_titled(&home.borrow().get_stack(), "home", &i18n("New"));
stack.add_titled(&shows.borrow().get_stack(), "shows", &i18n("Shows")); stack.add_titled(&shows.borrow().get_stack(), "shows", &i18n("Shows"));
stack.set_child_icon_name(
&home.borrow().get_stack(),
Some("document-open-recent-symbolic"),
);
stack.set_child_icon_name(
&shows.borrow().get_stack(),
Some("audio-input-microphone-symbolic"),
);
let con = Content { let con = Content {
stack, stack,
shows, shows,

View File

@ -90,7 +90,7 @@ impl PopulatedStack {
pub(crate) fn replace_shows(&mut self) -> Result<(), Error> { pub(crate) fn replace_shows(&mut self) -> Result<(), Error> {
let old = &self.populated.view.container().clone(); let old = &self.populated.view.container().clone();
debug!("Name: {:?}", WidgetExt::get_name(old)); debug!("Name: {:?}", old.get_widget_name());
let vadj = self.populated.view.get_vadjustment(); let vadj = self.populated.view.get_vadjustment();
let pop = ShowsView::new(self.sender.clone(), vadj); let pop = ShowsView::new(self.sender.clone(), vadj);

View File

@ -17,8 +17,8 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use gio::{resources_register, Error, Resource}; use gio::{resources_register, Resource};
use glib::Bytes; use glib::{Error, Bytes};
pub(crate) fn init() -> Result<(), Error> { pub(crate) fn init() -> Result<(), Error> {
// load the gresource binary at build time and include/link it into the final // load the gresource binary at build time and include/link it into the final

View File

@ -17,13 +17,15 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
#![cfg_attr(feature = "cargo-clippy", allow(type_complexity))] #![allow(clippy::type_complexity)]
use gdk_pixbuf::{Object, Pixbuf}; use gdk_pixbuf::Pixbuf;
use glib::clone;
use glib::{self, object::WeakRef}; use glib::{self, object::WeakRef};
use glib::{IsA, Object};
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{IsA, Widget}; use gtk::Widget;
use chrono::prelude::*; use chrono::prelude::*;
use crossbeam_channel::{bounded, unbounded, Sender}; use crossbeam_channel::{bounded, unbounded, Sender};
@ -86,7 +88,7 @@ use crate::i18n::i18n;
pub(crate) fn lazy_load<T, C, F, W, U>( pub(crate) fn lazy_load<T, C, F, W, U>(
data: T, data: T,
container: WeakRef<C>, container: WeakRef<C>,
mut contructor: F, mut constructor: F,
callback: U, callback: U,
) where ) where
T: IntoIterator + 'static, T: IntoIterator + 'static,
@ -102,7 +104,7 @@ pub(crate) fn lazy_load<T, C, F, W, U>(
None => return, None => return,
}; };
let widget = contructor(x); let widget = constructor(x);
container.add(&widget); container.add(&widget);
widget.show(); widget.show();
}; };
@ -115,7 +117,7 @@ pub(crate) fn lazy_load<T, C, F, W, U>(
/// This is a more flexible version of `lazy_load` with less constrains. /// This is a more flexible version of `lazy_load` with less constrains.
/// If you just want to lazy add `widgets` to a `container` check if /// If you just want to lazy add `widgets` to a `container` check if
/// `lazy_load` fits your needs first. /// `lazy_load` fits your needs first.
#[cfg_attr(feature = "cargo-clippy", allow(redundant_closure))] #[allow(clippy::redundant_closure)]
pub(crate) fn lazy_load_full<T, F, U>(data: T, mut func: F, finish_callback: U) pub(crate) fn lazy_load_full<T, F, U>(data: T, mut func: F, finish_callback: U)
where where
T: IntoIterator + 'static, T: IntoIterator + 'static,
@ -137,7 +139,7 @@ where
// Kudos to Julian Sparber // Kudos to Julian Sparber
// https://blogs.gnome.org/jsparber/2018/04/29/animate-a-scrolledwindow/ // https://blogs.gnome.org/jsparber/2018/04/29/animate-a-scrolledwindow/
#[cfg_attr(feature = "cargo-clippy", allow(float_cmp))] #[allow(clippy::float_cmp)]
pub(crate) fn smooth_scroll_to(view: &gtk::ScrolledWindow, target: &gtk::Adjustment) { pub(crate) fn smooth_scroll_to(view: &gtk::ScrolledWindow, target: &gtk::Adjustment) {
if let Some(adj) = view.get_vadjustment() { if let Some(adj) = view.get_vadjustment() {
if let Some(clock) = view.get_frame_clock() { if let Some(clock) = view.get_frame_clock() {
@ -182,7 +184,7 @@ pub(crate) fn ignore_show(id: i32) -> Result<bool, Error> {
.map_err(|err| format_err!("{}", err)) .map_err(|err| format_err!("{}", err))
} }
pub(crate) fn uningore_show(id: i32) -> Result<bool, Error> { pub(crate) fn unignore_show(id: i32) -> Result<bool, Error> {
IGNORESHOWS IGNORESHOWS
.lock() .lock()
.map(|mut guard| guard.remove(&id)) .map(|mut guard| guard.remove(&id))
@ -202,10 +204,10 @@ pub(crate) fn cleanup(cleanup_date: DateTime<Utc>) {
.ok(); .ok();
} }
pub(crate) fn refresh<S>(source: Option<S>, sender: Sender<Action>) /// Schedule feed refresh
where /// If `source` is None, Refreshes all sources in the database.
S: IntoIterator<Item = Source> + Send + 'static, /// Current implementation ignores update request if another update is already running
{ pub(crate) fn schedule_refresh(source: Option<Vec<Source>>, sender: Sender<Action>) {
// If we try to update the whole db, // If we try to update the whole db,
// Exit early if `source` table is empty // Exit early if `source` table is empty
if source.is_none() { if source.is_none() {
@ -219,15 +221,16 @@ where
}; };
} }
refresh_feed(source, sender) sender
.send(Action::UpdateFeed(source))
.expect("Action channel blew up somehow")
} }
/// Update the rss feed(s) originating from `source`. /// Update the rss feed(s) originating from `source`.
/// If `source` is None, Fetches all the `Source` entries in the database and updates them. /// If `source` is None, Fetches all the `Source` entries in the database and updates them.
fn refresh_feed<S>(source: Option<S>, sender: Sender<Action>) /// Do not call this function directly unless you are sure no other updates are running.
where /// Use `schedule_refresh()` instead
S: IntoIterator<Item = Source> + Send + 'static, pub(crate) fn refresh_feed(source: Option<Vec<Source>>, sender: Sender<Action>) {
{
rayon::spawn(move || { rayon::spawn(move || {
let (up_sender, up_receiver) = bounded(1); let (up_sender, up_receiver) = bounded(1);
sender sender
@ -298,7 +301,7 @@ pub(crate) fn set_image_from_path(
// If it fails another download will be scheduled. // If it fails another download will be scheduled.
if let Ok(guard) = COVER_DL_REGISTRY.read() { if let Ok(guard) = COVER_DL_REGISTRY.read() {
if guard.contains(&show_id) { if guard.contains(&show_id) {
let callback = clone!(image => move || { let callback = clone!(@weak image => @default-return glib::Continue(false), move || {
let _ = set_image_from_path(&image, show_id, size); let _ = set_image_from_path(&image, show_id, size);
glib::Continue(false) glib::Continue(false)
}); });
@ -388,7 +391,6 @@ fn lookup_id(id: u32) -> Result<String, Error> {
} }
pub(crate) fn on_import_clicked(window: &gtk::ApplicationWindow, sender: &Sender<Action>) { pub(crate) fn on_import_clicked(window: &gtk::ApplicationWindow, sender: &Sender<Action>) {
use glib::translate::ToGlib;
use gtk::{FileChooserAction, FileChooserNative, FileFilter, ResponseType}; use gtk::{FileChooserAction, FileChooserNative, FileFilter, ResponseType};
// Create the FileChooser Dialog // Create the FileChooser Dialog
@ -412,18 +414,18 @@ pub(crate) fn on_import_clicked(window: &gtk::ApplicationWindow, sender: &Sender
let resp = dialog.run(); let resp = dialog.run();
debug!("Dialog Response {}", resp); debug!("Dialog Response {}", resp);
if resp == ResponseType::Accept.to_glib() { if resp == ResponseType::Accept {
if let Some(filename) = dialog.get_filename() { if let Some(filename) = dialog.get_filename() {
debug!("File selected: {:?}", filename); debug!("File selected: {:?}", filename);
rayon::spawn(clone!(sender => move || { rayon::spawn(clone!(@strong sender => move || {
// Parse the file and import the feeds // Parse the file and import the feeds
if let Ok(sources) = opml::import_from_file(filename) { if let Ok(sources) = opml::import_from_file(filename) {
// Refresh the successfully parsed feeds to index them // Refresh the successfully parsed feeds to index them
refresh(Some(sources), sender) schedule_refresh(Some(sources), sender)
} else { } else {
let text = i18n("Failed to parse the imported file"); let text = i18n("Failed to parse the imported file");
sender.send(Action::ErrorNotification(text)).expect("Action channel blew up somehow");; sender.send(Action::ErrorNotification(text)).expect("Action channel blew up somehow");
} }
})) }))
} else { } else {
@ -436,7 +438,6 @@ pub(crate) fn on_import_clicked(window: &gtk::ApplicationWindow, sender: &Sender
} }
pub(crate) fn on_export_clicked(window: &gtk::ApplicationWindow, sender: &Sender<Action>) { pub(crate) fn on_export_clicked(window: &gtk::ApplicationWindow, sender: &Sender<Action>) {
use glib::translate::ToGlib;
use gtk::{FileChooserAction, FileChooserNative, FileFilter, ResponseType}; use gtk::{FileChooserAction, FileChooserNative, FileFilter, ResponseType};
// Create the FileChooser Dialog // Create the FileChooser Dialog
@ -460,11 +461,11 @@ pub(crate) fn on_export_clicked(window: &gtk::ApplicationWindow, sender: &Sender
let resp = dialog.run(); let resp = dialog.run();
debug!("Dialog Response {}", resp); debug!("Dialog Response {}", resp);
if resp == ResponseType::Accept.to_glib() { if resp == ResponseType::Accept {
if let Some(filename) = dialog.get_filename() { if let Some(filename) = dialog.get_filename() {
debug!("File selected: {:?}", filename); debug!("File selected: {:?}", filename);
rayon::spawn(clone!(sender => move || { rayon::spawn(clone!(@strong sender => move || {
if opml::export_from_db(filename, i18n("GNOME Podcasts Subscriptions").as_str()).is_err() { if opml::export_from_db(filename, i18n("GNOME Podcasts Subscriptions").as_str()).is_err() {
let text = i18n("Failed to export podcasts"); let text = i18n("Failed to export podcasts");
sender.send(Action::ErrorNotification(text)).expect("Action channel blew up somehow"); sender.send(Action::ErrorNotification(text)).expect("Action channel blew up somehow");

View File

@ -18,6 +18,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use glib; use glib;
use glib::clone;
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
@ -82,21 +83,17 @@ impl InAppNotification {
let notif = InAppNotification::default(); let notif = InAppNotification::default();
notif.text.set_text(&text); notif.text.set_text(&text);
let revealer_weak = notif.revealer.downgrade();
let mut time = 0; let mut time = 0;
let id = timeout_add(250, move || { let id = timeout_add(
if time < timer { 250,
time += 250; clone!(@weak notif.revealer as revealer => @default-return glib::Continue(false), move || {
return glib::Continue(true); if time < timer {
}; time += 250;
return glib::Continue(true);
let revealer = match revealer_weak.upgrade() { };
Some(r) => r, callback(revealer)
None => return glib::Continue(false), }),
}; );
callback(revealer)
});
let id = Rc::new(RefCell::new(Some(id))); let id = Rc::new(RefCell::new(Some(id)));
if undo_callback.is_some() { if undo_callback.is_some() {

View File

@ -67,7 +67,7 @@ impl BaseView {
self.scrolled_window.add(widget); self.scrolled_window.add(widget);
} }
pub(crate) fn set_adjutments<'a, 'b>( pub(crate) fn set_adjustments<'a, 'b>(
&self, &self,
hadjustment: Option<&'a Adjustment>, hadjustment: Option<&'a Adjustment>,
vadjustment: Option<&'b Adjustment>, vadjustment: Option<&'b Adjustment>,

View File

@ -18,6 +18,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use glib; use glib;
use glib::clone;
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
@ -235,16 +236,18 @@ impl EpisodeWidget {
let widget = Rc::new(Self::default()); let widget = Rc::new(Self::default());
let episode = RefCell::new(Some(episode)); let episode = RefCell::new(Some(episode));
let weak = Rc::downgrade(&widget); let weak = Rc::downgrade(&widget);
widget.container.connect_draw(clone!(sender => move |_, _| { widget
episode.borrow_mut().take().map(|ep| { .container
weak.upgrade().map(|w| w.info.init(&ep)); .connect_draw(clone!(@strong sender => move |_, _| {
Self::determine_buttons_state(&weak, &ep, &sender) episode.borrow_mut().take().map(|ep| {
.map_err(|err| error!("Error: {}", err)) weak.upgrade().map(|w| w.info.init(&ep));
.ok(); Self::determine_buttons_state(&weak, &ep, &sender)
}); .map_err(|err| error!("Error: {}", err))
.ok();
});
gtk::Inhibit(false) gtk::Inhibit(false)
})); }));
// When the widget is attached to a parent, // When the widget is attached to a parent,
// since it's a rust struct and not a widget the // since it's a rust struct and not a widget the
@ -372,7 +375,7 @@ impl EpisodeWidget {
// State: InProgress // State: InProgress
if let Some(prog) = active_dl()? { if let Some(prog) = active_dl()? {
// set a callback that will update the state when the download finishes // set a callback that will update the state when the download finishes
let callback = clone!(weak, sender => move || { let callback = clone!(@strong weak, @strong sender => move || {
if let Ok(guard) = manager::ACTIVE_DOWNLOADS.read() { if let Ok(guard) = manager::ACTIVE_DOWNLOADS.read() {
if !guard.contains_key(&id) { if !guard.contains_key(&id) {
if let Ok(ep) = dbqueries::get_episode_widget_from_rowid(id) { if let Ok(ep) = dbqueries::get_episode_widget_from_rowid(id) {
@ -393,14 +396,14 @@ impl EpisodeWidget {
widget widget
.buttons .buttons
.cancel .cancel
.connect_clicked(clone!(prog, weak, sender => move |_| { .connect_clicked(clone!(@strong prog, @strong weak, @strong sender => move |_| {
// Cancel the download // Cancel the download
if let Ok(mut m) = prog.lock() { if let Ok(mut m) = prog.lock() {
m.cancel(); m.cancel();
} }
// Cancel is not instant so we have to wait a bit // Cancel is not instant so we have to wait a bit
timeout_add(50, clone!(weak, sender => move || { timeout_add(50, clone!(@strong weak, @strong sender => move || {
if let Ok(thing) = active_dl() { if let Ok(thing) = active_dl() {
if thing.is_none() { if thing.is_none() {
// Recalculate the widget state // Recalculate the widget state
@ -441,7 +444,7 @@ impl EpisodeWidget {
widget widget
.buttons .buttons
.play .play
.connect_clicked(clone!(weak, sender => move |_| { .connect_clicked(clone!(@strong weak, @strong sender => move |_| {
if let Ok(mut ep) = dbqueries::get_episode_widget_from_rowid(id) { if let Ok(mut ep) = dbqueries::get_episode_widget_from_rowid(id) {
on_play_bttn_clicked(&weak, &mut ep, &sender) on_play_bttn_clicked(&weak, &mut ep, &sender)
.map_err(|err| error!("Error: {}", err)) .map_err(|err| error!("Error: {}", err))
@ -457,7 +460,7 @@ impl EpisodeWidget {
widget widget
.buttons .buttons
.download .download
.connect_clicked(clone!(weak, sender => move |dl| { .connect_clicked(clone!(@strong weak, @strong sender => move |dl| {
// Make the button insensitive so it won't be pressed twice // Make the button insensitive so it won't be pressed twice
dl.set_sensitive(false); dl.set_sensitive(false);
if let Ok(ep) = dbqueries::get_episode_widget_from_rowid(id) { if let Ok(ep) = dbqueries::get_episode_widget_from_rowid(id) {
@ -491,7 +494,7 @@ fn on_download_clicked(ep: &EpisodeWidgetModel, sender: &Sender<Action>) -> Resu
// Update Views // Update Views
sender sender
.send(Action::RefreshEpisodesViewBGR) .send(Action::RefreshEpisodesViewBGR)
.expect("Action channel blew up somehow");; .expect("Action channel blew up somehow");
Ok(()) Ok(())
} }
@ -512,30 +515,30 @@ fn on_play_bttn_clicked(
// Play the episode // Play the episode
sender sender
.send(Action::InitEpisode(episode.rowid())) .send(Action::InitEpisode(episode.rowid()))
.expect("Action channel blew up somehow");; .expect("Action channel blew up somehow");
// Refresh background views to match the normal/greyout title state // Refresh background views to match the normal/greyout title state
sender sender
.send(Action::RefreshEpisodesViewBGR) .send(Action::RefreshEpisodesViewBGR)
.expect("Action channel blew up somehow");; .expect("Action channel blew up somehow");
Ok(()) Ok(())
} }
// Setup a callback that will update the progress bar. // Setup a callback that will update the progress bar.
#[inline] #[inline]
#[cfg_attr(feature = "cargo-clippy", allow(if_same_then_else))] #[allow(clippy::if_same_then_else)]
fn update_progressbar_callback( fn update_progressbar_callback(
widget: &Weak<EpisodeWidget>, widget: &Weak<EpisodeWidget>,
prog: &Arc<Mutex<manager::Progress>>, prog: &Arc<Mutex<manager::Progress>>,
episode_rowid: i32, episode_rowid: i32,
) { ) {
let callback = clone!(widget, prog => move || { let callback = clone!(@strong widget,@strong prog => move || {
progress_bar_helper(&widget, &prog, episode_rowid) progress_bar_helper(&widget, &prog, episode_rowid)
.unwrap_or(glib::Continue(false)) .unwrap_or(glib::Continue(false))
}); });
timeout_add(100, callback); timeout_add(100, callback);
} }
#[allow(if_same_then_else)] #[allow(clippy::if_same_then_else)]
fn progress_bar_helper( fn progress_bar_helper(
widget: &Weak<EpisodeWidget>, widget: &Weak<EpisodeWidget>,
prog: &Arc<Mutex<manager::Progress>>, prog: &Arc<Mutex<manager::Progress>>,
@ -602,7 +605,7 @@ fn progress_bar_helper(
// relying to the RSS feed. // relying to the RSS feed.
#[inline] #[inline]
fn update_total_size_callback(widget: &Weak<EpisodeWidget>, prog: &Arc<Mutex<manager::Progress>>) { fn update_total_size_callback(widget: &Weak<EpisodeWidget>, prog: &Arc<Mutex<manager::Progress>>) {
let callback = clone!(prog, widget => move || { let callback = clone!(@strong prog, @strong widget => move || {
total_size_helper(&widget, &prog).unwrap_or(glib::Continue(true)) total_size_helper(&widget, &prog).unwrap_or(glib::Continue(true))
}); });
timeout_add(100, callback); timeout_add(100, callback);

View File

@ -22,6 +22,8 @@ use failure::Error;
use gtk::{self, prelude::*, Adjustment}; use gtk::{self, prelude::*, Adjustment};
use glib::clone;
use crossbeam_channel::Sender; use crossbeam_channel::Sender;
use libhandy::{Column, ColumnExt}; use libhandy::{Column, ColumnExt};
use podcasts_data::dbqueries; use podcasts_data::dbqueries;
@ -135,17 +137,11 @@ impl HomeView {
} }
}; };
let home_weak = Rc::downgrade(&home); let callback = clone!(@weak home => move || {
let callback = move || {
let home = match home_weak.upgrade() {
Some(h) => h,
None => return,
};
if let Some(ref v) = vadj { if let Some(ref v) = vadj {
home.view.set_adjutments(None, Some(v)) home.view.set_adjustments(None, Some(v))
}; };
}; });
lazy_load_full(episodes, func, callback); lazy_load_full(episodes, func, callback);
home.view.container().show_all(); home.view.container().show_all();

View File

@ -22,7 +22,11 @@ use gst::ClockTime;
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
use libhandy as hdy;
use libhandy::prelude::*;
use gio::{File, FileExt}; use gio::{File, FileExt};
use glib::clone;
use glib::{SignalHandlerId, WeakRef}; use glib::{SignalHandlerId, WeakRef};
use chrono::{prelude::*, NaiveTime}; use chrono::{prelude::*, NaiveTime};
@ -70,11 +74,29 @@ struct PlayerInfo {
show: gtk::Label, show: gtk::Label,
episode: gtk::Label, episode: gtk::Label,
cover: gtk::Image, cover: gtk::Image,
show_small: gtk::Label,
episode_small: gtk::Label,
cover_small: gtk::Image,
mpris: Arc<MprisPlayer>, mpris: Arc<MprisPlayer>,
episode_id: RefCell<Option<i32>>, episode_id: RefCell<Option<i32>>,
} }
impl PlayerInfo { impl PlayerInfo {
fn create_bindings(&self) {
self.show
.bind_property("label", &self.show_small, "label")
.flags(glib::BindingFlags::SYNC_CREATE)
.build();
self.episode
.bind_property("label", &self.episode_small, "label")
.flags(glib::BindingFlags::SYNC_CREATE)
.build();
self.cover
.bind_property("pixbuf", &self.cover_small, "pixbuf")
.flags(glib::BindingFlags::SYNC_CREATE)
.build();
}
// FIXME: create a Diesel Model of the joined episode and podcast query instead // FIXME: create a Diesel Model of the joined episode and podcast query instead
fn init(&self, episode: &EpisodeWidgetModel, podcast: &ShowCoverModel) { fn init(&self, episode: &EpisodeWidgetModel, podcast: &ShowCoverModel) {
self.episode_id.replace(Some(episode.rowid())); self.episode_id.replace(Some(episode.rowid()));
@ -118,6 +140,7 @@ struct PlayerTimes {
separator: gtk::Label, separator: gtk::Label,
slider: gtk::Scale, slider: gtk::Scale,
slider_update: Rc<SignalHandlerId>, slider_update: Rc<SignalHandlerId>,
progress_bar: gtk::ProgressBar,
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
@ -150,6 +173,8 @@ impl PlayerTimes {
self.slider.unblock_signal(&self.slider_update); self.slider.unblock_signal(&self.slider_update);
self.duration.set_text(&format_duration(seconds as u32)); self.duration.set_text(&format_duration(seconds as u32));
self.update_progress_bar();
} }
/// Update the `gtk::Scale` bar when the pipeline position is changed. /// Update the `gtk::Scale` bar when the pipeline position is changed.
@ -161,6 +186,13 @@ impl PlayerTimes {
self.slider.unblock_signal(&self.slider_update); self.slider.unblock_signal(&self.slider_update);
self.progressed.set_text(&format_duration(seconds as u32)); self.progressed.set_text(&format_duration(seconds as u32));
self.update_progress_bar();
}
fn update_progress_bar(&self) {
let fraction = self.slider.get_value() / self.slider.get_adjustment().get_upper();
self.progress_bar.set_fraction(fraction);
} }
} }
@ -176,29 +208,231 @@ fn format_duration(seconds: u32) -> String {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct PlayerRate { struct PlayerRate {
radio150: gtk::RadioButton, radio400: gtk::ModelButton,
radio125: gtk::RadioButton, radio375: gtk::ModelButton,
radio_normal: gtk::RadioButton, radio350: gtk::ModelButton,
radio325: gtk::ModelButton,
radio300: gtk::ModelButton,
radio275: gtk::ModelButton,
radio250: gtk::ModelButton,
radio225: gtk::ModelButton,
radio200: gtk::ModelButton,
radio175: gtk::ModelButton,
radio150: gtk::ModelButton,
radio125: gtk::ModelButton,
radio_normal: gtk::ModelButton,
popover: gtk::Popover, popover: gtk::Popover,
btn: gtk::MenuButton, btn: gtk::MenuButton,
label: gtk::Label, label: gtk::Label,
} }
impl PlayerRate {
fn new() -> Self {
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/player_rate.ui");
let radio400: gtk::ModelButton = builder.get_object("rate_4_00").unwrap();
let radio375: gtk::ModelButton = builder.get_object("rate_3_75").unwrap();
let radio350: gtk::ModelButton = builder.get_object("rate_3_50").unwrap();
let radio325: gtk::ModelButton = builder.get_object("rate_3_25").unwrap();
let radio300: gtk::ModelButton = builder.get_object("rate_3_00").unwrap();
let radio275: gtk::ModelButton = builder.get_object("rate_2_75").unwrap();
let radio250: gtk::ModelButton = builder.get_object("rate_2_50").unwrap();
let radio225: gtk::ModelButton = builder.get_object("rate_2_25").unwrap();
let radio200: gtk::ModelButton = builder.get_object("rate_2_00").unwrap();
let radio175: gtk::ModelButton = builder.get_object("rate_1_75").unwrap();
let radio150: gtk::ModelButton = builder.get_object("rate_1_50").unwrap();
let radio125: gtk::ModelButton = builder.get_object("rate_1_25").unwrap();
let radio_normal: gtk::ModelButton = builder.get_object("normal_rate").unwrap();
let popover = builder.get_object("rate_popover").unwrap();
let btn = builder.get_object("rate_button").unwrap();
let label = builder.get_object("rate_label").unwrap();
PlayerRate {
radio400,
radio375,
radio350,
radio325,
radio300,
radio275,
radio250,
radio225,
radio200,
radio175,
radio150,
radio125,
radio_normal,
popover,
label,
btn,
}
}
fn set_rate(&self, rate: f64) {
self.label.set_text(&format!("{:.2}×", rate));
self.radio_normal.set_property_active(rate == 1.0);
self.radio125.set_property_active(rate == 1.25);
self.radio150.set_property_active(rate == 1.5);
self.radio175.set_property_active(rate == 1.75);
self.radio200.set_property_active(rate == 2.0);
self.radio225.set_property_active(rate == 2.25);
self.radio250.set_property_active(rate == 2.5);
self.radio275.set_property_active(rate == 2.75);
self.radio300.set_property_active(rate == 3.0);
self.radio325.set_property_active(rate == 3.25);
self.radio350.set_property_active(rate == 3.5);
self.radio375.set_property_active(rate == 3.75);
self.radio400.set_property_active(rate == 4.0);
}
fn connect_signals(&self, widget: &Rc<PlayerWidget>) {
self.radio_normal
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(1.00);
}));
self.radio125
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(1.25);
}));
self.radio150
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(1.50);
}));
self.radio175
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(1.75);
}));
self.radio200
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(2.00);
}));
self.radio225
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(2.25);
}));
self.radio250
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(2.50);
}));
self.radio275
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(2.75);
}));
self.radio300
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(3.00);
}));
self.radio325
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(3.25);
}));
self.radio350
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(3.50);
}));
self.radio375
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(3.75);
}));
self.radio400
.connect_clicked(clone!(@weak widget => move |_| {
widget.on_rate_changed(4.00);
}));
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct PlayerControls { struct PlayerControls {
container: gtk::Box, container: gtk::Box,
play: gtk::Button, play: gtk::Button,
pause: gtk::Button, pause: gtk::Button,
play_small: gtk::Button,
pause_small: gtk::Button,
play_pause_small: gtk::Stack,
forward: gtk::Button, forward: gtk::Button,
rewind: gtk::Button, rewind: gtk::Button,
last_pause: RefCell<Option<DateTime<Local>>>, last_pause: RefCell<Option<DateTime<Local>>>,
} }
#[derive(Debug, Clone)]
struct PlayerDialog {
dialog: hdy::Dialog,
close: gtk::Button,
headerbar: hdy::HeaderBar,
cover: gtk::Image,
play_pause: gtk::Stack,
play: gtk::Button,
pause: gtk::Button,
duration: gtk::Label,
progressed: gtk::Label,
slider: gtk::Scale,
forward: gtk::Button,
rewind: gtk::Button,
rate: PlayerRate,
show: gtk::Label,
episode: gtk::Label,
}
impl PlayerDialog {
fn new(rate: PlayerRate) -> Self {
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/player_dialog.ui");
let dialog = builder.get_object("dialog").unwrap();
let close = builder.get_object("close").unwrap();
let headerbar = builder.get_object("headerbar").unwrap();
let cover = builder.get_object("cover").unwrap();
let play_pause = builder.get_object("play_pause").unwrap();
let play = builder.get_object("play").unwrap();
let pause = builder.get_object("pause").unwrap();
let duration = builder.get_object("duration").unwrap();
let progressed = builder.get_object("progressed").unwrap();
let slider = builder.get_object("slider").unwrap();
let rewind = builder.get_object("rewind").unwrap();
let forward = builder.get_object("forward").unwrap();
let bottom: gtk::Box = builder.get_object("bottom").unwrap();
let show = builder.get_object("show_label").unwrap();
let episode = builder.get_object("episode_label").unwrap();
bottom.pack_start(&rate.btn, false, true, 0);
PlayerDialog {
dialog,
close,
headerbar,
cover,
play_pause,
play,
pause,
duration,
progressed,
slider,
forward,
rewind,
rate,
show,
episode,
}
}
fn initialize_episode(&self, episode: &EpisodeWidgetModel, show: &ShowCoverModel) {
self.episode.set_text(episode.title());
self.show.set_text(show.title());
set_image_from_path(&self.cover, show.id(), 256)
.map_err(|err| error!("Player Cover: {}", err))
.ok();
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub(crate) struct PlayerWidget { pub(crate) struct PlayerWidget {
pub(crate) action_bar: gtk::ActionBar, pub(crate) container: gtk::Box,
action_bar: gtk::ActionBar,
evbox: gtk::EventBox,
player: gst_player::Player, player: gst_player::Player,
controls: PlayerControls, controls: PlayerControls,
dialog: PlayerDialog,
full: gtk::Box,
squeezer: hdy::Squeezer,
timer: PlayerTimes, timer: PlayerTimes,
info: PlayerInfo, info: PlayerInfo,
rate: PlayerRate, rate: PlayerRate,
@ -213,6 +447,10 @@ impl Default for PlayerWidget {
Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()), Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()),
); );
// A few podcasts have a video track of the thumbnail, which GStreamer displays in a new
// window. Make sure it doesn't do that.
player.set_video_track_enabled(false);
let mpris = MprisPlayer::new( let mpris = MprisPlayer::new(
APP_ID.to_string(), APP_ID.to_string(),
"GNOME Podcasts".to_string(), "GNOME Podcasts".to_string(),
@ -229,18 +467,23 @@ impl Default for PlayerWidget {
player.set_config(config).unwrap(); player.set_config(config).unwrap();
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/player_toolbar.ui"); let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/player_toolbar.ui");
let action_bar = builder.get_object("action_bar").unwrap();
let buttons = builder.get_object("buttons").unwrap(); let buttons = builder.get_object("buttons").unwrap();
let play = builder.get_object("play_button").unwrap(); let play = builder.get_object("play_button").unwrap();
let pause = builder.get_object("pause_button").unwrap(); let pause = builder.get_object("pause_button").unwrap();
let play_small = builder.get_object("play_button_small").unwrap();
let pause_small = builder.get_object("pause_button_small").unwrap();
let forward: gtk::Button = builder.get_object("ff_button").unwrap(); let forward: gtk::Button = builder.get_object("ff_button").unwrap();
let rewind: gtk::Button = builder.get_object("rewind_button").unwrap(); let rewind: gtk::Button = builder.get_object("rewind_button").unwrap();
let play_pause_small = builder.get_object("play_pause_small").unwrap();
let controls = PlayerControls { let controls = PlayerControls {
container: buttons, container: buttons,
play, play,
pause, pause,
play_small,
pause_small,
play_pause_small,
forward, forward,
rewind, rewind,
last_pause: RefCell::new(None), last_pause: RefCell::new(None),
@ -254,6 +497,7 @@ impl Default for PlayerWidget {
slider.set_range(0.0, 1.0); slider.set_range(0.0, 1.0);
let player_weak = player.downgrade(); let player_weak = player.downgrade();
let slider_update = Rc::new(Self::connect_update_slider(&slider, player_weak)); let slider_update = Rc::new(Self::connect_update_slider(&slider, player_weak));
let progress_bar = builder.get_object("progress_bar").unwrap();
let timer = PlayerTimes { let timer = PlayerTimes {
container: timer_container, container: timer_container,
progressed, progressed,
@ -261,40 +505,50 @@ impl Default for PlayerWidget {
separator, separator,
slider, slider,
slider_update, slider_update,
progress_bar,
}; };
let labels = builder.get_object("info").unwrap(); let labels = builder.get_object("info").unwrap();
let show = builder.get_object("show_label").unwrap(); let show = builder.get_object("show_label").unwrap();
let episode = builder.get_object("episode_label").unwrap(); let episode = builder.get_object("episode_label").unwrap();
let cover = builder.get_object("show_cover").unwrap(); let cover = builder.get_object("show_cover").unwrap();
let show_small = builder.get_object("show_label_small").unwrap();
let episode_small = builder.get_object("episode_label_small").unwrap();
let cover_small = builder.get_object("show_cover_small").unwrap();
let info = PlayerInfo { let info = PlayerInfo {
mpris, mpris,
container: labels, container: labels,
show, show,
episode, episode,
cover, cover,
show_small,
episode_small,
cover_small,
episode_id: RefCell::new(None), episode_id: RefCell::new(None),
}; };
info.create_bindings();
let radio150 = builder.get_object("rate_1_50").unwrap(); let dialog_rate = PlayerRate::new();
let radio125 = builder.get_object("rate_1_25").unwrap(); let dialog = PlayerDialog::new(dialog_rate);
let radio_normal = builder.get_object("normal_rate").unwrap();
let popover = builder.get_object("rate_popover").unwrap(); let container = builder.get_object("container").unwrap();
let btn = builder.get_object("rate_button").unwrap(); let action_bar: gtk::ActionBar = builder.get_object("action_bar").unwrap();
let label = builder.get_object("rate_label").unwrap(); let evbox = builder.get_object("evbox").unwrap();
let rate = PlayerRate { let full: gtk::Box = builder.get_object("full").unwrap();
radio150, let squeezer = builder.get_object("squeezer").unwrap();
radio125,
radio_normal, let rate = PlayerRate::new();
popover, full.pack_end(&rate.btn, false, true, 0);
label,
btn,
};
PlayerWidget { PlayerWidget {
player, player,
container,
action_bar, action_bar,
evbox,
controls, controls,
dialog,
full,
squeezer,
timer, timer,
info, info,
rate, rate,
@ -305,7 +559,8 @@ impl Default for PlayerWidget {
impl PlayerWidget { impl PlayerWidget {
fn on_rate_changed(&self, rate: f64) { fn on_rate_changed(&self, rate: f64) {
self.set_playback_rate(rate); self.set_playback_rate(rate);
self.rate.label.set_text(&format!("{:.2}×", rate)); self.rate.set_rate(rate);
self.dialog.rate.set_rate(rate);
} }
fn reveal(&self) { fn reveal(&self) {
@ -316,6 +571,8 @@ impl PlayerWidget {
let ep = dbqueries::get_episode_widget_from_rowid(rowid)?; let ep = dbqueries::get_episode_widget_from_rowid(rowid)?;
let pd = dbqueries::get_podcast_cover_from_id(ep.show_id())?; let pd = dbqueries::get_podcast_cover_from_id(ep.show_id())?;
self.dialog.initialize_episode(&ep, &pd);
self.info.init(&ep, &pd); self.info.init(&ep, &pd);
// Currently that will always be the case since the play button is // Currently that will always be the case since the play button is
// only shown if the file is downloaded // only shown if the file is downloaded
@ -327,8 +584,10 @@ impl PlayerWidget {
let uri = File::new_for_path(path).get_uri(); let uri = File::new_for_path(path).get_uri();
// play the file // play the file
self.player.set_uri(uri.as_str()); self.player.set_uri(uri.as_str());
self.rate.radio_normal.set_active(true); self.rate.set_rate(1.0);
self.dialog.rate.set_rate(1.0);
self.play(); self.play();
return Ok(()); return Ok(());
} }
// TODO: log an error // TODO: log an error
@ -387,10 +646,15 @@ impl PlayerWidget {
impl PlayerExt for PlayerWidget { impl PlayerExt for PlayerWidget {
fn play(&self) { fn play(&self) {
self.dialog.play_pause.set_visible_child(&self.dialog.pause);
self.reveal(); self.reveal();
self.controls.pause.show(); self.controls.pause.show();
self.controls.play.hide(); self.controls.play.hide();
self.controls
.play_pause_small
.set_visible_child(&self.controls.pause_small);
self.smart_rewind(); self.smart_rewind();
self.player.play(); self.player.play();
@ -398,8 +662,13 @@ impl PlayerExt for PlayerWidget {
} }
fn pause(&self) { fn pause(&self) {
self.dialog.play_pause.set_visible_child(&self.dialog.play);
self.controls.pause.hide(); self.controls.pause.hide();
self.controls.play.show(); self.controls.play.show();
self.controls
.play_pause_small
.set_visible_child(&self.controls.play_small);
self.player.pause(); self.player.pause();
self.info.mpris.set_playback_status(PlaybackStatus::Paused); self.info.mpris.set_playback_status(PlaybackStatus::Paused);
@ -409,6 +678,7 @@ impl PlayerExt for PlayerWidget {
#[cfg_attr(rustfmt, rustfmt_skip)] #[cfg_attr(rustfmt, rustfmt_skip)]
fn stop(&self) { fn stop(&self) {
self.controls.pause.hide(); self.controls.pause.hide();
self.controls.play.show(); self.controls.play.show();
@ -491,36 +761,142 @@ impl PlayerWrapper {
self.connect_rate_buttons(); self.connect_rate_buttons();
self.connect_mpris_buttons(sender); self.connect_mpris_buttons(sender);
self.connect_gst_signals(sender); self.connect_gst_signals(sender);
self.connect_dialog();
}
fn connect_dialog(&self) {
let this = self.deref();
self.squeezer
.connect_property_visible_child_notify(clone!(@weak this => move |_| {
if let Some(child) = this.squeezer.get_visible_child() {
let full = child == this.full;
this.timer.progress_bar.set_visible(!full);
if full {
this.action_bar.get_style_context().remove_class("player-small");
} else {
this.action_bar.get_style_context().add_class("player-small");
}
}
}));
self.timer
.duration
.bind_property("label", &self.dialog.duration, "label")
.flags(glib::BindingFlags::SYNC_CREATE)
.build();
self.timer
.progressed
.bind_property("label", &self.dialog.progressed, "label")
.flags(glib::BindingFlags::SYNC_CREATE)
.build();
self.dialog
.slider
.set_adjustment(&self.timer.slider.get_adjustment());
self.evbox.connect_button_press_event(
clone!(@weak this => @default-return Inhibit(false), move |_, event| {
if event.get_button() != 1 {
return Inhibit(false);
}
// only open the dialog when the small toolbar is visible
if let Some(child) = this.squeezer.get_visible_child() {
if child == this.full {
return Inhibit(false);
}
}
let parent = this.container.get_toplevel().and_then(|toplevel| {
toplevel
.downcast::<gtk::Window>()
.ok()
}).unwrap();
info!("showing dialog");
this.dialog.dialog.set_transient_for(Some(&parent));
this.dialog.dialog.show();
Inhibit(false)
}),
);
self.dialog
.close
.connect_clicked(clone!(@weak this => move |_| {
this.dialog.dialog.hide();
}));
} }
/// Connect the `PlayerControls` buttons to the `PlayerExt` methods. /// Connect the `PlayerControls` buttons to the `PlayerExt` methods.
fn connect_control_buttons(&self) { fn connect_control_buttons(&self) {
let weak = Rc::downgrade(self); let this = self.deref();
// Connect the play button to the gst Player. // Connect the play button to the gst Player.
self.controls.play.connect_clicked(clone!(weak => move |_| { self.controls
weak.upgrade().map(|p| p.play()); .play
})); .connect_clicked(clone!(@weak this => move |_| {
this.play();
}));
// Connect the pause button to the gst Player. // Connect the pause button to the gst Player.
self.controls self.controls
.pause .pause
.connect_clicked(clone!(weak => move |_| { .connect_clicked(clone!(@weak this => move |_| {
weak.upgrade().map(|p| p.pause()); this.pause();
}));
// Connect the play button to the gst Player.
self.controls
.play_small
.connect_clicked(clone!(@weak this => move |_| {
this.play();
}));
// Connect the pause button to the gst Player.
self.controls
.pause_small
.connect_clicked(clone!(@weak this => move |_| {
this.pause();
})); }));
// Connect the rewind button to the gst Player. // Connect the rewind button to the gst Player.
self.controls self.controls
.rewind .rewind
.connect_clicked(clone!(weak => move |_| { .connect_clicked(clone!(@weak this => move |_| {
weak.upgrade().map(|p| p.rewind()); this.rewind();
})); }));
// Connect the fast-forward button to the gst Player. // Connect the fast-forward button to the gst Player.
self.controls self.controls
.forward .forward
.connect_clicked(clone!(weak => move |_| { .connect_clicked(clone!(@weak this => move |_| {
weak.upgrade().map(|p| p.fast_forward()); this.fast_forward();
}));
// Connect the play button to the gst Player.
self.dialog
.play
.connect_clicked(clone!(@weak this => move |_| {
this.play();
}));
// Connect the pause button to the gst Player.
self.dialog
.pause
.connect_clicked(clone!(@weak this => move |_| {
this.pause();
}));
// Connect the rewind button to the gst Player.
self.dialog
.rewind
.connect_clicked(clone!(@weak this => move |_| {
this.rewind();
}));
// Connect the fast-forward button to the gst Player.
self.dialog
.forward
.connect_clicked(clone!(@weak this => move |_| {
this.fast_forward();
})); }));
} }
@ -530,7 +906,7 @@ impl PlayerWrapper {
self.player.connect_warning(move |_, warn| warn!("gst warning: {}", warn)); self.player.connect_warning(move |_, warn| warn!("gst warning: {}", warn));
// Log gst errors. // Log gst errors.
self.player.connect_error(clone!(sender => move |_, _error| { self.player.connect_error(clone!(@strong sender => move |_, _error| {
// sender.send(Action::ErrorNotification(format!("Player Error: {}", error))); // sender.send(Action::ErrorNotification(format!("Player Error: {}", error)));
let s = i18n("The media player was unable to execute an action."); let s = i18n("The media player was unable to execute an action.");
sender.send(Action::ErrorNotification(s)).expect("Action channel blew up somehow"); sender.send(Action::ErrorNotification(s)).expect("Action channel blew up somehow");
@ -540,21 +916,21 @@ impl PlayerWrapper {
let weak = Fragile::new(Rc::downgrade(self)); let weak = Fragile::new(Rc::downgrade(self));
// Update the duration label and the slider // Update the duration label and the slider
self.player.connect_duration_changed(clone!(weak => move |_, clock| { self.player.connect_duration_changed(clone!(@strong weak => move |_, clock| {
weak.get() weak.get()
.upgrade() .upgrade()
.map(|p| p.timer.on_duration_changed(Duration(clock))); .map(|p| p.timer.on_duration_changed(Duration(clock)));
})); }));
// Update the position label and the slider // Update the position label and the slider
self.player.connect_position_updated(clone!(weak => move |_, clock| { self.player.connect_position_updated(clone!(@strong weak => move |_, clock| {
weak.get() weak.get()
.upgrade() .upgrade()
.map(|p| p.timer.on_position_updated(Position(clock))); .map(|p| p.timer.on_position_updated(Position(clock)));
})); }));
// Reset the slider to 0 and show a play button // Reset the slider to 0 and show a play button
self.player.connect_end_of_stream(clone!(weak => move |_| { self.player.connect_end_of_stream(clone!(@strong weak => move |_| {
weak.get() weak.get()
.upgrade() .upgrade()
.map(|p| p.stop()); .map(|p| p.stop());
@ -563,25 +939,8 @@ impl PlayerWrapper {
#[cfg_attr(rustfmt, rustfmt_skip)] #[cfg_attr(rustfmt, rustfmt_skip)]
fn connect_rate_buttons(&self) { fn connect_rate_buttons(&self) {
let weak = Rc::downgrade(self); self.rate.connect_signals(self);
self.dialog.rate.connect_signals(self);
self.rate
.radio_normal
.connect_toggled(clone!(weak => move |_| {
weak.upgrade().map(|p| p.on_rate_changed(1.00));
}));
self.rate
.radio125
.connect_toggled(clone!(weak => move |_| {
weak.upgrade().map(|p| p.on_rate_changed(1.25));
}));
self.rate
.radio150
.connect_toggled(clone!(weak => move |_| {
weak.upgrade().map(|p| p.on_rate_changed(1.50));
}));
} }
fn connect_mpris_buttons(&self, sender: &Sender<Action>) { fn connect_mpris_buttons(&self, sender: &Sender<Action>) {
@ -589,49 +948,60 @@ impl PlayerWrapper {
// FIXME: Reference cycle with mpris // FIXME: Reference cycle with mpris
let mpris = self.info.mpris.clone(); let mpris = self.info.mpris.clone();
self.info.mpris.connect_play_pause(clone!(weak => move || { self.info
let player = match weak.upgrade() { .mpris
Some(s) => s, .connect_play_pause(clone!(@strong weak => move || {
None => return let player = match weak.upgrade() {
}; Some(s) => s,
None => return
if let Ok(status) = mpris.get_playback_status() {
match status.as_ref() {
"Paused" => player.play(),
"Stopped" => player.play(),
_ => player.pause(),
}; };
}
}));
self.info.mpris.connect_play(clone!(weak => move || { if let Ok(status) = mpris.get_playback_status() {
let player = match weak.upgrade() { match status.as_ref() {
Some(s) => s, "Paused" => player.play(),
None => return "Stopped" => player.play(),
}; _ => player.pause(),
};
}
}));
self.info
.mpris
.connect_play(clone!(@strong weak => move || {
let player = match weak.upgrade() {
Some(s) => s,
None => return
};
player.play(); player.play();
})); }));
self.info.mpris.connect_pause(clone!(weak => move || { self.info
let player = match weak.upgrade() { .mpris
Some(s) => s, .connect_pause(clone!(@strong weak => move || {
None => return let player = match weak.upgrade() {
}; Some(s) => s,
None => return
};
player.pause(); player.pause();
})); }));
self.info.mpris.connect_next(clone!(weak => move || { self.info
weak.upgrade().map(|p| p.fast_forward()); .mpris
})); .connect_next(clone!(@strong weak => move || {
weak.upgrade().map(|p| p.fast_forward());
}));
self.info.mpris.connect_previous(clone!(weak => move || { self.info
weak.upgrade().map(|p| p.rewind()); .mpris
})); .connect_previous(clone!(@strong weak => move || {
weak.upgrade().map(|p| p.rewind());
}));
self.info.mpris.connect_raise(clone!(sender => move || { self.info
sender.send(Action::RaiseWindow).expect("Action channel blew up somehow"); .mpris
})); .connect_raise(clone!(@strong sender => move || {
sender.send(Action::RaiseWindow).expect("Action channel blew up somehow");
}));
} }
} }

View File

@ -18,6 +18,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use glib; use glib;
use glib::clone;
use gtk::{self, prelude::*, Adjustment}; use gtk::{self, prelude::*, Adjustment};
use crossbeam_channel::{bounded, Sender}; use crossbeam_channel::{bounded, Sender};
@ -43,6 +44,10 @@ pub(crate) struct ShowWidget {
pub(crate) view: BaseView, pub(crate) view: BaseView,
cover: gtk::Image, cover: gtk::Image,
description: gtk::Label, description: gtk::Label,
description_short: gtk::Label,
description_stack: gtk::Stack,
description_button: gtk::Button,
description_button_revealer: gtk::Revealer,
episodes: gtk::ListBox, episodes: gtk::ListBox,
show_id: Option<i32>, show_id: Option<i32>,
} }
@ -53,6 +58,11 @@ impl Default for ShowWidget {
let sub_cont: gtk::Box = builder.get_object("sub_container").unwrap(); let sub_cont: gtk::Box = builder.get_object("sub_container").unwrap();
let cover: gtk::Image = builder.get_object("cover").unwrap(); let cover: gtk::Image = builder.get_object("cover").unwrap();
let description: gtk::Label = builder.get_object("description").unwrap(); let description: gtk::Label = builder.get_object("description").unwrap();
let description_short: gtk::Label = builder.get_object("description_short").unwrap();
let description_stack: gtk::Stack = builder.get_object("description_stack").unwrap();
let description_button: gtk::Button = builder.get_object("description_button").unwrap();
let description_button_revealer =
builder.get_object("description_button_revealer").unwrap();
let episodes = builder.get_object("episodes").unwrap(); let episodes = builder.get_object("episodes").unwrap();
let view = BaseView::default(); let view = BaseView::default();
@ -71,6 +81,10 @@ impl Default for ShowWidget {
view, view,
cover, cover,
description, description,
description_short,
description_stack,
description_button,
description_button_revealer,
episodes, episodes,
show_id: None, show_id: None,
} }
@ -95,6 +109,16 @@ impl ShowWidget {
let res = populate_listbox(&pdw, pd.clone(), sender, vadj); let res = populate_listbox(&pdw, pd.clone(), sender, vadj);
debug_assert!(res.is_ok()); debug_assert!(res.is_ok());
pdw.description_short
.connect_size_allocate(clone!(@weak pdw => move |_, _2| {
pdw.update_read_more();
}));
pdw.description_button
.connect_clicked(clone!(@weak pdw => move |_| {
pdw.description_stack.set_visible_child_name("full");
}));
pdw pdw
} }
@ -111,10 +135,31 @@ impl ShowWidget {
utils::set_image_from_path(&self.cover, pd.id(), 256) utils::set_image_from_path(&self.cover, pd.id(), 256)
} }
fn update_read_more(&self) {
if let Some(layout) = self.description_short.get_layout() {
let more = layout.is_ellipsized()
|| self.description.get_label() != self.description_short.get_label();
self.description_button_revealer.set_reveal_child(more);
}
}
/// Set the description text. /// Set the description text.
fn set_description(&self, text: &str) { fn set_description(&self, text: &str) {
self.description let markup = html2text::from_read(text.as_bytes(), text.as_bytes().len());
.set_markup(html2text::from_read(text.as_bytes(), 80).trim()); let markup = markup.trim();
let lines: Vec<&str> = markup.lines().collect();
if markup.is_empty() {
self.description_stack.set_visible(false);
} else {
self.description_stack.set_visible(true);
self.description.set_markup(markup);
debug_assert!(lines.len() > 0);
if lines.len() > 0 {
self.description_short.set_markup(lines[0]);
}
}
} }
pub(crate) fn show_id(&self) -> Option<i32> { pub(crate) fn show_id(&self) -> Option<i32> {
@ -134,7 +179,7 @@ fn populate_listbox(
let count = dbqueries::get_pd_episodes_count(&pd)?; let count = dbqueries::get_pd_episodes_count(&pd)?;
let (sender_, receiver) = bounded(1); let (sender_, receiver) = bounded(1);
rayon::spawn(clone!(pd => move || { rayon::spawn(clone!(@strong pd => move || {
if let Ok(episodes) = dbqueries::get_pd_episodeswidgets(&pd) { if let Ok(episodes) = dbqueries::get_pd_episodeswidgets(&pd) {
// The receiver can be dropped if there's an early return // The receiver can be dropped if there's an early return
// like on show without episodes for example. // like on show without episodes for example.
@ -159,13 +204,13 @@ fn populate_listbox(
debug_assert!(episodes.len() as i64 == count); debug_assert!(episodes.len() as i64 == count);
let constructor = clone!(sender => move |ep| { let constructor = clone!(@strong sender => move |ep| {
EpisodeWidget::new(ep, &sender).container.clone() EpisodeWidget::new(ep, &sender).container.clone()
}); });
let callback = clone!(show_weak, vadj => move || { let callback = clone!(@strong show_weak, @strong vadj => move || {
match (show_weak.upgrade(), &vadj) { match (show_weak.upgrade(), &vadj) {
(Some(ref shows), Some(ref v)) => shows.view.set_adjutments(None, Some(v)), (Some(ref shows), Some(ref v)) => shows.view.set_adjustments(None, Some(v)),
_ => (), _ => (),
}; };
}); });

View File

@ -18,6 +18,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use glib; use glib;
use glib::clone;
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
@ -78,7 +79,7 @@ impl ShowMenu {
fn connect_website(&self, pd: &Arc<Show>) { fn connect_website(&self, pd: &Arc<Show>) {
self.website.set_tooltip_text(Some(pd.link())); self.website.set_tooltip_text(Some(pd.link()));
self.website.connect_clicked(clone!(pd => move |_| { self.website.connect_clicked(clone!(@strong pd => move |_| {
let link = pd.link(); let link = pd.link();
info!("Opening link: {}", link); info!("Opening link: {}", link);
let res = open::that(link); let res = open::that(link);
@ -87,13 +88,7 @@ impl ShowMenu {
} }
fn connect_played(&self, pd: &Arc<Show>, episodes: &gtk::ListBox, sender: &Sender<Action>) { fn connect_played(&self, pd: &Arc<Show>, episodes: &gtk::ListBox, sender: &Sender<Action>) {
let episodes_weak = episodes.downgrade(); self.played.connect_clicked(clone!(@strong pd, @strong sender, @weak episodes => move |_| {
self.played.connect_clicked(clone!(pd, sender => move |_| {
let episodes = match episodes_weak.upgrade() {
Some(e) => e,
None => return,
};
let res = dim_titles(&episodes); let res = dim_titles(&episodes);
debug_assert!(res.is_some()); debug_assert!(res.is_some());
@ -103,7 +98,7 @@ impl ShowMenu {
fn connect_unsub(&self, pd: &Arc<Show>, sender: &Sender<Action>) { fn connect_unsub(&self, pd: &Arc<Show>, sender: &Sender<Action>) {
self.unsub self.unsub
.connect_clicked(clone!(pd, sender => move |unsub| { .connect_clicked(clone!(@strong pd, @strong sender => move |unsub| {
// hack to get away without properly checking for none. // hack to get away without properly checking for none.
// if pressed twice would panic. // if pressed twice would panic.
unsub.set_sensitive(false); unsub.set_sensitive(false);
@ -173,7 +168,7 @@ pub(crate) fn mark_all_notif(pd: Arc<Show>, sender: &Sender<Action>) -> InAppNot
glib::Continue(false) glib::Continue(false)
}; };
let undo_callback = clone!(sender => move || { let undo_callback = clone!(@strong sender => move || {
sender.send(Action::RefreshWidgetIfSame(id)).expect("Action channel blew up somehow") sender.send(Action::RefreshWidgetIfSame(id)).expect("Action channel blew up somehow")
}); });
let text = i18n("Marked all episodes as listened"); let text = i18n("Marked all episodes as listened");
@ -189,11 +184,11 @@ pub(crate) fn remove_show_notif(pd: Arc<Show>, sender: Sender<Action>) -> InAppN
let sender_ = sender.clone(); let sender_ = sender.clone();
let pd_ = pd.clone(); let pd_ = pd.clone();
let callback = move |revealer: gtk::Revealer| { let callback = move |revealer: gtk::Revealer| {
let res = utils::uningore_show(pd_.id()); let res = utils::unignore_show(pd_.id());
debug_assert!(res.is_ok()); debug_assert!(res.is_ok());
// Spawn a thread so it won't block the ui. // Spawn a thread so it won't block the ui.
rayon::spawn(clone!(pd_, sender_ => move || { rayon::spawn(clone!(@strong pd_, @strong sender_ => move || {
delete_show(&pd_) delete_show(&pd_)
.map_err(|err| error!("Error: {}", err)) .map_err(|err| error!("Error: {}", err))
.map_err(|_| error!("Failed to delete {}", pd_.title())) .map_err(|_| error!("Failed to delete {}", pd_.title()))
@ -207,7 +202,7 @@ pub(crate) fn remove_show_notif(pd: Arc<Show>, sender: Sender<Action>) -> InAppN
}; };
let undo_callback = move || { let undo_callback = move || {
let res = utils::uningore_show(pd.id()); let res = utils::unignore_show(pd.id());
debug_assert!(res.is_ok()); debug_assert!(res.is_ok());
sender sender
.send(Action::RefreshShowsView) .send(Action::RefreshShowsView)

View File

@ -17,6 +17,7 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use glib::clone;
use gtk::{self, prelude::*, Adjustment, Align, SelectionMode}; use gtk::{self, prelude::*, Adjustment, Align, SelectionMode};
use crossbeam_channel::Sender; use crossbeam_channel::Sender;
@ -83,16 +84,14 @@ impl ShowsView {
fn populate_flowbox(shows: &Rc<ShowsView>, vadj: Option<Adjustment>) -> Result<(), Error> { fn populate_flowbox(shows: &Rc<ShowsView>, vadj: Option<Adjustment>) -> Result<(), Error> {
let ignore = get_ignored_shows()?; let ignore = get_ignored_shows()?;
let podcasts = dbqueries::get_podcasts_filter(&ignore)?; let podcasts = dbqueries::get_podcasts_filter(&ignore)?;
let show_weak = Rc::downgrade(&shows);
let flowbox_weak = shows.flowbox.downgrade(); let flowbox_weak = shows.flowbox.downgrade();
let constructor = move |parent| ShowsChild::new(&parent).child; let constructor = move |parent| ShowsChild::new(&parent).child;
let callback = move || { let callback = clone!(@weak shows => move || {
match (show_weak.upgrade(), &vadj) { if vadj.is_some() {
(Some(ref shows), Some(ref v)) => shows.view.set_adjutments(None, Some(v)), shows.view.set_adjustments(None, vadj.as_ref())
_ => (), }
}; });
};
lazy_load(podcasts, flowbox_weak, constructor, callback); lazy_load(podcasts, flowbox_weak, constructor, callback);
Ok(()) Ok(())
@ -100,7 +99,8 @@ fn populate_flowbox(shows: &Rc<ShowsView>, vadj: Option<Adjustment>) -> Result<(
fn on_child_activate(child: &gtk::FlowBoxChild, sender: &Sender<Action>) -> Result<(), Error> { fn on_child_activate(child: &gtk::FlowBoxChild, sender: &Sender<Action>) -> Result<(), Error> {
// This is such an ugly hack... // This is such an ugly hack...
let id = WidgetExt::get_name(child) let id = child
.get_widget_name()
.ok_or_else(|| format_err!("Failed to get \"episodes\" child from the stack."))? .ok_or_else(|| format_err!("Failed to get \"episodes\" child from the stack."))?
.parse::<i32>()?; .parse::<i32>()?;
let pd = Arc::new(dbqueries::get_podcast_from_id(id)?); let pd = Arc::new(dbqueries::get_podcast_from_id(id)?);
@ -148,7 +148,7 @@ impl ShowsChild {
fn init(&self, pd: &Show) { fn init(&self, pd: &Show) {
self.child.set_tooltip_text(Some(pd.title())); self.child.set_tooltip_text(Some(pd.title()));
WidgetExt::set_name(&self.child, &pd.id().to_string()); self.child.set_widget_name(&pd.id().to_string());
self.set_cover(pd.id()) self.set_cover(pd.id())
} }

View File

@ -18,6 +18,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
use glib; use glib;
use glib::clone;
use glib::Variant; use glib::Variant;
use gio::{self, prelude::*, ActionMapExt, SettingsExt}; use gio::{self, prelude::*, ActionMapExt, SettingsExt};
@ -36,7 +37,7 @@ use crate::widgets::about_dialog;
use crate::widgets::appnotif::InAppNotification; use crate::widgets::appnotif::InAppNotification;
use crate::widgets::player; use crate::widgets::player;
use std::cell::RefCell; use std::cell::{Cell, RefCell};
use std::ops::Deref; use std::ops::Deref;
use std::rc::Rc; use std::rc::Rc;
@ -47,7 +48,7 @@ use crate::i18n::i18n;
fn action<T, F>(thing: &T, name: &str, action: F) fn action<T, F>(thing: &T, name: &str, action: F)
where where
T: ActionMapExt, T: ActionMapExt,
for<'r, 's> F: Fn(&'r gio::SimpleAction, Option<&Variant>) + 'static, F: Fn(&gio::SimpleAction, Option<&Variant>) + 'static,
{ {
// Create a stateless, parameterless action // Create a stateless, parameterless action
let act = gio::SimpleAction::new(name, None); let act = gio::SimpleAction::new(name, None);
@ -65,6 +66,7 @@ pub struct MainWindow {
pub(crate) content: Rc<Content>, pub(crate) content: Rc<Content>,
pub(crate) headerbar: Rc<Header>, pub(crate) headerbar: Rc<Header>,
pub(crate) player: player::PlayerWrapper, pub(crate) player: player::PlayerWrapper,
pub(crate) updating: Cell<bool>,
pub(crate) updater: RefCell<Option<InAppNotification>>, pub(crate) updater: RefCell<Option<InAppNotification>>,
pub(crate) sender: Sender<Action>, pub(crate) sender: Sender<Action>,
pub(crate) receiver: Receiver<Action>, pub(crate) receiver: Receiver<Action>,
@ -82,27 +84,17 @@ impl MainWindow {
window.get_style_context().add_class("devel"); window.get_style_context().add_class("devel");
} }
let weak_s = settings.downgrade(); window.connect_delete_event(
let weak_app = app.downgrade(); clone!(@strong settings, @weak app => @default-return Inhibit(false), move |window, _| {
window.connect_delete_event(move |window, _| { info!("Saving window position");
let app = match weak_app.upgrade() { WindowGeometry::from_window(&window).write(&settings);
Some(a) => a,
None => return Inhibit(false),
};
let settings = match weak_s.upgrade() { info!("Application is exiting");
Some(s) => s, let app = app.upcast::<gio::Application>();
None => return Inhibit(false), app.quit();
}; Inhibit(false)
}),
info!("Saving window position"); );
WindowGeometry::from_window(&window).write(&settings);
info!("Application is exiting");
let app = app.clone().upcast::<gio::Application>();
app.quit();
Inhibit(false)
});
// Create a content instance // Create a content instance
let content = Content::new(&sender).expect("Content initialization failed."); let content = Content::new(&sender).expect("Content initialization failed.");
@ -122,9 +114,9 @@ impl MainWindow {
let player = player::PlayerWrapper::new(&sender); let player = player::PlayerWrapper::new(&sender);
// Add the player to the main Box // Add the player to the main Box
wrap.add(&player.action_bar); wrap.add(&player.container);
let updater = RefCell::new(None); wrap.add(&header.bottom_switcher);
window.add(&wrap); window.add(&wrap);
@ -134,20 +126,19 @@ impl MainWindow {
// Update the feeds right after the Window is initialized. // Update the feeds right after the Window is initialized.
if settings.get_boolean("refresh-on-startup") { if settings.get_boolean("refresh-on-startup") {
info!("Refresh on startup."); info!("Refresh on startup.");
let s: Option<Vec<_>> = None; utils::schedule_refresh(None, sender.clone());
utils::refresh(s, sender.clone());
} }
let refresh_interval = settings::get_refresh_interval(&settings).num_seconds() as u32; let refresh_interval = settings::get_refresh_interval(&settings).num_seconds() as u32;
info!("Auto-refresh every {:?} seconds.", refresh_interval); info!("Auto-refresh every {:?} seconds.", refresh_interval);
let r_sender = sender.clone(); gtk::timeout_add_seconds(
gtk::timeout_add_seconds(refresh_interval, move || { refresh_interval,
let s: Option<Vec<_>> = None; clone!(@strong sender => move || {
utils::refresh(s, r_sender.clone()); utils::schedule_refresh(None, sender.clone());
glib::Continue(true)
glib::Continue(true) }),
}); );
Self { Self {
app: app.clone(), app: app.clone(),
@ -156,7 +147,8 @@ impl MainWindow {
headerbar: header, headerbar: header,
content, content,
player, player,
updater, updating: Cell::new(false),
updater: RefCell::new(None),
sender, sender,
receiver, receiver,
} }
@ -168,46 +160,48 @@ impl MainWindow {
#[cfg_attr(rustfmt, rustfmt_skip)] #[cfg_attr(rustfmt, rustfmt_skip)]
pub fn setup_gactions(&self) { pub fn setup_gactions(&self) {
let sender = &self.sender; let sender = &self.sender;
let weak_win = self.window.downgrade();
// Create the `refresh` action. // Create the `refresh` action.
// //
// This will trigger a refresh of all the shows in the database. // This will trigger a refresh of all the shows in the database.
action(&self.window, "refresh", clone!(sender => move |_, _| { action(&self.window, "refresh",
gtk::idle_add(clone!(sender => move || { clone!(@strong sender => move |_, _| {
let s: Option<Vec<_>> = None; gtk::idle_add(
utils::refresh(s, sender.clone()); clone!(@strong sender => move || {
glib::Continue(false) utils::schedule_refresh(None, sender.clone());
glib::Continue(false)
})); }));
})); }));
self.app.set_accels_for_action("win.refresh", &["<primary>r"]); self.app.set_accels_for_action("win.refresh", &["<primary>r"]);
// Create the `OPML` import action // Create the `OPML` import action
action(&self.window, "import", clone!(sender, weak_win => move |_, _| { action(&self.window, "import",
weak_win.upgrade().map(|win| utils::on_import_clicked(&win, &sender)); clone!(@strong sender, @weak self.window as window => move |_, _| {
utils::on_import_clicked(&window, &sender);
})); }));
action(&self.window, "export", clone!(sender, weak_win => move |_, _| { action(&self.window, "export",
weak_win.upgrade().map(|win| utils::on_export_clicked(&win, &sender)); clone!(@strong sender, @weak self.window as window => move |_, _| {
utils::on_export_clicked(&window, &sender);
})); }));
// Create the action that shows a `gtk::AboutDialog` // Create the action that shows a `gtk::AboutDialog`
action(&self.window, "about", clone!(weak_win => move |_, _| { action(&self.window, "about",
weak_win.upgrade().map(|win| about_dialog(&win)); clone!(@weak self.window as win => move |_, _| {
about_dialog(&win);
})); }));
// Create the quit action // Create the quit action
let weak_instance = self.app.downgrade(); action(&self.window, "quit",
action(&self.window, "quit", move |_, _| { clone!(@weak self.app as app => move |_, _| {
weak_instance.upgrade().map(|app| app.quit()); app.quit();
}); }));
self.app.set_accels_for_action("win.quit", &["<primary>q"]); self.app.set_accels_for_action("win.quit", &["<primary>q"]);
// Create the menu action // Create the menu actions
let header = Rc::downgrade(&self.headerbar); action(&self.window, "menu",
action(&self.window, "menu", move |_, _| { clone!(@weak self.headerbar as headerbar => move |_, _| {
header.upgrade().map(|h| h.open_menu()); headerbar.open_menu();
}); }));
// Bind the hamburger menu button to `F10` // Bind the hamburger menu button to `F10`
self.app.set_accels_for_action("win.menu", &["F10"]); self.app.set_accels_for_action("win.menu", &["F10"]);
} }

View File

@ -6,16 +6,14 @@ set -x
# $1 Passed by meson and should be the builddir # $1 Passed by meson and should be the builddir
export CARGO_TARGET_DIR="$1/target/" export CARGO_TARGET_DIR="$1/target/"
export CARGO_HOME="$CARGO_TARGET_DIR/cargo-home"
# If this is run inside a flatpak envrironment, append the export the rustc # If this is run inside a flatpak envrironment, append the export the rustc
# sdk-extension binaries to the path # sdk-extension binaries to the path
if [ -f "/.flatpak-info" ] if [ -f "/.flatpak-info" ]
then then
export PATH="$PATH:/usr/lib/sdk/rust-stable/bin" export PATH="$PATH:/usr/lib/sdk/rust-stable/bin"
# This assumes its run inside a Builder terminal
export CARGO_TARGET_DIR="$BUILDDIR/target/"
fi fi
export CARGO_HOME="$CARGO_TARGET_DIR/cargo-home" cargo fetch --locked
cargo test --all-features --offline -- --test-threads=1 --nocapture
cargo test -j 1 -- --test-threads=1 --nocapture